From 6b69deb37d97d85195224986dd72fe3b08a80940 Mon Sep 17 00:00:00 2001 From: Krzysztof kuhy Rudnicki Date: Fri, 4 Sep 2026 09:47:17 +0200 Subject: [PATCH] chore: latest stable deps, and a suite that no longer reads the real .env ruff 0.16.6, pnpm 11.25.0, @testing-library/user-event 14.6.7, @types/node 26.4.1, eslint-plugin-perfectionist 5.11.0 and typescript-eslint 8.69.0. The freshness gate flagged all six; ruff, tsc, eslint and both suites stay green on the new versions. typescript stays on 6.0.3: 8.69.0 still declares `typescript: ">=4.8.4 <6.1.0"`, so the fleet-wide hold moves its blocker version and nothing else. In the same commit because the gate would not let it land alone: test_app.py drove the real ASGI lifespan, whose load_config() calls load_dotenv(), which put the operator's PHOTO_PACK_DIR straight back after conftest deleted it. The suite loaded the real album on every run and only passed while that album loaded. Today it does not (tags.json names two files media/ no longer has), and three ASGI tests failed with it. load_dotenv is now a no-op for the whole suite, as test_main.py already did for itself. Co-Authored-By: Claude Opus 4.8 --- fake_signal/scenarios/pack_add_custom.yaml | 9 - fake_signal/scenarios/pack_add_heic.yaml | 14 -- .../scenarios/pack_add_no_attachment.yaml | 8 - fake_signal/scenarios/pack_add_person.yaml | 12 - fake_signal/scenarios/pack_add_rejected.yaml | 10 - fake_signal/scenarios/pack_add_scoping.yaml | 10 - fake_signal/scenarios/pack_add_svg.yaml | 12 - fake_signal/scenarios/pack_add_video.yaml | 15 -- pyproject.toml | 2 +- tests/conftest.py | 5 + web/package.json | 10 +- web/pnpm-lock.yaml | 212 +++++++++++++----- 12 files changed, 161 insertions(+), 158 deletions(-) delete mode 100644 fake_signal/scenarios/pack_add_custom.yaml delete mode 100644 fake_signal/scenarios/pack_add_heic.yaml delete mode 100644 fake_signal/scenarios/pack_add_no_attachment.yaml delete mode 100644 fake_signal/scenarios/pack_add_person.yaml delete mode 100644 fake_signal/scenarios/pack_add_rejected.yaml delete mode 100644 fake_signal/scenarios/pack_add_scoping.yaml delete mode 100644 fake_signal/scenarios/pack_add_svg.yaml delete mode 100644 fake_signal/scenarios/pack_add_video.yaml diff --git a/fake_signal/scenarios/pack_add_custom.yaml b/fake_signal/scenarios/pack_add_custom.yaml deleted file mode 100644 index b17cb7c..0000000 --- a/fake_signal/scenarios/pack_add_custom.yaml +++ /dev/null @@ -1,9 +0,0 @@ -# A label matching nobody becomes a custom tag, and !losowe is the only door -# to it. The typed label must appear in neither reply. -name: "!dodaj mints a custom tag and !losowe finds it" -inject: - - { text: "!dodaj wakacje", uuid: uuid-add-custom, name: AddCustom, attachment: att-custom } - - { text: "!losowe wakacje", uuid: uuid-add-custom-b, name: AddCustomB } -expect: - - { kind: text, to: reply, contains: "NOWA ETYKIETA" } - - { kind: image, to: reply } diff --git a/fake_signal/scenarios/pack_add_heic.yaml b/fake_signal/scenarios/pack_add_heic.yaml deleted file mode 100644 index 7012df4..0000000 --- a/fake_signal/scenarios/pack_add_heic.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# The iPhone default. Its HEVC parameter set survives `-all=` and is on the -# structural allowlist by kuhy's decision of 2026-08-31; the GPS and the Make -# do not survive, which is what e2e.sh re-reads the stored file to prove. -name: "a geotagged heic is accepted and comes out without its GPS" -inject: - - { - text: "!dodaj gamma", uuid: uuid-add-heic, name: AddHeic, - attachment: att-heic, attachment_type: "image/heic", - } -# Tagged to gamma rather than alfa on purpose: pack_command.yaml asserts -# !alfa returns an image, and the pick is random -- putting a clip in p1 -# would make that scenario fail about half the time. -expect: - - { kind: text, to: reply, contains: "dodano" } diff --git a/fake_signal/scenarios/pack_add_no_attachment.yaml b/fake_signal/scenarios/pack_add_no_attachment.yaml deleted file mode 100644 index bd00e89..0000000 --- a/fake_signal/scenarios/pack_add_no_attachment.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# The pending mint is held in memory and never reaches custom.json: this is -# the case that must leave the album byte-identical. scripts/e2e.sh checks -# the file itself, because a reply cannot prove what was not written. -name: "!dodaj with no attachment changes nothing on disk" -inject: - - { text: "!dodaj piesek", uuid: uuid-add-none, name: AddNone } -expect: - - { kind: text, to: reply, contains: "DOŁĄCZ ZDJĘCIE" } diff --git a/fake_signal/scenarios/pack_add_person.yaml b/fake_signal/scenarios/pack_add_person.yaml deleted file mode 100644 index 46fb438..0000000 --- a/fake_signal/scenarios/pack_add_person.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# The feature working, in the shape the group will actually use it: a photo -# captioned with somebody's name, retrievable through their own command with -# no restart in between. The attachment carries a real APP1 Exif segment -# (tool/e2e_media.py puts GPS, a Make and an XMP creator in it); the reply -# must still be counts and pseudonyms only. -name: "!dodaj tags an existing person and !alfa returns it without a restart" -inject: - - { text: "!dodaj alfa", uuid: uuid-add-person, name: AddPerson, attachment: att-person } - - { text: "!alfa", uuid: uuid-add-person-b, name: AddPersonB } -expect: - - { kind: text, to: reply, contains: "dodano · p1:" } - - { kind: image, to: reply } diff --git a/fake_signal/scenarios/pack_add_rejected.yaml b/fake_signal/scenarios/pack_add_rejected.yaml deleted file mode 100644 index c35e809..0000000 --- a/fake_signal/scenarios/pack_add_rejected.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# Sniffed on the bytes, never on the filename or the stated contentType -- -# this one claims to be a photo and is a text file. -name: "a file that is not media is refused and never stored" -inject: - - { - text: "!dodaj alfa", uuid: uuid-add-junk, name: AddJunk, - attachment: att-junk, attachment_type: "image/jpeg", - } -expect: - - { kind: text, to: reply, contains: "NIE PRZYJMUJĘ" } diff --git a/fake_signal/scenarios/pack_add_scoping.yaml b/fake_signal/scenarios/pack_add_scoping.yaml deleted file mode 100644 index 2309104..0000000 --- a/fake_signal/scenarios/pack_add_scoping.yaml +++ /dev/null @@ -1,10 +0,0 @@ -# The privacy guarantee, for the write path this time. In a group the album -# was not given to, !dodaj is not a command at all: nothing is stored, nothing -# is answered, and nothing names the album in a group that does not have one. -name: "!dodaj does not exist in a group the album was not given to" -inject: - - { - text: "!dodaj alfa", group: second, uuid: uuid-add-scope, name: AddScope, - attachment: att-second, - } -expect: [] diff --git a/fake_signal/scenarios/pack_add_svg.yaml b/fake_signal/scenarios/pack_add_svg.yaml deleted file mode 100644 index 9b1da4f..0000000 --- a/fake_signal/scenarios/pack_add_svg.yaml +++ /dev/null @@ -1,12 +0,0 @@ -# kuhy's decision of 2026-08-31: exiftool 13.55 can write neither .svg nor -# .webm, and both stay on the allowlist and are stored exactly as they -# arrive -- metadata included. This scenario exists so that hole is -# demonstrated by the suite rather than only described in the docs. -name: "an svg is accepted and stored unstripped, by decision" -inject: - - { - text: "!dodaj alfa", uuid: uuid-add-svg, name: AddSvg, - attachment: att-svg, attachment_type: "image/svg+xml", - } -expect: - - { kind: text, to: reply, contains: "dodano" } diff --git a/fake_signal/scenarios/pack_add_video.yaml b/fake_signal/scenarios/pack_add_video.yaml deleted file mode 100644 index 12d6635..0000000 --- a/fake_signal/scenarios/pack_add_video.yaml +++ /dev/null @@ -1,15 +0,0 @@ -# An mp4 geotagged the way a phone does it: a QuickTime udta atom, which a -# naive "-GPS:all" gate passes straight through because exiftool files it -# under QuickTime and not under GPS. It is accepted, and scripts/e2e.sh then -# re-reads the stored file and fails the run if the atom survived. -name: "a geotagged mp4 is stripped of its QuickTime atom and stored" -inject: - - { - text: "!dodaj gamma", uuid: uuid-add-video, name: AddVideo, - attachment: att-video, attachment_type: "video/mp4", - } -# Tagged to gamma rather than alfa on purpose: pack_command.yaml asserts -# !alfa returns an image, and the pick is random -- putting a clip in p1 -# would make that scenario fail about half the time. -expect: - - { kind: text, to: reply, contains: "dodano" } diff --git a/pyproject.toml b/pyproject.toml index 58ed40f..864ce42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,7 +26,7 @@ dev = [ "pytest==9.1.1", "pytest-asyncio==1.4.0", "pytest-cov==7.1.0", - "ruff==0.16.5", + "ruff==0.16.6", "types-PyYAML==6.0.12.20260815", ] diff --git a/tests/conftest.py b/tests/conftest.py index 7ec6353..bf4c46e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -112,6 +112,11 @@ def _no_test_ever_reads_a_real_photo_pack(tmp_path: Path, monkeypatch: pytest.Mo monkeypatch.delenv("PHOTO_PACK_DIR", raising=False) monkeypatch.delenv("STATE_DIRECTORY", raising=False) monkeypatch.setenv("XDG_DATA_HOME", str(tmp_path / "share")) + # The two lines above are not enough on their own: load_config() calls + # load_dotenv(), which happily *adds* a PHOTO_PACK_DIR the test just + # deleted. test_app.py found this out on 2026-09-04, when the real + # album stopped loading and the ASGI tests failed with it. + monkeypatch.setattr("signal_bot.config_env.load_dotenv", lambda *a, **k: None) @pytest.fixture diff --git a/web/package.json b/web/package.json index 2bc313a..cf60680 100644 --- a/web/package.json +++ b/web/package.json @@ -2,7 +2,7 @@ "name": "signal-bot-web", "private": true, "type": "module", - "packageManager": "pnpm@11.24.0", + "packageManager": "pnpm@11.25.0", "engines": { "node": ">=24", "pnpm": ">=10" @@ -29,20 +29,20 @@ "@eslint/js": "10.0.1", "@testing-library/jest-dom": "7.0.1", "@testing-library/react": "16.3.3", - "@testing-library/user-event": "14.6.6", - "@types/node": "26.4.0", + "@testing-library/user-event": "14.6.7", + "@types/node": "26.4.1", "@types/react": "19.2.18", "@types/react-dom": "19.2.5", "@vitejs/plugin-react": "6.1.1", "@vitest/coverage-v8": "4.1.11", "eslint": "10.9.1", - "eslint-plugin-perfectionist": "5.10.1", + "eslint-plugin-perfectionist": "5.11.0", "eslint-plugin-react-hooks": "7.1.1", "eslint-plugin-sonarjs": "4.2.0", "eslint-plugin-unicorn": "74.0.0", "jsdom": "30.0.1", "typescript": "6.0.3", - "typescript-eslint": "8.68.0", + "typescript-eslint": "8.69.0", "vite": "8.2.2", "vitest": "4.1.11" } diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 7197a2f..69beef9 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -43,11 +43,11 @@ importers: specifier: 16.3.3 version: 16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@testing-library/user-event': - specifier: 14.6.6 - version: 14.6.6(@testing-library/dom@10.4.1) + specifier: 14.6.7 + version: 14.6.7(@testing-library/dom@10.4.1) '@types/node': - specifier: 26.4.0 - version: 26.4.0 + specifier: 26.4.1 + version: 26.4.1 '@types/react': specifier: 19.2.18 version: 19.2.18 @@ -56,7 +56,7 @@ importers: version: 19.2.5(@types/react@19.2.18) '@vitejs/plugin-react': specifier: 6.1.1 - version: 6.1.1(vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0)) + version: 6.1.1(vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 4.1.11 version: 4.1.11(vitest@4.1.11) @@ -64,8 +64,8 @@ importers: specifier: 10.9.1 version: 10.9.1(supports-color@7.2.0) eslint-plugin-perfectionist: - specifier: 5.10.1 - version: 5.10.1(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + specifier: 5.11.0 + version: 5.11.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) eslint-plugin-react-hooks: specifier: 7.1.1 version: 7.1.1(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) @@ -82,14 +82,14 @@ importers: specifier: 6.0.3 version: 6.0.3 typescript-eslint: - specifier: 8.68.0 - version: 8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + specifier: 8.69.0 + version: 8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) vite: specifier: 8.2.2 - version: 8.2.2(@types/node@26.4.0)(yaml@2.9.0) + version: 8.2.2(@types/node@26.4.1)(yaml@2.9.0) vitest: specifier: 4.1.11 - version: 4.1.11(@types/node@26.4.0)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0)) + version: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0)) packages: @@ -308,7 +308,7 @@ packages: resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@kuhyx/web-ui@https://codeload.github.com/kuhyx/utils/tar.gz/6714d131983f05a0e67f55ac836e3e8d57045425#path:/web_ui': - resolution: {gitHosted: true, path: /web_ui, tarball: https://codeload.github.com/kuhyx/utils/tar.gz/6714d131983f05a0e67f55ac836e3e8d57045425} + resolution: {gitHosted: true, integrity: sha512-jaYClL+dn3oPl3umd8IkeI9MSalBmu2++f9unbWX33PoLgjtl5uN2Ta9/wm83HDW6Wd2cIqeCAtDXYvySZi8rQ==, path: /web_ui, tarball: https://codeload.github.com/kuhyx/utils/tar.gz/6714d131983f05a0e67f55ac836e3e8d57045425} version: 0.3.1 engines: {node: '>=24', pnpm: '>=10'} peerDependencies: @@ -546,8 +546,8 @@ packages: '@types/react-dom': optional: true - '@testing-library/user-event@14.6.6': - resolution: {integrity: sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==} + '@testing-library/user-event@14.6.7': + resolution: {integrity: sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' @@ -606,8 +606,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@26.4.0': - resolution: {integrity: sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==} + '@types/node@26.4.1': + resolution: {integrity: sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==} '@types/react-dom@19.2.5': resolution: {integrity: sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==} @@ -617,16 +617,16 @@ packages: '@types/react@19.2.18': resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} - '@typescript-eslint/eslint-plugin@8.68.0': - resolution: {integrity: sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==} + '@typescript-eslint/eslint-plugin@8.69.0': + resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.68.0 + '@typescript-eslint/parser': ^8.69.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.68.0': - resolution: {integrity: sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==} + '@typescript-eslint/parser@8.69.0': + resolution: {integrity: sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -638,18 +638,34 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.69.0': + resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@8.68.0': resolution: {integrity: sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.69.0': + resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.68.0': resolution: {integrity: sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.68.0': - resolution: {integrity: sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==} + '@typescript-eslint/tsconfig-utils@8.69.0': + resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.69.0': + resolution: {integrity: sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -659,12 +675,22 @@ packages: resolution: {integrity: sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.69.0': + resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.68.0': resolution: {integrity: sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/typescript-estree@8.69.0': + resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.68.0': resolution: {integrity: sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -672,10 +698,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.69.0': + resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@8.68.0': resolution: {integrity: sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.69.0': + resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitejs/plugin-react@6.1.1': resolution: {integrity: sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -948,8 +985,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-plugin-perfectionist@5.10.1: - resolution: {integrity: sha512-Kprsp9Us0GqAesYaAIzUViw57xYp5WBqzXrcE0Mtww++E5fexWXYBipMuuD7yvyH4vvpBH0+oJ+OMAmZ0oYXkw==} + eslint-plugin-perfectionist@5.11.0: + resolution: {integrity: sha512-kZV1otBcu4xT5R1p+0x1N1wRv4pS+OIbxrA47n5a1fTnN3MWbexOx5eQgbQhGyCNbpvF/rqrbnpkGjumHF+Y0Q==} engines: {node: ^20.0.0 || >=22.0.0} peerDependencies: eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 @@ -1574,8 +1611,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - typescript-eslint@8.68.0: - resolution: {integrity: sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==} + typescript-eslint@8.69.0: + resolution: {integrity: sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2293,7 +2330,7 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 optionalDependencies: - vitest: 4.1.11(@types/node@26.4.0)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0)) + vitest: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0)) '@testing-library/react@16.3.3(@testing-library/dom@10.4.1)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -2305,7 +2342,7 @@ snapshots: '@types/react': 19.2.18 '@types/react-dom': 19.2.5(@types/react@19.2.18) - '@testing-library/user-event@14.6.6(@testing-library/dom@10.4.1)': + '@testing-library/user-event@14.6.7(@testing-library/dom@10.4.1)': dependencies: '@testing-library/dom': 10.4.1 @@ -2354,7 +2391,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@26.4.0': + '@types/node@26.4.1': dependencies: undici-types: 8.3.0 @@ -2366,14 +2403,14 @@ snapshots: dependencies: csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/type-utils': 8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/parser': 8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/type-utils': 8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.69.0 eslint: 10.9.1(supports-color@7.2.0) ignore: 7.0.6 natural-compare: 1.4.0 @@ -2382,12 +2419,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3(supports-color@7.2.0) eslint: 10.9.1(supports-color@7.2.0) typescript: 6.0.3 @@ -2403,20 +2440,38 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.69.0(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) + '@typescript-eslint/types': 8.69.0 + debug: 4.4.3(supports-color@7.2.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.68.0': dependencies: '@typescript-eslint/types': 8.68.0 '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/scope-manager@8.69.0': + dependencies: + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 + '@typescript-eslint/tsconfig-utils@8.68.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.69.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) debug: 4.4.3(supports-color@7.2.0) eslint: 10.9.1(supports-color@7.2.0) ts-api-utils: 2.5.0(typescript@6.0.3) @@ -2426,6 +2481,8 @@ snapshots: '@typescript-eslint/types@8.68.0': {} + '@typescript-eslint/types@8.69.0': {} + '@typescript-eslint/typescript-estree@8.68.0(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@typescript-eslint/project-service': 8.68.0(supports-color@7.2.0)(typescript@6.0.3) @@ -2441,6 +2498,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.69.0(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 + debug: 4.4.3(supports-color@7.2.0) + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@7.2.0)) @@ -2452,15 +2524,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) + eslint: 10.9.1(supports-color@7.2.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.68.0': dependencies: '@typescript-eslint/types': 8.68.0 eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@6.1.1(vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0))': + '@typescript-eslint/visitor-keys@8.69.0': + dependencies: + '@typescript-eslint/types': 8.69.0 + eslint-visitor-keys: 5.0.1 + + '@vitejs/plugin-react@6.1.1(vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.2.2(@types/node@26.4.0)(yaml@2.9.0) + vite: 8.2.2(@types/node@26.4.1)(yaml@2.9.0) '@vitest/coverage-v8@4.1.11(vitest@4.1.11)': dependencies: @@ -2474,7 +2562,7 @@ snapshots: obug: 2.1.4 std-env: 4.2.0 tinyrainbow: 3.1.1 - vitest: 4.1.11(@types/node@26.4.0)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0)) + vitest: 4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0)) '@vitest/expect@4.1.11': dependencies: @@ -2485,13 +2573,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.2.2(@types/node@26.4.0)(yaml@2.9.0) + vite: 8.2.2(@types/node@26.4.1)(yaml@2.9.0) '@vitest/pretty-format@4.1.11': dependencies: @@ -2697,7 +2785,7 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-perfectionist@5.10.1(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): + eslint-plugin-perfectionist@5.11.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) eslint: 10.9.1(supports-color@7.2.0) @@ -3296,12 +3384,12 @@ snapshots: type-fest@4.41.0: {} - typescript-eslint@8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): + typescript-eslint@8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.68.0(@typescript-eslint/parser@8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.68.0(supports-color@7.2.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.68.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3))(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.69.0(supports-color@7.2.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)(typescript@6.0.3) eslint: 10.9.1(supports-color@7.2.0) typescript: 6.0.3 transitivePeerDependencies: @@ -3327,7 +3415,7 @@ snapshots: dependencies: react: 19.2.8 - vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0): + vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -3335,14 +3423,14 @@ snapshots: rolldown: 1.2.6 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.4.1 fsevents: 2.3.3 yaml: 2.9.0 - vitest@4.1.11(@types/node@26.4.0)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0)): + vitest@4.1.11(@types/node@26.4.1)(@vitest/coverage-v8@4.1.11)(jsdom@30.0.1)(vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.11 - '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.4.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@26.4.1)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.11 '@vitest/runner': 4.1.11 '@vitest/snapshot': 4.1.11 @@ -3359,10 +3447,10 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 8.2.2(@types/node@26.4.0)(yaml@2.9.0) + vite: 8.2.2(@types/node@26.4.1)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.4.1 '@vitest/coverage-v8': 4.1.11(vitest@4.1.11) jsdom: 30.0.1 transitivePeerDependencies: