From f38210fd8461cec01ca202706e4146a98ab73c0b Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Thu, 19 Feb 2026 07:24:34 -0500 Subject: [PATCH 01/15] docs(admin/policy): document ReadWritePaths for logging to files (#1469) The default Anubis systemd configuration is very restrictive in order to prevent any possible compromise of Anubis to be useful by threat actors. As such, it assumes all logs will be pushed to the system journal. Some administrators do not want Anubis' logs to be pushed to the system journal and want Anubis to log to a file instead. This change documents how to set up ReadWritePaths in the Anubis systemd configuration such that Anubis can lot to a file as administrators expect. Closes: #1468 Signed-off-by: Xe Iaso --- docs/docs/admin/policies.mdx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/docs/admin/policies.mdx b/docs/docs/admin/policies.mdx index 159d1abc..24317a41 100644 --- a/docs/docs/admin/policies.mdx +++ b/docs/docs/admin/policies.mdx @@ -393,6 +393,32 @@ logging: When files are rotated out, the old files will be named after the rotation timestamp in [RFC 3339 format](https://www.rfc-editor.org/rfc/rfc3339). +:::note + +If you are running Anubis in systemd via a native package, the default systemd unit settings are very restrictive and will forbid writing to folders in `/var/log`. In order to fix this, please make a [drop-in unit](https://www.flatcar.org/docs/latest/setup/systemd/drop-in-units/) like the following: + +```text +# /etc/systemd/anubis@instance-name.service.d/50-var-log-readwrite.conf +[Service] +ReadWritePaths=/run /var/log/anubis +``` + +Once you write this to the correct place, reload the systemd configuration: + +```text +sudo systemctl daemon-reload +``` + +And then restart Anubis: + +```text +sudo systemctl restart anubis@instance-name +``` + +You may be required to make drop-ins for each Anubis instance depending on the facts and circumstances of your deployment. + +::: + ### `stdio` sink By default, Anubis logs everything to the standard error stream of its process. This requires no configuration: From fa518e1b8c18ebaadb001c0f1ca393ee4f75f582 Mon Sep 17 00:00:00 2001 From: Mozi <29089388+pzhlkj6612@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:35:53 -0400 Subject: [PATCH 02/15] docs: fix mixed tab/space indentation in Caddy config example (#1506) Assisted-by: Claude Opus 4.6 via Copilot Signed-off-by: Mozi <29089388+pzhlkj6612@users.noreply.github.com> --- docs/docs/CHANGELOG.md | 2 ++ docs/docs/admin/environments/caddy.mdx | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/docs/CHANGELOG.md b/docs/docs/CHANGELOG.md index 4f234cf5..3917ba26 100644 --- a/docs/docs/CHANGELOG.md +++ b/docs/docs/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- Fixed mixed tab/space indentation in Caddy documentation code block + ## v1.25.0: Necron diff --git a/docs/docs/admin/environments/caddy.mdx b/docs/docs/admin/environments/caddy.mdx index 3e5343a1..30edec17 100644 --- a/docs/docs/admin/environments/caddy.mdx +++ b/docs/docs/admin/environments/caddy.mdx @@ -62,9 +62,9 @@ yourdomain.example.com { tls your@email.address reverse_proxy http://anubis:3000 { - header_up X-Real-Ip {remote_host} - header_up X-Http-Version {http.request.proto} - } + header_up X-Real-Ip {remote_host} + header_up X-Http-Version {http.request.proto} + } } ``` From 04fef9e033afbc85cdd3ace41aeab738d48a4e13 Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Mon, 16 Mar 2026 06:30:43 -0400 Subject: [PATCH 03/15] ci: purge govulncheck, it's less signal than i hoped (#1515) * ci: purge govulncheck, it's less signal than i hoped Signed-off-by: Xe Iaso * ci(go): use go stable Signed-off-by: Xe Iaso * ci: use go stable Signed-off-by: Xe Iaso --------- Signed-off-by: Xe Iaso --- .github/workflows/docker-pr.yml | 2 +- .github/workflows/docker.yml | 2 +- .github/workflows/go-mod-tidy-check.yml | 2 +- .github/workflows/go.yml | 4 ++-- .github/workflows/package-builds-stable.yml | 2 +- .github/workflows/package-builds-unstable.yml | 2 +- .github/workflows/smoke-tests.yml | 2 +- .github/workflows/ssh-ci.yml | 2 +- Makefile | 3 +-- 9 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index f5d70ca8..0f7bd037 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -31,7 +31,7 @@ jobs: node-version: "24.11.0" - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "stable" - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 4c96d3fb..ca2f060a 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -41,7 +41,7 @@ jobs: node-version: "24.11.0" - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "stable" - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 diff --git a/.github/workflows/go-mod-tidy-check.yml b/.github/workflows/go-mod-tidy-check.yml index 19377f7b..f4e2b91c 100644 --- a/.github/workflows/go-mod-tidy-check.yml +++ b/.github/workflows/go-mod-tidy-check.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "stable" - name: Check go.mod and go.sum in main directory run: | diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 2583ed77..49ca8896 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -29,7 +29,7 @@ jobs: node-version: "24.11.0" - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "stable" - name: Cache playwright binaries uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 @@ -61,4 +61,4 @@ jobs: - name: Govulncheck run: | - go tool govulncheck ./... + go tool govulncheck ./... ||: diff --git a/.github/workflows/package-builds-stable.yml b/.github/workflows/package-builds-stable.yml index c66af3da..e1198e1e 100644 --- a/.github/workflows/package-builds-stable.yml +++ b/.github/workflows/package-builds-stable.yml @@ -30,7 +30,7 @@ jobs: node-version: "24.11.0" - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "stable" - name: install node deps run: | diff --git a/.github/workflows/package-builds-unstable.yml b/.github/workflows/package-builds-unstable.yml index 9bc6de97..3d1a2033 100644 --- a/.github/workflows/package-builds-unstable.yml +++ b/.github/workflows/package-builds-unstable.yml @@ -31,7 +31,7 @@ jobs: node-version: "24.11.0" - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "stable" - name: install node deps run: | diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index a7df66ee..1d968675 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -39,7 +39,7 @@ jobs: node-version: "24.11.0" - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "stable" - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 diff --git a/.github/workflows/ssh-ci.yml b/.github/workflows/ssh-ci.yml index fba87269..462fdf93 100644 --- a/.github/workflows/ssh-ci.yml +++ b/.github/workflows/ssh-ci.yml @@ -37,7 +37,7 @@ jobs: - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "stable" - name: Run CI run: go run ./utils/cmd/backoff-retry bash test/ssh-ci/rigging.sh ${{ matrix.host }} diff --git a/Makefile b/Makefile index 534ae5be..3213e780 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,7 @@ build: assets lint: assets $(GO) vet ./... $(GO) tool staticcheck ./... - $(GO) tool govulncheck ./... - + prebaked-build: $(GO) build -o ./var/anubis -ldflags "-X 'github.com/TecharoHQ/anubis.Version=$(VERSION)'" ./cmd/anubis $(GO) build -o ./var/robots2policy -ldflags "-X 'github.com/TecharoHQ/anubis.Version=$(VERSION)'" ./cmd/robots2policy From 78fe07a78fbdbda915a7bb2ebad70728dd867923 Mon Sep 17 00:00:00 2001 From: Max Chernoff Date: Mon, 16 Mar 2026 03:36:40 -0700 Subject: [PATCH 04/15] feat(http): set "Cache-Control: no-store" on error responses (#1474) * refactor(http): split long line in respondWithStatus Signed-off-by: Max Chernoff * feat(http): set `Cache-Control: no-store` on error responses Since #132, Anubis has set `Cache-Control: no-store` on challenge responses. However, this does not apply to deny responses, meaning that if Anubis is configured to block certain user agents and is behind a caching reverse proxy, this error page will be cached and served to all subsequent requests, even those with an allowed user agent. This commit configures the error page responder to also set the `Cache-Control` header, meaning that deny and challenge responses will now both have the same behaviour. Signed-off-by: Max Chernoff * chore(spelling): add new words to allowlist Signed-off-by: Max Chernoff * chore(actions): bump Go version to fix govulncheck errors Signed-off-by: Max Chernoff --------- Signed-off-by: Max Chernoff Signed-off-by: Xe Iaso Co-authored-by: Xe Iaso --- .github/actions/spelling/allow.txt | 3 +++ .github/workflows/asset-verification.yml | 2 +- docs/docs/CHANGELOG.md | 1 + lib/http.go | 9 ++++++- lib/http_test.go | 32 ++++++++++++++++++++++++ lib/testdata/useragent.yaml | 12 +++++++++ 6 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 lib/testdata/useragent.yaml diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt index 378ca8f5..28a4b092 100644 --- a/.github/actions/spelling/allow.txt +++ b/.github/actions/spelling/allow.txt @@ -26,3 +26,6 @@ blocklists rififi prolocation Prolocation +Necron +Stargate +FFXIV diff --git a/.github/workflows/asset-verification.yml b/.github/workflows/asset-verification.yml index 4a0286a4..2792cf50 100644 --- a/.github/workflows/asset-verification.yml +++ b/.github/workflows/asset-verification.yml @@ -27,7 +27,7 @@ jobs: node-version: "24.11.0" - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.25.4" + go-version: "1.25.7" - name: install node deps run: | diff --git a/docs/docs/CHANGELOG.md b/docs/docs/CHANGELOG.md index 3917ba26..3d39e991 100644 --- a/docs/docs/CHANGELOG.md +++ b/docs/docs/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- Instruct reverse proxies to not cache error pages. - Fixed mixed tab/space indentation in Caddy documentation code block diff --git a/lib/http.go b/lib/http.go index 053470f0..790a4aae 100644 --- a/lib/http.go +++ b/lib/http.go @@ -333,7 +333,14 @@ func (s *Server) respondWithError(w http.ResponseWriter, r *http.Request, messag func (s *Server) respondWithStatus(w http.ResponseWriter, r *http.Request, msg, code string, status int) { localizer := localization.GetLocalizer(r) - templ.Handler(web.Base(localizer.T("oh_noes"), web.ErrorPage(msg, s.opts.WebmasterEmail, code, localizer), s.policy.Impressum, localizer), templ.WithStatus(status)).ServeHTTP(w, r) + component := web.Base( + localizer.T("oh_noes"), + web.ErrorPage(msg, s.opts.WebmasterEmail, code, localizer), + s.policy.Impressum, + localizer, + ) + handler := internal.NoStoreCache(templ.Handler(component, templ.WithStatus(status))) + handler.ServeHTTP(w, r) } func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/lib/http_test.go b/lib/http_test.go index 255344f3..bacc8358 100644 --- a/lib/http_test.go +++ b/lib/http_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/TecharoHQ/anubis" + "github.com/TecharoHQ/anubis/internal" "github.com/TecharoHQ/anubis/lib/policy" ) @@ -191,3 +192,34 @@ func TestRenderIndexUnauthorized(t *testing.T) { t.Errorf("expected body %q, got %q", "Authorization required", body) } } + +func TestNoCacheOnError(t *testing.T) { + pol := loadPolicies(t, "testdata/useragent.yaml", 0) + srv := spawnAnubis(t, Options{Policy: pol}) + ts := httptest.NewServer(internal.RemoteXRealIP(true, "tcp", srv)) + defer ts.Close() + + for userAgent, expectedCacheControl := range map[string]string{ + "DENY": "no-store", + "CHALLENGE": "no-store", + "ALLOW": "", + } { + t.Run(userAgent, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, ts.URL, nil) + if err != nil { + t.Fatal(err) + } + + req.Header.Set("User-Agent", userAgent) + + resp, err := ts.Client().Do(req) + if err != nil { + t.Fatal(err) + } + + if resp.Header.Get("Cache-Control") != expectedCacheControl { + t.Errorf("wanted Cache-Control header %q, got %q", expectedCacheControl, resp.Header.Get("Cache-Control")) + } + }) + } +} diff --git a/lib/testdata/useragent.yaml b/lib/testdata/useragent.yaml new file mode 100644 index 00000000..85cf73e2 --- /dev/null +++ b/lib/testdata/useragent.yaml @@ -0,0 +1,12 @@ +bots: + - name: deny + user_agent_regex: DENY + action: DENY + + - name: challenge + user_agent_regex: CHALLENGE + action: CHALLENGE + + - name: allow + user_agent_regex: ALLOW + action: ALLOW From c5ff5f0f26c3b67fc6a3d2e19c802706de96de15 Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Mon, 16 Mar 2026 10:41:55 +0000 Subject: [PATCH 05/15] chore: spelling Signed-off-by: Xe Iaso --- .github/actions/spelling/expect.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index 71b46f6c..cb326ede 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -119,6 +119,7 @@ FCr fcrdns fediverse ffprobe +FFXIV fhdr financials finfos @@ -238,6 +239,7 @@ mymaster mypass myuser nbf +Necron nepeat netsurf nginx @@ -329,12 +331,13 @@ Spambot spammer sparkline spyderbot +srcip srv stackoverflow +Stargate startprecmd stoppostcmd storetest -srcip strcmp subgrid subr From 22412d0e22c70a03447ce044cdf4d2fa626ed72f Mon Sep 17 00:00:00 2001 From: p0008874 <75534590+p0008874@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:42:25 +0800 Subject: [PATCH 06/15] docs(known-instances): Add missing one. (#1500) * docs(known-instances): Add missing one. Dolphin Emulator, FFmpeg, and Valve's official wiki. Signed-off-by: p0008874 <75534590+p0008874@users.noreply.github.com> * Update known-instances.md Signed-off-by: p0008874 <75534590+p0008874@users.noreply.github.com> --------- Signed-off-by: p0008874 <75534590+p0008874@users.noreply.github.com> --- docs/docs/user/known-instances.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/docs/docs/user/known-instances.md b/docs/docs/user/known-instances.md index 9b24282c..21f884b6 100644 --- a/docs/docs/user/known-instances.md +++ b/docs/docs/user/known-instances.md @@ -38,10 +38,8 @@ This page contains a non-exhaustive list with all websites using Anubis. - https://squirreljme.cc/ - https://superlove.sayitditto.net/ - https://svnweb.freebsd.org/ -- https://trac.ffmpeg.org/ - https://tumfatig.net/ - https://wiki.archlinux.org/ -- https://wiki.dolphin-emu.org/ - https://wiki.freepascal.org/ - https://wiki.koha-community.org/ - https://www.cfaarchive.org/ @@ -53,6 +51,11 @@ This page contains a non-exhaustive list with all websites using Anubis. - https://bbs.archlinux32.org/ - https://bugs.archlinux32.org/ +-
+ Dolphin Emulator + - https://forums.dolphin-emu.org/ + - https://wiki.dolphin-emu.org/ +
-
Duke University - https://repository.duke.edu/ @@ -60,6 +63,11 @@ This page contains a non-exhaustive list with all websites using Anubis. - https://find.library.duke.edu/ - https://nicholas.duke.edu/
+-
+ FFmpeg + - https://git.ffmpeg.org/ + - https://trac.ffmpeg.org/ +
-
Forschungszentrum Jülich - https://juser.fz-juelich.de/ @@ -112,11 +120,8 @@ This page contains a non-exhaustive list with all websites using Anubis. - https://git.kernel.org/ - https://lore.kernel.org/
--
- The United Nations - - https://policytoolbox.iiep.unesco.org/ -
-
Valve Corporation - https://developer.valvesoftware.com/wiki/Main_Page + - https://wiki.teamfortress.com/wiki/Main_Page
From 27c994d3ce462fdec0844722d19326fb02d98c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ane=20GRASSER?= Date: Mon, 16 Mar 2026 11:43:05 +0100 Subject: [PATCH 07/15] chore(l10n): update French translation (#1496) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces translations from MT engines or AI with better, human-made ones :) Signed-off-by: Léane GRASSER --- lib/localization/locales/fr.json | 78 ++++++++++++++++---------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/lib/localization/locales/fr.json b/lib/localization/locales/fr.json index a113c457..13068b7c 100644 --- a/lib/localization/locales/fr.json +++ b/lib/localization/locales/fr.json @@ -1,66 +1,66 @@ { "loading": "Chargement...", - "why_am_i_seeing": "Pourquoi je vois ceci ?", + "why_am_i_seeing": "Comment suis-je arrivé·e ici ?", "protected_by": "Protégé par", - "protected_from": "From", + "protected_from": "de", "made_with": "Fait avec ❤️ au 🇨🇦", "mascot_design": "Design de la mascotte par", - "ai_companies_explanation": "Vous voyez ceci car l'administrateur de ce site web a configuré Anubis pour protéger le serveur contre le fléau des entreprises d'IA qui scrapent agressivement les sites web. Cela peut et cause des temps d'arrêt pour les sites web, ce qui rend leurs ressources inaccessibles pour tout le monde.", - "anubis_compromise": "Anubis est un compromis. Anubis utilise un schéma de Preuve de Travail dans la veine de Hashcash, un schéma de preuve de travail proposé pour réduire le spam par email. L'idée est qu'à l'échelle individuelle, la charge supplémentaire est négligeable, mais à l'échelle des scrapers de masse, cela s'accumule et rend le scraping beaucoup plus coûteux.", - "hack_purpose": "En fin de compte, il s'agit d'une solution de substitution afin de consacrer plus de temps à l'identification et à l'empreinte digitale des navigateurs sans tête (par exemple, via leur rendu de police) afin que la page de preuve de travail du défi n'ait pas besoin d'être présentée aux utilisateurs qui sont beaucoup plus susceptibles d'être légitimes.", - "jshelter_note": "Veuillez noter qu'Anubis nécessite l'utilisation de fonctionnalités JavaScript modernes que des plugins comme JShelter désactiveront. Veuillez désactiver JShelter ou d'autres plugins similaires pour ce domaine.", - "version_info": "Ce site web utilise Anubis version", + "ai_companies_explanation": "Vous voyez cette page car l'administrateur·rice de ce site Web a configuré Anubis pour protéger le serveur contre le fléau des entreprises d'IA qui récupèrent agressivement le contenu des sites Web. Cela perturbe leur fonctionnement et rend leurs ressources inaccessibles pour tout le monde.", + "anubis_compromise": "Anubis est un compromis. Anubis utilise un procédé de preuve de travail similaire à Hashcash, un procédé de preuve de travail proposé pour réduire le spam par e-mail. L'idée est qu'à l'échelle individuelle, la charge supplémentaire est négligeable, mais à l'échelle des scrapers de masse, la charge s'accumule et le scraping devient beaucoup plus coûteux.", + "hack_purpose": "En fin de compte, il s'agit d'une solution de substitution permettant de consacrer plus de temps à l'identification et à la prise d'empreintes des navigateurs headless (par exemple, en reconnaissant leur rendu des polices), pour que, à terme, la page de défi utilisant la preuve de travail n'ait plus besoin d'être présentée aux utilisateur·rices qui sont beaucoup plus susceptibles d'être légitimes.", + "jshelter_note": "Veuillez noter qu'Anubis nécessite l'utilisation de fonctionnalités JavaScript modernes qui peuvent être désactivées par des plugins comme JShelter. Veuillez désactiver JShelter ou tout autre plugin similaire pour ce domaine.", + "version_info": "Ce site Web utilise Anubis version", "try_again": "Réessayer", "go_home": "Accueil", - "contact_webmaster": "ou si vous pensez que vous ne devriez pas être bloqué, veuillez contacter le webmaster à", + "contact_webmaster": "ou si vous pensez que vous ne devriez pas être bloqué, veuillez contacter le webmaster à l'adresse", "connection_security": "Veuillez patienter un instant pendant que nous assurons la sécurité de votre connexion.", - "javascript_required": "Malheureusement, vous devez activer JavaScript pour passer ce défi. Ceci est requis car les entreprises d'IA ont changé le contrat social autour du fonctionnement de l'hébergement de sites web. Une solution sans JS est en cours de développement.", + "javascript_required": "Malheureusement, vous devez activer JavaScript pour passer cette page de défi. Cette obligation est imposée par les entreprises d'IA, qui ont décidé de modifier unilatéralement les termes du contrat social régissant l'hébergement de sites Web. Une solution sans JavaScript est en cours de développement.", "benchmark_requires_js": "L'exécution de l'outil de benchmark nécessite l'activation de JavaScript.", - "difficulty": "Difficulté :", - "algorithm": "Algorithme :", - "compare": "Comparer :", + "difficulty": "Difficulté :", + "algorithm": "Algorithme :", + "compare": "Comparer :", "time": "Temps", "iters": "Itérations", "time_a": "Temps A", "iters_a": "Itér. A", "time_b": "Temps B", "iters_b": "Itér. B", - "static_check_endpoint": "Ceci est juste un point de terminaison de vérification pour votre proxy inverse à utiliser.", + "static_check_endpoint": "Ceci est juste un point de terminaison de vérification à utiliser par votre proxy inverse.", "authorization_required": "Autorisation requise", - "cookies_disabled": "Votre navigateur est configuré pour désactiver les cookies. Anubis nécessite des cookies pour l'intérêt légitime de s'assurer que vous êtes un client valide. Veuillez activer les cookies pour ce domaine", - "access_denied": "Accès refusé : code d'erreur", - "dronebl_entry": "DroneBL a signalé une entrée", + "cookies_disabled": "Les cookies sont désactivés dans votre navigateur. Anubis a recours aux cookies pour l'intérêt légitime de s'assurer que vous êtes un client valide. Veuillez activer les cookies pour ce domaine.", + "access_denied": "Accès refusé : code d'erreur", + "dronebl_entry": "DroneBL a rapporté une entrée", "see_dronebl_lookup": "voir", - "internal_server_error": "Erreur interne du serveur : l'administrateur a mal configuré Anubis. Veuillez contacter l'administrateur et lui demander de consulter les logs autour de", + "internal_server_error": "Erreur interne du serveur : l'administrateur·rice a mal configuré Anubis. Veuillez contacter l'administrateur·rice et lui demander de consulter les logs autour de", "invalid_redirect": "Redirection invalide", "redirect_not_parseable": "URL de redirection non analysable", "redirect_domain_not_allowed": "Domaine de redirection non autorisé", - "failed_to_sign_jwt": "échec de la signature JWT", + "failed_to_sign_jwt": "échec de la signature du JWT", "invalid_invocation": "Invocation invalide de MakeChallenge", - "client_error_browser": "Erreur client : Veuillez vous assurer que votre navigateur est à jour et réessayez plus tard.", - "oh_noes": "Oh non !", - "benchmarking_anubis": "Test de performance d'Anubis !", - "you_are_not_a_bot": "Vous n'êtes pas un robot !", - "making_sure_not_bot": "Vérification que vous n'êtes pas un robot !", - "celphase": "PHASE de CEL", - "js_web_crypto_error": "Votre navigateur n'a pas d'élément web.crypto fonctionnel. Consultez-vous cette page dans un contexte sécurisé ?", - "js_web_workers_error": "Votre navigateur ne prend pas en charge les web workers (Anubis les utilise pour éviter de bloquer votre navigateur). Avez-vous un plugin comme JShelter installé ?", - "js_cookies_error": "Votre navigateur ne stocke pas les cookies. Anubis utilise des cookies pour déterminer quels clients ont réussi les défis en stockant un jeton signé dans un cookie. Veuillez activer le stockage des cookies pour ce domaine. Les noms des cookies qu'Anubis stocke peuvent varier sans préavis. Les noms et valeurs des cookies ne font pas partie de l'API publique.", - "js_context_not_secure": "Votre contexte n'est pas sécurisé !", - "js_context_not_secure_msg": "Essayez de vous connecter via HTTPS ou informez l'administrateur de configurer HTTPS. Pour plus d'informations, voir MDN.", + "client_error_browser": "Erreur client : Veuillez vous assurer que votre navigateur est à jour et réessayez plus tard.", + "oh_noes": "Oh non !", + "benchmarking_anubis": "Je vérifie les performances d'Anubis !", + "you_are_not_a_bot": "Vous n'êtes pas un robot !", + "making_sure_not_bot": "Je m'assure que vous n'êtes pas un robot !", + "celphase": "CELPHASE", + "js_web_crypto_error": "L'élément web.crypto de votre navigateur n'est pas fonctionnel. Consultez-vous bien cette page dans un contexte sécurisé ?", + "js_web_workers_error": "Votre navigateur ne prend pas en charge les web workers (Anubis les utilise pour éviter de bloquer votre navigateur). Avez-vous installé un plugin comme JShelter ?", + "js_cookies_error": "Votre navigateur ne stocke pas les cookies. Anubis a recours aux cookies pour déterminer quels clients ont réussi les défis en stockant un jeton signé dans un cookie. Veuillez activer le stockage des cookies pour ce domaine. Le nom des cookies stockés par Anubis peut varier à tout moment. Le nom et la valeur des cookies ne font pas partie de l'API publique.", + "js_context_not_secure": "Votre contexte n'est pas sécurisé !", + "js_context_not_secure_msg": "Essayez de vous connecter via HTTPS ou demandez à l'administrateur·rice de configurer HTTPS. Pour plus d'informations, consultez MDN.", "js_calculating": "Calcul en cours...", "js_missing_feature": "Fonctionnalité manquante", - "js_challenge_error": "Erreur de défi !", + "js_challenge_error": "Erreur de défi !", "js_challenge_error_msg": "Échec de la résolution de l'algorithme de vérification. Vous pouvez essayer de recharger la page.", - "js_calculating_difficulty": "Calcul en cours...
Difficulté :", - "js_speed": "Vitesse :", + "js_calculating_difficulty": "Calcul en cours...
Difficulté :", + "js_speed": "Vitesse :", "js_verification_longer": "La vérification prend plus de temps que prévu. Veuillez ne pas actualiser la page.", - "js_success": "Succès !", - "js_done_took": "Terminé ! A pris", + "js_success": "Vérification réussie !", + "js_done_took": "Terminé ! Cela aura nécessité", "js_iterations": "itérations", - "js_finished_reading": "J'ai fini de lire, continuer →", - "js_calculation_error": "Erreur de calcul !", - "js_calculation_error_msg": "Échec du calcul du défi :", - "missing_required_forwarded_headers": "En-têtes X-Forwarded-* requis manquants", - "simplified_explanation": "Il s'agit d'une mesure contre les robots et les requêtes malveillantes similaire à un CAPTCHA. Cependant, au lieu d'avoir à faire le travail vous-même, votre navigateur se voit confier une tâche de calcul qu'il doit résoudre pour s'assurer qu'il est un client valide. Ce concept s'appelle Preuve de travail. La tâche est calculée en quelques secondes et vous avez accès au site Web. Merci de votre compréhension et de votre patience." + "js_finished_reading": "J'ai fini de lire, continuer →", + "js_calculation_error": "Erreur de calcul !", + "js_calculation_error_msg": "Échec du calcul du défi :", + "missing_required_forwarded_headers": "En-têtes X-Forwarded-* manquants", + "simplified_explanation": "Ceci est une mesure contre les robots et les requêtes malveillantes, similaire à un CAPTCHA. Cependant, au lieu d'avoir à faire le travail vous-même, votre navigateur se voit confier une tâche de calcul qu'il doit résoudre pour confirmer qu'il est un client valide. Ce concept est nommé Preuve de travail. La tâche s'effectue en quelques secondes, puis vous avez accès au site Web. Merci pour votre compréhension et votre patience." } From 865ba0983ebaaa7318e51f7561f005423e1c576b Mon Sep 17 00:00:00 2001 From: Max Chernoff Date: Mon, 16 Mar 2026 03:43:31 -0700 Subject: [PATCH 08/15] docs: remove developer/code-quality (#1475) PR #1451 added `CONTRIBUTING.md`, but the commit message guidelines there conflict with the ones in `developer/code-quality.md`. Since `CONTRIBUTING.md` is newer, presumably the guidelines there are what's expected from new commits. But after removing that section from `code-quality.md`, there's not much content left, so this commit just deletes the file entirely. Signed-off-by: Max Chernoff --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- docs/docs/developer/code-quality.md | 31 ----------------------------- 2 files changed, 2 insertions(+), 33 deletions(-) delete mode 100644 docs/docs/developer/code-quality.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1f61d82c..370a73ed 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,12 +1,12 @@ Checklist: - [ ] Added a description of the changes to the `[Unreleased]` section of docs/docs/CHANGELOG.md -- [ ] Added test cases to [the relevant parts of the codebase](https://anubis.techaro.lol/docs/developer/code-quality) +- [ ] Added test cases to [the relevant parts of the codebase](https://github.com/TecharoHQ/anubis/blob/main/CONTRIBUTING.md) - [ ] Ran integration tests `npm run test:integration` (unsupported on Windows, please use WSL) - [ ] All of my commits have [verified signatures](https://anubis.techaro.lol/docs/developer/signed-commits) diff --git a/docs/docs/developer/code-quality.md b/docs/docs/developer/code-quality.md deleted file mode 100644 index 6dcc44ab..00000000 --- a/docs/docs/developer/code-quality.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Code quality guidelines ---- - -When submitting code to Anubis, please take the time to consider the fact that this project is security software. If things go bad, bots can pummel sites into oblivion. This is not ideal for uptime. - -As such, code reviews will be a bit more strict than you have seen in other projects. This is not people trying to be mean, this is a side effect of taking the problem seriously. - -When making code changes, try to do the following: - -- If you're submitting a bugfix, add a test case for it -- If you're changing the JavaScript, make sure the integration tests pass (`npm run test:integration`) - -## Commit messages - -Anubis follows the Go project's conventions for commit messages. In general, an ideal commit message should read like this: - -```text -path/to/folder: brief description of the change - -If the change is subtle, has implementation consequences, or is otherwise -not entirely self-describing: take the time to spell out why. If things -are very subtle, please also amend the documentation accordingly -``` - -The subject of a commit message should be the second half of the sentence "This commit changes the Anubis project to:". Here's a few examples: - -- `disable DroneBL by default` -- `port the challenge to WebAssembly` - -The extended commit message is also your place to give rationale for a new feature. When maintainers are reviewing your code, they will use this to figure out if the burden from feature maintainership is worth the merge. From 168fe798024034367a1007cf1eae78bd172a993f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 06:44:18 -0400 Subject: [PATCH 09/15] build(deps): bump the github-actions group across 1 directory with 11 updates (#1516) Bumps the github-actions group with 11 updates in the / directory: | Package | From | To | | --- | --- | --- | | [actions/setup-node](https://github.com/actions/setup-node) | `6.2.0` | `6.3.0` | | [actions/setup-go](https://github.com/actions/setup-go) | `6.2.0` | `6.3.0` | | [docker/metadata-action](https://github.com/docker/metadata-action) | `5.10.0` | `6.0.0` | | [docker/login-action](https://github.com/docker/login-action) | `3.7.0` | `4.0.0` | | [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) | `3.2.0` | `4.1.0` | | [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `3.12.0` | `4.0.0` | | [docker/build-push-action](https://github.com/docker/build-push-action) | `6.18.0` | `7.0.0` | | [actions-hub/kubectl](https://github.com/actions-hub/kubectl) | `1.35.1` | `1.35.2` | | [dominikh/staticcheck-action](https://github.com/dominikh/staticcheck-action) | `1.4.0` | `1.4.1` | | [actions/upload-artifact](https://github.com/actions/upload-artifact) | `6.0.0` | `7.0.0` | | [shimataro/ssh-key-action](https://github.com/shimataro/ssh-key-action) | `2.7.0` | `2.8.0` | Updates `actions/setup-node` from 6.2.0 to 6.3.0 - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/6044e13b5dc448c55e2357c09f80417699197238...53b83947a5a98c8d113130e565377fae1a50d02f) Updates `actions/setup-go` from 6.2.0 to 6.3.0 - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5...4b73464bb391d4059bd26b0524d20df3927bd417) Updates `docker/metadata-action` from 5.10.0 to 6.0.0 - [Release notes](https://github.com/docker/metadata-action/releases) - [Commits](https://github.com/docker/metadata-action/compare/c299e40c65443455700f0fdfc63efafe5b349051...030e881283bb7a6894de51c315a6bfe6a94e05cf) Updates `docker/login-action` from 3.7.0 to 4.0.0 - [Release notes](https://github.com/docker/login-action/releases) - [Commits](https://github.com/docker/login-action/compare/c94ce9fb468520275223c153574b00df6fe4bcc9...b45d80f862d83dbcd57f89517bcf500b2ab88fb2) Updates `actions/attest-build-provenance` from 3.2.0 to 4.1.0 - [Release notes](https://github.com/actions/attest-build-provenance/releases) - [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md) - [Commits](https://github.com/actions/attest-build-provenance/compare/96278af6caaf10aea03fd8d33a09a777ca52d62f...a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32) Updates `docker/setup-buildx-action` from 3.12.0 to 4.0.0 - [Release notes](https://github.com/docker/setup-buildx-action/releases) - [Commits](https://github.com/docker/setup-buildx-action/compare/8d2750c68a42422c14e847fe6c8ac0403b4cbd6f...4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd) Updates `docker/build-push-action` from 6.18.0 to 7.0.0 - [Release notes](https://github.com/docker/build-push-action/releases) - [Commits](https://github.com/docker/build-push-action/compare/263435318d21b8e681c14492fe198d362a7d2c83...d08e5c354a6adb9ed34480a06d141179aa583294) Updates `actions-hub/kubectl` from 1.35.1 to 1.35.2 - [Release notes](https://github.com/actions-hub/kubectl/releases) - [Commits](https://github.com/actions-hub/kubectl/compare/3ece3793e7a9fe94effe257d03ac834c815ea87d...5ada4e2c02eacc03978c2437e95c8b0f979a9619) Updates `dominikh/staticcheck-action` from 1.4.0 to 1.4.1 - [Release notes](https://github.com/dominikh/staticcheck-action/releases) - [Changelog](https://github.com/dominikh/staticcheck-action/blob/master/CHANGES.md) - [Commits](https://github.com/dominikh/staticcheck-action/compare/024238d2898c874f26d723e7d0ff4308c35589a2...9716614d4101e79b4340dd97b10e54d68234e431) Updates `actions/upload-artifact` from 6.0.0 to 7.0.0 - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/b7c566a772e6b6bfb58ed0dc250532a479d7789f...bbbca2ddaa5d8feaa63e36b76fdaad77386f024f) Updates `shimataro/ssh-key-action` from 2.7.0 to 2.8.0 - [Release notes](https://github.com/shimataro/ssh-key-action/releases) - [Changelog](https://github.com/shimataro/ssh-key-action/blob/v2/CHANGELOG.md) - [Commits](https://github.com/shimataro/ssh-key-action/compare/d4fffb50872869abe2d9a9098a6d9c5aa7d16be4...6b84f2e793b32fa0b03a379cadadec75cc539391) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: 6.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: actions/setup-go dependency-version: 6.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: docker/metadata-action dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: docker/login-action dependency-version: 4.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions/attest-build-provenance dependency-version: 4.1.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: docker/setup-buildx-action dependency-version: 4.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: docker/build-push-action dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: actions-hub/kubectl dependency-version: 1.35.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: dominikh/staticcheck-action dependency-version: 1.4.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: actions/upload-artifact dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions - dependency-name: shimataro/ssh-key-action dependency-version: 2.8.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/asset-verification.yml | 4 ++-- .github/workflows/docker-pr.yml | 6 +++--- .github/workflows/docker.yml | 10 +++++----- .github/workflows/docs-deploy.yml | 12 ++++++------ .github/workflows/docs-test.yml | 6 +++--- .github/workflows/go-mod-tidy-check.yml | 2 +- .github/workflows/go.yml | 6 +++--- .github/workflows/package-builds-stable.yml | 4 ++-- .github/workflows/package-builds-unstable.yml | 6 +++--- .github/workflows/smoke-tests.yml | 6 +++--- .github/workflows/ssh-ci-runner-cron.yml | 4 ++-- .github/workflows/ssh-ci.yml | 4 ++-- 12 files changed, 35 insertions(+), 35 deletions(-) diff --git a/.github/workflows/asset-verification.yml b/.github/workflows/asset-verification.yml index 2792cf50..1ade7d19 100644 --- a/.github/workflows/asset-verification.yml +++ b/.github/workflows/asset-verification.yml @@ -22,10 +22,10 @@ jobs: sudo apt-get update sudo apt-get install -y build-essential - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: "24.11.0" - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "1.25.7" diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml index 0f7bd037..823c460b 100644 --- a/.github/workflows/docker-pr.yml +++ b/.github/workflows/docker-pr.yml @@ -26,10 +26,10 @@ jobs: sudo apt-get update sudo apt-get install -y build-essential - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: "24.11.0" - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "stable" @@ -37,7 +37,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: images: ghcr.io/${{ github.repository }} diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index ca2f060a..76c04dc2 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -36,17 +36,17 @@ jobs: run: | echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: "24.11.0" - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "stable" - uses: ko-build/setup-ko@d006021bd0c28d1ce33a07e7943d48b079944c8d # v0.9 - name: Log into registry - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -54,7 +54,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: images: ${{ env.IMAGE }} @@ -68,7 +68,7 @@ jobs: SLOG_LEVEL: debug - name: Generate artifact attestation - uses: actions/attest-build-provenance@96278af6caaf10aea03fd8d33a09a777ca52d62f # v3.2.0 + uses: actions/attest-build-provenance@a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32 # v4.1.0 with: subject-name: ${{ env.IMAGE }} subject-digest: ${{ steps.build.outputs.digest }} diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 6b77e8d1..8a587a0c 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -22,10 +22,10 @@ jobs: persist-credentials: false - name: Set up Docker Buildx - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Log into registry - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: ghcr.io username: techarohq @@ -33,7 +33,7 @@ jobs: - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: images: ghcr.io/techarohq/anubis/docs tags: | @@ -42,7 +42,7 @@ jobs: - name: Build and push id: build - uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0 with: context: ./docs cache-to: type=gha @@ -53,14 +53,14 @@ jobs: push: true - name: Apply k8s manifests to limsa lominsa - uses: actions-hub/kubectl@3ece3793e7a9fe94effe257d03ac834c815ea87d # v1.35.1 + uses: actions-hub/kubectl@5ada4e2c02eacc03978c2437e95c8b0f979a9619 # v1.35.2 env: KUBE_CONFIG: ${{ secrets.LIMSA_LOMINSA_KUBECONFIG }} with: args: apply -k docs/manifest - name: Apply k8s manifests to limsa lominsa - uses: actions-hub/kubectl@3ece3793e7a9fe94effe257d03ac834c815ea87d # v1.35.1 + uses: actions-hub/kubectl@5ada4e2c02eacc03978c2437e95c8b0f979a9619 # v1.35.2 env: KUBE_CONFIG: ${{ secrets.LIMSA_LOMINSA_KUBECONFIG }} with: diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index 96b0af5b..122f0ef9 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -18,11 +18,11 @@ jobs: persist-credentials: false - name: Set up Docker Buildx - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Docker meta id: meta - uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051 # v5.10.0 + uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0 with: images: ghcr.io/techarohq/anubis/docs tags: | @@ -31,7 +31,7 @@ jobs: - name: Build and push id: build - uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7.0.0 with: context: ./docs cache-to: type=gha diff --git a/.github/workflows/go-mod-tidy-check.yml b/.github/workflows/go-mod-tidy-check.yml index f4e2b91c..81274a56 100644 --- a/.github/workflows/go-mod-tidy-check.yml +++ b/.github/workflows/go-mod-tidy-check.yml @@ -17,7 +17,7 @@ jobs: with: persist-credentials: false - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "stable" diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 49ca8896..3ab4e0d1 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -24,10 +24,10 @@ jobs: sudo apt-get update sudo apt-get install -y build-essential - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: "24.11.0" - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "stable" @@ -55,7 +55,7 @@ jobs: run: npm run test - name: Lint with staticcheck - uses: dominikh/staticcheck-action@024238d2898c874f26d723e7d0ff4308c35589a2 # v1.4.0 + uses: dominikh/staticcheck-action@9716614d4101e79b4340dd97b10e54d68234e431 # v1.4.1 with: version: "latest" diff --git a/.github/workflows/package-builds-stable.yml b/.github/workflows/package-builds-stable.yml index e1198e1e..d1623a91 100644 --- a/.github/workflows/package-builds-stable.yml +++ b/.github/workflows/package-builds-stable.yml @@ -25,10 +25,10 @@ jobs: sudo apt-get update sudo apt-get install -y build-essential - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: "24.11.0" - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "stable" diff --git a/.github/workflows/package-builds-unstable.yml b/.github/workflows/package-builds-unstable.yml index 3d1a2033..e244262c 100644 --- a/.github/workflows/package-builds-unstable.yml +++ b/.github/workflows/package-builds-unstable.yml @@ -26,10 +26,10 @@ jobs: sudo apt-get update sudo apt-get install -y build-essential - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: "24.11.0" - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "stable" @@ -41,7 +41,7 @@ jobs: run: | go tool yeet - - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: packages path: var/* diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index 1d968675..2746e312 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -34,10 +34,10 @@ jobs: with: persist-credentials: false - - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 + - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: "24.11.0" - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "stable" @@ -57,7 +57,7 @@ jobs: run: echo "ARTIFACT_NAME=${{ matrix.test }}" | sed 's|/|-|g' >> $GITHUB_ENV - name: Upload artifact - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f if: always() with: name: ${{ env.ARTIFACT_NAME }} diff --git a/.github/workflows/ssh-ci-runner-cron.yml b/.github/workflows/ssh-ci-runner-cron.yml index 46796a78..12a21133 100644 --- a/.github/workflows/ssh-ci-runner-cron.yml +++ b/.github/workflows/ssh-ci-runner-cron.yml @@ -24,13 +24,13 @@ jobs: fetch-depth: 0 persist-credentials: false - name: Log into registry - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0 + uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 - name: Build and push run: | cd ./test/ssh-ci diff --git a/.github/workflows/ssh-ci.yml b/.github/workflows/ssh-ci.yml index 462fdf93..3069a33e 100644 --- a/.github/workflows/ssh-ci.yml +++ b/.github/workflows/ssh-ci.yml @@ -29,13 +29,13 @@ jobs: persist-credentials: false - name: Install CI target SSH key - uses: shimataro/ssh-key-action@d4fffb50872869abe2d9a9098a6d9c5aa7d16be4 # v2.7.0 + uses: shimataro/ssh-key-action@6b84f2e793b32fa0b03a379cadadec75cc539391 # v2.8.0 with: key: ${{ secrets.CI_SSH_KEY }} name: id_rsa known_hosts: ${{ secrets.CI_SSH_KNOWN_HOSTS }} - - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 + - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0 with: go-version: "stable" From a2a4cdebd6a83d771b3808624aea8a5c0e769fef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2026 10:48:22 +0000 Subject: [PATCH 10/15] build(deps): bump the npm group across 1 directory with 6 updates (#1512) Bumps the npm group with 6 updates in the / directory: | Package | From | To | | --- | --- | --- | | [preact](https://github.com/preactjs/preact) | `10.28.3` | `10.28.4` | | [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) | `20.4.1` | `20.4.3` | | [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) | `20.4.1` | `20.4.3` | | [baseline-browser-mapping](https://github.com/web-platform-dx/baseline-browser-mapping) | `2.9.19` | `2.10.0` | | [cssnano](https://github.com/cssnano/cssnano) | `7.1.2` | `7.1.3` | | [cssnano-preset-advanced](https://github.com/cssnano/cssnano) | `7.0.10` | `7.0.11` | Updates `preact` from 10.28.3 to 10.28.4 - [Release notes](https://github.com/preactjs/preact/releases) - [Commits](https://github.com/preactjs/preact/compare/10.28.3...10.28.4) Updates `@commitlint/cli` from 20.4.1 to 20.4.3 - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.4.3/@commitlint/cli) Updates `@commitlint/config-conventional` from 20.4.1 to 20.4.3 - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v20.4.3/@commitlint/config-conventional) Updates `baseline-browser-mapping` from 2.9.19 to 2.10.0 - [Release notes](https://github.com/web-platform-dx/baseline-browser-mapping/releases) - [Commits](https://github.com/web-platform-dx/baseline-browser-mapping/compare/v2.9.19...v2.10.0) Updates `cssnano` from 7.1.2 to 7.1.3 - [Release notes](https://github.com/cssnano/cssnano/releases) - [Commits](https://github.com/cssnano/cssnano/compare/cssnano@7.1.2...cssnano@7.1.3) Updates `cssnano-preset-advanced` from 7.0.10 to 7.0.11 - [Release notes](https://github.com/cssnano/cssnano/releases) - [Commits](https://github.com/cssnano/cssnano/compare/cssnano-preset-advanced@7.0.10...cssnano-preset-advanced@7.0.11) --- updated-dependencies: - dependency-name: preact dependency-version: 10.28.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm - dependency-name: "@commitlint/cli" dependency-version: 20.4.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: "@commitlint/config-conventional" dependency-version: 20.4.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: baseline-browser-mapping dependency-version: 2.10.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: cssnano dependency-version: 7.1.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: cssnano-preset-advanced dependency-version: 7.0.11 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 592 ++++++++++++++++++++++++---------------------- package.json | 12 +- 2 files changed, 316 insertions(+), 288 deletions(-) diff --git a/package-lock.json b/package-lock.json index c33542e2..c548a7d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,14 +10,14 @@ "license": "ISC", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", - "preact": "^10.28.3" + "preact": "^10.28.4" }, "devDependencies": { - "@commitlint/cli": "^20.4.1", - "@commitlint/config-conventional": "^20.4.1", - "baseline-browser-mapping": "^2.9.19", - "cssnano": "^7.1.2", - "cssnano-preset-advanced": "^7.0.10", + "@commitlint/cli": "^20.4.3", + "@commitlint/config-conventional": "^20.4.3", + "baseline-browser-mapping": "^2.10.0", + "cssnano": "^7.1.3", + "cssnano-preset-advanced": "^7.0.11", "esbuild": "^0.27.3", "husky": "^9.1.7", "playwright": "^1.52.0", @@ -92,17 +92,17 @@ } }, "node_modules/@commitlint/cli": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.4.1.tgz", - "integrity": "sha512-uuFKKpc7OtQM+6SRqT+a4kV818o1pS+uvv/gsRhyX7g4x495jg+Q7P0+O9VNGyLXBYP0syksS7gMRDJKcekr6A==", + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.4.3.tgz", + "integrity": "sha512-Z37EMoDT7+Upg500vlr/vZrgRsb6Xc5JAA3Tv7BYbobnN/ZpqUeZnSLggBg2+1O+NptRDtyujr2DD1CPV2qwhA==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/format": "^20.4.0", - "@commitlint/lint": "^20.4.1", - "@commitlint/load": "^20.4.0", - "@commitlint/read": "^20.4.0", - "@commitlint/types": "^20.4.0", + "@commitlint/format": "^20.4.3", + "@commitlint/lint": "^20.4.3", + "@commitlint/load": "^20.4.3", + "@commitlint/read": "^20.4.3", + "@commitlint/types": "^20.4.3", "tinyexec": "^1.0.0", "yargs": "^17.0.0" }, @@ -114,27 +114,27 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.4.1.tgz", - "integrity": "sha512-0YUvIeBtpi86XriqrR+TCULVFiyYTIOEPjK7tTRMxjcBm1qlzb+kz7IF2WxL6Fq5DaundG8VO37BNgMkMTBwqA==", + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.4.3.tgz", + "integrity": "sha512-9RtLySbYQAs8yEqWEqhSZo9nYhbm57jx7qHXtgRmv/nmeQIjjMcwf6Dl+y5UZcGWgWx435TAYBURONaJIuCjWg==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.0", - "conventional-changelog-conventionalcommits": "^9.1.0" + "@commitlint/types": "^20.4.3", + "conventional-changelog-conventionalcommits": "^9.2.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/config-validator": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.4.0.tgz", - "integrity": "sha512-zShmKTF+sqyNOfAE0vKcqnpvVpG0YX8F9G/ZIQHI2CoKyK+PSdladXMSns400aZ5/QZs+0fN75B//3Q5CHw++w==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.5.0.tgz", + "integrity": "sha512-T/Uh6iJUzyx7j35GmHWdIiGRQB+ouZDk0pwAaYq4SXgB54KZhFdJ0vYmxiW6AMYICTIWuyMxDBl1jK74oFp/Gw==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.0", + "@commitlint/types": "^20.5.0", "ajv": "^8.11.0" }, "engines": { @@ -142,13 +142,13 @@ } }, "node_modules/@commitlint/ensure": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.4.1.tgz", - "integrity": "sha512-WLQqaFx1pBooiVvBrA1YfJNFqZF8wS/YGOtr5RzApDbV9tQ52qT5VkTsY65hFTnXhW8PcDfZLaknfJTmPejmlw==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.5.0.tgz", + "integrity": "sha512-IpHqAUesBeW1EDDdjzJeaOxU9tnogLAyXLRBn03SHlj1SGENn2JGZqSWGkFvBJkJzfXAuCNtsoYzax+ZPS+puw==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.0", + "@commitlint/types": "^20.5.0", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -170,13 +170,13 @@ } }, "node_modules/@commitlint/format": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.4.0.tgz", - "integrity": "sha512-i3ki3WR0rgolFVX6r64poBHXM1t8qlFel1G1eCBvVgntE3fCJitmzSvH5JD/KVJN/snz6TfaX2CLdON7+s4WVQ==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.5.0.tgz", + "integrity": "sha512-TI9EwFU/qZWSK7a5qyXMpKPPv3qta7FO4tKW+Wt2al7sgMbLWTsAcDpX1cU8k16TRdsiiet9aOw0zpvRXNJu7Q==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.0", + "@commitlint/types": "^20.5.0", "picocolors": "^1.1.1" }, "engines": { @@ -184,13 +184,13 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.4.1.tgz", - "integrity": "sha512-In5EO4JR1lNsAv1oOBBO24V9ND1IqdAJDKZiEpdfjDl2HMasAcT7oA+5BKONv1pRoLG380DGPE2W2RIcUwdgLA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.5.0.tgz", + "integrity": "sha512-JWLarAsurHJhPozbuAH6GbP4p/hdOCoqS9zJMfqwswne+/GPs5V0+rrsfOkP68Y8PSLphwtFXV0EzJ+GTXTTGg==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.0", + "@commitlint/types": "^20.5.0", "semver": "^7.6.0" }, "engines": { @@ -211,33 +211,33 @@ } }, "node_modules/@commitlint/lint": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.4.1.tgz", - "integrity": "sha512-g94LrGl/c6UhuhDQqNqU232aslLEN2vzc7MPfQTHzwzM4GHNnEAwVWWnh0zX8S5YXecuLXDwbCsoGwmpAgPWKA==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.5.0.tgz", + "integrity": "sha512-jiM3hNUdu04jFBf1VgPdjtIPvbuVfDTBAc6L98AWcoLjF5sYqkulBHBzlVWll4rMF1T5zeQFB6r//a+s+BBKlA==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^20.4.1", - "@commitlint/parse": "^20.4.1", - "@commitlint/rules": "^20.4.1", - "@commitlint/types": "^20.4.0" + "@commitlint/is-ignored": "^20.5.0", + "@commitlint/parse": "^20.5.0", + "@commitlint/rules": "^20.5.0", + "@commitlint/types": "^20.5.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/load": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.4.0.tgz", - "integrity": "sha512-Dauup/GfjwffBXRJUdlX/YRKfSVXsXZLnINXKz0VZkXdKDcaEILAi9oflHGbfydonJnJAbXEbF3nXPm9rm3G6A==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.5.0.tgz", + "integrity": "sha512-sLhhYTL/KxeOTZjjabKDhwidGZan84XKK1+XFkwDYL/4883kIajcz/dZFAhBJmZPtL8+nBx6bnkzA95YxPeDPw==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^20.4.0", + "@commitlint/config-validator": "^20.5.0", "@commitlint/execute-rule": "^20.0.0", - "@commitlint/resolve-extends": "^20.4.0", - "@commitlint/types": "^20.4.0", - "cosmiconfig": "^9.0.0", + "@commitlint/resolve-extends": "^20.5.0", + "@commitlint/types": "^20.5.0", + "cosmiconfig": "^9.0.1", "cosmiconfig-typescript-loader": "^6.1.0", "is-plain-obj": "^4.1.0", "lodash.mergewith": "^4.6.2", @@ -248,9 +248,9 @@ } }, "node_modules/@commitlint/message": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.0.tgz", - "integrity": "sha512-B5lGtvHgiLAIsK5nLINzVW0bN5hXv+EW35sKhYHE8F7V9Uz1fR4tx3wt7mobA5UNhZKUNgB/+ldVMQE6IHZRyA==", + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.3.tgz", + "integrity": "sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ==", "dev": true, "license": "MIT", "engines": { @@ -258,30 +258,30 @@ } }, "node_modules/@commitlint/parse": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.4.1.tgz", - "integrity": "sha512-XNtZjeRcFuAfUnhYrCY02+mpxwY4OmnvD3ETbVPs25xJFFz1nRo/25nHj+5eM+zTeRFvWFwD4GXWU2JEtoK1/w==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.5.0.tgz", + "integrity": "sha512-SeKWHBMk7YOTnnEWUhx+d1a9vHsjjuo6Uo1xRfPNfeY4bdYFasCH1dDpAv13Lyn+dDPOels+jP6D2GRZqzc5fA==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^20.4.0", - "conventional-changelog-angular": "^8.1.0", - "conventional-commits-parser": "^6.2.1" + "@commitlint/types": "^20.5.0", + "conventional-changelog-angular": "^8.2.0", + "conventional-commits-parser": "^6.3.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/read": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.4.0.tgz", - "integrity": "sha512-QfpFn6/I240ySEGv7YWqho4vxqtPpx40FS7kZZDjUJ+eHxu3azfhy7fFb5XzfTqVNp1hNoI3tEmiEPbDB44+cg==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.5.0.tgz", + "integrity": "sha512-JDEIJ2+GnWpK8QqwfmW7O42h0aycJEWNqcdkJnyzLD11nf9dW2dWLTVEa8Wtlo4IZFGLPATjR5neA5QlOvIH1w==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/top-level": "^20.4.0", - "@commitlint/types": "^20.4.0", - "git-raw-commits": "^4.0.0", + "@commitlint/top-level": "^20.4.3", + "@commitlint/types": "^20.5.0", + "git-raw-commits": "^5.0.0", "minimist": "^1.2.8", "tinyexec": "^1.0.0" }, @@ -290,14 +290,14 @@ } }, "node_modules/@commitlint/resolve-extends": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.4.0.tgz", - "integrity": "sha512-ay1KM8q0t+/OnlpqXJ+7gEFQNlUtSU5Gxr8GEwnVf2TPN3+ywc5DzL3JCxmpucqxfHBTFwfRMXxPRRnR5Ki20g==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.5.0.tgz", + "integrity": "sha512-3SHPWUW2v0tyspCTcfSsYml0gses92l6TlogwzvM2cbxDgmhSRc+fldDjvGkCXJrjSM87BBaWYTPWwwyASZRrg==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^20.4.0", - "@commitlint/types": "^20.4.0", + "@commitlint/config-validator": "^20.5.0", + "@commitlint/types": "^20.5.0", "global-directory": "^4.0.1", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", @@ -308,16 +308,16 @@ } }, "node_modules/@commitlint/rules": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.4.1.tgz", - "integrity": "sha512-WtqypKEPbQEuJwJS4aKs0OoJRBKz1HXPBC9wRtzVNH68FLhPWzxXlF09hpUXM9zdYTpm4vAdoTGkWiBgQ/vL0g==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.5.0.tgz", + "integrity": "sha512-5NdQXQEdnDPT5pK8O39ZA7HohzPRHEsDGU23cyVCNPQy4WegAbAwrQk3nIu7p2sl3dutPk8RZd91yKTrMTnRkQ==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/ensure": "^20.4.1", - "@commitlint/message": "^20.4.0", + "@commitlint/ensure": "^20.5.0", + "@commitlint/message": "^20.4.3", "@commitlint/to-lines": "^20.0.0", - "@commitlint/types": "^20.4.0" + "@commitlint/types": "^20.5.0" }, "engines": { "node": ">=v18" @@ -334,9 +334,9 @@ } }, "node_modules/@commitlint/top-level": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.0.tgz", - "integrity": "sha512-NDzq8Q6jmFaIIBC/GG6n1OQEaHdmaAAYdrZRlMgW6glYWGZ+IeuXmiymDvQNXPc82mVxq2KiE3RVpcs+1OeDeA==", + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.3.tgz", + "integrity": "sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==", "dev": true, "license": "MIT", "dependencies": { @@ -347,19 +347,59 @@ } }, "node_modules/@commitlint/types": { - "version": "20.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.4.0.tgz", - "integrity": "sha512-aO5l99BQJ0X34ft8b0h7QFkQlqxC6e7ZPVmBKz13xM9O8obDaM1Cld4sQlJDXXU/VFuUzQ30mVtHjVz74TuStw==", + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.5.0.tgz", + "integrity": "sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==", "dev": true, "license": "MIT", "dependencies": { - "conventional-commits-parser": "^6.2.1", + "conventional-commits-parser": "^6.3.0", "picocolors": "^1.1.1" }, "engines": { "node": ">=v18" } }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.6.0.tgz", + "integrity": "sha512-T+uPDciKf0/ioNNDpMGc8FDsehJClZP0yR3Q5MN6wE/Y/1QZ7F+80OgznnTCOlMEG4AV0LvH2UJi3C/nBnaBUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.3.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/@conventional-changelog/git-client/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", @@ -802,6 +842,35 @@ "node": ">=18" } }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "integrity": "sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, "node_modules/@smithy/is-array-buffer": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", @@ -853,14 +922,14 @@ } }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/ajv": { @@ -935,9 +1004,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", "dev": true, "funding": [ { @@ -955,10 +1024,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -980,13 +1048,16 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/binary-extensions": { @@ -1034,9 +1105,9 @@ } }, "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -1054,11 +1125,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -1091,9 +1162,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001753", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", - "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", + "version": "1.0.30001779", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001779.tgz", + "integrity": "sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA==", "dev": true, "funding": [ { @@ -1207,9 +1278,9 @@ "license": "MIT" }, "node_modules/conventional-changelog-angular": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", - "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.0.tgz", + "integrity": "sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==", "dev": true, "license": "ISC", "dependencies": { @@ -1220,9 +1291,9 @@ } }, "node_modules/conventional-changelog-conventionalcommits": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.1.0.tgz", - "integrity": "sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.0.tgz", + "integrity": "sha512-kYFx6gAyjSIMwNtASkI3ZE99U1fuVDJr0yTYgVy+I2QG46zNZfl2her+0+eoviG82c5WQvW1jMt1eOQTeJLodA==", "dev": true, "license": "ISC", "dependencies": { @@ -1233,12 +1304,13 @@ } }, "node_modules/conventional-commits-parser": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", - "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.3.0.tgz", + "integrity": "sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==", "dev": true, "license": "MIT", "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", "meow": "^13.0.0" }, "bin": { @@ -1249,9 +1321,9 @@ } }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1324,14 +1396,14 @@ } }, "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" @@ -1364,13 +1436,13 @@ } }, "node_modules/cssnano": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.2.tgz", - "integrity": "sha512-HYOPBsNvoiFeR1eghKD5C3ASm64v9YVyJB4Ivnl2gqKoQYvjjN/G0rztvKQq8OxocUtC6sjqY8jwYngIB4AByA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.3.tgz", + "integrity": "sha512-mLFHQAzyapMVFLiJIn7Ef4C2UCEvtlTlbyILR6B5ZsUAV3D/Pa761R5uC1YPhyBkRd3eqaDm2ncaNrD7R4mTRg==", "dev": true, "license": "MIT", "dependencies": { - "cssnano-preset-default": "^7.0.10", + "cssnano-preset-default": "^7.0.11", "lilconfig": "^3.1.3" }, "engines": { @@ -1385,16 +1457,16 @@ } }, "node_modules/cssnano-preset-advanced": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-7.0.10.tgz", - "integrity": "sha512-lfsKxX4H6WS7BbNyDxkGOu2VgN4bbHQpY8llA3i3SJ9ozAPJ1MHq265Aw0aslM161qiS0zhCHaC6zRcEbNAgUA==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-7.0.11.tgz", + "integrity": "sha512-k9Dz/8TBOmLojoMZ+2xwrGjscU1XwYVDVB9T1AmvZcwiWz4ibWm8/y+/SN5jhYcpMPTeDe7FhI2uEYlNq1iDGg==", "dev": true, "license": "MIT", "dependencies": { - "autoprefixer": "^10.4.21", - "browserslist": "^4.27.0", - "cssnano-preset-default": "^7.0.10", - "postcss-discard-unused": "^7.0.4", + "autoprefixer": "^10.4.27", + "browserslist": "^4.28.1", + "cssnano-preset-default": "^7.0.11", + "postcss-discard-unused": "^7.0.5", "postcss-merge-idents": "^7.0.1", "postcss-reduce-idents": "^7.0.1", "postcss-zindex": "^7.0.1" @@ -1407,42 +1479,42 @@ } }, "node_modules/cssnano-preset-default": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.10.tgz", - "integrity": "sha512-6ZBjW0Lf1K1Z+0OKUAUpEN62tSXmYChXWi2NAA0afxEVsj9a+MbcB1l5qel6BHJHmULai2fCGRthCeKSFbScpA==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.11.tgz", + "integrity": "sha512-waWlAMuCakP7//UCY+JPrQS1z0OSLeOXk2sKWJximKWGupVxre50bzPlvpbUwZIDylhf/ptf0Pk+Yf7C+hoa3g==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.1", "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^5.0.1", "postcss-calc": "^10.1.1", - "postcss-colormin": "^7.0.5", - "postcss-convert-values": "^7.0.8", - "postcss-discard-comments": "^7.0.5", + "postcss-colormin": "^7.0.6", + "postcss-convert-values": "^7.0.9", + "postcss-discard-comments": "^7.0.6", "postcss-discard-duplicates": "^7.0.2", "postcss-discard-empty": "^7.0.1", "postcss-discard-overridden": "^7.0.1", "postcss-merge-longhand": "^7.0.5", - "postcss-merge-rules": "^7.0.7", + "postcss-merge-rules": "^7.0.8", "postcss-minify-font-values": "^7.0.1", "postcss-minify-gradients": "^7.0.1", - "postcss-minify-params": "^7.0.5", - "postcss-minify-selectors": "^7.0.5", + "postcss-minify-params": "^7.0.6", + "postcss-minify-selectors": "^7.0.6", "postcss-normalize-charset": "^7.0.1", "postcss-normalize-display-values": "^7.0.1", "postcss-normalize-positions": "^7.0.1", "postcss-normalize-repeat-style": "^7.0.1", "postcss-normalize-string": "^7.0.1", "postcss-normalize-timing-functions": "^7.0.1", - "postcss-normalize-unicode": "^7.0.5", + "postcss-normalize-unicode": "^7.0.6", "postcss-normalize-url": "^7.0.1", "postcss-normalize-whitespace": "^7.0.1", "postcss-ordered-values": "^7.0.2", - "postcss-reduce-initial": "^7.0.5", + "postcss-reduce-initial": "^7.0.6", "postcss-reduce-transforms": "^7.0.1", - "postcss-svgo": "^7.1.0", - "postcss-unique-selectors": "^7.0.4" + "postcss-svgo": "^7.1.1", + "postcss-unique-selectors": "^7.0.5" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -1507,19 +1579,6 @@ "dev": true, "license": "MIT" }, - "node_modules/dargs": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", - "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dependency-graph": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", @@ -1603,9 +1662,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", - "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", "dev": true, "license": "ISC" }, @@ -1739,16 +1798,16 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "dev": true, "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -1803,34 +1862,20 @@ } }, "node_modules/git-raw-commits": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", - "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", "dev": true, "license": "MIT", "dependencies": { - "dargs": "^8.0.0", - "meow": "^12.0.1", - "split2": "^4.0.0" + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" }, "bin": { - "git-raw-commits": "cli.mjs" + "git-raw-commits": "src/cli.js" }, "engines": { - "node": ">=16" - } - }, - "node_modules/git-raw-commits/node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, "node_modules/glob-parent": { @@ -2226,9 +2271,9 @@ } }, "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, "license": "CC0-1.0" }, @@ -2318,16 +2363,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -2519,13 +2554,13 @@ } }, "node_modules/postcss-colormin": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.5.tgz", - "integrity": "sha512-ekIBP/nwzRWhEMmIxHHbXHcMdzd1HIUzBECaj5KEdLz9DVP2HzT065sEhvOx1dkLjYW7jyD0CngThx6bpFi2fA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.6.tgz", + "integrity": "sha512-oXM2mdx6IBTRm39797QguYzVEWzbdlFiMNfq88fCCN1Wepw3CYmJ/1/Ifa/KjWo+j5ZURDl2NTldLJIw51IeNQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.1", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" @@ -2538,13 +2573,13 @@ } }, "node_modules/postcss-convert-values": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.8.tgz", - "integrity": "sha512-+XNKuPfkHTCEo499VzLMYn94TiL3r9YqRE3Ty+jP7UX4qjewUONey1t7CG21lrlTLN07GtGM8MqFVp86D4uKJg==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.9.tgz", + "integrity": "sha512-l6uATQATZaCa0bckHV+r6dLXfWtUBKXxO3jK+AtxxJJtgMPD+VhhPCCx51I4/5w8U5uHV67g3w7PXj+V3wlMlg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -2555,13 +2590,13 @@ } }, "node_modules/postcss-discard-comments": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.5.tgz", - "integrity": "sha512-IR2Eja8WfYgN5n32vEGSctVQ1+JARfu4UH8M7bgGh1bC+xI/obsPJXaBpQF7MAByvgwZinhpHpdrmXtvVVlKcQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.6.tgz", + "integrity": "sha512-Sq+Fzj1Eg5/CPf1ERb0wS1Im5cvE2gDXCE+si4HCn1sf+jpQZxDI4DXEp8t77B/ImzDceWE2ebJQFXdqZ6GRJw==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -2610,13 +2645,13 @@ } }, "node_modules/postcss-discard-unused": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-7.0.4.tgz", - "integrity": "sha512-/d6sIm8SSJbDDzdHyt/BWZ5upC6Dtn6JIL0uQts+AuvA5ddVmkw/3H4NtDv7DybGzCA1o3Q9R6kt4qsnS2mCSQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-7.0.5.tgz", + "integrity": "sha512-CdTIk/qGQHCY/v+FCTTUHVEIfNQv3xSDF+TudDC4l7JS1XaKk0gv0GM6heLF5pbt57l8/YQ4GsFwl2hYz2L9gA==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -2738,16 +2773,16 @@ } }, "node_modules/postcss-merge-rules": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.7.tgz", - "integrity": "sha512-njWJrd/Ms6XViwowaaCc+/vqhPG3SmXn725AGrnl+BgTuRPEacjiLEaGq16J6XirMJbtKkTwnt67SS+e2WGoew==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.8.tgz", + "integrity": "sha512-BOR1iAM8jnr7zoQSlpeBmCsWV5Uudi/+5j7k05D0O/WP3+OFMPD86c1j/20xiuRtyt45bhxw/7hnhZNhW2mNFA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.1", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.1", - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -2791,13 +2826,13 @@ } }, "node_modules/postcss-minify-params": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.5.tgz", - "integrity": "sha512-FGK9ky02h6Ighn3UihsyeAH5XmLEE2MSGH5Tc4tXMFtEDx7B+zTG6hD/+/cT+fbF7PbYojsmmWjyTwFwW1JKQQ==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.6.tgz", + "integrity": "sha512-YOn02gC68JijlaXVuKvFSCvQOhTpblkcfDre2hb/Aaa58r2BIaK4AtE/cyZf2wV7YKAG+UlP9DT+By0ry1E4VQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.1", "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, @@ -2809,14 +2844,14 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", - "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.6.tgz", + "integrity": "sha512-lIbC0jy3AAwDxEgciZlBullDiMBeBCT+fz5G8RcA9MWqh/hfUkpOI3vNDUNEZHgokaoiv0juB9Y8fGcON7rU/A==", "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -2919,13 +2954,13 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.5.tgz", - "integrity": "sha512-X6BBwiRxVaFHrb2WyBMddIeB5HBjJcAaUHyhLrM2FsxSq5TFqcHSsK7Zu1otag+o0ZphQGJewGH1tAyrD0zX1Q==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.6.tgz", + "integrity": "sha512-z6bwTV84YW6ZvvNoaNLuzRW4/uWxDKYI1iIDrzk6D2YTL7hICApy+Q1LP6vBEsljX8FM7YSuV9qI79XESd4ddQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -3001,13 +3036,13 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.5.tgz", - "integrity": "sha512-RHagHLidG8hTZcnr4FpyMB2jtgd/OcyAazjMhoy5qmWJOx1uxKh4ntk0Pb46ajKM0rkf32lRH4C8c9qQiPR6IA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.6.tgz", + "integrity": "sha512-G6ZyK68AmrPdMB6wyeA37ejnnRG2S8xinJrZJnOv+IaRKf6koPAVbQsiC7MfkmXaGmF1UO+QCijb27wfpxuRNg==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", + "browserslist": "^4.28.1", "caniuse-api": "^3.0.0" }, "engines": { @@ -3061,9 +3096,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -3075,14 +3110,14 @@ } }, "node_modules/postcss-svgo": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", - "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.1.tgz", + "integrity": "sha512-zU9H9oEDrUFKa0JB7w+IYL7Qs9ey1mZyjhbf0KLxwJDdDRtoPvCmaEfknzqfHj44QS9VD6c5sJnBAVYTLRg/Sg==", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^4.0.0" + "svgo": "^4.0.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >= 18" @@ -3092,13 +3127,13 @@ } }, "node_modules/postcss-unique-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", - "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.5.tgz", + "integrity": "sha512-3QoYmEt4qg/rUWDn6Tc8+ZVPmbp4G1hXDtCNWDx0st8SjtCbRcxRXDDM1QrEiXGG3A45zscSJFb4QH90LViyxg==", "dev": true, "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.1.0" + "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -3147,9 +3182,9 @@ } }, "node_modules/preact": { - "version": "10.28.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.3.tgz", - "integrity": "sha512-tCmoRkPQLpBeWzpmbhryairGnhW9tKV6c6gr/w+RhoRoKEJwsjzipwp//1oCpGPOchvSLaAPlpcJi9MwMmoPyA==", + "version": "10.28.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz", + "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==", "license": "MIT", "funding": { "type": "opencollective", @@ -3284,11 +3319,14 @@ } }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", "dev": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } }, "node_modules/semver": { "version": "6.3.1", @@ -3323,16 +3361,6 @@ "node": ">=0.10.0" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -3392,9 +3420,9 @@ } }, "node_modules/svgo": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", - "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "dev": true, "license": "MIT", "dependencies": { @@ -3404,7 +3432,7 @@ "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", - "sax": "^1.4.1" + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo.js" @@ -3425,9 +3453,9 @@ "license": "Apache-2.0" }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true, "license": "MIT", "engines": { @@ -3517,9 +3545,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT", "peer": true @@ -3535,9 +3563,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index 1954dc96..cdd08d27 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,11 @@ "author": "", "license": "ISC", "devDependencies": { - "@commitlint/cli": "^20.4.1", - "@commitlint/config-conventional": "^20.4.1", - "baseline-browser-mapping": "^2.9.19", - "cssnano": "^7.1.2", - "cssnano-preset-advanced": "^7.0.10", + "@commitlint/cli": "^20.4.3", + "@commitlint/config-conventional": "^20.4.3", + "baseline-browser-mapping": "^2.10.0", + "cssnano": "^7.1.3", + "cssnano-preset-advanced": "^7.0.11", "esbuild": "^0.27.3", "husky": "^9.1.7", "playwright": "^1.52.0", @@ -36,7 +36,7 @@ }, "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", - "preact": "^10.28.3" + "preact": "^10.28.4" }, "commitlint": { "extends": [ From 0ea13dcee28cf16f96b036faae020765a8d57a9e Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Tue, 17 Mar 2026 14:54:04 +0000 Subject: [PATCH 11/15] ci(ssh): disable homelab jobs because it's offline and i'm halfway across the world, oh well Signed-off-by: Xe Iaso --- .github/workflows/ssh-ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ssh-ci.yml b/.github/workflows/ssh-ci.yml index 3069a33e..a89a992e 100644 --- a/.github/workflows/ssh-ci.yml +++ b/.github/workflows/ssh-ci.yml @@ -12,14 +12,15 @@ permissions: jobs: ssh: if: github.repository == 'TecharoHQ/anubis' - runs-on: alrest-techarohq + #runs-on: alrest-techarohq + runs-on: ubuntu-latest strategy: matrix: host: - riscv64 - ppc64le - - aarch64-4k - - aarch64-16k + #- aarch64-4k + #- aarch64-16k steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 From 14a8d0c75e914dc6c0df8c10985481838e9055d2 Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Wed, 18 Mar 2026 14:14:48 +0000 Subject: [PATCH 12/15] chore: add uvensys logo Closes: #1517 Signed-off-by: Xe Iaso --- README.md | 3 +++ docs/docs/index.mdx | 3 +++ docs/static/img/sponsors/uvensys.webp | Bin 0 -> 7206 bytes 3 files changed, 6 insertions(+) create mode 100644 docs/static/img/sponsors/uvensys.webp diff --git a/README.md b/README.md index 06dd98e7..305b1288 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,9 @@ Anubis is brought to you by sponsors and donors like: ### Gold Tier + + Uvensys + Distrust diff --git a/docs/docs/index.mdx b/docs/docs/index.mdx index 709492fc..5cf0e887 100644 --- a/docs/docs/index.mdx +++ b/docs/docs/index.mdx @@ -35,6 +35,9 @@ Anubis is brought to you by sponsors and donors like: ### Gold Tier + + Uvensys + Distrust diff --git a/docs/static/img/sponsors/uvensys.webp b/docs/static/img/sponsors/uvensys.webp new file mode 100644 index 0000000000000000000000000000000000000000..aaa641f97f144919ff083ccfbf523150e53f46d9 GIT binary patch literal 7206 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 omT%AL8;IgPI+Vt!pfx Date: Wed, 18 Mar 2026 14:15:35 +0000 Subject: [PATCH 13/15] chore: update spelling Signed-off-by: Xe Iaso --- .github/actions/spelling/allow.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt index 28a4b092..8d4b5c3d 100644 --- a/.github/actions/spelling/allow.txt +++ b/.github/actions/spelling/allow.txt @@ -29,3 +29,5 @@ Prolocation Necron Stargate FFXIV +uvensys +de From 5186d7d3ad9963dafe6aeaa87a574c04ea91ae1a Mon Sep 17 00:00:00 2001 From: Jason Cameron Date: Wed, 18 Mar 2026 10:17:28 -0400 Subject: [PATCH 14/15] chore: gofix (#1466) Signed-off-by: Jason Cameron --- cmd/anubis/main.go | 4 +-- cmd/robots2policy/main.go | 8 ++--- cmd/robots2policy/robots2policy_test.go | 10 +++---- internal/glob/glob.go | 2 +- internal/hash_bench_test.go | 4 +-- internal/honeypot/naive/naive.go | 4 +-- internal/listor.go | 4 +-- internal/ogtags/mem_test.go | 4 +-- internal/ogtags/ogtags_fuzz_test.go | 17 ++++------- internal/ogtags/parse.go | 7 ++--- internal/test/playwright_test.go | 2 +- lib/anubis.go | 4 +-- lib/anubis_test.go | 4 +-- lib/config/config.go | 6 ++-- lib/config/config_test.go | 3 -- lib/config_test.go | 2 -- lib/http.go | 5 +--- lib/policy/expressions/environment_test.go | 34 +++++++++++----------- lib/policy/policy_test.go | 2 -- lib/store/s3api/s3api_test.go | 5 ++-- lib/store/valkey/factory.go | 2 +- lib/thoth/auth.go | 4 +-- 22 files changed, 59 insertions(+), 78 deletions(-) diff --git a/cmd/anubis/main.go b/cmd/anubis/main.go index e21eeca1..a38cfdb3 100644 --- a/cmd/anubis/main.go +++ b/cmd/anubis/main.go @@ -418,8 +418,8 @@ func main() { var redirectDomainsList []string if *redirectDomains != "" { - domains := strings.Split(*redirectDomains, ",") - for _, domain := range domains { + domains := strings.SplitSeq(*redirectDomains, ",") + for domain := range domains { _, err = url.Parse(domain) if err != nil { log.Fatalf("cannot parse redirect-domain %q: %s", domain, err.Error()) diff --git a/cmd/robots2policy/main.go b/cmd/robots2policy/main.go index 69fb2f96..e79a6262 100644 --- a/cmd/robots2policy/main.go +++ b/cmd/robots2policy/main.go @@ -10,6 +10,7 @@ import ( "net/http" "os" "regexp" + "slices" "strings" "github.com/TecharoHQ/anubis/lib/config" @@ -210,11 +211,8 @@ func parseRobotsTxt(input io.Reader) ([]RobotsRule, error) { // Mark blacklisted user agents (those with "Disallow: /") for i := range rules { - for _, disallow := range rules[i].Disallows { - if disallow == "/" { - rules[i].IsBlacklist = true - break - } + if slices.Contains(rules[i].Disallows, "/") { + rules[i].IsBlacklist = true } } diff --git a/cmd/robots2policy/robots2policy_test.go b/cmd/robots2policy/robots2policy_test.go index 523d69a7..ef3008f4 100644 --- a/cmd/robots2policy/robots2policy_test.go +++ b/cmd/robots2policy/robots2policy_test.go @@ -158,8 +158,8 @@ func TestDataFileConversion(t *testing.T) { } if strings.ToLower(*outputFormat) == "yaml" { - var actualData []interface{} - var expectedData []interface{} + var actualData []any + var expectedData []any err = yaml.Unmarshal(actualOutput, &actualData) if err != nil { @@ -178,8 +178,8 @@ func TestDataFileConversion(t *testing.T) { t.Errorf("Output mismatch for %s\nExpected:\n%s\n\nActual:\n%s", tc.name, expectedStr, actualStr) } } else { - var actualData []interface{} - var expectedData []interface{} + var actualData []any + var expectedData []any err = json.Unmarshal(actualOutput, &actualData) if err != nil { @@ -419,6 +419,6 @@ Disallow: /` // compareData performs a deep comparison of two data structures, // ignoring differences that are semantically equivalent in YAML/JSON -func compareData(actual, expected interface{}) bool { +func compareData(actual, expected any) bool { return reflect.DeepEqual(actual, expected) } diff --git a/internal/glob/glob.go b/internal/glob/glob.go index 44c1a67a..e2e640de 100644 --- a/internal/glob/glob.go +++ b/internal/glob/glob.go @@ -36,7 +36,7 @@ func Glob(pattern, subj string) bool { end := len(parts) - 1 // Go over the leading parts and ensure they match. - for i := 0; i < end; i++ { + for i := range end { idx := strings.Index(subj, parts[i]) switch i { diff --git a/internal/hash_bench_test.go b/internal/hash_bench_test.go index 5384570a..88f87e7c 100644 --- a/internal/hash_bench_test.go +++ b/internal/hash_bench_test.go @@ -184,7 +184,7 @@ func TestHashCollisions(t *testing.T) { for _, prefix := range prefixes { for _, suffix := range suffixes { for _, variation := range variations { - for i := 0; i < 100; i++ { + for i := range 100 { input := fmt.Sprintf("%s%s%s-%d", prefix, suffix, variation, i) hash := XXHash64sum(input) if existing, exists := xxhashHashes[hash]; exists { @@ -211,7 +211,7 @@ func TestHashCollisions(t *testing.T) { seqCount := 0 for _, pattern := range patterns { - for i := 0; i < 10000; i++ { + for i := range 10000 { input := fmt.Sprintf(pattern, i) hash := XXHash64sum(input) if existing, exists := xxhashHashes[hash]; exists { diff --git a/internal/honeypot/naive/naive.go b/internal/honeypot/naive/naive.go index f62f4ef8..95093bcf 100644 --- a/internal/honeypot/naive/naive.go +++ b/internal/honeypot/naive/naive.go @@ -120,7 +120,7 @@ func (i *Impl) makeAffirmations() []string { count := rand.IntN(5) + 1 var result []string - for j := 0; j < count; j++ { + for range count { result = append(result, i.affirmation.Spin()) } @@ -131,7 +131,7 @@ func (i *Impl) makeSpins() []string { count := rand.IntN(5) + 1 var result []string - for j := 0; j < count; j++ { + for range count { result = append(result, i.body.Spin()) } diff --git a/internal/listor.go b/internal/listor.go index b6ba57fe..73110b79 100644 --- a/internal/listor.go +++ b/internal/listor.go @@ -16,7 +16,7 @@ func (lo *ListOr[T]) UnmarshalJSON(data []byte) error { // Check if first non-whitespace character is '[' firstChar := data[0] - for i := 0; i < len(data); i++ { + for i := range data { if data[i] != ' ' && data[i] != '\t' && data[i] != '\n' && data[i] != '\r' { firstChar = data[i] break @@ -36,4 +36,4 @@ func (lo *ListOr[T]) UnmarshalJSON(data []byte) error { } return nil -} \ No newline at end of file +} diff --git a/internal/ogtags/mem_test.go b/internal/ogtags/mem_test.go index 3770a73f..aebb4f6f 100644 --- a/internal/ogtags/mem_test.go +++ b/internal/ogtags/mem_test.go @@ -95,7 +95,7 @@ func TestMemoryUsage(t *testing.T) { // Run getTarget many times u, _ := url.Parse("/path/to/resource?query=1&foo=bar&baz=qux") - for i := 0; i < 10000; i++ { + for range 10000 { _ = cache.getTarget(u) } @@ -129,7 +129,7 @@ func TestMemoryUsage(t *testing.T) { runtime.GC() runtime.ReadMemStats(&m1) - for i := 0; i < 1000; i++ { + for range 1000 { _ = cache.extractOGTags(doc) } diff --git a/internal/ogtags/ogtags_fuzz_test.go b/internal/ogtags/ogtags_fuzz_test.go index 6355eebf..8b7abb91 100644 --- a/internal/ogtags/ogtags_fuzz_test.go +++ b/internal/ogtags/ogtags_fuzz_test.go @@ -3,6 +3,7 @@ package ogtags import ( "context" "net/url" + "slices" "strings" "testing" "unicode/utf8" @@ -78,7 +79,7 @@ func FuzzGetTarget(f *testing.F) { } // Ensure no memory corruption by calling multiple times - for i := 0; i < 3; i++ { + for range 3 { result2 := cache.getTarget(u) if result != result2 { t.Errorf("getTarget not deterministic: %q != %q", result, result2) @@ -148,11 +149,8 @@ func FuzzExtractOGTags(f *testing.F) { } } if !approved { - for _, tag := range cache.approvedTags { - if property == tag { - approved = true - break - } + if slices.Contains(cache.approvedTags, property) { + approved = true } } if !approved { @@ -260,11 +258,8 @@ func FuzzExtractMetaTagInfo(f *testing.F) { } } if !approved { - for _, tag := range cache.approvedTags { - if property == tag { - approved = true - break - } + if slices.Contains(cache.approvedTags, property) { + approved = true } } if !approved { diff --git a/internal/ogtags/parse.go b/internal/ogtags/parse.go index c21fd795..98176558 100644 --- a/internal/ogtags/parse.go +++ b/internal/ogtags/parse.go @@ -1,6 +1,7 @@ package ogtags import ( + "slices" "strings" "golang.org/x/net/html" @@ -65,10 +66,8 @@ func (c *OGTagCache) extractMetaTagInfo(n *html.Node) (property, content string) } // Check exact matches - for _, tag := range c.approvedTags { - if propertyKey == tag { - return propertyKey, content - } + if slices.Contains(c.approvedTags, propertyKey) { + return propertyKey, content } return "", content diff --git a/internal/test/playwright_test.go b/internal/test/playwright_test.go index b1cab340..4d6355ba 100644 --- a/internal/test/playwright_test.go +++ b/internal/test/playwright_test.go @@ -270,7 +270,7 @@ func TestPlaywrightBrowser(t *testing.T) { var performedAction action var err error - for i := 0; i < 5; i++ { + for i := range 5 { performedAction, err = executeTestCase(t, tc, typ, anubisURL) if performedAction == tc.action { break diff --git a/lib/anubis.go b/lib/anubis.go index feff53a3..3223b96d 100644 --- a/lib/anubis.go +++ b/lib/anubis.go @@ -81,11 +81,11 @@ type Server struct { func (s *Server) getTokenKeyfunc() jwt.Keyfunc { // return ED25519 key if HS512 is not set if len(s.hs512Secret) == 0 { - return func(token *jwt.Token) (interface{}, error) { + return func(token *jwt.Token) (any, error) { return s.ed25519Priv.Public().(ed25519.PublicKey), nil } } else { - return func(token *jwt.Token) (interface{}, error) { + return func(token *jwt.Token) (any, error) { return s.hs512Secret, nil } } diff --git a/lib/anubis_test.go b/lib/anubis_test.go index 07785d37..7c0f87d3 100644 --- a/lib/anubis_test.go +++ b/lib/anubis_test.go @@ -38,8 +38,8 @@ func NewTLogWriter(t *testing.T) io.Writer { // Write splits input on newlines and logs each line separately. func (w *TLogWriter) Write(p []byte) (n int, err error) { - lines := strings.Split(string(p), "\n") - for _, line := range lines { + lines := strings.SplitSeq(string(p), "\n") + for line := range lines { if line != "" { w.t.Log(line) } diff --git a/lib/config/config.go b/lib/config/config.go index d50cdae3..01b46576 100644 --- a/lib/config/config.go +++ b/lib/config/config.go @@ -228,8 +228,8 @@ type ImportStatement struct { } func (is *ImportStatement) open() (fs.File, error) { - if strings.HasPrefix(is.Import, "(data)/") { - fname := strings.TrimPrefix(is.Import, "(data)/") + if after, ok := strings.CutPrefix(is.Import, "(data)/"); ok { + fname := after fin, err := data.BotPolicies.Open(fname) return fin, err } @@ -325,7 +325,7 @@ func (sc StatusCodes) Valid() error { } type fileConfig struct { - OpenGraph openGraphFileConfig `json:"openGraph,omitempty"` + OpenGraph openGraphFileConfig `json:"openGraph"` Impressum *Impressum `json:"impressum,omitempty"` Store *Store `json:"store"` Bots []BotOrImport `json:"bots"` diff --git a/lib/config/config_test.go b/lib/config/config_test.go index 1b933759..ce57feed 100644 --- a/lib/config/config_test.go +++ b/lib/config/config_test.go @@ -188,7 +188,6 @@ func TestBotValid(t *testing.T) { } for _, cs := range tests { - cs := cs t.Run(cs.name, func(t *testing.T) { err := cs.bot.Valid() if err == nil && cs.err == nil { @@ -216,7 +215,6 @@ func TestConfigValidKnownGood(t *testing.T) { } for _, st := range finfos { - st := st t.Run(st.Name(), func(t *testing.T) { fin, err := os.Open(filepath.Join("testdata", "good", st.Name())) if err != nil { @@ -303,7 +301,6 @@ func TestConfigValidBad(t *testing.T) { } for _, st := range finfos { - st := st t.Run(st.Name(), func(t *testing.T) { fin, err := os.Open(filepath.Join("testdata", "bad", st.Name())) if err != nil { diff --git a/lib/config_test.go b/lib/config_test.go index 5d392dbb..99aab736 100644 --- a/lib/config_test.go +++ b/lib/config_test.go @@ -24,7 +24,6 @@ func TestBadConfigs(t *testing.T) { } for _, st := range finfos { - st := st t.Run(st.Name(), func(t *testing.T) { if _, err := LoadPoliciesOrDefault(t.Context(), filepath.Join("config", "testdata", "bad", st.Name()), anubis.DefaultDifficulty, "info"); err == nil { t.Fatal(err) @@ -42,7 +41,6 @@ func TestGoodConfigs(t *testing.T) { } for _, st := range finfos { - st := st t.Run(st.Name(), func(t *testing.T) { t.Run("with-thoth", func(t *testing.T) { ctx := thothmock.WithMockThoth(t) diff --git a/lib/http.go b/lib/http.go index 790a4aae..4cb4aa99 100644 --- a/lib/http.go +++ b/lib/http.go @@ -182,10 +182,7 @@ func makeCode(err error) string { enc := base64.StdEncoding.EncodeToString(buf.Bytes()) var builder strings.Builder for i := 0; i < len(enc); i += width { - end := i + width - if end > len(enc) { - end = len(enc) - } + end := min(i+width, len(enc)) builder.WriteString(enc[i:end]) builder.WriteByte('\n') } diff --git a/lib/policy/expressions/environment_test.go b/lib/policy/expressions/environment_test.go index beb1c2c6..c33fbbcb 100644 --- a/lib/policy/expressions/environment_test.go +++ b/lib/policy/expressions/environment_test.go @@ -103,7 +103,7 @@ func TestBotEnvironment(t *testing.T) { t.Fatalf("failed to compile expression %q: %v", tt.expression, err) } - result, _, err := prog.Eval(map[string]interface{}{ + result, _, err := prog.Eval(map[string]any{ "headers": tt.headers, }) if err != nil { @@ -168,7 +168,7 @@ func TestBotEnvironment(t *testing.T) { t.Fatalf("failed to compile expression %q: %v", tt.expression, err) } - result, _, err := prog.Eval(map[string]interface{}{ + result, _, err := prog.Eval(map[string]any{ "path": tt.path, }) if err != nil { @@ -280,7 +280,7 @@ func TestBotEnvironment(t *testing.T) { t.Fatalf("failed to compile expression %q: %v", tt.expression, err) } - result, _, err := prog.Eval(map[string]interface{}{}) + result, _, err := prog.Eval(map[string]any{}) if err != nil { t.Fatalf("failed to evaluate expression %q: %v", tt.expression, err) } @@ -359,7 +359,7 @@ func TestBotEnvironment(t *testing.T) { t.Fatalf("failed to compile expression %q: %v", tt.expression, err) } - result, _, err := prog.Eval(map[string]interface{}{}) + result, _, err := prog.Eval(map[string]any{}) if err != nil { t.Fatalf("failed to evaluate expression %q: %v", tt.expression, err) } @@ -421,7 +421,7 @@ func TestBotEnvironment(t *testing.T) { t.Fatalf("failed to compile expression %q: %v", tt.expression, err) } - result, _, err := prog.Eval(map[string]interface{}{}) + result, _, err := prog.Eval(map[string]any{}) if err != nil { t.Fatalf("failed to evaluate expression %q: %v", tt.expression, err) } @@ -514,7 +514,7 @@ func TestBotEnvironment(t *testing.T) { t.Fatalf("failed to compile expression %q: %v", tt.expression, err) } - result, _, err := prog.Eval(map[string]interface{}{}) + result, _, err := prog.Eval(map[string]any{}) if err != nil { t.Fatalf("failed to evaluate expression %q: %v", tt.expression, err) } @@ -572,7 +572,7 @@ func TestBotEnvironment(t *testing.T) { t.Fatalf("failed to compile expression %q: %v", tt.expression, err) } - result, _, err := prog.Eval(map[string]interface{}{}) + result, _, err := prog.Eval(map[string]any{}) if tt.evalError { if err == nil { t.Errorf("%s: expected an evaluation error, but got none", tt.description) @@ -598,7 +598,7 @@ func TestThresholdEnvironment(t *testing.T) { } tests := []struct { - variables map[string]interface{} + variables map[string]any name string expression string description string @@ -608,7 +608,7 @@ func TestThresholdEnvironment(t *testing.T) { { name: "weight-variable-available", expression: `weight > 100`, - variables: map[string]interface{}{"weight": 150}, + variables: map[string]any{"weight": 150}, expected: types.Bool(true), description: "should support weight variable in expressions", shouldCompile: true, @@ -616,7 +616,7 @@ func TestThresholdEnvironment(t *testing.T) { { name: "weight-variable-false-case", expression: `weight > 100`, - variables: map[string]interface{}{"weight": 50}, + variables: map[string]any{"weight": 50}, expected: types.Bool(false), description: "should correctly evaluate weight comparisons", shouldCompile: true, @@ -624,7 +624,7 @@ func TestThresholdEnvironment(t *testing.T) { { name: "missingHeader-not-available", expression: `missingHeader(headers, "Test")`, - variables: map[string]interface{}{}, + variables: map[string]any{}, expected: types.Bool(false), // not used description: "should not have missingHeader function available", shouldCompile: false, @@ -667,7 +667,7 @@ func TestNewEnvironment(t *testing.T) { tests := []struct { name string expression string - variables map[string]interface{} + variables map[string]any expectBool *bool // nil if we just want to test compilation or non-bool result description string shouldCompile bool @@ -675,7 +675,7 @@ func TestNewEnvironment(t *testing.T) { { name: "randInt-function-compilation", expression: `randInt(10)`, - variables: map[string]interface{}{}, + variables: map[string]any{}, expectBool: nil, // Don't check result, just compilation description: "should compile randInt function", shouldCompile: true, @@ -683,7 +683,7 @@ func TestNewEnvironment(t *testing.T) { { name: "randInt-range-validation", expression: `randInt(10) >= 0 && randInt(10) < 10`, - variables: map[string]interface{}{}, + variables: map[string]any{}, expectBool: boolPtr(true), description: "should return values in correct range", shouldCompile: true, @@ -691,7 +691,7 @@ func TestNewEnvironment(t *testing.T) { { name: "strings-extension-size", expression: `"hello".size() == 5`, - variables: map[string]interface{}{}, + variables: map[string]any{}, expectBool: boolPtr(true), description: "should support string extension functions", shouldCompile: true, @@ -699,7 +699,7 @@ func TestNewEnvironment(t *testing.T) { { name: "strings-extension-contains", expression: `"hello world".contains("world")`, - variables: map[string]interface{}{}, + variables: map[string]any{}, expectBool: boolPtr(true), description: "should support string contains function", shouldCompile: true, @@ -707,7 +707,7 @@ func TestNewEnvironment(t *testing.T) { { name: "strings-extension-startsWith", expression: `"hello world".startsWith("hello")`, - variables: map[string]interface{}{}, + variables: map[string]any{}, expectBool: boolPtr(true), description: "should support string startsWith function", shouldCompile: true, diff --git a/lib/policy/policy_test.go b/lib/policy/policy_test.go index 56ce3731..7f14d3f9 100644 --- a/lib/policy/policy_test.go +++ b/lib/policy/policy_test.go @@ -32,7 +32,6 @@ func TestGoodConfigs(t *testing.T) { } for _, st := range finfos { - st := st t.Run(st.Name(), func(t *testing.T) { t.Run("with-thoth", func(t *testing.T) { fin, err := os.Open(filepath.Join("..", "config", "testdata", "good", st.Name())) @@ -71,7 +70,6 @@ func TestBadConfigs(t *testing.T) { } for _, st := range finfos { - st := st t.Run(st.Name(), func(t *testing.T) { fin, err := os.Open(filepath.Join("..", "config", "testdata", "bad", st.Name())) if err != nil { diff --git a/lib/store/s3api/s3api_test.go b/lib/store/s3api/s3api_test.go index 5b7a9c6b..37d58a76 100644 --- a/lib/store/s3api/s3api_test.go +++ b/lib/store/s3api/s3api_test.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "io" + "maps" "sync" "testing" "time" @@ -36,9 +37,7 @@ func (m *mockS3) PutObject(ctx context.Context, in *s3.PutObjectInput, _ ...func m.data[aws.ToString(in.Key)] = bytes.Clone(b) if in.Metadata != nil { m.meta[aws.ToString(in.Key)] = map[string]string{} - for k, v := range in.Metadata { - m.meta[aws.ToString(in.Key)][k] = v - } + maps.Copy(m.meta[aws.ToString(in.Key)], in.Metadata) } m.bucket = aws.ToString(in.Bucket) return &s3.PutObjectOutput{}, nil diff --git a/lib/store/valkey/factory.go b/lib/store/valkey/factory.go index 309bf656..49a63469 100644 --- a/lib/store/valkey/factory.go +++ b/lib/store/valkey/factory.go @@ -103,7 +103,7 @@ func (s Sentinel) Valid() error { // redisClient is satisfied by *valkey.Client and *valkey.ClusterClient. type redisClient interface { Get(ctx context.Context, key string) *valkey.StringCmd - Set(ctx context.Context, key string, value interface{}, expiration time.Duration) *valkey.StatusCmd + Set(ctx context.Context, key string, value any, expiration time.Duration) *valkey.StatusCmd Del(ctx context.Context, keys ...string) *valkey.IntCmd Ping(ctx context.Context) *valkey.StatusCmd } diff --git a/lib/thoth/auth.go b/lib/thoth/auth.go index f4d52c6d..5f7d0c91 100644 --- a/lib/thoth/auth.go +++ b/lib/thoth/auth.go @@ -11,8 +11,8 @@ func authUnaryClientInterceptor(token string) grpc.UnaryClientInterceptor { return func( ctx context.Context, method string, - req interface{}, - reply interface{}, + req any, + reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption, From 3154ff5004025faade5d7c12c2e38667e17a161e Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Wed, 18 Mar 2026 16:06:18 +0000 Subject: [PATCH 15/15] chore: add sponsor logo Closes: #1472 Signed-off-by: Xe Iaso --- README.md | 3 +++ docs/docs/index.mdx | 3 +++ docs/static/img/sponsors/unipromos.webp | Bin 0 -> 1882 bytes 3 files changed, 6 insertions(+) create mode 100644 docs/static/img/sponsors/unipromos.webp diff --git a/README.md b/README.md index 305b1288..25ae0912 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,9 @@ Anubis is brought to you by sponsors and donors like: ### Gold Tier + + Unipromos + Uvensys diff --git a/docs/docs/index.mdx b/docs/docs/index.mdx index 5cf0e887..9db0a498 100644 --- a/docs/docs/index.mdx +++ b/docs/docs/index.mdx @@ -35,6 +35,9 @@ Anubis is brought to you by sponsors and donors like: ### Gold Tier + + Uvensys + Uvensys diff --git a/docs/static/img/sponsors/unipromos.webp b/docs/static/img/sponsors/unipromos.webp new file mode 100644 index 0000000000000000000000000000000000000000..c0a0213e92088b806da74576b47515aeb9258c1d GIT binary patch literal 1882 zcmV-g2c`H@Nk&Fe2LJ$9MM6+kP&gn)2LJ#NA^@EMD!u?b06vjCnn?K~g6<0CiU# zk5YGDE*|pC_(}jM8J5)asw{0mb+iiH!_xfOhM$IYEz^5XlaDkE_#GXm%LIg#@7iEU z-p!V+ng)puCpoHyXC^u>*bujG22Z4A7m6 zmxmapiI!aD6_qw}r75~~LktwgvW{)65oS|rV24haa`Tn9wV1^`R_>#<*8`kTov#2e zJ}2$+yRD+>P11k`_vAV(tF5MFJJg_z|xXdFX7{wPiq*2qw4?5cOra<>#x<6BS z3Jrds&<=~sq3SezswRDSyz_O$_^rlF3kWqBagE*-}{ zvrSRW5BE~UMNE6X%N9mfFfC#}iua3&-f^oeo~y63FE^*2+-d|@-rb;DKv1(;$3dXpsc zpL@OEe~1RLoD$c3w~zZ*27|y2-#leD#EvOF?n#mu7%kTjs13d4)QqwpmCt*|!m;6- zg-8DUQ|&-pI>Sj}AHT&2^M}@bb8J7SWIKkKU?!JTL^ncg&bl;BL)Xv%b_mgQ-fo7l z!1+0?1{8<;BYe8Vg~sQDy-t4pT5Y0$Rh@8Q zQbVDm5eO05qSb`WrS<*!Q4ET+J7JIV@Q~RPBc)ZK?0B_Sg}Qo@wq(`cb&IdH!-8iZ zojA1&2<Z!XFnKfER6U>^0~zVKSxcXM7&~FA@XZ zEGtI6uX z$O`qY-BC-qG}`T@qGfd=h3b>fAFA$9%0y}L&wo1Ng218SQatksT+N}ir|-)MPHaA$ zpvFcKH@ep{+rbMx#ZJ|(LQ;k3^F_7nk#*{kmG0x&T)Ns_rsa*|JIc>mZrF{Vl=OOA_12t`B`20|-9*atzi3q9D zAr5Lrj{w!PQ->u$`mbpp3_g0C#A}ki0R(`rR@AGgHB}-6tPsd6J+@M77a~v z9;R1Z5$$a3)KXj2;3x_93O0);i*4R)=Dhn*8HIPLu5(=_3imlddI;wS&?ZAr2{?eW z<#2=s7!QvkB`IvfPXVynOvOJfi!umDMj8q{zZ zNS9`VvJosY9)ZJ=333yo<@uhZHD^!<2~zmgiK{JE z_E6t7imJ9Q|85~vyOeb|Q+m!hbAbDvK&xYAw_GEwI7Gl()=@=gQr9k{v+Qge8{AOI zAKX(=u$3wn>FH0ptLw#fC60F228^@l6-*yfM0|@H1@