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 <noreply@anthropic.com>
This commit is contained in:
Krzysztof Rudnicki 2026-09-04 09:47:17 +02:00
parent 64852ae578
commit 6b69deb37d
12 changed files with 161 additions and 158 deletions

View File

@ -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 }

View File

@ -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" }

View File

@ -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" }

View File

@ -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 }

View File

@ -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Ę" }

View File

@ -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: []

View File

@ -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" }

View File

@ -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" }

View File

@ -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",
]

View File

@ -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

View File

@ -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"
}

View File

@ -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: