diff --git a/.github/workflows/smoke-mastodon.yml b/.github/workflows/smoke-mastodon.yml new file mode 100644 index 000000000..6a01fdf96 --- /dev/null +++ b/.github/workflows/smoke-mastodon.yml @@ -0,0 +1,93 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json +# +# Interoperability smoke tests. +# Spins up a Mastodon instance via Docker Compose and verifies that Fedify +# can correctly exchange ActivityPub messages with it. +# See: https://github.com/fedify-dev/fedify/issues/481 +name: smoke-mastodon + +on: + push: + branches: + - main + - next + - "*.*-maintenance" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + smoke: + runs-on: ubuntu-latest + timeout-minutes: 25 + + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/setup-mise + + - name: Generate Mastodon secrets + run: | + IMAGE=ghcr.io/mastodon/mastodon:v4.3.9 + docker pull "$IMAGE" + + SECRET1=$(docker run --rm "$IMAGE" bundle exec rails secret) + SECRET2=$(docker run --rm "$IMAGE" bundle exec rails secret) + + { + echo "SECRET_KEY_BASE=$SECRET1" + echo "OTP_SECRET=$SECRET2" + docker run --rm "$IMAGE" bundle exec rails mastodon:webpush:generate_vapid_key \ + | grep -E '^[A-Z_]+=.+' + docker run --rm "$IMAGE" bundle exec rails db:encryption:init \ + | grep -E '^[A-Z_]+=.+' + } >> test/smoke/mastodon/mastodon.env + + - name: Start database and redis + run: | + docker compose -f test/smoke/mastodon/docker-compose.yml up -d db redis + docker compose -f test/smoke/mastodon/docker-compose.yml exec -T db \ + sh -c 'until pg_isready -U mastodon; do sleep 1; done' + + - name: Run DB setup and migrations + run: | + docker compose -f test/smoke/mastodon/docker-compose.yml run --rm -T \ + mastodon-web bundle exec rails db:setup + timeout-minutes: 5 + + - name: Start Mastodon stack + run: docker compose -f test/smoke/mastodon/docker-compose.yml up --wait + timeout-minutes: 12 + + - name: Provision Mastodon + run: bash test/smoke/mastodon/provision.sh + + - name: Verify connectivity + run: | + echo "=== Harness health (from mastodon-web) ===" + docker compose -f test/smoke/mastodon/docker-compose.yml exec -T mastodon-web \ + curl -sf http://fedify-harness:3001/_test/health + echo " OK" + + echo "=== Harness health (from mastodon-sidekiq) ===" + docker compose -f test/smoke/mastodon/docker-compose.yml exec -T mastodon-sidekiq \ + curl -sf http://fedify-harness:3001/_test/health + echo " OK" + + - name: Run smoke tests + run: | + set -a && source test/smoke/.env.test && set +a + deno run --allow-net --allow-env --unstable-temporal \ + test/smoke/orchestrator.ts + + - name: Collect logs on failure + if: failure() + run: | + echo "=== Docker Compose logs ===" + docker compose -f test/smoke/mastodon/docker-compose.yml logs --tail=500 + + - name: Teardown + if: always() + run: docker compose -f test/smoke/mastodon/docker-compose.yml down -v diff --git a/.gitignore b/.gitignore index 16c02ffd9..006d3b532 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ dist-tests/ node_modules/ package-lock.json repomix-output.xml +test/smoke/.env.test +test/smoke/mastodon/mastodon.env +smoke.log t.ts t2.ts plan.md diff --git a/deno.json b/deno.json index 3b8d799d0..ad8936b6f 100644 --- a/deno.json +++ b/deno.json @@ -30,7 +30,8 @@ "./examples/astro", "./examples/fresh", "./examples/hono-sample", - "./examples/rfc-9421-test" + "./examples/rfc-9421-test", + "./test/smoke/harness" ], "imports": { "@cloudflare/workers-types": "npm:@cloudflare/workers-types@^4.20250529.0", diff --git a/deno.lock b/deno.lock index 290f02ac0..1f8cf415a 100644 --- a/deno.lock +++ b/deno.lock @@ -7,25 +7,25 @@ "jsr:@david/path@0.2": "0.2.0", "jsr:@david/which@~0.4.1": "0.4.1", "jsr:@deno/esbuild-plugin@^1.2.0": "1.2.1", - "jsr:@deno/loader@~0.3.10": "0.3.14", - "jsr:@deno/loader@~0.3.2": "0.3.14", + "jsr:@deno/loader@~0.3.10": "0.3.12", + "jsr:@deno/loader@~0.3.2": "0.3.12", "jsr:@fresh/build-id@1": "1.0.1", "jsr:@fresh/core@2": "2.2.0", "jsr:@fresh/core@^2.1.4": "2.2.0", "jsr:@fresh/core@^2.2.0": "2.2.0", "jsr:@fresh/plugin-vite@^1.0.7": "1.0.8", "jsr:@hongminhee/localtunnel@0.3": "0.3.0", - "jsr:@hono/hono@^4.7.1": "4.12.0", - "jsr:@hono/hono@^4.8.3": "4.12.0", + "jsr:@hono/hono@^4.7.1": "4.11.4", + "jsr:@hono/hono@^4.8.3": "4.11.4", "jsr:@logtape/file@^2.0.5": "2.0.5", - "jsr:@logtape/logtape@^1.0.4": "1.3.7", + "jsr:@logtape/logtape@^1.0.4": "1.3.6", "jsr:@logtape/logtape@^2.0.5": "2.0.5", "jsr:@optique/config@~0.10.7": "0.10.7", "jsr:@optique/core@~0.10.7": "0.10.7", "jsr:@optique/run@~0.10.7": "0.10.7", "jsr:@std/assert@0.224": "0.224.0", "jsr:@std/assert@0.226": "0.226.0", - "jsr:@std/assert@^1.0.13": "1.0.19", + "jsr:@std/assert@^1.0.13": "1.0.18", "jsr:@std/async@0.224": "0.224.2", "jsr:@std/async@^1.0.13": "1.0.16", "jsr:@std/bytes@^1.0.6": "1.0.6", @@ -46,7 +46,7 @@ "jsr:@std/internal@1": "1.0.12", "jsr:@std/internal@^1.0.12": "1.0.12", "jsr:@std/io@0.225": "0.225.3", - "jsr:@std/json@^1.0.2": "1.0.3", + "jsr:@std/json@^1.0.2": "1.0.2", "jsr:@std/jsonc@^1.0.2": "1.0.2", "jsr:@std/media-types@^1.1.0": "1.1.0", "jsr:@std/path@0.224": "0.224.0", @@ -59,97 +59,94 @@ "jsr:@std/path@^1.1.4": "1.1.4", "jsr:@std/semver@^1.0.6": "1.0.8", "jsr:@std/testing@0.224": "0.224.0", - "jsr:@std/testing@0.224.0": "0.224.0", "jsr:@std/url@~0.225.1": "0.225.1", "jsr:@std/uuid@^1.0.9": "1.1.0", "jsr:@std/yaml@^1.0.8": "1.0.10", "jsr:@valibot/valibot@^1.2.0": "1.2.0", "npm:@alinea/suite@~0.6.3": "0.6.3", - "npm:@astrojs/node@^9.5.4": "9.5.4_astro@5.17.3__@types+node@24.10.12_@types+node@24.10.12", + "npm:@astrojs/node@^9.5.4": "9.5.5_astro@5.18.1__@types+node@24.12.0__rollup@4.59.0_@types+node@24.12.0_rollup@4.59.0", "npm:@babel/core@^7.28.0": "7.29.0", "npm:@babel/preset-react@^7.27.1": "7.28.5_@babel+core@7.29.0", "npm:@cfworker/json-schema@^4.1.1": "4.1.1", - "npm:@cloudflare/vitest-pool-workers@~0.8.31": "0.8.71_vitest@3.2.4__@types+node@24.10.12_@types+node@24.10.12", - "npm:@cloudflare/workers-types@^4.20250529.0": "4.20260210.0", - "npm:@cloudflare/workers-types@^4.20250906.0": "4.20260210.0", - "npm:@deno/astro-adapter@~0.3.2": "0.3.2_@opentelemetry+api@1.9.0_astro@5.17.3__@types+node@24.10.12_@types+node@24.10.12", - "npm:@fxts/core@^1.21.1": "1.25.0", + "npm:@cloudflare/vitest-pool-workers@~0.8.31": "0.8.71_vitest@3.2.4__@types+node@24.12.0_@types+node@24.12.0", + "npm:@cloudflare/workers-types@^4.20250529.0": "4.20260317.1", + "npm:@cloudflare/workers-types@^4.20250906.0": "4.20260317.1", + "npm:@deno/astro-adapter@~0.3.2": "0.3.2_@opentelemetry+api@1.9.0_astro@5.18.1__@types+node@24.12.0__rollup@4.59.0_@types+node@24.12.0_rollup@4.59.0", + "npm:@fxts/core@^1.21.1": "1.26.0", "npm:@hongminhee/localtunnel@0.3": "0.3.0", - "npm:@inquirer/prompts@^7.8.4": "7.10.1_@types+node@24.10.12", + "npm:@inquirer/prompts@^7.8.4": "7.10.1_@types+node@24.12.0", "npm:@jimp/core@^1.6.0": "1.6.0", "npm:@jimp/wasm-webp@^1.6.0": "1.6.0", "npm:@js-temporal/polyfill@~0.5.1": "0.5.1", "npm:@jsr/std__assert@0.226": "0.226.0", "npm:@mjackson/node-fetch-server@0.7": "0.7.0", "npm:@multiformats/base-x@^4.0.1": "4.0.1", - "npm:@nestjs/common@^11.0.1": "11.1.13_reflect-metadata@0.2.2_rxjs@7.8.2", + "npm:@nestjs/common@^11.0.1": "11.1.17_reflect-metadata@0.2.2_rxjs@7.8.2", "npm:@opentelemetry/api@^1.9.0": "1.9.0", - "npm:@opentelemetry/context-async-hooks@^2.5.0": "2.5.0_@opentelemetry+api@1.9.0", - "npm:@opentelemetry/core@^2.5.0": "2.5.0_@opentelemetry+api@1.9.0", - "npm:@opentelemetry/sdk-trace-base@^2.5.0": "2.5.0_@opentelemetry+api@1.9.0", - "npm:@opentelemetry/semantic-conventions@^1.39.0": "1.39.0", + "npm:@opentelemetry/context-async-hooks@^2.5.0": "2.6.0_@opentelemetry+api@1.9.0", + "npm:@opentelemetry/core@^2.5.0": "2.6.0_@opentelemetry+api@1.9.0", + "npm:@opentelemetry/sdk-trace-base@^2.5.0": "2.6.0_@opentelemetry+api@1.9.0", + "npm:@opentelemetry/semantic-conventions@^1.39.0": "1.40.0", "npm:@poppanator/http-constants@^1.1.1": "1.1.1", - "npm:@preact/signals@^2.2.1": "2.8.1_preact@10.28.4", - "npm:@preact/signals@^2.3.2": "2.8.1_preact@10.28.4", - "npm:@prefresh/vite@^2.4.8": "2.4.12_preact@10.28.4_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2", + "npm:@preact/signals@^2.2.1": "2.8.2_preact@10.29.0", + "npm:@preact/signals@^2.3.2": "2.8.2_preact@10.29.0", + "npm:@prefresh/vite@^2.4.8": "2.4.11_preact@10.29.0_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0", "npm:@standard-schema/spec@^1.1.0": "1.1.0", - "npm:@sveltejs/kit@2": "2.50.2_@opentelemetry+api@1.9.0_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12", + "npm:@sveltejs/kit@2": "2.55.0_@opentelemetry+api@1.9.0_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0", "npm:@types/amqplib@*": "0.10.8", "npm:@types/amqplib@~0.10.7": "0.10.8", "npm:@types/eslint@9": "9.6.1", "npm:@types/estree@^1.0.8": "1.0.8", - "npm:@types/node@^22.16.0": "22.19.10", - "npm:@types/node@^24.2.1": "24.10.12", - "npm:@typescript-eslint/parser@^8.49.0": "8.55.0_eslint@9.39.2_typescript@5.9.3", - "npm:@typescript-eslint/utils@8": "8.55.0_eslint@9.39.2_typescript@5.9.3", + "npm:@types/node@^22.16.0": "22.19.15", + "npm:@types/node@^24.2.1": "24.12.0", + "npm:@typescript-eslint/parser@^8.49.0": "8.57.1_eslint@9.39.4_typescript@5.9.3", + "npm:@typescript-eslint/utils@8": "8.57.1_eslint@9.39.4_typescript@5.9.3", "npm:amqplib@~0.10.9": "0.10.9", "npm:asn1js@^3.0.6": "3.0.7", "npm:asn1js@^3.0.7": "3.0.7", - "npm:astro@*": "5.17.3_@types+node@24.10.12", - "npm:astro@^5.17.3": "5.17.3_@types+node@24.10.12", + "npm:astro@^5.17.3": "5.18.1_@types+node@24.12.0_rollup@4.59.0", "npm:byte-encodings@^1.0.11": "1.0.11", "npm:chalk@^5.6.2": "5.6.2", "npm:cli-highlight@^2.1.11": "2.1.11", "npm:cli-table3@~0.6.5": "0.6.5", "npm:enquirer@^2.4.1": "2.4.1", - "npm:es-toolkit@^1.30.0": "1.44.0", - "npm:es-toolkit@^1.31.0": "1.44.0", - "npm:es-toolkit@^1.39.10": "1.44.0", - "npm:es-toolkit@^1.42.0": "1.44.0", - "npm:es-toolkit@^1.43.0": "1.44.0", + "npm:es-toolkit@^1.30.0": "1.43.0", + "npm:es-toolkit@^1.31.0": "1.43.0", + "npm:es-toolkit@^1.39.10": "1.43.0", + "npm:es-toolkit@^1.42.0": "1.43.0", + "npm:es-toolkit@^1.43.0": "1.43.0", "npm:esbuild-wasm@~0.25.11": "0.25.12", "npm:esbuild@0.25.7": "0.25.7", "npm:esbuild@~0.25.5": "0.25.12", - "npm:eslint@9": "9.39.2", + "npm:eslint@9": "9.39.4", "npm:express@4": "4.22.1", "npm:fast-check@^3.22.0": "3.23.2", "npm:fastify-plugin@^5.0.1": "5.1.0", - "npm:fastify@^5.2.0": "5.7.4", + "npm:fastify@^5.2.0": "5.8.2", "npm:fetch-mock@^12.5.2": "12.6.0", "npm:fetch-mock@^12.5.4": "12.6.0", - "npm:h3@^1.15.0": "1.15.5", + "npm:h3@^1.15.0": "1.15.6", "npm:hono@^4.8.3": "4.11.3", - "npm:html-to-text@^9.0.5": "9.0.5", "npm:icojs@~0.19.5": "0.19.5", "npm:inquirer-toggle@^1.0.1": "1.0.1", - "npm:inquirer@^12.9.4": "12.11.1_@types+node@24.10.12", - "npm:ioredis@^5.8.2": "5.9.2", + "npm:inquirer@^12.9.4": "12.11.1_@types+node@24.12.0", + "npm:ioredis@^5.8.2": "5.10.0", "npm:jimp@^1.6.0": "1.6.0", "npm:json-canon@^1.0.1": "1.0.1", "npm:json-preserve-indent@^1.1.3": "1.1.3", "npm:jsonld@9": "9.0.0", - "npm:koa@2": "2.16.3", + "npm:koa@2": "2.16.4", "npm:miniflare@^4.20250523.0": "4.20250906.0", - "npm:mysql2@^3.18.0": "3.18.2_@types+node@24.10.12", + "npm:mysql2@^3.18.0": "3.20.0_@types+node@24.12.0", "npm:ora@^8.2.0": "8.2.0", "npm:pkijs@^3.2.5": "3.3.3", "npm:pkijs@^3.3.3": "3.3.3", "npm:postgres@^3.4.7": "3.4.8", - "npm:preact-render-to-string@^6.6.3": "6.6.6_preact@10.28.4", + "npm:preact-render-to-string@^6.6.3": "6.6.5_preact@10.29.0", "npm:preact@10.19.6": "10.19.6", - "npm:preact@^10.27.0": "10.28.4", - "npm:preact@^10.27.2": "10.28.4", - "npm:rollup@^4.50.0": "4.57.1", + "npm:preact@^10.27.0": "10.29.0", + "npm:preact@^10.27.2": "10.29.0", + "npm:rollup@^4.50.0": "4.59.0", "npm:shiki@^1.6.4": "1.29.2", "npm:smol-toml@^1.6.0": "1.6.0", "npm:srvx@~0.8.7": "0.8.16", @@ -159,11 +156,11 @@ "npm:uri-template-router@1": "1.0.0", "npm:url-template@^3.1.1": "3.1.1", "npm:valibot@^1.2.0": "1.2.0", - "npm:vite@^7.1.3": "7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2", - "npm:vite@^7.1.4": "7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2", - "npm:vitest@3.2": "3.2.4_@types+node@24.10.12", - "npm:wrangler@^4.17.0": "4.35.0_@cloudflare+workers-types@4.20260210.0_unenv@2.0.0-rc.21_workerd@1.20250906.0", - "npm:wrangler@^4.21.1": "4.35.0_@cloudflare+workers-types@4.20260210.0_unenv@2.0.0-rc.21_workerd@1.20250906.0", + "npm:vite@^7.1.3": "7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2", + "npm:vite@^7.1.4": "7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2", + "npm:vitest@3.2": "3.2.4_@types+node@24.12.0", + "npm:wrangler@^4.17.0": "4.35.0_@cloudflare+workers-types@4.20260317.1_unenv@2.0.0-rc.21_workerd@1.20250906.0", + "npm:wrangler@^4.21.1": "4.35.0_@cloudflare+workers-types@4.20260317.1_unenv@2.0.0-rc.21_workerd@1.20250906.0", "npm:yaml@^2.8.1": "2.8.2" }, "jsr": { @@ -203,8 +200,8 @@ "npm:esbuild@~0.25.5" ] }, - "@deno/loader@0.3.14": { - "integrity": "97bc63a6cc2d27a60bcdc953f588c5213331d866d44212eebb24cebfb9b011ca" + "@deno/loader@0.3.12": { + "integrity": "52d3b3be0a32192efe07b0a4f1b3047077d2f2bba0f693e32f47421507f9fdb6" }, "@fresh/build-id@1.0.1": { "integrity": "12a2ec25fd52ae9ec68c26848a5696cd1c9b537f7c983c7e56e4fb1e7e816c20", @@ -265,15 +262,6 @@ "@hono/hono@4.11.4": { "integrity": "aaf7b9d5a6b2422b0778c091b712ee1f018bc7e82138067d21eb27d7c2e1f5be" }, - "@hono/hono@4.11.9": { - "integrity": "c82c6b846abc3c1879d921d8365287d77cdef8073019f509ff80bf53033bdcba" - }, - "@hono/hono@4.11.10": { - "integrity": "a5a6dac87ab5a8bcf3f92aeaca22417128d584c2732860c20bbf6fdb3cafbcc5" - }, - "@hono/hono@4.12.0": { - "integrity": "a09c74c4a15539f159ea386b5804fd88d984805aa74e4d847a136ba42487412b" - }, "@logtape/file@2.0.5": { "integrity": "368621b15b73fd63c137e47ae43411e350627683ce7e0b4492af3ccb159e098b", "dependencies": [ @@ -287,9 +275,6 @@ "@logtape/logtape@1.3.6": { "integrity": "d9a038ed8f85981d7c1cd43d931402ef52bc036cfd14bc9be5bdfc7ec8136b6f" }, - "@logtape/logtape@1.3.7": { - "integrity": "d9dc1f8c7e2e1e4e3998006ea84eaf4054e40ad39325b056b3f517c013286bed" - }, "@logtape/logtape@2.0.5": { "integrity": "604d2121ed4ffb7aad35b47e729e2298d0cd7a7ddf1cb4171d27a61fa7d840a5" }, @@ -300,9 +285,6 @@ "npm:@standard-schema/spec" ] }, - "@optique/core@0.10.0-dev.333+076fceae": { - "integrity": "1ebe1782740f08d568ae0c5258786933a8502d1e137feb49b2d8ab06d204b11a" - }, "@optique/core@0.10.7": { "integrity": "7669bbf1840c356526634d205c8803fa286147d2b112c67aa1057a9e60f1da3d" }, @@ -325,8 +307,8 @@ "jsr:@std/internal@1" ] }, - "@std/assert@1.0.19": { - "integrity": "eaada96ee120cb980bc47e040f82814d786fe8162ecc53c91d8df60b8755991e", + "@std/assert@1.0.18": { + "integrity": "270245e9c2c13b446286de475131dc688ca9abcd94fc5db41d43a219b34d1c78", "dependencies": [ "jsr:@std/internal@^1.0.12" ] @@ -337,9 +319,6 @@ "@std/async@1.0.16": { "integrity": "6c9e43035313b67b5de43e2b3ee3eadb39a488a0a0a3143097f112e025d3ee9a" }, - "@std/async@1.1.1": { - "integrity": "8a79beb3378cc229ce65ba2c746cfd03e4855ddd891d1eb6b9e32128e0d5339c" - }, "@std/bytes@1.0.6": { "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" }, @@ -395,8 +374,8 @@ "jsr:@std/bytes" ] }, - "@std/json@1.0.3": { - "integrity": "97d5710996293a027b7aa5f0d1f4fa29f246f269e6b5597e08807613f37d426c" + "@std/json@1.0.2": { + "integrity": "d9e5497801c15fb679f55a2c01c7794ad7a5dfda4dd1bebab5e409cb5e0d34d4" }, "@std/jsonc@1.0.2": { "integrity": "909605dae3af22bd75b1cbda8d64a32cf1fd2cf6efa3f9e224aba6d22c0f44c7", @@ -456,11 +435,11 @@ "@astrojs/compiler@2.13.1": { "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==" }, - "@astrojs/internal-helpers@0.7.5": { - "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==" + "@astrojs/internal-helpers@0.7.6": { + "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==" }, - "@astrojs/markdown-remark@6.3.10": { - "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", + "@astrojs/markdown-remark@6.3.11": { + "integrity": "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ==", "dependencies": [ "@astrojs/internal-helpers", "@astrojs/prism", @@ -476,7 +455,7 @@ "remark-parse", "remark-rehype", "remark-smartypants", - "shiki@3.22.0", + "shiki@3.23.0", "smol-toml", "unified", "unist-util-remove-position", @@ -485,8 +464,8 @@ "vfile" ] }, - "@astrojs/node@9.5.4_astro@5.17.3__@types+node@24.10.12_@types+node@24.10.12": { - "integrity": "sha512-AbPSZsMGu8hXPR2XxV79RaKy8h6wijhtoqZGeUf4OXg2w1mxXlx4VnIc1D+QvtsgauSz7P5PLhmvf6w/J41GJg==", + "@astrojs/node@9.5.5_astro@5.18.1__@types+node@24.12.0__rollup@4.59.0_@types+node@24.12.0_rollup@4.59.0": { + "integrity": "sha512-rtU2BGU5u3SfGURpANfMxVzCIoR86MkaN05ncza9rbtuMKJ/XnRJt/BbyVknDbOJ71hoci0SIsJwKcJR8vvi/A==", "dependencies": [ "@astrojs/internal-helpers", "astro", @@ -607,8 +586,8 @@ "@babel/types" ] }, - "@babel/parser@7.29.0": { - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "@babel/parser@7.29.2": { + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dependencies": [ "@babel/types" ], @@ -693,8 +672,8 @@ "@babel/helper-validator-identifier" ] }, - "@borewit/text-codec@0.2.1": { - "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==" + "@borewit/text-codec@0.2.2": { + "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==" }, "@canvas/image-data@1.1.0": { "integrity": "sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==" @@ -724,7 +703,7 @@ "workerd" ] }, - "@cloudflare/vitest-pool-workers@0.8.71_vitest@3.2.4__@types+node@24.10.12_@types+node@24.10.12": { + "@cloudflare/vitest-pool-workers@0.8.71_vitest@3.2.4__@types+node@24.12.0_@types+node@24.12.0": { "integrity": "sha512-keu2HCLQfRNwbmLBCDXJgCFpANTaYnQpE01fBOo4CNwiWHUT7SZGN7w64RKiSWRHyYppStXBuE5Ng7F42+flpg==", "dependencies": [ "@vitest/runner", @@ -764,8 +743,8 @@ "os": ["win32"], "cpu": ["x64"] }, - "@cloudflare/workers-types@4.20260210.0": { - "integrity": "sha512-zHaF0RZVYUQwNCJCECnNAJdMur72Lk3FMiD6wU78Dx3Bv7DQRcuXNmPNuJmsGnosVZCcWintHlPTQ/4BEiDG5w==" + "@cloudflare/workers-types@4.20260317.1": { + "integrity": "sha512-+G4eVwyCpm8Au1ex8vQBCuA9wnwqetz4tPNRoB/53qvktERWBRMQnrtvC1k584yRE3emMThtuY0gWshvSJ++PQ==" }, "@colors/colors@1.5.0": { "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" @@ -776,7 +755,7 @@ "@jridgewell/trace-mapping@0.3.9" ] }, - "@deno/astro-adapter@0.3.2_@opentelemetry+api@1.9.0_astro@5.17.3__@types+node@24.10.12_@types+node@24.10.12": { + "@deno/astro-adapter@0.3.2_@opentelemetry+api@1.9.0_astro@5.18.1__@types+node@24.12.0__rollup@4.59.0_@types+node@24.12.0_rollup@4.59.0": { "integrity": "sha512-nN0kQGobRs2XE3R+O/DWYQanEWpteJNsIf5TD65787qFEw2CrqkFNcNolZFJiKUF/2Y/TKyOLRjMS3F6auECVg==", "dependencies": [ "@opentelemetry/api", @@ -793,21 +772,21 @@ "undici@6.23.0" ] }, - "@emnapi/core@1.8.1": { - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "@emnapi/core@1.9.0": { + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", "dependencies": [ "@emnapi/wasi-threads", "tslib" ] }, - "@emnapi/runtime@1.8.1": { - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "@emnapi/runtime@1.9.0": { + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", "dependencies": [ "tslib" ] }, - "@emnapi/wasi-threads@1.1.0": { - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "@emnapi/wasi-threads@1.2.0": { + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "dependencies": [ "tslib" ] @@ -827,8 +806,8 @@ "os": ["aix"], "cpu": ["ppc64"] }, - "@esbuild/aix-ppc64@0.27.3": { - "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "@esbuild/aix-ppc64@0.27.4": { + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", "os": ["aix"], "cpu": ["ppc64"] }, @@ -847,8 +826,8 @@ "os": ["android"], "cpu": ["arm64"] }, - "@esbuild/android-arm64@0.27.3": { - "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "@esbuild/android-arm64@0.27.4": { + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", "os": ["android"], "cpu": ["arm64"] }, @@ -867,8 +846,8 @@ "os": ["android"], "cpu": ["arm"] }, - "@esbuild/android-arm@0.27.3": { - "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "@esbuild/android-arm@0.27.4": { + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", "os": ["android"], "cpu": ["arm"] }, @@ -887,8 +866,8 @@ "os": ["android"], "cpu": ["x64"] }, - "@esbuild/android-x64@0.27.3": { - "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "@esbuild/android-x64@0.27.4": { + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", "os": ["android"], "cpu": ["x64"] }, @@ -907,8 +886,8 @@ "os": ["darwin"], "cpu": ["arm64"] }, - "@esbuild/darwin-arm64@0.27.3": { - "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "@esbuild/darwin-arm64@0.27.4": { + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", "os": ["darwin"], "cpu": ["arm64"] }, @@ -927,8 +906,8 @@ "os": ["darwin"], "cpu": ["x64"] }, - "@esbuild/darwin-x64@0.27.3": { - "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "@esbuild/darwin-x64@0.27.4": { + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "os": ["darwin"], "cpu": ["x64"] }, @@ -947,8 +926,8 @@ "os": ["freebsd"], "cpu": ["arm64"] }, - "@esbuild/freebsd-arm64@0.27.3": { - "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "@esbuild/freebsd-arm64@0.27.4": { + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", "os": ["freebsd"], "cpu": ["arm64"] }, @@ -967,8 +946,8 @@ "os": ["freebsd"], "cpu": ["x64"] }, - "@esbuild/freebsd-x64@0.27.3": { - "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "@esbuild/freebsd-x64@0.27.4": { + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", "os": ["freebsd"], "cpu": ["x64"] }, @@ -987,8 +966,8 @@ "os": ["linux"], "cpu": ["arm64"] }, - "@esbuild/linux-arm64@0.27.3": { - "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "@esbuild/linux-arm64@0.27.4": { + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", "os": ["linux"], "cpu": ["arm64"] }, @@ -1007,8 +986,8 @@ "os": ["linux"], "cpu": ["arm"] }, - "@esbuild/linux-arm@0.27.3": { - "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "@esbuild/linux-arm@0.27.4": { + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", "os": ["linux"], "cpu": ["arm"] }, @@ -1027,8 +1006,8 @@ "os": ["linux"], "cpu": ["ia32"] }, - "@esbuild/linux-ia32@0.27.3": { - "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "@esbuild/linux-ia32@0.27.4": { + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", "os": ["linux"], "cpu": ["ia32"] }, @@ -1047,8 +1026,8 @@ "os": ["linux"], "cpu": ["loong64"] }, - "@esbuild/linux-loong64@0.27.3": { - "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "@esbuild/linux-loong64@0.27.4": { + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "os": ["linux"], "cpu": ["loong64"] }, @@ -1067,8 +1046,8 @@ "os": ["linux"], "cpu": ["mips64el"] }, - "@esbuild/linux-mips64el@0.27.3": { - "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "@esbuild/linux-mips64el@0.27.4": { + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "os": ["linux"], "cpu": ["mips64el"] }, @@ -1087,8 +1066,8 @@ "os": ["linux"], "cpu": ["ppc64"] }, - "@esbuild/linux-ppc64@0.27.3": { - "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "@esbuild/linux-ppc64@0.27.4": { + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "os": ["linux"], "cpu": ["ppc64"] }, @@ -1107,8 +1086,8 @@ "os": ["linux"], "cpu": ["riscv64"] }, - "@esbuild/linux-riscv64@0.27.3": { - "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "@esbuild/linux-riscv64@0.27.4": { + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "os": ["linux"], "cpu": ["riscv64"] }, @@ -1127,8 +1106,8 @@ "os": ["linux"], "cpu": ["s390x"] }, - "@esbuild/linux-s390x@0.27.3": { - "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "@esbuild/linux-s390x@0.27.4": { + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "os": ["linux"], "cpu": ["s390x"] }, @@ -1147,8 +1126,8 @@ "os": ["linux"], "cpu": ["x64"] }, - "@esbuild/linux-x64@0.27.3": { - "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "@esbuild/linux-x64@0.27.4": { + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", "os": ["linux"], "cpu": ["x64"] }, @@ -1167,8 +1146,8 @@ "os": ["netbsd"], "cpu": ["arm64"] }, - "@esbuild/netbsd-arm64@0.27.3": { - "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "@esbuild/netbsd-arm64@0.27.4": { + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "os": ["netbsd"], "cpu": ["arm64"] }, @@ -1187,8 +1166,8 @@ "os": ["netbsd"], "cpu": ["x64"] }, - "@esbuild/netbsd-x64@0.27.3": { - "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "@esbuild/netbsd-x64@0.27.4": { + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", "os": ["netbsd"], "cpu": ["x64"] }, @@ -1207,8 +1186,8 @@ "os": ["openbsd"], "cpu": ["arm64"] }, - "@esbuild/openbsd-arm64@0.27.3": { - "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "@esbuild/openbsd-arm64@0.27.4": { + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", "os": ["openbsd"], "cpu": ["arm64"] }, @@ -1227,8 +1206,8 @@ "os": ["openbsd"], "cpu": ["x64"] }, - "@esbuild/openbsd-x64@0.27.3": { - "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "@esbuild/openbsd-x64@0.27.4": { + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", "os": ["openbsd"], "cpu": ["x64"] }, @@ -1242,8 +1221,8 @@ "os": ["openharmony"], "cpu": ["arm64"] }, - "@esbuild/openharmony-arm64@0.27.3": { - "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "@esbuild/openharmony-arm64@0.27.4": { + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", "os": ["openharmony"], "cpu": ["arm64"] }, @@ -1262,8 +1241,8 @@ "os": ["sunos"], "cpu": ["x64"] }, - "@esbuild/sunos-x64@0.27.3": { - "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "@esbuild/sunos-x64@0.27.4": { + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", "os": ["sunos"], "cpu": ["x64"] }, @@ -1282,8 +1261,8 @@ "os": ["win32"], "cpu": ["arm64"] }, - "@esbuild/win32-arm64@0.27.3": { - "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "@esbuild/win32-arm64@0.27.4": { + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", "os": ["win32"], "cpu": ["arm64"] }, @@ -1302,8 +1281,8 @@ "os": ["win32"], "cpu": ["ia32"] }, - "@esbuild/win32-ia32@0.27.3": { - "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "@esbuild/win32-ia32@0.27.4": { + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", "os": ["win32"], "cpu": ["ia32"] }, @@ -1322,12 +1301,12 @@ "os": ["win32"], "cpu": ["x64"] }, - "@esbuild/win32-x64@0.27.3": { - "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "@esbuild/win32-x64@0.27.4": { + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", "os": ["win32"], "cpu": ["x64"] }, - "@eslint-community/eslint-utils@4.9.1_eslint@9.39.2": { + "@eslint-community/eslint-utils@4.9.1_eslint@9.39.4": { "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dependencies": [ "eslint", @@ -1337,12 +1316,12 @@ "@eslint-community/regexpp@4.12.2": { "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==" }, - "@eslint/config-array@0.21.1": { - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "@eslint/config-array@0.21.2": { + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dependencies": [ "@eslint/object-schema", "debug@4.4.3", - "minimatch@3.1.2" + "minimatch@3.1.5" ] }, "@eslint/config-helpers@0.4.2": { @@ -1357,22 +1336,22 @@ "@types/json-schema" ] }, - "@eslint/eslintrc@3.3.3": { - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "@eslint/eslintrc@3.3.5": { + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dependencies": [ - "ajv@6.12.6", + "ajv@6.14.0", "debug@4.4.3", "espree", "globals", "ignore", "import-fresh", "js-yaml", - "minimatch@3.1.2", + "minimatch@3.1.5", "strip-json-comments" ] }, - "@eslint/js@9.39.2": { - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==" + "@eslint/js@9.39.4": { + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==" }, "@eslint/object-schema@2.1.7": { "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==" @@ -1384,10 +1363,10 @@ "levn" ] }, - "@fastify/ajv-compiler@4.0.5_ajv@8.17.1": { + "@fastify/ajv-compiler@4.0.5_ajv@8.18.0": { "integrity": "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==", "dependencies": [ - "ajv@8.17.1", + "ajv@8.18.0", "ajv-formats", "fast-uri" ] @@ -1417,8 +1396,8 @@ "ipaddr.js@2.3.0" ] }, - "@fxts/core@1.25.0": { - "integrity": "sha512-olXPKT/LuNCVwKfVmE4G0lDFMndv+jl7k3mQkBv8ZbXqQvdQJq3nCi2wiUaZHms4eeCimWeZ5uLemW0thlnVUw==", + "@fxts/core@1.26.0": { + "integrity": "sha512-ONaza1CGr8dLKmJ0HQgi0h4XuyDJMr0P70M7o/My/YeeRxuYoSANHjE2nSY7xO4WHgxUD5ojd5dpxlFOzAEJsA==", "dependencies": [ "tslib" ] @@ -1445,8 +1424,8 @@ "@humanwhocodes/retry@0.4.3": { "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==" }, - "@img/colour@1.0.0": { - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==" + "@img/colour@1.1.0": { + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==" }, "@img/sharp-darwin-arm64@0.33.5": { "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", @@ -1724,38 +1703,38 @@ "@inquirer/ansi@1.0.2": { "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==" }, - "@inquirer/checkbox@4.3.2_@types+node@24.10.12": { + "@inquirer/checkbox@4.3.2_@types+node@24.12.0": { "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dependencies": [ "@inquirer/ansi", - "@inquirer/core@10.3.2_@types+node@24.10.12", + "@inquirer/core@10.3.2_@types+node@24.12.0", "@inquirer/figures", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/confirm@5.1.21_@types+node@24.10.12": { + "@inquirer/confirm@5.1.21_@types+node@24.12.0": { "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.10.12", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12" + "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/core@10.3.2_@types+node@24.10.12": { + "@inquirer/core@10.3.2_@types+node@24.12.0": { "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dependencies": [ "@inquirer/ansi", "@inquirer/figures", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0", "cli-width", "mute-stream@2.0.0", "signal-exit", @@ -1763,7 +1742,7 @@ "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, "@inquirer/core@8.2.4": { @@ -1772,7 +1751,7 @@ "@inquirer/figures", "@inquirer/type@1.5.5", "@types/mute-stream", - "@types/node@20.19.33", + "@types/node@20.19.37", "@types/wrap-ansi", "ansi-escapes", "cli-spinners", @@ -1784,79 +1763,79 @@ "wrap-ansi@6.2.0" ] }, - "@inquirer/editor@4.2.23_@types+node@24.10.12": { + "@inquirer/editor@4.2.23_@types+node@24.12.0": { "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.10.12", + "@inquirer/core@10.3.2_@types+node@24.12.0", "@inquirer/external-editor", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12" + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/expand@4.0.23_@types+node@24.10.12": { + "@inquirer/expand@4.0.23_@types+node@24.12.0": { "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.10.12", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12", + "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/external-editor@1.0.3_@types+node@24.10.12": { + "@inquirer/external-editor@1.0.3_@types+node@24.12.0": { "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dependencies": [ - "@types/node@24.10.12", + "@types/node@24.12.0", "chardet", "iconv-lite@0.7.2" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, "@inquirer/figures@1.0.15": { "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==" }, - "@inquirer/input@4.3.1_@types+node@24.10.12": { + "@inquirer/input@4.3.1_@types+node@24.12.0": { "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.10.12", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12" + "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/number@3.0.23_@types+node@24.10.12": { + "@inquirer/number@3.0.23_@types+node@24.12.0": { "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.10.12", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12" + "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/password@4.0.23_@types+node@24.10.12": { + "@inquirer/password@4.0.23_@types+node@24.12.0": { "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dependencies": [ "@inquirer/ansi", - "@inquirer/core@10.3.2_@types+node@24.10.12", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12" + "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/prompts@7.10.1_@types+node@24.10.12": { + "@inquirer/prompts@7.10.1_@types+node@24.12.0": { "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "dependencies": [ "@inquirer/checkbox", @@ -1869,49 +1848,49 @@ "@inquirer/rawlist", "@inquirer/search", "@inquirer/select", - "@types/node@24.10.12" + "@types/node@24.12.0" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/rawlist@4.1.11_@types+node@24.10.12": { + "@inquirer/rawlist@4.1.11_@types+node@24.12.0": { "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.10.12", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12", + "@inquirer/core@10.3.2_@types+node@24.12.0", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/search@3.2.2_@types+node@24.10.12": { + "@inquirer/search@3.2.2_@types+node@24.12.0": { "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dependencies": [ - "@inquirer/core@10.3.2_@types+node@24.10.12", + "@inquirer/core@10.3.2_@types+node@24.12.0", "@inquirer/figures", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@inquirer/select@4.4.2_@types+node@24.10.12": { + "@inquirer/select@4.4.2_@types+node@24.12.0": { "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dependencies": [ "@inquirer/ansi", - "@inquirer/core@10.3.2_@types+node@24.10.12", + "@inquirer/core@10.3.2_@types+node@24.12.0", "@inquirer/figures", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0", "yoctocolors-cjs" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, "@inquirer/type@1.5.5": { @@ -1920,17 +1899,17 @@ "mute-stream@1.0.0" ] }, - "@inquirer/type@3.0.10_@types+node@24.10.12": { + "@inquirer/type@3.0.10_@types+node@24.12.0": { "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dependencies": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "@ioredis/commands@1.5.0": { - "integrity": "sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow==" + "@ioredis/commands@1.5.1": { + "integrity": "sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==" }, "@jimp/bmp@0.22.12_@jimp+custom@0.22.12": { "integrity": "sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g==", @@ -2293,10 +2272,10 @@ "@tybys/wasm-util" ] }, - "@nestjs/common@11.1.13_reflect-metadata@0.2.2_rxjs@7.8.2": { - "integrity": "sha512-ieqWtipT+VlyDWLz5Rvz0f3E5rXcVAnaAi+D53DEHLjc1kmFxCgZ62qVfTX2vwkywwqNkTNXvBgGR72hYqV//Q==", + "@nestjs/common@11.1.17_reflect-metadata@0.2.2_rxjs@7.8.2": { + "integrity": "sha512-hLODw5Abp8OQgA+mUO4tHou4krKgDtUcM9j5Ihxncst9XeyxYBTt2bwZm4e4EQr5E352S4Fyy6V3iFx9ggxKAg==", "dependencies": [ - "file-type@21.3.0", + "file-type@21.3.2", "iterare", "load-esm", "reflect-metadata", @@ -2311,29 +2290,29 @@ "@opentelemetry/api@1.9.0": { "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==" }, - "@opentelemetry/context-async-hooks@2.5.0_@opentelemetry+api@1.9.0": { - "integrity": "sha512-uOXpVX0ZjO7heSVjhheW2XEPrhQAWr2BScDPoZ9UDycl5iuHG+Usyc3AIfG6kZeC1GyLpMInpQ6X5+9n69yOFw==", + "@opentelemetry/context-async-hooks@2.6.0_@opentelemetry+api@1.9.0": { + "integrity": "sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==", "dependencies": [ "@opentelemetry/api" ] }, - "@opentelemetry/core@2.5.0_@opentelemetry+api@1.9.0": { - "integrity": "sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==", + "@opentelemetry/core@2.6.0_@opentelemetry+api@1.9.0": { + "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "dependencies": [ "@opentelemetry/api", "@opentelemetry/semantic-conventions" ] }, - "@opentelemetry/resources@2.5.0_@opentelemetry+api@1.9.0": { - "integrity": "sha512-F8W52ApePshpoSrfsSk1H2yJn9aKjCrbpQF1M9Qii0GHzbfVeFUB+rc3X4aggyZD8x9Gu3Slua+s6krmq6Dt8g==", + "@opentelemetry/resources@2.6.0_@opentelemetry+api@1.9.0": { + "integrity": "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==", "dependencies": [ "@opentelemetry/api", "@opentelemetry/core", "@opentelemetry/semantic-conventions" ] }, - "@opentelemetry/sdk-trace-base@2.5.0_@opentelemetry+api@1.9.0": { - "integrity": "sha512-VzRf8LzotASEyNDUxTdaJ9IRJ1/h692WyArDBInf5puLCjxbICD6XkHgpuudis56EndyS7LYFmtTMny6UABNdQ==", + "@opentelemetry/sdk-trace-base@2.6.0_@opentelemetry+api@1.9.0": { + "integrity": "sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==", "dependencies": [ "@opentelemetry/api", "@opentelemetry/core", @@ -2341,8 +2320,8 @@ "@opentelemetry/semantic-conventions" ] }, - "@opentelemetry/semantic-conventions@1.39.0": { - "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==" + "@opentelemetry/semantic-conventions@1.40.0": { + "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==" }, "@oslojs/encoding@1.1.0": { "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==" @@ -2350,8 +2329,8 @@ "@oxc-project/types@0.103.0": { "integrity": "sha512-bkiYX5kaXWwUessFRSoXFkGIQTmc6dLGdxuRTrC+h8PSnIdZyuXHHlLAeTmOue5Br/a0/a7dHH0Gca6eXn9MKg==" }, - "@oxc-project/types@0.112.0": { - "integrity": "sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==" + "@oxc-project/types@0.115.0": { + "integrity": "sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==" }, "@pinojs/redact@0.4.0": { "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==" @@ -2379,38 +2358,38 @@ "@poppinss/exception@1.2.3": { "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==" }, - "@preact/signals-core@1.13.0": { - "integrity": "sha512-slT6XeTCAbdql61GVLlGU4x7XHI7kCZV5Um5uhE4zLX4ApgiiXc0UYFvVOKq06xcovzp7p+61l68oPi563ARKg==" + "@preact/signals-core@1.14.0": { + "integrity": "sha512-AowtCcCU/33lFlh1zRFf/u+12rfrhtNakj7UpaGEsmMwUKpKWMVvcktOGcwBBNiB4lWrZWc01LhiyyzVklJyaQ==" }, - "@preact/signals@2.8.1_preact@10.28.4": { - "integrity": "sha512-wX6U0SpcCukZTJBs5ChljvBZb3XmYzA5gd4vKHgX8wZZKaQCo2WHtmThdLx+mcVvlBa5u3XShC7ffbETJD4BiQ==", + "@preact/signals@2.8.2_preact@10.29.0": { + "integrity": "sha512-gym5yoa64c+0w2kL7zRAAjY548qzWXbbuOfjsK9F1nWrEqooDwyWnih5SNdonjhQSp27zUqYh7UrxIRnkCyFCA==", "dependencies": [ "@preact/signals-core", - "preact@10.28.4" + "preact@10.29.0" ] }, - "@prefresh/babel-plugin@0.5.3": { - "integrity": "sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==" + "@prefresh/babel-plugin@0.5.2": { + "integrity": "sha512-AOl4HG6dAxWkJ5ndPHBgBa49oo/9bOiJuRDKHLSTyH+Fd9x00shTXpdiTj1W41l6oQIwUOAgJeHMn4QwIDpHkA==" }, - "@prefresh/core@1.5.9_preact@10.28.4": { + "@prefresh/core@1.5.9_preact@10.29.0": { "integrity": "sha512-IKBKCPaz34OFVC+adiQ2qaTF5qdztO2/4ZPf4KsRTgjKosWqxVXmEbxCiUydYZRY8GVie+DQlKzQr9gt6HQ+EQ==", "dependencies": [ - "preact@10.28.4" + "preact@10.29.0" ] }, "@prefresh/utils@1.2.1": { "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==" }, - "@prefresh/vite@2.4.12_preact@10.28.4_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2": { - "integrity": "sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==", + "@prefresh/vite@2.4.11_preact@10.29.0_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0": { + "integrity": "sha512-/XjURQqdRiCG3NpMmWqE9kJwrg9IchIOWHzulCfqg2sRe/8oQ1g5De7xrk9lbqPIQLn7ntBkKdqWXIj4E9YXyg==", "dependencies": [ "@babel/core", "@prefresh/babel-plugin", "@prefresh/core", "@prefresh/utils", "@rollup/pluginutils@4.2.1", - "preact@10.28.4", - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2" + "preact@10.29.0", + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2" ] }, "@quansync/fs@1.0.0": { @@ -2424,8 +2403,8 @@ "os": ["android"], "cpu": ["arm64"] }, - "@rolldown/binding-android-arm64@1.0.0-rc.3": { - "integrity": "sha512-0T1k9FinuBZ/t7rZ8jN6OpUKPnUjNdYHoj/cESWrQ3ZraAJ4OMm6z7QjSfCxqj8mOp9kTKc1zHK3kGz5vMu+nQ==", + "@rolldown/binding-android-arm64@1.0.0-rc.9": { + "integrity": "sha512-lcJL0bN5hpgJfSIz/8PIf02irmyL43P+j1pTCfbD1DbLkmGRuFIA4DD3B3ZOvGqG0XiVvRznbKtN0COQVaKUTg==", "os": ["android"], "cpu": ["arm64"] }, @@ -2434,8 +2413,8 @@ "os": ["darwin"], "cpu": ["arm64"] }, - "@rolldown/binding-darwin-arm64@1.0.0-rc.3": { - "integrity": "sha512-JWWLzvcmc/3pe7qdJqPpuPk91SoE/N+f3PcWx/6ZwuyDVyungAEJPvKm/eEldiDdwTmaEzWfIR+HORxYWrCi1A==", + "@rolldown/binding-darwin-arm64@1.0.0-rc.9": { + "integrity": "sha512-J7Zk3kLYFsLtuH6U+F4pS2sYVzac0qkjcO5QxHS7OS7yZu2LRs+IXo+uvJ/mvpyUljDJ3LROZPoQfgBIpCMhdQ==", "os": ["darwin"], "cpu": ["arm64"] }, @@ -2444,8 +2423,8 @@ "os": ["darwin"], "cpu": ["x64"] }, - "@rolldown/binding-darwin-x64@1.0.0-rc.3": { - "integrity": "sha512-MTakBxfx3tde5WSmbHxuqlDsIW0EzQym+PJYGF4P6lG2NmKzi128OGynoFUqoD5ryCySEY85dug4v+LWGBElIw==", + "@rolldown/binding-darwin-x64@1.0.0-rc.9": { + "integrity": "sha512-iwtmmghy8nhfRGeNAIltcNXzD0QMNaaA5U/NyZc1Ia4bxrzFByNMDoppoC+hl7cDiUq5/1CnFthpT9n+UtfFyg==", "os": ["darwin"], "cpu": ["x64"] }, @@ -2454,8 +2433,8 @@ "os": ["freebsd"], "cpu": ["x64"] }, - "@rolldown/binding-freebsd-x64@1.0.0-rc.3": { - "integrity": "sha512-jje3oopyOLs7IwfvXoS6Lxnmie5JJO7vW29fdGFu5YGY1EDbVDhD+P9vDihqS5X6fFiqL3ZQZCMBg6jyHkSVww==", + "@rolldown/binding-freebsd-x64@1.0.0-rc.9": { + "integrity": "sha512-DLFYI78SCiZr5VvdEplsVC2Vx53lnA4/Ga5C65iyldMVaErr86aiqCoNBLl92PXPfDtUYjUh+xFFor40ueNs4Q==", "os": ["freebsd"], "cpu": ["x64"] }, @@ -2464,8 +2443,8 @@ "os": ["linux"], "cpu": ["arm"] }, - "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3": { - "integrity": "sha512-A0n8P3hdLAaqzSFrQoA42p23ZKBYQOw+8EH5r15Sa9X1kD9/JXe0YT2gph2QTWvdr0CVK2BOXiK6ENfy6DXOag==", + "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9": { + "integrity": "sha512-CsjTmTwd0Hri6iTw/DRMK7kOZ7FwAkrO4h8YWKoX/kcj833e4coqo2wzIFywtch/8Eb5enQ/lwLM7w6JX1W5RQ==", "os": ["linux"], "cpu": ["arm"] }, @@ -2474,8 +2453,8 @@ "os": ["linux"], "cpu": ["arm64"] }, - "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3": { - "integrity": "sha512-kWXkoxxarYISBJ4bLNf5vFkEbb4JvccOwxWDxuK9yee8lg5XA7OpvlTptfRuwEvYcOZf+7VS69Uenpmpyo5Bjw==", + "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9": { + "integrity": "sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==", "os": ["linux"], "cpu": ["arm64"] }, @@ -2484,18 +2463,28 @@ "os": ["linux"], "cpu": ["arm64"] }, - "@rolldown/binding-linux-arm64-musl@1.0.0-rc.3": { - "integrity": "sha512-Z03/wrqau9Bicfgb3Dbs6SYTHliELk2PM2LpG2nFd+cGupTMF5kanLEcj2vuuJLLhptNyS61rtk7SOZ+lPsTUA==", + "@rolldown/binding-linux-arm64-musl@1.0.0-rc.9": { + "integrity": "sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==", "os": ["linux"], "cpu": ["arm64"] }, + "@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9": { + "integrity": "sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==", + "os": ["linux"], + "cpu": ["ppc64"] + }, + "@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9": { + "integrity": "sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==", + "os": ["linux"], + "cpu": ["s390x"] + }, "@rolldown/binding-linux-x64-gnu@1.0.0-beta.57": { "integrity": "sha512-E199LPijo98yrLjPCmETx8EF43sZf9t3guSrLee/ej1rCCc3zDVTR4xFfN9BRAapGVl7/8hYqbbiQPTkv73kUg==", "os": ["linux"], "cpu": ["x64"] }, - "@rolldown/binding-linux-x64-gnu@1.0.0-rc.3": { - "integrity": "sha512-iSXXZsQp08CSilff/DCTFZHSVEpEwdicV3W8idHyrByrcsRDVh9sGC3sev6d8BygSGj3vt8GvUKBPCoyMA4tgQ==", + "@rolldown/binding-linux-x64-gnu@1.0.0-rc.9": { + "integrity": "sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==", "os": ["linux"], "cpu": ["x64"] }, @@ -2504,8 +2493,8 @@ "os": ["linux"], "cpu": ["x64"] }, - "@rolldown/binding-linux-x64-musl@1.0.0-rc.3": { - "integrity": "sha512-qaj+MFudtdCv9xZo9znFvkgoajLdc+vwf0Kz5N44g+LU5XMe+IsACgn3UG7uTRlCCvhMAGXm1XlpEA5bZBrOcw==", + "@rolldown/binding-linux-x64-musl@1.0.0-rc.9": { + "integrity": "sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==", "os": ["linux"], "cpu": ["x64"] }, @@ -2514,8 +2503,8 @@ "os": ["openharmony"], "cpu": ["arm64"] }, - "@rolldown/binding-openharmony-arm64@1.0.0-rc.3": { - "integrity": "sha512-U662UnMETyjT65gFmG9ma+XziENrs7BBnENi/27swZPYagubfHRirXHG2oMl+pEax2WvO7Kb9gHZmMakpYqBHQ==", + "@rolldown/binding-openharmony-arm64@1.0.0-rc.9": { + "integrity": "sha512-+6zoiF+RRyf5cdlFQP7nm58mq7+/2PFaY2DNQeD4B87N36JzfF/l9mdBkkmTvSYcYPE8tMh/o3cRlsx1ldLfog==", "os": ["openharmony"], "cpu": ["arm64"] }, @@ -2526,8 +2515,8 @@ ], "cpu": ["wasm32"] }, - "@rolldown/binding-wasm32-wasi@1.0.0-rc.3": { - "integrity": "sha512-gekrQ3Q2HiC1T5njGyuUJoGpK/l6B/TNXKed3fZXNf9YRTJn3L5MOZsFBn4bN2+UX+8+7hgdlTcEsexX988G4g==", + "@rolldown/binding-wasm32-wasi@1.0.0-rc.9": { + "integrity": "sha512-rgFN6sA/dyebil3YTlL2evvi/M+ivhfnyxec7AccTpRPccno/rPoNlqybEZQBkcbZu8Hy+eqNJCqfBR8P7Pg8g==", "dependencies": [ "@napi-rs/wasm-runtime" ], @@ -2538,8 +2527,8 @@ "os": ["win32"], "cpu": ["arm64"] }, - "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3": { - "integrity": "sha512-85y5JifyMgs8m5K2XzR/VDsapKbiFiohl7s5lEj7nmNGO0pkTXE7q6TQScei96BNAsoK7JC3pA7ukA8WRHVJpg==", + "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9": { + "integrity": "sha512-lHVNUG/8nlF1IQk1C0Ci574qKYyty2goMiPlRqkC5R+3LkXDkL5Dhx8ytbxq35m+pkHVIvIxviD+TWLdfeuadA==", "os": ["win32"], "cpu": ["arm64"] }, @@ -2548,16 +2537,16 @@ "os": ["win32"], "cpu": ["x64"] }, - "@rolldown/binding-win32-x64-msvc@1.0.0-rc.3": { - "integrity": "sha512-a4VUQZH7LxGbUJ3qJ/TzQG8HxdHvf+jOnqf7B7oFx1TEBm+j2KNL2zr5SQ7wHkNAcaPevF6gf9tQnVBnC4mD+A==", + "@rolldown/binding-win32-x64-msvc@1.0.0-rc.9": { + "integrity": "sha512-G0oA4+w1iY5AGi5HcDTxWsoxF509hrFIPB2rduV5aDqS9FtDg1CAfa7V34qImbjfhIcA8C+RekocJZA96EarwQ==", "os": ["win32"], "cpu": ["x64"] }, "@rolldown/pluginutils@1.0.0-beta.57": { "integrity": "sha512-aQNelgx14tGA+n2tNSa9x6/jeoCL9fkDeCei7nOKnHx0fEFRRMu5ReiITo+zZD5TzWDGGRjbSYCs93IfRIyTuQ==" }, - "@rolldown/pluginutils@1.0.0-rc.3": { - "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==" + "@rolldown/pluginutils@1.0.0-rc.9": { + "integrity": "sha512-w6oiRWgEBl04QkFZgmW+jnU1EC9b57Oihi2ot3HNWIQRqgHp5PnYDia5iZ5FF7rpa4EQdiqMDXjlqKGXBhsoXw==" }, "@rollup/pluginutils@4.2.1": { "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", @@ -2566,7 +2555,7 @@ "picomatch@2.3.1" ] }, - "@rollup/pluginutils@5.3.0_rollup@4.57.1": { + "@rollup/pluginutils@5.3.0_rollup@4.59.0": { "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dependencies": [ "@types/estree", @@ -2578,141 +2567,134 @@ "rollup" ] }, - "@rollup/rollup-android-arm-eabi@4.57.1": { - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "@rollup/rollup-android-arm-eabi@4.59.0": { + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "os": ["android"], "cpu": ["arm"] }, - "@rollup/rollup-android-arm64@4.57.1": { - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "@rollup/rollup-android-arm64@4.59.0": { + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "os": ["android"], "cpu": ["arm64"] }, - "@rollup/rollup-darwin-arm64@4.57.1": { - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "@rollup/rollup-darwin-arm64@4.59.0": { + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "os": ["darwin"], "cpu": ["arm64"] }, - "@rollup/rollup-darwin-x64@4.57.1": { - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "@rollup/rollup-darwin-x64@4.59.0": { + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "os": ["darwin"], "cpu": ["x64"] }, - "@rollup/rollup-freebsd-arm64@4.57.1": { - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "@rollup/rollup-freebsd-arm64@4.59.0": { + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "os": ["freebsd"], "cpu": ["arm64"] }, - "@rollup/rollup-freebsd-x64@4.57.1": { - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "@rollup/rollup-freebsd-x64@4.59.0": { + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "os": ["freebsd"], "cpu": ["x64"] }, - "@rollup/rollup-linux-arm-gnueabihf@4.57.1": { - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "@rollup/rollup-linux-arm-gnueabihf@4.59.0": { + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "os": ["linux"], "cpu": ["arm"] }, - "@rollup/rollup-linux-arm-musleabihf@4.57.1": { - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "@rollup/rollup-linux-arm-musleabihf@4.59.0": { + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "os": ["linux"], "cpu": ["arm"] }, - "@rollup/rollup-linux-arm64-gnu@4.57.1": { - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "@rollup/rollup-linux-arm64-gnu@4.59.0": { + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "os": ["linux"], "cpu": ["arm64"] }, - "@rollup/rollup-linux-arm64-musl@4.57.1": { - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "@rollup/rollup-linux-arm64-musl@4.59.0": { + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "os": ["linux"], "cpu": ["arm64"] }, - "@rollup/rollup-linux-loong64-gnu@4.57.1": { - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "@rollup/rollup-linux-loong64-gnu@4.59.0": { + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "os": ["linux"], "cpu": ["loong64"] }, - "@rollup/rollup-linux-loong64-musl@4.57.1": { - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "@rollup/rollup-linux-loong64-musl@4.59.0": { + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "os": ["linux"], "cpu": ["loong64"] }, - "@rollup/rollup-linux-ppc64-gnu@4.57.1": { - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "@rollup/rollup-linux-ppc64-gnu@4.59.0": { + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "os": ["linux"], "cpu": ["ppc64"] }, - "@rollup/rollup-linux-ppc64-musl@4.57.1": { - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "@rollup/rollup-linux-ppc64-musl@4.59.0": { + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "os": ["linux"], "cpu": ["ppc64"] }, - "@rollup/rollup-linux-riscv64-gnu@4.57.1": { - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "@rollup/rollup-linux-riscv64-gnu@4.59.0": { + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "os": ["linux"], "cpu": ["riscv64"] }, - "@rollup/rollup-linux-riscv64-musl@4.57.1": { - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "@rollup/rollup-linux-riscv64-musl@4.59.0": { + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "os": ["linux"], "cpu": ["riscv64"] }, - "@rollup/rollup-linux-s390x-gnu@4.57.1": { - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "@rollup/rollup-linux-s390x-gnu@4.59.0": { + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "os": ["linux"], "cpu": ["s390x"] }, - "@rollup/rollup-linux-x64-gnu@4.57.1": { - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "@rollup/rollup-linux-x64-gnu@4.59.0": { + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "os": ["linux"], "cpu": ["x64"] }, - "@rollup/rollup-linux-x64-musl@4.57.1": { - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "@rollup/rollup-linux-x64-musl@4.59.0": { + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "os": ["linux"], "cpu": ["x64"] }, - "@rollup/rollup-openbsd-x64@4.57.1": { - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "@rollup/rollup-openbsd-x64@4.59.0": { + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "os": ["openbsd"], "cpu": ["x64"] }, - "@rollup/rollup-openharmony-arm64@4.57.1": { - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "@rollup/rollup-openharmony-arm64@4.59.0": { + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "os": ["openharmony"], "cpu": ["arm64"] }, - "@rollup/rollup-win32-arm64-msvc@4.57.1": { - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "@rollup/rollup-win32-arm64-msvc@4.59.0": { + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "os": ["win32"], "cpu": ["arm64"] }, - "@rollup/rollup-win32-ia32-msvc@4.57.1": { - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "@rollup/rollup-win32-ia32-msvc@4.59.0": { + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "os": ["win32"], "cpu": ["ia32"] }, - "@rollup/rollup-win32-x64-gnu@4.57.1": { - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "@rollup/rollup-win32-x64-gnu@4.59.0": { + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "os": ["win32"], "cpu": ["x64"] }, - "@rollup/rollup-win32-x64-msvc@4.57.1": { - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "@rollup/rollup-win32-x64-msvc@4.59.0": { + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "os": ["win32"], "cpu": ["x64"] }, "@sec-ant/readable-stream@0.4.1": { "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==" }, - "@selderee/plugin-htmlparser2@0.11.0": { - "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", - "dependencies": [ - "domhandler", - "selderee" - ] - }, "@shikijs/core@1.29.2": { "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", "dependencies": [ @@ -2724,10 +2706,10 @@ "hast-util-to-html" ] }, - "@shikijs/core@3.22.0": { - "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", + "@shikijs/core@3.23.0": { + "integrity": "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==", "dependencies": [ - "@shikijs/types@3.22.0", + "@shikijs/types@3.23.0", "@shikijs/vscode-textmate", "@types/hast", "hast-util-to-html" @@ -2741,12 +2723,12 @@ "oniguruma-to-es@2.3.0" ] }, - "@shikijs/engine-javascript@3.22.0": { - "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", + "@shikijs/engine-javascript@3.23.0": { + "integrity": "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==", "dependencies": [ - "@shikijs/types@3.22.0", + "@shikijs/types@3.23.0", "@shikijs/vscode-textmate", - "oniguruma-to-es@4.3.4" + "oniguruma-to-es@4.3.5" ] }, "@shikijs/engine-oniguruma@1.29.2": { @@ -2756,10 +2738,10 @@ "@shikijs/vscode-textmate" ] }, - "@shikijs/engine-oniguruma@3.22.0": { - "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "@shikijs/engine-oniguruma@3.23.0": { + "integrity": "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==", "dependencies": [ - "@shikijs/types@3.22.0", + "@shikijs/types@3.23.0", "@shikijs/vscode-textmate" ] }, @@ -2769,10 +2751,10 @@ "@shikijs/types@1.29.2" ] }, - "@shikijs/langs@3.22.0": { - "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "@shikijs/langs@3.23.0": { + "integrity": "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==", "dependencies": [ - "@shikijs/types@3.22.0" + "@shikijs/types@3.23.0" ] }, "@shikijs/themes@1.29.2": { @@ -2781,10 +2763,10 @@ "@shikijs/types@1.29.2" ] }, - "@shikijs/themes@3.22.0": { - "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "@shikijs/themes@3.23.0": { + "integrity": "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==", "dependencies": [ - "@shikijs/types@3.22.0" + "@shikijs/types@3.23.0" ] }, "@shikijs/types@1.29.2": { @@ -2794,8 +2776,8 @@ "@types/hast" ] }, - "@shikijs/types@3.22.0": { - "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "@shikijs/types@3.23.0": { + "integrity": "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==", "dependencies": [ "@shikijs/vscode-textmate", "@types/hast" @@ -2813,57 +2795,46 @@ "@standard-schema/spec@1.1.0": { "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==" }, - "@sveltejs/acorn-typescript@1.0.8_acorn@8.15.0": { - "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", + "@sveltejs/acorn-typescript@1.0.9_acorn@8.16.0": { + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", "dependencies": [ - "acorn@8.15.0" + "acorn@8.16.0" ] }, - "@sveltejs/kit@2.50.2_@opentelemetry+api@1.9.0_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12": { - "integrity": "sha512-875hTUkEbz+MyJIxWbQjfMaekqdmEKUUfR7JyKcpfMRZqcGyrO9Gd+iS1D/Dx8LpE5FEtutWGOtlAh4ReSAiOA==", + "@sveltejs/kit@2.55.0_@opentelemetry+api@1.9.0_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0": { + "integrity": "sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA==", "dependencies": [ "@opentelemetry/api", "@standard-schema/spec", "@sveltejs/acorn-typescript", "@sveltejs/vite-plugin-svelte", "@types/cookie", - "acorn@8.15.0", + "acorn@8.16.0", "cookie@0.6.0", "devalue", "esm-env", "kleur@4.1.5", "magic-string", "mrmime", - "sade", "set-cookie-parser@3.0.1", "sirv", "svelte", - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2" + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2" ], "optionalPeers": [ "@opentelemetry/api" ], "bin": true }, - "@sveltejs/vite-plugin-svelte-inspector@5.0.2_@sveltejs+vite-plugin-svelte@6.2.4__svelte@5.50.1___acorn@8.15.0__vite@7.3.1___@types+node@24.10.12___tsx@4.21.0___yaml@2.8.2__@types+node@24.10.12_svelte@5.50.1__acorn@8.15.0_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12": { - "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", - "dependencies": [ - "@sveltejs/vite-plugin-svelte", - "obug", - "svelte", - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2" - ] - }, - "@sveltejs/vite-plugin-svelte@6.2.4_svelte@5.50.1__acorn@8.15.0_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12": { - "integrity": "sha512-ou/d51QSdTyN26D7h6dSpusAKaZkAiGM55/AKYi+9AGZw7q85hElbjK3kEyzXHhLSnRISHOYzVge6x0jRZ7DXA==", + "@sveltejs/vite-plugin-svelte@7.0.0_svelte@5.53.12__acorn@8.16.0_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0": { + "integrity": "sha512-ILXmxC7HAsnkK2eslgPetrqqW1BKSL7LktsFgqzNj83MaivMGZzluWq32m25j2mDOjmSKX7GGWahePhuEs7P/g==", "dependencies": [ - "@sveltejs/vite-plugin-svelte-inspector", "deepmerge", "magic-string", "obug", "svelte", - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2", - "vitefu@1.1.1_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12" + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2", + "vitefu@1.1.2_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0" ] }, "@tokenizer/inflate@0.4.1": { @@ -2885,7 +2856,7 @@ "@types/amqplib@0.10.8": { "integrity": "sha512-vtDp8Pk1wsE/AuQ8/Rgtm6KUZYqcnTgNvEHwzCkX8rL7AGsC6zqAfKAAJhUZXFhM/Pp++tbnUHiam/8vVpPztA==", "dependencies": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, "@types/chai@5.2.3": { @@ -2941,7 +2912,7 @@ "@types/mute-stream@0.0.4": { "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", "dependencies": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, "@types/nlcst@2.0.3": { @@ -2953,32 +2924,35 @@ "@types/node@16.9.1": { "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" }, - "@types/node@20.19.33": { - "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "@types/node@20.19.37": { + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", "dependencies": [ "undici-types@6.21.0" ] }, - "@types/node@22.19.10": { - "integrity": "sha512-tF5VOugLS/EuDlTBijk0MqABfP8UxgYazTLo3uIn3b4yJgg26QRbVYJYsDtHrjdDUIRfP70+VfhTTc+CE1yskw==", + "@types/node@22.19.15": { + "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "dependencies": [ "undici-types@6.21.0" ] }, - "@types/node@24.10.12": { - "integrity": "sha512-68e+T28EbdmLSTkPgs3+UacC6rzmqrcWFPQs1C8mwJhI/r5Uxr0yEuQotczNRROd1gq30NGxee+fo0rSIxpyAw==", + "@types/node@24.12.0": { + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", "dependencies": [ "undici-types@7.16.0" ] }, + "@types/trusted-types@2.0.7": { + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, "@types/unist@3.0.3": { "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, "@types/wrap-ansi@3.0.0": { "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" }, - "@typescript-eslint/parser@8.55.0_eslint@9.39.2_typescript@5.9.3": { - "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", + "@typescript-eslint/parser@8.57.1_eslint@9.39.4_typescript@5.9.3": { + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", "dependencies": [ "@typescript-eslint/scope-manager", "@typescript-eslint/types", @@ -2989,8 +2963,8 @@ "typescript" ] }, - "@typescript-eslint/project-service@8.55.0_typescript@5.9.3": { - "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==", + "@typescript-eslint/project-service@8.57.1_typescript@5.9.3": { + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", "dependencies": [ "@typescript-eslint/tsconfig-utils", "@typescript-eslint/types", @@ -2998,39 +2972,39 @@ "typescript" ] }, - "@typescript-eslint/scope-manager@8.55.0": { - "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==", + "@typescript-eslint/scope-manager@8.57.1": { + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", "dependencies": [ "@typescript-eslint/types", "@typescript-eslint/visitor-keys" ] }, - "@typescript-eslint/tsconfig-utils@8.55.0_typescript@5.9.3": { - "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==", + "@typescript-eslint/tsconfig-utils@8.57.1_typescript@5.9.3": { + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", "dependencies": [ "typescript" ] }, - "@typescript-eslint/types@8.55.0": { - "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==" + "@typescript-eslint/types@8.57.1": { + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==" }, - "@typescript-eslint/typescript-estree@8.55.0_typescript@5.9.3": { - "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==", + "@typescript-eslint/typescript-estree@8.57.1_typescript@5.9.3": { + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", "dependencies": [ "@typescript-eslint/project-service", "@typescript-eslint/tsconfig-utils", "@typescript-eslint/types", "@typescript-eslint/visitor-keys", "debug@4.4.3", - "minimatch@9.0.5", + "minimatch@10.2.4", "semver@7.7.4", "tinyglobby", "ts-api-utils", "typescript" ] }, - "@typescript-eslint/utils@8.55.0_eslint@9.39.2_typescript@5.9.3": { - "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==", + "@typescript-eslint/utils@8.57.1_eslint@9.39.4_typescript@5.9.3": { + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", "dependencies": [ "@eslint-community/eslint-utils", "@typescript-eslint/scope-manager", @@ -3040,11 +3014,11 @@ "typescript" ] }, - "@typescript-eslint/visitor-keys@8.55.0": { - "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==", + "@typescript-eslint/visitor-keys@8.57.1": { + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", "dependencies": [ "@typescript-eslint/types", - "eslint-visitor-keys@4.2.1" + "eslint-visitor-keys@5.0.1" ] }, "@ungap/structured-clone@1.3.0": { @@ -3060,16 +3034,16 @@ "tinyrainbow" ] }, - "@vitest/mocker@3.2.4_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12": { + "@vitest/mocker@3.2.4_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0": { "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dependencies": [ "@vitest/spy", "estree-walker@3.0.3", "magic-string", - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2" + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2" ], "optionalPeers": [ - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2" + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2" ] }, "@vitest/pretty-format@3.2.4": { @@ -3124,10 +3098,10 @@ "negotiator" ] }, - "acorn-jsx@5.3.2_acorn@8.15.0": { + "acorn-jsx@5.3.2_acorn@8.16.0": { "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dependencies": [ - "acorn@8.15.0" + "acorn@8.16.0" ] }, "acorn-walk@8.3.2": { @@ -3137,21 +3111,21 @@ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": true }, - "acorn@8.15.0": { - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "acorn@8.16.0": { + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "bin": true }, - "ajv-formats@3.0.1_ajv@8.17.1": { + "ajv-formats@3.0.1_ajv@8.18.0": { "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dependencies": [ - "ajv@8.17.1" + "ajv@8.18.0" ], "optionalPeers": [ - "ajv@8.17.1" + "ajv@8.18.0" ] }, - "ajv@6.12.6": { - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "ajv@6.14.0": { + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dependencies": [ "fast-deep-equal", "fast-json-stable-stringify", @@ -3159,8 +3133,8 @@ "uri-js" ] }, - "ajv@8.17.1": { - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "ajv@8.18.0": { + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dependencies": [ "fast-deep-equal", "fast-uri", @@ -3224,6 +3198,9 @@ "argparse@2.0.1": { "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "aria-query@5.3.1": { + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==" + }, "aria-query@5.3.2": { "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" }, @@ -3251,8 +3228,8 @@ "pathe" ] }, - "astro@5.17.3_@types+node@24.10.12": { - "integrity": "sha512-69dcfPe8LsHzklwj+hl+vunWUbpMB6pmg35mACjetxbJeUNNys90JaBM8ZiwsPK689SAj/4Zqb1ayaANls9/MA==", + "astro@5.18.1_@types+node@24.12.0_rollup@4.59.0": { + "integrity": "sha512-m4VWilWZ+Xt6NPoYzC4CgGZim/zQUO7WFL0RHCH0AiEavF1153iC3+me2atDvXpf/yX4PyGUeD8wZLq1cirT3g==", "dependencies": [ "@astrojs/compiler", "@astrojs/internal-helpers", @@ -3260,9 +3237,9 @@ "@astrojs/telemetry", "@capsizecss/unpack", "@oslojs/encoding", - "@rollup/pluginutils@5.3.0_rollup@4.57.1", - "acorn@8.15.0", - "aria-query", + "@rollup/pluginutils@5.3.0_rollup@4.59.0", + "acorn@8.16.0", + "aria-query@5.3.2", "axobject-query", "boxen", "ci-info", @@ -3277,7 +3254,7 @@ "dlv", "dset", "es-module-lexer", - "esbuild@0.27.3", + "esbuild@0.27.4", "estree-walker@3.0.3", "flattie", "fontace", @@ -3298,10 +3275,10 @@ "prompts", "rehype", "semver@7.7.4", - "shiki@3.22.0", + "shiki@3.23.0", "smol-toml", "svgo", - "tinyexec@1.0.2", + "tinyexec@1.0.4", "tinyglobby", "tsconfck", "ultrahtml", @@ -3309,8 +3286,8 @@ "unist-util-visit", "unstorage", "vfile", - "vite@6.4.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2", - "vitefu@1.1.1_vite@6.4.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12", + "vite@6.4.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2", + "vitefu@1.1.2_vite@6.4.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0", "xxhash-wasm", "yargs-parser@21.1.1", "yocto-spinner", @@ -3326,8 +3303,8 @@ "atomic-sleep@1.0.0": { "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" }, - "avvio@9.1.0": { - "integrity": "sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==", + "avvio@9.2.0": { + "integrity": "sha512-2t/sy01ArdHHE0vRH5Hsay+RtCZt3dLPji7W7/MMOCEgze5b7SNDC4j5H6FnVgPkI1MTNFGzHdHrVXDDl7QSSQ==", "dependencies": [ "@fastify/error", "fastq" @@ -3348,14 +3325,17 @@ "balanced-match@1.0.2": { "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "balanced-match@4.0.4": { + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==" + }, "base-64@1.0.0": { "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==" }, "base64-js@1.5.1": { "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, - "baseline-browser-mapping@2.10.0": { - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "baseline-browser-mapping@2.9.19": { + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", "bin": true }, "birpc@0.2.14": { @@ -3409,14 +3389,14 @@ "brace-expansion@1.1.12": { "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dependencies": [ - "balanced-match", + "balanced-match@1.0.2", "concat-map" ] }, - "brace-expansion@2.0.2": { - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "brace-expansion@5.0.4": { + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "dependencies": [ - "balanced-match" + "balanced-match@4.0.4" ] }, "browserslist@4.28.1": { @@ -3486,8 +3466,8 @@ "camelcase@8.0.0": { "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==" }, - "caniuse-lite@1.0.30001776": { - "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==" + "caniuse-lite@1.0.30001769": { + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==" }, "canonicalize@2.1.0": { "integrity": "sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==", @@ -3696,10 +3676,10 @@ "source-map-js" ] }, - "css-tree@3.1.0": { - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "css-tree@3.2.1": { + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dependencies": [ - "mdn-data@2.12.2", + "mdn-data@2.27.1", "source-map-js" ] }, @@ -3794,8 +3774,8 @@ "base-64" ] }, - "devalue@5.6.2": { - "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==" + "devalue@5.6.4": { + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==" }, "devlop@1.1.0": { "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", @@ -3851,8 +3831,8 @@ "ee-first@1.1.1": { "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, - "electron-to-chromium@1.5.307": { - "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==" + "electron-to-chromium@1.5.286": { + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==" }, "emoji-regex-xs@1.0.0": { "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" @@ -3903,8 +3883,8 @@ "es-errors" ] }, - "es-toolkit@1.44.0": { - "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==" + "es-toolkit@1.43.0": { + "integrity": "sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==" }, "esbuild-wasm@0.25.12": { "integrity": "sha512-rZqkjL3Y6FwLpSHzLnaEy8Ps6veCNo1kZa9EOfJvmWtBq5dJH4iVjfmOO6Mlkv9B0tt9WFPFmb/VxlgJOnueNg==", @@ -4008,35 +3988,35 @@ "scripts": true, "bin": true }, - "esbuild@0.27.3": { - "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "esbuild@0.27.4": { + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", "optionalDependencies": [ - "@esbuild/aix-ppc64@0.27.3", - "@esbuild/android-arm@0.27.3", - "@esbuild/android-arm64@0.27.3", - "@esbuild/android-x64@0.27.3", - "@esbuild/darwin-arm64@0.27.3", - "@esbuild/darwin-x64@0.27.3", - "@esbuild/freebsd-arm64@0.27.3", - "@esbuild/freebsd-x64@0.27.3", - "@esbuild/linux-arm@0.27.3", - "@esbuild/linux-arm64@0.27.3", - "@esbuild/linux-ia32@0.27.3", - "@esbuild/linux-loong64@0.27.3", - "@esbuild/linux-mips64el@0.27.3", - "@esbuild/linux-ppc64@0.27.3", - "@esbuild/linux-riscv64@0.27.3", - "@esbuild/linux-s390x@0.27.3", - "@esbuild/linux-x64@0.27.3", - "@esbuild/netbsd-arm64@0.27.3", - "@esbuild/netbsd-x64@0.27.3", - "@esbuild/openbsd-arm64@0.27.3", - "@esbuild/openbsd-x64@0.27.3", - "@esbuild/openharmony-arm64@0.27.3", - "@esbuild/sunos-x64@0.27.3", - "@esbuild/win32-arm64@0.27.3", - "@esbuild/win32-ia32@0.27.3", - "@esbuild/win32-x64@0.27.3" + "@esbuild/aix-ppc64@0.27.4", + "@esbuild/android-arm@0.27.4", + "@esbuild/android-arm64@0.27.4", + "@esbuild/android-x64@0.27.4", + "@esbuild/darwin-arm64@0.27.4", + "@esbuild/darwin-x64@0.27.4", + "@esbuild/freebsd-arm64@0.27.4", + "@esbuild/freebsd-x64@0.27.4", + "@esbuild/linux-arm@0.27.4", + "@esbuild/linux-arm64@0.27.4", + "@esbuild/linux-ia32@0.27.4", + "@esbuild/linux-loong64@0.27.4", + "@esbuild/linux-mips64el@0.27.4", + "@esbuild/linux-ppc64@0.27.4", + "@esbuild/linux-riscv64@0.27.4", + "@esbuild/linux-s390x@0.27.4", + "@esbuild/linux-x64@0.27.4", + "@esbuild/netbsd-arm64@0.27.4", + "@esbuild/netbsd-x64@0.27.4", + "@esbuild/openbsd-arm64@0.27.4", + "@esbuild/openbsd-x64@0.27.4", + "@esbuild/openharmony-arm64@0.27.4", + "@esbuild/sunos-x64@0.27.4", + "@esbuild/win32-arm64@0.27.4", + "@esbuild/win32-ia32@0.27.4", + "@esbuild/win32-x64@0.27.4" ], "scripts": true, "bin": true @@ -4066,8 +4046,11 @@ "eslint-visitor-keys@4.2.1": { "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==" }, - "eslint@9.39.2": { - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "eslint-visitor-keys@5.0.1": { + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==" + }, + "eslint@9.39.4": { + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dependencies": [ "@eslint-community/eslint-utils", "@eslint-community/regexpp", @@ -4081,7 +4064,7 @@ "@humanwhocodes/module-importer", "@humanwhocodes/retry", "@types/estree", - "ajv@6.12.6", + "ajv@6.14.0", "chalk@4.1.2", "cross-spawn", "debug@4.4.3", @@ -4100,7 +4083,7 @@ "is-glob", "json-stable-stringify-without-jsonify", "lodash.merge", - "minimatch@3.1.2", + "minimatch@3.1.5", "natural-compare", "optionator" ], @@ -4109,10 +4092,10 @@ "esm-env@1.2.2": { "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" }, - "espree@10.4.0_acorn@8.15.0": { + "espree@10.4.0_acorn@8.16.0": { "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dependencies": [ - "acorn@8.15.0", + "acorn@8.16.0", "acorn-jsx", "eslint-visitor-keys@4.2.1" ] @@ -4123,10 +4106,11 @@ "estraverse" ] }, - "esrap@2.2.3": { - "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", + "esrap@2.2.4": { + "integrity": "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg==", "dependencies": [ - "@jridgewell/sourcemap-codec" + "@jridgewell/sourcemap-codec", + "@typescript-eslint/types" ] }, "esrecurse@4.3.0": { @@ -4228,11 +4212,11 @@ "fast-json-stable-stringify@2.1.0": { "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fast-json-stringify@6.3.0_ajv@8.17.1": { + "fast-json-stringify@6.3.0_ajv@8.18.0": { "integrity": "sha512-oRCntNDY/329HJPlmdNLIdogNtt6Vyjb1WuT01Soss3slIdyUp8kAcDU3saQTOquEK8KFVfwIIF7FebxUAu+yA==", "dependencies": [ "@fastify/merge-json-schemas", - "ajv@8.17.1", + "ajv@8.18.0", "ajv-formats", "fast-uri", "json-schema-ref-resolver", @@ -4254,8 +4238,8 @@ "fastify-plugin@5.1.0": { "integrity": "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw==" }, - "fastify@5.7.4": { - "integrity": "sha512-e6l5NsRdaEP8rdD8VR0ErJASeyaRbzXYpmkrpr2SuvuMq6Si3lvsaVy5C+7gLanEkvjpMDzBXWE5HPeb/hgTxA==", + "fastify@5.8.2": { + "integrity": "sha512-lZmt3navvZG915IE+f7/TIVamxIwmBd+OMB+O9WBzcpIwOo6F0LTh0sluoMFk5VkrKTvvrwIaoJPkir4Z+jtAg==", "dependencies": [ "@fastify/ajv-compiler", "@fastify/error", @@ -4321,8 +4305,8 @@ "uint8array-extras" ] }, - "file-type@21.3.0": { - "integrity": "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==", + "file-type@21.3.2": { + "integrity": "sha512-DLkUvGwep3poOV2wpzbHCOnSKGk1LzyXTv+aHFgN2VFl96wnp8YA9YjO2qPzg5PuL8q/SW9Pdi6WTkYOIh995w==", "dependencies": [ "@tokenizer/inflate", "strtok3@10.3.4", @@ -4342,8 +4326,8 @@ "unpipe" ] }, - "find-my-way@9.4.0": { - "integrity": "sha512-5Ye4vHsypZRYtS01ob/iwHzGRUDELlsoCftI/OZFhcLs1M0tkGPcXldE80TAZC5yYuJMBPJQQ43UHlqbJWiX2w==", + "find-my-way@9.5.0": { + "integrity": "sha512-VW2RfnmscZO5KgBY5XVyKREMW5nMZcxDy+buTOsL+zIPnBlbKm+00sgzoQzq1EVh4aALZLfKdwv6atBGcjvjrQ==", "dependencies": [ "fast-deep-equal", "fast-querystring", @@ -4364,8 +4348,8 @@ "keyv" ] }, - "flatted@3.3.3": { - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" + "flatted@3.4.1": { + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==" }, "flattie@1.1.1": { "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==" @@ -4376,8 +4360,8 @@ "fontkitten" ] }, - "fontkitten@1.0.2": { - "integrity": "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==", + "fontkitten@1.0.3": { + "integrity": "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==", "dependencies": [ "tiny-inflate" ] @@ -4414,8 +4398,8 @@ "get-caller-file@2.0.5": { "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, - "get-east-asian-width@1.4.0": { - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==" + "get-east-asian-width@1.5.0": { + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==" }, "get-intrinsic@1.3.0": { "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", @@ -4477,8 +4461,8 @@ "gopd@1.2.0": { "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, - "h3@1.15.5": { - "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", + "h3@1.15.6": { + "integrity": "sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ==", "dependencies": [ "cookie-es", "crossws", @@ -4622,34 +4606,15 @@ "hono@4.11.3": { "integrity": "sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==" }, - "hookable@6.0.1": { - "integrity": "sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==" + "hookable@6.1.0": { + "integrity": "sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==" }, "html-escaper@3.0.3": { "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" }, - "html-to-text@9.0.5": { - "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", - "dependencies": [ - "@selderee/plugin-htmlparser2", - "deepmerge", - "dom-serializer", - "htmlparser2", - "selderee" - ] - }, "html-void-elements@3.0.0": { "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==" }, - "htmlparser2@8.0.2": { - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dependencies": [ - "domelementtype", - "domhandler", - "domutils", - "entities@4.5.0" - ] - }, "http-assert@1.5.0": { "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "dependencies": [ @@ -4740,24 +4705,24 @@ "@inquirer/core@8.2.4" ] }, - "inquirer@12.11.1_@types+node@24.10.12": { + "inquirer@12.11.1_@types+node@24.12.0": { "integrity": "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw==", "dependencies": [ "@inquirer/ansi", - "@inquirer/core@10.3.2_@types+node@24.10.12", + "@inquirer/core@10.3.2_@types+node@24.12.0", "@inquirer/prompts", - "@inquirer/type@3.0.10_@types+node@24.10.12", - "@types/node@24.10.12", + "@inquirer/type@3.0.10_@types+node@24.12.0", + "@types/node@24.12.0", "mute-stream@2.0.0", "run-async", "rxjs" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ] }, - "ioredis@5.9.2": { - "integrity": "sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ==", + "ioredis@5.10.0": { + "integrity": "sha512-HVBe9OFuqs+Z6n64q09PQvP1/R4Bm+30PAyyD4wIEqssh3v9L21QjCVk4kRLucMBcDokJTcLjsGeVRlq/nH6DA==", "dependencies": [ "@ioredis/commands", "cluster-key-slot", @@ -4990,8 +4955,8 @@ "koa-compose" ] }, - "koa@2.16.3": { - "integrity": "sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==", + "koa@2.16.4": { + "integrity": "sha512-3An0GCLDSR34tsCO4H8Tef8Pp2ngtaZDAZnsWJYelqXUK5wyiHvGItgK/xcSkmHLSTn1Jcho1mRQs2ehRzvKKw==", "dependencies": [ "accepts", "cache-content-type", @@ -5021,9 +4986,6 @@ "ky@1.14.2": { "integrity": "sha512-q3RBbsO5A5zrPhB6CaCS8ZUv+NWCXv6JJT4Em0i264G9W0fdPB8YRfnnEi7Dm7X7omAkBIPojzYJ2D1oHTHqug==" }, - "leac@0.6.0": { - "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==" - }, "levn@0.4.1": { "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dependencies": [ @@ -5079,8 +5041,8 @@ "loupe@3.2.1": { "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==" }, - "lru-cache@11.2.6": { - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==" + "lru-cache@11.2.7": { + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==" }, "lru-cache@5.1.1": { "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", @@ -5254,8 +5216,8 @@ "mdn-data@2.0.28": { "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" }, - "mdn-data@2.12.2": { - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" + "mdn-data@2.27.1": { + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==" }, "media-typer@0.3.0": { "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" @@ -5554,21 +5516,18 @@ ], "bin": true }, - "minimatch@3.1.2": { - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "minimatch@10.2.4": { + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "dependencies": [ - "brace-expansion@1.1.12" + "brace-expansion@5.0.4" ] }, - "minimatch@9.0.5": { - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "minimatch@3.1.5": { + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dependencies": [ - "brace-expansion@2.0.2" + "brace-expansion@1.1.12" ] }, - "mri@1.2.0": { - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" - }, "mrmime@2.0.1": { "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==" }, @@ -5584,10 +5543,10 @@ "mute-stream@2.0.0": { "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==" }, - "mysql2@3.18.2_@types+node@24.10.12": { - "integrity": "sha512-UfEShBFAZZEAKjySnTUuE7BgqkYT4mx+RjoJ5aqtmwSSvNcJ/QxQPXz/y3jSxNiVRedPfgccmuBtiPCSiEEytw==", + "mysql2@3.20.0_@types+node@24.12.0": { + "integrity": "sha512-eCLUs7BNbgA6nf/MZXsaBO1SfGs0LtLVrJD3WeWq+jPLDWkSufTD+aGMwykfUVPdZnblaUK1a8G/P63cl9FkKg==", "dependencies": [ - "@types/node@24.10.12", + "@types/node@24.12.0", "aws-ssl-profiles", "denque", "generate-function", @@ -5704,8 +5663,8 @@ "regex-recursion@5.1.1" ] }, - "oniguruma-to-es@4.3.4": { - "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "oniguruma-to-es@4.3.5": { + "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==", "dependencies": [ "oniguruma-parser", "regex@6.1.0", @@ -5737,7 +5696,7 @@ "log-symbols", "stdin-discarder", "string-width@7.2.0", - "strip-ansi@7.1.2" + "strip-ansi@7.2.0" ] }, "p-limit@3.1.0": { @@ -5822,13 +5781,6 @@ "entities@6.0.1" ] }, - "parseley@0.12.1": { - "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", - "dependencies": [ - "leac", - "peberminta" - ] - }, "parseurl@1.3.3": { "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, @@ -5850,9 +5802,6 @@ "pathval@2.0.1": { "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==" }, - "peberminta@0.9.0": { - "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==" - }, "peek-readable@4.1.0": { "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" }, @@ -5931,8 +5880,8 @@ "pngjs@7.0.0": { "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==" }, - "postcss@8.5.6": { - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "postcss@8.5.8": { + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dependencies": [ "nanoid", "picocolors", @@ -5942,17 +5891,17 @@ "postgres@3.4.8": { "integrity": "sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==" }, - "preact-render-to-string@6.6.6_preact@10.28.4": { - "integrity": "sha512-EfqZJytnjJldV+YaaqhthU2oXsEf5e+6rDv957p+zxAvNfFLQOPfvBOTncscQ+akzu6Wrl7s3Pa0LjUQmWJsGQ==", + "preact-render-to-string@6.6.5_preact@10.29.0": { + "integrity": "sha512-O6MHzYNIKYaiSX3bOw0gGZfEbOmlIDtDfWwN1JJdc/T3ihzRT6tGGSEWE088dWrEDGa1u7101q+6fzQnO9XCPA==", "dependencies": [ - "preact@10.28.4" + "preact@10.29.0" ] }, "preact@10.19.6": { "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==" }, - "preact@10.28.4": { - "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==" + "preact@10.29.0": { + "integrity": "sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==" }, "prelude-ls@1.2.1": { "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" @@ -6001,8 +5950,8 @@ "pvutils@1.1.5": { "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==" }, - "qs@6.14.1": { - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "qs@6.14.2": { + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "dependencies": [ "side-channel" ] @@ -6286,31 +6235,33 @@ ], "bin": true }, - "rolldown@1.0.0-rc.3": { - "integrity": "sha512-Po/YZECDOqVXjIXrtC5h++a5NLvKAQNrd9ggrIG3sbDfGO5BqTUsrI6l8zdniKRp3r5Tp/2JTrXqx4GIguFCMw==", + "rolldown@1.0.0-rc.9": { + "integrity": "sha512-9EbgWge7ZH+yqb4d2EnELAntgPTWbfL8ajiTW+SyhJEC4qhBbkCKbqFV4Ge4zmu5ziQuVbWxb/XwLZ+RIO7E8Q==", "dependencies": [ - "@oxc-project/types@0.112.0", - "@rolldown/pluginutils@1.0.0-rc.3" + "@oxc-project/types@0.115.0", + "@rolldown/pluginutils@1.0.0-rc.9" ], "optionalDependencies": [ - "@rolldown/binding-android-arm64@1.0.0-rc.3", - "@rolldown/binding-darwin-arm64@1.0.0-rc.3", - "@rolldown/binding-darwin-x64@1.0.0-rc.3", - "@rolldown/binding-freebsd-x64@1.0.0-rc.3", - "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.3", - "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.3", - "@rolldown/binding-linux-arm64-musl@1.0.0-rc.3", - "@rolldown/binding-linux-x64-gnu@1.0.0-rc.3", - "@rolldown/binding-linux-x64-musl@1.0.0-rc.3", - "@rolldown/binding-openharmony-arm64@1.0.0-rc.3", - "@rolldown/binding-wasm32-wasi@1.0.0-rc.3", - "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.3", - "@rolldown/binding-win32-x64-msvc@1.0.0-rc.3" + "@rolldown/binding-android-arm64@1.0.0-rc.9", + "@rolldown/binding-darwin-arm64@1.0.0-rc.9", + "@rolldown/binding-darwin-x64@1.0.0-rc.9", + "@rolldown/binding-freebsd-x64@1.0.0-rc.9", + "@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.9", + "@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9", + "@rolldown/binding-linux-arm64-musl@1.0.0-rc.9", + "@rolldown/binding-linux-ppc64-gnu", + "@rolldown/binding-linux-s390x-gnu", + "@rolldown/binding-linux-x64-gnu@1.0.0-rc.9", + "@rolldown/binding-linux-x64-musl@1.0.0-rc.9", + "@rolldown/binding-openharmony-arm64@1.0.0-rc.9", + "@rolldown/binding-wasm32-wasi@1.0.0-rc.9", + "@rolldown/binding-win32-arm64-msvc@1.0.0-rc.9", + "@rolldown/binding-win32-x64-msvc@1.0.0-rc.9" ], "bin": true }, - "rollup@4.57.1": { - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "rollup@4.59.0": { + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dependencies": [ "@types/estree" ], @@ -6353,12 +6304,6 @@ "tslib" ] }, - "sade@1.8.1": { - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dependencies": [ - "mri" - ] - }, "safe-buffer@5.2.1": { "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, @@ -6370,11 +6315,12 @@ "is-regex" ] }, - "safe-regex2@5.0.0": { - "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==", + "safe-regex2@5.1.0": { + "integrity": "sha512-pNHAuBW7TrcleFHsxBr5QMi/Iyp0ENjUKz7GCcX1UO7cMh+NmVK6HxQckNL1tJp1XAJVjG6B8OKIPqodqj9rtw==", "dependencies": [ "ret" - ] + ], + "bin": true }, "safe-stable-stringify@2.5.0": { "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==" @@ -6382,18 +6328,12 @@ "safer-buffer@2.1.2": { "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sax@1.4.4": { - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==" + "sax@1.6.0": { + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==" }, "secure-json-parse@4.1.0": { "integrity": "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==" }, - "selderee@0.11.0": { - "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", - "dependencies": [ - "parseley" - ] - }, "semver@6.3.1": { "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": true @@ -6547,15 +6487,15 @@ "@types/hast" ] }, - "shiki@3.22.0": { - "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", + "shiki@3.23.0": { + "integrity": "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==", "dependencies": [ - "@shikijs/core@3.22.0", - "@shikijs/engine-javascript@3.22.0", - "@shikijs/engine-oniguruma@3.22.0", - "@shikijs/langs@3.22.0", - "@shikijs/themes@3.22.0", - "@shikijs/types@3.22.0", + "@shikijs/core@3.23.0", + "@shikijs/engine-javascript@3.23.0", + "@shikijs/engine-oniguruma@3.23.0", + "@shikijs/langs@3.23.0", + "@shikijs/themes@3.23.0", + "@shikijs/types@3.23.0", "@shikijs/vscode-textmate", "@types/hast" ] @@ -6625,8 +6565,8 @@ "smol-toml@1.6.0": { "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==" }, - "sonic-boom@4.2.0": { - "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "sonic-boom@4.2.1": { + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", "dependencies": [ "atomic-sleep" ] @@ -6681,7 +6621,7 @@ "dependencies": [ "emoji-regex@10.6.0", "get-east-asian-width", - "strip-ansi@7.1.2" + "strip-ansi@7.2.0" ] }, "string_decoder@1.3.0": { @@ -6703,8 +6643,8 @@ "ansi-regex@5.0.1" ] }, - "strip-ansi@7.1.2": { - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "strip-ansi@7.2.0": { + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dependencies": [ "ansi-regex@6.2.2" ] @@ -6750,15 +6690,16 @@ "has-flag" ] }, - "svelte@5.50.1_acorn@8.15.0": { - "integrity": "sha512-/Jlom4ddkISyVHXpM2O5dXP9pYnaiFrVQzPbIL1/pEoOa77ZunCb6nDgUCTNCQ/X3t64z9ukrK6R+BbB3kPR3A==", + "svelte@5.53.12_acorn@8.16.0": { + "integrity": "sha512-4x/uk4rQe/d7RhfvS8wemTfNjQ0bJbKvamIzRBfTe2eHHjzBZ7PZicUQrC2ryj83xxEacfA1zHKd1ephD1tAxA==", "dependencies": [ "@jridgewell/remapping", "@jridgewell/sourcemap-codec", "@sveltejs/acorn-typescript", "@types/estree", - "acorn@8.15.0", - "aria-query", + "@types/trusted-types", + "acorn@8.16.0", + "aria-query@5.3.1", "axobject-query", "clsx", "devalue", @@ -6770,12 +6711,12 @@ "zimmerframe" ] }, - "svgo@4.0.0": { - "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "svgo@4.0.1": { + "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "dependencies": [ "commander", "css-select", - "css-tree@3.1.0", + "css-tree@3.2.1", "css-what", "csso", "picocolors", @@ -6813,8 +6754,8 @@ "tinyexec@0.3.2": { "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" }, - "tinyexec@1.0.2": { - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==" + "tinyexec@1.0.4": { + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==" }, "tinyglobby@0.2.15_picomatch@4.0.3": { "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", @@ -6899,7 +6840,7 @@ "rolldown@1.0.0-beta.57", "rolldown-plugin-dts", "semver@7.7.4", - "tinyexec@1.0.2", + "tinyexec@1.0.4", "tinyglobby", "tree-kill", "unconfig-core", @@ -6916,7 +6857,7 @@ "tsx@4.21.0": { "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dependencies": [ - "esbuild@0.27.3", + "esbuild@0.27.4", "get-tsconfig" ], "optionalDependencies": [ @@ -6962,8 +6903,8 @@ "ultrahtml@1.6.0": { "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==" }, - "unconfig-core@7.4.2": { - "integrity": "sha512-VgPCvLWugINbXvMQDf8Jh0mlbvNjNC6eSUziHsBCMpxR05OPrNrvDnyatdMjRgcHaaNsCqz+wjNXxNw1kRLHUg==", + "unconfig-core@7.5.0": { + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", "dependencies": [ "@quansync/fs", "quansync" @@ -7009,7 +6950,7 @@ "unifont@0.7.4": { "integrity": "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==", "dependencies": [ - "css-tree@3.1.0", + "css-tree@3.2.1", "ofetch", "ohash" ] @@ -7077,14 +7018,14 @@ "unpipe@1.0.0": { "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, - "unrun@0.2.27": { - "integrity": "sha512-Mmur1UJpIbfxasLOhPRvox/QS4xBiDii71hMP7smfRthGcwFL2OAmYRgduLANOAU4LUkvVamuP+02U+c90jlrw==", + "unrun@0.2.32": { + "integrity": "sha512-opd3z6791rf281JdByf0RdRQrpcc7WyzqittqIXodM/5meNWdTwrVxeyzbaCp4/Rgls/um14oUaif1gomO8YGg==", "dependencies": [ - "rolldown@1.0.0-rc.3" + "rolldown@1.0.0-rc.9" ], "bin": true }, - "unstorage@1.17.4_ioredis@5.9.2": { + "unstorage@1.17.4_ioredis@5.10.0": { "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", "dependencies": [ "anymatch", @@ -7092,7 +7033,7 @@ "destr", "h3", "ioredis", - "lru-cache@11.2.6", + "lru-cache@11.2.7", "node-fetch-native", "ofetch", "ufo" @@ -7165,21 +7106,21 @@ "vfile-message" ] }, - "vite-node@3.2.4_@types+node@24.10.12": { + "vite-node@3.2.4_@types+node@24.12.0": { "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dependencies": [ "cac", "debug@4.4.3", "es-module-lexer", "pathe", - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2" + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2" ], "bin": true }, - "vite@6.4.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2": { + "vite@6.4.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2": { "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dependencies": [ - "@types/node@24.10.12", + "@types/node@24.12.0", "esbuild@0.25.12", "fdir", "picomatch@4.0.3", @@ -7193,17 +7134,17 @@ "fsevents" ], "optionalPeers": [ - "@types/node@24.10.12", + "@types/node@24.12.0", "tsx", "yaml" ], "bin": true }, - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2": { + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2": { "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dependencies": [ - "@types/node@24.10.12", - "esbuild@0.27.3", + "@types/node@24.12.0", + "esbuild@0.27.4", "fdir", "picomatch@4.0.3", "postcss", @@ -7216,29 +7157,29 @@ "fsevents" ], "optionalPeers": [ - "@types/node@24.10.12", + "@types/node@24.12.0", "tsx", "yaml" ], "bin": true }, - "vitefu@1.1.1_vite@6.4.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12": { - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==" + "vitefu@1.1.2_vite@6.4.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0": { + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==" }, - "vitefu@1.1.1_vite@7.3.1__@types+node@24.10.12__tsx@4.21.0__yaml@2.8.2_@types+node@24.10.12": { - "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "vitefu@1.1.2_vite@7.3.1__@types+node@24.12.0__tsx@4.21.0__yaml@2.8.2_@types+node@24.12.0": { + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", "dependencies": [ - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2" + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2" ], "optionalPeers": [ - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2" + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2" ] }, - "vitest@3.2.4_@types+node@24.10.12": { + "vitest@3.2.4_@types+node@24.12.0": { "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dependencies": [ "@types/chai", - "@types/node@24.10.12", + "@types/node@24.12.0", "@vitest/expect", "@vitest/mocker", "@vitest/pretty-format", @@ -7258,12 +7199,12 @@ "tinyglobby", "tinypool", "tinyrainbow", - "vite@7.3.1_@types+node@24.10.12_tsx@4.21.0_yaml@2.8.2", + "vite@7.3.1_@types+node@24.12.0_tsx@4.21.0_yaml@2.8.2", "vite-node", "why-is-node-running" ], "optionalPeers": [ - "@types/node@24.10.12" + "@types/node@24.12.0" ], "bin": true }, @@ -7325,7 +7266,7 @@ "scripts": true, "bin": true }, - "wrangler@4.35.0_@cloudflare+workers-types@4.20260210.0_unenv@2.0.0-rc.21_workerd@1.20250906.0": { + "wrangler@4.35.0_@cloudflare+workers-types@4.20260317.1_unenv@2.0.0-rc.21_workerd@1.20250906.0": { "integrity": "sha512-HbyXtbrh4Fi3mU8ussY85tVdQ74qpVS1vctUgaPc+bPrXBTqfDLkZ6VRtHAVF/eBhz4SFmhJtCQpN1caY2Ak8A==", "dependencies": [ "@cloudflare/kv-asset-handler", @@ -7367,7 +7308,7 @@ "dependencies": [ "ansi-styles@6.2.3", "string-width@7.2.0", - "strip-ansi@7.1.2" + "strip-ansi@7.2.0" ] }, "ws@8.18.0": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32c9d724f..7cc26af6d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15158,8 +15158,8 @@ snapshots: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.57.1) @@ -15222,7 +15222,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 @@ -15233,7 +15233,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -15248,18 +15248,18 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -15285,7 +15285,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -15296,7 +15296,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 diff --git a/test/smoke/harness/backdoor.ts b/test/smoke/harness/backdoor.ts new file mode 100644 index 000000000..316e826c2 --- /dev/null +++ b/test/smoke/harness/backdoor.ts @@ -0,0 +1,165 @@ +import type { Federation } from "@fedify/fedify/federation"; +import { Create, Follow, Note, Undo } from "@fedify/vocab"; +import { store } from "./store.ts"; + +function json(data: unknown, status = 200): Response { + return new Response(JSON.stringify(data), { + status, + headers: { "Content-Type": "application/json" }, + }); +} + +// Build recipient manually — Mastodon's WebFinger requires HTTPS but our +// harness only has HTTP. Parse the handle (user@domain) to construct the +// actor URI and inbox URL directly. +function parseRecipient( + handle: string, +): { inboxId: URL; actorId: URL } { + const [user, domain] = handle.split("@"); + const inboxId = new URL(`http://${domain}/users/${user}/inbox`); + // Mastodon generates https:// actor URIs; use that as the canonical id + const actorId = new URL(`https://${domain}/users/${user}`); + return { inboxId, actorId }; +} + +export async function handleBackdoor( + request: Request, + federation: Federation, +): Promise { + const url = new URL(request.url); + + if (url.pathname === "/_test/health") { + return new Response("OK"); + } + + if (url.pathname === "/_test/reset" && request.method === "POST") { + store.clear(); + return json({ ok: true }); + } + + if (url.pathname === "/_test/inbox") { + return json(store.all()); + } + + if (url.pathname === "/_test/inbox/latest") { + const item = store.latest(); + if (item == null) return json(null, 404); + return json(item); + } + + if (url.pathname === "/_test/create-note" && request.method === "POST") { + const body = await request.json(); + const { to, content } = body as { to: string; content: string }; + + const ctx = federation.createContext( + new URL(request.url), + undefined as void, + ); + + const { actorId, inboxId } = parseRecipient(to); + const recipient = { id: actorId, inboxId }; + + const noteId = crypto.randomUUID(); + const note = new Note({ + id: new URL(`${ctx.canonicalOrigin}/notes/${noteId}`), + attribution: ctx.getActorUri("testuser"), + content, + to: new URL("https://www.w3.org/ns/activitystreams#Public"), + ccs: [actorId], + }); + + const activity = new Create({ + id: new URL(`${ctx.canonicalOrigin}/activities/${noteId}`), + actor: ctx.getActorUri("testuser"), + object: note, + to: new URL("https://www.w3.org/ns/activitystreams#Public"), + ccs: [actorId], + }); + + try { + await ctx.sendActivity( + { identifier: "testuser" }, + recipient, + activity, + { immediate: true }, + ); + } catch (e) { + return json({ error: `Failed to send: ${e}` }, 500); + } + + return json({ ok: true, noteId }); + } + + if (url.pathname === "/_test/follow" && request.method === "POST") { + const body = await request.json(); + const { target } = body as { target: string }; + + const ctx = federation.createContext( + new URL(request.url), + undefined as void, + ); + + const { actorId, inboxId } = parseRecipient(target); + const recipient = { id: actorId, inboxId }; + + const follow = new Follow({ + id: new URL( + `${ctx.canonicalOrigin}/activities/${crypto.randomUUID()}`, + ), + actor: ctx.getActorUri("testuser"), + object: actorId, + }); + + try { + await ctx.sendActivity( + { identifier: "testuser" }, + recipient, + follow, + { immediate: true }, + ); + } catch (e) { + return json({ error: `Failed to send: ${e}` }, 500); + } + + return json({ ok: true }); + } + + if (url.pathname === "/_test/unfollow" && request.method === "POST") { + const body = await request.json(); + const { target } = body as { target: string }; + + const ctx = federation.createContext( + new URL(request.url), + undefined as void, + ); + + const { actorId, inboxId } = parseRecipient(target); + const recipient = { id: actorId, inboxId }; + + const undo = new Undo({ + id: new URL( + `${ctx.canonicalOrigin}/activities/${crypto.randomUUID()}`, + ), + actor: ctx.getActorUri("testuser"), + object: new Follow({ + actor: ctx.getActorUri("testuser"), + object: actorId, + }), + }); + + try { + await ctx.sendActivity( + { identifier: "testuser" }, + recipient, + undo, + { immediate: true }, + ); + } catch (e) { + return json({ error: `Failed to send: ${e}` }, 500); + } + + return json({ ok: true }); + } + + return new Response("Not Found", { status: 404 }); +} diff --git a/test/smoke/harness/deno.json b/test/smoke/harness/deno.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/test/smoke/harness/deno.json @@ -0,0 +1 @@ +{} diff --git a/test/smoke/harness/federation.ts b/test/smoke/harness/federation.ts new file mode 100644 index 000000000..5332681e1 --- /dev/null +++ b/test/smoke/harness/federation.ts @@ -0,0 +1,103 @@ +import { createFederation, MemoryKvStore } from "@fedify/fedify/federation"; +import { generateCryptoKeyPair } from "@fedify/fedify/sig"; +import { Accept, Activity, Create, Follow, Note, Person } from "@fedify/vocab"; +import { store } from "./store.ts"; + +const ORIGIN = Deno.env.get("HARNESS_ORIGIN") ?? + "http://fedify-harness:3001"; + +const rsaKeyPair = await generateCryptoKeyPair("RSASSA-PKCS1-v1_5"); + +const federation = createFederation({ + kv: new MemoryKvStore(), + origin: ORIGIN, + allowPrivateAddress: true, + skipSignatureVerification: true, +}); + +federation + .setActorDispatcher("/users/{identifier}", async (ctx, identifier) => { + if (identifier !== "testuser") return null; + const keys = await ctx.getActorKeyPairs(identifier); + return new Person({ + id: ctx.getActorUri(identifier), + preferredUsername: identifier, + name: "Fedify Smoke Test User", + inbox: ctx.getInboxUri(identifier), + outbox: ctx.getOutboxUri(identifier), + followers: ctx.getFollowersUri(identifier), + url: ctx.getActorUri(identifier), + publicKey: keys[0].cryptographicKey, + assertionMethods: keys.map((k) => k.multikey), + }); + }) + .setKeyPairsDispatcher((_ctx, identifier) => { + if (identifier !== "testuser") return []; + return [rsaKeyPair]; + }); + +federation + .setInboxListeners("/users/{identifier}/inbox", "/inbox") + .on(Follow, async (ctx, follow) => { + const followerUri = follow.actorId; + store.push({ + id: follow.id?.href ?? crypto.randomUUID(), + type: "Follow", + receivedAt: new Date().toISOString(), + }); + if (!ctx.recipient || !followerUri) return; + + // Build the recipient manually instead of calling getActor(), because + // Mastodon generates https:// actor URIs but only serves HTTP. + // Rewrite the scheme so sendActivity POSTs over plain HTTP. + const httpActorUri = followerUri.href.replace(/^https:\/\//, "http://"); + const recipient = { + id: followerUri, + inboxId: new URL(`${httpActorUri}/inbox`), + }; + + const accept = new Accept({ + actor: ctx.getActorUri(ctx.recipient), + object: follow, + }); + await ctx.sendActivity( + { identifier: ctx.recipient }, + recipient, + accept, + { immediate: true }, + ); + }) + .on(Create, async (_ctx, create) => { + const object = await create.getObject(); + store.push({ + id: create.id?.href ?? crypto.randomUUID(), + type: "Create", + receivedAt: new Date().toISOString(), + inReplyTo: object instanceof Note + ? object.replyTargetId?.href + : undefined, + content: object instanceof Note ? object.content?.toString() : undefined, + }); + }) + .on(Activity, (_ctx, activity) => { + // Don't double-store Create or Follow activities (already handled above) + if (!(activity instanceof Create) && !(activity instanceof Follow)) { + store.push({ + id: activity.id?.href ?? crypto.randomUUID(), + type: activity.constructor.name, + receivedAt: new Date().toISOString(), + }); + } + }); + +federation.setOutboxDispatcher( + "/users/{identifier}/outbox", + (_ctx, _identifier, _cursor) => ({ items: [] }), +); + +federation.setFollowersDispatcher( + "/users/{identifier}/followers", + (_ctx, _identifier, _cursor) => ({ items: [] }), +); + +export { federation }; diff --git a/test/smoke/harness/main.ts b/test/smoke/harness/main.ts new file mode 100644 index 000000000..d7eb8c0d1 --- /dev/null +++ b/test/smoke/harness/main.ts @@ -0,0 +1,20 @@ +import { federation } from "./federation.ts"; +import { handleBackdoor } from "./backdoor.ts"; + +const PORT = parseInt(Deno.env.get("HARNESS_PORT") ?? "3001"); + +Deno.serve({ port: PORT, hostname: "0.0.0.0" }, async (request: Request) => { + const url = new URL(request.url); + + // Backdoor test-control routes + if (url.pathname.startsWith("/_test/")) { + return await handleBackdoor(request, federation); + } + + // Federation routes (actor, inbox, webfinger, etc.) + return await federation.fetch(request, { + contextData: undefined, + onNotFound: () => new Response("Not Found", { status: 404 }), + onNotAcceptable: () => new Response("Not Acceptable", { status: 406 }), + }); +}); diff --git a/test/smoke/harness/store.ts b/test/smoke/harness/store.ts new file mode 100644 index 000000000..7ac825eb9 --- /dev/null +++ b/test/smoke/harness/store.ts @@ -0,0 +1,24 @@ +export interface ReceivedActivity { + id: string; + type: string; + receivedAt: string; + inReplyTo?: string; + content?: string; +} + +const inbox: ReceivedActivity[] = []; + +export const store = { + push(a: ReceivedActivity): void { + inbox.push(a); + }, + latest(): ReceivedActivity | null { + return inbox.at(-1) ?? null; + }, + all(): ReceivedActivity[] { + return [...inbox]; + }, + clear(): void { + inbox.splice(0); + }, +}; diff --git a/test/smoke/mastodon/disable_force_ssl.rb b/test/smoke/mastodon/disable_force_ssl.rb new file mode 100644 index 000000000..0fbfaee42 --- /dev/null +++ b/test/smoke/mastodon/disable_force_ssl.rb @@ -0,0 +1,3 @@ +# Disable force_ssl for smoke tests so HTTP works without HTTPS proxy. +# Mastodon production mode enables force_ssl regardless of LOCAL_HTTPS. +Rails.application.config.force_ssl = false diff --git a/test/smoke/mastodon/docker-compose.yml b/test/smoke/mastodon/docker-compose.yml new file mode 100644 index 000000000..b3ecd9cc3 --- /dev/null +++ b/test/smoke/mastodon/docker-compose.yml @@ -0,0 +1,91 @@ +volumes: + harness-node-modules: + +networks: + smoke: + driver: bridge + +services: + db: + image: postgres:15-alpine + environment: + POSTGRES_DB: mastodon + POSTGRES_USER: mastodon + POSTGRES_PASSWORD: mastodon + networks: [smoke] + healthcheck: + test: ["CMD", "pg_isready", "-U", "mastodon"] + interval: 5s + retries: 10 + + redis: + image: redis:7-alpine + networks: [smoke] + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 5s + retries: 10 + + # Fedify test harness — runs inside the Docker network so Mastodon's + # Resolv::DNS can resolve "fedify-harness" natively via Docker DNS. + fedify-harness: + image: denoland/deno:2.7.1 + working_dir: /workspace + volumes: + - ../../../:/workspace + - harness-node-modules:/workspace/node_modules + command: + - run + - --allow-net + - --allow-env + - --allow-read + - --allow-write + - --unstable-temporal + - test/smoke/harness/main.ts + environment: + HARNESS_ORIGIN: "http://fedify-harness:3001" + networks: [smoke] + ports: ["3001:3001"] + healthcheck: + test: + [ + "CMD", + "deno", + "eval", + "const r = await fetch('http://localhost:3001/_test/health'); if (!r.ok) Deno.exit(1);", + ] + interval: 5s + retries: 30 + + mastodon-web: + image: ghcr.io/mastodon/mastodon:v4.3.9 + command: bundle exec rails s -p 3000 -b 0.0.0.0 + env_file: mastodon.env + volumes: + - ./disable_force_ssl.rb:/opt/mastodon/config/initializers/zz_disable_force_ssl.rb:ro + networks: + smoke: + aliases: [mastodon] + ports: ["3000:3000"] + depends_on: + db: { condition: service_healthy } + redis: { condition: service_healthy } + healthcheck: + test: + [ + "CMD-SHELL", + "curl -sf http://localhost:3000/health | grep -q OK", + ] + interval: 10s + retries: 18 + + mastodon-sidekiq: + image: ghcr.io/mastodon/mastodon:v4.3.9 + command: bundle exec sidekiq -q ingress -q default -q push + env_file: mastodon.env + volumes: + - ./disable_force_ssl.rb:/opt/mastodon/config/initializers/zz_disable_force_ssl.rb:ro + networks: [smoke] + depends_on: + mastodon-web: { condition: service_healthy } + fedify-harness: { condition: service_healthy } diff --git a/test/smoke/mastodon/mastodon.env b/test/smoke/mastodon/mastodon.env new file mode 100644 index 000000000..16fee3a2c --- /dev/null +++ b/test/smoke/mastodon/mastodon.env @@ -0,0 +1,24 @@ +# Mastodon configuration for smoke tests. +# SECRET_KEY_BASE, OTP_SECRET, VAPID_*, and ACTIVE_RECORD_ENCRYPTION_* +# are appended by CI (see .github/workflows/smoke-mastodon.yml). + +LOCAL_DOMAIN=mastodon:3000 +ALTERNATE_DOMAINS=localhost:3000 +LOCAL_HTTPS=false +RAILS_ENV=production +DB_HOST=db +DB_PORT=5432 +DB_NAME=mastodon +DB_USER=mastodon +DB_PASS=mastodon +REDIS_HOST=redis +REDIS_PORT=6379 +SMTP_SERVER=localhost +SMTP_PORT=25 +SMTP_FROM_ADDRESS=noreply@localhost +SMTP_AUTH_METHOD=none +SMTP_OPENSSL_VERIFY_MODE=none +SMTP_DELIVERY_METHOD=none +ES_ENABLED=false +RAILS_LOG_TO_STDOUT=true +ALLOWED_PRIVATE_ADDRESSES=0.0.0.0/0 diff --git a/test/smoke/mastodon/provision.sh b/test/smoke/mastodon/provision.sh new file mode 100755 index 000000000..112576bbc --- /dev/null +++ b/test/smoke/mastodon/provision.sh @@ -0,0 +1,129 @@ +#!/usr/bin/env bash +set -euo pipefail + +COMPOSE="docker compose -f test/smoke/mastodon/docker-compose.yml" + +echo "→ Creating test user..." +$COMPOSE exec -T mastodon-web bin/tootctl accounts create \ + testuser --email=test@localhost --confirmed \ + || true # may already exist on re-run + +echo "→ Approving and activating test user..." +$COMPOSE exec -T mastodon-web bin/rails runner - <<'RUBY' +user = Account.find_local('testuser').user +user.update!(approved: true, confirmed_at: Time.now.utc) +user.approve! if user.respond_to?(:approve!) +RUBY + +echo "→ Generating API token via Rails..." +# Use a unique marker so we can extract just the token from rails runner +# output, which may include deprecation warnings or other noise on stdout. +RAW=$($COMPOSE exec -T mastodon-web bin/rails runner - <<'RUBY' 2>&1 | tr -d '\r' +user = Account.find_local('testuser').user +app = Doorkeeper::Application.find_or_create_by!(name: 'smoke-test') do |a| + a.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob' + a.scopes = 'read write follow' +end +token = Doorkeeper::AccessToken.find_or_create_for( + application: app, + resource_owner: user, + scopes: Doorkeeper::OAuth::Scopes.from_string('read write follow'), + expires_in: nil, + use_refresh_token: false +) +print "SMOKE_TOKEN=#{token.token}" +RUBY +) + +TOKEN=$(echo "$RAW" | grep -oP 'SMOKE_TOKEN=\K\S+' | tail -1) + +if [ -z "$TOKEN" ]; then + echo "✗ Failed to generate API token" + exit 1 +fi + +# Verify token works with a simple API call +echo "→ Verifying token..." +HTTP_CODE=$(curl -s -o /dev/null -w '%{http_code}' \ + -H "Authorization: Bearer $TOKEN" \ + http://localhost:3000/api/v1/accounts/verify_credentials) +echo " verify_credentials → HTTP $HTTP_CODE" +if [ "$HTTP_CODE" != "200" ]; then + echo "✗ Token verification failed (HTTP $HTTP_CODE)" + exit 1 +fi + +echo "→ Pre-registering Fedify remote account in Mastodon..." +# Mastodon's WebFinger resolution hardcodes HTTPS, but our harness is HTTP. +# Insert the remote account directly into Mastodon's database with values +# matching the harness actor dispatcher configuration. +HARNESS_ORIGIN="http://fedify-harness:3001" +$COMPOSE exec -T -e HARNESS_ORIGIN="$HARNESS_ORIGIN" \ + mastodon-web bin/rails runner - <<'RUBY' +origin = ENV.fetch('HARNESS_ORIGIN') +account = Account.find_or_initialize_by( + username: 'testuser', + domain: 'fedify-harness:3001' +) +account.update!( + protocol: :activitypub, + uri: "#{origin}/users/testuser", + url: "#{origin}/users/testuser", + inbox_url: "#{origin}/users/testuser/inbox", + shared_inbox_url: "#{origin}/inbox", + outbox_url: "#{origin}/users/testuser/outbox", + followers_url: "#{origin}/users/testuser/followers", + display_name: 'Fedify Smoke Test User', + note: '', + actor_type: 'Person' +) +print "REGISTERED=#{account.id}" +RUBY + +echo "→ Fetching Fedify actor public key..." +# The harness is already running inside Docker. Fetch its actor document +# and store the public key so Mastodon can verify HTTP signatures without +# needing WebFinger (which hardcodes HTTPS). +$COMPOSE exec -T mastodon-web bin/rails runner - <<'RUBY' +require 'net/http' +require 'json' + +uri = URI('http://fedify-harness:3001/users/testuser') +req = Net::HTTP::Get.new(uri) +req['Accept'] = 'application/activity+json' +res = Net::HTTP.start(uri.hostname, uri.port) { |http| http.request(req) } + +unless res.is_a?(Net::HTTPSuccess) + abort "Failed to fetch actor: HTTP #{res.code}" +end + +actor = JSON.parse(res.body) +pem = actor.dig('publicKey', 'publicKeyPem') +abort "No publicKey in actor document" if pem.nil? + +account = Account.find_by!(username: 'testuser', domain: 'fedify-harness:3001') +account.update!(public_key: pem) +print "KEY_STORED=#{account.id}" +RUBY + +echo "→ Creating follow relationship (Fedify → Mastodon) in DB..." +# Ensure the Fedify account follows the Mastodon account in the DB. +# This guarantees that when Mastodon posts a status, it will deliver +# to the Fedify inbox via the followers path (StatusReachFinder). +$COMPOSE exec -T mastodon-web bin/rails runner - <<'RUBY' +fedify_account = Account.find_by!(username: 'testuser', domain: 'fedify-harness:3001') +local_account = Account.find_local('testuser') +follow = Follow.find_or_create_by!(account: fedify_account, target_account: local_account) +print "FOLLOW=#{follow.id}" +RUBY + +echo "→ Writing test env..." +cat > test/smoke/.env.test <( + label: string, + fn: () => Promise, +): Promise { + const deadline = Date.now() + POLL_TIMEOUT_MS; + let lastError: unknown = null; + while (Date.now() < deadline) { + try { + const result = await fn(); + if (result !== null) return result; + } catch (err) { + lastError = err; + } + await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS)); + } + const suffix = lastError instanceof Error + ? ` (last error: ${lastError.message})` + : ""; + throw new Error(`Timed out waiting for: ${label}${suffix}`); +} + +type InboxItem = { + type: string; + id: string; + receivedAt: string; + inReplyTo?: string; + content?: string; +}; + +async function snapshotInboxIds(): Promise> { + const res = await fetch(`${HARNESS_URL}/_test/inbox`); + const items = await res.json() as InboxItem[]; + return new Set(items.map((a) => a.id)); +} + +function pollHarnessInbox( + activityType: string, + filter?: (item: InboxItem) => boolean, +): Promise { + return poll(`${activityType} in harness inbox`, async () => { + const res = await fetch(`${HARNESS_URL}/_test/inbox`); + const items = await res.json() as InboxItem[]; + return items.find((a) => + a.type === activityType && + (!filter || filter(a)) + ) ?? null; + }); +} + +async function serverGet(path: string): Promise { + const res = await fetch(`${SERVER_URL}${path}`, { + headers: { Authorization: `Bearer ${SERVER_TOKEN}` }, + }); + if (!res.ok) { + const body = await res.text(); + throw new Error(`Server GET ${path} → ${res.status}: ${body}`); + } + return res.json(); +} + +async function serverPost( + path: string, + body?: Record, +): Promise { + const res = await fetch(`${SERVER_URL}${path}`, { + method: "POST", + headers: { + Authorization: `Bearer ${SERVER_TOKEN}`, + "Content-Type": body ? "application/json" : "text/plain", + }, + body: body ? JSON.stringify(body) : undefined, + }); + if (!res.ok) { + const text = await res.text(); + throw new Error(`Server POST ${path} → ${res.status}: ${text}`); + } + return res.json(); +} + +async function harnessPost( + path: string, + body?: Record, +): Promise { + const res = await fetch(`${HARNESS_URL}${path}`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: body ? JSON.stringify(body) : undefined, + }); + if (!res.ok) { + const text = await res.text(); + throw new Error(`Harness POST ${path} → ${res.status}: ${text}`); + } + return res.json(); +} + +// --------------------------------------------------------------------------- +// Shared types +// --------------------------------------------------------------------------- + +type RemoteAccount = { id: string; acct: string }; +type Relationship = { + id: string; + following: boolean; + followed_by: boolean; + requested: boolean; +}; + +// Resolved once by the first follow scenario and reused by later scenarios. +let fedifyAccountId: string | undefined; + +async function lookupFedifyAccount(): Promise { + if (fedifyAccountId) return fedifyAccountId; + + const handle = `testuser@${HARNESS_HOST}`; + + const searchResult = await poll("Fedify user resolvable", async () => { + const results = await serverGet( + `/api/v1/accounts/search?q=${ + encodeURIComponent(`@${handle}`) + }&resolve=false&limit=5`, + ) as RemoteAccount[]; + const match = results?.find((a) => + a.acct === handle || a.acct === `@${handle}` + ); + return match ?? null; + }); + + fedifyAccountId = searchResult.id; + return fedifyAccountId; +} + +async function assertNotFollowing( + accountId: string, + direction: "following" | "followed_by", +): Promise { + const rels = await serverGet( + `/api/v1/accounts/relationships?id[]=${accountId}`, + ) as Relationship[]; + const rel = rels.find((r) => r.id === accountId); + if (rel && rel[direction]) { + throw new Error( + `Expected ${direction} to be false, but it was true (account ${accountId})`, + ); + } +} + +async function ensureNotFollowing( + accountId: string, + direction: "following" | "followed_by", +): Promise { + const rels = await serverGet( + `/api/v1/accounts/relationships?id[]=${accountId}`, + ) as Relationship[]; + const rel = rels.find((r) => r.id === accountId); + if (rel?.[direction]) { + if (direction === "following") { + await serverPost(`/api/v1/accounts/${accountId}/unfollow`); + } else { + // Ask the harness to send Undo Follow to clear followed_by + await harnessPost("/_test/unfollow", { + target: `testuser@${SERVER_INTERNAL_HOST}`, + }); + } + // Wait for the relationship to actually clear + await poll(`${direction} cleared`, async () => { + const updated = await serverGet( + `/api/v1/accounts/relationships?id[]=${accountId}`, + ) as Relationship[]; + const r = updated.find((r) => r.id === accountId); + return r && !r[direction] ? r : null; + }); + } +} + +// --------------------------------------------------------------------------- +// Scenario: Mastodon → Fedify (Follow) +// --------------------------------------------------------------------------- + +async function testFollowMastodonToFedify(): Promise { + await harnessPost("/_test/reset"); + const accountId = await lookupFedifyAccount(); + await ensureNotFollowing(accountId, "following"); + await assertNotFollowing(accountId, "following"); + const knownIds = await snapshotInboxIds(); + await serverPost(`/api/v1/accounts/${accountId}/follow`); + + await pollHarnessInbox("Follow", (a) => !knownIds.has(a.id)); + + // Wait until Mastodon has processed the Accept from the harness. + // Check both following=true AND requested=false: the latter only + // flips once the Accept activity has actually been received. + await poll("follow accepted", async () => { + const rels = await serverGet( + `/api/v1/accounts/relationships?id[]=${accountId}`, + ) as Relationship[]; + const rel = rels.find((r) => r.id === accountId); + return rel?.following && !rel?.requested ? rel : null; + }); +} + +// --------------------------------------------------------------------------- +// Scenario: Fedify → Mastodon (Follow) +// --------------------------------------------------------------------------- + +async function testFollowFedifyToMastodon(): Promise { + await harnessPost("/_test/reset"); + const accountId = await lookupFedifyAccount(); + await ensureNotFollowing(accountId, "followed_by"); + await assertNotFollowing(accountId, "followed_by"); + const knownIds = await snapshotInboxIds(); + + await harnessPost("/_test/follow", { + target: `testuser@${SERVER_INTERNAL_HOST}`, + }); + + await poll("followed_by on Mastodon", async () => { + const rels = await serverGet( + `/api/v1/accounts/relationships?id[]=${accountId}`, + ) as Relationship[]; + const rel = rels.find((r) => r.id === accountId); + return rel?.followed_by ? rel : null; + }); + + await pollHarnessInbox("Accept", (a) => !knownIds.has(a.id)); +} + +// --------------------------------------------------------------------------- +// Scenario: Fedify → Mastodon (Create Note) +// --------------------------------------------------------------------------- + +async function testCreateNote(): Promise { + await harnessPost("/_test/reset"); + + const content = `Smoke test ${Date.now()}`; + await harnessPost("/_test/create-note", { + to: `testuser@${SERVER_INTERNAL_HOST}`, + content, + }); + + type Status = { id: string; content: string }; + + await poll("note on Mastodon timeline", async () => { + const statuses = await serverGet( + "/api/v1/timelines/home?limit=20", + ) as Status[]; + return statuses.find((s) => s.content.includes(content)) ?? null; + }); +} + +// --------------------------------------------------------------------------- +// Scenario: Mastodon → Fedify (Reply) +// --------------------------------------------------------------------------- + +async function testReply(): Promise { + await harnessPost("/_test/reset"); + + // Find a note from the Fedify harness on the Mastodon timeline to reply to. + type Status = { + id: string; + content: string; + uri: string; + account: { acct: string }; + }; + const parent = await poll("find Fedify note to reply to", async () => { + const statuses = await serverGet( + "/api/v1/timelines/home?limit=20", + ) as Status[]; + return statuses.find((s) => s.account.acct.includes(HARNESS_HOST)) ?? + null; + }); + + const token = `smoke-reply-${crypto.randomUUID()}`; + const handle = `@testuser@${HARNESS_HOST}`; + const replyContent = `${token} ${handle}`; + + const knownIds = await snapshotInboxIds(); + + await serverPost("/api/v1/statuses", { + status: replyContent, + in_reply_to_id: parent.id, + }); + + const received = await pollHarnessInbox( + "Create", + (a) => !knownIds.has(a.id) && !!a.content?.includes(token), + ); + + if (!received.inReplyTo) { + throw new Error( + "Received Create activity has no inReplyTo — " + + "cannot distinguish reply from plain mention", + ); + } + if (received.inReplyTo !== parent.uri) { + throw new Error( + `inReplyTo mismatch: expected ${parent.uri}, ` + + `got ${received.inReplyTo}`, + ); + } +} + +// --------------------------------------------------------------------------- +// Scenario: Mastodon → Fedify (Unfollow) +// --------------------------------------------------------------------------- + +async function testUnfollowMastodonFromFedify(): Promise { + await harnessPost("/_test/reset"); + const knownIds = await snapshotInboxIds(); + + const accountId = await lookupFedifyAccount(); + await serverPost(`/api/v1/accounts/${accountId}/unfollow`); + + await pollHarnessInbox("Undo", (a) => !knownIds.has(a.id)); + + await poll("unfollow confirmed", async () => { + const rels = await serverGet( + `/api/v1/accounts/relationships?id[]=${accountId}`, + ) as Relationship[]; + const rel = rels.find((r) => r.id === accountId); + return rel && !rel.following ? rel : null; + }); +} + +// --------------------------------------------------------------------------- +// Scenario: Fedify → Mastodon (Unfollow) +// --------------------------------------------------------------------------- + +async function testUnfollowFedifyFromMastodon(): Promise { + await harnessPost("/_test/reset"); + + const accountId = await lookupFedifyAccount(); + + await harnessPost("/_test/unfollow", { + target: `testuser@${SERVER_INTERNAL_HOST}`, + }); + + await poll("unfollow confirmed on Mastodon", async () => { + const rels = await serverGet( + `/api/v1/accounts/relationships?id[]=${accountId}`, + ) as Relationship[]; + const rel = rels.find((r) => r.id === accountId); + return rel && !rel.followed_by ? rel : null; + }); +} + +// --------------------------------------------------------------------------- +// Entry point +// --------------------------------------------------------------------------- + +try { + const scenarios: [string, () => Promise][] = [ + ["Mastodon → Fedify (Follow)", testFollowMastodonToFedify], + ["Fedify → Mastodon (Follow)", testFollowFedifyToMastodon], + ["Fedify → Mastodon (Create Note)", testCreateNote], + ["Mastodon → Fedify (Reply)", testReply], + ["Mastodon → Fedify (Unfollow)", testUnfollowMastodonFromFedify], + ["Fedify → Mastodon (Unfollow)", testUnfollowFedifyFromMastodon], + ]; + + let failed = false; + for (const [name, fn] of scenarios) { + try { + await fn(); + console.log(`✓ ${name}`); + } catch (err) { + console.error(`✗ ${name}:`, err); + failed = true; + } + } + + Deno.exit(failed ? 1 : 0); +} catch (err) { + console.error("\n✗ Unexpected error:", err); + Deno.exit(1); +}