mirror of
https://github.com/calibrain/shelfmark.git
synced 2026-11-15 11:08:33 +00:00
2fa0ad27f3ff9cc186efd115f4ffc313d6ed76c0
671
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
2fa0ad27f3 |
Fix [BUG] Search "Options" move out of the way when you try to click them (#1468)
Fixes #1301. ## What changed ## Summary **Root Cause (Issue #1301):** The SearchBar component uses a `useDismiss` hook that closes the main search menu on `mousedown` events occurring outside of `selectorRef` and `controlsPanelRef`. However, the AdvancedFilters panel (opened via the "Options" button) is rendered as a sibling component outside of `controlsPanelRef`. When clicking on dropdown options inside AdvancedFilters, the `mousedown` event bubbles up to the document, triggering `useDismiss` and collapsing the main menu. **Fix:** Added `onMouseDown={(e) => e.stopPropagation()}` to the `settingsForm` div in `AdvancedFilters.tsx`. This prevents the `mousedown` event from bubbling up to the document level, so the `useDismiss` hook in SearchBar never sees the event and the main menu stays open. **Test:** Created `tests/frontend/test_search_menu_dismiss.py` with 3 tests: 1. `test_advanced_filters_prevents_mousedown_bubbling` - Verifies the fix is in place 2. `test_advanced_filters_container_has_onmousedown` - Verifies the handler is on the correct element 3. `test_searchbar_uses_usedismiss_for_menu_closing` - Documents the existing dismissal behavior **Verification:** - Tests pass with the fix: ✓ - Tests fail without the fix: ✓ (2 tests fail as expected) - Existing tests still pass: ✓ (215 tests in config/) ## How it was verified - test(s) added/changed: `tests/frontend/test_search_menu_dismiss.py` - on the original code the new test fails (exit 1) - with the fix it passes (exit 0) - full test suite with the fix: exit 1, no new failures vs. baseline (exit 1) (153.7s) This was worked on in conjunction with AI tools. Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
fc8a5b9230 |
fix(prowlarr): hide results whose title extension is not a supported format (#1490)
Closes #1481 ## Problem Plain (non-enriched) indexers such as Zamunda, Knaben or LimeTorrents return titles like `Иван Вазов - Под игото.doc`. They show next to the epubs. Picking one downloads the file, then post-processing discards it because `doc` is not in `SUPPORTED_FORMATS`. ## Change - `_unsupported_title_extension()` reads a trailing file extension from the release title. When it is a known file format that is not in Supported Book Formats, the result is hidden. - Kept: titles with no extension, `[EPUB]`-style tags, dotted titles like `Jane.Eyre.by.Bronte` (only known file extensions count), archives (`zip`, `rar`, `7z`), and audiobook searches. - New Prowlarr setting `PROWLARR_HIDE_UNSUPPORTED_FORMATS` ("Hide results in formats you did not enable"), default on. - One info log line per search with the hidden count; a debug line per hidden title. - `docs/environment-variables.md`: added only the new setting's rows. Running `scripts/generate_env_docs.py` on current `main` also changes unrelated lines (`SHELFMARK_API_KEY_READONLY`, the slskd anchor), so I left those alone. ## Tests - New `TestHideUnsupportedFormats` in `tests/prowlarr/test_source.py`: the extension helper (parametrised), audiobook bypass, comma-separated config, and a full `search()` with the setting on and off. - `tests/prowlarr`: 784 passed. Ruff lint/format, vulture and basedpyright on the changed files are clean. - Full suite on macOS: the same 84 bypass/entrypoint failures as on `main` (browser extra and Linux permissions), none new. I ran an earlier version of this as a local patch on v1.4.0 against a real Prowlarr + Zamunda setup: the `.doc` row is gone and epubs stay. Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
d42494c696 |
fix(tor): survive container restarts and run Tor as debian-tor (#1517)
With USING_TOR=true, any restart that reuses the container (docker
restart, a Docker daemon restart, a host reboot) put it in a restart
loop. Only recreating the container ended it.
Tor appends to /var/log/tor/notices.log, and the file survives the
restart. tor.sh waited for Tor by grepping that log for "Bootstrapped
100%", so the previous boot's line passed at once, before Tor had
connected to anything. The NAT rules then went live, Tor could not
finish bootstrapping behind them, the connectivity check could not
resolve check.torproject.org, and the next boot found the same stale
line. tor.sh now moves the previous log to notices.log.prev before it
starts Tor, so the wait and the watchdog only see this boot's output.
Tor could not finish behind the NAT rules because it ran as root. The
rules exempt only debian-tor's traffic from the transparent redirect, so
every relay connection Tor opened after they went live was redirected
into its own TransPort: the log shows dozens of TLS handshakes dying.
This also meant a Tor that lost its guard could never reconnect, on any
kernel. torrc now has `User debian-tor` and `DataDirectory
/var/lib/tor`. Tor still binds DNSPort 53 as root, then drops. It opens
its log after dropping and refuses to start if it cannot, so tor.sh
hands the fresh log to debian-tor first.
The check also failed without a word. `RESULT=$(curl -s ...)` under
`set -e` ended tor.sh with curl's exit status, so the only trace was
ExitCode=6 (could not resolve host) in `docker inspect`. A reply that
was not the expected JSON did the same through grep. The check now:
- retries twice, 10s apart, since a fresh circuit can fail its first
lookup;
- logs each failure with curl's exit status and error;
- says when it gives up and prints the last Tor log lines;
- still stops the container when traffic does not go through Tor.
- Reproduced on the v1.4.0 image (tor.sh is unchanged since then): after
one `docker restart` the container restarted 9 times in 150s, each
boot ending at "Verifying Tor connectivity...".
- With the new tor.sh mounted into the same image, the container went
through 2 restarts in a row. Each boot verified Tor and reached
gunicorn within 15-21s, and the restart policy never had to step in.
Tor runs as debian-tor and its logs belong to it.
- Restarting Tor (`supervisorctl restart tor`) once the NAT rules were
live, so it had to open new relay connections: as debian-tor it
bootstrapped again in 4s and traffic still went through Tor. As root
it had not bootstrapped after 120s, 1775 TLS handshakes had died, and
curl could not resolve check.torproject.org (exit 6).
- A SIGHUP, which the rotation monitor sends every 5 minutes, keeps
DNSPort 53 working after the drop to debian-tor.
- 9 new tests in tests/config/test_tor_script_rules.py. 8 of them fail
on the old tor.sh; the 9th checks that traffic outside Tor still stops
the container. Three need `grep -P` and skip on macOS, so I also ran
the file in the Debian image: 23 passed.
- The `make python-checks` tools pass (ruff check and format,
basedpyright on the app and tests, vulture). The non-e2e suite
passes: 4366 tests on
|
||
|
|
ceb23dda7c |
feat(clients): separate audiobook download directory for torrent clients (#1500)
## Summary Related to #1048 (covers the "separate book and audiobook locations" request, not per-category routing). Every download client already had a separate audiobook label/category, but the four torrent clients only had a single save directory, so books and audiobooks ended up mixed in the client's download folder. Each torrent client (qBittorrent, Transmission, Deluge, rTorrent) gets an opt-in **Separate Book and Audiobook Directories** toggle (`<CLIENT>_SEPARATE_DOWNLOAD_DIRS`, default off): - **Off (default):** unchanged. The single `<CLIENT>_DOWNLOAD_DIR` is used for everything, so existing setups behave exactly as before. - **On:** `<CLIENT>_DOWNLOAD_DIR_BOOK` and `<CLIENT>_DOWNLOAD_DIR_AUDIOBOOK` replace the shared field. A directory left empty means the client's own default; it never falls back to the shared directory or another Shelfmark setting. The content type was already passed to each client's `add_download`, so a small shared helper (`resolve_download_dir`) does the selection. Usenet clients are unchanged: their save location comes from the category configured in the client, and a separate audiobook category is already sent. ## Screenshots Default Setting <img width="817" height="271" alt="Screenshot 2026-10-20 at 14-54-26 Shelfmark" src="https://github.com/user-attachments/assets/29941f83-9034-4ea5-bcb2-8e91ce77e63a" /> Separate Locations <img width="817" height="425" alt="Screenshot 2026-10-20 at 14-54-58 Shelfmark" src="https://github.com/user-attachments/assets/772b7194-a072-4945-bac5-b6959550fd75" /> ## Not included Routing to many folders by document type (the main request in #1048) still only exists for Direct download via Content-Type Routing. Extending it to torrent and usenet sources needs a decision on what to route by. ## Testing - `pytest tests --ignore=tests/e2e` passes (3561 passed); ruff clean. The `tests/e2e/platform` suite needs a running cluster and was not run. - New unit tests for the helper (including no fallback to the shared directory) and a qBittorrent add test covering book vs audiobook directories. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
86943f5a77 |
chore: drop three unused imports that fail Python Quality (#1514)
Python Quality is failing on new PRs because of three unused imports on main (it did on #1513): `ipaddress` in `core/image_cache.py`, `threading` in `core/notifications.py` and `email.utils.parseaddr` in `download/orchestrator.py`. The code that used them changed in the last round of merges and the imports stayed behind. This is `ruff check --fix --select F401` on those three files and nothing else. Ruff, basedpyright and tests/core plus tests/download pass. |
||
|
|
621d14e1a9 |
fix(activity): put dismiss-many back together after the #1507 and #1508 merges (#1513)
#1507 and #1508 touch the same handler, and the merged result is wrong in two places. `effective_existing` is read before it is assigned, so a Clear Completed batch with any download in it answers 500. The ownership branches also lost their `continue`, so another user's item is no longer answered like a missing one (what #1507 added) and falls through to the rest of the checks. This puts #1507's ownership handling back and keeps #1508's skip of an item that is no longer finished. The tests that came with both already cover it: 12 of them fail on main right now and pass with this change. Ruff, basedpyright and tests/core pass (1880 passed). I flagged in #1508 that whichever of the two landed second needed a rebase, and I should have rebased mine after #1507 merged instead of leaving it for the merge. Sorry for the extra one. |
||
|
|
c3608dd3c9 |
build(deps): bump publicsuffixlist from 1.1.0.20261010 to 1.1.0.20261017 (#1509)
Bumps [publicsuffixlist](https://github.com/ko-zu/psl) from 1.1.0.20261010 to 1.1.0.20261017. <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/ko-zu/psl/commits">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
f837506017 |
Merge commit from fork
A signed-in user picks the release fields of POST /api/releases/download, and a record id with the "oceanofpdf:" prefix reached the provider without handles() or is_enabled(). The provider then fetched source_url, POSTed to the form action found on that page and fetched the meta-refresh target, with no check on any of them. The provider now refuses to run when it is switched off, and the book page, the form action and every POST redirect hop must be on the configured mirror (same scheme, host and port). The signed file link may sit on another host but must be http(s). network.ensure_public_destination refuses a host that resolves to a loopback, private, link-local or otherwise non-global address (IPv4-mapped IPv6 judged by its IPv4 address). Hosts the operator configured as mirrors and names that do not resolve pass as before. html_get_page and download_url call it on their first URL and check each redirect hop through a response hook. The image cache uses the shared address check too. Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
cb72ce807c |
Merge commit from fork
A user could set any value for their own overridable settings through
PUT /api/users/me. DESTINATION and DESTINATION_AUDIOBOOK accepted any
string, so a download (including one an admin fulfilled for that user)
could be written to any directory the container can reach, and
get_destination created it on demand.
A user's own destination must now resolve inside the global one (with
{User} expanded on both sides). Absolute paths outside it and any ".."
segment are rejected at save time, and get_destination applies the same
check when the path is used, so a stored or hand-written value outside
the global destination is ignored with a warning and the global
destination is used instead. A relative value is taken relative to the
global destination.
Other self-service values are checked as well: select fields must use
one of their options, EMAIL_RECIPIENT must be a plain address (the same
check the orchestrator and the downloads tab use, now shared from
request_helpers), and Grimmory library and path ids must be non-negative
integers. Admin saves on a user's behalf are unchanged.
The self-service 400 response now carries a message line so the reason
reaches the user in the toast.
Co-authored-by: CaliBrain <calibrain@l4n.xyz>
|
||
|
|
c269230ef3 |
fix: review regressions in metadata, notifications, activity redaction, search options and genDebug (#1510)
- **Open Library (#1451): keep the work unless the search matched a translation.** Open Library shows an English edition whenever one matches the query. So "Mistborn" returned the 2023 "Mistborn" reissue (2023) instead of "The Final Empire" (2001), and "Children of Dune" returned "Children of Dune (Dune Chronicles, Book 3)" (1987). The matched edition's title, ISBNs, cover, language and year now win only when the edition is in another language and the query doesn't name the work's own title. Checked against live Open Library: "Children of Dune" and "Mistborn" give the v1.4.0 results again, and "Der Weg der Könige" and "Kinder des Nebels" still return the German editions. - **Google Books (#1434): the ISBN cache decorator is back on `search_by_isbn`.** It had moved to the new `search_paginated`. Failed searches were cached as empty pages, and ISBN lookups lost their cache. - **Notifications: Test notification shows the plugin's failure reason again.** Apprise 2 delivers on its own worker threads, even for a single service when that service has a deadline. `_AppriseLogCapture` filtered records by thread id and dropped all of them, so the UI only said "json: delivery failed". Apprise runs those workers in a copy of the caller's context, so the capture now filters on a context variable. That still keeps concurrent dispatches apart. `AppriseAsset(async_mode=False)` would not fix this, because the sequential path also uses the worker pool when a service has a deadline. - **Activity: `activity_update` no longer sends the raw task id to non-admins.** The owner's `user_<id>` room got the raw task id. For a request-linked download that id can hold a private tracker's passkey. It now goes through `viewer_download_id`, the same mapping `/api/status` and `download_progress` use. The admins room still gets the raw id. - **SearchBar (#1476): Escape and an outside click close the homepage's inline options panel again,** as they did in v1.4.0. - **genDebug.sh: packages are listed through `importlib.metadata`,** since #1404 removed pip from the image. The script also now redacts: - `PROWLARR_MAM_ID` - `user:pass@` credentials in URLs (proxies), in both the environment and the config files - notification route URLs, which carry their service's token (Telegram, Discord and others) - `make python-checks`, `make python-test`, `make frontend-checks` and `make frontend-test` pass on top of current `main`. - New tests cover: - Open Library edition selection - Google Books caching - log capture against a real Apprise 2 delivery to a local server that answers 500, plus a concurrent dispatch on another thread - the `activity_update` payload sent to each room - genDebug redaction and the package listing Each one fails on the old code. - I checked the SearchBar fix in the running app, because the frontend has no DOM test setup: Escape closes the panel, an outside click closes it, and a click inside keeps it open. - I ran the genDebug redaction under GNU sed (Debian image) and BSD sed. The package listing ran in the pip-less image. |
||
|
|
a00f3d28bf |
fix(slskd): refuse unsafe peer paths, keep queued downloads alive, report search outages (#1512)
Fixes four defects in the Soulseek (slskd) A peer names its own files, and Shelfmark works out where slskd stored one from the last folder and the file name. `remote_directory_name` returned the whole directory when its last segment was empty. So `../../../etc//passwd.epub` or `/abs/path//book.epub` resolved outside the downloads folder, and Shelfmark imported whatever was there. For a multi-file release it moved those files into staging (`STAGE_MOVE`). - New `safe_remote_segments` refuses a name with an empty, `.` or `..` segment (which covers absolute and UNC paths), a NUL, or a drive anywhere but a Windows share root (`C:\Books\…`, which never reaches a local path). - Search (`iter_peer_files`, so `build_releases`) drops such files. - `download` refuses them before anything is queued, in both modes. The spec arrives with the queued release payload, so search filtering alone is not enough. - `local_path_for` also refuses a path that resolves outside the root (`resolve()` + `is_relative_to`), for example through a symlinked folder. `_poll`, used when isolation is off and as the fallback for slskd < 0.26, never asked for an activity grace. A file "Queued, Remotely" sent the same status and progress on every poll, so the orchestrator cancelled it after 300s and `SLSKD_QUEUE_TIMEOUT_MINUTES` never applied. It now requests, renews and releases the grace the same way isolated mode does. `search` caught every exception per query, so slskd being down or rejecting the API key showed as "no releases". When no query gets an answer it now raises `SourceUnavailableError`, as Prowlarr does, and the error reaches the user. One failed query among answered ones is still not an outage. A retry reuses the task's folder, and slskd renames a new file when one is already there. Files from a failed attempt therefore meant `_folder_complete`'s exact count could never match again. Now: - a failed or cancelled attempt removes its folder; - a new attempt removes any finished files an earlier one left (for example after a restart) before it queues the batch. `tests/slskd/conftest.py` stubbed `flask_socketio` whenever it had not been imported yet, even though it is installed. Running `pytest tests/slskd tests/` therefore broke the Flask app tests in the same worker (285 errors, also on |
||
|
|
49aeec97cd |
fix(download): stop deleting user data and losing completed downloads (#1511)
Fixes six defects. Each one breaks downloads or deletes user data, and each has a regression test that fails on |
||
|
|
520b6b16d0 |
fix(activity): Clear Completed leaves out an item that is no longer finished instead of failing the batch (#1508)
Clear Completed can fail outright with "Only terminal requests can be dismissed". `dismiss-many` answers 409 and dismisses nothing when any one request or download in the batch is not terminal. The list a user clears from can be older than the server, so a request that was reopened or retried since, or a download that started again, takes the whole batch down with it. The earlier fix for pending requests (#1438) filters on the client, which only helps when the list is current. `dismiss-many` now skips such an item and carries on with the rest. The response adds `skipped_item_keys` when something was left out, and `count` is what was actually dismissed. A single `dismiss` of a non-terminal item still answers 409. I hit it with a request whose download had completed while the request itself was still pending, but any reopen between the list and the click does it. This touches the same handler as #1507, so whichever lands second needs a small rebase. Tests: a batch with a finished and a reopened request dismisses the finished one and reports the other, and a batch with a finished and a running download does the same. Ruff, basedpyright and the backend suite pass (3933 passed, e2e excluded). Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
61c7ad3c62 |
Merge commit from fork
* fix(torrent): check each redirect hop when fetching a torrent file The torrent file fetch followed redirects by hand without looking at where a hop pointed, so a download link could make the server request a loopback, link-local or LAN address. Each hop (the initial URL and every redirect Location) must now be http or https and resolve only to global addresses. The configured Prowlarr/Newznab origin is exempt, as it usually lives on the LAN. The API key still only goes to that origin. * fix(socketio): only accept websocket handshakes from the app's own origin The Socket.IO server allowed every origin. It now uses the same-origin check python-engineio applies by default (Host, or X-Forwarded-Proto and X-Forwarded-Host behind a proxy). SOCKETIO_ALLOWED_ORIGINS takes a comma separated list of extra origins for proxies that change Host without forwarding it. * fix(custom-script): do not pass a file name that starts with a dash as the first argument In relative path mode the script got the organized file's relative path as its first argument, which many scripts read as an option when the name starts with a dash. Such a name is now passed with a ./ prefix. Absolute mode is unchanged. |
||
|
|
8ec9db49da |
Merge commit from fork
The request line sent to the book bot comes from the request-supplied source_id and was written to the socket as-is, so a line break in it sent extra IRC commands as the operator's nick. IRCClient._send, the single writer, now raises IRCError on any control character (CTCP 0x01 excepted), the download handler rejects such a request line with a clear error before connecting, and search refuses a query that contains one. |
||
|
|
6f65d6e20a |
Merge commit from fork
A release format such as /../../x was appended to the staging file name unchanged, so the direct-download and libgen handlers could write to, and on cancel unlink, a path outside TMP_DIR. Normalise the format to a plain extension at queue time and in build_filename, reject path-like source ids for the sources that use them as file names, and make both handlers resolve the staging path and refuse anything that is not a direct child of TMP_DIR. |
||
|
|
89663e32f6 |
Merge commit from fork
A user's personal notification routes were sent to any Apprise URL, from the server. Through the test endpoint or a saved route a signed-in user could make the server POST to loopback, link-local and LAN hosts, choosing the path and, with Apprise's + and : parameters, extra headers and body fields. User routes are now limited to the hosted services that talk to a fixed vendor host (discord, slack, tgram, pover, pbul) and to ntfy and gotify, whose host must resolve only to public addresses (checked on the host urlsplit reads and on the host Apprise reads, including IPv4-mapped and numeric forms). The check runs when a route is tested, when an event is queued and again when it is sent. Admin routes are unchanged. |
||
|
|
d34b200414 |
fix(activity): answer another user's item like a missing one, and skip foreign history rows (#1507)
Two small fixes in `activity_routes.py`. **Another user's item answers like a missing one.** Dismissing a task or request id answered 404 when it didn't exist and 403 when it belonged to someone else, so a user could test whether an arbitrary id exists. A non-admin now gets the same 404 for both. In dismiss-many a foreign key is reported with the missing ones and the rest carry on, and the owner is still written to the log. Admins are unchanged. **A foreign row in someone's viewer state no longer gives a 500.** If a non-admin's viewer state referenced another user's download or request row, building history raised a `RuntimeError`. The row is now skipped with a warning. Not changed: history still raises when a row that viewer state points to has been deleted. That is a different case, and I didn't want to widen this. Tests: the existing forbidden test now expects the 404 and the log context, and four new ones cover a foreign download and a foreign request answering like a missing one (including dismiss-many), an admin still dismissing a foreign row, and history skipping foreign rows. Ruff, basedpyright and the backend suite pass. |
||
|
|
8fd477bf50 |
fix(releases): apply the request policy to release listing, not only to download (#1506)
The request policy is applied when a user downloads (`/api/releases/download`) or requests (`/api/requests`), but not when they list releases. A user whose mode is `request_book` or `blocked` can still search releases and list a torrent's files through the shared Prowlarr and qBittorrent credentials. Only the UI hides the list. This applies the same gate to `/api/releases`, `/api/releases/inspect` and the release-source records route, with the same codes as the download route (`policy_blocked`, `policy_requires_request`, `required_mode`). - `blocked` and `request_book` are refused. `request_release` is allowed, because that mode lists releases so the user can pick one. The UI opens the request dialog directly under `request_book` and never calls `/api/releases` there. - `/api/releases` resolves the mode per source for the content type. A refused source is dropped from the search, so a user blocked on Prowlarr no longer reaches Prowlarr even when other sources are allowed. It answers 403 only when no source is left, or when the one source asked for is refused. - The records route doesn't know the content type before it fetches, so it refuses only when every content type the source supports is refused. - Admins, auth mode `none` and an instance with requests off bypass the gate, as they do on the download route. A user whose default is `blocked` now gets a 403 toast in the release modal, where they used to get a list of "Unavailable" rows. I made no frontend change. Tests (14, new file) cover each route for blocked, request_book, request_release, an admin, and auth mode none, the per-source drop, and the records route. Ruff, basedpyright and the backend suite pass. Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
b05bbc8c58 |
fix(covers): key the cover cache by the image URL, not the caller-supplied id (#1505)
`/api/covers/<id>?url=...` cached the fetched image under the id in the path, and the caller chooses that id. A request with another book's id and a different URL put its image in that book's cache entry, and every user then got it. The key is now derived on the server from the image URL (a hash of it), and the id in the path stays only so links keep their shape. The SSRF checks and `fetch_and_cache` are unchanged, and `transform_cover_url` links already carry the URL, so they keep working. The URL is decoded first now, so a missing one is a 404 and bad encoding a 400, both before any fetch. I made the key the URL alone, not URL plus id. Either stops the overwrite, and the URL alone lets one image be shared when the same cover appears under two ids (the viewer redaction rewrites ids and still hits the cache). Entries cached under the old keys are not read any more, since there is no telling which were overwritten. They age out of the LRU and the cache warms once after the upgrade. Tests: a request with another id can't replace the legitimate image, in either order; the normal miss then hit; the same URL under two ids hits; no URL gives 404; bad encoding gives 400 without a fetch; and a unit test for the key. Ruff, basedpyright and the backend suite pass. |
||
|
|
71cd030484 |
Merge commit from fork
GET /api/users/me/edit-context served every user-overridable key with the admin's global value in globalValues and effective, so any user could read the global destination paths, the admin's EMAIL_RECIPIENT, the Booklore library and path ids and the global USER_NOTIFICATION_ROUTES table, whose Apprise URLs embed tokens. build_user_preferences_payload gains a for_self_service mode that replaces a global value with None unless the user set the key themselves or the field is a checkbox, number, select or multi-select switch the form needs to lay itself out (BOOKLORE_LIBRARY_ID and BOOKLORE_PATH_ID are masked despite being selects). The self-service route uses it; the admin routes keep full data. |
||
|
|
386fdb313c |
Merge commit from fork
GET /api/debug returns a bundle with application logs, process listings and environment names, and GET /api/restart exits the process. Both are registered only when DEBUG is on, but any logged-in user could call them. Add an admin_required decorator built on login_required and use it for both routes. Non-admin sessions get 403 "Admin access required"; authentication mode "none" keeps working as before. |
||
|
|
7da4669cc1 |
feat(prowlarr): hide ebook results above a maximum size (#1504)
Closes #844. A new Prowlarr setting, Maximum Ebook Size (MB). Ebook results above it are hidden from the release list. The default is 0, which shows everything as it does today. This is the idea from the issue. The filetype check suggested in the comments is a different change (#1490 has one for Prowlarr), and it doesn't catch a TV series or a software bundle that ships as a plain archive, which is what a size limit does. - A result with no reported size is always shown. - A result exactly at the limit is shown. - Audiobook searches are never limited, since they are big by nature. - A non-numeric value counts as no limit. The filter runs on the raw Prowlarr result before it is turned into a release, so a hidden result never reaches the sort or the release cache. Tests cover no limit, zero, over the limit, exactly at it, no size, audiobook searches and a bad value. Ruff, basedpyright and the backend suite pass. I added the entry to `docs/environment-variables.md` by hand because running the generator also changes unrelated parts of that file. |
||
|
|
f2269aa201 |
feat(audiobookbay): seed time and ratio settings (#1503)
Closes #1037. Two new AudiobookBay settings, Seed Time (minutes) and Seed Ratio. Both default to 0, which leaves the torrent client's own limit as it is today, so nothing changes until someone sets them. They go to the client with the magnet the same way the Prowlarr seed preferences do (`DownloadRequest.seeding_time_limit` and `ratio_limit`), so they apply with the clients that already take per-torrent limits there: qBittorrent, Transmission and Deluge. A retry that reuses the saved magnet carries them too. A value that isn't a positive number (text, negative, NaN, inf) is ignored and the client's limit stays. Tests cover reading both settings (unset, zero, each on its own, text values, bad values) and that both the fresh and the cached-magnet request carry them. Ruff, basedpyright and the backend suite pass. I haven't tried it against a live client, since the client side is the code Prowlarr already uses. I added the two entries to `docs/environment-variables.md` by hand. Running `scripts/generate_env_docs.py` here also changes unrelated parts of that file (the Soulseek table of contents link and the `SHELFMARK_API_KEY_READONLY` entry), so I left those alone. |
||
|
|
77b80eb31a |
fix(metadata): only an admin may use the provider's own account, its lists and shelves (#1501)
Refs #981. Hardcover is signed in as one account, the instance owner's, and every logged-in user shares it. A non-admin can see the owner's lists and shelves in the List filter, browse one by asking for it, and add or remove books and change read status from search results, which is what #981 describes. Now only an admin may. With authentication set to none the one user keeps everything. - `GET` targets and the batch lookup return no options for a non-admin, so the buttons don't show and the account isn't asked. - `PUT` targets answers 403. - The List filter (`hardcover_list`) has no options for a non-admin, and a request that asks for it has the field dropped before the search. Providers name these fields in `account_search_fields`, and Hardcover lists `hardcover_list`. - Public things are unchanged: author, title and series suggestions, and a pasted list URL in the search box. That pasted URL is the one gap I know of. It resolves any list the account can see, so a user who knows the slug of one of the owner's private lists could still open it. Closing it means the provider has to know who is asking, which is a bigger change than this one, so I left it. Not included from the issue: a toggle for letting users view lists and limiting which lists they see. I kept this to the admin-only part so it stays small, and I can do the toggle as a follow-up if you want it. Tests cover the routes as an admin, a user and with no authentication (targets read, batch and write, list options, a crafted list search, and public fields still passing). Ruff, basedpyright and the backend suite pass. Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
82c8c91c8b |
refactor(clients): read the stall window with a type check instead of a pyright ignore (#1498)
The only `pyright: ignore[reportArgumentType]` in `shelfmark/` is one I added in #1426, and I was being lazy when I did. I hit the same error on another PR and replaced the ignore there with a real check, so this does the same for the original. `_stall_window_seconds` reads the setting as an `object`. It now narrows to int, float or str before calling `float()`, and a bad string falls back to the default as before. A non-numeric value of another type (None, a list) falls back to the default too, which used to happen through a `TypeError`. No behaviour change. The existing range test still passes and I added `None` and a list to it. basedpyright is at 0 errors, ruff is clean and the backend suite passes. Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
e83bab9337 |
feat(clients): give up on a torrent with no seeders (#1494)
A torrent with no seeds won't finish. It runs on the pieces its few
peers hold and then sits still, and nothing says so until the stall
timer ends it. The card only reads "downloading". I run AudiobookBay
releases, which show no seed count in the listing, so the client is the
only place to find out.
Two new settings, both off until you turn them on:
`TORRENT_NO_SEEDERS_WAIT` (minutes, 0 turns it off) and
`TORRENT_MIN_SEEDERS` (default 1).
- A torrent that has fewer seeds than the minimum for the whole wait,
while nothing is downloading, is removed from the client with its data
and the task ends as an error.
- A torrent with no seed at all for the wait is given up on even while
it still moves.
- A torrent that met the minimum and lost seeds down to one, but is
still moving, keeps going.
- The card shows the seed count beside the progress, with a countdown
while it waits ("0 seeds, giving up in 4m").
qBittorrent only, because it reports connected and tracker seed counts.
Other clients report none and are left to the stall timer, and an
unknown count is not read as zero. A torrent that was already in the
client when the download started is never removed, and a queued torrent
isn't judged.
Tests cover the wait and countdown, the clock restarting on progress,
the tracker count, a higher minimum, off by default, a client with no
counts, a preexisting torrent, a queued torrent, and the moving cases.
Ruff and the backend suite pass.
|
||
|
|
9ba5816b83 |
fix(requests): an older failed attempt no longer undoes a later delivery (#1493)
A request that was retried after a failure has two tasks in the status built from download history. `sync_delivery_states_from_queue_status` walks the status buckets in `QueueStatus` order and keeps the last one it sees for a request. Error comes after complete, so a request that was delivered by its retry is set back to error and, when no retry is left, reopened as pending. The next pass can then fetch the book again. When a request has more than one task, an attempt that is still running now decides its state, else a completed one, else the failure. Ties keep the old order, so a request with a single failed task still reopens as before. Tests: an earlier failure doesn't undo a later delivery, a running retry outranks an earlier failure, and a lone failure still reopens. It happened on my instance to a request whose first try failed and whose retry succeeded. Ruff and the backend suite pass. |
||
|
|
a1ac017487 |
feat(requests): let an admin reopen a rejected request (#1491)
Closes #1445, where you said you were open to it. A rejected request was final. `update_request` won't move a terminal status and the admin routes only fulfil or reject, so an admin who changed their mind had to ask the user to request the book again, and the user kept seeing the old rejected one. `POST /api/admin/requests/<id>/reopen` moves a rejected request back to pending and clears the review fields. What the user asked for (request level, release, note) is kept. It refuses anything that isn't rejected, and refuses when that user already has a pending request for the same book. Admins get a Reopen action on rejected cards in the activity sidebar and in History. A rejected request has usually been cleared from the list by the time anyone wants it back, so reopening also clears the dismissal, the way the failed-download reopen does. Without that the pending request stays hidden. Tests cover the service (state change, what is kept, the refusals, a non-string admin note) and the route, and the card model for the new action. Ruff, tsc, oxlint, vitest and the backend suite pass. It has been running on my instance since Oct 8. |
||
|
|
88cc734db2 |
fix(activity): a reused release follows the new request, and stale rows of a delivered request are closed (#1496)
Two things that go wrong when a second request picks a release a first request already used. A task id comes from the release, so the history row is reused. **The row stays with the first request.** Recording a download kept the first request's id, notes and state. On my instance a card for one book showed up under the request for a different book, with that request's note on it. Recording a download now moves the row to the request that queued it and restarts its queue time. A retry with no request keeps the request the row had. **Old rows of a delivered request show as failures forever.** The startup sweep leaves an old request-linked row alone so its retry stays, but one whose request already has its book (delivered, or another download of it finished) is now closed as "Superseded by a completed download" instead of showing as an interrupted failure for ever. Also in the first commit: History cards used the saved cover URL as it was, an external address the page's own-origin image policy blocks, while running downloads use the cover proxy. They use it too. The second commit is about restarts. After a restart nothing is in flight, but a request in downloading, resolving or locating whose row had moved to another request was stranded, because only queued was reopened. Those states are reopened too. Tests cover the row takeover and the retry case, the cover through the proxy (and a missing cover), the superseded cases (delivered request, another row finished, an undelivered request is left alone) and the in-flight states with no row. Ruff and the backend suite pass. |
||
|
|
06a67a7150 |
feat(download): a concurrency limit per source (#1495)
With one global limit, a few tasks that are only waiting hold every slot. A Soulseek download sitting in a peer's queue is the example I hit: three of those and a torrent that could start waits behind them. `MAX_CONCURRENT_DOWNLOADS_PER_SOURCE` (0 keeps the single global limit, which is the default). With it set, the coordinator starts a download only when its source is below the limit and passes over tasks of a full source without losing their place in the queue. `get_next` gets an optional filter for this, and a cancelled task is still dropped when one is given. The start-up stagger now applies only between downloads from the same source, and the pool is sized so every source can reach its limit. The second commit: qBittorrent keeps its own queue of torrents waiting for a free slot. The task polling one of those does no work, so it no longer counts against its source's limit and the next task of that source can start. The client does the pacing, as it does for its own queue. Tests cover the queue pass-over (order and priority kept, nothing eligible, cancelled tasks), the coordinator (a full source doesn't block the others, each source has its own limit, the global limit when unset) and the client-queue case. Ruff and the backend suite pass. |
||
|
|
e8297c94a9 |
fix(ui): the browser tab follows the search page title (#1492)
The tab title is always `Shelfmark`, even when `SEARCH_PAGE_TITLE` is set, so a renamed instance still shows the old name in tabs and bookmarks. This sets `document.title` from the config when it loads and falls back to `Shelfmark` when the setting is empty. Two lines in `App.tsx`, no new setting. No test for it, since nothing in the app tests `document.title` today. Tsc, oxlint and vitest pass. |
||
|
|
3b5afb1a04 |
Merge commit from fork
PUT /api/users/me set a new password from the password field alone, so a live session could replace the password and lock the owner out. A builtin user now has to send current_password with it, checked against the stored hash. A wrong or missing one is a 400, and counts toward the same lockout as a failed login (a locked account gets a 429 without being checked), so the endpoint cannot be used to guess the password. A password or current_password that is not a string is a 400. A password that was not a string raised a TypeError from len() and answered 500. The account form asks for the current password when a new one is typed. Profile and settings changes without a password are unchanged. |
||
|
|
10710abd4e |
fix(download): send every file of a multi-file download to the browser (#1489)
Download to Browser only ever sent the first file of a multi-file release (audiobook chapters, packs): the folder output returned final_paths[0] and /api/localdownload served that one path. The folder output now keeps every final path on the in-memory task (download_paths), and /api/localdownload streams them as one uncompressed ZIP named after the book when there is more than one. The archive is never staged on disk or held in memory, and ZIP64 covers large audiobooks. History still stores only the first path, so a re-download from history after a dismiss or restart serves a single file, as before. Also brings every linter back to green on all files: - pre-commit: bump the ruff hook to v0.17.1 to match uv.lock; ruff-format the Python examples in docs/dev and skills - ruff: fix the remaining issues in skills/shelfmark/download_books.py; format base_handler.py - basedpyright: Optional and attrs errors in databazeknih.py - knip: drop 31 unused exports, reuse ColumnColorHint in colorMaps - oxfmt 0.72: styles.css - direct download: fix the "Welib, mirrors" typo and the test that still expected the pre-OceanofPDF message Fixes #1467 |
||
|
|
3025f120eb |
build(deps): bump the python-deps group across 1 directory with 10 updates (#1487)
Bumps the python-deps group with 10 updates in the / directory: | Package | From | To | | --- | --- | --- | | [flask-socketio](https://code.miguelgrinberg.com/miguelgrinberg/flask-socketio) | `5.6.1` | `5.7.0` | | [dnspython](https://github.com/rthalley/dnspython) | `2.8.0` | `2.9.0` | | [qbittorrent-api](https://github.com/rmartin16/qbittorrent-api) | `2026.8.1` | `2026.10.0` | | [authlib](https://github.com/authlib/authlib) | `1.8.0` | `1.9.1` | | [apprise](https://github.com/caronc/apprise) | `2.0.0` | `2.0.1` | | [publicsuffixlist](https://github.com/ko-zu/psl) | `1.0.2.20260925` | `1.1.0.20261010` | | [seleniumbase](https://github.com/seleniumbase/SeleniumBase) | `4.54.12` | `4.56.2` | | [basedpyright](https://github.com/detachhead/basedpyright) | `1.40.1` | `1.40.2` | | [prek](https://github.com/j178/prek) | `0.5.4` | `0.5.5` | | [ruff](https://github.com/astral-sh/ruff) | `0.16.9` | `0.17.1` | Updates `flask-socketio` from 5.6.1 to 5.7.0 Updates `dnspython` from 2.8.0 to 2.9.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rthalley/dnspython/releases">dnspython's releases</a>.</em></p> <blockquote> <h2>dnspython 2.9.0</h2> <p>This release fixes a potential <a href="https://github.com/rthalley/dnspython/security/advisories/GHSA-45c3-73f7-pv4m">excessive CPU consumption</a> issue. Thanks to Evgenios Gkritsis, Constantinos Patsakis, and George Stergiopoulos, for discovering and reporting this issue.</p> <p>See <a href="https://dnspython.readthedocs.io/en/stable/whatsnew.html">What's New</a> for details.</p> <p>The minimum supported version of Python is 3.11.</p> <p>My thanks to the many people who have contributed to this release. Also thanks to my co-maintainers: Nicki Křížek, Petr Špaček, and Brian Wellington.</p> <p>This release was published to PyPI using Trusted Publishing.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rthalley/dnspython/blob/main/doc/whatsnew.rst">dnspython's changelog</a>.</em></p> <blockquote> <h2>2.9.0</h2> <ul> <li> <p>Decompression chain length is limited to 16. Prior to this change, a maliciously crafted DNS message could cause dns.name.from_wire_parser() to use excessive CPU for DNS name decompression. Applications which processed untrusted DNS wire form messages with dnspython could be degraded or DoS'd by the extra CPU use required.</p> <p>Thanks to Evgenios Gkritsis, Constantinos Patsakis, and George Stergiopoulos for finding and reporting this issue.</p> <p>See <a href="https://github.com/rthalley/dnspython/security/advisories/GHSA-45c3-73f7-pv4m">https://github.com/rthalley/dnspython/security/advisories/GHSA-45c3-73f7-pv4m</a></p> </li> <li> <p>Httpx2 has replaced httpx for HTTPS TCP connections.</p> </li> <li> <p>The minimum supported Python version is now 3.11.</p> </li> <li> <p>DNSSEC now supports ML-DSA-44, a post-quantum signature algorithm.</p> </li> <li> <p>The NSEC3 Next Hashed Owner Name in presentation format is now decoded as base32hex (RFC 5155 Section 1.3, RFC 4648 Extended Hex Alphabet). The letters W, X, Y, and Z are not in that alphabet; they used to be accepted and silently decoded to a different owner name, so <code>to_text</code> of the result did not match the input. They are now rejected.</p> </li> <li> <p>The NID and L64 node/locator ids in presentation format are now rejected when a group contains anything other than hex digits. A sign or underscore, which <code>int()</code> silently accepts, produced a record whose text form did not parse back the same way (RFC 6742).</p> </li> <li> <p>Rdata of a known type in the generic <code>\#</code> syntax, such as an NS record in a zone file, no longer fails to parse when it contains a name under the origin. Its names are relativized as in the type's own text form.</p> </li> <li> <p>The SVCB and HTTPS <code>ech</code> parameter value must now be an ECHConfigList with a correct length prefix and at least 4 octets of content (RFC 9848, RFC 9849). The individual ECHConfig structures are not checked.</p> </li> <li> <p>SVCB and HTTPS SvcParamKeys in presentation format, including those listed in <code>mandatory</code>, must now be spelled as RFC 9460 requires: 1-63 lowercase letters, digits, or hyphens. Uppercase keys such as <code>ALPN</code> and keys with underscores such as <code>no_default_alpn</code> are rejected.</p> </li> <li> <p>SVCB and HTTPS presentation format parsing now follows the escaping rules of RFC 9460. SvcParamKeys may not contain escapes (e.g. <code>\097lpn=h2</code>), and in comma-separated values (<code>alpn</code>, <code>docpath</code>) only <code>\,</code> and <code>\\</code> are valid escapes after character-string decoding (e.g. <code>alpn="h2\\x"</code> is rejected).</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rthalley/dnspython/commit/e790c8f20a67ad439c7aafef2321e161c6028eee"><code>e790c8f</code></a> add missing test file</li> <li><a href="https://github.com/rthalley/dnspython/commit/b72af6723fa0df2113522132363eeda99c9abaa6"><code>b72af67</code></a> CI release branch update</li> <li><a href="https://github.com/rthalley/dnspython/commit/bdd62fed595a80b65feac75d7c2e1e3b908c56e6"><code>bdd62fe</code></a> release prep</li> <li><a href="https://github.com/rthalley/dnspython/commit/bafc96391dc352832fb17cc7939782735b642fb8"><code>bafc963</code></a> Merge branch 'decompression-limit'</li> <li><a href="https://github.com/rthalley/dnspython/commit/c5fecf515b4fa3a12e882bf80da232c94134cf50"><code>c5fecf5</code></a> release tidying</li> <li><a href="https://github.com/rthalley/dnspython/commit/c7686f3ef513d0da121f57fe1899bf2a2997da35"><code>c7686f3</code></a> update dependencies</li> <li><a href="https://github.com/rthalley/dnspython/commit/3c855c8d8f8269eb672aef3679cd2e33db924c03"><code>3c855c8</code></a> more type lint</li> <li><a href="https://github.com/rthalley/dnspython/commit/52815c91bbd831f6cbe85ed7bba4d7b8e1c25400"><code>52815c9</code></a> type lint</li> <li><a href="https://github.com/rthalley/dnspython/commit/f563427fecd9c0c4ba60cf002f2f33a5c396dd2a"><code>f563427</code></a> lint</li> <li><a href="https://github.com/rthalley/dnspython/commit/b485e460c266540a1a09ca6d8d1d7b685b1d3023"><code>b485e46</code></a> Limit decompression to a chain length of at most 16 pointers.</li> <li>Additional commits viewable in <a href="https://github.com/rthalley/dnspython/compare/v2.8.0...v2.9.0">compare view</a></li> </ul> </details> <br /> Updates `qbittorrent-api` from 2026.8.1 to 2026.10.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/rmartin16/qbittorrent-api/releases">qbittorrent-api's releases</a>.</em></p> <blockquote> <h2>release-2026.10.0</h2> <h2>What's Changed</h2> <h3>Features</h3> <ul> <li>feat: add Web API v2.16.0 endpoints (qBittorrent v5.3.0) by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/659">rmartin16/qbittorrent-api#659</a></li> <li>feat: add Web API v2.16.2 endpoints (qBittorrent v5.3.0beta1) by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/678">rmartin16/qbittorrent-api#678</a></li> <li>feat: support qBittorrent v5.2.4 and v5.3.0rc1 by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/686">rmartin16/qbittorrent-api#686</a></li> </ul> <h3>Chores</h3> <ul> <li>Bump pre-commit hook for mirrors-mypy from v2.3.0 to v2.3.1 by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/677">rmartin16/qbittorrent-api#677</a></li> <li>Bump the github-actions group with 2 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/674">rmartin16/qbittorrent-api#674</a></li> <li>Bump the uv group with 6 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/675">rmartin16/qbittorrent-api#675</a></li> <li>Bump pre-commit hook for ruff-pre-commit from v0.16.1 to v0.16.5 by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/676">rmartin16/qbittorrent-api#676</a></li> <li>Bump soupsieve from 2.8.4 to 2.9 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/679">rmartin16/qbittorrent-api#679</a></li> <li>Bump anyio from 4.13.0 to 4.14.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/680">rmartin16/qbittorrent-api#680</a></li> <li>Bump pre-commit hook for ruff-pre-commit from v0.16.5 to v0.16.9 by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/683">rmartin16/qbittorrent-api#683</a></li> <li>Bump the github-actions group with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/681">rmartin16/qbittorrent-api#681</a></li> <li>Bump the uv group with 5 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/682">rmartin16/qbittorrent-api#682</a></li> <li>build(deps): bump virtualenv from 21.4.2 to 21.7.13 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/685">rmartin16/qbittorrent-api#685</a></li> </ul> <h3>CI</h3> <ul> <li>refactor(tests): parametrize test_add_delete and fix dead assertions by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/662">rmartin16/qbittorrent-api#662</a></li> <li>refactor(tests): derive an endpoint catalog and test the API surface from it by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/663">rmartin16/qbittorrent-api#663</a></li> <li>docs(tests): explain how the test suite works by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/664">rmartin16/qbittorrent-api#664</a></li> <li>refactor(tests): stop testing each camelCase alias over the network by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/665">rmartin16/qbittorrent-api#665</a></li> <li>fix(tests): make webseed checks survive a busy qBittorrent by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/667">rmartin16/qbittorrent-api#667</a></li> <li>refactor(tests): extend the catalog to interface spellings by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/666">rmartin16/qbittorrent-api#666</a></li> <li>refactor(tests): remove the gate twins the catalog now covers by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/669">rmartin16/qbittorrent-api#669</a></li> <li>refactor(tests): catalog torrent objects and drop the last gate twins by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/670">rmartin16/qbittorrent-api#670</a></li> <li>refactor(tests): add eventually() and migrate test_search to it by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/671">rmartin16/qbittorrent-api#671</a></li> <li>refactor(tests): finish the eventually() migration and delete check() by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/672">rmartin16/qbittorrent-api#672</a></li> <li>test(tests): fail any test that leaves state behind in qBittorrent by <a href="https://github.com/rmartin16"><code>@rmartin16</code></a> in <a href="https://redirect.github.com/rmartin16/qbittorrent-api/pull/673">rmartin16/qbittorrent-api#673</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/rmartin16/qbittorrent-api/compare/v2026.8.1...v2026.10.0">https://github.com/rmartin16/qbittorrent-api/compare/v2026.8.1...v2026.10.0</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/rmartin16/qbittorrent-api/blob/main/CHANGELOG.md">qbittorrent-api's changelog</a>.</em></p> <blockquote> <h3>v2026.10.0 (03 oct 2026)</h3> <ul> <li>Advertise support for qBittorrent v5.2.4 (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/686">#686</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/6580e6caf21a2b3360645e7605e35c47106db833"><code>6580e6c</code></a> bump to v2026.10.0</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/59b64b0d7b451a5d1ef6b2a4136f4368e0a9fd1b"><code>59b64b0</code></a> feat: support qBittorrent v5.2.4 and v5.3.0rc1 (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/686">#686</a>)</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/9016912a7c448cb85d19620301fcacd2023e310d"><code>9016912</code></a> build(deps): bump virtualenv from 21.4.2 to 21.7.13 (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/685">#685</a>)</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/e37548189948ef2feff614c646b4e88f24a023ab"><code>e375481</code></a> Bump the uv group with 5 updates (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/682">#682</a>)</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/6a9f89e98a74a63c5fbadd39face86963af2e027"><code>6a9f89e</code></a> Bump the github-actions group with 3 updates (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/681">#681</a>)</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/b08a1c8d7cafba855cc3b8158add4f2f32014a1c"><code>b08a1c8</code></a> Bumped pre-commit hook for ruff-pre-commit from v0.16.5 to v0.16.9 (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/683">#683</a>)</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/13fcfb9a6867f3889c180e173f7be1b2806de747"><code>13fcfb9</code></a> Bump anyio from 4.13.0 to 4.14.2 (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/680">#680</a>)</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/ea53fb27df0bb3108868def3a453003d2b2ab97a"><code>ea53fb2</code></a> Bump soupsieve from 2.8.4 to 2.9 (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/679">#679</a>)</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/9972fbb319c4570f1548c88faa7316d624cec8cc"><code>9972fbb</code></a> feat: add Web API v2.16.2 endpoints (qBittorrent v5.3.0beta1) (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/678">#678</a>)</li> <li><a href="https://github.com/rmartin16/qbittorrent-api/commit/9457fc5b45a6e49ded846887ffd202557c061e48"><code>9457fc5</code></a> Bumped pre-commit hook for ruff-pre-commit from v0.16.1 to v0.16.5 (<a href="https://redirect.github.com/rmartin16/qbittorrent-api/issues/676">#676</a>)</li> <li>Additional commits viewable in <a href="https://github.com/rmartin16/qbittorrent-api/compare/v2026.8.1...v2026.10.0">compare view</a></li> </ul> </details> <br /> Updates `authlib` from 1.8.0 to 1.9.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/authlib/authlib/releases">authlib's releases</a>.</em></p> <blockquote> <h2>v1.9.1</h2> <p>Changelog: <a href="https://docs.authlib.org/en/stable/upgrades/changelog.html#changelog-1-9-1">https://docs.authlib.org/en/stable/upgrades/changelog.html#changelog-1-9-1</a></p> <h2>What's Changed</h2> <ul> <li>Use scriv to handle the changelog by <a href="https://github.com/azmeuk"><code>@azmeuk</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/954">authlib/authlib#954</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/authlib/authlib/compare/v1.9.0...v1.9.1">https://github.com/authlib/authlib/compare/v1.9.0...v1.9.1</a></p> <h2>v1.9.0</h2> <h2>What's Changed</h2> <ul> <li>feat: add Identity Assertion JWT Authorization Grant (ID-JAG) by <a href="https://github.com/BinoyOza-okta"><code>@BinoyOza-okta</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/898">authlib/authlib#898</a></li> <li>Fix empty signatures validation in JWS JSON deserialization by <a href="https://github.com/loporto"><code>@loporto</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/938">authlib/authlib#938</a></li> <li>fix(jose): reject boolean values for NumericDate claims by <a href="https://github.com/cpruijsen"><code>@cpruijsen</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/942">authlib/authlib#942</a></li> <li>fix(client): avoid duplicated OAuth 1.0 parameters in signed requests by <a href="https://github.com/cpruijsen"><code>@cpruijsen</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/943">authlib/authlib#943</a></li> <li>OAuth2 token fetch crashes with JSONDecodeError instead of a catchable error on rate-limit responses by <a href="https://github.com/juneja-varun"><code>@juneja-varun</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/929">authlib/authlib#929</a></li> <li>docs: add i18n wrappers in conf.py and templates by <a href="https://github.com/hwhsu1231"><code>@hwhsu1231</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/901">authlib/authlib#901</a></li> <li>fix(oauth): enforce JOSE key, scope, and audience validation by <a href="https://github.com/lepture"><code>@lepture</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/945">authlib/authlib#945</a></li> <li>AsyncOpenIDMixin.parse_id_token: return None when id_token is absent, matching the sync client by <a href="https://github.com/ckarnell"><code>@ckarnell</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/924">authlib/authlib#924</a></li> <li>fix(oauth): enforce nonce and JAR request validation by <a href="https://github.com/lepture"><code>@lepture</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/949">authlib/authlib#949</a></li> <li>fix(oauth): require client authentication for ID-JAG grants by <a href="https://github.com/lepture"><code>@lepture</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/955">authlib/authlib#955</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/BinoyOza-okta"><code>@BinoyOza-okta</code></a> made their first contribution in <a href="https://redirect.github.com/authlib/authlib/pull/898">authlib/authlib#898</a></li> <li><a href="https://github.com/loporto"><code>@loporto</code></a> made their first contribution in <a href="https://redirect.github.com/authlib/authlib/pull/938">authlib/authlib#938</a></li> <li><a href="https://github.com/cpruijsen"><code>@cpruijsen</code></a> made their first contribution in <a href="https://redirect.github.com/authlib/authlib/pull/942">authlib/authlib#942</a></li> <li><a href="https://github.com/juneja-varun"><code>@juneja-varun</code></a> made their first contribution in <a href="https://redirect.github.com/authlib/authlib/pull/929">authlib/authlib#929</a></li> <li><a href="https://github.com/hwhsu1231"><code>@hwhsu1231</code></a> made their first contribution in <a href="https://redirect.github.com/authlib/authlib/pull/901">authlib/authlib#901</a></li> <li><a href="https://github.com/ckarnell"><code>@ckarnell</code></a> made their first contribution in <a href="https://redirect.github.com/authlib/authlib/pull/924">authlib/authlib#924</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/authlib/authlib/compare/v1.8.0...v1.9.0">https://github.com/authlib/authlib/compare/v1.8.0...v1.9.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/authlib/authlib/commit/46b94870d915ee77430da8fa2a358378d90b3a45"><code>46b9487</code></a> chore: release 1.9.1</li> <li><a href="https://github.com/authlib/authlib/commit/abb3f49dd97b086ade807942957ffdf4949d9f30"><code>abb3f49</code></a> docs: use the issuer identifier as ID-JAG audience and fix broken links</li> <li><a href="https://github.com/authlib/authlib/commit/1bd2a313492ce0a4d0571c150730907aa3fc91ff"><code>1bd2a31</code></a> Merge commit from fork</li> <li><a href="https://github.com/authlib/authlib/commit/311da11e41ae44fac570ac5224a45e0fec993939"><code>311da11</code></a> docs: more detailed PKCE instructions</li> <li><a href="https://github.com/authlib/authlib/commit/873f72c0345a6fc9b303b2e686bab29cab90f4ac"><code>873f72c</code></a> docs: rpinitiated instructions</li> <li><a href="https://github.com/authlib/authlib/commit/4ff30db442c70e29486e1982cb0ad37c037f5f4b"><code>4ff30db</code></a> Merge commit from fork</li> <li><a href="https://github.com/authlib/authlib/commit/9a86ff3e54e3c87d419d425c105f03fd84f3fe39"><code>9a86ff3</code></a> docs: rpinitiated sequence chart</li> <li><a href="https://github.com/authlib/authlib/commit/1c357571408cad6c9a3cc08ea6df96df5e4edaf7"><code>1c35757</code></a> docs: RFC 9101 sequence chart</li> <li><a href="https://github.com/authlib/authlib/commit/a755e2869f07710a5077784d04807bbe9bfd8026"><code>a755e28</code></a> docs: add a sequence diagram to the token introspection page</li> <li><a href="https://github.com/authlib/authlib/commit/1996c567ed325c5e328f3c00dc7452ff79a89bd2"><code>1996c56</code></a> docs: PKCE flow chart illustration</li> <li>Additional commits viewable in <a href="https://github.com/authlib/authlib/compare/v1.8.0...v1.9.1">compare view</a></li> </ul> </details> <br /> Updates `apprise` from 2.0.0 to 2.0.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/caronc/apprise/releases">apprise's releases</a>.</em></p> <blockquote> <h2>Apprise v2.0.1</h2> <h2>What's Changed</h2> <p>Since the release of v2.0.0 there were some issues raised that I feel were major enough to to warrant a small update release. The big one is the handlng of markdown text.</p> <p>I had merged a few enhancements too; so they're thrown in this mini release as well.</p> <h3>🐞 Bugfixes</h3> <ul> <li>Escape unmatched markup characters for Telegram Markdown v1 by <a href="https://github.com/SulimanAbdulrazzaq"><code>@SulimanAbdulrazzaq</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1751">caronc/apprise#1751</a></li> <li>fix(matrix): accept HTTP 202 Accepted status code for Matrix responses by <a href="https://github.com/szhu25"><code>@szhu25</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1754">caronc/apprise#1754</a></li> <li>fix(matrix): preserve title/body separation in rich notifications by <a href="https://github.com/coder6955"><code>@coder6955</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1756">caronc/apprise#1756</a></li> <li>fixed html issue with flock in <a href="https://redirect.github.com/caronc/apprise/pull/1757">caronc/apprise#1757</a></li> <li>v2 Format Conversion Regression in <a href="https://redirect.github.com/caronc/apprise/pull/1761">caronc/apprise#1761</a></li> </ul> <h3>💡 Features</h3> <ul> <li>Rewrite spush:// for the new Simplepush API with tasks, attachments, ... by <a href="https://github.com/tymm"><code>@tymm</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1759">caronc/apprise#1759</a></li> <li>feat: support Nextcloud Talk bot authentication by <a href="https://github.com/beemines"><code>@beemines</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1758">caronc/apprise#1758</a></li> <li>Telegram photo and video album support in <a href="https://redirect.github.com/caronc/apprise/pull/1762">caronc/apprise#1762</a></li> </ul> <h3>❤️ Life-Cycle Support</h3> <ul> <li>BulkSMS reference updates user -> token, pass -> secret in <a href="https://redirect.github.com/caronc/apprise/pull/1766">caronc/apprise#1766</a></li> <li>Update LoC badge by <a href="https://github.com/github-actions"><code>@github-actions</code></a>[bot] in <a href="https://redirect.github.com/caronc/apprise/pull/1752">caronc/apprise#1752</a></li> <li>Run the test suite in parallel with pytest-xdist in <a href="https://redirect.github.com/caronc/apprise/pull/1763">caronc/apprise#1763</a></li> <li>Only load PyYAML when YAML configuration is used in <a href="https://redirect.github.com/caronc/apprise/pull/1765">caronc/apprise#1765</a></li> </ul> <h2>Installation</h2> <p>Apprise is available <a href="https://pypi.org/project/apprise/">on PyPI</a> through <em>pip</em>:</p> <pre lang="bash"><code># Install Apprise v2.0.1 from PyPI pip install apprise==2.0.1 </code></pre> <p>If you use <a href="https://docs.astral.sh/uv/">uv</a>:</p> <pre lang="bash"><code># Install the apprise command uv tool install apprise==2.0.1 </code></pre> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/szhu25"><code>@szhu25</code></a> made their first contribution in <a href="https://redirect.github.com/caronc/apprise/pull/1754">caronc/apprise#1754</a></li> <li><a href="https://github.com/coder6955"><code>@coder6955</code></a> made their first contribution in <a href="https://redirect.github.com/caronc/apprise/pull/1756">caronc/apprise#1756</a></li> <li><a href="https://github.com/tymm"><code>@tymm</code></a> made their first contribution in <a href="https://redirect.github.com/caronc/apprise/pull/1759">caronc/apprise#1759</a></li> <li><a href="https://github.com/beemines"><code>@beemines</code></a> made their first contribution in <a href="https://redirect.github.com/caronc/apprise/pull/1758">caronc/apprise#1758</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/caronc/apprise/compare/v2.0.0...v2.0.1">https://github.com/caronc/apprise/compare/v2.0.0...v2.0.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/caronc/apprise/commit/81739e9a1187f986a09281b5d0c25c806e8152e0"><code>81739e9</code></a> bumped version to v2.0.1</li> <li><a href="https://github.com/caronc/apprise/commit/6f5802654f02fb0513db6d31ba1738c4be39750d"><code>6f58026</code></a> Only load PyYAML when YAML configuration is used (<a href="https://redirect.github.com/caronc/apprise/issues/1765">#1765</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/b7d5d31c9f5f482af8d316a00e344b059f148f6c"><code>b7d5d31</code></a> BulkSMS reference updates user -> token, pass -> secret (<a href="https://redirect.github.com/caronc/apprise/issues/1766">#1766</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/c6817afb1bf3449e4d2cbbe0c5c731accba1ea4c"><code>c6817af</code></a> Run the test suite in parallel with pytest-xdist (<a href="https://redirect.github.com/caronc/apprise/issues/1763">#1763</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/5203e93971bd03f13b3e930709399093aae88368"><code>5203e93</code></a> v2 Format Conversion Regression (<a href="https://redirect.github.com/caronc/apprise/issues/1761">#1761</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/fb472569430a06131e28b854ba87941ebb21b8b3"><code>fb47256</code></a> Telegram photo and video album support (<a href="https://redirect.github.com/caronc/apprise/issues/1762">#1762</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/57f05eeeabe1eba11571892b4a9a37698a39c7b8"><code>57f05ee</code></a> Support Nextcloud Talk bot authentication (<a href="https://redirect.github.com/caronc/apprise/issues/1758">#1758</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/fe93b0d6ff443ab6c30561b56ca56ff78ed3e3d3"><code>fe93b0d</code></a> Updates to spush:// for the new Simplepush API with tasks + attachments (<a href="https://redirect.github.com/caronc/apprise/issues/1759">#1759</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/bfbf6590ee9dc1f76a8e3f4e49fb9fba8d77ba9d"><code>bfbf659</code></a> fixed html issue with flock (<a href="https://redirect.github.com/caronc/apprise/issues/1757">#1757</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/ab9e23fae137b6542b24d9106c21121f3f482b96"><code>ab9e23f</code></a> fix(matrix): preserve title/body separation in rich notifications (<a href="https://redirect.github.com/caronc/apprise/issues/1756">#1756</a>)</li> <li>Additional commits viewable in <a href="https://github.com/caronc/apprise/compare/v2.0.0...v2.0.1">compare view</a></li> </ul> </details> <br /> Updates `publicsuffixlist` from 1.0.2.20260925 to 1.1.0.20261010 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/ko-zu/psl/blob/master/CHANGES.md">publicsuffixlist's changelog</a>.</em></p> <blockquote> <h3>1.1.0 (2026-10-10)</h3> <p>This version drops support for Python 3.5, 3.6 and 3.7, and now requires Python 3.8 or later.</p> <p>Packaging has been migrated to PEP 621 metadata in <code>pyproject.toml</code> using hatchling, replacing <code>setup.py</code>, <code>setup.cfg</code> and <code>MANIFEST.in</code>. The version is now read from <code>publicsuffixlist.__version__</code>, and development dependencies are locked with uv.</p> <ul> <li>Add PEP 561 <code>py.typed</code> marker and complete type annotations for the public API, including <code>compat</code> and the update script.</li> <li>Add an <code>accept_unknown</code> keyword argument to <code>is_private()</code> and <code>is_public()</code>.</li> <li>Fix <code>subdomain()</code> to honor the per-call <code>accept_unknown</code> argument, and to return <code>None</code> for invalid domains instead of raising <code>TypeError</code>.</li> <li>Correct the <code>subdomain()</code> and <code>privateparts()</code> overload signatures.</li> <li>Handle a malformed <code>Last-Modified</code> response header in the update script.</li> <li>Run tests with uv on Python 3.8 and 3.14, and update CI actions.</li> </ul> <h3>1.0.2 (2024-07-13)</h3> <ul> <li>Use <a href="https://github.com/typing"><code>@typing</code></a>.overload to indicate str-to-str domain input/output. <a href="https://redirect.github.com/ko-zu/psl/issues/32">#32</a>.</li> <li>Address deprecation of ByteString in python 3.14.</li> </ul> <h3>1.0.1 (2024-06-22)</h3> <p>Fix internal logic where domain name passed as a tuple of bytes, that contains UTF-8 encoded non-ascii chars, unintentionally matched PSL. Fixes <a href="https://redirect.github.com/ko-zu/psl/issues/31">#31</a>.</p> <h3>1.0.0 (2024-06-20)</h3> <p>This version drops support for Python 2.x and 3.4.</p> <p>The internal logic has been slightly changed to address conflicting evaluation rules between the PSL wiki and the test data. As with versions before 1.0.0, this module assumes that wildcards have implicit public declarations on the wildcard root.</p> <p>With the minimum Python version changed to 3.5, type annotations have been added to exposed API methods to clarify expected input types. For example, psl.publicsuffix() now accepts <code>str</code> or <code>Tuple[bytes, ...]</code>.</p> <ul> <li>Add tuple of bytes style input</li> <li>Add keep_case keyword argument</li> <li>Accept trailing dot</li> <li>Migrate CI to GitHub Actions</li> </ul> <h3>0.10.0 (2023-04-29)</h3> <p>The last version works on Python 2.7</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/ko-zu/psl/commits">compare view</a></li> </ul> </details> <br /> Updates `seleniumbase` from 4.54.12 to 4.56.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/seleniumbase/SeleniumBase/releases">seleniumbase's releases</a>.</em></p> <blockquote> <h2>4.56.2 - Update decorators and dependencies</h2> <h2>Update decorators and dependencies</h2> <ul> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/d3ab07e8434d417bd47f989dddfbe5de78c1e3a7">Update the print_runtime() decorator</a> --> This resolves <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4527">seleniumbase/SeleniumBase#4527</a></li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/68bb983dd81eec140e0531ec03edc7075ac314ec">Refresh Python dependencies</a></li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/59a9ef3a51c6489d2edad14be4947ca2df7e3f98">Update CDP Mode examples</a></li> </ul> <h2>What's Changed</h2> <ul> <li>Update decorators and dependencies by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4528">seleniumbase/SeleniumBase#4528</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.56.1...v4.56.2">https://github.com/seleniumbase/SeleniumBase/compare/v4.56.1...v4.56.2</a></p> <h2>4.56.1 - Fix dependency issue caused by a yank</h2> <h2>Fix dependency issue caused by a yank</h2> <ul> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/5b340211db401cce84b95ef58a937a3b88d9cd6d">Refresh Python dependencies</a> --> This resolves <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4525">seleniumbase/SeleniumBase#4525</a></li> <li><a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4526/commits/98e5aa2b4eb30f1be74c7d827bdc45b86a97ce72">Refresh a Python dependency</a> --> Update a dependency that dropped a version of Python.</li> </ul> <h2>4.56.0 - Full Python 3.15 Support</h2> <h2>Full Python 3.15 Support</h2> <ul> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/55b294c8263eef3ac03df107de289ed295ecdb2f">Refresh Python dependencies</a> --> This resolves <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4523">seleniumbase/SeleniumBase#4523</a></li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/7d8ea74d25255c7195d56606b035fadb2d0b86ed">Update driver methods</a></li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/ce8281135cb717cc5a628651f88c6bfe1a58b179">Update versioning for the MCP server</a></li> </ul> <h2>What's Changed</h2> <ul> <li>Full Python 3.15 Support by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4524">seleniumbase/SeleniumBase#4524</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.55.2...v4.56.0">https://github.com/seleniumbase/SeleniumBase/compare/v4.55.2...v4.56.0</a></p> <h2>4.55.2 - Refresh Dependencies and Examples</h2> <h2>Refresh Dependencies and Examples</h2> <ul> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/de21ad5ebc8690d7d9f8a16d775a7fb36fd4545a">Refresh Python dependencies</a></li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/e22408ee9193189143d68088d18759c59b734fd7">Update CDP Mode examples</a></li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/1ab5d04ade3c05807b2e75fc1e3acddbaab389d5">Update Stealthy Playwright Mode examples</a></li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/0adae72339390d9f24bd38c9633dffe415953a45">Update the ReadMe</a></li> </ul> <h2>What's Changed</h2> <ul> <li>Refresh Dependencies and Examples by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4522">seleniumbase/SeleniumBase#4522</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.55.1...v4.55.2">https://github.com/seleniumbase/SeleniumBase/compare/v4.55.1...v4.55.2</a></p> <h2>4.55.1 - Fast Mode for CDP Mode</h2> <h2>Fast Mode for CDP Mode</h2> <ul> <li><a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4520/commits/f1613ea974f16631739d9301cd31dcef65dce32b">Add Fast Mode to CDP Mode</a> --> This resolves <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4519">seleniumbase/SeleniumBase#4519</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/c4524941fea728ad45033ab4084bf55566e609c0"><code>c452494</code></a> Merge pull request <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4528">#4528</a> from seleniumbase/decorators-and-dependencies</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/8738b091c4bc9ff6172b46264b7054f3e111d264"><code>8738b09</code></a> Version 4.56.2</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/ed62dcb9eab24e60500f46cd3f9770454276603e"><code>ed62dcb</code></a> Update MCP server versioning</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/59a9ef3a51c6489d2edad14be4947ca2df7e3f98"><code>59a9ef3</code></a> Update CDP Mode examples</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/68bb983dd81eec140e0531ec03edc7075ac314ec"><code>68bb983</code></a> Refresh Python dependencies</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/d3ab07e8434d417bd47f989dddfbe5de78c1e3a7"><code>d3ab07e</code></a> Update the <code>print_runtime()</code> decorator</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/6c09b0b828fba8ce9a1c2a947f410b6943045593"><code>6c09b0b</code></a> Update ReadMe files</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/ce0493bd99148f8c30a98525ef9c14a3b44977a5"><code>ce0493b</code></a> Update the ReadMe</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/ac18d10f63c7bfb295c6aff7c138905581af09c3"><code>ac18d10</code></a> Update the UC Mode ReadMe</li> <li><a href="https://github.com/seleniumbase/SeleniumBase/commit/86de26f2d0f475e79b0e0a751f4286e60250e8ef"><code>86de26f</code></a> Refresh mkdocs dependencies</li> <li>Additional commits viewable in <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.54.12...v4.56.2">compare view</a></li> </ul> </details> <br /> Updates `basedpyright` from 1.40.1 to 1.40.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/detachhead/basedpyright/releases">basedpyright's releases</a>.</em></p> <blockquote> <h2>v1.40.2 (pyright 1.1.414)</h2> <h2>What's Changed</h2> <ul> <li>Fix typeshed packaging for the <code>browser-basedpyright</code> npm package by <a href="https://github.com/BertalanD"><code>@BertalanD</code></a> in <a href="https://redirect.github.com/DetachHead/basedpyright/pull/1890">DetachHead/basedpyright#1890</a></li> <li>generate builtin docstrings for python 3.15 by <a href="https://github.com/DetachHead"><code>@DetachHead</code></a> in <a href="https://redirect.github.com/DetachHead/basedpyright/pull/1895">DetachHead/basedpyright#1895</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/DetachHead/basedpyright/compare/v1.40.1...v1.40.2">https://github.com/DetachHead/basedpyright/compare/v1.40.1...v1.40.2</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/DetachHead/basedpyright/commit/344759687c2fff3bd0a7d6a83a9d1847f806b795"><code>3447596</code></a> asdf</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/9c403f159a9680775b34c6925e6fa33bc675323e"><code>9c403f1</code></a> retry vscode publish because vs marketplace was down</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/fa4b52d9428c0f355c95af2056cfd4edd4e6e5da"><code>fa4b52d</code></a> 1.40.2</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/3ca944f19614eabc8c610cee44cede8d3ea9fa0c"><code>3ca944f</code></a> pin python version to 3.15</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/1f4822c168019322a88d90aa0d09a2ae54e25215"><code>1f4822c</code></a> add python 3.15 builtin docstrings</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/77cfb2da66a34388fc940670895c9a963731ed25"><code>77cfb2d</code></a> bump python dependencies & pnpm (<a href="https://redirect.github.com/detachhead/basedpyright/issues/1877">#1877</a>)</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/a8a92cd35f7b1f683ebed3ad573c4aacefa79bc6"><code>a8a92cd</code></a> formatting</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/d55e86a451ec338a902140c51d48bdb21cfb1102"><code>d55e86a</code></a> Fix typeshed packaging for browser-basedpyright</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/c63390c33f0877ee27c085820e1a24ec41e7def2"><code>c63390c</code></a> delete dependabot config. too much of a pain in the ass to configure it to no...</li> <li><a href="https://github.com/DetachHead/basedpyright/commit/278e99c2f2594187cc56cafba97a0265c3dfce67"><code>278e99c</code></a> delete weekly typechecker benchmark workflow</li> <li>Additional commits viewable in <a href="https://github.com/detachhead/basedpyright/compare/v1.40.1...v1.40.2">compare view</a></li> </ul> </details> <br /> Updates `prek` from 0.5.4 to 0.5.5 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/j178/prek/releases">prek's releases</a>.</em></p> <blockquote> <h2>0.5.5</h2> <h2>Release Notes</h2> <p>Released on 2026-10-05.</p> <h3>Enhancements</h3> <ul> <li>Add Nushell completion generation (<a href="https://redirect.github.com/j178/prek/pull/2785">#2785</a>)</li> <li>Add <code>ppc64le</code> wheel and binary builds (<a href="https://redirect.github.com/j178/prek/pull/2809">#2809</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid JSON imports when querying Python interpreters (<a href="https://redirect.github.com/j178/prek/pull/2790">#2790</a>)</li> <li>Avoid duplicate diffs after hooks rewrite files (<a href="https://redirect.github.com/j178/prek/pull/2815">#2815</a>)</li> <li>Batch file reads in shebang checks (<a href="https://redirect.github.com/j178/prek/pull/2793">#2793</a>)</li> <li>Check cached hook environments concurrently (<a href="https://redirect.github.com/j178/prek/pull/2797">#2797</a>)</li> <li>Overlap Git discovery with worktree status checks (<a href="https://redirect.github.com/j178/prek/pull/2821">#2821</a>)</li> <li>Query staged additions only for case conflicts (<a href="https://redirect.github.com/j178/prek/pull/2802">#2802</a>)</li> <li>Reduce worker overhead in XML and pygrep checks (<a href="https://redirect.github.com/j178/prek/pull/2789">#2789</a>)</li> <li>Reuse Git worktree state during hook startup (<a href="https://redirect.github.com/j178/prek/pull/2787">#2787</a>)</li> <li>Reuse intent-to-add paths when saving unstaged changes (<a href="https://redirect.github.com/j178/prek/pull/2788">#2788</a>)</li> <li>Run Git queries concurrently for case-conflict checks (<a href="https://redirect.github.com/j178/prek/pull/2792">#2792</a>)</li> <li>Share Bun and Deno version queries across environments (<a href="https://redirect.github.com/j178/prek/pull/2795">#2795</a>)</li> <li>Share Lua runtime probes across hook environments (<a href="https://redirect.github.com/j178/prek/pull/2796">#2796</a>)</li> <li>Share Ruby version queries across hook environments (<a href="https://redirect.github.com/j178/prek/pull/2794">#2794</a>)</li> <li>Share mise version queries across hook environments (<a href="https://redirect.github.com/j178/prek/pull/2798">#2798</a>)</li> <li>Skip site initialization in Python interpreter probes (<a href="https://redirect.github.com/j178/prek/pull/2822">#2822</a>)</li> <li>Skip untracked files in destroyed symlink checks (<a href="https://redirect.github.com/j178/prek/pull/2799">#2799</a>)</li> <li>Skip unused file input for always-run hooks (<a href="https://redirect.github.com/j178/prek/pull/2813">#2813</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Preserve staged and unstaged changes on conflicted stash restore (<a href="https://redirect.github.com/j178/prek/pull/2803">#2803</a>)</li> <li>Default missing <code>core.fileMode</code> in shebang checks (<a href="https://redirect.github.com/j178/prek/pull/2832">#2832</a>)</li> <li>Match protected branch patterns from the start (<a href="https://redirect.github.com/j178/prek/pull/2829">#2829</a>)</li> <li>Normalize explicit paths in shebang index checks (<a href="https://redirect.github.com/j178/prek/pull/2831">#2831</a>)</li> <li>Preserve empty <code>trailing-whitespace</code> character sets (<a href="https://redirect.github.com/j178/prek/pull/2830">#2830</a>)</li> <li>Reject empty files in <code>check-json</code> (<a href="https://redirect.github.com/j178/prek/pull/2826">#2826</a>)</li> <li>Reject trailing data in <code>check-json</code> (<a href="https://redirect.github.com/j178/prek/pull/2828">#2828</a>)</li> <li>Round up file sizes in <code>check-added-large-files</code> (<a href="https://redirect.github.com/j178/prek/pull/2827">#2827</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Redesign the prek badge and refresh logo details (<a href="https://redirect.github.com/j178/prek/pull/2818">#2818</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/imphil"><code>@imphil</code></a></li> <li><a href="https://github.com/j178"><code>@j178</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/j178/prek/blob/master/CHANGELOG.md">prek's changelog</a>.</em></p> <blockquote> <h2>0.5.5</h2> <p>Released on 2026-10-05.</p> <h3>Enhancements</h3> <ul> <li>Add Nushell completion generation (<a href="https://redirect.github.com/j178/prek/pull/2785">#2785</a>)</li> <li>Add <code>ppc64le</code> wheel and binary builds (<a href="https://redirect.github.com/j178/prek/pull/2809">#2809</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Avoid JSON imports when querying Python interpreters (<a href="https://redirect.github.com/j178/prek/pull/2790">#2790</a>)</li> <li>Avoid duplicate diffs after hooks rewrite files (<a href="https://redirect.github.com/j178/prek/pull/2815">#2815</a>)</li> <li>Batch file reads in shebang checks (<a href="https://redirect.github.com/j178/prek/pull/2793">#2793</a>)</li> <li>Check cached hook environments concurrently (<a href="https://redirect.github.com/j178/prek/pull/2797">#2797</a>)</li> <li>Overlap Git discovery with worktree status checks (<a href="https://redirect.github.com/j178/prek/pull/2821">#2821</a>)</li> <li>Query staged additions only for case conflicts (<a href="https://redirect.github.com/j178/prek/pull/2802">#2802</a>)</li> <li>Reduce worker overhead in XML and pygrep checks (<a href="https://redirect.github.com/j178/prek/pull/2789">#2789</a>)</li> <li>Reuse Git worktree state during hook startup (<a href="https://redirect.github.com/j178/prek/pull/2787">#2787</a>)</li> <li>Reuse intent-to-add paths when saving unstaged changes (<a href="https://redirect.github.com/j178/prek/pull/2788">#2788</a>)</li> <li>Run Git queries concurrently for case-conflict checks (<a href="https://redirect.github.com/j178/prek/pull/2792">#2792</a>)</li> <li>Share Bun and Deno version queries across environments (<a href="https://redirect.github.com/j178/prek/pull/2795">#2795</a>)</li> <li>Share Lua runtime probes across hook environments (<a href="https://redirect.github.com/j178/prek/pull/2796">#2796</a>)</li> <li>Share Ruby version queries across hook environments (<a href="https://redirect.github.com/j178/prek/pull/2794">#2794</a>)</li> <li>Share mise version queries across hook environments (<a href="https://redirect.github.com/j178/prek/pull/2798">#2798</a>)</li> <li>Skip site initialization in Python interpreter probes (<a href="https://redirect.github.com/j178/prek/pull/2822">#2822</a>)</li> <li>Skip untracked files in destroyed symlink checks (<a href="https://redirect.github.com/j178/prek/pull/2799">#2799</a>)</li> <li>Skip unused file input for always-run hooks (<a href="https://redirect.github.com/j178/prek/pull/2813">#2813</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Preserve staged and unstaged changes on conflicted stash restore (<a href="https://redirect.github.com/j178/prek/pull/2803">#2803</a>)</li> <li>Default missing <code>core.fileMode</code> in shebang checks (<a href="https://redirect.github.com/j178/prek/pull/2832">#2832</a>)</li> <li>Match protected branch patterns from the start (<a href="https://redirect.github.com/j178/prek/pull/2829">#2829</a>)</li> <li>Normalize explicit paths in shebang index checks (<a href="https://redirect.github.com/j178/prek/pull/2831">#2831</a>)</li> <li>Preserve empty <code>trailing-whitespace</code> character sets (<a href="https://redirect.github.com/j178/prek/pull/2830">#2830</a>)</li> <li>Reject empty files in <code>check-json</code> (<a href="https://redirect.github.com/j178/prek/pull/2826">#2826</a>)</li> <li>Reject trailing data in <code>check-json</code> (<a href="https://redirect.github.com/j178/prek/pull/2828">#2828</a>)</li> <li>Round up file sizes in <code>check-added-large-files</code> (<a href="https://redirect.github.com/j178/prek/pull/2827">#2827</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Redesign the prek badge and refresh logo details (<a href="https://redirect.github.com/j178/prek/pull/2818">#2818</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/imphil"><code>@imphil</code></a></li> <li><a href="https://github.com/j178"><code>@j178</code></a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/j178/prek/commit/77cca6719ea8e3d9cc7a973e2c9e7648f4b0381d"><code>77cca67</code></a> Bump version to 0.5.5 (<a href="https://redirect.github.com/j178/prek/issues/2839">#2839</a>)</li> <li><a href="https://github.com/j178/prek/commit/f4e26958292ae25403f40300050cf943e67132c3"><code>f4e2695</code></a> Update Rust crate jsonc-parser to 0.34.0 (<a href="https://redirect.github.com/j178/prek/issues/2838">#2838</a>)</li> <li><a href="https://github.com/j178/prek/commit/399e9d1158fa0377073ddd9db49e01e4b8fba49b"><code>399e9d1</code></a> Update GitHub Actions (<a href="https://redirect.github.com/j178/prek/issues/2837">#2837</a>)</li> <li><a href="https://github.com/j178/prek/commit/19e77d12b34f51c2d296eeeed3cc470c31372c1a"><code>19e77d1</code></a> Update prek hooks (<a href="https://redirect.github.com/j178/prek/issues/2771">#2771</a>)</li> <li><a href="https://github.com/j178/prek/commit/e261e0cce1aac6625960397cf513254e2e72bdf1"><code>e261e0c</code></a> Update dependency uv to v0.12.19 (<a href="https://redirect.github.com/j178/prek/issues/2835">#2835</a>)</li> <li><a href="https://github.com/j178/prek/commit/bc53e2ce2041d70d1c19c9063cbc1b1c570b2422"><code>bc53e2c</code></a> Update Rust crate thiserror to v2.0.21 (<a href="https://redirect.github.com/j178/prek/issues/2836">#2836</a>)</li> <li><a href="https://github.com/j178/prek/commit/4a981d25ecd2b6f43aa0c3525d589428c5a0de29"><code>4a981d2</code></a> Default missing core.fileMode in shebang checks (<a href="https://redirect.github.com/j178/prek/issues/2832">#2832</a>)</li> <li><a href="https://github.com/j178/prek/commit/e0310220a5d428d2fb49878c538a61458a0ed62f"><code>e031022</code></a> Preserve empty trailing-whitespace character sets (<a href="https://redirect.github.com/j178/prek/issues/2830">#2830</a>)</li> <li><a href="https://github.com/j178/prek/commit/0b1871acd9164b566e6e9c10aff0123a68e0352c"><code>0b1871a</code></a> Normalize explicit paths in shebang index checks (<a href="https://redirect.github.com/j178/prek/issues/2831">#2831</a>)</li> <li><a href="https://github.com/j178/prek/commit/9d4aedefcc3c152e87954b19d847df7f4662db06"><code>9d4aede</code></a> Match protected branch patterns from the start (<a href="https://redirect.github.com/j178/prek/issues/2829">#2829</a>)</li> <li>Additional commits viewable in <a href="https://github.com/j178/prek/compare/v0.5.4...v0.5.5">compare view</a></li> </ul> </details> <br /> Updates `ruff` from 0.16.9 to 0.17.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/releases">ruff's releases</a>.</em></p> <blockquote> <h2>0.17.1</h2> <h2>Release Notes</h2> <p>Released on 2026-10-15.</p> <h3>Preview features</h3> <ul> <li>[<code>pycodestyle</code>] Don't treat <code>None</code>, <code>True</code>, or <code>False</code> as keywords (<code>E271</code>-<code>E274</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/29322">#29322</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Fix dedent with multiple leading comments (<a href="https://redirect.github.com/astral-sh/ruff/pull/29382">#29382</a>)</li> <li>[<code>flake8-pyi</code>] Detect legacy positional-only parameters in <code>__new__</code> methods (<code>PYI063</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/28502">#28502</a>)</li> <li>[<code>flake8-pyi</code>] Fix false positives on quoted annotations (<code>PYI036</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/29274">#29274</a>)</li> <li>[<code>perflint</code>] Avoid invalid comprehension suggestions (<code>PERF401</code>, <code>PERF403</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/29366">#29366</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>Treat more <code>collections</code> and <code>weakref</code> containers as mutable (<a href="https://redirect.github.com/astral-sh/ruff/pull/29213">#29213</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>[<code>flake8-import-conventions</code>] Update default and example <code>aliases</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/29333">#29333</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/fixfon"><code>@fixfon</code></a></li> <li><a href="https://github.com/mmaxjr"><code>@mmaxjr</code></a></li> <li><a href="https://github.com/joshuavetos"><code>@joshuavetos</code></a></li> <li><a href="https://github.com/nekomario28"><code>@nekomario28</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> <li><a href="https://github.com/shan3520"><code>@shan3520</code></a></li> </ul> <h2>Install ruff 0.17.1</h2> <h3>Install prebuilt binaries via shell script</h3> <pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.17.1/ruff-installer.sh | sh </code></pre> <h3>Install prebuilt binaries via powershell script</h3> <pre lang="sh"><code>powershell -ExecutionPolicy Bypass -c "irm https://releases.astral.sh/github/ruff/releases/download/0.17.1/ruff-installer.ps1 | iex" </code></pre> <h2>Download ruff 0.17.1</h2> <p>| File | Platform | Checksum |</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's changelog</a>.</em></p> <blockquote> <h2>0.17.1</h2> <p>Released on 2026-10-15.</p> <h3>Preview features</h3> <ul> <li>[<code>pycodestyle</code>] Don't treat <code>None</code>, <code>True</code>, or <code>False</code> as keywords (<code>E271</code>-<code>E274</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/29322">#29322</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Fix dedent with multiple leading comments (<a href="https://redirect.github.com/astral-sh/ruff/pull/29382">#29382</a>)</li> <li>[<code>flake8-pyi</code>] Detect legacy positional-only parameters in <code>__new__</code> methods (<code>PYI063</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/28502">#28502</a>)</li> <li>[<code>flake8-pyi</code>] Fix false positives on quoted annotations (<code>PYI036</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/29274">#29274</a>)</li> <li>[<code>perflint</code>] Avoid invalid comprehension suggestions (<code>PERF401</code>, <code>PERF403</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/29366">#29366</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>Treat more <code>collections</code> and <code>weakref</code> containers as mutable (<a href="https://redirect.github.com/astral-sh/ruff/pull/29213">#29213</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>[<code>flake8-import-conventions</code>] Update default and example <code>aliases</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/29333">#29333</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/fixfon"><code>@fixfon</code></a></li> <li><a href="https://github.com/mmaxjr"><code>@mmaxjr</code></a></li> <li><a href="https://github.com/joshuavetos"><code>@joshuavetos</code></a></li> <li><a href="https://github.com/nekomario28"><code>@nekomario28</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> <li><a href="https://github.com/shan3520"><code>@shan3520</code></a></li> </ul> <h2>0.17.0</h2> <p>Released on 2026-10-09.</p> <p>The executables in our macOS and Windows release archives and <code>ruff</code> wheels are now code-signed. macOS executables are signed with an Apple Developer ID certificate and notarized by Apple. Windows executables have timestamped Authenticode signatures from Azure Artifact Signing. This enables verification of the release publisher and binary integrity, supports publisher-based allowlisting, and should reduce security warnings and antivirus false positives.</p> <h3>Breaking changes</h3> <ul> <li> <p>Update the default and latest Python versions for 3.15 (<a href="https://redirect.github.com/astral-sh/ruff/pull/28792">#28792</a>)</p> <p>Ruff now defaults to Python 3.11 instead of 3.10 when no Python version is configured through <a href="https://docs.astral.sh/ruff/settings/#target-version"><code>target-version</code></a> or <a href="https://docs.astral.sh/ruff/configuration/#inferring-the-python-version"><code>requires-python</code></a>. When checking for syntax errors without a configured Python version, Ruff now defaults to Python 3.15</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/ruff/commit/4683270c69cbdaf6ad64d3f983fc458d5a43b41f"><code>4683270</code></a> Bump version to 0.17.1 (<a href="https://redirect.github.com/astral-sh/ruff/issues/29420">#29420</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/3514027edb659bbc3c787d355be9d130e5587f15"><code>3514027</code></a> [ty] Update typing conformance suite pin (<a href="https://redirect.github.com/astral-sh/ruff/issues/29417">#29417</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/829455624d78f2e89669e4b4b14af2b96abdb1ae"><code>8294556</code></a> Update referenced PR security-review workflow (<a href="https://redirect.github.com/astral-sh/ruff/issues/29237">#29237</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/d1e1b1f69b511df4385f64b510eeec4da01c1a0e"><code>d1e1b1f</code></a> [ty] Preserve recursive aliases when rebuilding intersections (<a href="https://redirect.github.com/astral-sh/ruff/issues/29057">#29057</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/93526150df078af7dd8fc4226cdcc469539d2001"><code>9352615</code></a> [<code>perflint</code>] Avoid invalid comprehension suggestions (<code>PERF401</code>, <code>PERF403</code>) (...</li> <li><a href="https://github.com/astral-sh/ruff/commit/83a3afc3156d73ae4296f3fa74ede28e4c72bfcd"><code>83a3afc</code></a> Fix dedent with multiple leading comments (<a href="https://redirect.github.com/astral-sh/ruff/issues/29382">#29382</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/b42a8734410230f4529151782cae951b99bed858"><code>b42a873</code></a> [ty] Clarify object attribute write-contract rationale (<a href="https://redirect.github.com/astral-sh/ruff/issues/29384">#29384</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/d01678ebf594c97a7767d4372061c1f80ae5b5bb"><code>d01678e</code></a> [ty] Clarify object attribute write-contract rationale (<a href="https://redirect.github.com/astral-sh/ruff/issues/29384">#29384</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/355b42a7719d8a555e3ee50c89848b42d8a11eb5"><code>355b42a</code></a> [ty] Avoid writable override contracts from object (<a href="https://redirect.github.com/astral-sh/ruff/issues/29373">#29373</a>)</li> <li><a href="https://github.com/astral-sh/ruff/commit/e26e6d2a54ac2c5e1f5b1945042de3ff3885bf8e"><code>e26e6d2</code></a> [ty] Collect intersection inference through constraint relations (<a href="https://redirect.github.com/astral-sh/ruff/issues/28677">#28677</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.16.9...0.17.1">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
c8d66db22e |
feat(direct_download): add OceanofPDF as a standalone search and download provider (#1485)
Closes #1149 ## What this adds OceanofPDF as a second Direct Download provider, alongside Anna's Archive. Unlike Z-Library, LibGen and Welib, which only download files Anna's Archive found, OceanofPDF searches and downloads on its own. It works with or without an AA mirror configured; with both, one search queries both and the results are merged. It plugs into the provider registry from #1337, so search, record routing and the download handler need no changes. **Search:** WordPress `/?s=` search, "title author" first, then the bare title if that finds nothing. One release per advertised format (`[PDF] [EPUB]`), with title, author and cover. Shelfmark's supported-format filter applies as usual. **Download** follows the site's three hops: 1. The book page has one POST form per format, targeting `Fetching_Resource.php`. 2. That returns an interstitial whose `<meta http-equiv="refresh">` points at a signed, expiring file URL. 3. The file URL serves the book. Pages go through `html_get_page` and its Cloudflare bypass. The form POST replays the clearance the bypasser stored, and re-solves once if challenged. Bypassers only replay GETs, so it can't be handed over directly. **Settings:** - `OCEANOFPDF_MIRROR_URLS` under Mirrors. Only the first URL is used. - An OceanofPDF toggle under Download Sources → Slow downloads. It's locked until a mirror is set and while the Cloudflare bypass is off. Its position in the list doesn't matter, and its description says so. - A saved list from before this change has no OceanofPDF entry. The settings page shows a missing option as off, so the provider treats it as off too, keeping the page and the behaviour in agreement. New installs default to on. ## Fixes found along the way - **`challenge_marker` rejected real pages behind Cloudflare** (separate commit, `fix(bypass)`). Cloudflare's bot-detection script injects `/cdn-cgi/challenge-platform/scripts/jsd/main.js` into every page it serves, after load. Bypassers return the rendered page, so a successful FlareSolverr solve of any page under 64 KB came back carrying `/cdn-cgi/challenge-platform` and was rejected as unsolved. The detector now ignores that one script path. Real challenge pages load from `/cdn-cgi/challenge-platform/h/…` and keep their other markers, so they are still caught. This also affects any other Cloudflare-fronted host, not just OceanofPDF. Happy to split it into its own PR if you prefer. - **Brotli on a plain `requests` call.** Copying `DOWNLOAD_HEADERS` into the form POST offered `br`. Cloudflare then answered in Brotli, which `requests` can't decode without the optional `brotli` package. The POST now leaves `Accept-Encoding` to `requests`. If a response still has no file link, its status, encoding, title and challenge marker are logged. ## Testing - **New tests:** 41 in `tests/direct_download/test_oceanofpdf.py` and 4 in `tests/bypass/test_cloudflare_beacon.py`. They cover search parsing, format and language filtering, form selection, the interstitial, the download flow (including a challenged POST, an HTML stub served as the file, and cancellation), the toggle, and registry wiring. Fixtures mirror the live site's markup. - **Existing tests:** `tests/direct_download`, `tests/bypass`, `tests/config`, `tests/core` and `tests/download` show no new failures against `main`. Some tests in those folders can't run on Windows; those fail identically on both. - **Lint:** `ruff check` and `ruff format --check` are clean on every changed file. - **Live:** verified end to end on a v1.4.0 Docker deployment behind FlareSolverr (external bypasser), with only an OceanofPDF mirror configured: search, then the book page, the form POST and the completed download. ## Known limits - OceanofPDF doesn't label languages, so its results always pass a language filter. - PDFs only appear when `pdf` is in the supported formats. - Each query reads the first results page only (roughly 7–10 books). - Downloaded files carry OceanofPDF's own tags/watermark, as noted in #1149. They aren't stripped. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Adam Stone <196691089+ast0ne1@users.noreply.github.com> Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
51f32b374d |
feat(packs): let users choose which files, books and formats to download (#1480)
## Summary - **Skip files or books in a multi-book pack.** The pack review panel gets a switch per file and a "Skip this book" switch per book, using the shared `ToggleSwitch`. A partly skipped book shows e.g. "3 of 5 files" in the Files column. A fully skipped book is greyed out. - **Choose formats for a single book.** A new "Choose formats" header toggle, next to the multi-book one, opens a format picker for a release that has several book formats (EPUB, MOBI, PDF and so on). It has one switch per format with file count and size. Releases with one format, or that can't be inspected, download as before. - **Skipped files are sent as `ignored_files`.** They are stored on the task (including restart-safe retry) and removed before grouping and transfer. This matters for packs because files missing from `book_plan` would otherwise be filed by the heuristic fallback. Ignored entries match by release-relative path, then path suffix, then unique basename. - A pack that ends up with one book after skips keeps the titles you reviewed instead of falling back to the searched title. ## Screenshots <img width="1277" height="413" alt="Screenshot 2026-10-19 at 09-39-28 Shelfmark" src="https://github.com/user-attachments/assets/c005ca4b-3dac-45dd-b2ff-d02fc0f9fcc9" /> <img width="1277" height="1210" alt="Screenshot 2026-10-19 at 09-40-23 Shelfmark" src="https://github.com/user-attachments/assets/2145f3ba-e5fc-4635-9364-1790feb0c8b8" /> <img width="1277" height="748" alt="Screenshot 2026-10-19 at 09-39-03 Shelfmark" src="https://github.com/user-attachments/assets/39023fac-70e3-46d8-af89-1160ebd6e415" /> ## Test plan - [x] `pytest` pack tests (new `drop_ignored_files` cases added) - [x] `vitest`, `tsc`, `oxlint`, `oxfmt`, `ruff` - [x] Manual check in the UI with a real multi-book pack 🤖 (mostly) Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
3c5cfcb77d |
fix/redact log secrets (#1488)
- fix(logging): mask tracker API keys in log output (#1486) - fix(welib): follow slow_download links through the countdown (#1447) |
||
|
|
8369f1b626 |
fix(docker): bump Chromium pin to 155.0.8059.79 (#1477)
The `149.0.7827.196` pin from #1105 now lacks fixes for two Chromium CVEs on CISA's Known Exploited Vulnerabilities list: - CVE-2026-85046, fixed in `152.0.7977.82-1~deb13u1` - CVE-2026-87491, fixed in `153.0.8010.47-2~deb13u1` Trivy also reports 46 critical and 534 high Chromium CVEs in `shelfmark:latest` (1.4.0). This browser runs third-party mirror pages with the sandbox off. The 150 regression behind the pin, a missing DevTools TCP port, no longer occurs in Debian's current trixie-security build, **155.0.8059.79-1~deb13u1**. In a copy of `shelfmark:latest` upgraded to that version, `cdp_driver.start_async(...)` with the bypasser's own arguments (`xvfb=True, sandbox=False, incognito=True, ad_block=True`, plus the `_get_browser_args()` flags) starts and loads a page, as it does on 149. A live DDoS-Guard or Cloudflare challenge wasn't tested. The change bumps `CHROMIUM_VERSION` and moves `CHROMIUM_SNAPSHOT` to `20261016T000000Z`, the first snapshot containing that version for amd64 and arm64. It also updates the comment. The Chromium `RUN` step builds on the pinned `python:3.14.7-slim` base. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
bb1655238a |
feat(slskd): add Soulseek (slskd) release source, building on #1335 (#1428)
## Add Soulseek (slskd) as a release source, building on #1335 This is @dskvr's work from #1335 rebased onto current `main`, with my changes on top. #1335 has been quiet since 2026-09-13 and I needed the changes below, so I carried it forward instead of starting over. Their two commits are the first two in this branch with their authorship intact, and the source plugin, handler, API client, settings tab, tests, `ReleaseProtocol.SOULSEEK`, test client compose file and frontend bits are all theirs. I haven't changed how a search turns into releases beyond what is listed here. If @dskvr would rather keep #1335 alive and take these as commits on their branch, I can do that instead and close this. ### What I changed **Downloads survive other apps using the same slskd.** The handler found its files by listing slskd's downloads, and another app on the same instance (SoulSync here) sends `DELETE /transfers/downloads/all/completed` after each of its batches. Once that ran, a finished download no longer appeared in the list and the task never saw it complete, even though the files were on disk. With the new `SLSKD_ISOLATE_DOWNLOADS` setting (on by default) each task: - enqueues one batch (`POST /transfers/downloads/batches`) into its own folder, `<SLSKD_DESTINATION_PREFIX>/<task id>` - polls each transfer by id, which slskd still answers after the list has been cleared - decides it is done from the files on disk (sizes, not names), with the `/events` log as a fallback when the transfers are gone and the files aren't visible yet - copies out of that folder, and removes it only if `SLSKD_KEEP_COMPLETED` is off and the import worked With isolation off the handler behaves as it did in #1335. If the batch endpoint isn't there (404/405) it falls back to the original per-file enqueue. **Source changes.** m4b/m4a files are their own release next to loose chapter files, so auto-download can prefer one file over a chapter set. Results from the query variants are merged per peer. The folder text is exposed as `extra["author"]` and `extra["title_raw"]`, which is what auto-download's strict match and pack detection read. `is_available()` also needs an API key now. **Smaller fixes.** Cancelling while files are still being located now removes the transfer records it created. In the settings tab, a cleared form field is no longer replaced by the saved value when testing the connection. The new settings are in `docs/environment-variables.md`. ### Testing `tests/slskd` has 192 passing and 6 live tests that skip without an instance. I wrote the new tests first and checked the handler and source rules by breaking them and confirming a test failed. Ruff is clean. On the whole suite the only failures are 4 in `tests/download` that import `seleniumbase`, which isn't installed in my environment, and they fail the same on `main`. I've been running this on my own deployment against slskd 0.26.0 behind a VPN, with SoulSync active on a second instance. A search returned a couple hundred results from about 70 peers, an epub came down and was imported, and auto-download fetched five audiobooks as single m4b files. That is a day of use, so I don't know how it behaves on other slskd versions or on Windows path mappings. --------- Co-authored-by: sandwich <dskvr@users.noreply.github.com> Co-authored-by: sandwich <299465+dskvr@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> |
||
|
|
5669b0686a |
build(deps): bump the gh-actions group with 5 updates (#1472)
Bumps the gh-actions group with 5 updates: | Package | From | To | | --- | --- | --- | | [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) | `10.2.0` | `10.3.0` | | [actions/setup-node](https://github.com/actions/setup-node) | `7.0.0` | `7.1.0` | | [github/codeql-action/init](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` | | [github/codeql-action/autobuild](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` | | [github/codeql-action/analyze](https://github.com/github/codeql-action) | `4.38.2` | `4.38.3` | Updates `astral-sh/setup-uv` from 10.2.0 to 10.3.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/setup-uv/releases">astral-sh/setup-uv's releases</a>.</em></p> <blockquote> <h2>v10.3.0 🌈 Add Python architecture selection</h2> <h2>Changes</h2> <p>This release adds the <code>python-arch</code> input to select a Python architecture independently of the Python version. With <code>uv</code> 0.13.0 or later, set <code>python-arch: x86_64</code> to use x64 Python on Windows ARM64 runners.</p> <p>It also includes embedded checksums for <code>uv</code> releases through 0.13.0.</p> <ul> <li>Use macOS 15 runners for tests <a href="https://github.com/charliermarsh"><code>@charliermarsh</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1081">#1081</a>)</li> </ul> <h2>🚀 Enhancements</h2> <ul> <li>Add <code>python-arch</code> support <a href="https://github.com/zanieb"><code>@zanieb</code></a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1079">#1079</a>)</li> </ul> <h2>🧰 Maintenance</h2> <ul> <li>chore: update known checksums for 0.13.0 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1089">#1089</a>)</li> <li>chore: update known checksums for 0.12.24 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1084">#1084</a>)</li> <li>chore: update known checksums for 0.12.23 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1082">#1082</a>)</li> <li>chore: update known checksums for 0.12.22 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1080">#1080</a>)</li> <li>chore: update known checksums for 0.12.21 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1078">#1078</a>)</li> <li>chore: update known checksums for 0.12.20 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1076">#1076</a>)</li> <li>chore: update known checksums for 0.12.19 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1068">#1068</a>)</li> <li>chore: update known checksums for 0.12.18 @<a href="https://github.com/apps/github-actions">github-actions[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1065">#1065</a>)</li> </ul> <h2>⬆️ Dependency updates</h2> <ul> <li>chore(deps): bump zizmorcore/zizmor-action from 0.6.2 to 0.6.3 @<a href="https://github.com/apps/dependabot">dependabot[bot]</a> (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1077">#1077</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/setup-uv/commit/1c37ad07a6a961277cf70c0d37d6f313000f5884"><code>1c37ad0</code></a> chore: update known checksums for 0.13.0 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1089">#1089</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/b3c9b5fc56ebc90760c43b1ac9552c0d1705d3ca"><code>b3c9b5f</code></a> chore: update known checksums for 0.12.24 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1084">#1084</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/b06acff4b6a41bdd9cdac56507ead0bd7734e757"><code>b06acff</code></a> Add <code>python-arch</code> support (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1079">#1079</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/c84232ca4fde9b022e20a930bfbbecd386b56fdf"><code>c84232c</code></a> chore: update known checksums for 0.12.23 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1082">#1082</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/51fdd265d38a27ffcbca0da885510bc6fcc0ff55"><code>51fdd26</code></a> Use macOS 15 runners for tests (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1081">#1081</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/a96208bed1fb5efb8da349c9bcc6cc58af9e7d74"><code>a96208b</code></a> chore: update known checksums for 0.12.22 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1080">#1080</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/0e3884b860e20d3f4d5daa2347130beb51ccde47"><code>0e3884b</code></a> chore: update known checksums for 0.12.21 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1078">#1078</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/bcf05803b55ef01a5ec6368521ee1b42f97bc438"><code>bcf0580</code></a> chore: update known checksums for 0.12.20 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1076">#1076</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/b92a892142bde7280cd163c2abff341413314f9f"><code>b92a892</code></a> chore(deps): bump zizmorcore/zizmor-action from 0.6.2 to 0.6.3 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1077">#1077</a>)</li> <li><a href="https://github.com/astral-sh/setup-uv/commit/227a0f6bea25cde3444f52decccf4a18de6635f4"><code>227a0f6</code></a> chore: update known checksums for 0.12.19 (<a href="https://redirect.github.com/astral-sh/setup-uv/issues/1068">#1068</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/setup-uv/compare/c18668ad3cf93ea998bef934396af7bb5c839dc7...1c37ad07a6a961277cf70c0d37d6f313000f5884">compare view</a></li> </ul> </details> <br /> Updates `actions/setup-node` from 7.0.0 to 7.1.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/actions/setup-node/releases">actions/setup-node's releases</a>.</em></p> <blockquote> <h2>v7.1.0</h2> <h2>What's Changed</h2> <h3>Enhancements:</h3> <ul> <li>Add support for mise.toml file by <a href="https://github.com/gperdomor"><code>@gperdomor</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1421">actions/setup-node#1421</a></li> <li>Support absolute paths in node-version-file by <a href="https://github.com/v-mahabaleshwars"><code>@v-mahabaleshwars</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1633">actions/setup-node#1633</a></li> </ul> <h3>Bug fixes:</h3> <ul> <li>Add Node version validation and manifest fetch retry by <a href="https://github.com/v-jitenderpalsingh"><code>@v-jitenderpalsingh</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1580">actions/setup-node#1580</a></li> </ul> <h3>Documentation updates:</h3> <ul> <li>README.md: bump actions/checkout to latest version 7 by <a href="https://github.com/deining"><code>@deining</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1578">actions/setup-node#1578</a></li> <li>docs: add V7 ESM migration and NODE_AUTH_TOKEN behavior change by <a href="https://github.com/v-gowridurgad"><code>@v-gowridurgad</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1593">actions/setup-node#1593</a></li> <li>Fixed cache recommendation syntax by <a href="https://github.com/SubJunk"><code>@SubJunk</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1603">actions/setup-node#1603</a></li> </ul> <h3>Dependency updates:</h3> <ul> <li>Update workflow pins and migrate Node matrices to modern versions by <a href="https://github.com/v-HarithaVattikuti"><code>@v-HarithaVattikuti</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1583">actions/setup-node#1583</a></li> <li>Upgrade <code>@actions/cache</code> to 6.2.0 by <a href="https://github.com/philip-gai"><code>@philip-gai</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1584">actions/setup-node#1584</a></li> <li>Pin <code>@types/node</code> to v24 by <a href="https://github.com/v-priyagupta108"><code>@v-priyagupta108</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1585">actions/setup-node#1585</a></li> <li>Override brace-expansion to 5.0.8 by <a href="https://github.com/v-priyagupta108"><code>@v-priyagupta108</code></a> with <a href="https://github.com/Copilot"><code>@Copilot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1599">actions/setup-node#1599</a></li> <li>Upgrade actions/checkout from 7.0.0 to 7.0.1 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1598">actions/setup-node#1598</a></li> <li>Upgrade prettier from 3.8.4 to 3.9.6 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1590">actions/setup-node#1590</a></li> <li>Upgrade <code>@vercel/ncc</code> from 0.44.0 to 0.45.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1610">actions/setup-node#1610</a></li> <li>Upgrade pnpm/action-setup from 6.0.9 to 6.0.10 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1602">actions/setup-node#1602</a></li> <li>Upgrade baseline-browser-mapping from 2.10.38 to 2.11.22 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1629">actions/setup-node#1629</a></li> <li>Upgrade <code>@types/semver</code> from 7.7.1 to 7.8.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1616">actions/setup-node#1616</a></li> <li>Upgrade <code>@typescript-eslint/parser</code> from 8.62.0 to 8.70.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1615">actions/setup-node#1615</a></li> <li>Upgrade pnpm/action-setup from 6.0.10 to 6.1.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1631">actions/setup-node#1631</a></li> <li>Upgrade jest-each from 30.4.1 to 30.5.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1636">actions/setup-node#1636</a></li> <li>Upgrade eslint-plugin-n from 18.1.0 to 18.3.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1638">actions/setup-node#1638</a></li> <li>Update dependencies and add license files by <a href="https://github.com/v-HarithaVattikuti"><code>@v-HarithaVattikuti</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1642">actions/setup-node#1642</a></li> <li>Upgrade eslint from 10.5.0 to 10.11.0 and package.json from 7.0.0 to 7.1.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a> in <a href="https://redirect.github.com/actions/setup-node/pull/1635">actions/setup-node#1635</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/v-jitenderpalsingh"><code>@v-jitenderpalsingh</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1580">actions/setup-node#1580</a></li> <li><a href="https://github.com/philip-gai"><code>@philip-gai</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1584">actions/setup-node#1584</a></li> <li><a href="https://github.com/gperdomor"><code>@gperdomor</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1421">actions/setup-node#1421</a></li> <li><a href="https://github.com/SubJunk"><code>@SubJunk</code></a> made their first contribution in <a href="https://redirect.github.com/actions/setup-node/pull/1603">actions/setup-node#1603</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/actions/setup-node/compare/v7.0.0...v7.1.0">https://github.com/actions/setup-node/compare/v7.0.0...v7.1.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/actions/setup-node/commit/949feb2413d6458794dcd2491c4babbbce0c15c1"><code>949feb2</code></a> Bump eslint from 10.5.0 to 10.11.0 and package.json from 7.0.0 to 7.1.0 (<a href="https://redirect.github.com/actions/setup-node/issues/1635">#1635</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/7207c4f1189c7ee83ddf20c7c68bd1af6fdd751c"><code>7207c4f</code></a> chore: update dependencies and add license files (<a href="https://redirect.github.com/actions/setup-node/issues/1642">#1642</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/54337e0d02de9202d0948aaff36ad556375497b9"><code>54337e0</code></a> Bump eslint-plugin-n from 18.1.0 to 18.3.0 (<a href="https://redirect.github.com/actions/setup-node/issues/1638">#1638</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/fb54fa8c14c63410cc752f0ae3b7b3ca6af161fc"><code>fb54fa8</code></a> Bump jest-each from 30.4.1 to 30.5.2 (<a href="https://redirect.github.com/actions/setup-node/issues/1636">#1636</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/7f84f1d52d0c56afb45c62fee31a93b843cea4d6"><code>7f84f1d</code></a> Bump pnpm/action-setup from 6.0.10 to 6.1.0 (<a href="https://redirect.github.com/actions/setup-node/issues/1631">#1631</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/0c54c7b07420dcba69a7d832587f55ebdf771c9e"><code>0c54c7b</code></a> Bump <code>@typescript-eslint/parser</code> from 8.62.0 to 8.70.0 (<a href="https://redirect.github.com/actions/setup-node/issues/1615">#1615</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/a8294190049a9c296f01b9a432aff41dd83d8284"><code>a829419</code></a> Bump <code>@types/semver</code> from 7.7.1 to 7.8.0 (<a href="https://redirect.github.com/actions/setup-node/issues/1616">#1616</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/680d1e489b82f1243de15bc7665c0007e3c9a860"><code>680d1e4</code></a> Support absolute paths in node-version-file (<a href="https://redirect.github.com/actions/setup-node/issues/1633">#1633</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/db0fb3a98ed314b69026b6e8c9be26a7e2fe65a8"><code>db0fb3a</code></a> Bump baseline-browser-mapping from 2.10.38 to 2.11.22 (<a href="https://redirect.github.com/actions/setup-node/issues/1629">#1629</a>)</li> <li><a href="https://github.com/actions/setup-node/commit/94196ee1d15439c1b6651cd87ef14e88ec435966"><code>94196ee</code></a> Bump pnpm/action-setup from 6.0.9 to 6.0.10 (<a href="https://redirect.github.com/actions/setup-node/issues/1602">#1602</a>)</li> <li>Additional commits viewable in <a href="https://github.com/actions/setup-node/compare/820762786026740c76f36085b0efc47a31fe5020...949feb2413d6458794dcd2491c4babbbce0c15c1">compare view</a></li> </ul> </details> <br /> Updates `github/codeql-action/init` from 4.38.2 to 4.38.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/releases">github/codeql-action/init's releases</a>.</em></p> <blockquote> <h2>v4.38.3</h2> <ul> <li><em>Upcoming breaking change</em>: CodeQL version 2.21.2 and earlier were discontinued on 24 September 2026 alongside GitHub Enterprise Server 3.17, and will be unsupported by the next minor release of the CodeQL Action. Added a deprecation warning for customers using these versions of CodeQL. <a href="https://redirect.github.com/github/codeql-action/pull/4188">#4188</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.2">2.27.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4203">#4203</a></li> <li>Fixed a bug where the decision of whether to use a per-language bundle did not account for custom configurations that reference queries outside of compiled CodeQL packs. This issue was caught during internal testing and did not affect any customer repositories. We will resume the roll out of per-language bundles in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4184">#4184</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action/init's changelog</a>.</em></p> <blockquote> <h1>CodeQL Action Changelog</h1> <p>See the <a href="https://github.com/github/codeql-action/releases">releases page</a> for the relevant changes to the CodeQL CLI and language packs.</p> <h2>[UNRELEASED]</h2> <p>No user facing changes.</p> <h2>4.39.0 - 15 Oct 2026</h2> <ul> <li><em>Breaking change</em>: Bump the minimum required CodeQL bundle version to 2.20.7. <a href="https://redirect.github.com/github/codeql-action/pull/4205">#4205</a></li> <li>The <code>codeql-action/analyze</code> step now validates that a correct argument for the <code>checkout_path</code> input has been provided. The <code>checkout_path</code> input must be set to the path where the repository that is being analyzed is checked out at on the runner, if that path is something other than the workspace root. If the path does not point to a repository checkout or is different from the path that was used by <code>codeql-action/init</code>, then the CodeQL Action now produces a warning. <a href="https://redirect.github.com/github/codeql-action/pull/4148">#4148</a></li> <li>Resolved an issue with third-party caching implementations that prevented caches from being restored correctly. <a href="https://redirect.github.com/github/codeql-action/pull/4206">#4206</a></li> <li>The <code>codeql-action/start-proxy</code> step that is used in Code Scanning Default Setup now finds CodeQL releases using the same logic as <code>codeql-action/init</code>. This primarily benefits customers who are using GitHub instances other than <code>github.com</code> where the <code>codeql-action/start-proxy</code> step may previously have been unable to locate recent releases and ended up using outdated versions of the private registry authentication proxy as a result. <a href="https://redirect.github.com/github/codeql-action/pull/4198">#4198</a></li> </ul> <h2>4.38.3 - 08 Oct 2026</h2> <ul> <li><em>Upcoming breaking change</em>: CodeQL version 2.21.2 and earlier were discontinued on 24 September 2026 alongside GitHub Enterprise Server 3.17, and will be unsupported by the next minor release of the CodeQL Action. Added a deprecation warning for customers using these versions of CodeQL. <a href="https://redirect.github.com/github/codeql-action/pull/4188">#4188</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.2">2.27.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4203">#4203</a></li> <li>Fixed a bug where the decision of whether to use a per-language bundle did not account for custom configurations that reference queries outside of compiled CodeQL packs. This issue was caught during internal testing and did not affect any customer repositories. We will resume the roll out of per-language bundles in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4184">#4184</a></li> </ul> <h2>4.38.2 - 24 Sept 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.1">2.27.1</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4160">#4160</a></li> </ul> <h2>4.38.1 - 18 Sept 2026</h2> <ul> <li>The CodeQL Action now has experimental support for CodeQL releases for which per-language bundles are available. Per-language bundles support analysis for a single language and are therefore smaller than the combined bundles that allow analysis for all supported languages. As a result, per-language bundles take up less space on disk and are faster to download. We expect to roll this change out to everyone in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4146">#4146</a></li> </ul> <h2>4.38.0 - 09 Sept 2026</h2> <ul> <li>On GitHub-hosted runners, the CodeQL Action now deletes unused CodeQL bundles from the toolcache before downloading a different bundle, which frees up disk space for the analysis. We expect to roll this change out to everyone in September. <a href="https://redirect.github.com/github/codeql-action/pull/4124">#4124</a></li> <li>The CodeQL Action now supports CodeQL releases that are compatible with Linux Arm64 and downloads the native <code>linux-arm64</code> CodeQL bundle when available. <a href="https://redirect.github.com/github/codeql-action/pull/4072">#4072</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.0">2.27.0</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4129">#4129</a></li> </ul> <h2>4.37.9 - 26 Aug 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.4">2.26.4</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4106">#4106</a></li> </ul> <h2>4.37.8 - 21 Aug 2026</h2> <p>No user facing changes.</p> <h2>4.37.7 - 13 Aug 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.3">2.26.3</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4085">#4085</a></li> </ul> <h2>4.37.6 - 04 Aug 2026</h2> <ul> <li>Changed the default filepath for the new remote file address format that was introduced in CodeQL Action 4.37.0 / 3.37.0 to <code>.github/codeql-config.yml</code> to align it with the suggested path that is used elsewhere. <a href="https://redirect.github.com/github/codeql-action/pull/4070">#4070</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/github/codeql-action/commit/24c54180a607b1449ed407dd24f251e4e9147c8d"><code>24c5418</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4214">#4214</a> from github/update-v4.38.3-e0b52dbdc</li> <li><a href="https://github.com/github/codeql-action/commit/69e87c56c1db5253592f61da177da1d20d033bd8"><code>69e87c5</code></a> Add changelog note for <a href="https://redirect.github.com/github/codeql-action/issues/4184">#4184</a></li> <li><a href="https://github.com/github/codeql-action/commit/23b682830be5e93afb6466bfc0197142d70268aa"><code>23b6828</code></a> Update changelog for v4.38.3</li> <li><a href="https://github.com/github/codeql-action/commit/e0b52dbdc5c3376dd8cb78e956fd23fa07ca2c5b"><code>e0b52db</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4210">#4210</a> from github/henrymercer/pin-python-for-older-clis-in-ci</li> <li><a href="https://github.com/github/codeql-action/commit/6b99698c8cda6115e2bc7c52226b508dc558d7dc"><code>6b99698</code></a> Pin Python 3.13.15 for older CLI versions in multi-language check</li> <li><a href="https://github.com/github/codeql-action/commit/63d3d632fc7cbd91c8089c7fea5322f1bc73d7d8"><code>63d3d63</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4203">#4203</a> from github/update-bundle/codeql-bundle-v2.27.2</li> <li><a href="https://github.com/github/codeql-action/commit/7377a10091aa5d781c1d36dc3834817d8ad0acfe"><code>7377a10</code></a> Add changelog note</li> <li><a href="https://github.com/github/codeql-action/commit/c1a30cda114f23a88a09ab61f4ec08c312d2c524"><code>c1a30cd</code></a> Update default bundle to codeql-bundle-v2.27.2</li> <li><a href="https://github.com/github/codeql-action/commit/d208ec71e39ae46397cbf6569bef8439b9aab974"><code>d208ec7</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4200">#4200</a> from github/mbg/esm/migrate-pr-checks</li> <li><a href="https://github.com/github/codeql-action/commit/a71b0c6684dea6ca627a472a11bf5b80bd47c845"><code>a71b0c6</code></a> Replace <code>__dirname</code> in <code>sync.ts</code></li> <li>Additional commits viewable in <a href="https://github.com/github/codeql-action/compare/2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2...24c54180a607b1449ed407dd24f251e4e9147c8d">compare view</a></li> </ul> </details> <br /> Updates `github/codeql-action/autobuild` from 4.38.2 to 4.38.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/releases">github/codeql-action/autobuild's releases</a>.</em></p> <blockquote> <h2>v4.38.3</h2> <ul> <li><em>Upcoming breaking change</em>: CodeQL version 2.21.2 and earlier were discontinued on 24 September 2026 alongside GitHub Enterprise Server 3.17, and will be unsupported by the next minor release of the CodeQL Action. Added a deprecation warning for customers using these versions of CodeQL. <a href="https://redirect.github.com/github/codeql-action/pull/4188">#4188</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.2">2.27.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4203">#4203</a></li> <li>Fixed a bug where the decision of whether to use a per-language bundle did not account for custom configurations that reference queries outside of compiled CodeQL packs. This issue was caught during internal testing and did not affect any customer repositories. We will resume the roll out of per-language bundles in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4184">#4184</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action/autobuild's changelog</a>.</em></p> <blockquote> <h1>CodeQL Action Changelog</h1> <p>See the <a href="https://github.com/github/codeql-action/releases">releases page</a> for the relevant changes to the CodeQL CLI and language packs.</p> <h2>[UNRELEASED]</h2> <p>No user facing changes.</p> <h2>4.39.0 - 15 Oct 2026</h2> <ul> <li><em>Breaking change</em>: Bump the minimum required CodeQL bundle version to 2.20.7. <a href="https://redirect.github.com/github/codeql-action/pull/4205">#4205</a></li> <li>The <code>codeql-action/analyze</code> step now validates that a correct argument for the <code>checkout_path</code> input has been provided. The <code>checkout_path</code> input must be set to the path where the repository that is being analyzed is checked out at on the runner, if that path is something other than the workspace root. If the path does not point to a repository checkout or is different from the path that was used by <code>codeql-action/init</code>, then the CodeQL Action now produces a warning. <a href="https://redirect.github.com/github/codeql-action/pull/4148">#4148</a></li> <li>Resolved an issue with third-party caching implementations that prevented caches from being restored correctly. <a href="https://redirect.github.com/github/codeql-action/pull/4206">#4206</a></li> <li>The <code>codeql-action/start-proxy</code> step that is used in Code Scanning Default Setup now finds CodeQL releases using the same logic as <code>codeql-action/init</code>. This primarily benefits customers who are using GitHub instances other than <code>github.com</code> where the <code>codeql-action/start-proxy</code> step may previously have been unable to locate recent releases and ended up using outdated versions of the private registry authentication proxy as a result. <a href="https://redirect.github.com/github/codeql-action/pull/4198">#4198</a></li> </ul> <h2>4.38.3 - 08 Oct 2026</h2> <ul> <li><em>Upcoming breaking change</em>: CodeQL version 2.21.2 and earlier were discontinued on 24 September 2026 alongside GitHub Enterprise Server 3.17, and will be unsupported by the next minor release of the CodeQL Action. Added a deprecation warning for customers using these versions of CodeQL. <a href="https://redirect.github.com/github/codeql-action/pull/4188">#4188</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.2">2.27.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4203">#4203</a></li> <li>Fixed a bug where the decision of whether to use a per-language bundle did not account for custom configurations that reference queries outside of compiled CodeQL packs. This issue was caught during internal testing and did not affect any customer repositories. We will resume the roll out of per-language bundles in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4184">#4184</a></li> </ul> <h2>4.38.2 - 24 Sept 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.1">2.27.1</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4160">#4160</a></li> </ul> <h2>4.38.1 - 18 Sept 2026</h2> <ul> <li>The CodeQL Action now has experimental support for CodeQL releases for which per-language bundles are available. Per-language bundles support analysis for a single language and are therefore smaller than the combined bundles that allow analysis for all supported languages. As a result, per-language bundles take up less space on disk and are faster to download. We expect to roll this change out to everyone in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4146">#4146</a></li> </ul> <h2>4.38.0 - 09 Sept 2026</h2> <ul> <li>On GitHub-hosted runners, the CodeQL Action now deletes unused CodeQL bundles from the toolcache before downloading a different bundle, which frees up disk space for the analysis. We expect to roll this change out to everyone in September. <a href="https://redirect.github.com/github/codeql-action/pull/4124">#4124</a></li> <li>The CodeQL Action now supports CodeQL releases that are compatible with Linux Arm64 and downloads the native <code>linux-arm64</code> CodeQL bundle when available. <a href="https://redirect.github.com/github/codeql-action/pull/4072">#4072</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.0">2.27.0</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4129">#4129</a></li> </ul> <h2>4.37.9 - 26 Aug 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.4">2.26.4</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4106">#4106</a></li> </ul> <h2>4.37.8 - 21 Aug 2026</h2> <p>No user facing changes.</p> <h2>4.37.7 - 13 Aug 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.3">2.26.3</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4085">#4085</a></li> </ul> <h2>4.37.6 - 04 Aug 2026</h2> <ul> <li>Changed the default filepath for the new remote file address format that was introduced in CodeQL Action 4.37.0 / 3.37.0 to <code>.github/codeql-config.yml</code> to align it with the suggested path that is used elsewhere. <a href="https://redirect.github.com/github/codeql-action/pull/4070">#4070</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/github/codeql-action/commit/24c54180a607b1449ed407dd24f251e4e9147c8d"><code>24c5418</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4214">#4214</a> from github/update-v4.38.3-e0b52dbdc</li> <li><a href="https://github.com/github/codeql-action/commit/69e87c56c1db5253592f61da177da1d20d033bd8"><code>69e87c5</code></a> Add changelog note for <a href="https://redirect.github.com/github/codeql-action/issues/4184">#4184</a></li> <li><a href="https://github.com/github/codeql-action/commit/23b682830be5e93afb6466bfc0197142d70268aa"><code>23b6828</code></a> Update changelog for v4.38.3</li> <li><a href="https://github.com/github/codeql-action/commit/e0b52dbdc5c3376dd8cb78e956fd23fa07ca2c5b"><code>e0b52db</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4210">#4210</a> from github/henrymercer/pin-python-for-older-clis-in-ci</li> <li><a href="https://github.com/github/codeql-action/commit/6b99698c8cda6115e2bc7c52226b508dc558d7dc"><code>6b99698</code></a> Pin Python 3.13.15 for older CLI versions in multi-language check</li> <li><a href="https://github.com/github/codeql-action/commit/63d3d632fc7cbd91c8089c7fea5322f1bc73d7d8"><code>63d3d63</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4203">#4203</a> from github/update-bundle/codeql-bundle-v2.27.2</li> <li><a href="https://github.com/github/codeql-action/commit/7377a10091aa5d781c1d36dc3834817d8ad0acfe"><code>7377a10</code></a> Add changelog note</li> <li><a href="https://github.com/github/codeql-action/commit/c1a30cda114f23a88a09ab61f4ec08c312d2c524"><code>c1a30cd</code></a> Update default bundle to codeql-bundle-v2.27.2</li> <li><a href="https://github.com/github/codeql-action/commit/d208ec71e39ae46397cbf6569bef8439b9aab974"><code>d208ec7</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4200">#4200</a> from github/mbg/esm/migrate-pr-checks</li> <li><a href="https://github.com/github/codeql-action/commit/a71b0c6684dea6ca627a472a11bf5b80bd47c845"><code>a71b0c6</code></a> Replace <code>__dirname</code> in <code>sync.ts</code></li> <li>Additional commits viewable in <a href="https://github.com/github/codeql-action/compare/2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2...24c54180a607b1449ed407dd24f251e4e9147c8d">compare view</a></li> </ul> </details> <br /> Updates `github/codeql-action/analyze` from 4.38.2 to 4.38.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/releases">github/codeql-action/analyze's releases</a>.</em></p> <blockquote> <h2>v4.38.3</h2> <ul> <li><em>Upcoming breaking change</em>: CodeQL version 2.21.2 and earlier were discontinued on 24 September 2026 alongside GitHub Enterprise Server 3.17, and will be unsupported by the next minor release of the CodeQL Action. Added a deprecation warning for customers using these versions of CodeQL. <a href="https://redirect.github.com/github/codeql-action/pull/4188">#4188</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.2">2.27.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4203">#4203</a></li> <li>Fixed a bug where the decision of whether to use a per-language bundle did not account for custom configurations that reference queries outside of compiled CodeQL packs. This issue was caught during internal testing and did not affect any customer repositories. We will resume the roll out of per-language bundles in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4184">#4184</a></li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/github/codeql-action/blob/main/CHANGELOG.md">github/codeql-action/analyze's changelog</a>.</em></p> <blockquote> <h1>CodeQL Action Changelog</h1> <p>See the <a href="https://github.com/github/codeql-action/releases">releases page</a> for the relevant changes to the CodeQL CLI and language packs.</p> <h2>[UNRELEASED]</h2> <p>No user facing changes.</p> <h2>4.39.0 - 15 Oct 2026</h2> <ul> <li><em>Breaking change</em>: Bump the minimum required CodeQL bundle version to 2.20.7. <a href="https://redirect.github.com/github/codeql-action/pull/4205">#4205</a></li> <li>The <code>codeql-action/analyze</code> step now validates that a correct argument for the <code>checkout_path</code> input has been provided. The <code>checkout_path</code> input must be set to the path where the repository that is being analyzed is checked out at on the runner, if that path is something other than the workspace root. If the path does not point to a repository checkout or is different from the path that was used by <code>codeql-action/init</code>, then the CodeQL Action now produces a warning. <a href="https://redirect.github.com/github/codeql-action/pull/4148">#4148</a></li> <li>Resolved an issue with third-party caching implementations that prevented caches from being restored correctly. <a href="https://redirect.github.com/github/codeql-action/pull/4206">#4206</a></li> <li>The <code>codeql-action/start-proxy</code> step that is used in Code Scanning Default Setup now finds CodeQL releases using the same logic as <code>codeql-action/init</code>. This primarily benefits customers who are using GitHub instances other than <code>github.com</code> where the <code>codeql-action/start-proxy</code> step may previously have been unable to locate recent releases and ended up using outdated versions of the private registry authentication proxy as a result. <a href="https://redirect.github.com/github/codeql-action/pull/4198">#4198</a></li> </ul> <h2>4.38.3 - 08 Oct 2026</h2> <ul> <li><em>Upcoming breaking change</em>: CodeQL version 2.21.2 and earlier were discontinued on 24 September 2026 alongside GitHub Enterprise Server 3.17, and will be unsupported by the next minor release of the CodeQL Action. Added a deprecation warning for customers using these versions of CodeQL. <a href="https://redirect.github.com/github/codeql-action/pull/4188">#4188</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.2">2.27.2</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4203">#4203</a></li> <li>Fixed a bug where the decision of whether to use a per-language bundle did not account for custom configurations that reference queries outside of compiled CodeQL packs. This issue was caught during internal testing and did not affect any customer repositories. We will resume the roll out of per-language bundles in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4184">#4184</a></li> </ul> <h2>4.38.2 - 24 Sept 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.1">2.27.1</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4160">#4160</a></li> </ul> <h2>4.38.1 - 18 Sept 2026</h2> <ul> <li>The CodeQL Action now has experimental support for CodeQL releases for which per-language bundles are available. Per-language bundles support analysis for a single language and are therefore smaller than the combined bundles that allow analysis for all supported languages. As a result, per-language bundles take up less space on disk and are faster to download. We expect to roll this change out to everyone in the coming weeks. <a href="https://redirect.github.com/github/codeql-action/pull/4146">#4146</a></li> </ul> <h2>4.38.0 - 09 Sept 2026</h2> <ul> <li>On GitHub-hosted runners, the CodeQL Action now deletes unused CodeQL bundles from the toolcache before downloading a different bundle, which frees up disk space for the analysis. We expect to roll this change out to everyone in September. <a href="https://redirect.github.com/github/codeql-action/pull/4124">#4124</a></li> <li>The CodeQL Action now supports CodeQL releases that are compatible with Linux Arm64 and downloads the native <code>linux-arm64</code> CodeQL bundle when available. <a href="https://redirect.github.com/github/codeql-action/pull/4072">#4072</a></li> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.27.0">2.27.0</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4129">#4129</a></li> </ul> <h2>4.37.9 - 26 Aug 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.4">2.26.4</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4106">#4106</a></li> </ul> <h2>4.37.8 - 21 Aug 2026</h2> <p>No user facing changes.</p> <h2>4.37.7 - 13 Aug 2026</h2> <ul> <li>Update default CodeQL bundle version to <a href="https://github.com/github/codeql-action/releases/tag/codeql-bundle-v2.26.3">2.26.3</a>. <a href="https://redirect.github.com/github/codeql-action/pull/4085">#4085</a></li> </ul> <h2>4.37.6 - 04 Aug 2026</h2> <ul> <li>Changed the default filepath for the new remote file address format that was introduced in CodeQL Action 4.37.0 / 3.37.0 to <code>.github/codeql-config.yml</code> to align it with the suggested path that is used elsewhere. <a href="https://redirect.github.com/github/codeql-action/pull/4070">#4070</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/github/codeql-action/commit/24c54180a607b1449ed407dd24f251e4e9147c8d"><code>24c5418</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4214">#4214</a> from github/update-v4.38.3-e0b52dbdc</li> <li><a href="https://github.com/github/codeql-action/commit/69e87c56c1db5253592f61da177da1d20d033bd8"><code>69e87c5</code></a> Add changelog note for <a href="https://redirect.github.com/github/codeql-action/issues/4184">#4184</a></li> <li><a href="https://github.com/github/codeql-action/commit/23b682830be5e93afb6466bfc0197142d70268aa"><code>23b6828</code></a> Update changelog for v4.38.3</li> <li><a href="https://github.com/github/codeql-action/commit/e0b52dbdc5c3376dd8cb78e956fd23fa07ca2c5b"><code>e0b52db</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4210">#4210</a> from github/henrymercer/pin-python-for-older-clis-in-ci</li> <li><a href="https://github.com/github/codeql-action/commit/6b99698c8cda6115e2bc7c52226b508dc558d7dc"><code>6b99698</code></a> Pin Python 3.13.15 for older CLI versions in multi-language check</li> <li><a href="https://github.com/github/codeql-action/commit/63d3d632fc7cbd91c8089c7fea5322f1bc73d7d8"><code>63d3d63</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4203">#4203</a> from github/update-bundle/codeql-bundle-v2.27.2</li> <li><a href="https://github.com/github/codeql-action/commit/7377a10091aa5d781c1d36dc3834817d8ad0acfe"><code>7377a10</code></a> Add changelog note</li> <li><a href="https://github.com/github/codeql-action/commit/c1a30cda114f23a88a09ab61f4ec08c312d2c524"><code>c1a30cd</code></a> Update default bundle to codeql-bundle-v2.27.2</li> <li><a href="https://github.com/github/codeql-action/commit/d208ec71e39ae46397cbf6569bef8439b9aab974"><code>d208ec7</code></a> Merge pull request <a href="https://redirect.github.com/github/codeql-action/issues/4200">#4200</a> from github/mbg/esm/migrate-pr-checks</li> <li><a href="https://github.com/github/codeql-action/commit/a71b0c6684dea6ca627a472a11bf5b80bd47c845"><code>a71b0c6</code></a> Replace <code>__dirname</code> in <code>sync.ts</code></li> <li>Additional commits viewable in <a href="https://github.com/github/codeql-action/compare/2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2...24c54180a607b1449ed407dd24f251e4e9147c8d">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
4af4940687 |
build(deps-dev): bump the npm-deps group across 1 directory with 8 updates (#1471)
Bumps the npm-deps group with 8 updates in the /src/frontend directory: | Package | From | To | | --- | --- | --- | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.6.3` | `26.6.5` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.1.1` | `6.1.2` | | [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.38.0` | `6.41.0` | | [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) | `0.71.0` | `0.72.0` | | [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) | `1.86.0` | `1.87.0` | | [oxlint-tsgolint](https://github.com/oxc-project/tsgolint) | `7.0.2003` | `7.0.2004` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.3.1` | `8.3.4` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `5.0.2` | `5.0.4` | Updates `@types/node` from 26.6.3 to 26.6.5 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node">compare view</a></li> </ul> </details> <br /> Updates `@vitejs/plugin-react` from 6.1.1 to 6.1.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite-plugin-react/releases">@vitejs/plugin-react's releases</a>.</em></p> <blockquote> <h2>plugin-react@6.1.2</h2> <h3>Fix HMR for compound components (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1484">#1484</a>)</h3> <p>Adding or removing a component from a compound component was not handled, creating stale updates. Doing this now triggers hmr invalidate on the file and propagates the invalidation to importers.</p> <h3>Fix <code>compiler.logDiagnostics</code> option not working (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1483">#1483</a>)</h3> <p>With <code>oxc-transform-react</code> >= 0.148, the <code>logDiagnostics</code> was not working. This version fixes it and requires <code>oxc-transform-react</code> >= 0.152 as a peer dependency if you are using the <code>compiler</code> option. <code>compiler.logDiagnostics</code> option is now deprecated and should be swapped for the builtin <code>compiler.reportDiagnostics</code>.</p> <h3>Disable refresh for non-jsx with compiler enabled (fix <a href="https://redirect.github.com/vitejs/vite-plugin-react/issues/1478">#1478</a>) (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1485">#1485</a>)</h3> <p>When the compiler was enabled, TS files could trigger fast refresh which would cause runtime errors. The logic now follows what the builtin oxc plugin in Vite does.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md">@vitejs/plugin-react's changelog</a>.</em></p> <blockquote> <h2>6.1.2 (2026-10-05)</h2> <h3>Fix HMR for compound components (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1484">#1484</a>)</h3> <p>Adding or removing a component from a compound component was not handled, creating stale updates. Doing this now triggers hmr invalidate on the file and propagates the invalidation to importers.</p> <h3>Fix <code>compiler.logDiagnostics</code> option not working (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1483">#1483</a>)</h3> <p>With <code>oxc-transform-react</code> >= 0.148, the <code>logDiagnostics</code> was not working. This version fixes it and requires <code>oxc-transform-react</code> >= 0.152 as a peer dependency if you are using the <code>compiler</code> option. <code>compiler.logDiagnostics</code> option is now deprecated and should be swapped for the builtin <code>compiler.reportDiagnostics</code>.</p> <h3>Disable refresh for non-jsx with compiler enabled (fix <a href="https://redirect.github.com/vitejs/vite-plugin-react/issues/1478">#1478</a>) (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1485">#1485</a>)</h3> <p>When the compiler was enabled, TS files could trigger fast refresh which would cause runtime errors. The logic now follows what the builtin oxc plugin in Vite does.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/ac47648e17674299accb51816e9e33b8a7b07b05"><code>ac47648</code></a> release: plugin-react@6.1.2 (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1491">#1491</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/98277e7d49fea7fa707170d2892738c8bfb5f1c0"><code>98277e7</code></a> fix(deps): update all non-major dependencies (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1486">#1486</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/12eddea34ae9de92b3dc8d8b8a76fa1260b781bf"><code>12eddea</code></a> fix(hmr): better handle compound components (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1484">#1484</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/3cfb1d1114df64cf9aeee4aae0ac951d0c2f3abf"><code>3cfb1d1</code></a> fix(plugin-react): fix <code>compiler.logDiagnostics</code> (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1483">#1483</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/6de9915e1b4c1b8a7b390eb1364ab6cd83d64e62"><code>6de9915</code></a> fix(plugin-react): disable refresh for non-jsx with compiler enabled (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1485">#1485</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/ee97d2f3bd25cda8f06c27366722f01aaac0201f"><code>ee97d2f</code></a> fix(deps): update all non-major dependencies (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1445">#1445</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/b0a014da31be23c7806ffb0b997ec53b52ab68f2"><code>b0a014d</code></a> chore: use Babel 8 for babel compiler playgrounds (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1460">#1460</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/61b650fe93c3fe30d79aa8615199cdcb0a2594f4"><code>61b650f</code></a> fix(deps): update react-related dependencies (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1452">#1452</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/736efe2f004002abee693a44b405e70699432ecd"><code>736efe2</code></a> chore(deps): update tsdown to v0.23 (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1451">#1451</a>)</li> <li>See full diff in <a href="https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.2/packages/plugin-react">compare view</a></li> </ul> </details> <br /> Updates `knip` from 6.38.0 to 6.41.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/webpro-nl/knip/releases">knip's releases</a>.</em></p> <blockquote> <h2>Release 6.41.0</h2> <ul> <li>Add Flue plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2124">#2124</a>) (c52737d45ff008d6d96d4c2d4182048a2aa64602) - thanks <a href="https://github.com/LuisFigueroaG"><code>@LuisFigueroaG</code></a>!</li> <li>Match all React Native config file extensions (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2125">#2125</a>) (898fdffb37ae0bdb3d2653038eb10c2e01edf983) - thanks <a href="https://github.com/LuisFigueroaG"><code>@LuisFigueroaG</code></a>!</li> <li>Consolidate fixture guidance and extend plugin guidelines (37a4ca04645f71f599e9b530676543f9893bd641)</li> <li>Add AI contribution policy (b15f0fbb090ea0427240880da2bec602c11cea50)</li> <li>Use files from tsconfig references with --use-tsconfig-files (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2126">#2126</a>) (9618185eafb0c5cb365035f89e9d66718642338a) - thanks <a href="https://github.com/kaanisthatyou"><code>@kaanisthatyou</code></a>!</li> <li>Compile gitignore walk patterns once (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2127">#2127</a>) (09c80299779fa5abe133ee8f82051c25870007b8)</li> <li>Drop readdir order dependent case from gitignore walk test (ab3da8ff95a05a0fbfba6873b64559017d038aa7)</li> <li>fix: recognize binaries from absent optional dependencies (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2120">#2120</a>) (d908556eaa98bf9637a2744d2de089bab31b8dbc) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Apply a directory's .gitignore before walking its subdirectories (9560c07862d4c72dc956371b9a77e049d83ed4a9)</li> <li>Apply nested .gitignore files to workspace globs (23d35421dd67c405254f2f8bcbc09b18d224e338)</li> <li>Update gitignore matcher and walk notes (499f85f4544457dc7c51c4a7612fea69773ef3dd)</li> <li>Keep the cwd out of glob patterns and matchers (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2107">#2107</a>) (1e82fb807c88cc46951f2028214569f9a2eb0061) - thanks <a href="https://github.com/kaanisthatyou"><code>@kaanisthatyou</code></a>!</li> <li>Support function configs in Rsbuild plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2122">#2122</a>) (38071db87e9023e5dd61173ce32f9020a1a5d7ff) - thanks <a href="https://github.com/bytedoe"><code>@bytedoe</code></a>!</li> <li>Separate Expo Router plugin; remove expo-router entry points from Expo plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2128">#2128</a>) (ad541764ca7d3c062236661677d1d66d5275122f) - thanks <a href="https://github.com/jjjjonathan"><code>@jjjjonathan</code></a>!</li> <li>Link Expo config discovery source and fold expo6 fixture into expo-router (2ddeca50956790b10580e835df50bc980cce961d)</li> <li>Update dependencies (c9f79148f7165314a7b3c801eff926d1d0d6b060)</li> <li>Migrate shell script parsing to unbash v5 (4942cca05303410120a007a5bb23b0c2da725da1)</li> <li>Handle updated Formatly result types (ca9e8315e003dae69646f7500fa98ab9ed403b92)</li> <li>Preserve TypeScript 5.0 compatibility in shell AST filters (957ac7bbd654f6d3d0c4dc4eab2f4aa133ff0b4b)</li> <li>Point timerify crashes to the Node.js version that fixes them (0c235de096fd3361eb918d1290241fa32a62f089)</li> <li>Copy importer identifier sets into the reverse index (2860d678a87dddb5ad56299119fb6e108ceffa12)</li> <li>Clear the resolver cache at the start of a run (10b5bb82ecd03c88b68ace58a7aea23d188cc5f1)</li> </ul> <h2>Release 6.40.0</h2> <ul> <li>Resolve local and scope-only extends in commitlint plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2079">#2079</a>) (e667552d4e7122094565d3ad9ae407acfc0ac684) - thanks <a href="https://github.com/giaBaoJS"><code>@giaBaoJS</code></a>!</li> <li>Clarify worktree guides and plugin review preparation (dd02baf020d23af1d47c44c1a726a61014b270bd)</li> <li>Document stale cache results and workarounds (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2078">#2078</a>) (3573749a5d5bbee6305f207cc7d1b72c200c8c9b)</li> <li>Exclude test files from package entries in production mode (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2082">#2082</a>) (b86f45f9d38d4b83baad98e43983e08910e00c78) - thanks <a href="https://github.com/jonathanong"><code>@jonathanong</code></a>!</li> <li>Resolve Serverless file variables in plugins and functions (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2074">#2074</a>) (99cac789694ea8d76cd38184d2d7c95f34315224) - thanks <a href="https://github.com/SwastikTripathi"><code>@SwastikTripathi</code></a>!</li> <li>Preserve locally referenced namespace members (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2070">#2070</a>) (f0f36df766cd74ad7ae03fbf8940bdeb792439be) - thanks <a href="https://github.com/MFA-G"><code>@MFA-G</code></a>!</li> <li>fix: add the commitlint-plugin prefix to Commitlint plugin names (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2096">#2096</a>) (3decd35ff0a4220c7cd2c9142dc69c89794b3927) - thanks <a href="https://github.com/devYRPauli"><code>@devYRPauli</code></a>!</li> <li>fix: match .mjs config files in the simple-git-hooks plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2097">#2097</a>) (79a87d92396c2444ae4ef3c780c0d2e18cd73e4c) - thanks <a href="https://github.com/devYRPauli"><code>@devYRPauli</code></a>!</li> <li>fix: match capacitor.config.js in the Capacitor plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2098">#2098</a>) (4a5ec96d818117a7f2eafa027e3b707bc97573a8) - thanks <a href="https://github.com/devYRPauli"><code>@devYRPauli</code></a>!</li> <li>fix(typescript): ArrayExpression (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2099">#2099</a>) (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2100">#2100</a>) (87fea9f201c2fd864eafa31bdad68910a8a177ba) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Preserve development entry pattern groups (7c229f4e1918075d801ed3b046fa022b1d3bcc41)</li> <li>Resolve null package exports to the files they hide (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2084">#2084</a>, close <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2085">#2085</a>) (5bd46260feb60b957c2631bc72375ef192e441e0)</li> <li>Pin InvokeAI ecosystem test (4e0a3432eb35e3f628f6d3b7fcd14b942de343d0)</li> <li>fix(utils): add jsx extension to source mapping (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2087">#2087</a>) (eaa353b5fc30c2f12cdf2c29e6dd68e0d0950062) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>fix(serverless-framework): handle explicit extensions in handler paths (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2091">#2091</a>) (e9393965be7563640921e3f20c946fcb9132e1cb) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Annotate published manifest return type (d95a8310a0d0dca8f23d8dd3f83e7b0a1909d038)</li> <li>Add Jasmine plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2105">#2105</a>) (9ed14911d5c5752aef36878ab3d515c35d1ac6bc) - thanks <a href="https://github.com/SulimanAbdulrazzaq"><code>@SulimanAbdulrazzaq</code></a>!</li> <li>fix: resolve workspace exports with fallback arrays (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2088">#2088</a>) (49c2aaeaba4544f25cc02c19d5da5152a8ef68c3) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>fix(postcss): ignore disabled plugins in object configs (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2092">#2092</a>) (b84fdf8a8ee676ee45f4313009ebfe969d034a88) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Resolve webServer commands in Playwright plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2110">#2110</a>) (1af96bce36b0d0d07791de100c7f2ea5672a478c) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>Cache config file inputs per plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2109">#2109</a>) (01cb43267ca5dc03a2cbcba0a19fd891d4ed1f37) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>fix: include custom compiler extensions in source path mapping (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2090">#2090</a>) (dc3a47e2d810808314454b8f5c23070f136d15d3) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Don't let a self-closing <!-- raw HTML omitted --> swallow the next <!-- raw HTML omitted --> (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2113">#2113</a>) (989fdadde0a068d1d1c52e26a8327b99c5de0668) - thanks <a href="https://github.com/maniflopi"><code>@maniflopi</code></a>!</li> <li>fix(oxlint): resolve lint from loaded Vite config (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2108">#2108</a>) (6d44e532ed6320cdf4f4c3253b26e155c4d26ba7) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>fix: resolve Jest module names without the jest-* prefix (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2095">#2095</a>) (a5f4cfbff7f263a0ea8d5461a3f9216cbef38602) - thanks <a href="https://github.com/devYRPauli"><code>@devYRPauli</code></a>!</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/webpro-nl/knip/commit/13d7f21e8ec5b30d8fe6d8377c9012b9db96f871"><code>13d7f21</code></a> Release knip@6.41.0</li> <li><a href="https://github.com/webpro-nl/knip/commit/10b5bb82ecd03c88b68ace58a7aea23d188cc5f1"><code>10b5bb8</code></a> Clear the resolver cache at the start of a run</li> <li><a href="https://github.com/webpro-nl/knip/commit/2860d678a87dddb5ad56299119fb6e108ceffa12"><code>2860d67</code></a> Copy importer identifier sets into the reverse index</li> <li><a href="https://github.com/webpro-nl/knip/commit/0c235de096fd3361eb918d1290241fa32a62f089"><code>0c235de</code></a> Point timerify crashes to the Node.js version that fixes them</li> <li><a href="https://github.com/webpro-nl/knip/commit/957ac7bbd654f6d3d0c4dc4eab2f4aa133ff0b4b"><code>957ac7b</code></a> Preserve TypeScript 5.0 compatibility in shell AST filters</li> <li><a href="https://github.com/webpro-nl/knip/commit/ca9e8315e003dae69646f7500fa98ab9ed403b92"><code>ca9e831</code></a> Handle updated Formatly result types</li> <li><a href="https://github.com/webpro-nl/knip/commit/4942cca05303410120a007a5bb23b0c2da725da1"><code>4942cca</code></a> Migrate shell script parsing to unbash v5</li> <li><a href="https://github.com/webpro-nl/knip/commit/c9f79148f7165314a7b3c801eff926d1d0d6b060"><code>c9f7914</code></a> Update dependencies</li> <li><a href="https://github.com/webpro-nl/knip/commit/2ddeca50956790b10580e835df50bc980cce961d"><code>2ddeca5</code></a> Link Expo config discovery source and fold expo6 fixture into expo-router</li> <li><a href="https://github.com/webpro-nl/knip/commit/ad541764ca7d3c062236661677d1d66d5275122f"><code>ad54176</code></a> Separate Expo Router plugin; remove expo-router entry points from Expo plugin...</li> <li>Additional commits viewable in <a href="https://github.com/webpro-nl/knip/commits/knip@6.41.0/packages/knip">compare view</a></li> </ul> </details> <br /> Updates `oxfmt` from 0.71.0 to 0.72.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/oxc-project/oxc/releases">oxfmt's releases</a>.</em></p> <blockquote> <h2>oxfmt v0.72.0</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>e2c68b1 oxfmt: [<strong>BREAKING</strong>] Format <code>parser:markdown</code> files by <code>oxc_formatter_markdown</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27256">#27256</a>) (leaysgur)</li> </ul> <h3>🚀 Features</h3> <ul> <li>b538e3c formatter_css: Parse embedded CSS as a block's contents (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27284">#27284</a>) (leaysgur)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>71e400b formatter_markdown: Fixed remaining issues found by fuzz (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27334">#27334</a>) (leaysgur)</li> <li>7d0e54d formatter_markdown: Preserve line breaks around Chinese/Japanese characters in all <code>proseWrap</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27331">#27331</a>) (leaysgur)</li> <li>e9ae2d8 formatter_css: Fix layouts found in mdn-content repo (css-in-md) (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27326">#27326</a>) (leaysgur)</li> <li>df85b4c oxfmt: Keep blank lines after a line break in Prettier Doc to IR (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27325">#27325</a>) (leaysgur)</li> <li>7f65b75 formatter: Format assignment target property as assignment-like (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27289">#27289</a>) (leaysgur)</li> <li>6c08f2a formatter_css: Apply the <code>url()</code> import exception to a lone comma group (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27288">#27288</a>) (leaysgur)</li> <li>1967302 formatter_css: Hug a spaced <code>ident (</code> only at the at-rule prelude head (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27283">#27283</a>) (leaysgur)</li> <li>2445064 formatter_markdown: Keep a preserved line break before a delimiter row that opens no table (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27278">#27278</a>) (leaysgur)</li> <li>dd72fbf formatter_markdown: Keep container columns as spaces under <code>useTabs</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27277">#27277</a>) (leaysgur)</li> <li>1686018 oxfmt: Make one state <code>conditionalGroup</code> fit up to first <code>hardline</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27275">#27275</a>) (leaysgur)</li> <li>fd4ddce formatter_json: Flatten block comment only array|object (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27274">#27274</a>) (leaysgur)</li> <li>267557c formatter,oxfmt: Embed only original JSDoc plugin supported languages (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27241">#27241</a>) (leaysgur)</li> <li>2606c60 oxfmt: Do not re-include a file below an excluded directory with a negated pattern (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27237">#27237</a>) (Nicolas Le Cam)</li> <li>c2de02b formatter: Decide embedded template layout from AST, not source shape (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27218">#27218</a>) (leaysgur)</li> <li>c9e1224 formatter: Handle <code>quoteProps: consistent</code> for patterns and computed keys (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27216">#27216</a>) (leaysgur)</li> <li>36e14df formatter: Keep comments between callee and its opener on the callee side (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27172">#27172</a>) (leaysgur)</li> <li>6da7657 oxfmt: Render diagnostics with source in Stdin mode (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27130">#27130</a>) (leaysgur)</li> <li>e9b2ec5 oxfmt/lsp: Reload <code>.prettierignore</code> on watched file change (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27129">#27129</a>) (leaysgur)</li> <li>30eb463 oxfmt: Check global ignores before resolving nested config in Stdin mode (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27128">#27128</a>) (leaysgur)</li> </ul> <h3>⚡ Performance</h3> <ul> <li>72f42a3 formatter_markdown: Pre-allocate the IR buffer (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27333">#27333</a>) (leaysgur)</li> <li>cea47e3 formatter_core: Avoid exponential <code>will_break</code> check on nested interned (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27211">#27211</a>) (leaysgur)</li> <li>0aba566 oxfmt: Do not resolve root js config from nested context (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27147">#27147</a>) (leaysgur)</li> </ul> <h3>📚 Documentation</h3> <ul> <li>51506c6 formatter_css: Record divergences found in mdn-content (css-in-md) (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27327">#27327</a>) (leaysgur)</li> <li>656b81c formatter_markdown: Record unclosed fences closing at a directive's closer (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27279">#27279</a>) (leaysgur)</li> <li>66545bf formatter_markdown: Record setext heading wrap divergence (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27221">#27221</a>) (leaysgur)</li> <li>af4b269 oxfmt: Document why <code>format()</code> API does not take cwd (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27131">#27131</a>) (leaysgur)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/2bd08ebe8f36fcf1954a675ffdeb4c6d0129f609"><code>2bd08eb</code></a> release(apps): oxlint v1.87.0 && oxfmt v0.72.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27341">#27341</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxfmt_v0.72.0/npm/oxfmt">compare view</a></li> </ul> </details> <br /> Updates `oxlint` from 1.86.0 to 1.87.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/oxc-project/oxc/releases">oxlint's releases</a>.</em></p> <blockquote> <h2>oxlint v1.87.0</h2> <h3>🚀 Features</h3> <ul> <li>42dcfd2 linter/react/no-unescaped-entities: Implement suggestion (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27292">#27292</a>) (Mikhail Baev)</li> <li>cd4510d linter/unicorn/no-useless-switch-case: Implement suggestion (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27245">#27245</a>) (Mikhail Baev)</li> <li>1a7c902 linter/react/jsx-no-target-blank: Implement suggestion (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27181">#27181</a>) (Mikhail Baev)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>176b4b9 linter/jsx-a11y/label-has-associated-control: Validate label attribute values (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27302">#27302</a>) (sama Pyb)</li> <li>7d381c3 linter/jsx-a11y/mouse-events-have-key-events: Handle nullish event handlers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27306">#27306</a>) (sama Pyb)</li> <li>4e09837 linter/jsx-a11y/lang: Validate lang expression strings (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27304">#27304</a>) (sama Pyb)</li> <li>7d28a66 linter/unicorn/numeric-separators-style: Report misgrouped BigInt literals (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27207">#27207</a>) (breken)</li> <li>e928322 linter/unicorn/no-zero-fractions: Parenthesize separator and large integers in fixer (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27206">#27206</a>) (breken)</li> <li>3d61a59 parser: Validate TypeScript type member separators (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27222">#27222</a>) (camc314)</li> <li>f08236b linter/eslint/prefer-exponentiation-operator: Preserve autofix precedence (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27150">#27150</a>) (camc314)</li> <li>7d60ae3 linter/valid-title: Continue checks after allowed words (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27146">#27146</a>) (Cameron)</li> <li>ad5dd5d linter/eslint/no-unused-vars: Respect disabled argument checks for used ignore patterns (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26925">#26925</a>) (camc314)</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md">oxlint's changelog</a>.</em></p> <blockquote> <h1>Changelog</h1> <p>All notable changes to this package will be documented in this file.</p> <p>The format is based on <a href="https://keepachangelog.com/en/1.0.0">Keep a Changelog</a>.</p> <h2>[1.88.0] - 2026-10-13</h2> <h3>🚀 Features</h3> <ul> <li>3c361a7 linter/unicorn/prefer-query-selector: Add <code>allowWithVariables</code> option (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27346">#27346</a>) (Mikhail Baev)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/2bd08ebe8f36fcf1954a675ffdeb4c6d0129f609"><code>2bd08eb</code></a> release(apps): oxlint v1.87.0 && oxfmt v0.72.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27341">#27341</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxlint_v1.87.0/npm/oxlint">compare view</a></li> </ul> </details> <br /> Updates `oxlint-tsgolint` from 7.0.2003 to 7.0.2004 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/oxc-project/tsgolint/releases">oxlint-tsgolint's releases</a>.</em></p> <blockquote> <h2>v7.0.2004</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): update taiki-e/install-action action to v2.87.20 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1246">oxc-project/tsgolint#1246</a></li> <li>chore(deps): update dependency dprint-json to v0.25.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1247">oxc-project/tsgolint#1247</a></li> <li>fix(no-unsafe-return): preserve deferred indexed return type by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1248">oxc-project/tsgolint#1248</a></li> <li>chore(deps): update crate-ci/typos action to v1.50.3 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1250">oxc-project/tsgolint#1250</a></li> <li>fix(no-misused-promises): don't report comma expressions as conditionals by <a href="https://github.com/geniusmonir"><code>@geniusmonir</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1254">oxc-project/tsgolint#1254</a></li> <li>chore(deps): update gomod by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1257">oxc-project/tsgolint#1257</a></li> <li>chore(deps): update dprint plugins by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1256">oxc-project/tsgolint#1256</a></li> <li>chore(deps): update taiki-e/install-action action to v2.87.22 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1258">oxc-project/tsgolint#1258</a></li> <li>chore(deps): update npm packages by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1259">oxc-project/tsgolint#1259</a></li> <li>fix(no-floating-promises): respect safe-call declaration sources by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1261">oxc-project/tsgolint#1261</a></li> <li>fix(no-unsafe-return): avoid panic on JSDoc callbacks without returns by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1264">oxc-project/tsgolint#1264</a></li> <li>fix(no-deprecated): include reasons for variable declarations by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1266">oxc-project/tsgolint#1266</a></li> <li>fix(no-unnecessary-type-parameters): parenthesize constraint in optional tuple elements by <a href="https://github.com/baevm"><code>@baevm</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1267">oxc-project/tsgolint#1267</a></li> <li>chore(deps): update crate-ci/typos action to v1.51.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1268">oxc-project/tsgolint#1268</a></li> <li>chore(deps): update crate-ci/typos action to v1.51.1 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1269">oxc-project/tsgolint#1269</a></li> <li>fix: restore line disable comments for type-aware diagnostics by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1271">oxc-project/tsgolint#1271</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/geniusmonir"><code>@geniusmonir</code></a> made their first contribution in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1254">oxc-project/tsgolint#1254</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/oxc-project/tsgolint/compare/v7.0.2003...v7.0.2004">https://github.com/oxc-project/tsgolint/compare/v7.0.2003...v7.0.2004</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/tsgolint/commit/a61289117febcb1a60cf3bc75ef2b6bbccc4b665"><code>a612891</code></a> fix: restore line disable comments for type-aware diagnostics (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1271">#1271</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/fc7068f798b045829f25650ec669ee28896bba0b"><code>fc7068f</code></a> chore(deps): update crate-ci/typos action to v1.51.1 (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1269">#1269</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/8d4c05c9245c1f67a7419b596001dd5ac55d585e"><code>8d4c05c</code></a> chore(deps): update crate-ci/typos action to v1.51.0 (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1268">#1268</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/6d20f350733b76ce3cf4a6c52ece675412fefca5"><code>6d20f35</code></a> fix(no-unnecessary-type-parameters): parenthesize constraint in optional tupl...</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/322b3856ef035c220c39ef1b37cf70413f80566d"><code>322b385</code></a> fix(no-deprecated): include reasons for variable declarations (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1266">#1266</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/db76296ac176722cd2bd3431fafd07c48815f310"><code>db76296</code></a> fix(no-unsafe-return): avoid panic on JSDoc callbacks without returns (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1264">#1264</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/24b18b48c47b7ae0d84e21a0e974575026e27908"><code>24b18b4</code></a> fix(no-floating-promises): respect safe-call declaration sources (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1261">#1261</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/c8f5cbc884b706c42efb8b451fe31d2f1079df10"><code>c8f5cbc</code></a> chore(deps): update npm packages (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1259">#1259</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/93fe3a5123616ced5fe0015d080c88ad34843bc7"><code>93fe3a5</code></a> chore(deps): update taiki-e/install-action action to v2.87.22 (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1258">#1258</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/dd0a3068c463b875d5f0649a40bfcb2991b13e0b"><code>dd0a306</code></a> chore(deps): update dprint plugins (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1256">#1256</a>)</li> <li>Additional commits viewable in <a href="https://github.com/oxc-project/tsgolint/compare/v7.0.2003...v7.0.2004">compare view</a></li> </ul> </details> <br /> Updates `vite` from 8.3.1 to 8.3.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite/releases">vite's releases</a>.</em></p> <blockquote> <h2>v8.3.4</h2> <h3>Features</h3> <ul> <li><strong>bundled-dev:</strong> support <code>import.meta.hot.acceptExports</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23463">#23463</a>) (<a href="https://github.com/vitejs/vite/commit/bc0f21c56a2e003a4d2dd23ccb9da3ec8c706c4e">bc0f21c</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>avoid mutating hmr defaults (fix <a href="https://redirect.github.com/vitejs/vite/issues/23575">#23575</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23576">#23576</a>) (<a href="https://github.com/vitejs/vite/commit/574d5e351905fe99891364d03c2440531378f7fd">574d5e3</a>)</li> <li><strong>build:</strong> correct preloads when chunkImportMap is enabled with non-root base (<a href="https://redirect.github.com/vitejs/vite/issues/23698">#23698</a>) (<a href="https://github.com/vitejs/vite/commit/2a8c0f05c76e35c43ab3560984a5103c8db8dbcd">2a8c0f0</a>)</li> <li><strong>build:</strong> wait for in-flight stylesheets in preload helper (fix <a href="https://redirect.github.com/vitejs/vite/issues/23652">#23652</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23662">#23662</a>) (<a href="https://github.com/vitejs/vite/commit/036b74599b2fe1d8c61475371b856ceb88d26963">036b745</a>)</li> <li><strong>bundled-dev:</strong> serve <code>/@vite/client</code> and stub <code>@vite/env</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23664">#23664</a>) (<a href="https://github.com/vitejs/vite/commit/5afc5a8876624888fc1e8f43fed1c85c4b0e830b">5afc5a8</a>)</li> <li><strong>client:</strong> skip rewriting unchanged adopted styles (<a href="https://redirect.github.com/vitejs/vite/issues/23697">#23697</a>) (<a href="https://github.com/vitejs/vite/commit/fa7146938b0ca703653c90c20907191a01c032ba">fa71469</a>)</li> <li><strong>css:</strong> resolve imported preprocessors from their file path with lightningcss (<a href="https://redirect.github.com/vitejs/vite/issues/23688">#23688</a>) (<a href="https://github.com/vitejs/vite/commit/cf52011c46409a4a45f3d74bba631b8f005c4bc9">cf52011</a>)</li> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23648">#23648</a>) (<a href="https://github.com/vitejs/vite/commit/8a4c19cfc035f2dd203f2fa6d00ab9256a5e77c9">8a4c19c</a>)</li> <li><strong>deps:</strong> update rolldown-related dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23649">#23649</a>) (<a href="https://github.com/vitejs/vite/commit/794516d50cff80e405bc9b3e5faac1c82987566c">794516d</a>)</li> <li><strong>dev:</strong> a restart requested during a restart used to be dropped (fix <a href="https://redirect.github.com/vitejs/vite/issues/23392">#23392</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23484">#23484</a>) (<a href="https://github.com/vitejs/vite/commit/70d56ea1848909edab416934f3f68ce14343eb73">70d56ea</a>)</li> <li>don't treat modules ending with js-like query as js (<a href="https://redirect.github.com/vitejs/vite/issues/23687">#23687</a>) (<a href="https://github.com/vitejs/vite/commit/fcb6f1252a95857823d935f98554b938888d41a0">fcb6f12</a>)</li> <li><strong>html:</strong> avoid adding filesystem root to watcher (<a href="https://redirect.github.com/vitejs/vite/issues/23689">#23689</a>) (<a href="https://github.com/vitejs/vite/commit/3a7f2aea757d59bae66ad6edf6b321d26a7e6778">3a7f2ae</a>)</li> <li><strong>html:</strong> skip caching CSS of chunks in a cycle (fix <a href="https://redirect.github.com/vitejs/vite/issues/23628">#23628</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23636">#23636</a>) (<a href="https://github.com/vitejs/vite/commit/15d82f7dc679ab9c18d5ce2c3711157c2365ddd1">15d82f7</a>)</li> <li><strong>optimizer:</strong> scan deep imports with custom extensions (<a href="https://redirect.github.com/vitejs/vite/issues/23678">#23678</a>) (<a href="https://github.com/vitejs/vite/commit/8579189bae8626b6ddab55a09325e209d62e027e">8579189</a>)</li> <li>remove input option unescaping for now (<a href="https://redirect.github.com/vitejs/vite/issues/23694">#23694</a>) (<a href="https://github.com/vitejs/vite/commit/facc2fb1fffce03d9e2dd7011d0bd0eeddc7d0f6">facc2fb</a>)</li> <li><strong>server:</strong> match static aliases on path boundaries (<a href="https://redirect.github.com/vitejs/vite/issues/23643">#23643</a>) (<a href="https://github.com/vitejs/vite/commit/b28db28e9e62d9866a9a0f1b22e74589cc180577">b28db28</a>)</li> <li><strong>watcher:</strong> normalize file before root check in <code>ensureWatchedFile</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23673">#23673</a>) (<a href="https://github.com/vitejs/vite/commit/12bb28c22379c8d2fe90088fa0eefbfa2ab3fb80">12bb28c</a>)</li> </ul> <h3>Performance Improvements</h3> <ul> <li><strong>module-runner:</strong> skip cloning call sites that have no source map (<a href="https://redirect.github.com/vitejs/vite/issues/23646">#23646</a>) (<a href="https://github.com/vitejs/vite/commit/3d674869a50a0bca84a8cc8dc55bd35d57100e37">3d67486</a>)</li> </ul> <h3>Code Refactoring</h3> <ul> <li><strong>bundled-dev:</strong> import CSS HMR helpers from <code>/@vite/client</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23674">#23674</a>) (<a href="https://github.com/vitejs/vite/commit/182f5b2a65391da5bee05f9c3df1aeb3794e98d9">182f5b2</a>)</li> </ul> <h2>v8.3.3</h2> <h3>Bug Fixes</h3> <ul> <li><strong>deps:</strong> update launch-editor to v2.14.2 (<a href="https://redirect.github.com/vitejs/vite/issues/23654">#23654</a>) (<a href="https://github.com/vitejs/vite/commit/22fd1d5238cce2ee9db0eb4122f9e8feb6b06097">22fd1d5</a>)</li> <li><strong>html:</strong> filename passed to transformIndexHtml should not include queries (<a href="https://redirect.github.com/vitejs/vite/issues/23653">#23653</a>) (<a href="https://github.com/vitejs/vite/commit/7dafd8e56f152403a3230608fa4005273c2e9e17">7dafd8e</a>)</li> <li><strong>server:</strong> check <code>fs.serve</code> for <code>?vite-wasm-instance</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23655">#23655</a>) (<a href="https://github.com/vitejs/vite/commit/ba8b7ab43b4afa5d0292ab4b6e3a7b5033cc9c73">ba8b7ab</a>)</li> <li><strong>server:</strong> store ids to <code>safeModulePaths</code> rather than URLs (<a href="https://redirect.github.com/vitejs/vite/issues/23656">#23656</a>) (<a href="https://github.com/vitejs/vite/commit/c3e06f92e969952466b4e2f5801e85e1e00cd905">c3e06f9</a>)</li> </ul> <h2>v8.3.2</h2> <h3>Bug Fixes</h3> <ul> <li><strong>build:</strong> preload CSS correctly when <code>renderBuiltUrl</code> returns URLs with queries (<a href="https://redirect.github.com/vitejs/vite/issues/23611">#23611</a>) (<a href="https://github.com/vitejs/vite/commit/64e0a215c24f0522b27b91f93cfd93e317b94481">64e0a21</a>)</li> <li><strong>bundled-dev:</strong> serve lazy chunk sourcemaps (<a href="https://redirect.github.com/vitejs/vite/issues/23026">#23026</a>) (<a href="https://github.com/vitejs/vite/commit/eb7aa9a8816a1e926d5d9b4cbe7e796b61314ce2">eb7aa9a</a>)</li> <li><strong>bundled-dev:</strong> serve the rolldown runtime from the installed rolldown (<a href="https://redirect.github.com/vitejs/vite/issues/23568">#23568</a>) (<a href="https://github.com/vitejs/vite/commit/bc598a6a8a6b7d6e157e9f19c16911cff8d2360c">bc598a6</a>)</li> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23601">#23601</a>) (<a href="https://github.com/vitejs/vite/commit/9944fa6033873f13ae88f59e023ab642c50fee2b">9944fa6</a>)</li> <li><strong>deps:</strong> update rolldown-related dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23602">#23602</a>) (<a href="https://github.com/vitejs/vite/commit/88c17415af221b3a13e778f4f2c0e907c8287baf">88c1741</a>)</li> <li><strong>html:</strong> resolve percent-encoded srcset urls (<a href="https://redirect.github.com/vitejs/vite/issues/23609">#23609</a>) (<a href="https://github.com/vitejs/vite/commit/53f1ce7bfe38426861f6da572ef0e3359f6a80cd">53f1ce7</a>)</li> <li>limit size of object and array printing via <code>forwardConsole</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23565">#23565</a>) (<a href="https://github.com/vitejs/vite/commit/e64a5877dd3e552843a545749ccc257568917d28">e64a587</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md">vite's changelog</a>.</em></p> <blockquote> <h2><!-- raw HTML omitted --><a href="https://github.com/vitejs/vite/compare/v8.3.3...v8.3.4">8.3.4</a> (2026-10-08)<!-- raw HTML omitted --></h2> <h3>Features</h3> <ul> <li><strong>bundled-dev:</strong> support <code>import.meta.hot.acceptExports</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23463">#23463</a>) (<a href="https://github.com/vitejs/vite/commit/bc0f21c56a2e003a4d2dd23ccb9da3ec8c706c4e">bc0f21c</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li>avoid mutating hmr defaults (fix <a href="https://redirect.github.com/vitejs/vite/issues/23575">#23575</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23576">#23576</a>) (<a href="https://github.com/vitejs/vite/commit/574d5e351905fe99891364d03c2440531378f7fd">574d5e3</a>)</li> <li><strong>build:</strong> correct preloads when chunkImportMap is enabled with non-root base (<a href="https://redirect.github.com/vitejs/vite/issues/23698">#23698</a>) (<a href="https://github.com/vitejs/vite/commit/2a8c0f05c76e35c43ab3560984a5103c8db8dbcd">2a8c0f0</a>)</li> <li><strong>build:</strong> wait for in-flight stylesheets in preload helper (fix <a href="https://redirect.github.com/vitejs/vite/issues/23652">#23652</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23662">#23662</a>) (<a href="https://github.com/vitejs/vite/commit/036b74599b2fe1d8c61475371b856ceb88d26963">036b745</a>)</li> <li><strong>bundled-dev:</strong> serve <code>/@vite/client</code> and stub <code>@vite/env</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23664">#23664</a>) (<a href="https://github.com/vitejs/vite/commit/5afc5a8876624888fc1e8f43fed1c85c4b0e830b">5afc5a8</a>)</li> <li><strong>client:</strong> skip rewriting unchanged adopted styles (<a href="https://redirect.github.com/vitejs/vite/issues/23697">#23697</a>) (<a href="https://github.com/vitejs/vite/commit/fa7146938b0ca703653c90c20907191a01c032ba">fa71469</a>)</li> <li><strong>css:</strong> resolve imported preprocessors from their file path with lightningcss (<a href="https://redirect.github.com/vitejs/vite/issues/23688">#23688</a>) (<a href="https://github.com/vitejs/vite/commit/cf52011c46409a4a45f3d74bba631b8f005c4bc9">cf52011</a>)</li> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23648">#23648</a>) (<a href="https://github.com/vitejs/vite/commit/8a4c19cfc035f2dd203f2fa6d00ab9256a5e77c9">8a4c19c</a>)</li> <li><strong>deps:</strong> update rolldown-related dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23649">#23649</a>) (<a href="https://github.com/vitejs/vite/commit/794516d50cff80e405bc9b3e5faac1c82987566c">794516d</a>)</li> <li><strong>dev:</strong> a restart requested during a restart used to be dropped (fix <a href="https://redirect.github.com/vitejs/vite/issues/23392">#23392</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23484">#23484</a>) (<a href="https://github.com/vitejs/vite/commit/70d56ea1848909edab416934f3f68ce14343eb73">70d56ea</a>)</li> <li>don't treat modules ending with js-like query as js (<a href="https://redirect.github.com/vitejs/vite/issues/23687">#23687</a>) (<a href="https://github.com/vitejs/vite/commit/fcb6f1252a95857823d935f98554b938888d41a0">fcb6f12</a>)</li> <li><strong>html:</strong> avoid adding filesystem root to watcher (<a href="https://redirect.github.com/vitejs/vite/issues/23689">#23689</a>) (<a href="https://github.com/vitejs/vite/commit/3a7f2aea757d59bae66ad6edf6b321d26a7e6778">3a7f2ae</a>)</li> <li><strong>html:</strong> skip caching CSS of chunks in a cycle (fix <a href="https://redirect.github.com/vitejs/vite/issues/23628">#23628</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23636">#23636</a>) (<a href="https://github.com/vitejs/vite/commit/15d82f7dc679ab9c18d5ce2c3711157c2365ddd1">15d82f7</a>)</li> <li><strong>optimizer:</strong> scan deep imports with custom extensions (<a href="https://redirect.github.com/vitejs/vite/issues/23678">#23678</a>) (<a href="https://github.com/vitejs/vite/commit/8579189bae8626b6ddab55a09325e209d62e027e">8579189</a>)</li> <li>remove input option unescaping for now (<a href="https://redirect.github.com/vitejs/vite/issues/23694">#23694</a>) (<a href="https://github.com/vitejs/vite/commit/facc2fb1fffce03d9e2dd7011d0bd0eeddc7d0f6">facc2fb</a>)</li> <li><strong>server:</strong> match static aliases on path boundaries (<a href="https://redirect.github.com/vitejs/vite/issues/23643">#23643</a>) (<a href="https://github.com/vitejs/vite/commit/b28db28e9e62d9866a9a0f1b22e74589cc180577">b28db28</a>)</li> <li><strong>watcher:</strong> normalize file before root check in <code>ensureWatchedFile</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23673">#23673</a>) (<a href="https://github.com/vitejs/vite/commit/12bb28c22379c8d2fe90088fa0eefbfa2ab3fb80">12bb28c</a>)</li> </ul> <h3>Performance Improvements</h3> <ul> <li><strong>module-runner:</strong> skip cloning call sites that have no source map (<a href="https://redirect.github.com/vitejs/vite/issues/23646">#23646</a>) (<a href="https://github.com/vitejs/vite/commit/3d674869a50a0bca84a8cc8dc55bd35d57100e37">3d67486</a>)</li> </ul> <h3>Code Refactoring</h3> <ul> <li><strong>bundled-dev:</strong> import CSS HMR helpers from <code>/@vite/client</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23674">#23674</a>) (<a href="https://github.com/vitejs/vite/commit/182f5b2a65391da5bee05f9c3df1aeb3794e98d9">182f5b2</a>)</li> </ul> <h2><!-- raw HTML omitted --><a href="https://github.com/vitejs/vite/compare/v8.3.2...v8.3.3">8.3.3</a> (2026-10-06)<!-- raw HTML omitted --></h2> <h3>Bug Fixes</h3> <ul> <li><strong>deps:</strong> update launch-editor to v2.14.2 (<a href="https://redirect.github.com/vitejs/vite/issues/23654">#23654</a>) (<a href="https://github.com/vitejs/vite/commit/22fd1d5238cce2ee9db0eb4122f9e8feb6b06097">22fd1d5</a>)</li> <li><strong>html:</strong> filename passed to transformIndexHtml should not include queries (<a href="https://redirect.github.com/vitejs/vite/issues/23653">#23653</a>) (<a href="https://github.com/vitejs/vite/commit/7dafd8e56f152403a3230608fa4005273c2e9e17">7dafd8e</a>)</li> <li><strong>server:</strong> check <code>fs.serve</code> for <code>?vite-wasm-instance</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23655">#23655</a>) (<a href="https://github.com/vitejs/vite/commit/ba8b7ab43b4afa5d0292ab4b6e3a7b5033cc9c73">ba8b7ab</a>)</li> <li><strong>server:</strong> store ids to <code>safeModulePaths</code> rather than URLs (<a href="https://redirect.github.com/vitejs/vite/issues/23656">#23656</a>) (<a href="https://github.com/vitejs/vite/commit/c3e06f92e969952466b4e2f5801e85e1e00cd905">c3e06f9</a>)</li> </ul> <h2><!-- raw HTML omitted --><a href="https://github.com/vitejs/vite/compare/v8.3.1...v8.3.2">8.3.2</a> (2026-10-01)<!-- raw HTML omitted --></h2> <h3>Bug Fixes</h3> <ul> <li><strong>build:</strong> preload CSS correctly when <code>renderBuiltUrl</code> returns URLs with queries (<a href="https://redirect.github.com/vitejs/vite/issues/23611">#23611</a>) (<a href="https://github.com/vitejs/vite/commit/64e0a215c24f0522b27b91f93cfd93e317b94481">64e0a21</a>)</li> <li><strong>bundled-dev:</strong> serve lazy chunk sourcemaps (<a href="https://redirect.github.com/vitejs/vite/issues/23026">#23026</a>) (<a href="https://github.com/vitejs/vite/commit/eb7aa9a8816a1e926d5d9b4cbe7e796b61314ce2">eb7aa9a</a>)</li> <li><strong>bundled-dev:</strong> serve the rolldown runtime from the installed rolldown (<a href="https://redirect.github.com/vitejs/vite/issues/23568">#23568</a>) (<a href="https://github.com/vitejs/vite/commit/bc598a6a8a6b7d6e157e9f19c16911cff8d2360c">bc598a6</a>)</li> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23601">#23601</a>) (<a href="https://github.com/vitejs/vite/commit/9944fa6033873f13ae88f59e023ab642c50fee2b">9944fa6</a>)</li> <li><strong>deps:</strong> update rolldown-related dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23602">#23602</a>) (<a href="https://github.com/vitejs/vite/commit/88c17415af221b3a13e778f4f2c0e907c8287baf">88c1741</a>)</li> <li><strong>html:</strong> resolve percent-encoded srcset urls (<a href="https://redirect.github.com/vitejs/vite/issues/23609">#23609</a>) (<a href="https://github.com/vitejs/vite/commit/53f1ce7bfe38426861f6da572ef0e3359f6a80cd">53f1ce7</a>)</li> <li>limit size of object and array printing via <code>forwardConsole</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23565">#23565</a>) (<a href="https://github.com/vitejs/vite/commit/e64a5877dd3e552843a545749ccc257568917d28">e64a587</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitejs/vite/commit/b6c20f6a8126d8561891e5fb9368e8fc9da37538"><code>b6c20f6</code></a> release: v8.3.4 (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23702">#23702</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/b28db28e9e62d9866a9a0f1b22e74589cc180577"><code>b28db28</code></a> fix(server): match static aliases on path boundaries (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23643">#23643</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/bc0f21c56a2e003a4d2dd23ccb9da3ec8c706c4e"><code>bc0f21c</code></a> feat(bundled-dev): support <code>import.meta.hot.acceptExports</code> (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23463">#23463</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/fa7146938b0ca703653c90c20907191a01c032ba"><code>fa71469</code></a> fix(client): skip rewriting unchanged adopted styles (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23697">#23697</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/2a8c0f05c76e35c43ab3560984a5103c8db8dbcd"><code>2a8c0f0</code></a> fix(build): correct preloads when chunkImportMap is enabled with non-root bas...</li> <li><a href="https://github.com/vitejs/vite/commit/3a7f2aea757d59bae66ad6edf6b321d26a7e6778"><code>3a7f2ae</code></a> fix(html): avoid adding filesystem root to watcher (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23689">#23689</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/facc2fb1fffce03d9e2dd7011d0bd0eeddc7d0f6"><code>facc2fb</code></a> fix: remove input option unescaping for now (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23694">#23694</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/70d56ea1848909edab416934f3f68ce14343eb73"><code>70d56ea</code></a> fix(dev): a restart requested during a restart used to be dropped (fix <a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23392">#23392</a>...</li> <li><a href="https://github.com/vitejs/vite/commit/cf52011c46409a4a45f3d74bba631b8f005c4bc9"><code>cf52011</code></a> fix(css): resolve imported preprocessors from their file path with lightningc...</li> <li><a href="https://github.com/vitejs/vite/commit/fcb6f1252a95857823d935f98554b938888d41a0"><code>fcb6f12</code></a> fix: don't treat modules ending with js-like query as js (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23687">#23687</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitejs/vite/commits/v8.3.4/packages/vite">compare view</a></li> </ul> </details> <br /> Updates `vitest` from 5.0.2 to 5.0.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/vitest-dev/vitest/releases">vitest's releases</a>.</em></p> <blockquote> <h2>v5.0.4</h2> <h3> 🚀 Features</h3> <ul> <li><strong>experimental</strong>: <ul> <li>Tag cache directories with CACHEDIR.TAG - by <a href="https://github.com/lifeiscontent"><code>@lifeiscontent</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11461">vitest-dev/vitest#11461</a> <a href="https://github.com/vitest-dev/vitest/commit/a8ea3c8fd"><!-- raw HTML omitted -->(a8ea3)<!-- raw HTML omitted --></a></li> <li>Support <code>test.ui.theme</code> option - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11499">vitest-dev/vitest#11499</a> <a href="https://github.com/vitest-dev/vitest/commit/1da66405d"><!-- raw HTML omitted -->(1da66)<!-- raw HTML omitted --></a></li> <li>Highlight selector multiple matches in trace view - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Claude Opus 5.5</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11489">vitest-dev/vitest#11489</a> <a href="https://github.com/vitest-dev/vitest/commit/5abba1e1b"><!-- raw HTML omitted -->(5abba)<!-- raw HTML omitted --></a></li> <li>Print how many tests were affected and a total when running <code>--changed</code> - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11424">vitest-dev/vitest#11424</a> <a href="https://github.com/vitest-dev/vitest/commit/a23368585"><!-- raw HTML omitted -->(a2336)<!-- raw HTML omitted --></a></li> <li>Add an option to cache dependencies instead of statically parsing them - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11515">vitest-dev/vitest#11515</a> <a href="https://github.com/vitest-dev/vitest/commit/c06012ac8"><!-- raw HTML omitted -->(c0601)<!-- raw HTML omitted --></a></li> <li>Add fit and zoom controls to trace viewer - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Claude Opus 5.5</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11490">vitest-dev/vitest#11490</a> <a href="https://github.com/vitest-dev/vitest/commit/f5dd99ed0"><!-- raw HTML omitted -->(f5dd9)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <h3> 🐞 Bug Fixes</h3> <ul> <li>Fail the run on git and location filter errors - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11430">vitest-dev/vitest#11430</a> <a href="https://github.com/vitest-dev/vitest/commit/30d0304d2"><!-- raw HTML omitted -->(30d03)<!-- raw HTML omitted --></a></li> <li>Enable fsModuleCache by default - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11435">vitest-dev/vitest#11435</a> <a href="https://github.com/vitest-dev/vitest/commit/ad208cc29"><!-- raw HTML omitted -->(ad208)<!-- raw HTML omitted --></a></li> <li>Track project files and mocks with --changed - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11432">vitest-dev/vitest#11432</a> <a href="https://github.com/vitest-dev/vitest/commit/b0f2b3bb9"><!-- raw HTML omitted -->(b0f2b)<!-- raw HTML omitted --></a></li> <li>Refactor caching, fix <code>:</code> in project and change the shape of <code>results</code> cache - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11453">vitest-dev/vitest#11453</a> <a href="https://github.com/vitest-dev/vitest/commit/9673c49a4"><!-- raw HTML omitted -->(9673c)<!-- raw HTML omitted --></a></li> <li>Keep full <code>$</code> string values when <code>taskTitleValueFormatTruncate</code> is 0 - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Claude Opus 5.5</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11485">vitest-dev/vitest#11485</a> <a href="https://github.com/vitest-dev/vitest/commit/4f7e1799b"><!-- raw HTML omitted -->(4f7e1)<!-- raw HTML omitted --></a></li> <li>Resolve node builtins in client environments - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11417">vitest-dev/vitest#11417</a> <a href="https://github.com/vitest-dev/vitest/commit/56b319ac6"><!-- raw HTML omitted -->(56b31)<!-- raw HTML omitted --></a></li> <li>Fix module graph builtin externals after <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11421">#11421</a> - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Claude Opus 5.5</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11491">vitest-dev/vitest#11491</a> and <a href="https://redirect.github.com/vitest-dev/vitest/issues/11421">vitest-dev/vitest#11421</a> <a href="https://github.com/vitest-dev/vitest/commit/008e184cb"><!-- raw HTML omitted -->(008e1)<!-- raw HTML omitted --></a></li> <li>Wrap module mocks during in-source testing - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11505">vitest-dev/vitest#11505</a> <a href="https://github.com/vitest-dev/vitest/commit/36d19cb00"><!-- raw HTML omitted -->(36d19)<!-- raw HTML omitted --></a></li> <li>Handle line endings in snapshot - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11522">vitest-dev/vitest#11522</a> <a href="https://github.com/vitest-dev/vitest/commit/4c468aa40"><!-- raw HTML omitted -->(4c468)<!-- raw HTML omitted --></a></li> <li>Respect root in projects - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11521">vitest-dev/vitest#11521</a> <a href="https://github.com/vitest-dev/vitest/commit/26642f793"><!-- raw HTML omitted -->(26642)<!-- raw HTML omitted --></a></li> <li>Resolve mocks in directories with spaces - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11539">vitest-dev/vitest#11539</a> <a href="https://github.com/vitest-dev/vitest/commit/caaef9416"><!-- raw HTML omitted -->(caaef)<!-- raw HTML omitted --></a></li> <li><strong>api</strong>: <ul> <li>Publish the api token atomically - by <a href="https://github.com/umairnawaz333"><code>@umairnawaz333</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11323">vitest-dev/vitest#11323</a> <a href="https://github.com/vitest-dev/vitest/commit/6f990fef1"><!-- raw HTML omitted -->(6f990)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>browser</strong>: <ul> <li>Close the mock route interception race - by <a href="https://github.com/cplieger"><code>@cplieger</code></a> and <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/8339">vitest-dev/vitest#8339</a> and <a href="https://redirect.github.com/vitest-dev/vitest/issues/11083">vitest-dev/vitest#11083</a> <a href="https://github.com/vitest-dev/vitest/commit/d6620fae6"><!-- raw HTML omitted -->(d6620)<!-- raw HTML omitted --></a></li> <li>Allow toHaveTextContent without arguments - by <a href="https://github.com/nomadical"><code>@nomadical</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11425">vitest-dev/vitest#11425</a> <a href="https://github.com/vitest-dev/vitest/commit/8ebcf5f8a"><!-- raw HTML omitted -->(8ebcf)<!-- raw HTML omitted --></a></li> <li>Apply API options without browser config - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10852">vitest-dev/vites... _Description has been truncated_ Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
6ffcf3b363 |
build(deps): bump python from 3.14.7-slim to 3.14.8-slim (#1470)
Bumps python from 3.14.7-slim to 3.14.8-slim. [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
4b7607e224 |
build(deps): bump astral-sh/uv from 0.12.22 to 0.12.24 in the docker-base-image-digests group (#1449)
> [!WARNING] > Cooldown could not be applied because no publication date was available from the registry. > Bumps the docker-base-image-digests group with 1 update: [astral-sh/uv](https://github.com/astral-sh/uv). Updates `astral-sh/uv` from 0.12.22 to 0.12.24 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/uv/releases">astral-sh/uv's releases</a>.</em></p> <blockquote> <h2>0.12.24</h2> <h2>Release Notes</h2> <p>Released on 2026-10-08.</p> <h3>Enhancements</h3> <ul> <li>Remove orphaned temporary build environments with <code>uv cache prune</code> (<a href="https://redirect.github.com/astral-sh/uv/pull/22171">#22171</a>)</li> <li>Accept PEP 508 marker operators directly before grouped expressions (<a href="https://redirect.github.com/astral-sh/uv/pull/22309">#22309</a>)</li> <li>Reject malformed requirements-file options instead of partially parsing or ignoring them (<a href="https://redirect.github.com/astral-sh/uv/pull/22317">#22317</a>)</li> <li>Show underlying filesystem and registry errors when managed Python uninstallation fails (<a href="https://redirect.github.com/astral-sh/uv/pull/22362">#22362</a>)</li> <li>Identify the invalid source URL in Python mirror errors (<a href="https://redirect.github.com/astral-sh/uv/pull/22364">#22364</a>)</li> </ul> <h3>Preview features</h3> <ul> <li>Display preferred advisory IDs in <code>uv audit</code> reports, prioritizing PYSEC, GHSA, then CVE identifiers (<a href="https://redirect.github.com/astral-sh/uv/pull/22292">#22292</a>)</li> </ul> <h3>Configuration</h3> <ul> <li>Support custom installation mirrors for GraalPy (<a href="https://redirect.github.com/astral-sh/uv/pull/22269">#22269</a>)</li> <li>Support custom installation mirrors for Pyodide (<a href="https://redirect.github.com/astral-sh/uv/pull/22271">#22271</a>)</li> <li>Allow <code>UV_NO_CACHE=false</code> to override <code>no-cache = true</code> in configuration (<a href="https://redirect.github.com/astral-sh/uv/pull/22324">#22324</a>)</li> <li>Report more precise error locations for invalid trusted-host ports and preview-feature list entries (<a href="https://redirect.github.com/astral-sh/uv/pull/22144">#22144</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Speed up later commands after creating an environment by warming its interpreter cache (<a href="https://redirect.github.com/astral-sh/uv/pull/21304">#21304</a>)</li> <li>Reduce code-signature verification work for ARM64 macOS releases with 16 KiB signature pages (<a href="https://redirect.github.com/astral-sh/uv/pull/22246">#22246</a>)</li> <li>Enforce resource limits when parsing package indexes and <code>--find-links</code> pages with <code>astral-html</code> (<a href="https://redirect.github.com/astral-sh/uv/pull/22203">#22203</a>)</li> <li>Reduce standalone <code>uv-build</code> executable size by 7.5% by omitting unused Zstandard support (<a href="https://redirect.github.com/astral-sh/uv/pull/22242">#22242</a>)</li> <li>Reduce uv's binary size by about 232 KB by simplifying configuration deserialization (<a href="https://redirect.github.com/astral-sh/uv/pull/22144">#22144</a>)</li> <li>Reduce Python download error formatting code size by sharing its formatter (<a href="https://redirect.github.com/astral-sh/uv/pull/22141">#22141</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Verify supplied hashes even when hash presence is disabled with <code>--no-require-hashes</code> or <code>require-hashes = false</code> (<a href="https://redirect.github.com/astral-sh/uv/pull/22369">#22369</a>)</li> <li>Honor exact managed Python patch pins when creating script environments instead of following patch upgrades (<a href="https://redirect.github.com/astral-sh/uv/pull/22360">#22360</a>)</li> <li>Prevent dependency overrides and constraints from activating optional dependencies when their extras are not selected (<a href="https://redirect.github.com/astral-sh/uv/pull/22237">#22237</a>)</li> <li>Exclude optional dependencies from exports when their extras are activated only in incompatible environments (<a href="https://redirect.github.com/astral-sh/uv/pull/22234">#22234</a>)</li> <li>Give explicit <code>uv publish --trusted-publishing</code> values precedence over configuration (<a href="https://redirect.github.com/astral-sh/uv/pull/22279">#22279</a>)</li> <li>Allow <code>UV_OFFLINE=false</code> to override <code>offline = true</code> in configuration (<a href="https://redirect.github.com/astral-sh/uv/pull/22283">#22283</a>)</li> <li>Allow <code>UV_SYSTEM_CERTS=false</code> to override <code>system-certs = true</code> in configuration (<a href="https://redirect.github.com/astral-sh/uv/pull/22291">#22291</a>)</li> <li>Allow <code>uv auth login</code> over IPv6 loopback addresses (<a href="https://redirect.github.com/astral-sh/uv/pull/22306">#22306</a>)</li> <li>Resolve GitHub dependencies whose Git references contain <code>#</code> or <code>%</code> characters (<a href="https://redirect.github.com/astral-sh/uv/pull/22281">#22281</a>)</li> <li>Recognize existing Pyodide interpreters as satisfying Pyodide Python requests (<a href="https://redirect.github.com/astral-sh/uv/pull/22322">#22322</a>)</li> <li>Preserve JSON output from <code>uv version</code> and <code>uv self version</code> with a single <code>--quiet</code> flag (<a href="https://redirect.github.com/astral-sh/uv/pull/22280">#22280</a>)</li> <li>Preserve trailing spaces and tabs in passwords returned by subprocess keyrings (<a href="https://redirect.github.com/astral-sh/uv/pull/22284">#22284</a>)</li> <li>Restore wheel incompatibility hints when <code>WHEEL</code> metadata contains multiple expanded <code>Tag:</code> rows (<a href="https://redirect.github.com/astral-sh/uv/pull/22235">#22235</a>)</li> <li>Preserve Windows wheel-script rename errors unless a cross-drive copy fallback applies (<a href="https://redirect.github.com/astral-sh/uv/pull/22302">#22302</a>)</li> <li>Prevent workspace-cache assertion failures after modifying a project at the workspace root (<a href="https://redirect.github.com/astral-sh/uv/pull/22236">#22236</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/uv/blob/main/CHANGELOG.md">astral-sh/uv's changelog</a>.</em></p> <blockquote> <h2>0.12.24</h2> <p>Released on 2026-10-08.</p> <h3>Enhancements</h3> <ul> <li>Remove orphaned temporary build environments with <code>uv cache prune</code> (<a href="https://redirect.github.com/astral-sh/uv/pull/22171">#22171</a>)</li> <li>Accept PEP 508 marker operators directly before grouped expressions (<a href="https://redirect.github.com/astral-sh/uv/pull/22309">#22309</a>)</li> <li>Reject malformed requirements-file options instead of partially parsing or ignoring them (<a href="https://redirect.github.com/astral-sh/uv/pull/22317">#22317</a>)</li> <li>Show underlying filesystem and registry errors when managed Python uninstallation fails (<a href="https://redirect.github.com/astral-sh/uv/pull/22362">#22362</a>)</li> <li>Identify the invalid source URL in Python mirror errors (<a href="https://redirect.github.com/astral-sh/uv/pull/22364">#22364</a>)</li> </ul> <h3>Preview features</h3> <ul> <li>Display preferred advisory IDs in <code>uv audit</code> reports, prioritizing PYSEC, GHSA, then CVE identifiers (<a href="https://redirect.github.com/astral-sh/uv/pull/22292">#22292</a>)</li> </ul> <h3>Configuration</h3> <ul> <li>Support custom installation mirrors for GraalPy (<a href="https://redirect.github.com/astral-sh/uv/pull/22269">#22269</a>)</li> <li>Support custom installation mirrors for Pyodide (<a href="https://redirect.github.com/astral-sh/uv/pull/22271">#22271</a>)</li> <li>Allow <code>UV_NO_CACHE=false</code> to override <code>no-cache = true</code> in configuration (<a href="https://redirect.github.com/astral-sh/uv/pull/22324">#22324</a>)</li> <li>Report more precise error locations for invalid trusted-host ports and preview-feature list entries (<a href="https://redirect.github.com/astral-sh/uv/pull/22144">#22144</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Speed up later commands after creating an environment by warming its interpreter cache (<a href="https://redirect.github.com/astral-sh/uv/pull/21304">#21304</a>)</li> <li>Reduce code-signature verification work for ARM64 macOS releases with 16 KiB signature pages (<a href="https://redirect.github.com/astral-sh/uv/pull/22246">#22246</a>)</li> <li>Enforce resource limits when parsing package indexes and <code>--find-links</code> pages with <code>astral-html</code> (<a href="https://redirect.github.com/astral-sh/uv/pull/22203">#22203</a>)</li> <li>Reduce standalone <code>uv-build</code> executable size by 7.5% by omitting unused Zstandard support (<a href="https://redirect.github.com/astral-sh/uv/pull/22242">#22242</a>)</li> <li>Reduce uv's binary size by about 232 KB by simplifying configuration deserialization (<a href="https://redirect.github.com/astral-sh/uv/pull/22144">#22144</a>)</li> <li>Reduce Python download error formatting code size by sharing its formatter (<a href="https://redirect.github.com/astral-sh/uv/pull/22141">#22141</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Verify supplied hashes even when hash presence is disabled with <code>--no-require-hashes</code> or <code>require-hashes = false</code> (<a href="https://redirect.github.com/astral-sh/uv/pull/22369">#22369</a>)</li> <li>Honor exact managed Python patch pins when creating script environments instead of following patch upgrades (<a href="https://redirect.github.com/astral-sh/uv/pull/22360">#22360</a>)</li> <li>Prevent dependency overrides and constraints from activating optional dependencies when their extras are not selected (<a href="https://redirect.github.com/astral-sh/uv/pull/22237">#22237</a>)</li> <li>Exclude optional dependencies from exports when their extras are activated only in incompatible environments (<a href="https://redirect.github.com/astral-sh/uv/pull/22234">#22234</a>)</li> <li>Give explicit <code>uv publish --trusted-publishing</code> values precedence over configuration (<a href="https://redirect.github.com/astral-sh/uv/pull/22279">#22279</a>)</li> <li>Allow <code>UV_OFFLINE=false</code> to override <code>offline = true</code> in configuration (<a href="https://redirect.github.com/astral-sh/uv/pull/22283">#22283</a>)</li> <li>Allow <code>UV_SYSTEM_CERTS=false</code> to override <code>system-certs = true</code> in configuration (<a href="https://redirect.github.com/astral-sh/uv/pull/22291">#22291</a>)</li> <li>Allow <code>uv auth login</code> over IPv6 loopback addresses (<a href="https://redirect.github.com/astral-sh/uv/pull/22306">#22306</a>)</li> <li>Resolve GitHub dependencies whose Git references contain <code>#</code> or <code>%</code> characters (<a href="https://redirect.github.com/astral-sh/uv/pull/22281">#22281</a>)</li> <li>Recognize existing Pyodide interpreters as satisfying Pyodide Python requests (<a href="https://redirect.github.com/astral-sh/uv/pull/22322">#22322</a>)</li> <li>Preserve JSON output from <code>uv version</code> and <code>uv self version</code> with a single <code>--quiet</code> flag (<a href="https://redirect.github.com/astral-sh/uv/pull/22280">#22280</a>)</li> <li>Preserve trailing spaces and tabs in passwords returned by subprocess keyrings (<a href="https://redirect.github.com/astral-sh/uv/pull/22284">#22284</a>)</li> <li>Restore wheel incompatibility hints when <code>WHEEL</code> metadata contains multiple expanded <code>Tag:</code> rows (<a href="https://redirect.github.com/astral-sh/uv/pull/22235">#22235</a>)</li> <li>Preserve Windows wheel-script rename errors unless a cross-drive copy fallback applies (<a href="https://redirect.github.com/astral-sh/uv/pull/22302">#22302</a>)</li> <li>Prevent workspace-cache assertion failures after modifying a project at the workspace root (<a href="https://redirect.github.com/astral-sh/uv/pull/22236">#22236</a>)</li> <li>Hide the ignored <code>--keyring-provider</code> option from <code>uv auth</code> help (<a href="https://redirect.github.com/astral-sh/uv/pull/19520">#19520</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/astral-sh/uv/commit/5411378eb76dc1ea1ad90aeb10e84e997e5bbd96"><code>5411378</code></a> Bump version to 0.12.24 (<a href="https://redirect.github.com/astral-sh/uv/issues/22371">#22371</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/213e6de8b643a831a84bbc12ff9f9ee6f0bfc13d"><code>213e6de</code></a> Clarify integration test style in agent guidance (<a href="https://redirect.github.com/astral-sh/uv/issues/22372">#22372</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/35deef2029377b87a293579f4c89548f2ec41f14"><code>35deef2</code></a> Skip Python setup in static version and credential tests (<a href="https://redirect.github.com/astral-sh/uv/issues/22370">#22370</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/bbddf2f44a7be6888b24264eb2d8a35293e7a58f"><code>bbddf2f</code></a> Share requirements-file arguments across commands (<a href="https://redirect.github.com/astral-sh/uv/issues/22145">#22145</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/9a123eb638016dee70515e326a4a5fa88e74e090"><code>9a123eb</code></a> Deserialize trusted hosts and preview features directly (<a href="https://redirect.github.com/astral-sh/uv/issues/22144">#22144</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/57a9256bf0ee3bb75e438f193c6a2afe2adc6e9c"><code>57a9256</code></a> Share archive decoding across reader types (<a href="https://redirect.github.com/astral-sh/uv/issues/22143">#22143</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/3e3374b961fefaed663747868c09e95863c9a3d2"><code>3e3374b</code></a> Verify hashes even when they are not required (<a href="https://redirect.github.com/astral-sh/uv/issues/22369">#22369</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/d3c092a30ed2712d15c855af652d5741d4d5c7c5"><code>d3c092a</code></a> Move installation layout operations out of Python types (<a href="https://redirect.github.com/astral-sh/uv/issues/22367">#22367</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/1be3e88341157061a75b68f78953ff3a3c309576"><code>1be3e88</code></a> Accept PEP 508 marker operators before parentheses (<a href="https://redirect.github.com/astral-sh/uv/issues/22309">#22309</a>)</li> <li><a href="https://github.com/astral-sh/uv/commit/e27def75aaf746634b7c6576bc23ebf572d101a5"><code>e27def7</code></a> Retain Python download request errors directly (<a href="https://redirect.github.com/astral-sh/uv/issues/22366">#22366</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/uv/compare/0.12.22...0.12.24">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
d86d34b8e9 |
build(deps): bump apprise from 1.13.1 to 2.0.0 (#1437)
Bumps [apprise](https://github.com/caronc/apprise) from 1.13.1 to 2.0.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/caronc/apprise/releases">apprise's releases</a>.</em></p> <blockquote> <h2>Apprise v2.0.0</h2> <h2>What's Changed</h2> <p>🎉 <strong>Welcome to Apprise v2.0.0!</strong> 🎉</p> <p>This is the first official release of Apprise v2. It's a big one. Much of how Apprise works under the hood was rebuilt, and many features people have asked for over the years are finally here:</p> <ul> <li>template variables to keep secrets out of your config files</li> <li>tag priorities and escalation</li> <li>smarter retries</li> <li>timeouts</li> <li>a detailed <code>AppriseResult</code> object returned from every <code>notify()</code> call</li> <li>...and much more</li> </ul> <p><strong>Note:</strong> ⚠️ <strong>This is a breaking release for anyone using Apprise v1.x.</strong> If you are a developer embedding Apprise in your own project, please read the <strong>Breaking Changes</strong> section below before upgrading. If you are not ready to move yet, pin your <code>pyproject.toml</code> or <code>requirements.txt</code> to <code>apprise >=1.0.0, <2.0.0</code>. The v1 codebase lives on in the <a href="https://github.com/caronc/apprise/tree/apprise-v1-release"><code>apprise-v1-release</code></a> branch. I will keep patching it for security issues and bugs where practical for a year or two, but v2.x is the way forward.</p> <h3>⚠️ Breaking Changes</h3> <ul> <li><strong><code>notify()</code> now returns an <code>AppriseResult</code> object instead of <code>True</code>/<code>False</code>/<code>None</code></strong> <ul> <li><code>bool(result)</code> still gives you <code>True</code>/<code>False</code>, so most existing <code>if apobj.notify(...):</code> checks keep working. <code>None</code> can't come back from <code>bool()</code>, so a "nothing matched" result now reads as <code>False</code>.</li> <li>The object also holds the logs for each individual service called, plus a status for each one, so your application can report exactly what worked and what didn't.</li> <li>The status values line up with the CLI exit codes: <ul> <li><code>SUCCESS</code> (0) - every service was notified successfully (the old <code>True</code>)</li> <li><code>FAILURE</code> (1) - the notification failed (the old <code>False</code>)</li> <li><code>NOMATCH</code> (3) - nothing matched the tags given, or no services were loaded (the old <code>None</code>)</li> <li><code>PARTIAL</code> (4) - some services succeeded but at least one failed (v1 returned <code>False</code> here)</li> <li><code>TIMEOUT</code> (5) - a service didn't finish before its time limit (new in v2)</li> </ul> </li> </ul> </li> <li><strong>Multiple body formats per service</strong> <ul> <li>In v1 each service supported a single body format. Services can now support more than one when the upstream service allows it (Telegram, for example, accepts both Markdown and HTML).</li> <li>Apprise picks the best matching format automatically based on the <code>format</code> you send with, so it no longer rewrites your content when the service can already accept it as-is.</li> <li>You can also choose the format yourself in the URL with <code>?format=</code>.</li> </ul> </li> <li><strong>Consistent error handling</strong> <ul> <li>Every error Apprise raises now comes from a single <code>AppriseException</code> family, so developers can catch everything in one place.</li> <li>Each error still behaves like the plain Python error it used to be (a bad setting is still a <code>ValueError</code>, a disk problem is still an <code>OSError</code>), so existing <code>try</code>/<code>except</code> blocks keep working.</li> </ul> </li> <li><strong>Deprecations removed</strong> - Apprise v2 starts with a clean slate: <ul> <li>The <code>APPRISE_CONFIG</code> environment variable is now <code>APPRISE_CONFIG_PATH</code>. The old name still works for now, but prints a deprecation warning.</li> <li>The Email options <code>use_pgp=</code> and <code>?pgpkey=</code> (deprecated back in v1) have been removed. Use <code>pgp_mode=</code> and <code>?pgppub=</code> instead.</li> <li>Bad settings in a URL (such as an unknown <code>?format=</code>) now fail with a clear error message instead of quietly doing something unexpected.</li> </ul> </li> </ul> <h3>📣 New Notification Services:</h3> <ul> <li>Delta Chat (<code>deltachat://</code>) support added in <a href="https://redirect.github.com/caronc/apprise/pull/1666">caronc/apprise#1666</a></li> <li>WPUSH (<code>wpush://</code>) support added by <a href="https://github.com/anhao"><code>@anhao</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1721">caronc/apprise#1721</a></li> <li>YouLMK (<code>youlmk://</code>) support added by <a href="https://github.com/elilat"><code>@elilat</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1726">caronc/apprise#1726</a></li> <li>Telnyx SMS (<code>telnyx://</code>) support added by <a href="https://github.com/anandghegde"><code>@anandghegde</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1731">caronc/apprise#1731</a></li> </ul> <h3>🐞 Bugfixes</h3> <ul> <li>DingTalk Markdown messages now set <code>msgtype</code> to <code>markdown</code> so they actually get delivered by <a href="https://github.com/xtqxk"><code>@xtqxk</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1733">caronc/apprise#1733</a></li> <li>OneSignal now honors <code>language=</code> and keeps it in <code>url()</code> by <a href="https://github.com/MaxFreedomPollard"><code>@MaxFreedomPollard</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1720">caronc/apprise#1720</a></li> <li>SIGNL4 now keeps its query parameters in <code>url()</code> by <a href="https://github.com/MaxFreedomPollard"><code>@MaxFreedomPollard</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1732">caronc/apprise#1732</a></li> <li>VAPID now delivers to the subscription endpoint instead of a per-mode base URL by <a href="https://github.com/RT530"><code>@RT530</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1728">caronc/apprise#1728</a></li> <li>Fluxer now works with self-hosted servers by using the correct URL by <a href="https://github.com/LaaZa"><code>@LaaZa</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1740">caronc/apprise#1740</a></li> <li>ntfy <code>attach=</code> filename detection fixed, and <code>filename=</code> is kept in <code>url()</code> by <a href="https://github.com/SulimanAbdulrazzaq"><code>@SulimanAbdulrazzaq</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1744">caronc/apprise#1744</a></li> <li>Compressed IPv6 addresses are now handled properly in <a href="https://redirect.github.com/caronc/apprise/pull/1734">caronc/apprise#1734</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/caronc/apprise/commit/68f0eaf8bd2127ed693f451414f5e45686eaffd0"><code>68f0eaf</code></a> bumped version to v2.0.0</li> <li><a href="https://github.com/caronc/apprise/commit/782f3038ab6070549117825b83ab173255f6ceca"><code>782f303</code></a> Fixed o365:// inline attachment contentType sent as a literal string (<a href="https://redirect.github.com/caronc/apprise/issues/1747">#1747</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/a5b7e51b90890b76e4752f6fb00cb515403f438b"><code>a5b7e51</code></a> Keep CC display names in url() for mailgun, ses, smtp2go and sparkpost (<a href="https://redirect.github.com/caronc/apprise/issues/1749">#1749</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/5c4f272d0398e86597f46b9b719fd632a4b88a4c"><code>5c4f272</code></a> Apprise v2 Release (<a href="https://redirect.github.com/caronc/apprise/issues/1666">#1666</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/971861bdc097936b2f988e7e782c91855a26687b"><code>971861b</code></a> handling of Apprise v1 Branch</li> <li><a href="https://github.com/caronc/apprise/commit/6819cc45baff08a68aa3606cb9e707301d46b783"><code>6819cc4</code></a> reduced codecov retention of file in github from 90 days to 7</li> <li><a href="https://github.com/caronc/apprise/commit/1fe1f703ab6eba7c95113123d7032b9ea32d467c"><code>1fe1f70</code></a> Fix ntfy:// attach= filename detection and keep filename= in url() (<a href="https://redirect.github.com/caronc/apprise/issues/1744">#1744</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/2e72688d0526614980316b483c36d525441b9a4b"><code>2e72688</code></a> fixes issue with yaml/config parsing (<a href="https://redirect.github.com/caronc/apprise/issues/1743">#1743</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/a02d47bcbfd3c270fc822118cb10cd80064d1914"><code>a02d47b</code></a> Fluxer improvements to self-hosted api path (<a href="https://redirect.github.com/caronc/apprise/issues/1740">#1740</a>)</li> <li><a href="https://github.com/caronc/apprise/commit/9e15330ed5f08b931d266ff888d6aba16c09b3ac"><code>9e15330</code></a> Additional improvements/handling of macosx terminal-notifier wrapper (<a href="https://redirect.github.com/caronc/apprise/issues/1742">#1742</a>)</li> <li>Additional commits viewable in <a href="https://github.com/caronc/apprise/compare/v1.13.1...v2.0.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
b38e4e4a00 |
feat(naming): add {AuthorSort} template variable (#1484)
Closes #1178. Adds `{AuthorSort}`, the first author surname-first ("Arthur Conan Doyle" → "Doyle, Arthur Conan"), for rename and organize templates, alongside `{FirstAuthor}`. - A value already in "Last, First" form (one word before the comma) is kept as is; Jr/Sr/II/III/IV stay at the end. - Known limits, same as calibre's default: the last word is treated as the surname, so particles ("Le Guin") and surname-first names aren't detected. - Added to the settings help, env docs, the frontend variable picker/preview, and tests. |
||
|
|
b83e35ee0a |
feat(metadata): add Databáze knih metadata provider (#1479)
## What Adds [Databáze knih](https://www.databazeknih.cz), the Czech and Slovak community book catalog, as a metadata provider. It follows the Moly.hu provider (#1172): HTML scraping, no API key, disabled by default, and a settings tab with an enable checkbox and a Test Connection button. ## Why Hardcover, Open Library and Google Books cover Czech and Slovak editions poorly. Databáze knih is the de facto catalog for them, including Czech and Slovak translations of foreign works. With this provider, Universal mode works end to end for Czech and Slovak titles: the localized title and author from Databáze knih feed the release search. ## How - HTML scraping with BeautifulSoup, which is already a dependency. Book pages carry schema.org JSON-LD, so most fields come from structured data rather than CSS selectors. - **Title search** uses `/vyhledavani/knihy`, with the site's pagination (`page`) and language filter (`lang` for cs/sk/en/de). A search with a single match redirects straight to the book page, and that case is handled. - **Author search:** the site search only matches titles, so an author-only search finds the author (accent- and word-order-insensitive) and lists their books page, which is also paginated. Title + author filters the title results on the author. - **ISBN search** follows the site's redirect from `/search?q=<isbn>` to the book page. - **`get_book`** reads the full description (the JSON-LD one is truncated), ISBN-10/13, publisher, edition year, language, genres, cover (placeholder images dropped), series with id and position, and rating and rating count. It also reads the page count and original title from the more-info fragment. - The `RateLimiter` from Open Library (30 requests/min) and the standard `@cacheable` decorators. Fetch failures return `None`, so they are not cached. - `docs/environment-variables.md`: added the `DATABAZEKNIH_ENABLED` section. ## Testing - `tests/metadata/test_databazeknih_parse.py`: offline tests with shortened copies of real pages. They cover search parsing, pagination and language parameters, redirect-to-book, author listing, title + author filtering, uncached failures, book details, ISBN resolution and helpers. - `uv run pytest tests/metadata` is green (89 passed), and `ruff check` and `ruff format --check` are clean. - Verified live against databazeknih.cz: connection test, title search (pages 1 and 2), author books, title + author, `get_book`, and ISBN lookup. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
72893262aa |
fix: search settings popup and positioning refinement (#1476)
Hey @calibrain, thought i'd come back to do a quick UI fix I noticed :) A previous PR appears to have broken the search options in any context that is not the desktop homescreen, they can clip off the page on mobile, or break the search results screen. I've tweaked this to revive the popover for search results context and allowed for cleaner wrapping on mobile, plus a little bit of UI refinement. Desktop homepage: <img width="2880" height="1800" alt="image" src="https://github.com/user-attachments/assets/a129ce56-1bea-4ede-a9c6-99777a4bc3cc" /> Mobile homepage: <img width="600" alt="image" src="https://github.com/user-attachments/assets/544e58f9-84bd-4802-97d5-22ee23c3745f" /> Desktop and mobile search results: <img width="2880" height="1800" alt="image" src="https://github.com/user-attachments/assets/9ec09e2b-fcb8-4342-a04e-c14255c373c1" /> |
||
|
|
a0ffb268b2 |
fix: wait for synced files before processing completed downloads (#1464)
## Summary
```text
wait for completed download path
regular file -> keep existing immediate handling
directory -> inspect files enabled for this task's content type
wait until the supported-file signature is stable across checks
```
Fixes the remote-sync race in #1463. A mapped torrent folder can appear
before its large media file finishes copying, so path existence alone
does not mean the download is ready.
## Evidence
- **Before:** In #1463, qBittorrent reported a multi-file audiobook
complete while the destination contained only `.cue` and `.jpg`;
Shelfmark immediately post-processed the folder and failed with “No book
files found in download.” Retrying after the `.m4b` sync finished
imported it.
- **After:** A regression test starts with the cue sheet and cover
present, then simulates the `.m4b` file appearing and growing. Path
waiting returns only after the supported file's size and modification
time remain stable across checks.
- Credential-free isolated `python -m pytest
tests/prowlarr/test_remote_path_mappings.py -q -n 0 -o addopts=''`: 11
passed.
- `ruff check shelfmark/download/clients/base_handler.py
tests/prowlarr/test_remote_path_mappings.py`: passed.
## Merge Danger
**Door:** Two-way
**Blast Radius:** Download handling
The wait uses the existing completed-path timeout and leaves regular
single-file downloads on their current path.
Co-authored-by: Sean Li <22557931+sean0407@users.noreply.github.com>
|
||
|
|
0ade063db5 |
fix(download): extract RAR archives in place, not in the IO threadpool (#1459)
Fixes #1458. A RAR download fails with `Download failed: TypeError`, and the log says `child watchers are only available on the default loop`. rarfile extracts by running `unrar` as a subprocess, and `extract_archive_files` calls it through `run_blocking_io`, so it runs in gevent's IO threadpool. gevent only lets a subprocess start on the thread that owns the default loop. `run_blocking_io` already avoids the threadpool for `subprocess.run`, but a RAR gets to the subprocess through rarfile, so nothing catches it. This extracts a RAR on the calling greenlet, where the patched subprocess waits for `unrar` without blocking anything else. ZIP is pure Python and stays in the threadpool. I checked it with a real RAR4 file on a build of main with the stock image's `unrar`: from the threadpool it raises the TypeError, in place it extracts all 7 files. Two tests. One checks that a RAR doesn't go through `run_blocking_io`. The other runs under real gevent patching with an extractor that starts a process the way rarfile does. Both fail without the change, and the full suite passes. I keyed it on the `.rar` suffix to keep it small. Teaching `run_blocking_io` about rarfile's subprocess would be the more general fix, but that's a bigger change to a helper a lot of code goes through, so I left it for you to say if you want it. |