mirror of
https://github.com/calibrain/shelfmark.git
synced 2026-11-15 05:18:25 +00:00
5d94e96bd972089757c1d07cbb5f9c2fbab157e0
178
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
f02f0d7365 |
fix(notifications): say what applies on a user's own notification routes page (#1588)
This is the UI side of #1581. A non-admin looking at their own notification routes reads the same help text the admin does, including "or mailtos://...?to={Email} in the admin default". They can't set that default, a personal route can't use mailtos (personal routes are limited to ntfy, Gotify, Discord, Slack, Telegram, Pushover and PushBullet), and nothing on the page says whether an admin default exists. The default's URL is hidden from them on purpose since it can carry credentials, so the page just shows an empty All row, the same as when nothing is set up. What changes, on the user's own page only (the admin's view of a user keeps the full text): - The help text drops the admin default and mailtos part and lists the services a personal route can use. - The edit-context response now carries `adminDefaultRoutesSet`, a boolean that is true when an admin default route with a URL exists. The URL itself is still not sent, and the existing test that checks nothing from the admin's values leaks still passes. - When that is true, the help text adds a line saying a default applies until the user adds their own, and once they have, that theirs replace it. How routes are resolved is unchanged. A user's own routes still replace the default and don't merge with it. I didn't try to add mailtos for personal routes, since keeping SMTP credentials in a user's own URL is what the admin default avoids. Tests: two route tests (flag true with a URL in the admin default, false with an empty row), a vitest file for the description text, and the full frontend suite, oxlint, oxfmt, tsc, ruff and basedpyright are clean. I haven't looked at the page in a browser. |
||
|
|
e3fd7898f6 |
fix(user-notifications): simplify row key serialization in TableField and clean up UserNo… (#1583)
- simplify row key serialization in TableField - clean up userNotificationOverridesSection Previously, after typing a single character, the browser would lose focus due to the row keys changes on every new value. The fix makes the row key independent of the URL’s changing text. Additionally, fixed the per-user notification routes so that unchecking "All" clears all event selections. |
||
|
|
aa72850eab |
build(deps): bump the npm-deps group in /src/frontend with 6 updates (#1551)
Bumps the npm-deps group in /src/frontend with 6 updates: | Package | From | To | | --- | --- | --- | | [react](https://github.com/react/react/tree/HEAD/packages/react) | `19.3.0` | `19.3.1` | | [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom) | `19.3.0` | `19.3.1` | | [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.41.0` | `6.42.1` | | [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) | `0.72.0` | `0.74.0` | | [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) | `1.87.0` | `1.89.0` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `5.0.4` | `5.0.5` | Updates `react` from 19.3.0 to 19.3.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/react/react/releases">react's releases</a>.</em></p> <blockquote> <h2>19.3.1 (October 14th, 2026)</h2> <h2>React Server Components</h2> <ul> <li>Improve transport protocol (<a href="https://redirect.github.com/facebook/react/pull/37845">#37845</a> by <a href="https://github.com/unstubbable"><code>@unstubbable</code></a> and <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/react/react/commit/61aa00df822d0eb76d0362eb8b6fdd3527693efe"><code>61aa00d</code></a> [19.3.x][Flight] Improve transport protocol (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/37845">#37845</a>)</li> <li>See full diff in <a href="https://github.com/react/react/commits/v19.3.1/packages/react">compare view</a></li> </ul> </details> <br /> Updates `react-dom` from 19.3.0 to 19.3.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/react/react/releases">react-dom's releases</a>.</em></p> <blockquote> <h2>19.3.1 (October 14th, 2026)</h2> <h2>React Server Components</h2> <ul> <li>Improve transport protocol (<a href="https://redirect.github.com/facebook/react/pull/37845">#37845</a> by <a href="https://github.com/unstubbable"><code>@unstubbable</code></a> and <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/react/react/commit/61aa00df822d0eb76d0362eb8b6fdd3527693efe"><code>61aa00d</code></a> [19.3.x][Flight] Improve transport protocol (<a href="https://github.com/react/react/tree/HEAD/packages/react-dom/issues/37845">#37845</a>)</li> <li>See full diff in <a href="https://github.com/react/react/commits/v19.3.1/packages/react-dom">compare view</a></li> </ul> </details> <br /> Updates `knip` from 6.41.0 to 6.42.1 <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.42.1</h2> <ul> <li>fix(semantic-release): resolve shareable configs from extends (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2159">#2159</a>) (4c4a5ece9148cf621f3a6e091fd3550b18f6e19a) - thanks <a href="https://github.com/giaBaoJS"><code>@giaBaoJS</code></a>!</li> <li>fix(jest): load projects entries as Jest configs (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2167">#2167</a>) (4c22593724460890e4492ba86119d0188127f2ba) - thanks <a href="https://github.com/Cayan"><code>@Cayan</code></a>!</li> <li>Update npmx.dev snapshot (4b19797b77a559f7190e9119b3a156e1ac6aef9f)</li> <li>fix(tailwind): track packages referenced from CSS url() (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2166">#2166</a>) (949da00abf419c1eeabdab1541ce7e5c312371b9) - thanks <a href="https://github.com/agustincastaing"><code>@agustincastaing</code></a>!</li> <li>Add .otf to foreign file extensions (fcff4db0b88d6282569743cd779aec5a5df99862)</li> <li>Match quoted SCSS url() values within a single line (2c5c2a2efab8f08be538bfe1f40982cb6f0fca3c)</li> <li>fix(bun): treat bun test arguments as path filters (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2165">#2165</a>) (5f3a7fb526d3eca7561aacfc9d0ac60056525206) - thanks <a href="https://github.com/jakeleventhal"><code>@jakeleventhal</code></a>!</li> <li>fix(vitest): use default test entries when config has no test key (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2170">#2170</a>) (7ee576ccd461f719b533e3783a5b58391ce89e91) - thanks <a href="https://github.com/fixfon"><code>@fixfon</code></a>!</li> </ul> <h2>Release 6.42.0</h2> <ul> <li>fix: add bun 1.4.3 check subcommand (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2131">#2131</a>) (09129b8aaa554ffae2ff8f42a5ff4d6994eb7759) - thanks <a href="https://github.com/NimmLor"><code>@NimmLor</code></a>!</li> <li>Detect pnpm workspaces correctly around <code>packages:</code> (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2133">#2133</a>, close <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2134">#2134</a>) (d1cc0928be54e6cac9668460d9f6a21e3a94f818)</li> <li>fix(github-actions): resolve working-directory nested under checkout path (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2136">#2136</a>) (87e051e45f12c107cc25ed08bba962b95bb23b51) - thanks <a href="https://github.com/kenny-ish"><code>@kenny-ish</code></a>!</li> <li>fix(nx): track local generator and executor entry points (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2117">#2117</a>) (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2121">#2121</a>) (558407f51b5fdf4460275b69950676e7bace35d5) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Update dependency bun to v1.4.3 (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2137">#2137</a>) (71f90bf6d5fb2675430f60416e403851f9cb2cfe) - thanks <a href="https://github.com/renovate"><code>@renovate</code></a>[bot]!</li> <li>docs(react-router): note to run react-router typegen before Knip (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2140">#2140</a>) (f21ce9a9f1e3264cad1b763cf31ec2c177fb8656) - thanks <a href="https://github.com/MannXo"><code>@MannXo</code></a>!</li> <li>fix: normalize scoped binary names (close <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2143">#2143</a>) (c8509c4e45e1c343da707c26877a0a6584f6bc11)</li> <li>Clarify plugin implementation boundaries (c5a67f59d351e8d26dc6ecbbd3c3193e313772a4)</li> <li>fix(jest): treat mocked and required dependencies as used (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2141">#2141</a>) (3eaf1ba16045a3ac22f0717c4f1252312298bb76) - thanks <a href="https://github.com/TkDodo"><code>@TkDodo</code></a>!</li> <li>fix: preserve root-only plugins for trailing-slash cwd (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2139">#2139</a>) (7f0db0e7670bfd18fab081b522a104f787829f7d) - thanks <a href="https://github.com/sean0407"><code>@sean0407</code></a>!</li> <li>fix(nx): resolve run-commands script paths from the target cwd (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2151">#2151</a>) (516bd9a324303653978528f582287c857846fcc8) - thanks <a href="https://github.com/JeanBeaurepaire"><code>@JeanBeaurepaire</code></a>!</li> <li>Resolve Nx run-commands loader paths from the target cwd (fa8ca13e1345115d30122900ab68db7339487502)</li> <li>Add <code>@solidjs/vite-plugin</code> plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2144">#2144</a>) (579a88d306429694be43590efb50cb72067551ba) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>feat: add filesystem-routing plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2145">#2145</a>) (1abd9e1875bae36b0baf77f5864aab849d1528a8) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>Support tags in line comments (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1924">#1924</a>) (5abef4846e20f09fd4d0ee8dc2513ce50b616cdb)</li> <li>Keep resolveFromAST to static values in plugin guide (4cd353fd9ecb780228a63069080586a46ba6a8f2)</li> <li>fix(solidjs-vite-plugin): keep entry overrides in production (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2155">#2155</a>) (e4b5f890787da07824cc174cb624396f2133ff06) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>feat(angular): resolve styleUrl and styleUrls of <a href="https://github.com/Component"><code>@Component</code></a> (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2157">#2157</a>) (c20d4d720c586c9c5dc6e3d1a6ea60c557688bfa) - thanks <a href="https://github.com/Cayan"><code>@Cayan</code></a>!</li> <li>Update npmx.dev snapshot (59eb873f3beecf40b7aed9579bd29e1ab8b631f0)</li> <li>fix(next): recognize Turbopack alias targets (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2156">#2156</a>) (1d44f6a1a39c5557c1e215c7cf9db17937967344) - thanks <a href="https://github.com/jakeleventhal"><code>@jakeleventhal</code></a>!</li> <li>fix: preserve re-exports from framework entries (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2154">#2154</a>) (263ce20408a77b2473c555f304ad3b55c696b6a6) - thanks <a href="https://github.com/jakeleventhal"><code>@jakeleventhal</code></a>!</li> <li>feat(solidjs-vite-plugin): follow Solid's SSR and client mode entry rules (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2148">#2148</a>) (d711231eae14d8ecac562d73078125f3b30dc8fd) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>feat(filesystem-routing): read route options from Vite configs (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2149">#2149</a>) (585f206ca52d54e30f2068c818e1b33b50085459) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>feat(filesystem-routing): resolve routes from the Vite root (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2150">#2150</a>) (8cc0cb0c9ff09463cad30817c8cf78cbc48b7ed6) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>fix: track namespace members in Promise.all imports (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2162">#2162</a>) (3f17cdfce7a0f90e2599a7074291c4c875fe8244) - thanks <a href="https://github.com/everton-dgn"><code>@everton-dgn</code></a>!</li> <li>Update a few dependencies (161dbed3ccffa574e3a9493ddb20842eefa26af8)</li> <li>Fix Solid setup fixture coverage (ebe4180785667f6ff85c1e6ce2a11226713b2d5a)</li> <li>Migrate shell script parsing to unbash v6 (f86044c6760ac4f27e564f15feeae907cba3d297)</li> <li>Add sponsors: <a href="https://github.com/pennylane-hq"><code>@pennylane-hq</code></a>, <a href="https://github.com/agentscore"><code>@agentscore</code></a>, <a href="https://github.com/oblique-security"><code>@oblique-security</code></a> (thank you!) (57ff23eb430aaece73e02574923cabc6016a920b)</li> <li>Stop pairing Promise.all imports and bindings after a spread (5bd2c64eaf92f82a316d8fa6551acdb1d6c48c32)</li> <li>Update some stats (dd02ddeb235dd516cf93db99dda2180b0eb09a97)</li> <li>fix(nx): read karmaConfig from target options (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2164">#2164</a>) (4e1e4bc18f6d2f2705d729c375a20bd1679b8c0f) - thanks <a href="https://github.com/Cayan"><code>@Cayan</code></a>!</li> <li>Add tsrs plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2163">#2163</a>) (ba09126c023a2c408de8d7dae3bf6ab97e420966) - thanks <a href="https://github.com/jakeleventhal"><code>@jakeleventhal</code></a>!</li> <li>Drop redundant containingFilePath from plugin config inputs (ffb6caf02891d29eee41c7a0ecf147312dbe7205)</li> <li>Resolve Nx target option configs from the workspace root (52c5233aa905124c5b30c0bb7f9b0b25cd4260c6)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/webpro-nl/knip/commit/ee32ee6ca4c8826ca45f306041d9f8c5ffdaa335"><code>ee32ee6</code></a> Release knip@6.42.1</li> <li><a href="https://github.com/webpro-nl/knip/commit/7ee576ccd461f719b533e3783a5b58391ce89e91"><code>7ee576c</code></a> fix(vitest): use default test entries when config has no test key (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2170">#2170</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/5f3a7fb526d3eca7561aacfc9d0ac60056525206"><code>5f3a7fb</code></a> fix(bun): treat bun test arguments as path filters (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2165">#2165</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/2c5c2a2efab8f08be538bfe1f40982cb6f0fca3c"><code>2c5c2a2</code></a> Match quoted SCSS url() values within a single line</li> <li><a href="https://github.com/webpro-nl/knip/commit/fcff4db0b88d6282569743cd779aec5a5df99862"><code>fcff4db</code></a> Add .otf to foreign file extensions</li> <li><a href="https://github.com/webpro-nl/knip/commit/949da00abf419c1eeabdab1541ce7e5c312371b9"><code>949da00</code></a> fix(tailwind): track packages referenced from CSS url() (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2166">#2166</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/4c22593724460890e4492ba86119d0188127f2ba"><code>4c22593</code></a> fix(jest): load projects entries as Jest configs (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2167">#2167</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/4c4a5ece9148cf621f3a6e091fd3550b18f6e19a"><code>4c4a5ec</code></a> fix(semantic-release): resolve shareable configs from extends (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2159">#2159</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/8aa7d0e281ecba684c35acf4effd072e90a8862d"><code>8aa7d0e</code></a> Release knip@6.42.0</li> <li><a href="https://github.com/webpro-nl/knip/commit/52c5233aa905124c5b30c0bb7f9b0b25cd4260c6"><code>52c5233</code></a> Resolve Nx target option configs from the workspace root</li> <li>Additional commits viewable in <a href="https://github.com/webpro-nl/knip/commits/knip@6.42.1/packages/knip">compare view</a></li> </ul> </details> <br /> Updates `oxfmt` from 0.72.0 to 0.74.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.74.0</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>e236de0 formatter_tests: Skip conformance spec calls with non-literal options (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27957">#27957</a>) (leaysgur)</li> <li>782ab6e linter: Search string values without UTF-8 conversion (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26716">#26716</a>) (Dunqing)</li> <li>a5d8184 jsdoc: Parse code spans after quotes in descriptions (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27955">#27955</a>) (leaysgur)</li> <li>2645d2c formatter_markdown: Treat link destinations and footnote references as opaque to code span fences (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27948">#27948</a>) (leaysgur)</li> <li>4d8195c formatter_yaml: Keep a root plain scalar starting with a document marker verbatim (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27947">#27947</a>) (leaysgur)</li> <li>529b057 formatter_core: Keep front matter verbatim when body starts with indented delimiter (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27946">#27946</a>) (leaysgur)</li> <li>c22a9b2 formatter: Treat static block with only empty statements as empty (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27945">#27945</a>) (leaysgur)</li> <li>d3ff3f6 formatter/jsdoc: Write descriptions as written to not close the comment (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27823">#27823</a>) (leaysgur)</li> <li>c4c1727 formatter/sort_imports: Keep comments after the last import (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27822">#27822</a>) (leaysgur)</li> <li>a64677e formatter: Print JSDoc embedded snippets with LF (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27821">#27821</a>) (leaysgur)</li> <li>2c1cc20 formatter: Keep comment only Vue bindings as-is (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27820">#27820</a>) (leaysgur)</li> <li>1bf236d formatter/sort_imports: Do not use comments as import source (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27819">#27819</a>) (leaysgur)</li> <li>52ee29d formatter_yaml: Never start col-0 line with document marker or BOM (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27818">#27818</a>) (leaysgur)</li> <li>81c75e7 formatter/css: Keep glued css-in-js statement placeholders glued (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27814">#27814</a>) (leaysgur)</li> <li>a1ef7f4 formatter: Keep typecast parens in same-operator binary and arrow chain (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27812">#27812</a>) (leaysgur)</li> <li>de110ce formatter: Keep more parens around <code>TSInstantiationExpression</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27811">#27811</a>) (leaysgur)</li> <li>8b02e90 formatter_json: Reject invalid JSON instead of dropping them (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27785">#27785</a>) (leaysgur)</li> <li>6fe4c1b formatter: Treat lone CR in JSX text and argument blank lines (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27780">#27780</a>) (leaysgur)</li> <li>5605362 oxfmt: Validate editorconfig as like oxfmtrc (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27778">#27778</a>) (leaysgur)</li> <li>5b2acb0 formatter_core: Report error position releative to CRLF source (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27777">#27777</a>) (leaysgur)</li> <li>c78e80e formatter_core: Report parse error positions relative to the BOM-headed source (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27776">#27776</a>) (leaysgur)</li> <li>3a980c9 formatter_toml: Handle BOM like other languages (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27775">#27775</a>) (leaysgur)</li> <li>97c9fc4 oxfmt: Handle BOM in config JSON (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27774">#27774</a>) (leaysgur)</li> <li>28eb4a7 oxfmt: Print trailing newline for <code>--list-different</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27773">#27773</a>) (leaysgur)</li> <li>d2bea21 formatter: Glue comments to an opener in empty for-head slots and array holes (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27737">#27737</a>) (leaysgur)</li> <li>6a95ec1 formatter: Keep comment position on holey array (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27730">#27730</a>) (leaysgur)</li> <li>54769da formatter: Break after dangling line comment in holey array (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27729">#27729</a>) (leaysgur)</li> <li>99077ef formatter_json: Reject unary expressions other than signed numbers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27728">#27728</a>) (leaysgur)</li> <li>22cd4cd formatter_json: Handle holey array and comments (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27727">#27727</a>) (leaysgur)</li> <li>644ca1c formatter: Do not indent logical chains whose right sides all inline (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27667">#27667</a>) (leaysgur)</li> <li>a07a0fb formatter: Wrap comment-only JSX expression container in a group (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27666">#27666</a>) (leaysgur)</li> </ul> <h3>⚡ Performance</h3> <ul> <li>e220293 formatter: Check only the operator suppression mark in <code>is_quiet</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27952">#27952</a>) (leaysgur)</li> <li>e5fdc9c formatter_core: Write into one element stack through a concrete <code>Formatter</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27559">#27559</a>) (leaysgur)</li> <li>a342f7e formatter: Skip comment handling for nodes with no comment near them (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27557">#27557</a>) (leaysgur)</li> <li>d8ce750 formatter: Write string literals with swapped quotes into the arena (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27558">#27558</a>) (Yuji Sugiura)</li> <li>1c393c0 formatter_core: Skip scanning texts with nothing to rewrite (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27561">#27561</a>) (leaysgur)</li> <li>1d3ef10 formatter_core: Keep the embedded IR when nothing in it is rewritten (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27673">#27673</a>) (leaysgur)</li> </ul> <h3>📚 Documentation</h3> <ul> <li>1325225 oxfmt: Update useless comment prefix (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27956">#27956</a>) (leaysgur)</li> <li>d0dd140 formatter: Note lossy cooked round-trip in template embeds (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27944">#27944</a>) (leaysgur)</li> <li>8a3a6c8 oxfmt: Update stale notes on the JSDoc string-out channel and fixture origins (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27824">#27824</a>) (leaysgur)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/07ed78f4abde4020ca7919381ffea4da8616b78a"><code>07ed78f</code></a> release(apps): oxlint v1.89.0 && oxfmt v0.74.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27961">#27961</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/6941b4ed45ead21c45bc2164cb80a180eed85b43"><code>6941b4e</code></a> release(apps): oxlint v1.88.0 && oxfmt v0.73.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27643">#27643</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/a495e8241e4927a65f77c5e97b9f4dee4dbff5aa"><code>a495e82</code></a> feat(oxfmt): support <code>associations</code> config to specify language over filepath ...</li> <li><a href="https://github.com/oxc-project/oxc/commit/408d87f62893d5dc3eb3e0aa8a0b5e7e2eca32f3"><code>408d87f</code></a> docs(oxfmt): simplify oxfmtrc docs (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27432">#27432</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/5db28facf7bfe71d36829381b176f1c611e816f0"><code>5db28fa</code></a> feat(oxfmt): support Astro via <code>prettier-plugin-astro@1.x</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27386">#27386</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/902e188b3518afede5fc2b9823e36d8a48af6fda"><code>902e188</code></a> docs(oxfmt): update how <code>embeddedLanguageFormatting</code> option works (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27362">#27362</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxfmt_v0.74.0/npm/oxfmt">compare view</a></li> </ul> </details> <br /> Updates `oxlint` from 1.87.0 to 1.89.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.89.0</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>e3c1b11 ast: [<strong>BREAKING</strong>] Preserve lone surrogates in static property names (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27095">#27095</a>) (Dunqing)</li> <li>a0a987c ast: [<strong>BREAKING</strong>] Preserve lone surrogates in static member names (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26677">#26677</a>) (Dunqing)</li> </ul> <h3>🚀 Features</h3> <ul> <li>770ada4 linter: Mark vue 3 rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27717">#27717</a>) (Cam McHenry)</li> <li>ba38c1d linter: Mark react/react-hooks rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27701">#27701</a>) (Cam McHenry)</li> <li>d85a3ba linter: Mark promise rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27693">#27693</a>) (Cam McHenry)</li> <li>e71c88a linter: Mark node rule as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27692">#27692</a>) (Cam McHenry)</li> <li>7213f61 linter: Mark nextjs rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27691">#27691</a>) (Cam McHenry)</li> <li>d7c6b26 linter: Mark jsx-a11y rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27690">#27690</a>) (Cam McHenry)</li> <li>199dfdc linter: Mark jsdoc rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27689">#27689</a>) (Cam McHenry)</li> <li>780bff3 linter: Mark jest/vitest rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27672">#27672</a>) (Cam McHenry)</li> <li>6ae6859 linter: Mark import rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27671">#27671</a>) (Cam McHenry)</li> <li>b7a1df3 linter: Mark unicorn rules as recommended (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27670">#27670</a>) (Cam McHenry)</li> <li>c44a355 linter: Mark typescript rules as recommended from upstream (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27634">#27634</a>) (Cam McHenry)</li> <li>6b49dba linter: Mark eslint rules as recommended from upstream (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27632">#27632</a>) (Cam McHenry)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>7c47246 linter: Check module specifiers and string values that contain lone surrogates (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26717">#26717</a>) (Dunqing)</li> <li>782ab6e linter: Search string values without UTF-8 conversion (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26716">#26716</a>) (Dunqing)</li> <li>326904f linter/unicorn/no-useless-undefined: Allow <code>undefined</code> in <code>React.useRef</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25027">#25027</a>) (Chris Dokurno)</li> <li>f9cf165 linter/unicorn/prefer-spread: Ignore super method calls (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27868">#27868</a>) (camc314)</li> <li>00484e1 linter/eslint/prefer-const: Report destructuring assignments inside blocks (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27856">#27856</a>) (camc314)</li> <li>9c35461 linter/eslint/sort-vars: Report every out-of-order declaration (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27767">#27767</a>) (camc314)</li> <li>01e1c5e linter/unicorn/prefer-string-replace-all: Resolve regex variables (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27769">#27769</a>) (camc314)</li> <li>7f474d5 linter/eslint/no-loop-func: Detect writes after the loop (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27754">#27754</a>) (camc314)</li> <li>4b7fea6 linter/eslint/block-scoped-var: Ignore declarations without writes (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27760">#27760</a>) (camc314)</li> <li>2947917 linter/eslint/no-lonely-if: Check final else blocks in else-if chains (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27759">#27759</a>) (camc314)</li> <li>fc039b5 linter/eslint/sort-imports: Check imports after other statements (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27749">#27749</a>) (camc314)</li> <li>1acba97 linter/unicorn/prefer-at: Report slice index reads once (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27762">#27762</a>) (camc314)</li> <li>6190e26 linter/eslint/prefer-arrow-callback: Ignore functions used as conditional tests (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27533">#27533</a>) (Anzal Husain Abidi)</li> <li>b3cdaaf linter/eslint/sort-keys: Check computed identifier names (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27748">#27748</a>) (camc314)</li> <li>170e608 linter/unicorn/prefer-native-coercion-functions: Check object methods and function properties (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27750">#27750</a>) (camc314)</li> <li>9261df7 linter/unicorn/prefer-string-raw: Check object property values (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27758">#27758</a>) (camc314)</li> <li>ddea86b linter/eslint/prefer-template: Report separate nested concatenations (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27764">#27764</a>) (camc314)</li> <li>2c67197 linter/eslint/no-unused-vars: Count conditional calls in sequences as uses (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27755">#27755</a>) (camc314)</li> <li>7f22fa0 linter/unicorn/prefer-regexp-test: Check logical operands in boolean contexts (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27761">#27761</a>) (camc314)</li> <li>3c44398 linter/eslint/class-methods-use-this: Count this in parameter defaults (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27756">#27756</a>) (camc314)</li> <li>d85923f linter/eslint/no-param-reassign: Report rest parameter writes (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27765">#27765</a>) (camc314)</li> <li>8ea47bb linter/unicorn/prefer-type-error: Handle parenthesized type checks (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27766">#27766</a>) (camc314)</li> <li>e96856c linter/unicorn/catch-error-name: Check unused underscore-prefixed names (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27751">#27751</a>) (camc314)</li> <li>d8ca399 linter/unicorn/no-array-callback-reference: Ignore callback factory calls (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27763">#27763</a>) (camc314)</li> <li>1267ab8 linter/eslint/max-params: Count rest parameters (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27757">#27757</a>) (camc314)</li> <li>9ff25c3 linter/eslint/no-useless-assignment: Report dead stores to function parameters (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27735">#27735</a>) (camc314)</li> <li>ee5e730 linter/eslint/no-setter-return: Check setters in property descriptors (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27731">#27731</a>) (camc314)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </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> <h2>[1.89.0] - 2026-10-19</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>9a424c2 oxlint,oxfmt: Correct Node.js TypeScript support range (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27699">#27699</a>) (camc314)</li> </ul> <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> <h2>[1.86.0] - 2026-09-28</h2> <h3>🚀 Features</h3> <ul> <li>9d80eed linter/react/only-export-components: Support <code>allowCompoundComponents</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27117">#27117</a>) (Kuroda Kayn)</li> <li>e05b155 linter: Add typescript/no-generated-empty-object-type (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26958">#26958</a>) (camc314)</li> </ul> <h2>[1.82.0] - 2026-09-07</h2> <h3>🚀 Features</h3> <ul> <li>6a0e19c linter/eslint/no-unmodified-loop-condition: Support <code>checkConditionalExpressions</code> option (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26249">#26249</a>) (camc314)</li> </ul> <h2>[1.81.0] - 2026-08-31</h2> <h3>📚 Documentation</h3> <ul> <li>d5be037 linter/typescript/switch-exhaustiveness-check: Clarify default case comment pattern (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26100">#26100</a>) (camc314)</li> </ul> <h2>[1.79.0] - 2026-08-18</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>8c4552d linter: [<strong>BREAKING</strong>] Split react/react-compiler into per-category rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25500">#25500</a>) (Boshen)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>228e8e0 linter: Resolve inactive React compiler rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25830">#25830</a>) (Boshen)</li> <li>aa49d86 linter: Allow spread rule options in config types (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25675">#25675</a>) (ch3rry)</li> <li>36f8451 linter/eslint/no-eval: Align indirect default with ESLint (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25656">#25656</a>) (camc314)</li> <li>beb724d linter/eslint/no-unused-vars: Report bare underscore parameters (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25663">#25663</a>) (camc314)</li> <li>4004c10 linter/eslint/no-irregular-whitespace: Check comments by default (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25660">#25660</a>) (camc314)</li> <li>285820e linter/no-large-snapshots: Precompile and document allowed snapshot matchers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25611">#25611</a>) (Mikhail Baev)</li> <li>4df5835 linter: Allow capitalized built-in calls (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25516">#25516</a>) (Boshen)</li> </ul> <h2>[1.78.0] - 2026-08-10</h2> <h3>🚀 Features</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/07ed78f4abde4020ca7919381ffea4da8616b78a"><code>07ed78f</code></a> release(apps): oxlint v1.89.0 && oxfmt v0.74.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27961">#27961</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/9a424c209ea0df16becbf3141d63bcc293ede237"><code>9a424c2</code></a> fix(oxlint,oxfmt): correct Node.js TypeScript support range (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27699">#27699</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/6941b4ed45ead21c45bc2164cb80a180eed85b43"><code>6941b4e</code></a> release(apps): oxlint v1.88.0 && oxfmt v0.73.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27643">#27643</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/3c361a7fb5c9fbbe940e489f2e315a187a19b565"><code>3c361a7</code></a> feat(linter/unicorn/prefer-query-selector): add <code>allowWithVariables</code> option (...</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxlint_v1.89.0/npm/oxlint">compare view</a></li> </ul> </details> <br /> Updates `vitest` from 5.0.4 to 5.0.5 <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.5</h2> <h3> 🐞 Bug Fixes</h3> <ul> <li>Keep vite default <code>fs.deny</code> with api token file - 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/11578">vitest-dev/vitest#11578</a> <a href="https://github.com/vitest-dev/vitest/commit/28dc1edfb"><!-- raw HTML omitted -->(28dc1)<!-- raw HTML omitted --></a></li> <li>Handle quoted file names in <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/11583">vitest-dev/vitest#11583</a> <a href="https://github.com/vitest-dev/vitest/commit/14921e962"><!-- raw HTML omitted -->(14921)<!-- raw HTML omitted --></a></li> <li>Add <code>data</code> to the <code>import.meta.hot</code> stub - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11590">vitest-dev/vitest#11590</a> <a href="https://github.com/vitest-dev/vitest/commit/3a8289ac3"><!-- raw HTML omitted -->(3a828)<!-- raw HTML omitted --></a></li> <li>Set <code>skip</code> in <code>skipIf</code>, ignore <code>undefined</code> options - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11591">vitest-dev/vitest#11591</a> <a href="https://github.com/vitest-dev/vitest/commit/d523a15f2"><!-- raw HTML omitted -->(d523a)<!-- raw HTML omitted --></a></li> <li>Skip builtin loading in async leak detector - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11598">vitest-dev/vitest#11598</a> <a href="https://github.com/vitest-dev/vitest/commit/fe86a64c6"><!-- raw HTML omitted -->(fe86a)<!-- raw HTML omitted --></a></li> <li>Keep the import frame in native loader 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/11599">vitest-dev/vitest#11599</a> <a href="https://github.com/vitest-dev/vitest/commit/9697b3894"><!-- raw HTML omitted -->(9697b)<!-- raw HTML omitted --></a></li> <li>Run hook cleanups when a later hook fails - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11605">vitest-dev/vitest#11605</a> <a href="https://github.com/vitest-dev/vitest/commit/6c5a44720"><!-- raw HTML omitted -->(6c5a4)<!-- raw HTML omitted --></a></li> <li>Release mocks of finished test files - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11607">vitest-dev/vitest#11607</a> <a href="https://github.com/vitest-dev/vitest/commit/e9c3d72f0"><!-- raw HTML omitted -->(e9c3d)<!-- raw HTML omitted --></a></li> <li>Abort all running tests on cancel - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11606">vitest-dev/vitest#11606</a> <a href="https://github.com/vitest-dev/vitest/commit/6621a72d6"><!-- raw HTML omitted -->(6621a)<!-- raw HTML omitted --></a></li> <li><strong>browser</strong>: <ul> <li>Ignore synthetic pagehide events - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11582">vitest-dev/vitest#11582</a> <a href="https://github.com/vitest-dev/vitest/commit/ca0813584"><!-- raw HTML omitted -->(ca081)<!-- raw HTML omitted --></a></li> <li>Run plugin buildStart on server creation - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11593">vitest-dev/vitest#11593</a> <a href="https://github.com/vitest-dev/vitest/commit/ea611e44c"><!-- raw HTML omitted -->(ea611)<!-- raw HTML omitted --></a></li> <li>Drop late connections of closed sessions - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11600">vitest-dev/vitest#11600</a> <a href="https://github.com/vitest-dev/vitest/commit/f161e6df2"><!-- raw HTML omitted -->(f161e)<!-- raw HTML omitted --></a></li> <li>Wait 30s for the browser to close - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11601">vitest-dev/vitest#11601</a> <a href="https://github.com/vitest-dev/vitest/commit/6498b666a"><!-- raw HTML omitted -->(6498b)<!-- raw HTML omitted --></a></li> <li>Run global setup once with instances - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11596">vitest-dev/vitest#11596</a> <a href="https://github.com/vitest-dev/vitest/commit/8dd67c262"><!-- raw HTML omitted -->(8dd67)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>reporter</strong>: <ul> <li>End reason <code>&[#39](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/39);failed&[#39](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/39);</code> on worker crash - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11568">vitest-dev/vitest#11568</a> <a href="https://github.com/vitest-dev/vitest/commit/6ae8e89ff"><!-- raw HTML omitted -->(6ae8e)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <h5> <a href="https://github.com/vitest-dev/vitest/compare/v5.0.4...v5.0.5">View changes on GitHub</a></h5> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitest-dev/vitest/commit/7a825db43e2beca0b219d2eadaec334cb81af0c7"><code>7a825db</code></a> chore: release v5.0.5 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11609">#11609</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/6621a72d6ed371e43f80ff327f5063693bd6b1ad"><code>6621a72</code></a> fix: abort all running tests on cancel (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11606">#11606</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/e9c3d72f0c8d6867de06a3df43ea28a05eeec444"><code>e9c3d72</code></a> fix: release mocks of finished test files (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11607">#11607</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/8dd67c2625943d824e257b87ae57a14094e90eed"><code>8dd67c2</code></a> fix(browser): run global setup once with instances (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11596">#11596</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/6c5a447203a29a0708fbc5de4fb91ea501bdc395"><code>6c5a447</code></a> fix: run hook cleanups when a later hook fails (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11605">#11605</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/9697b3894f456b85db91f3824ebe833449305c04"><code>9697b38</code></a> fix: keep the import frame in native loader errors (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11599">#11599</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/6498b666a3ae8961f6f2a8abdc89015b6fd0b3aa"><code>6498b66</code></a> fix(browser): wait 30s for the browser to close (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11601">#11601</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/f161e6df2b3c0bc84982d374094379139e380791"><code>f161e6d</code></a> fix(browser): drop late connections of closed sessions (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11600">#11600</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/fe86a64c6c6aa75481bffe5880b5c4e35ea67927"><code>fe86a64</code></a> fix: skip builtin loading in async leak detector (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11598">#11598</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/6ae8e89ff0734cf476e30186a83aebe6771aa330"><code>6ae8e89</code></a> fix(reporter): end reason <code>'failed'</code> on worker crash (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11568">#11568</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v5.0.5/packages/vitest">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> |
||
|
|
e33803cac2 |
build(deps): update socket.io-parser, ws and baseline-browser-mapping in the lockfiles (#1560)
Dependabot has four open npm alerts and no PRs for them, since they are all transitive. This updates the lockfiles only, no package.json change. | Package | From | To | Alert | |---|---|---|---| | socket.io-parser | 4.2.6 | 4.2.7 | zero-attachment memory exhaustion (high) | | ws | 8.18.3 | 8.21.3 | memory exhaustion DoS (high) and uninitialized memory disclosure (medium) | | engine.io-client | 6.6.4 | 6.6.7 | needed to get ws past its `~8.18` range | | baseline-browser-mapping | 2.9.19 | 2.11.31 | process termination on invalid input (medium, dev only) | I think the practical risk was low to begin with, since ws is only used by engine.io-client under Node and the built bundle doesn't include it. Still, it clears the alerts and the bumps are small. Done with npm 11 so the `libc` fields in the lockfile stay as they were. A clean `npm ci` from the new lockfile gives 0 vulnerabilities, and `tsc`, `vitest` (241 tests) and `vite build` all pass. |
||
|
|
d887942630 |
fix(search): name the proxy when a gateway cuts a search off (#1522)
A reverse proxy whose read timeout is shorter than the release search budget (nginx defaults to 60s) answers a slow search with its own 504 page. describeSearchFailure found no server message there and fell back to "Unable to reach download source. Network may be restricted or mirrors blocked.", which sent users off changing mirrors (discussion #1520). - 504 and Cloudflare's 524 now say the proxy stopped waiting and that its read timeout should be at least the release search timeout. - A 502/503 with a non-JSON body keeps fetchJSON's "Server unavailable" wording instead of the mirrors line. - docs: the root-path nginx example sets proxy_read_timeout and proxy_send_timeout like the subpath ones, and a new troubleshooting section covers searches that time out behind a proxy. |
||
|
|
1aa9846f22 |
fix(download): trust a pinned AA mirror and repair the full e2e profile (#1518)
The destination guard from the oceanofpdf/SSRF fix (
|
||
|
|
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> |
||
|
|
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. |
||
|
|
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. |
||
|
|
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 |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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. |
||
|
|
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" /> |
||
|
|
756bdec19b |
fix(metadata): show the translation a search matched on Open Library and Hardcover (#1451)
Searching a translated title on Open Library or Hardcover returned the original-language work. "Der Weg der Könige" came back as "The Way of Kings" (2010), and that English title then went into the release search and the download name. Both providers keep one record per work, titled after the original, and list translations underneath it. #483 already searches releases per language with Hardcover's localized titles, which fixed the release side of #360 when the matching language is selected. This PR fixes the search result itself, so the book a user picks is the translation they searched for, and it covers Open Library, the default provider, which has no titles_by_language. - Open Library: request the matched edition (editions.*) and prefer its title, ISBNs, cover, language and publication year when its title differs from the work's. - Hardcover: use the alternative title named in the hit's highlights (alternative_titles, best index first), without the original's subtitle. A hit whose title also matched keeps the work title. - /api/releases: when the modal sends a title that differs from the book record's, it becomes search_title. Before, Hardcover's search_title from the original won, so picking "Kinder des Nebels" still searched "The Final Empire" first. - Release cache: keyed on title and language as well as the provider ID. All translations share that ID, so opening "The Way of Kings" after "Der Weg der Könige" showed the German releases until a reload. Known limitations: neither provider has descriptions per edition, so the description stays the work's (usually English). Hardcover's search hits carry no year or language for alternative titles, so those stay the work's; Open Library's do not. Google Books is unaffected, since it already returns one volume per edition. Tests: Open Library edition parsing, Hardcover alternative-title matching, the /api/releases title override, and the release cache, each written to fail first. The Python suite passes apart from the 9 test_entrypoint_permissions.py tests, which fail the same way on an unmodified main on macOS. The frontend typecheck, lint, format check and unit tests pass. Checked on a live instance with Open Library, Hardcover and Google Books. Refs #360, #483 Disclaimer: This was developed with the help of AI but reviewed and tested as well as deployed on my server by a real human. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
95ed00ce78 |
fix(activity): Clear Completed leaves out requests that are still pending (#1438)
Kept small on purpose so it's easy to review. Same kind of small fix as #1429, so see the question there about separate PRs versus combined. "Clear Completed" sends each finished download plus the request linked to it. The server only dismisses finished requests, and if one request in the batch is still pending it answers 409 "Only terminal requests can be dismissed" and nothing gets cleared. A request can be pending while its download has ended, for example when the startup sweep from #1409 reopens the request of an interrupted download. On my instance 25 finished downloads were linked to 21 pending requests, and the button failed every time. The button now leaves out the request target when the request list shows it as pending, and still dismisses the download. A request the list has no record of is sent as before. The target logic moved into a small `getClearCompletedTargets` helper so it can be tested without rendering the sidebar. The pending-request test fails on the old logic. Vitest (225 passing), tsc, oxlint and oxfmt are clean. I reproduced the 409 from the server log and the data, but I haven't clicked through it in the UI with this build. The one red check is the existing clock-dependent test `test_a_queued_torrent_asks_for_a_grace_once`, which fails on any runner that booted recently. It is fixed in #1426 and is not caused by this change. Co-authored-by: CaliBrain <calibrain@l4n.xyz> |
||
|
|
3f2873916f |
feat(QoL): implement top-level settings button (#1427)
Implementing a top-level/reusable settings button that can be clicked directly from the home page instead of having to require a second click to get to the settings menu. <img width="1315" height="449" alt="image" src="https://github.com/user-attachments/assets/687cba23-621e-4231-b39f-5c484ca15974" /> |
||
|
|
32abaff21e |
feat(naming): {Narrator} placeholder and MyAnonamouse series fallback (#1407)
## Human-Written explanation:
Following up on previous PR to use MAM ID to get nararrator and series
to show up in search, this PR will allow the series and nararrator
fields to be added to the path when saving an audiobook.
I have tested my ghcr.io image on my instance and it seemed to work
properly.
All the text below is written by Claude.
# feat(naming): {Narrator} placeholder and MyAnonamouse series fallback
Follow-up to #1390 and #1399. Related to #605 and #934 (narrator
support).
## Problem
Several narrations of the same audiobook currently land in the same
folder, because nothing in the path template tells them apart. Keeping
more than one version means renaming folders by hand after every
download.
Since #1390, MyAnonamouse results carry the release's narrator and
series in `extra`, but the naming templates can't use them: there is no
`{Narrator}` placeholder, and `{Series}` / `{SeriesPosition}` only come
from the metadata provider.
## Changes
- **`{Narrator}` placeholder** (`core/naming.py`,
`download/postprocess/transfer.py`, `core/models.py`): `DownloadTask`
gains `narrator`, read from `narrator` or `extra.narrator` when a
release is queued, and kept in the restart-safe retry payload. It's
available in audiobook templates like any other placeholder, including
prefix/suffix blocks such as `{ - Narrator}`.
- **Audiobookshelf folder style**: Audiobookshelf reads the narrator
from folder names like `Title {Narrator}`. The template `{Title}
{{Narrator}}` already matches as `{` + `{Narrator}`; the parser now also
drops the closing brace when the narrator is empty, so the folder is
`Title` rather than `Title }`.
- **No stray spaces around `/`**: an empty placeholder at the start or
end of a folder name no longer leaves a space there (e.g. `Title
/Title`). This applies to all templates.
- **Series fallback** (`release_sources/prowlarr/mam.py`, `source.py`,
`download/orchestrator.py`): MAM enrichment also stores the first
series' name and number as `extra.series_name` /
`extra.series_position`, which queueing already falls back to when the
metadata provider has no series. The provider's series still wins. A
release-level series number is only used when it names the same series
as the provider, so a provider series is never paired with the number of
a different MAM series (an omnibus, for example).
- **Settings and preview** (`config/settings.py`,
`namingTemplatePreview.ts`): the audiobook template descriptions list
`{Narrator}` and explain `{{Narrator}}`. The settings page preview
mirrors the parser changes and offers `{Narrator}` under "Insert
variable" for audiobook templates only.
- **Docs**: regenerated `environment-variables.md`. This also picked up
the Library Check settings, which weren't in the generated docs yet;
happy to drop that part to keep the diff focused.
## Example
Audiobook Path Template `{Author}/{Title} {{Narrator}}/{Title}`:
| Narrator | Result |
|----------|--------|
| Samuel Roukin | `Christopher Ruocchio/Empire of Silence {Samuel
Roukin}/Empire of Silence.m4b` |
| none | `Christopher Ruocchio/Empire of Silence/Empire of Silence.m4b`
|
## Testing
- `tests/core/test_narrator_template_variable.py` (new, 16 tests):
`{{Narrator}}` with and without a value, the `{ {Narrator}}` prefix
form, prefix/suffix blocks, sanitizing, `build_library_path`, task
metadata, retry payload round trip, MAM series name/number parsing
(including a `1-3` range having no number), and queueing (narrator from
`extra`, series fallback, no cross-series number, blank narrator).
- `namingTemplatePreview.test.ts`: the same `{{Narrator}}` cases for the
preview.
- Updated `test_generate_env_docs.py` for the new template description.
- Full `pytest -m "not integration and not e2e"` compared with an
upstream `main` worktree on the same machine: no new failures (the
remaining ones are Windows-only on both).
- `ruff check`, `ruff format --check`, `basedpyright` (0 errors) and
`vulture` on touched files; frontend `tsc --noEmit`, `oxlint`, `oxfmt
--check`, `vitest` (218 passed).
- Checked the settings page locally: the audiobook preview renders `...
{Simon Vance}.mp3` and `{Narrator}` is listed for audiobook templates
only.
No behavior change for existing templates, apart from spaces next to `/`
being trimmed.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
3d85b610c0 |
build(deps): bump the npm-deps group in /src/frontend with 8 updates (#1414)
Bumps the npm-deps group in /src/frontend with 8 updates: | Package | From | To | | --- | --- | --- | | [socket.io-client](https://github.com/socketio/socket.io) | `4.8.3` | `4.8.4` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.6.2` | `26.6.3` | | [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.37.0` | `6.38.0` | | [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) | `0.70.0` | `0.71.0` | | [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) | `1.85.0` | `1.86.0` | | [oxlint-tsgolint](https://github.com/oxc-project/tsgolint) | `7.0.2002` | `7.0.2003` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.3.0` | `8.3.1` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `5.0.1` | `5.0.2` | Updates `socket.io-client` from 4.8.3 to 4.8.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/socketio/socket.io/releases">socket.io-client's releases</a>.</em></p> <blockquote> <h2>socket.io-client@4.8.4</h2> <h3>Bug Fixes</h3> <ul> <li><strong>types:</strong> export ExtendedError for connect_error event (<a href="https://redirect.github.com/socketio/socket.io/issues/5548">#5548</a>) (<a href="https://github.com/socketio/socket.io/commit/c0d54509fbe7dafd3ed8b5a2f3f74a12810da4a3">c0d5450</a>)</li> <li><strong>types:</strong> export reserved event interfaces (<a href="https://redirect.github.com/socketio/socket.io/issues/5533">#5533</a>) (<a href="https://github.com/socketio/socket.io/commit/03945df6b750dfa6379305ef29ea4235a424ca47">03945df</a>)</li> </ul> <h3>Dependencies</h3> <ul> <li><a href="https://github.com/socketio/socket.io/releases/tag/engine.io-client%406.6.7"><code>engine.io-client@~6.6.1</code></a> (no change)</li> <li><a href="https://github.com/websockets/ws/releases/tag/8.21.0"><code>ws@~8.21.0</code></a> (<a href="https://github.com/websockets/ws/compare/8.18.3...8.21.0">diff</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/socketio/socket.io/commit/11a6f561a757264c3231c3383c4cdbf37bcf52de"><code>11a6f56</code></a> chore(release): socket.io-client@4.8.4</li> <li><a href="https://github.com/socketio/socket.io/commit/00e4e73a68505ff0c93d7d9ca8db5dd510428cf4"><code>00e4e73</code></a> chore(release): engine.io-client@6.6.7</li> <li><a href="https://github.com/socketio/socket.io/commit/e387ab116f6904537ccef872ef570a6ef7936e9d"><code>e387ab1</code></a> chore: use <code>@rollup/plugin-terser</code> instead of rollup-plugin-terser</li> <li><a href="https://github.com/socketio/socket.io/commit/973833304c7c195c2d0d99b72e4ac9f149e3ca94"><code>9738333</code></a> chore(release): engine.io@6.6.11</li> <li><a href="https://github.com/socketio/socket.io/commit/fc9dd90e2ff26aa358d0cd27bc59ddc93458ae44"><code>fc9dd90</code></a> docs(eio): rework README</li> <li><a href="https://github.com/socketio/socket.io/commit/da008a514ded71e3058a964c831c69abe417b2f5"><code>da008a5</code></a> fix(eio): refresh ping timeout on incoming packets</li> <li><a href="https://github.com/socketio/socket.io/commit/3df3fed075fd2312e84481786235aa14d08b8fe7"><code>3df3fed</code></a> fix(eio-client): restore default transport resolution</li> <li><a href="https://github.com/socketio/socket.io/commit/aaf2af36ec8ad05910f357a788e0e358bad32738"><code>aaf2af3</code></a> test: upgrade WebdriverIO to v9</li> <li><a href="https://github.com/socketio/socket.io/commit/b5da079228666fcabd97166486d5f6a110826bc8"><code>b5da079</code></a> refactor(sio): simplify packet handling switch</li> <li><a href="https://github.com/socketio/socket.io/commit/45873ca93e6e25ac55dc1ba5c9b87853bf19ffba"><code>45873ca</code></a> docs(protocol): clarify namespace comma restriction for built-in parser (<a href="https://redirect.github.com/socketio/socket.io/issues/5545">#5545</a>)</li> <li>Additional commits viewable in <a href="https://github.com/socketio/socket.io/compare/socket.io-client@4.8.3...socket.io-client@4.8.4">compare view</a></li> </ul> </details> <br /> Updates `@types/node` from 26.6.2 to 26.6.3 <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 `knip` from 6.37.0 to 6.38.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.38.0</h2> <ul> <li>Include co-authors in docs contributor list (0c334100df59d89a512ad598ec50e7f62f6da0c3)</li> <li>Filter bots and agents from docs contributors (617f70d8179c6b8668ca41fe5df77ced5e2b37c0)</li> <li>Update Eve plugin conventions (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2049">#2049</a>) (260dbb91a85f3a3bc2727e8f255d73df3737552c) - thanks <a href="https://github.com/matchai"><code>@matchai</code></a>!</li> <li>Add <code>args</code> example to that doc page (50b271b98fc930a05a3b045a2f691486f9f06528)</li> <li>Add Turborepo plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2055">#2055</a>) (e49d3db05f1d69ce7db3efcb8467a4af63c27379) - thanks <a href="https://github.com/changbaebang"><code>@changbaebang</code></a>!</li> <li>Support <code>import-x/*</code> settings in ESLint plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2050">#2050</a>) (1a34cf82a3d6a1202717ef910bedba55838e9dd9) - thanks <a href="https://github.com/bytedoe"><code>@bytedoe</code></a>!</li> <li>Resolve file option in Mocha configuration files (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2051">#2051</a>) (9b5c5f60468c8a92a3e74adca5c0931f008677af) - thanks <a href="https://github.com/giaBaoJS"><code>@giaBaoJS</code></a>!</li> <li>Support oxlint extends (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2054">#2054</a>) (a149a98219bb14b15f446fc5f8c4f815e28b2183) - thanks <a href="https://github.com/matthewnitschke-wk"><code>@matthewnitschke-wk</code></a>!</li> <li>Fix import.meta handling in built-in compilers (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2059">#2059</a>) (8b0c85076bf3dce15ef5f3c0c4e58bfefdf59ded) - thanks <a href="https://github.com/vdavid"><code>@vdavid</code></a>!</li> <li>Fix tag hints for enum and namespace members (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2061">#2061</a>) (8a8805e48945863248429d18b7f6c4e4b7dc9ebd) - thanks <a href="https://github.com/devYRPauli"><code>@devYRPauli</code></a>!</li> <li>Flag unused member tags in tagged enums and namespaces (584e53ff3e0846fbfe04fa5b5bfefe2420576a34)</li> <li>feat: resolve MDX content mapper remarkPlugins (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2060">#2060</a>) (34dbccf25359f9e9fefe9d0be6ef2ec0252223cc) - thanks <a href="https://github.com/gioboa"><code>@gioboa</code></a>!</li> <li>Refactor and separate concerns w/ new typescript-content-mapper plugin (11e94509bd0f350d747facf4003fc5b248d1b02d)</li> <li>Resolve mdx content mapper providerImportSource (7b5825117f97f2f87b7141509a254f88d0957cf7)</li> <li>Fix config → entry in plop plugin (25a380c9e1165b76583d69b48b5fa7cdf5db0ae2)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/webpro-nl/knip/commit/c0e42f83bda7664065465f2f3faca7af97c988ac"><code>c0e42f8</code></a> Release knip@6.38.0</li> <li><a href="https://github.com/webpro-nl/knip/commit/25a380c9e1165b76583d69b48b5fa7cdf5db0ae2"><code>25a380c</code></a> Fix config → entry in plop plugin</li> <li><a href="https://github.com/webpro-nl/knip/commit/7b5825117f97f2f87b7141509a254f88d0957cf7"><code>7b58251</code></a> Resolve mdx content mapper providerImportSource</li> <li><a href="https://github.com/webpro-nl/knip/commit/11e94509bd0f350d747facf4003fc5b248d1b02d"><code>11e9450</code></a> Refactor and separate concerns w/ new typescript-content-mapper plugin</li> <li><a href="https://github.com/webpro-nl/knip/commit/34dbccf25359f9e9fefe9d0be6ef2ec0252223cc"><code>34dbccf</code></a> feat: resolve MDX content mapper remarkPlugins (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2060">#2060</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/584e53ff3e0846fbfe04fa5b5bfefe2420576a34"><code>584e53f</code></a> Flag unused member tags in tagged enums and namespaces</li> <li><a href="https://github.com/webpro-nl/knip/commit/8a8805e48945863248429d18b7f6c4e4b7dc9ebd"><code>8a8805e</code></a> Fix tag hints for enum and namespace members (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2061">#2061</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/8b0c85076bf3dce15ef5f3c0c4e58bfefdf59ded"><code>8b0c850</code></a> Fix import.meta handling in built-in compilers (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2059">#2059</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/a149a98219bb14b15f446fc5f8c4f815e28b2183"><code>a149a98</code></a> Support oxlint extends (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2054">#2054</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/9b5c5f60468c8a92a3e74adca5c0931f008677af"><code>9b5c5f6</code></a> Resolve file option in Mocha configuration files (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2051">#2051</a>)</li> <li>Additional commits viewable in <a href="https://github.com/webpro-nl/knip/commits/knip@6.38.0/packages/knip">compare view</a></li> </ul> </details> <br /> Updates `oxfmt` from 0.70.0 to 0.71.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.71.0</h2> <h3>🚀 Features</h3> <ul> <li>e0b1f9f oxfmt: Bump bundled Prettier version to 3.9.9 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27002">#27002</a>) (leaysgur)</li> <li>342527d oxfmt: Bump bundled Prettier version to 3.9.8 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26999">#26999</a>) (leaysgur)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>eeba1db formatter: Skip test-call layout when arguments have comments (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27119">#27119</a>) (leaysgur)</li> <li>1f7b8ad oxfmt: Allow repeated CLI calls in the same process (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27051">#27051</a>) (Liang)</li> <li>7bcb807 formatter_markdown: Keep blank line between HTML and nested list (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27112">#27112</a>) (leaysgur)</li> <li>10b10c5 formatter: Keep comments around <code>=</code> on their side and line (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27041">#27041</a>) (leaysgur)</li> <li>9aad365 formatter: Keep comments deferred before an assignment operator (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26997">#26997</a>) (waltu)</li> <li>8fbddb1 formatter/jsdoc: More alignment with original plugin (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27039">#27039</a>) (leaysgur)</li> <li>50be18e formatter: Keep trailing spaces on normal block comments (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27037">#27037</a>) (leaysgur)</li> <li>56d1880 formatter: Nestle adjacent block comments (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27036">#27036</a>) (leaysgur)</li> <li>3be5d94 formatter: Treat <code>/***</code> comments as JSDoc (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27035">#27035</a>) (leaysgur)</li> <li>cd45f71 formatter: Keep trailing double spaces on JSDoc lines (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26861">#26861</a>) (John Costa)</li> <li>fd695f4 formatter_markdown: Fix more mismatches found in ecosystem-ci repos (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27003">#27003</a>) (leaysgur)</li> <li>4e77d59 formatter_markdown: Keep a math span after a kept line break from opening a block (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27001">#27001</a>) (leaysgur)</li> <li>584b8b0 formatter_markdown: Keep a shape line after a multi-line inline node or link title (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27000">#27000</a>) (leaysgur)</li> <li>b939645 formatter_markdown: Keep a line break before an inline liquid tag under preserve (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26998">#26998</a>) (leaysgur)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/2ae2939bb2fd98796393658b21556b2a2467e047"><code>2ae2939</code></a> release(apps): oxlint v1.86.0 && oxfmt v0.71.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27132">#27132</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/f158bff061a59d776fd695e4baf7f7497f895612"><code>f158bff</code></a> chore(deps): update npm packages (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26865">#26865</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxfmt_v0.71.0/npm/oxfmt">compare view</a></li> </ul> </details> <br /> Updates `oxlint` from 1.85.0 to 1.86.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.86.0</h2> <h3>🚀 Features</h3> <ul> <li>9d80eed linter/react/only-export-components: Support <code>allowCompoundComponents</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27117">#27117</a>) (Kuroda Kayn)</li> <li>e05b155 linter: Add typescript/no-generated-empty-object-type (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26958">#26958</a>) (camc314)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>8306aa4 linter/typescript/no-unnecessary-parameter-property-assignment: Account for parameter property reassignment (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26955">#26955</a>) (camc314)</li> <li>42dfbb5 linter/eslint/one-var: Keep <code>declare</code> when splitting declarations (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27081">#27081</a>) (Cheolhee Lee)</li> <li>2ba7e33 linter/eslint/require-await: Count <code>await using</code> as an await (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27080">#27080</a>) (Cheolhee Lee)</li> <li>611e4ed linter/plugins: Include executing selectors in JS plugin rule timings (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27111">#27111</a>) (overlookmotel)</li> <li>2cac66f react-compiler: Handle recursive function expressions (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26796">#26796</a>) (Brennan Butler)</li> <li>e996e6c react-compiler: Treat zero-argument new Date as impure (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26894">#26894</a>) (Boshen)</li> <li>571cfa3 oxlint: Skip type-aware lint rules in type-check-only mode (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27076">#27076</a>) (camc314)</li> <li>d0b2462 oxlint: Skip undefined children in CFG walker (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27075">#27075</a>) (camc314)</li> <li>5186328 parser: Handle HTML comment values (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/22933">#22933</a>) (Boshen)</li> <li>0b630e8 linter/typescript/unified-signatures: Align rule with upstream (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26956">#26956</a>) (camc314)</li> <li>ebb22f1 linter/node/no-exports-assign: Change category from style to suspicious (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26555">#26555</a>) (Bartok)</li> <li>cce28a0 linter/import/no-duplicates: Distinguish import attributes (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26936">#26936</a>) (camc314)</li> <li>feb733b linter/unicorn/prefer-spread: Stop checking string split calls (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26935">#26935</a>) (camc314)</li> <li>929e154 linter/eslint/no-unused-vars: Honor ignore patterns inside array rest bindings (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26923">#26923</a>) (camc314)</li> <li>5bdb9b8 linter/eslint/no-unused-vars: Recognize consumed update expressions (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26782">#26782</a>) (camc314)</li> <li>5c05bef linter/eslint/prefer-const: Ignore embedded assignments (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26920">#26920</a>) (camc314)</li> </ul> <h3>⚡ Performance</h3> <ul> <li>ded4c29 linter/eslint/no-unused-vars: Skip sequence checks when absent (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26921">#26921</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> <h2>[1.86.0] - 2026-09-28</h2> <h3>🚀 Features</h3> <ul> <li>9d80eed linter/react/only-export-components: Support <code>allowCompoundComponents</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27117">#27117</a>) (Kuroda Kayn)</li> <li>e05b155 linter: Add typescript/no-generated-empty-object-type (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26958">#26958</a>) (camc314)</li> </ul> <h2>[1.82.0] - 2026-09-07</h2> <h3>🚀 Features</h3> <ul> <li>6a0e19c linter/eslint/no-unmodified-loop-condition: Support <code>checkConditionalExpressions</code> option (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26249">#26249</a>) (camc314)</li> </ul> <h2>[1.81.0] - 2026-08-31</h2> <h3>📚 Documentation</h3> <ul> <li>d5be037 linter/typescript/switch-exhaustiveness-check: Clarify default case comment pattern (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26100">#26100</a>) (camc314)</li> </ul> <h2>[1.79.0] - 2026-08-18</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>8c4552d linter: [<strong>BREAKING</strong>] Split react/react-compiler into per-category rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25500">#25500</a>) (Boshen)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>228e8e0 linter: Resolve inactive React compiler rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25830">#25830</a>) (Boshen)</li> <li>aa49d86 linter: Allow spread rule options in config types (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25675">#25675</a>) (ch3rry)</li> <li>36f8451 linter/eslint/no-eval: Align indirect default with ESLint (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25656">#25656</a>) (camc314)</li> <li>beb724d linter/eslint/no-unused-vars: Report bare underscore parameters (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25663">#25663</a>) (camc314)</li> <li>4004c10 linter/eslint/no-irregular-whitespace: Check comments by default (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25660">#25660</a>) (camc314)</li> <li>285820e linter/no-large-snapshots: Precompile and document allowed snapshot matchers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25611">#25611</a>) (Mikhail Baev)</li> <li>4df5835 linter: Allow capitalized built-in calls (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25516">#25516</a>) (Boshen)</li> </ul> <h2>[1.78.0] - 2026-08-10</h2> <h3>🚀 Features</h3> <ul> <li>ccb8fe8 linter/jsdoc: Implement <code>no-blank-blocks</code> rule (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25207">#25207</a>) (Mikhail Baev)</li> <li>d4a897c linter/eslint: Implement <code>one-var</code> rule (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/24470">#24470</a>) (Cole Ellison)</li> <li>5ab9340 linter/jsx-a11y/anchor-has-content: Add options to match eslint (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/24571">#24571</a>) (Cole Ellison)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>9573937 linter/typescript: Validate <code>ban-ts-comment</code> description_format (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25320">#25320</a>) (Mikhail Baev)</li> </ul> <h2>[1.77.0] - 2026-08-03</h2> <h3>🐛 Bug Fixes</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/2ae2939bb2fd98796393658b21556b2a2467e047"><code>2ae2939</code></a> release(apps): oxlint v1.86.0 && oxfmt v0.71.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27132">#27132</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/9d80eeddbd1d84032e258cc3662182b7649b4161"><code>9d80eed</code></a> feat(linter/react/only-export-components): support <code>allowCompoundComponents</code> ...</li> <li><a href="https://github.com/oxc-project/oxc/commit/e05b155a6d1e7467f58225628705573c34d3cded"><code>e05b155</code></a> feat(linter): add typescript/no-generated-empty-object-type (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26958">#26958</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/88a009621499725d891780b04c41f23ebba09f30"><code>88a0096</code></a> chore(oxlint): require tsgolint 7.0.2003 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27021">#27021</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxlint_v1.86.0/npm/oxlint">compare view</a></li> </ul> </details> <br /> Updates `oxlint-tsgolint` from 7.0.2002 to 7.0.2003 <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.2003</h2> <h2>What's Changed</h2> <ul> <li>docs: update agent development instructions by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1210">oxc-project/tsgolint#1210</a></li> <li>docs: refresh README benchmarks and wording by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1208">oxc-project/tsgolint#1208</a></li> <li>chore(deps): update crate-ci/typos action to v1.50.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1213">oxc-project/tsgolint#1213</a></li> <li>chore(deps): update taiki-e/install-action action to v2.87.14 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1216">oxc-project/tsgolint#1216</a></li> <li>chore(deps): update dependency dprint-json to v0.24.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1217">oxc-project/tsgolint#1217</a></li> <li>feat(no-unnecessary-condition): implement suggestion by <a href="https://github.com/baevm"><code>@baevm</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1218">oxc-project/tsgolint#1218</a></li> <li>fix(require-array-sort-compare): resolve string element constraints by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1219">oxc-project/tsgolint#1219</a></li> <li>fix(no-duplicate-type-constituents): allow undefined on optional parameter properties by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1222">oxc-project/tsgolint#1222</a></li> <li>test(no-unnecessary-type-assertion): cover Record alias assertions by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1226">oxc-project/tsgolint#1226</a></li> <li>fix(no-misused-spread): omit invalid WeakMap suggestions by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1227">oxc-project/tsgolint#1227</a></li> <li>fix(no-meaningless-void-operator): allow void on assignments by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1228">oxc-project/tsgolint#1228</a></li> <li>feat: add no-generated-empty-object-type rule by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1229">oxc-project/tsgolint#1229</a></li> <li>fix(no-useless-default-assignment): use suggestions for undefined defaults by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1231">oxc-project/tsgolint#1231</a></li> <li>fix(unbound-method): treat Intl.Collator compare as bound by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1224">oxc-project/tsgolint#1224</a></li> <li>fix(no-unnecessary-type-parameters): preserve suggestion type precedence by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1232">oxc-project/tsgolint#1232</a></li> <li>fix(no-unnecessary-condition): handle union keys in nullish assignment by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1230">oxc-project/tsgolint#1230</a></li> <li>fix: preserve expression syntax when removing await by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1233">oxc-project/tsgolint#1233</a></li> <li>fix: match package specifiers on whole path components by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1225">oxc-project/tsgolint#1225</a></li> <li>fix(no-useless-default-assignment): handle tuples with rest elements by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1223">oxc-project/tsgolint#1223</a></li> <li>fix(no-deprecated): detect deprecated aliases in object shorthand by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1235">oxc-project/tsgolint#1235</a></li> <li>fix(no-unnecessary-condition): check nested logical expressions in truthiness contexts by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1236">oxc-project/tsgolint#1236</a></li> <li>perf: avoid singleton union type allocations in hot rules by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1237">oxc-project/tsgolint#1237</a></li> <li>perf: speed up headless file-to-program assignment by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1239">oxc-project/tsgolint#1239</a></li> <li>perf(no-unnecessary-type-assertion): reject incompatible types first by <a href="https://github.com/tony-scio"><code>@tony-scio</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1181">oxc-project/tsgolint#1181</a></li> <li>refactor: extract checker workload scheduling by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1241">oxc-project/tsgolint#1241</a></li> <li>perf: add experimental checker scheduling modes by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1240">oxc-project/tsgolint#1240</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/baevm"><code>@baevm</code></a> made their first contribution in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1218">oxc-project/tsgolint#1218</a></li> <li><a href="https://github.com/tony-scio"><code>@tony-scio</code></a> made their first contribution in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1181">oxc-project/tsgolint#1181</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/oxc-project/tsgolint/compare/v7.0.2002...v7.0.2003">https://github.com/oxc-project/tsgolint/compare/v7.0.2002...v7.0.2003</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/tsgolint/commit/eb9339115edde6811ca94c3433adf69ea9852880"><code>eb93391</code></a> perf: add experimental checker scheduling modes (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1240">#1240</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/e3a79a5e04df2400066bbf3abcb707443652e5b1"><code>e3a79a5</code></a> refactor: extract checker workload scheduling (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1241">#1241</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/1fdaa0db360f7e29209805389cd81fd11e56d74f"><code>1fdaa0d</code></a> perf(no-unnecessary-type-assertion): reject incompatible types first (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1181">#1181</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/364b23979e1189a760799738dadc59212e35e899"><code>364b239</code></a> perf: speed up headless file-to-program assignment (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1239">#1239</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/52500be212366860eb56155f6c3b7448feb4c140"><code>52500be</code></a> perf: avoid singleton union type allocations in hot rules (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1237">#1237</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/22b148ad8f78fa2e444bdd6553ae251c6b7d2f6b"><code>22b148a</code></a> fix(no-unnecessary-condition): check nested logical expressions in truthiness...</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/356609fdb6c2f118b6e4be22728505631deee5e2"><code>356609f</code></a> fix(no-deprecated): detect deprecated aliases in object shorthand (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1235">#1235</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/cbf39090fe63bed4a7283989995ea4fbf478ee46"><code>cbf3909</code></a> fix(no-useless-default-assignment): handle tuples with rest elements (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1223">#1223</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/7bd5c1180dd1d0ab13b7ed8a5dc5064bba204724"><code>7bd5c11</code></a> fix: match package specifiers on whole path components (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1225">#1225</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/6f2588382b3f039a6a020020c282117260938e44"><code>6f25883</code></a> fix: preserve expression syntax when removing await (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1233">#1233</a>)</li> <li>Additional commits viewable in <a href="https://github.com/oxc-project/tsgolint/compare/v7.0.2002...v7.0.2003">compare view</a></li> </ul> </details> <br /> Updates `vite` from 8.3.0 to 8.3.1 <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.1</h2> <h3>Bug Fixes</h3> <ul> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23482">#23482</a>) (<a href="https://github.com/vitejs/vite/commit/3c752c8932bc0599465ba4a6d8f44aaf1e934c3d">3c752c8</a>)</li> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23537">#23537</a>) (<a href="https://github.com/vitejs/vite/commit/e8990c4d6101dfaca2654ed8ab4d0574ee920248">e8990c4</a>)</li> <li><strong>deps:</strong> update rolldown-related dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23483">#23483</a>) (<a href="https://github.com/vitejs/vite/commit/9aecbbfa5fb5da4b9981c099cb9746a9fd210806">9aecbbf</a>)</li> <li>handle <code>server.ws: false</code> in mergeConfig (<a href="https://redirect.github.com/vitejs/vite/issues/23511">#23511</a>) (<a href="https://github.com/vitejs/vite/commit/f68c0d5a28c96555431413e3e2cbe644337b087f">f68c0d5</a>)</li> <li>merge <code>build.rolldownOptions.output.comments</code> correctly (<a href="https://redirect.github.com/vitejs/vite/issues/23514">#23514</a>) (<a href="https://github.com/vitejs/vite/commit/4aba8d8720e82e4c5b694a4b7877755a3f84fc57">4aba8d8</a>)</li> <li><strong>optimizer:</strong> don't skip imports whose binding starts with type (<a href="https://redirect.github.com/vitejs/vite/issues/23540">#23540</a>) (<a href="https://github.com/vitejs/vite/commit/39330f489a0ae08923557f0ce10a307d6662a3f5">39330f4</a>)</li> <li><strong>optimizer:</strong> resolve pending discovered dep processing on close before init (<a href="https://redirect.github.com/vitejs/vite/issues/23567">#23567</a>) (<a href="https://github.com/vitejs/vite/commit/5f894339d27882fedc86bf6b1076fa6d92e404f3">5f89433</a>)</li> <li><strong>server:</strong> avoid reinitializing watcher when adding file after server close (<a href="https://redirect.github.com/vitejs/vite/issues/23572">#23572</a>) (<a href="https://github.com/vitejs/vite/commit/6f831f9b58ebda77638b514042ad8d160edfb928">6f831f9</a>)</li> <li><strong>sourcemap:</strong> skip URL source roots when injecting sources content (<a href="https://redirect.github.com/vitejs/vite/issues/23519">#23519</a>) (<a href="https://github.com/vitejs/vite/commit/04fc30a4b91870e65a436b3420620a2e02a94a41">04fc30a</a>)</li> </ul> <h3>Miscellaneous Chores</h3> <ul> <li>merge prereleases in changelog (<a href="https://redirect.github.com/vitejs/vite/issues/23466">#23466</a>) (<a href="https://github.com/vitejs/vite/commit/99bd9d1d46153fa939f4a304cc0177db42e28776">99bd9d1</a>)</li> <li><strong>optimizer:</strong> add debug log when waiting for dep before init (<a href="https://redirect.github.com/vitejs/vite/issues/23566">#23566</a>) (<a href="https://github.com/vitejs/vite/commit/63567c73ac132e6384fef384e6b9f7e8d5a37fff">63567c7</a>)</li> <li>update <code>optimizeDeps.include</code> comment (<a href="https://redirect.github.com/vitejs/vite/issues/23489">#23489</a>) (<a href="https://github.com/vitejs/vite/commit/6a84c72100da4e4be4badb2d9a0026279b4df136">6a84c72</a>)</li> </ul> <h3>Code Refactoring</h3> <ul> <li>assets regexp use non-capture (<a href="https://redirect.github.com/vitejs/vite/issues/23491">#23491</a>) (<a href="https://github.com/vitejs/vite/commit/f4b4431a2f9097fd9bbb7aaebbf1b63c4b54dea1">f4b4431</a>)</li> <li>remove duplicate configurations (<a href="https://redirect.github.com/vitejs/vite/issues/23532">#23532</a>) (<a href="https://github.com/vitejs/vite/commit/9abd99bfdd3117149d6faf87fc37bc9899b1c998">9abd99b</a>)</li> <li>replace <code>find</code> with <code>some</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23554">#23554</a>) (<a href="https://github.com/vitejs/vite/commit/af7cdf6964f124f58d66037e808fe687654948e2">af7cdf6</a>)</li> </ul> </blockquote> </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.0...v8.3.1">8.3.1</a> (2026-09-24)<!-- raw HTML omitted --></h2> <h3>Bug Fixes</h3> <ul> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23482">#23482</a>) (<a href="https://github.com/vitejs/vite/commit/3c752c8932bc0599465ba4a6d8f44aaf1e934c3d">3c752c8</a>)</li> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23537">#23537</a>) (<a href="https://github.com/vitejs/vite/commit/e8990c4d6101dfaca2654ed8ab4d0574ee920248">e8990c4</a>)</li> <li><strong>deps:</strong> update rolldown-related dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23483">#23483</a>) (<a href="https://github.com/vitejs/vite/commit/9aecbbfa5fb5da4b9981c099cb9746a9fd210806">9aecbbf</a>)</li> <li>handle <code>server.ws: false</code> in mergeConfig (<a href="https://redirect.github.com/vitejs/vite/issues/23511">#23511</a>) (<a href="https://github.com/vitejs/vite/commit/f68c0d5a28c96555431413e3e2cbe644337b087f">f68c0d5</a>)</li> <li>merge <code>build.rolldownOptions.output.comments</code> correctly (<a href="https://redirect.github.com/vitejs/vite/issues/23514">#23514</a>) (<a href="https://github.com/vitejs/vite/commit/4aba8d8720e82e4c5b694a4b7877755a3f84fc57">4aba8d8</a>)</li> <li><strong>optimizer:</strong> don't skip imports whose binding starts with type (<a href="https://redirect.github.com/vitejs/vite/issues/23540">#23540</a>) (<a href="https://github.com/vitejs/vite/commit/39330f489a0ae08923557f0ce10a307d6662a3f5">39330f4</a>)</li> <li><strong>optimizer:</strong> resolve pending discovered dep processing on close before init (<a href="https://redirect.github.com/vitejs/vite/issues/23567">#23567</a>) (<a href="https://github.com/vitejs/vite/commit/5f894339d27882fedc86bf6b1076fa6d92e404f3">5f89433</a>)</li> <li><strong>server:</strong> avoid reinitializing watcher when adding file after server close (<a href="https://redirect.github.com/vitejs/vite/issues/23572">#23572</a>) (<a href="https://github.com/vitejs/vite/commit/6f831f9b58ebda77638b514042ad8d160edfb928">6f831f9</a>)</li> <li><strong>sourcemap:</strong> skip URL source roots when injecting sources content (<a href="https://redirect.github.com/vitejs/vite/issues/23519">#23519</a>) (<a href="https://github.com/vitejs/vite/commit/04fc30a4b91870e65a436b3420620a2e02a94a41">04fc30a</a>)</li> </ul> <h3>Miscellaneous Chores</h3> <ul> <li>merge prereleases in changelog (<a href="https://redirect.github.com/vitejs/vite/issues/23466">#23466</a>) (<a href="https://github.com/vitejs/vite/commit/99bd9d1d46153fa939f4a304cc0177db42e28776">99bd9d1</a>)</li> <li><strong>optimizer:</strong> add debug log when waiting for dep before init (<a href="https://redirect.github.com/vitejs/vite/issues/23566">#23566</a>) (<a href="https://github.com/vitejs/vite/commit/63567c73ac132e6384fef384e6b9f7e8d5a37fff">63567c7</a>)</li> <li>update <code>optimizeDeps.include</code> comment (<a href="https://redirect.github.com/vitejs/vite/issues/23489">#23489</a>) (<a href="https://github.com/vitejs/vite/commit/6a84c72100da4e4be4badb2d9a0026279b4df136">6a84c72</a>)</li> </ul> <h3>Code Refactoring</h3> <ul> <li>assets regexp use non-capture (<a href="https://redirect.github.com/vitejs/vite/issues/23491">#23491</a>) (<a href="https://github.com/vitejs/vite/commit/f4b4431a2f9097fd9bbb7aaebbf1b63c4b54dea1">f4b4431</a>)</li> <li>remove duplicate configurations (<a href="https://redirect.github.com/vitejs/vite/issues/23532">#23532</a>) (<a href="https://github.com/vitejs/vite/commit/9abd99bfdd3117149d6faf87fc37bc9899b1c998">9abd99b</a>)</li> <li>replace <code>find</code> with <code>some</code> (<a href="https://redirect.github.com/vitejs/vite/issues/23554">#23554</a>) (<a href="https://github.com/vitejs/vite/commit/af7cdf6964f124f58d66037e808fe687654948e2">af7cdf6</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitejs/vite/commit/39ddf7ccf7e7469ff6a3ba37bca38c32ea804d6e"><code>39ddf7c</code></a> release: v8.3.1 (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23573">#23573</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/f68c0d5a28c96555431413e3e2cbe644337b087f"><code>f68c0d5</code></a> fix: handle <code>server.ws: false</code> in mergeConfig (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23511">#23511</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/6f831f9b58ebda77638b514042ad8d160edfb928"><code>6f831f9</code></a> fix(server): avoid reinitializing watcher when adding file after server close...</li> <li><a href="https://github.com/vitejs/vite/commit/04fc30a4b91870e65a436b3420620a2e02a94a41"><code>04fc30a</code></a> fix(sourcemap): skip URL source roots when injecting sources content (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23519">#23519</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/5f894339d27882fedc86bf6b1076fa6d92e404f3"><code>5f89433</code></a> fix(optimizer): resolve pending discovered dep processing on close before ini...</li> <li><a href="https://github.com/vitejs/vite/commit/63567c73ac132e6384fef384e6b9f7e8d5a37fff"><code>63567c7</code></a> chore(optimizer): add debug log when waiting for dep before init (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23566">#23566</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/e8990c4d6101dfaca2654ed8ab4d0574ee920248"><code>e8990c4</code></a> fix(deps): update all non-major dependencies (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23537">#23537</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/af7cdf6964f124f58d66037e808fe687654948e2"><code>af7cdf6</code></a> refactor: replace <code>find</code> with <code>some</code> (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23554">#23554</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/39330f489a0ae08923557f0ce10a307d6662a3f5"><code>39330f4</code></a> fix(optimizer): don't skip imports whose binding starts with type (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23540">#23540</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/9abd99bfdd3117149d6faf87fc37bc9899b1c998"><code>9abd99b</code></a> refactor: remove duplicate configurations (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23532">#23532</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitejs/vite/commits/v8.3.1/packages/vite">compare view</a></li> </ul> </details> <br /> Updates `vitest` from 5.0.1 to 5.0.2 <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.2</h2> <h3> 🐞 Bug Fixes</h3> <ul> <li>Bind <code>process</code> in case global is overwritten - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11343">vitest-dev/vitest#11343</a> <a href="https://github.com/vitest-dev/vitest/commit/0b79231ad"><!-- raw HTML omitted -->(0b792)<!-- raw HTML omitted --></a></li> <li><strong>detect-async-leaks</strong>: <ul> <li>Ignore <code>process.stdio</code> handles - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11333">vitest-dev/vitest#11333</a> <a href="https://github.com/vitest-dev/vitest/commit/0fd6b9790"><!-- raw HTML omitted -->(0fd6b)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>expect</strong>: <ul> <li>Fix <code>toMatchObject</code> with asymmetric matchers - by <a href="https://github.com/ShreeBohara"><code>@ShreeBohara</code></a>, <strong>Claude Opus 5</strong>, <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Codex (GPT-5)</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11100">vitest-dev/vitest#11100</a> <a href="https://github.com/vitest-dev/vitest/commit/42523289e"><!-- raw HTML omitted -->(42523)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>jsdom</strong>: <ul> <li>Fix <code>Request</code> with <code>Blob</code> body on jsdom 28+ - by <a href="https://github.com/harshit-d3v"><code>@harshit-d3v</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11295">vitest-dev/vitest#11295</a> <a href="https://github.com/vitest-dev/vitest/commit/d1c3ecc93"><!-- raw HTML omitted -->(d1c3e)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>reporter</strong>: <ul> <li><code>agent</code> to respect <code>--silent</code> - by <a href="https://github.com/Raj4478"><code>@Raj4478</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11271">vitest-dev/vitest#11271</a> <a href="https://github.com/vitest-dev/vitest/commit/5b95efb6d"><!-- raw HTML omitted -->(5b95e)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>reporters</strong>: <ul> <li>Handle concurrent <code>createReport</code> calls - by <a href="https://github.com/7rulnik"><code>@7rulnik</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11278">vitest-dev/vitest#11278</a> <a href="https://github.com/vitest-dev/vitest/commit/e8e556ff7"><!-- raw HTML omitted -->(e8e55)<!-- raw HTML omitted --></a></li> <li><code>hanging-process</code> to use ESM entrypoint - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11316">vitest-dev/vitest#11316</a> <a href="https://github.com/vitest-dev/vitest/commit/4e91e5668"><!-- raw HTML omitted -->(4e91e)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>spy</strong>: <ul> <li>Fix stack overflow when spying <code>Set.prototype.add</code> - by <a href="https://github.com/fengmk2"><code>@fengmk2</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11299">vitest-dev/vitest#11299</a> <a href="https://github.com/vitest-dev/vitest/commit/a0a939653"><!-- raw HTML omitted -->(a0a93)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>ui</strong>: <ul> <li>Persist authentication cookie beyond current browser session - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>OpenCode (gpt-5.6-sol)</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11066">vitest-dev/vitest#11066</a> <a href="https://github.com/vitest-dev/vitest/commit/f88195e16"><!-- raw HTML omitted -->(f8819)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <h5> <a href="https://github.com/vitest-dev/vitest/compare/v5.0.1...v5.0.2">View changes on GitHub</a></h5> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitest-dev/vitest/commit/428e2e5043c64635b6b157358bde2fdeaa7b6b3a"><code>428e2e5</code></a> chore: release v5.0.2 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11357">#11357</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/0b79231ad7897f03de17940ef16684b63aa217fe"><code>0b79231</code></a> fix: bind <code>process</code> in case global is overwritten (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11343">#11343</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/597df569aba3e8b24c9ad231aacd3cf641ac3bdf"><code>597df56</code></a> docs: correct stale config defaults (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11354">#11354</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/ea1c44fb581978421f9f0901ce8c635970ea72fb"><code>ea1c44f</code></a> docs: <code>sequence.setupFiles</code> default is <code>'list'</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11351">#11351</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/0fd6b97902bc828d489385e0a28b82515f57b7cf"><code>0fd6b97</code></a> fix(detect-async-leaks): ignore <code>process.stdio</code> handles (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11333">#11333</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/4e91e56687de43427fbb664d86a63438ca73b681"><code>4e91e56</code></a> fix(reporters): <code>hanging-process</code> to use ESM entrypoint (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11316">#11316</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/1a57929a49fb6fb2db02b47e56c4677ca5ae1704"><code>1a57929</code></a> docs(browser): fix locators.exact default (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11338">#11338</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/5b95efb6dfe378dc6fc8380f5b1e96832f019a5d"><code>5b95efb</code></a> fix(reporter): <code>agent</code> to respect <code>--silent</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11271">#11271</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/f58a209779ffd3007006481d0c9da0099d5226e6"><code>f58a209</code></a> docs: correct benchmark.exclude and watch defaults (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11268">#11268</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/d1c3ecc932dcb4cd50420c54aa1f7fa3051deac7"><code>d1c3ecc</code></a> fix(jsdom): fix <code>Request</code> with <code>Blob</code> body on jsdom 28+ (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11295">#11295</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v5.0.2/packages/vitest">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> |
||
|
|
bac0b93566 |
fix: keep https:// for qBittorrent and hide release sources from non-admins (#1422)
qBittorrent over HTTPS (#1417) qbittorrent-api ignores the scheme in `host` and probes HTTP and HTTPS itself. When the HTTPS probe fails, for instance on a certificate Shelfmark doesn't trust, it falls back to plain HTTP against the TLS port, and a reverse proxy answers "400 The plain HTTP request was sent to HTTPS port". The download client and the Test Connection button now pass FORCE_SCHEME_FROM_HOST for https:// URLs, so the configured scheme is used as-is and a certificate problem is reported as one. http:// and bare host:port URLs keep the probe: normalization adds http:// to a bare host, and the probe follows a proxy's redirect to HTTPS. Release sources leaked to non-admins (#1418) A download queued from an approved request carries the release an admin picked, and the requester could read it from their own activity feed: the request's release_data (source_id, indexer, info URL, torrent attributes), the download's full server path, and the download id itself, which for Prowlarr is "<indexer id>:<guid>" and for a private tracker is a URL into it. That id keys every status payload, the /api/localdownload query and the cover proxy URL, so hiding release_data alone would not have closed the leak. For non-admin viewers: - request rows keep only the release fields the activity cards display - download_path is reduced to the file name, which the browser download reveals anyway - request-linked downloads are addressed by an opaque id (a keyed HMAC of the task id) in the snapshot, history, /api/status, queue order, active downloads, dismissed keys, cover URLs and the websocket status and progress events. Routes that take a download id translate it back, searching only the caller's own downloads. Downloads a user queued directly keep their real id: the user picked that release from search results that already showed it, and the release list matches its buttons to the queue by that id. Admin views are unchanged. The activity sidebar now links a fulfilled request to its download by request_id instead of release_data.source_id. Closes #1417 Closes #1418 |
||
|
|
d2b4a0290e |
fix(ui): contain the result count added in #1362 (#1363)
Two regressions from the Anna's Archive search stats feature. The release modal's count block declared flex-1, so it competed with the tab strip's own flex-1 and took half the row - including on tabs whose source reports no total, where it renders nothing at all (only direct_download exposes total_results). Measured on a 1024px modal with six sources, the scrollable tab strip fell from 846px to 423px against 601px of tabs; at 375px with two sources it fell from 197px to 44px. It is now flex-none, and hidden below sm: the label alone is ~150px, which the full-screen mobile modal cannot spare. Remeasured at 693px on desktop and back to the pre-feature 197px on mobile. directTotalResults is only ever written on the direct-mode branch, and neither the universal branch nor App's resetSearchResultsState cleared it, so a count from an earlier direct search survived a mode switch and rendered over unrelated universal results. Both universal-branch reset blocks now clear it. |
||
|
|
a05e002305 |
feat: narrator, series and bitrate columns for MyAnonamouse results (#1390)
# feat: narrator, series and bitrate columns for MyAnonamouse results Addresses #605 and #934 (narrator in the release list). ## Problem Both requests were closed because the narrator isn't in Torznab results, which is correct. Prowlarr's MyAnonamouse indexer reads `author_info` but drops the `narrator_info` and `series_info` MAM returns next to it, and neither Prowlarr's `ReleaseInfo` nor the Torznab output has a field for them. Shelfmark's size tooltip already looks for a `narrator` Torznab attribute, but nothing ever sends one. When a book has several narrations, choosing one means going back and forth between Shelfmark and the tracker. ## Approach Optional, opt-in enrichment using the user's own MAM session (`mam_id`), the same approach AudioBookRequest's MAM indexer uses: 1. After the Prowlarr search, releases whose info URL is `…myanonamouse.net/t/<id>` are collected. 2. Shelfmark sends the same query text to MAM's JSON search (`/tor/js/loadSearchJSONbasic.php`, normally one request, at most 3), and matches torrents back to Prowlarr's results by torrent ID. The MAM origin is taken from the result URL, so a custom Prowlarr MAM base URL is respected, and the cookie is only ever sent to `*.myanonamouse.net`. 3. Adds `extra.narrator`, `extra.series` (`The Sun Eater #1`) and `extra.bitrate` / `extra.bitrate_value`. MAM has no bitrate field, so it's parsed from the uploader's free-text tags (`64 kbps`) and some releases won't have one. Lookups are cached per torrent for an hour, respect the existing Prowlarr search deadline, go through the configured proxy (`get_proxies`), and never fail the search: a 403, timeout or bad JSON is logged and the list renders without the extra details. ## Changes - **`release_sources/prowlarr/mam.py`** (new): small MAM client (`search`, and `get_username` for the test button), `narrator_info` / `series_info` / tags parsing, cached best-effort `lookup_torrent_details()`. A 403 includes MAM's reply and a note about the IP/ASN lock. - **`release_sources/prowlarr/source.py`**: enrichment after the result loop. Series, Narrator and Bitrate columns only when a MAM ID is configured, since otherwise they would be empty for every row. A Torznab `bitrate` attribute from other indexers is also mapped to `extra.bitrate`. - **`release_sources/prowlarr/settings.py`**: "MyAnonamouse Enrichment" section with `PROWLARR_MAM_ID` (password field, env-overridable like every setting) and a **Test MAM Session** button. - **`release_sources/__init__.py`**: `ColumnSchema` gains optional `setting_key` and `content_types`. The new `apply_column_visibility()` drops gated columns and their grid tracks. Neither field is serialized. - **`main.py`**: `/api/releases` applies `apply_column_visibility()` with the request's content type and the user's effective settings. - **`config/settings.py` / `users_settings.py`**: Search Mode › "Release List Columns" with `SHOW_SERIES_COLUMN`, `SHOW_NARRATOR_COLUMN` and `SHOW_BITRATE_COLUMN`, all default on and user-overridable. Narrator and bitrate are audiobook-only, series shows for both. AudiobookBay's existing bitrate column now follows the bitrate toggle. - **Frontend**: text cells truncate with a hover title; the mobile info line wraps and skips empty text/number cells so blank optional columns don't leave orphan `·` separators; the size tooltip no longer lists Bitrate twice. - **Docs**: new `docs/myanonamouse-enrichment.md` (linked from the index), and a regenerated `environment-variables.md`. The regeneration also picked up a few pre-existing drifts from `main` (the Libgen section, `AA_DEFAULT_SORT` default, a duplicate `BOOK_LANGUAGE` row). I can drop those if you'd rather keep this diff focused. ## ⚠️ MAM sessions are IP/ASN-locked MyAnonamouse locks each session to one IP or ASN. Reusing the session Prowlarr (or a seedbox script) uses will often **403**. **A separate MAM session for Shelfmark will likely be needed** when Shelfmark reaches MAM from a different IP (another host, a VPN container, or a proxy in Shelfmark's Network settings), or when the existing session is ASN-locked to another network. The setting's description, the error message and the new doc all say so. ## Testing - `tests/prowlarr/test_mam_enrichment.py` (new, 19 tests): parsing (narrator dedupe, multiple series, missing numbers, malformed JSON, tag bitrate), lookup (stops once all IDs are found, cache, 403 and connection errors return empty, expired deadline skips the request), only MAM releases enriched, Torznab bitrate mapping, column config with and without a MAM ID for audiobook and ebook, toggles, grid-track removal, and gates not serialized. - `tests/core/test_admin_users_api.py`: the curated search-preference key list now includes the three toggles. - Full `pytest -m "not integration and not e2e"` compared with an upstream `main` worktree on the same machine: no new failures. The remaining ~115 failures on both are Windows-only (tor/entrypoint shell tests, path separators). - `ruff check` / `ruff format --check` / `basedpyright` (0 errors) / `vulture` on touched files; frontend `tsc --noEmit`, `oxlint`, `oxfmt --check`, `vitest` (201 passed). - Manually verified with a real MAM account on a Docker build of this branch: the test button, then narrator, series and bitrate on MyAnonamouse audiobook results. No behavior change unless `PROWLARR_MAM_ID` is set, apart from the bitrate toggle on AudiobookBay (default on, same as today). 🤖 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> |
||
|
|
c11bf99848 |
build(deps): bump the npm-deps group in /src/frontend with 7 updates (#1394)
Bumps the npm-deps group in /src/frontend with 7 updates: | Package | From | To | | --- | --- | --- | | [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) | `7.18.3` | `7.18.4` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.5.1` | `26.6.2` | | [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.35.1` | `6.37.0` | | [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) | `0.68.0` | `0.70.0` | | [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) | `1.83.0` | `1.85.0` | | [oxlint-tsgolint](https://github.com/oxc-project/tsgolint) | `7.0.2001` | `7.0.2002` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `5.0.0` | `5.0.1` | Updates `react-router-dom` from 7.18.3 to 7.18.4 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/remix-run/react-router/blob/react-router-dom@7.18.4/packages/react-router-dom/CHANGELOG.md">react-router-dom's changelog</a>.</em></p> <blockquote> <h2>v7.18.4</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies: <ul> <li><a href="https://github.com/remix-run/react-router/releases/tag/react-router@7.18.4"><code>react-router@7.18.4</code></a></li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/remix-run/react-router/commit/1b1e0b0e79b21692ce907933475233babdd16e3e"><code>1b1e0b0</code></a> Release v7.18.4 (<a href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/15498">#15498</a>)</li> <li>See full diff in <a href="https://github.com/remix-run/react-router/commits/react-router-dom@7.18.4/packages/react-router-dom">compare view</a></li> </ul> </details> <br /> Updates `@types/node` from 26.5.1 to 26.6.2 <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 `knip` from 6.35.1 to 6.37.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.37.0</h2> <ul> <li>fix(graphql-codegen): mark near-operation-file outputs as entries, not the documents directory (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2048">#2048</a>) (06a68fcf99a90e559daeb0b8fb2d24e173124774) - thanks <a href="https://github.com/RobHannay"><code>@RobHannay</code></a>!</li> <li>fix: enable JSX in the config loader (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1959">#1959</a>) (5b21dc9192f773613d1c5db8edf35f0a68820268) - thanks <a href="https://github.com/addielaruee"><code>@addielaruee</code></a>!</li> <li>Match binaries only to their actual dependency providers (c5bdb69ccbcb7e1056233f346d0ada3495d1013d)</li> <li>Preserve executable references across package manager commands (54af171638db22f5d903faae05c37c2ea6adc869)</li> <li>Correct binary provider metadata in Relay fixtures (e67dfcb96d055c27be9c8601e077656855bb632b)</li> <li>Separate shell binary expectations from reporting exemptions (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2022">#2022</a>) (c1d7d75a3529d9faff7f4c0df11dd0ca1bdfb149)</li> <li>Respect npx no-install flags before the executable (4237010c9a834eb8b04f4a528c76d10a5c38ee98)</li> <li>Update dependencies (038ea179f7d6bf7ca43bc5daf553a68b13a9067c)</li> <li>Remove npm auth check now that's in release-it (4aaf77c58004ac64063a1982b98e53107c2ebe93)</li> <li>Fix --format name resolution in the ESLint plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2046">#2046</a>) (1269e98bb700384811fadc124d69ea720832037e) - thanks <a href="https://github.com/bytedoe"><code>@bytedoe</code></a>!</li> </ul> <h2>Release 6.36.0</h2> <ul> <li>Add <code>@tailwindcss/webpack</code> as Tailwind plugin enabler (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2027">#2027</a>) (b5ac0cf734dda3c6c6c51c817981dfc558b7c582) - thanks <a href="https://github.com/igas"><code>@igas</code></a>!</li> <li>Fix Next.js Turbopack loader dependencies (23419b4edfd48796dd484fa880e1bad49a043d2e)</li> <li>Explain ambiguous star exports in traces (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2025">#2025</a>) (3c2c1a53f9c2b7ff3057a4e46761791979e0b09c) - thanks <a href="https://github.com/gioboa"><code>@gioboa</code></a>!</li> <li>Fix eslintrc <code>parserOptions.parser</code> handling in ESLint plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2028">#2028</a>) (c79463cec81d09518eda325ec00e6f12327dea8d) - thanks <a href="https://github.com/bytedoe"><code>@bytedoe</code></a>!</li> <li>fix(compilers): require word boundary around import keyword (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2029">#2029</a>) (68bbe51c39b564022b63942bc83cb570778cca00) - thanks <a href="https://github.com/thanadolps"><code>@thanadolps</code></a>!</li> <li>fix: recover from corrupt cache file (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2034">#2034</a>) (30ff7568c84e0a6731ca634a52314228d23d1a2b) - thanks <a href="https://github.com/gioboa"><code>@gioboa</code></a>!</li> <li>fix: fix trailing comma on dependency removal (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2033">#2033</a>) (adfaf4f78878b6d55b0939a92d70a1fbb0ae1240) - thanks <a href="https://github.com/gioboa"><code>@gioboa</code></a>!</li> <li>Document built-in compiler scope (a05e155276dad4ead16992580d17572cebf045e7)</li> <li>Add babel, khan and oxc to projects and optimize svgs (1c26560b98bc3109e93d15761d02f089213bfb6c)</li> <li>Add section to test preview packages & extension (d911c18385f0aa41f53653a2a15cc90a1e0251b8)</li> <li>Fix shared info/exclude handling in linked Git worktrees (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2037">#2037</a>) (c1f18d5a7d25fc5a614747bbcbd62d043457eb48) - thanks <a href="https://github.com/kenfdev"><code>@kenfdev</code></a>!</li> <li>Shard Node specs on Windows and enable Bun test parallelism (66e966b6edec4460b40b05847fefa9f90ee69068)</li> <li>Add Varlock plugin support (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2000">#2000</a>) (e4fbf46acff08e78370e72b142e795bd81f28561) - thanks <a href="https://github.com/Joehoel"><code>@Joehoel</code></a>!</li> <li>Apply NODE_OPTIONS inputs to package manager binaries (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2038">#2038</a>) (c8df8a28e9a19484efe7097f984abc0c6556aff5) - thanks <a href="https://github.com/giaBaoJS"><code>@giaBaoJS</code></a>!</li> <li>Handle array form of <code>import/resolver</code> setting in ESLint plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2041">#2041</a>) (a80d386a80fdafc89c610d4887ec82184ac178db) - thanks <a href="https://github.com/bytedoe"><code>@bytedoe</code></a>!</li> <li>fix(node): add valueless Node CLI flags to boolean options (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2042">#2042</a>) (4c6768501f7115a894d7ece9e5c32090b684cc6f) - thanks <a href="https://github.com/shoutoutuoadi325"><code>@shoutoutuoadi325</code></a>!</li> <li>fix(typedoc): accept string form of plugin and theme options (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2043">#2043</a>) (ce387b05c8f136546e860ec73e29557563c63afa) - thanks <a href="https://github.com/giaBaoJS"><code>@giaBaoJS</code></a>!</li> <li>Add textlint plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2039">#2039</a>) (532dab595fc9a910e320418dc0390222fb2d7478) - thanks <a href="https://github.com/anandghegde"><code>@anandghegde</code></a>!</li> <li>fix: Correctly resolve Vitest setupFiles from nested configs (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2040">#2040</a>) (84a494334e125d229dc865893b21d69d0d201e85) - thanks <a href="https://github.com/CruseCtrl"><code>@CruseCtrl</code></a>!</li> <li>Add n8n to projects (3f756a7e70c4164d57a7dbbd58f3604afe4043e2)</li> <li>Resolve re-export traces to their defining bindings (43b3f9bbd7701ab44fca0554908f7550fbe84649)</li> <li>Show ambiguous, shadowed and converged exports (f1e97b998d80906f0cef3f5e3946833b7166cbdc)</li> <li>Document export tracing and editor contention (0188e7da1a481c7f6493d50580dfa8a7ecdf8c72)</li> <li>Resolve local <code>extends</code> files in eslintrc configs (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2044">#2044</a>) (62b5bf5aef5e6d3fc4784a1b5ef9933d383609ea) - thanks <a href="https://github.com/bytedoe"><code>@bytedoe</code></a>!</li> <li>docs: link each page to its own OG image (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2045">#2045</a>) (a85eb4e2aab46c3fa0813b1f1e13e93e134b8be7) - thanks <a href="https://github.com/bytedoe"><code>@bytedoe</code></a>!</li> <li>fix: fix language server bundled knip fallback (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2035">#2035</a>) (882ba3abb0b99c2bfe3e13a241d889376fe87c4c) - thanks <a href="https://github.com/gioboa"><code>@gioboa</code></a>!</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/webpro-nl/knip/commit/675c1b1a3dbed53d57108dc90a060dc3d0c85b0b"><code>675c1b1</code></a> Release knip@6.37.0</li> <li><a href="https://github.com/webpro-nl/knip/commit/1269e98bb700384811fadc124d69ea720832037e"><code>1269e98</code></a> Fix --format name resolution in the ESLint plugin (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2046">#2046</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/038ea179f7d6bf7ca43bc5daf553a68b13a9067c"><code>038ea17</code></a> Update dependencies</li> <li><a href="https://github.com/webpro-nl/knip/commit/4237010c9a834eb8b04f4a528c76d10a5c38ee98"><code>4237010</code></a> Respect npx no-install flags before the executable</li> <li><a href="https://github.com/webpro-nl/knip/commit/c1d7d75a3529d9faff7f4c0df11dd0ca1bdfb149"><code>c1d7d75</code></a> Separate shell binary expectations from reporting exemptions (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2022">#2022</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/e67dfcb96d055c27be9c8601e077656855bb632b"><code>e67dfcb</code></a> Correct binary provider metadata in Relay fixtures</li> <li><a href="https://github.com/webpro-nl/knip/commit/54af171638db22f5d903faae05c37c2ea6adc869"><code>54af171</code></a> Preserve executable references across package manager commands</li> <li><a href="https://github.com/webpro-nl/knip/commit/c5bdb69ccbcb7e1056233f346d0ada3495d1013d"><code>c5bdb69</code></a> Match binaries only to their actual dependency providers</li> <li><a href="https://github.com/webpro-nl/knip/commit/5b21dc9192f773613d1c5db8edf35f0a68820268"><code>5b21dc9</code></a> fix: enable JSX in the config loader (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1959">#1959</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/06a68fcf99a90e559daeb0b8fb2d24e173124774"><code>06a68fc</code></a> fix(graphql-codegen): mark near-operation-file outputs as entries, not the do...</li> <li>Additional commits viewable in <a href="https://github.com/webpro-nl/knip/commits/knip@6.37.0/packages/knip">compare view</a></li> </ul> </details> <br /> Updates `oxfmt` from 0.68.0 to 0.70.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.70.0</h2> <h3>🚀 Features</h3> <ul> <li>415b742 oxlint,oxfmt: Do not discover nested config in Vite+ mode (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26763">#26763</a>) (leaysgur)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/288d8cc77984b0a3851c58c423ffe9e6edc79f2e"><code>288d8cc</code></a> release(apps): oxlint v1.85.0 && oxfmt v0.70.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26903">#26903</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/f02a64a517a69a4eaa4ef83b722a3f10cf633f10"><code>f02a64a</code></a> release(apps): oxlint v1.84.0 && oxfmt v0.69.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26874">#26874</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxfmt_v0.70.0/npm/oxfmt">compare view</a></li> </ul> </details> <br /> Updates `oxlint` from 1.83.0 to 1.85.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.85.0</h2> <h3>🚀 Features</h3> <ul> <li>415b742 oxlint,oxfmt: Do not discover nested config in Vite+ mode (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26763">#26763</a>) (leaysgur)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/288d8cc77984b0a3851c58c423ffe9e6edc79f2e"><code>288d8cc</code></a> release(apps): oxlint v1.85.0 && oxfmt v0.70.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26903">#26903</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/f02a64a517a69a4eaa4ef83b722a3f10cf633f10"><code>f02a64a</code></a> release(apps): oxlint v1.84.0 && oxfmt v0.69.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26874">#26874</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxlint_v1.85.0/npm/oxlint">compare view</a></li> </ul> </details> <br /> Updates `oxlint-tsgolint` from 7.0.2001 to 7.0.2002 <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.2002</h2> <h2>What's Changed</h2> <ul> <li>feat(no-misused-promises): improve diagnostics by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1101">oxc-project/tsgolint#1101</a></li> <li>docs: update benchmarks by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1102">oxc-project/tsgolint#1102</a></li> <li>docs: declare tsgolint stable by <a href="https://github.com/Boshen"><code>@Boshen</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1106">oxc-project/tsgolint#1106</a></li> <li>ci(semgrep): add scan workflow by <a href="https://github.com/Boshen"><code>@Boshen</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1107">oxc-project/tsgolint#1107</a></li> <li>fix(no-unnecessary-template-expression): preserve expression precedence by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1108">oxc-project/tsgolint#1108</a></li> <li>feat(no-unsafe-assignment): improve diagnostics by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1105">oxc-project/tsgolint#1105</a></li> <li>feat(no-unsafe-return): improve diagnostics by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1110">oxc-project/tsgolint#1110</a></li> <li>chore: disable typescript-go renovate updates by <a href="https://github.com/Boshen"><code>@Boshen</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1116">oxc-project/tsgolint#1116</a></li> <li>chore(deps): update github actions by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1117">oxc-project/tsgolint#1117</a></li> <li>chore(deps): update actions/setup-go action to v7 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1118">oxc-project/tsgolint#1118</a></li> <li>chore(deps): update dependency typescript to v7 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1119">oxc-project/tsgolint#1119</a></li> <li>chore(deps): update pnpm to v11.17.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1123">oxc-project/tsgolint#1123</a></li> <li>chore(deps): update github actions by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1124">oxc-project/tsgolint#1124</a></li> <li>fix(no-misused-promises): guard nil contextual type in return statements by <a href="https://github.com/connorshea"><code>@connorshea</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1121">oxc-project/tsgolint#1121</a></li> <li>feat(no-unsafe-type-assertion): improve diagnostics by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1111">oxc-project/tsgolint#1111</a></li> <li>fix(prefer-readonly-parameter-types): ignore private mapped properties by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1125">oxc-project/tsgolint#1125</a></li> <li>chore(deps): update crate-ci/typos action to v1.49.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1130">oxc-project/tsgolint#1130</a></li> <li>chore(deps): update github actions by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1135">oxc-project/tsgolint#1135</a></li> <li>chore(deps): update module github.com/dlclark/regexp2/v2 to v2.6.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1136">oxc-project/tsgolint#1136</a></li> <li>ci: remove Semgrep workflow by <a href="https://github.com/Boshen"><code>@Boshen</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1138">oxc-project/tsgolint#1138</a></li> <li>chore(deps): update taiki-e/install-action action to v2.85.13 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1139">oxc-project/tsgolint#1139</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/1140">oxc-project/tsgolint#1140</a></li> <li>fix(consistent-type-exports): split diagnostic help text by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1144">oxc-project/tsgolint#1144</a></li> <li>fix(no-confusing-void-expression): split diagnostic help text by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1145">oxc-project/tsgolint#1145</a></li> <li>fix(no-implied-eval): split diagnostic help text by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1146">oxc-project/tsgolint#1146</a></li> <li>fix(no-unsafe-type-assertion): split diagnostic help text by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1147">oxc-project/tsgolint#1147</a></li> <li>fix(no-useless-default-assignment): split diagnostic help text by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1148">oxc-project/tsgolint#1148</a></li> <li>fix(prefer-readonly): split diagnostic help text by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1149">oxc-project/tsgolint#1149</a></li> <li>fix(strict-boolean-expressions): split diagnostic help text by <a href="https://github.com/camc314"><code>@camc314</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1150">oxc-project/tsgolint#1150</a></li> <li>chore(deps): update github.com/go-json-experiment/json digest to c27c302 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1151">oxc-project/tsgolint#1151</a></li> <li>chore(deps): update dependency dprint-toml to v0.8.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1152">oxc-project/tsgolint#1152</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/1153">oxc-project/tsgolint#1153</a></li> <li>chore(deps): update taiki-e/install-action action to v2.86.4 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1154">oxc-project/tsgolint#1154</a></li> <li>chore(deps): update crate-ci/typos action to v1.49.1 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1157">oxc-project/tsgolint#1157</a></li> <li>chore(deps): update dependency dprint-markdown to v0.23.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1158">oxc-project/tsgolint#1158</a></li> <li>chore(deps): update taiki-e/install-action action to v2.87.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1159">oxc-project/tsgolint#1159</a></li> <li>chore(deps): update crate-ci/typos action to v1.50.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1162">oxc-project/tsgolint#1162</a></li> <li>chore(deps): update pnpm to v11.24.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1164">oxc-project/tsgolint#1164</a></li> <li>fix(no-unnecessary-boolean-literal-compare): preserve nullable boolean narrowing by <a href="https://github.com/sharmila-oai"><code>@sharmila-oai</code></a> in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1160">oxc-project/tsgolint#1160</a></li> <li>chore(deps): update crate-ci/typos action to v1.50.1 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1169">oxc-project/tsgolint#1169</a></li> <li>chore(deps): update github actions by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1171">oxc-project/tsgolint#1171</a></li> <li>chore(deps): update module github.com/dlclark/regexp2/v2 to v2.7.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1172">oxc-project/tsgolint#1172</a></li> <li>chore(deps): update dependency dprint-markdown to v0.23.3 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1170">oxc-project/tsgolint#1170</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/1173">oxc-project/tsgolint#1173</a></li> <li>chore(deps): update dependency vitest to v5 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1174">oxc-project/tsgolint#1174</a></li> <li>chore(deps): update dependency dprint-markdown to v0.24.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1178">oxc-project/tsgolint#1178</a></li> <li>chore(deps): update taiki-e/install-action action to v2.87.10 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/oxc-project/tsgolint/pull/1177">oxc-project/tsgolint#1177</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/1179">oxc-project/tsgolint#1179</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/tsgolint/commit/acd88e1b1ef8f219e8956f804f2548dafd949705"><code>acd88e1</code></a> perf(prefer-regexp-exec): defer argument type resolution (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1207">#1207</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/14908447a2a1cad72aa8a43faf72170ddd21606e"><code>1490844</code></a> perf(use-unknown-in-catch-callback-variable): defer annotation fixes (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1206">#1206</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/d11b717674dd549832ce2f95654fa76ac1337a2d"><code>d11b717</code></a> perf(strict-boolean-expressions): avoid temporary variant maps (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1205">#1205</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/fe1ecf30b8ab6e6fac25bef55ad25c9296417bd1"><code>fe1ecf3</code></a> perf(no-unsafe-unary-minus): skip type queries for literals (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1203">#1203</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/e42a51052afbdd4787a44740ed44391b695e3bce"><code>e42a510</code></a> perf(no-deprecated): skip type queries for empty allow lists (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1202">#1202</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/94ee8ac38f44244e7a4895d4a8eb55421be06a29"><code>94ee8ac</code></a> perf(restrict-template-expressions): avoid unnecessary base-type checks (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1204">#1204</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/7bbe34100a66912ff134bbbeda5fd88f456e1e17"><code>7bbe341</code></a> perf(await-thenable): skip aggregator checks for empty calls (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1201">#1201</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/8296505a3a50b26bf5f8d586d7887d2c1c6c1da5"><code>8296505</code></a> perf(no-base-to-string): avoid temporary certainty slices (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1200">#1200</a>)</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/636677305c6fbf581241bf2d49b5d217c23c2da1"><code>6366773</code></a> perf(no-unnecessary-template-expression): defer single-interpolation fixes (#...</li> <li><a href="https://github.com/oxc-project/tsgolint/commit/8300b95c905e44d912896e9a75958e41eb5d8d32"><code>8300b95</code></a> perf(unbound-method): check native names before resolving symbols (<a href="https://redirect.github.com/oxc-project/tsgolint/issues/1198">#1198</a>)</li> <li>Additional commits viewable in <a href="https://github.com/oxc-project/tsgolint/compare/v7.0.2001...v7.0.2002">compare view</a></li> </ul> </details> <br /> Updates `vitest` from 5.0.0 to 5.0.1 <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.1</h2> <h3> 🚀 Features</h3> <ul> <li><strong>ui</strong>: <ul> <li>Move trace attempts selector to viewer header - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11189">vitest-dev/vitest#11189</a> <a href="https://github.com/vitest-dev/vitest/commit/5dc4b5c92"><!-- raw HTML omitted -->(5dc4b)<!-- raw HTML omitted --></a></li> <li>Add focused trace view layout mode - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong>, <strong>OpenCode (gpt-5.6-sol)</strong> and <strong>Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11190">vitest-dev/vitest#11190</a> <a href="https://github.com/vitest-dev/vitest/commit/376dc3bc1"><!-- raw HTML omitted -->(376dc)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <h3> 🐞 Bug Fixes</h3> <ul> <li>Exit 1 when vitest list fails collection - by <a href="https://github.com/hamed-bavar"><code>@hamed-bavar</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11145">vitest-dev/vitest#11145</a> and <a href="https://redirect.github.com/vitest-dev/vitest/issues/11146">vitest-dev/vitest#11146</a> <a href="https://github.com/vitest-dev/vitest/commit/6108b8197"><!-- raw HTML omitted -->(6108b)<!-- raw HTML omitted --></a></li> <li>Keep parse error details in static collection - by <a href="https://github.com/hamed-bavar"><code>@hamed-bavar</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11150">vitest-dev/vitest#11150</a> and <a href="https://redirect.github.com/vitest-dev/vitest/issues/11151">vitest-dev/vitest#11151</a> <a href="https://github.com/vitest-dev/vitest/commit/7c818153a"><!-- raw HTML omitted -->(7c818)<!-- raw HTML omitted --></a></li> <li>Avoid recursive prototype in automocking - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11195">vitest-dev/vitest#11195</a> <a href="https://github.com/vitest-dev/vitest/commit/99fc52591"><!-- raw HTML omitted -->(99fc5)<!-- raw HTML omitted --></a></li> <li>Prevent false Vitest import resolution - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11196">vitest-dev/vitest#11196</a> <a href="https://github.com/vitest-dev/vitest/commit/b426c1976"><!-- raw HTML omitted -->(b426c)<!-- raw HTML omitted --></a></li> <li>Keep metadata file when clearing the 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/11199">vitest-dev/vitest#11199</a> <a href="https://github.com/vitest-dev/vitest/commit/73614654a"><!-- raw HTML omitted -->(73614)<!-- raw HTML omitted --></a></li> <li>Correct typos in error message and comments - by <a href="https://github.com/shinji00222"><code>@shinji00222</code></a> and <strong>Shinji</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11187">vitest-dev/vitest#11187</a> <a href="https://github.com/vitest-dev/vitest/commit/115c3f6d2"><!-- raw HTML omitted -->(115c3)<!-- raw HTML omitted --></a></li> <li>Resolve ResolvedConfig exactOptionalPropertyTypes errors - by <a href="https://github.com/LukeAbby"><code>@LukeAbby</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11175">vitest-dev/vitest#11175</a> <a href="https://github.com/vitest-dev/vitest/commit/498fbe922"><!-- raw HTML omitted -->(498fb)<!-- raw HTML omitted --></a></li> <li>Share the server on self-referencing <code>extends</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/11034">vitest-dev/vitest#11034</a> <a href="https://github.com/vitest-dev/vitest/commit/23dda738c"><!-- raw HTML omitted -->(23dda)<!-- raw HTML omitted --></a></li> <li>Warn when deprecated <code>deps.optimizer.web</code> is used - by <a href="https://github.com/im10furry"><code>@im10furry</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11214">vitest-dev/vitest#11214</a> <a href="https://github.com/vitest-dev/vitest/commit/2ce29d5fa"><!-- raw HTML omitted -->(2ce29)<!-- raw HTML omitted --></a></li> <li><strong>browser</strong>: <ul> <li>Avoid double quotes in <code>config.define</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/11198">vitest-dev/vitest#11198</a> <a href="https://github.com/vitest-dev/vitest/commit/972e24bab"><!-- raw HTML omitted -->(972e2)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>doctor</strong>: <ul> <li>Measure vm pools for custom 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/11212">vitest-dev/vitest#11212</a> <a href="https://github.com/vitest-dev/vitest/commit/91ab1588c"><!-- raw HTML omitted -->(91ab1)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>expect</strong>: <ul> <li>Correct return value in <code>toMatchAriaSnapshot</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/11208">vitest-dev/vitest#11208</a> <a href="https://github.com/vitest-dev/vitest/commit/c119be016"><!-- raw HTML omitted -->(c119b)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>fakeTimers</strong>: <ul> <li>Force <code>queueMicrotask</code> and <code>nextTick</code> in <code>toNotFake</code> - by <a href="https://github.com/kingmakeruix"><code>@kingmakeruix</code></a>, <strong>kingmakeruix</strong>, <strong>Hiroshi Ogawa</strong>, <strong>Codex</strong> and <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11261">vitest-dev/vitest#11261</a> <a href="https://github.com/vitest-dev/vitest/commit/a47d7908f"><!-- raw HTML omitted -->(a47d7)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>snapshot</strong>: <ul> <li>Report obsolete keys next to skipped tests - by <a href="https://github.com/hamed-bavar"><code>@hamed-bavar</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>OpenCode (gpt-5.6-sol)</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11157">vitest-dev/vitest#11157</a> and <a href="https://redirect.github.com/vitest-dev/vitest/issues/11158">vitest-dev/vitest#11158</a> <a href="https://github.com/vitest-dev/vitest/commit/17e2b22dd"><!-- raw HTML omitted -->(17e2b)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>types</strong>: <ul> <li>Make public declarations self-contained - by <a href="https://github.com/ZoeySigel"><code>@ZoeySigel</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11141">vitest-dev/vitest#11141</a> <a href="https://github.com/vitest-dev/vitest/commit/455466c16"><!-- raw HTML omitted -->(45546)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>ui</strong>: <ul> <li>Fix collapse/expand suite with file name search - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11260">vitest-dev/vitest#11260</a> <a href="https://github.com/vitest-dev/vitest/commit/0a7122daa"><!-- raw HTML omitted -->(0a712)<!-- raw HTML omitted --></a></li> <li>Fix explorer file summary count - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong>, <strong>OpenCode (gpt-5.6-sol)</strong> and <strong>Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11125">vitest-dev/vitest#11125</a> <a href="https://github.com/vitest-dev/vitest/commit/05982297d"><!-- raw HTML omitted -->(05982)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>utils</strong>: <ul> <li>Fix <code>deepMerge</code> to handle prototype - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/11215">vitest-dev/vitest#11215</a> <a href="https://github.com/vitest-dev/vitest/commit/4944cf498"><!-- raw HTML omitted -->(4944c)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <h5> <a href="https://github.com/vitest-dev/vitest/compare/v5.0.0...v5.0.1">View changes on GitHub</a></h5> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitest-dev/vitest/commit/03630a5995d10455fa136be53bfb2b2409381106"><code>03630a5</code></a> chore: release v5.0.1 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11275">#11275</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/a47d7908f0635e9cba6cbe5e1a209bb6add5e0ab"><code>a47d790</code></a> fix(fakeTimers): force <code>queueMicrotask</code> and <code>nextTick</code> in <code>toNotFake</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11261">#11261</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/2ce29d5fa758046e5453bd92b8ed6c9da9709bb5"><code>2ce29d5</code></a> fix: warn when deprecated <code>deps.optimizer.web</code> is used (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11214">#11214</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/ccd6d057b6e4ca29a5e6b753a2b8e16b0afd8cda"><code>ccd6d05</code></a> docs: fix typecheck exclude default in documentation (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11223">#11223</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/91ab1588c72c9c5f7c638368a541cd20e0e8a934"><code>91ab158</code></a> fix(doctor): measure vm pools for custom environments (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11212">#11212</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/23dda738ccacb11682426426cd7b876afd107621"><code>23dda73</code></a> fix: share the server on self-referencing <code>extends</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11034">#11034</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/498fbe9222eb9aa3d8cf48481e200c16bb693bbd"><code>498fbe9</code></a> fix: resolve ResolvedConfig exactOptionalPropertyTypes errors (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11175">#11175</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/115c3f6d2bfa6a8672eeab8cc21bbecc6a4ef3d0"><code>115c3f6</code></a> fix: correct typos in error message and comments (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11187">#11187</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/73614654a46f617c357920eecda439654a561f92"><code>7361465</code></a> fix: keep metadata file when clearing the cache (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11199">#11199</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/972e24bab5fb96843de72447eb65585628b8dbde"><code>972e24b</code></a> fix(browser): avoid double quotes in <code>config.define</code> (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11198">#11198</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v5.0.1/packages/vitest">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> |
||
|
|
ece6b8f341 |
fix(auth): fail closed when auth prerequisites are missing (#1387) (#1397)
Auth mode resolution fell back to "none" (anonymous full admin) whenever the configured method's prerequisites were missing: no local password admin for builtin/OIDC, no Calibre-Web database, a blank proxy header, an unrecognized AUTH_METHOD (including "OIDC" in uppercase), or any error while reading the config. Deleting or demoting the last local admin was allowed on purpose because of that fallback, which exposed OIDC instances publicly. - Only an explicit AUTH_METHOD=none disables authentication. A configured method stays active when its prerequisites are missing, so sign-in fails instead of opening up. - An unrecognized or unreadable AUTH_METHOD resolves to "unavailable", which still requires a session and accepts no login. Values are normalized, so AUTH_METHOD=OIDC works. - Restore the guard against deleting or demoting the last local password admin while builtin/OIDC is active (unless DISABLE_LOCAL_AUTH is set). - Require a local admin before enabling Local auth, as OIDC already did. - Log a recovery hint at startup when builtin/OIDC runs without a local admin, and document recovery via AUTH_METHOD=none. - Drop the "will fall back to No Authentication" UI toasts and hints. Fixes https://github.com/calibrain/shelfmark/issues/1387 |
||
|
|
c7bfb20448 |
Default to english when no lang is slected (#1396)
Fixes https://github.com/calibrain/shelfmark/issues/1384 |
||
|
|
37a77e9562 |
feat(library): mark search results already in a Calibre library (#1377)
Per discussion #1372, where you said you were fine with this specific implementation: check whether metadata.db exists, read it if so, and show a check mark saying the book is already there. Searching for a book you already own gives no hint that you own it, so the easiest way to end up with a second copy is to not remember you have the first. This reads a Calibre `metadata.db`, read only, and marks matching results with an **In library** badge in the card, list and compact views and in the details dialog. Off by default. It sits in Settings, General beside the existing Library URL, with a test button that reports how many books it indexed. No HTTP call, no token, nothing written back. Matching runs most to least confident: a shared external id, then an ISBN compared in both ISBN-10 and ISBN-13 form, then fuzzy title tokens plus the author surname. The check fails open, so an unreadable database degrades the badge and never blocks a search, and entries are cached for ten minutes with an early refresh when the file changes, so a large library costs one read rather than one per search. `text_match.py` is new and shared by the index and the provider, so title, author and ISBN matching stays consistent in one place. ## On the provider interface `library_index` talks only to a `LibraryProvider` protocol and knows nothing about Calibre. That is deliberate but it is not speculative generality, it is what let me send you the Calibre half on its own: I run an Audiobookshelf provider on the same interface in my fork, which is where the audiobook side of the badge comes from. I have left that out because it is a new service integration rather than something already in the codebase, which is the line your non-goals draw. Happy to send it separately if you ever want it, and equally happy for the answer to be no. Adding a library is a module with the `LibraryProvider` shape plus one line in `all_providers()`. ## Verification - `tests/core/test_library_index.py`: id, ISBN and fuzzy matching, per-content-type provider selection, fail-open on provider errors, stale-cache reuse, TTL and fingerprint refresh, per-provider cache isolation, and the test-connection path including unsaved form values. - `tests/core/test_text_match.py`: ISBN variants and token matching. - `src/frontend/src/tests/libraryBadge.test.ts` and the added cases in `bookTransformers.test.ts`. - Python suite (3269) and frontend suite (206) green, plus ruff, ruff format, basedpyright, vulture, tsc, oxlint, oxfmt and the production build. |
||
|
|
fe99d4bb5b |
feat(search): add a configurable default content type (#1371)
Closes #1018. Worth correcting the issue first: the search tab is not hardcoded. `useContentTypePreferences` has persisted the user's choice to localStorage since #564, so a browser that has picked a tab already keeps it. What is missing is the other half the issue asks for, a default for a browser that has stored nothing, and a per-user override. `DEFAULT_CONTENT_TYPE` is a user overridable select next to `BOOK_LANGUAGE`, so it follows the same path: global value in Settings, per-user value in Search Preferences, resolved with `user_id` in `/api/config`. The frontend uses it only when this browser has no stored choice, which is captured before the existing effect writes one, so nothing changes for anyone who has already picked a tab. The resolution is a pure function in `utils/contentTypePreference.ts` rather than logic inside the hook, since vitest here has no jsdom and the existing tests cover resolvers like `resolveDefaultLanguageCodes` the same way. One small move in `App.tsx`: the `config` state was declared below the hook that now reads it, so it moved above it. ## Verification - `tests/core/test_config_api.py`: the payload carries `default_content_type` and reads it with the user's id. - `tests/core/test_admin_users_api.py`: the key appears in the per-user search preferences list. - `src/frontend/src/tests/contentTypePreference.test.ts`: a stored tab wins, combined mode survives, the server default applies when nothing is stored, and an unrecognised value falls back to ebook. - Python suite (3163) and frontend suite (201) green, plus ruff, ruff format, basedpyright, vulture, tsc, oxlint, oxfmt and the production build. |
||
|
|
e1c3f057ab |
fix: bypass recordings, welib wrong-md5 links, footer build sha (#1364) (#1373)
Debug screen recordings never started. Every bypass logged "Capturearea
1540x1050 at position 0.0 outside the screen size 1440x1880".We ask
ffmpeg for the fingerprint screen size plus margin, the size wealso pass
SeleniumBase as xvfb_metrics. SeleniumBase builds thatdisplay with
use_xauth=True, the image ships no xauth binary, so itfalls back to a
fixed 1440x1880 Xvfb and the requested size neverexists. Drop
-video_size so x11grab records the whole screen, whateversize it turned
out to be.
welib could hand back a link for a different book. Welib
answers/md5/<md5> with a search for that md5; when it does not have the
file,the resolver took the first "Download" on the results page
(md5a2c1dc0c... resolved to auto_download/9c8cf85d...). On an
/md5/<md5>page a GET/Download link is now only taken when its href names
thatmd5; otherwise the source is reported as not having the file.
Alsoremoves _get_download_urls_from_welib and _is_source_enabled:
themd5-template branch in _get_urls_for_source always handles welib
first,so that resolver could never run.
The footer showed the build date instead of the commit. CI
stampsBUILD_VERSION as <yyyy-mm-dd>-<sha> (pr-<sha> for PR images) and
thefooter kept its first seven characters, so dev images read
"Shelfmarkmain (2026-09)". Take the trailing commit sha instead: "main
(
|
||
|
|
d4619be69a |
Feature: Show the AA search result stats (#1362)
When doing a direct search for a book, show the stats of the AA results. For example if we search for "The Great Gatsby", AA reports it has 240 hits and shows the first page of 50. Provide this stats info in the shelfmark webUI via ResultsSection.tsx and ReleaseModal.tsx. This table shows what should be displayed based on the total number of hits found: |Total |Display| |-------|-------| |1 |"Result 1 (1 Total)"| |6 |"Results 1-6 (6 Total)"| |144 |"Results 1-50 (144 Total)"| |500+ |"Results 1-50 (500+ Total)"| Currently, shelfmark also only shows us the first 50 search hits even if there were more available from AA. This could be added later if considered desirable. As usual, a picture is worth a 1000 words: <img width="1012" height="610" alt="direct-results-stat" src="https://github.com/user-attachments/assets/8c0c688f-444e-482a-a9a3-2dee5a5563b8" /> <img width="1013" height="741" alt="universal-results-info" src="https://github.com/user-attachments/assets/399bbb79-87f2-4432-a3d0-64937795f5f1" /> Coded with llama.cpp, opencode and 🤖 |
||
|
|
d09ec9de25 |
build(deps): bump the npm-deps group in /src/frontend with 9 updates (#1349)
Bumps the npm-deps group in /src/frontend with 9 updates: | Package | From | To | | --- | --- | --- | | [react](https://github.com/react/react/tree/HEAD/packages/react) | `19.2.8` | `19.3.0` | | [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.2.18` | `19.3.0` | | [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom) | `19.2.8` | `19.3.0` | | [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) | `19.2.7` | `19.3.0` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.5.0` | `26.5.1` | | [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) | `6.34.0` | `6.35.1` | | [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) | `0.67.0` | `0.68.0` | | [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) | `1.82.0` | `1.83.0` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.2.2` | `8.3.0` | Updates `react` from 19.2.8 to 19.3.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/react/react/releases">react's releases</a>.</em></p> <blockquote> <h2>19.3.0 (September 9, 2026)</h2> <p>Below is a list of all new features, APIs, and bug fixes.</p> <p>Read the <a href="https://react.dev/blog/2026/09/09/react-19-3">React 19.3 release post</a> for more information.</p> <h2>New React Features</h2> <ul> <li><code><ViewTransition /></code>: Adds <code><ViewTransition /></code> and <code>addTransitionType</code> APIs to power View Transition animations in React (<a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a>, <a href="https://github.com/jackpope"><code>@jackpope</code></a>, <a href="https://github.com/gaearon"><code>@gaearon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/31975">#31975</a>, <a href="https://redirect.github.com/facebook/react/pull/31987">#31987</a>, <a href="https://redirect.github.com/facebook/react/pull/31996">#31996</a>, <a href="https://redirect.github.com/facebook/react/pull/31999">#31999</a>, <a href="https://redirect.github.com/facebook/react/pull/32001">#32001</a>, <a href="https://redirect.github.com/facebook/react/pull/32002">#32002</a>, <a href="https://redirect.github.com/facebook/react/pull/32028">#32028</a>, <a href="https://redirect.github.com/facebook/react/pull/32029">#32029</a>, <a href="https://redirect.github.com/facebook/react/pull/32031">#32031</a>, <a href="https://redirect.github.com/facebook/react/pull/32034">#32034</a>, <a href="https://redirect.github.com/facebook/react/pull/32038">#32038</a>, <a href="https://redirect.github.com/facebook/react/pull/32041">#32041</a>, <a href="https://redirect.github.com/facebook/react/pull/32050">#32050</a>, <a href="https://redirect.github.com/facebook/react/pull/32090">#32090</a>, <a href="https://redirect.github.com/facebook/react/pull/32105">#32105</a>, <a href="https://redirect.github.com/facebook/react/pull/32254">#32254</a>, <a href="https://redirect.github.com/facebook/react/pull/32379">#32379</a>, <a href="https://redirect.github.com/facebook/react/pull/32422">#32422</a>, <a href="https://redirect.github.com/facebook/react/pull/32462">#32462</a>, <a href="https://redirect.github.com/facebook/react/pull/32540">#32540</a>, <a href="https://redirect.github.com/facebook/react/pull/32545">#32545</a>, <a href="https://redirect.github.com/facebook/react/pull/32585">#32585</a>, <a href="https://redirect.github.com/facebook/react/pull/32599">#32599</a>, <a href="https://redirect.github.com/facebook/react/pull/32611">#32611</a>, <a href="https://redirect.github.com/facebook/react/pull/32612">#32612</a>, <a href="https://redirect.github.com/facebook/react/pull/32617">#32617</a>, <a href="https://redirect.github.com/facebook/react/pull/32651">#32651</a>, <a href="https://redirect.github.com/facebook/react/pull/32653">#32653</a>, <a href="https://redirect.github.com/facebook/react/pull/32656">#32656</a>, <a href="https://redirect.github.com/facebook/react/pull/32664">#32664</a>, <a href="https://redirect.github.com/facebook/react/pull/32699">#32699</a>, <a href="https://redirect.github.com/facebook/react/pull/32723">#32723</a>, <a href="https://redirect.github.com/facebook/react/pull/32734">#32734</a>, <a href="https://redirect.github.com/facebook/react/pull/32751">#32751</a>, <a href="https://redirect.github.com/facebook/react/pull/32752">#32752</a>, <a href="https://redirect.github.com/facebook/react/pull/32760">#32760</a>, <a href="https://redirect.github.com/facebook/react/pull/32761">#32761</a>, <a href="https://redirect.github.com/facebook/react/pull/32764">#32764</a>, <a href="https://redirect.github.com/facebook/react/pull/32772">#32772</a>, <a href="https://redirect.github.com/facebook/react/pull/32790">#32790</a>, <a href="https://redirect.github.com/facebook/react/pull/32819">#32819</a>, <a href="https://redirect.github.com/facebook/react/pull/32820">#32820</a>, <a href="https://redirect.github.com/facebook/react/pull/32822">#32822</a>, <a href="https://redirect.github.com/facebook/react/pull/32833">#32833</a>, <a href="https://redirect.github.com/facebook/react/pull/32849">#32849</a>, <a href="https://redirect.github.com/facebook/react/pull/33094">#33094</a>, <a href="https://redirect.github.com/facebook/react/pull/33191">#33191</a>, <a href="https://redirect.github.com/facebook/react/pull/33200">#33200</a>, <a href="https://redirect.github.com/facebook/react/pull/33206">#33206</a>, <a href="https://redirect.github.com/facebook/react/pull/33293">#33293</a>, <a href="https://redirect.github.com/facebook/react/pull/33330">#33330</a>, <a href="https://redirect.github.com/facebook/react/pull/33331">#33331</a>, <a href="https://redirect.github.com/facebook/react/pull/33332">#33332</a>, <a href="https://redirect.github.com/facebook/react/pull/33357">#33357</a>, <a href="https://redirect.github.com/facebook/react/pull/33362">#33362</a>, <a href="https://redirect.github.com/facebook/react/pull/33433">#33433</a>, <a href="https://redirect.github.com/facebook/react/pull/33576">#33576</a>, <a href="https://redirect.github.com/facebook/react/pull/34374">#34374</a>, <a href="https://redirect.github.com/facebook/react/pull/34450">#34450</a>, <a href="https://redirect.github.com/facebook/react/pull/34481">#34481</a>, <a href="https://redirect.github.com/facebook/react/pull/34500">#34500</a>, <a href="https://redirect.github.com/facebook/react/pull/34502">#34502</a>, <a href="https://redirect.github.com/facebook/react/pull/34510">#34510</a>, <a href="https://redirect.github.com/facebook/react/pull/34511">#34511</a>, <a href="https://redirect.github.com/facebook/react/pull/34539">#34539</a>, <a href="https://redirect.github.com/facebook/react/pull/35567">#35567</a>, <a href="https://redirect.github.com/facebook/react/pull/35564">#35564</a>, <a href="https://redirect.github.com/facebook/react/pull/35485">#35485</a>, <a href="https://redirect.github.com/facebook/react/pull/35380">#35380</a>, <a href="https://redirect.github.com/facebook/react/pull/35063">#35063</a>, <a href="https://redirect.github.com/facebook/react/pull/35060">#35060</a>, <a href="https://redirect.github.com/facebook/react/pull/34676">#34676</a>, <a href="https://redirect.github.com/facebook/react/pull/36917">#36917</a>, <a href="https://redirect.github.com/facebook/react/pull/35337">#35337</a>, <a href="https://redirect.github.com/facebook/react/pull/35520">#35520</a>)</li> <li>Fragment Refs: Add Refs to <code><Fragment /></code> to support composable platform behavior (<a href="https://github.com/jackpope"><code>@jackpope</code></a>, <a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>, <a href="https://github.com/Dhakshin2007"><code>@Dhakshin2007</code></a>, <a href="https://github.com/chirokas"><code>@chirokas</code></a>, <a href="https://github.com/teamleaderleo"><code>@teamleaderleo</code></a>, <a href="https://github.com/fallintoplace"><code>@fallintoplace</code></a>: <a href="https://redirect.github.com/facebook/react/pull/32465">#32465</a>, <a href="https://redirect.github.com/facebook/react/pull/32613">#32613</a>, <a href="https://redirect.github.com/facebook/react/pull/32619">#32619</a>, <a href="https://redirect.github.com/facebook/react/pull/32654">#32654</a>, <a href="https://redirect.github.com/facebook/react/pull/32660">#32660</a>, <a href="https://redirect.github.com/facebook/react/pull/32682">#32682</a>, <a href="https://redirect.github.com/facebook/react/pull/32722">#32722</a>, <a href="https://redirect.github.com/facebook/react/pull/32813">#32813</a>, <a href="https://redirect.github.com/facebook/react/pull/32814">#32814</a>, <a href="https://redirect.github.com/facebook/react/pull/33056">#33056</a>, <a href="https://redirect.github.com/facebook/react/pull/33058">#33058</a>, <a href="https://redirect.github.com/facebook/react/pull/33093">#33093</a>, <a href="https://redirect.github.com/facebook/react/pull/34069">#34069</a>, <a href="https://redirect.github.com/facebook/react/pull/34103">#34103</a>, <a href="https://redirect.github.com/facebook/react/pull/34544">#34544</a>, <a href="https://redirect.github.com/facebook/react/pull/34545">#34545</a>, <a href="https://redirect.github.com/facebook/react/pull/37062">#37062</a>, <a href="https://redirect.github.com/facebook/react/pull/37061">#37061</a>, <a href="https://redirect.github.com/facebook/react/pull/37060">#37060</a>, <a href="https://redirect.github.com/facebook/react/pull/36047">#36047</a>, <a href="https://redirect.github.com/facebook/react/pull/36010">#36010</a>, <a href="https://redirect.github.com/facebook/react/pull/35642">#35642</a>, <a href="https://redirect.github.com/facebook/react/pull/35641">#35641</a>, <a href="https://redirect.github.com/facebook/react/pull/35637">#35637</a>, <a href="https://redirect.github.com/facebook/react/pull/35630">#35630</a>, <a href="https://redirect.github.com/facebook/react/pull/34935">#34935</a>, <a href="https://redirect.github.com/facebook/react/pull/37457">#37457</a>, <a href="https://redirect.github.com/facebook/react/pull/37408">#37408</a>, <a href="https://redirect.github.com/facebook/react/pull/37326">#37326</a>, <a href="https://redirect.github.com/facebook/react/pull/37251">#37251</a>, <a href="https://redirect.github.com/facebook/react/pull/37171">#37171</a>, <a href="https://redirect.github.com/facebook/react/pull/37169">#37169</a>, <a href="https://redirect.github.com/facebook/react/pull/37168">#37168</a>, <a href="https://redirect.github.com/facebook/react/pull/37167">#37167</a>, <a href="https://redirect.github.com/facebook/react/pull/37166">#37166</a>, <a href="https://redirect.github.com/facebook/react/pull/37165">#37165</a>, <a href="https://redirect.github.com/facebook/react/pull/37164">#37164</a>, <a href="https://redirect.github.com/facebook/react/pull/37163">#37163</a>, <a href="https://redirect.github.com/facebook/react/pull/37162">#37162</a>, <a href="https://redirect.github.com/facebook/react/pull/37161">#37161</a>, <a href="https://redirect.github.com/facebook/react/pull/37160">#37160</a>, <a href="https://redirect.github.com/facebook/react/pull/37125">#37125</a>, <a href="https://redirect.github.com/facebook/react/pull/37063">#37063</a>)</li> </ul> <h2>New React DOM Features</h2> <ul> <li><code>browser()</code>: a new <code>react-dom</code> API that returns a usable which errors during server rendering and resolves in the browser. <code>use(browser())</code> inside a <code><Suspense></code> boundary marks a subtree as browser-only without reporting a recoverable error (<a href="https://github.com/gnoff"><code>@gnoff</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37143">#37143</a>, <a href="https://redirect.github.com/facebook/react/pull/37241">#37241</a>) <ul> <li>Added an <code>onBrowserBailout</code> option to the <code>react-dom/server</code> APIs to observe when a subtree defers to the browser (<a href="https://github.com/gnoff"><code>@gnoff</code></a> <a href="https://redirect.github.com/facebook/react/pull/37193">#37193</a>)</li> </ul> </li> </ul> <h2>Notable changes</h2> <ul> <li>Enable Trusted Types API integration (<a href="https://github.com/rickhanlonii"><code>@rickhanlonii</code></a> <a href="https://redirect.github.com/facebook/react/pull/35816">#35816</a>)</li> <li>Transitions now render independently instead of being entangled into a single render, so a slow transition no longer holds up unrelated ones (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/37290">#37290</a>)</li> <li>Added a DEV-only warning when a component appears to have been unblocked by calling <code>use()</code> conditionally (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37104">#37104</a>, <a href="https://redirect.github.com/facebook/react/pull/37203">#37203</a>, <a href="https://redirect.github.com/facebook/react/pull/37491">#37491</a>)</li> </ul> <h2>All Changes</h2> <h3>React</h3> <ul> <li>Fast Refresh Fixes <ul> <li>Fix Fast Refresh to find and remount edits to components wrapped behind <code>lazy()</code> (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36965">#36965</a>)</li> <li>Fix Fast Refresh so edits to a <code>memo()</code> comparison function take effect (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36964">#36964</a>)</li> <li>Fix Fast Refresh crash when an edit changes the kind of a component's type (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36963">#36963</a>)</li> <li>Unify hot reload type resolution for Fast Refresh (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36962">#36962</a>)</li> <li>Fix Fast Refresh to remount correctly when an edit changes the component kind (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36950">#36950</a>)</li> <li>Double invoke effects in StrictMode after Fast Refresh (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35962">#35962</a>)</li> </ul> </li> <li>Performance Track Fixes <ul> <li>Prevent crash when accessing <code>$$typeof</code> in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35679">#35679</a>)</li> <li>Handle non-string function names in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35659">#35659</a>)</li> <li>Use minus (<code>-</code>) instead of en dash for removed props in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35649">#35649</a>)</li> <li>Handle arrays with bigints in deep objects in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35648">#35648</a>)</li> <li>Don't enumerate typed array props in Performance Tracks in DEV (<a href="https://github.com/UditDewan"><code>@UditDewan</code></a> <a href="https://redirect.github.com/facebook/react/pull/36913">#36913</a>)</li> <li>Bail out of diffing wide objects and arrays in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/34742">#34742</a>)</li> <li>Clear potentially large performance measures in DEV (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a> <a href="https://redirect.github.com/facebook/react/pull/34803">#34803</a>)</li> <li>Fix missing else branch for renders with no props change in Performance Tracks (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a> <a href="https://redirect.github.com/facebook/react/pull/34837">#34837</a>)</li> </ul> </li> <li>Activity Fixes <ul> <li>Fix <code>useSyncExternalStore</code> missing store mutations that happened while an Activity tree was hidden (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36947">#36947</a>)</li> <li>Hide portal contents when an Activity is hidden (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/35091">#35091</a>)</li> <li>Prevent metadata hoisting in hidden <code><Activity></code> trees (<a href="https://github.com/ronnakamoto"><code>@ronnakamoto</code></a> <a href="https://redirect.github.com/facebook/react/pull/34983">#34983</a>)</li> <li>Prevent errors thrown inside a hidden Activity from escaping to the visible UI (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/35074">#35074</a>)</li> <li>Don't unhide a node if a direct parent Offscreen is still hidden (<a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a> <a href="https://redirect.github.com/facebook/react/pull/34821">#34821</a>)</li> <li>Don't show internal <code><Offscreen></code> component in error messages (<a href="https://github.com/rickhanlonii"><code>@rickhanlonii</code></a> <a href="https://redirect.github.com/facebook/react/pull/35763">#35763</a>)</li> </ul> </li> <li>Warn in DEV when a component appears to have been unblocked by a conditional <code>use()</code> (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37104">#37104</a>, <a href="https://redirect.github.com/facebook/react/pull/37203">#37203</a>, <a href="https://redirect.github.com/facebook/react/pull/37491">#37491</a>)</li> <li>Render transitions independently instead of entangling them into a single render (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/37290">#37290</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/react/react/blob/main/CHANGELOG.md">react's changelog</a>.</em></p> <blockquote> <h2>19.3.0 (September 9, 2026)</h2> <h3>New React Features</h3> <ul> <li><code><ViewTransition /></code>: Adds <code><ViewTransition /></code> and <code>addTransitionType</code> APIs to power View Transition animations in React (<a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a>, <a href="https://github.com/jackpope"><code>@jackpope</code></a>, <a href="https://github.com/gaearon"><code>@gaearon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/31975">#31975</a>, <a href="https://redirect.github.com/facebook/react/pull/31987">#31987</a>, <a href="https://redirect.github.com/facebook/react/pull/31996">#31996</a>, <a href="https://redirect.github.com/facebook/react/pull/31999">#31999</a>, <a href="https://redirect.github.com/facebook/react/pull/32001">#32001</a>, <a href="https://redirect.github.com/facebook/react/pull/32002">#32002</a>, <a href="https://redirect.github.com/facebook/react/pull/32028">#32028</a>, <a href="https://redirect.github.com/facebook/react/pull/32029">#32029</a>, <a href="https://redirect.github.com/facebook/react/pull/32031">#32031</a>, <a href="https://redirect.github.com/facebook/react/pull/32034">#32034</a>, <a href="https://redirect.github.com/facebook/react/pull/32038">#32038</a>, <a href="https://redirect.github.com/facebook/react/pull/32041">#32041</a>, <a href="https://redirect.github.com/facebook/react/pull/32050">#32050</a>, <a href="https://redirect.github.com/facebook/react/pull/32090">#32090</a>, <a href="https://redirect.github.com/facebook/react/pull/32105">#32105</a>, <a href="https://redirect.github.com/facebook/react/pull/32254">#32254</a>, <a href="https://redirect.github.com/facebook/react/pull/32379">#32379</a>, <a href="https://redirect.github.com/facebook/react/pull/32422">#32422</a>, <a href="https://redirect.github.com/facebook/react/pull/32462">#32462</a>, <a href="https://redirect.github.com/facebook/react/pull/32540">#32540</a>, <a href="https://redirect.github.com/facebook/react/pull/32545">#32545</a>, <a href="https://redirect.github.com/facebook/react/pull/32585">#32585</a>, <a href="https://redirect.github.com/facebook/react/pull/32599">#32599</a>, <a href="https://redirect.github.com/facebook/react/pull/32611">#32611</a>, <a href="https://redirect.github.com/facebook/react/pull/32612">#32612</a>, <a href="https://redirect.github.com/facebook/react/pull/32617">#32617</a>, <a href="https://redirect.github.com/facebook/react/pull/32651">#32651</a>, <a href="https://redirect.github.com/facebook/react/pull/32653">#32653</a>, <a href="https://redirect.github.com/facebook/react/pull/32656">#32656</a>, <a href="https://redirect.github.com/facebook/react/pull/32664">#32664</a>, <a href="https://redirect.github.com/facebook/react/pull/32699">#32699</a>, <a href="https://redirect.github.com/facebook/react/pull/32723">#32723</a>, <a href="https://redirect.github.com/facebook/react/pull/32734">#32734</a>, <a href="https://redirect.github.com/facebook/react/pull/32751">#32751</a>, <a href="https://redirect.github.com/facebook/react/pull/32752">#32752</a>, <a href="https://redirect.github.com/facebook/react/pull/32760">#32760</a>, <a href="https://redirect.github.com/facebook/react/pull/32761">#32761</a>, <a href="https://redirect.github.com/facebook/react/pull/32764">#32764</a>, <a href="https://redirect.github.com/facebook/react/pull/32772">#32772</a>, <a href="https://redirect.github.com/facebook/react/pull/32790">#32790</a>, <a href="https://redirect.github.com/facebook/react/pull/32819">#32819</a>, <a href="https://redirect.github.com/facebook/react/pull/32820">#32820</a>, <a href="https://redirect.github.com/facebook/react/pull/32822">#32822</a>, <a href="https://redirect.github.com/facebook/react/pull/32833">#32833</a>, <a href="https://redirect.github.com/facebook/react/pull/32849">#32849</a>, <a href="https://redirect.github.com/facebook/react/pull/33094">#33094</a>, <a href="https://redirect.github.com/facebook/react/pull/33191">#33191</a>, <a href="https://redirect.github.com/facebook/react/pull/33200">#33200</a>, <a href="https://redirect.github.com/facebook/react/pull/33206">#33206</a>, <a href="https://redirect.github.com/facebook/react/pull/33293">#33293</a>, <a href="https://redirect.github.com/facebook/react/pull/33330">#33330</a>, <a href="https://redirect.github.com/facebook/react/pull/33331">#33331</a>, <a href="https://redirect.github.com/facebook/react/pull/33332">#33332</a>, <a href="https://redirect.github.com/facebook/react/pull/33357">#33357</a>, <a href="https://redirect.github.com/facebook/react/pull/33362">#33362</a>, <a href="https://redirect.github.com/facebook/react/pull/33433">#33433</a>, <a href="https://redirect.github.com/facebook/react/pull/33576">#33576</a>, <a href="https://redirect.github.com/facebook/react/pull/34374">#34374</a>, <a href="https://redirect.github.com/facebook/react/pull/34450">#34450</a>, <a href="https://redirect.github.com/facebook/react/pull/34481">#34481</a>, <a href="https://redirect.github.com/facebook/react/pull/34500">#34500</a>, <a href="https://redirect.github.com/facebook/react/pull/34502">#34502</a>, <a href="https://redirect.github.com/facebook/react/pull/34510">#34510</a>, <a href="https://redirect.github.com/facebook/react/pull/34511">#34511</a>, <a href="https://redirect.github.com/facebook/react/pull/34539">#34539</a>, <a href="https://redirect.github.com/facebook/react/pull/35567">#35567</a>, <a href="https://redirect.github.com/facebook/react/pull/35564">#35564</a>, <a href="https://redirect.github.com/facebook/react/pull/35485">#35485</a>, <a href="https://redirect.github.com/facebook/react/pull/35380">#35380</a>, <a href="https://redirect.github.com/facebook/react/pull/35063">#35063</a>, <a href="https://redirect.github.com/facebook/react/pull/35060">#35060</a>, <a href="https://redirect.github.com/facebook/react/pull/34676">#34676</a>, <a href="https://redirect.github.com/facebook/react/pull/36917">#36917</a>, <a href="https://redirect.github.com/facebook/react/pull/35337">#35337</a>, <a href="https://redirect.github.com/facebook/react/pull/35520">#35520</a>)</li> <li>Fragment Refs: Add Refs to <code><Fragment /></code> to support composable platform behavior (<a href="https://github.com/jackpope"><code>@jackpope</code></a>, <a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>, <a href="https://github.com/Dhakshin2007"><code>@Dhakshin2007</code></a>, <a href="https://github.com/chirokas"><code>@chirokas</code></a>, <a href="https://github.com/teamleaderleo"><code>@teamleaderleo</code></a>, <a href="https://github.com/fallintoplace"><code>@fallintoplace</code></a>: <a href="https://redirect.github.com/facebook/react/pull/32465">#32465</a>, <a href="https://redirect.github.com/facebook/react/pull/32613">#32613</a>, <a href="https://redirect.github.com/facebook/react/pull/32619">#32619</a>, <a href="https://redirect.github.com/facebook/react/pull/32654">#32654</a>, <a href="https://redirect.github.com/facebook/react/pull/32660">#32660</a>, <a href="https://redirect.github.com/facebook/react/pull/32682">#32682</a>, <a href="https://redirect.github.com/facebook/react/pull/32722">#32722</a>, <a href="https://redirect.github.com/facebook/react/pull/32813">#32813</a>, <a href="https://redirect.github.com/facebook/react/pull/32814">#32814</a>, <a href="https://redirect.github.com/facebook/react/pull/33056">#33056</a>, <a href="https://redirect.github.com/facebook/react/pull/33058">#33058</a>, <a href="https://redirect.github.com/facebook/react/pull/33093">#33093</a>, <a href="https://redirect.github.com/facebook/react/pull/34069">#34069</a>, <a href="https://redirect.github.com/facebook/react/pull/34103">#34103</a>, <a href="https://redirect.github.com/facebook/react/pull/34544">#34544</a>, <a href="https://redirect.github.com/facebook/react/pull/34545">#34545</a>, <a href="https://redirect.github.com/facebook/react/pull/37062">#37062</a>, <a href="https://redirect.github.com/facebook/react/pull/37061">#37061</a>, <a href="https://redirect.github.com/facebook/react/pull/37060">#37060</a>, <a href="https://redirect.github.com/facebook/react/pull/36047">#36047</a>, <a href="https://redirect.github.com/facebook/react/pull/36010">#36010</a>, <a href="https://redirect.github.com/facebook/react/pull/35642">#35642</a>, <a href="https://redirect.github.com/facebook/react/pull/35641">#35641</a>, <a href="https://redirect.github.com/facebook/react/pull/35637">#35637</a>, <a href="https://redirect.github.com/facebook/react/pull/35630">#35630</a>, <a href="https://redirect.github.com/facebook/react/pull/34935">#34935</a>, <a href="https://redirect.github.com/facebook/react/pull/37457">#37457</a>, <a href="https://redirect.github.com/facebook/react/pull/37408">#37408</a>, <a href="https://redirect.github.com/facebook/react/pull/37326">#37326</a>, <a href="https://redirect.github.com/facebook/react/pull/37251">#37251</a>, <a href="https://redirect.github.com/facebook/react/pull/37171">#37171</a>, <a href="https://redirect.github.com/facebook/react/pull/37169">#37169</a>, <a href="https://redirect.github.com/facebook/react/pull/37168">#37168</a>, <a href="https://redirect.github.com/facebook/react/pull/37167">#37167</a>, <a href="https://redirect.github.com/facebook/react/pull/37166">#37166</a>, <a href="https://redirect.github.com/facebook/react/pull/37165">#37165</a>, <a href="https://redirect.github.com/facebook/react/pull/37164">#37164</a>, <a href="https://redirect.github.com/facebook/react/pull/37163">#37163</a>, <a href="https://redirect.github.com/facebook/react/pull/37162">#37162</a>, <a href="https://redirect.github.com/facebook/react/pull/37161">#37161</a>, <a href="https://redirect.github.com/facebook/react/pull/37160">#37160</a>, <a href="https://redirect.github.com/facebook/react/pull/37125">#37125</a>, <a href="https://redirect.github.com/facebook/react/pull/37063">#37063</a>)</li> </ul> <h3>New React DOM Features</h3> <ul> <li><code>browser()</code>: a new <code>react-dom</code> API that returns a usable which errors during server rendering and resolves in the browser. <code>use(browser())</code> inside a <code><Suspense></code> boundary marks a subtree as browser-only without reporting a recoverable error (<a href="https://github.com/gnoff"><code>@gnoff</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37143">#37143</a>, <a href="https://redirect.github.com/facebook/react/pull/37241">#37241</a>) <ul> <li>Added an <code>onBrowserBailout</code> option to the <code>react-dom/server</code> APIs to observe when a subtree defers to the browser (<a href="https://github.com/gnoff"><code>@gnoff</code></a> <a href="https://redirect.github.com/facebook/react/pull/37193">#37193</a>)</li> </ul> </li> </ul> <h3>Notable changes</h3> <ul> <li>Enable Trusted Types API integration (<a href="https://github.com/rickhanlonii"><code>@rickhanlonii</code></a> <a href="https://redirect.github.com/facebook/react/pull/35816">#35816</a>)</li> <li>Transitions now render independently instead of being entangled into a single render, so a slow transition no longer holds up unrelated ones (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/37290">#37290</a>)</li> <li>Added a DEV-only warning when a component appears to have been unblocked by calling <code>use()</code> conditionally (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37104">#37104</a>, <a href="https://redirect.github.com/facebook/react/pull/37203">#37203</a>, <a href="https://redirect.github.com/facebook/react/pull/37491">#37491</a>)</li> </ul> <h3>All Changes</h3> <h4>React</h4> <ul> <li>Fast Refresh Fixes <ul> <li>Fix Fast Refresh to find and remount edits to components wrapped behind <code>lazy()</code> (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36965">#36965</a>)</li> <li>Fix Fast Refresh so edits to a <code>memo()</code> comparison function take effect (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36964">#36964</a>)</li> <li>Fix Fast Refresh crash when an edit changes the kind of a component's type (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36963">#36963</a>)</li> <li>Unify hot reload type resolution for Fast Refresh (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36962">#36962</a>)</li> <li>Fix Fast Refresh to remount correctly when an edit changes the component kind (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36950">#36950</a>)</li> <li>Double invoke effects in StrictMode after Fast Refresh (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35962">#35962</a>)</li> </ul> </li> <li>Performance Track Fixes <ul> <li>Prevent crash when accessing <code>$$typeof</code> in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35679">#35679</a>)</li> <li>Handle non-string function names in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35659">#35659</a>)</li> <li>Use minus (<code>-</code>) instead of en dash for removed props in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35649">#35649</a>)</li> <li>Handle arrays with bigints in deep objects in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35648">#35648</a>)</li> <li>Don't enumerate typed array props in Performance Tracks in DEV (<a href="https://github.com/UditDewan"><code>@UditDewan</code></a> <a href="https://redirect.github.com/facebook/react/pull/36913">#36913</a>)</li> <li>Bail out of diffing wide objects and arrays in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/34742">#34742</a>)</li> <li>Clear potentially large performance measures in DEV (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a> <a href="https://redirect.github.com/facebook/react/pull/34803">#34803</a>)</li> <li>Fix missing else branch for renders with no props change in Performance Tracks (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a> <a href="https://redirect.github.com/facebook/react/pull/34837">#34837</a>)</li> </ul> </li> <li>Activity Fixes <ul> <li>Fix <code>useSyncExternalStore</code> missing store mutations that happened while an Activity tree was hidden (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36947">#36947</a>)</li> <li>Hide portal contents when an Activity is hidden (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/35091">#35091</a>)</li> <li>Prevent metadata hoisting in hidden <code><Activity></code> trees (<a href="https://github.com/ronnakamoto"><code>@ronnakamoto</code></a> <a href="https://redirect.github.com/facebook/react/pull/34983">#34983</a>)</li> <li>Prevent errors thrown inside a hidden Activity from escaping to the visible UI (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/35074">#35074</a>)</li> <li>Don't unhide a node if a direct parent Offscreen is still hidden (<a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a> <a href="https://redirect.github.com/facebook/react/pull/34821">#34821</a>)</li> <li>Don't show internal <code><Offscreen></code> component in error messages (<a href="https://github.com/rickhanlonii"><code>@rickhanlonii</code></a> <a href="https://redirect.github.com/facebook/react/pull/35763">#35763</a>)</li> </ul> </li> <li>Warn in DEV when a component appears to have been unblocked by a conditional <code>use()</code> (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37104">#37104</a>, <a href="https://redirect.github.com/facebook/react/pull/37203">#37203</a>, <a href="https://redirect.github.com/facebook/react/pull/37491">#37491</a>)</li> <li>Render transitions independently instead of entangling them into a single render (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/37290">#37290</a>)</li> <li>Fix hang when updating a dehydrated boundary inside a hidden tree (<a href="https://github.com/gaearon"><code>@gaearon</code></a> <a href="https://redirect.github.com/facebook/react/pull/37135">#37135</a>)</li> <li>Don't reacquire Host Singletons during dev effect validation (<a href="https://github.com/gnoff"><code>@gnoff</code></a> <a href="https://redirect.github.com/facebook/react/pull/37113">#37113</a>)</li> <li>Only remove properties from Host Singletons on release (<a href="https://github.com/gnoff"><code>@gnoff</code></a> <a href="https://redirect.github.com/facebook/react/pull/37112">#37112</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/react/react/commit/2dc7da790d6388b95b83198ca9b588b2ad5f5c0b"><code>2dc7da7</code></a> [test] Bump Jest to 30.4 (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/37382">#37382</a>)</li> <li><a href="https://github.com/react/react/commit/4f9389423b7319e1f7acc3d158c84a8365462748"><code>4f93894</code></a> docs: remove stale parentType param from validateChildKeys JSDoc (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/36928">#36928</a>)</li> <li><a href="https://github.com/react/react/commit/dbc37501ffeaf8fec45af5898caf1c3d64ad10bf"><code>dbc3750</code></a> Update required references to GitHub repo (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/36752">#36752</a>)</li> <li><a href="https://github.com/react/react/commit/900ae094d85b11c67d53dd14af50a2bda5db4495"><code>900ae09</code></a> [flow] Bump flow to v0.317.0 (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/36701">#36701</a>)</li> <li><a href="https://github.com/react/react/commit/fbb137059e4aacfaab1d36516e9b55050b4a0454"><code>fbb1370</code></a> [flow] Bump flow to v0.307.1 (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/36199">#36199</a>)</li> <li><a href="https://github.com/react/react/commit/56922cf751fab6c7ab4c12ddbbd15839959fa255"><code>56922cf</code></a> [react-native-renderer] Delete Paper (legacy) renderer (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/36285">#36285</a>)</li> <li><a href="https://github.com/react/react/commit/74568e8627aa43469b74f2972f427a209639d0b6"><code>74568e8</code></a> [Flight] Transport <code>AggregateErrors.errors</code> (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/36156">#36156</a>)</li> <li><a href="https://github.com/react/react/commit/e66ef6480ecd19c6885f2c06dec34fec1fdc0a98"><code>e66ef64</code></a> [tests] remove withoutStack from assertConsole helpers (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/35498">#35498</a>)</li> <li><a href="https://github.com/react/react/commit/db71391c5c70dc113560d1c23d0b6548604d827f"><code>db71391</code></a> [Fiber] Instrument the lazy initializer thenable in all cases (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/35521">#35521</a>)</li> <li><a href="https://github.com/react/react/commit/3e1abcc8d7083a13adf4774feb0d67ecbe4a2bc4"><code>3e1abcc</code></a> [tests] Require exact error messages in assertConsole helpers (<a href="https://github.com/react/react/tree/HEAD/packages/react/issues/35497">#35497</a>)</li> <li>Additional commits viewable in <a href="https://github.com/react/react/commits/v19.3.0/packages/react">compare view</a></li> </ul> </details> <br /> Updates `@types/react` from 19.2.18 to 19.3.0 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react">compare view</a></li> </ul> </details> <br /> Updates `react-dom` from 19.2.8 to 19.3.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/react/react/releases">react-dom's releases</a>.</em></p> <blockquote> <h2>19.3.0 (September 9, 2026)</h2> <p>Below is a list of all new features, APIs, and bug fixes.</p> <p>Read the <a href="https://react.dev/blog/2026/09/09/react-19-3">React 19.3 release post</a> for more information.</p> <h2>New React Features</h2> <ul> <li><code><ViewTransition /></code>: Adds <code><ViewTransition /></code> and <code>addTransitionType</code> APIs to power View Transition animations in React (<a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a>, <a href="https://github.com/jackpope"><code>@jackpope</code></a>, <a href="https://github.com/gaearon"><code>@gaearon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/31975">#31975</a>, <a href="https://redirect.github.com/facebook/react/pull/31987">#31987</a>, <a href="https://redirect.github.com/facebook/react/pull/31996">#31996</a>, <a href="https://redirect.github.com/facebook/react/pull/31999">#31999</a>, <a href="https://redirect.github.com/facebook/react/pull/32001">#32001</a>, <a href="https://redirect.github.com/facebook/react/pull/32002">#32002</a>, <a href="https://redirect.github.com/facebook/react/pull/32028">#32028</a>, <a href="https://redirect.github.com/facebook/react/pull/32029">#32029</a>, <a href="https://redirect.github.com/facebook/react/pull/32031">#32031</a>, <a href="https://redirect.github.com/facebook/react/pull/32034">#32034</a>, <a href="https://redirect.github.com/facebook/react/pull/32038">#32038</a>, <a href="https://redirect.github.com/facebook/react/pull/32041">#32041</a>, <a href="https://redirect.github.com/facebook/react/pull/32050">#32050</a>, <a href="https://redirect.github.com/facebook/react/pull/32090">#32090</a>, <a href="https://redirect.github.com/facebook/react/pull/32105">#32105</a>, <a href="https://redirect.github.com/facebook/react/pull/32254">#32254</a>, <a href="https://redirect.github.com/facebook/react/pull/32379">#32379</a>, <a href="https://redirect.github.com/facebook/react/pull/32422">#32422</a>, <a href="https://redirect.github.com/facebook/react/pull/32462">#32462</a>, <a href="https://redirect.github.com/facebook/react/pull/32540">#32540</a>, <a href="https://redirect.github.com/facebook/react/pull/32545">#32545</a>, <a href="https://redirect.github.com/facebook/react/pull/32585">#32585</a>, <a href="https://redirect.github.com/facebook/react/pull/32599">#32599</a>, <a href="https://redirect.github.com/facebook/react/pull/32611">#32611</a>, <a href="https://redirect.github.com/facebook/react/pull/32612">#32612</a>, <a href="https://redirect.github.com/facebook/react/pull/32617">#32617</a>, <a href="https://redirect.github.com/facebook/react/pull/32651">#32651</a>, <a href="https://redirect.github.com/facebook/react/pull/32653">#32653</a>, <a href="https://redirect.github.com/facebook/react/pull/32656">#32656</a>, <a href="https://redirect.github.com/facebook/react/pull/32664">#32664</a>, <a href="https://redirect.github.com/facebook/react/pull/32699">#32699</a>, <a href="https://redirect.github.com/facebook/react/pull/32723">#32723</a>, <a href="https://redirect.github.com/facebook/react/pull/32734">#32734</a>, <a href="https://redirect.github.com/facebook/react/pull/32751">#32751</a>, <a href="https://redirect.github.com/facebook/react/pull/32752">#32752</a>, <a href="https://redirect.github.com/facebook/react/pull/32760">#32760</a>, <a href="https://redirect.github.com/facebook/react/pull/32761">#32761</a>, <a href="https://redirect.github.com/facebook/react/pull/32764">#32764</a>, <a href="https://redirect.github.com/facebook/react/pull/32772">#32772</a>, <a href="https://redirect.github.com/facebook/react/pull/32790">#32790</a>, <a href="https://redirect.github.com/facebook/react/pull/32819">#32819</a>, <a href="https://redirect.github.com/facebook/react/pull/32820">#32820</a>, <a href="https://redirect.github.com/facebook/react/pull/32822">#32822</a>, <a href="https://redirect.github.com/facebook/react/pull/32833">#32833</a>, <a href="https://redirect.github.com/facebook/react/pull/32849">#32849</a>, <a href="https://redirect.github.com/facebook/react/pull/33094">#33094</a>, <a href="https://redirect.github.com/facebook/react/pull/33191">#33191</a>, <a href="https://redirect.github.com/facebook/react/pull/33200">#33200</a>, <a href="https://redirect.github.com/facebook/react/pull/33206">#33206</a>, <a href="https://redirect.github.com/facebook/react/pull/33293">#33293</a>, <a href="https://redirect.github.com/facebook/react/pull/33330">#33330</a>, <a href="https://redirect.github.com/facebook/react/pull/33331">#33331</a>, <a href="https://redirect.github.com/facebook/react/pull/33332">#33332</a>, <a href="https://redirect.github.com/facebook/react/pull/33357">#33357</a>, <a href="https://redirect.github.com/facebook/react/pull/33362">#33362</a>, <a href="https://redirect.github.com/facebook/react/pull/33433">#33433</a>, <a href="https://redirect.github.com/facebook/react/pull/33576">#33576</a>, <a href="https://redirect.github.com/facebook/react/pull/34374">#34374</a>, <a href="https://redirect.github.com/facebook/react/pull/34450">#34450</a>, <a href="https://redirect.github.com/facebook/react/pull/34481">#34481</a>, <a href="https://redirect.github.com/facebook/react/pull/34500">#34500</a>, <a href="https://redirect.github.com/facebook/react/pull/34502">#34502</a>, <a href="https://redirect.github.com/facebook/react/pull/34510">#34510</a>, <a href="https://redirect.github.com/facebook/react/pull/34511">#34511</a>, <a href="https://redirect.github.com/facebook/react/pull/34539">#34539</a>, <a href="https://redirect.github.com/facebook/react/pull/35567">#35567</a>, <a href="https://redirect.github.com/facebook/react/pull/35564">#35564</a>, <a href="https://redirect.github.com/facebook/react/pull/35485">#35485</a>, <a href="https://redirect.github.com/facebook/react/pull/35380">#35380</a>, <a href="https://redirect.github.com/facebook/react/pull/35063">#35063</a>, <a href="https://redirect.github.com/facebook/react/pull/35060">#35060</a>, <a href="https://redirect.github.com/facebook/react/pull/34676">#34676</a>, <a href="https://redirect.github.com/facebook/react/pull/36917">#36917</a>, <a href="https://redirect.github.com/facebook/react/pull/35337">#35337</a>, <a href="https://redirect.github.com/facebook/react/pull/35520">#35520</a>)</li> <li>Fragment Refs: Add Refs to <code><Fragment /></code> to support composable platform behavior (<a href="https://github.com/jackpope"><code>@jackpope</code></a>, <a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>, <a href="https://github.com/Dhakshin2007"><code>@Dhakshin2007</code></a>, <a href="https://github.com/chirokas"><code>@chirokas</code></a>, <a href="https://github.com/teamleaderleo"><code>@teamleaderleo</code></a>, <a href="https://github.com/fallintoplace"><code>@fallintoplace</code></a>: <a href="https://redirect.github.com/facebook/react/pull/32465">#32465</a>, <a href="https://redirect.github.com/facebook/react/pull/32613">#32613</a>, <a href="https://redirect.github.com/facebook/react/pull/32619">#32619</a>, <a href="https://redirect.github.com/facebook/react/pull/32654">#32654</a>, <a href="https://redirect.github.com/facebook/react/pull/32660">#32660</a>, <a href="https://redirect.github.com/facebook/react/pull/32682">#32682</a>, <a href="https://redirect.github.com/facebook/react/pull/32722">#32722</a>, <a href="https://redirect.github.com/facebook/react/pull/32813">#32813</a>, <a href="https://redirect.github.com/facebook/react/pull/32814">#32814</a>, <a href="https://redirect.github.com/facebook/react/pull/33056">#33056</a>, <a href="https://redirect.github.com/facebook/react/pull/33058">#33058</a>, <a href="https://redirect.github.com/facebook/react/pull/33093">#33093</a>, <a href="https://redirect.github.com/facebook/react/pull/34069">#34069</a>, <a href="https://redirect.github.com/facebook/react/pull/34103">#34103</a>, <a href="https://redirect.github.com/facebook/react/pull/34544">#34544</a>, <a href="https://redirect.github.com/facebook/react/pull/34545">#34545</a>, <a href="https://redirect.github.com/facebook/react/pull/37062">#37062</a>, <a href="https://redirect.github.com/facebook/react/pull/37061">#37061</a>, <a href="https://redirect.github.com/facebook/react/pull/37060">#37060</a>, <a href="https://redirect.github.com/facebook/react/pull/36047">#36047</a>, <a href="https://redirect.github.com/facebook/react/pull/36010">#36010</a>, <a href="https://redirect.github.com/facebook/react/pull/35642">#35642</a>, <a href="https://redirect.github.com/facebook/react/pull/35641">#35641</a>, <a href="https://redirect.github.com/facebook/react/pull/35637">#35637</a>, <a href="https://redirect.github.com/facebook/react/pull/35630">#35630</a>, <a href="https://redirect.github.com/facebook/react/pull/34935">#34935</a>, <a href="https://redirect.github.com/facebook/react/pull/37457">#37457</a>, <a href="https://redirect.github.com/facebook/react/pull/37408">#37408</a>, <a href="https://redirect.github.com/facebook/react/pull/37326">#37326</a>, <a href="https://redirect.github.com/facebook/react/pull/37251">#37251</a>, <a href="https://redirect.github.com/facebook/react/pull/37171">#37171</a>, <a href="https://redirect.github.com/facebook/react/pull/37169">#37169</a>, <a href="https://redirect.github.com/facebook/react/pull/37168">#37168</a>, <a href="https://redirect.github.com/facebook/react/pull/37167">#37167</a>, <a href="https://redirect.github.com/facebook/react/pull/37166">#37166</a>, <a href="https://redirect.github.com/facebook/react/pull/37165">#37165</a>, <a href="https://redirect.github.com/facebook/react/pull/37164">#37164</a>, <a href="https://redirect.github.com/facebook/react/pull/37163">#37163</a>, <a href="https://redirect.github.com/facebook/react/pull/37162">#37162</a>, <a href="https://redirect.github.com/facebook/react/pull/37161">#37161</a>, <a href="https://redirect.github.com/facebook/react/pull/37160">#37160</a>, <a href="https://redirect.github.com/facebook/react/pull/37125">#37125</a>, <a href="https://redirect.github.com/facebook/react/pull/37063">#37063</a>)</li> </ul> <h2>New React DOM Features</h2> <ul> <li><code>browser()</code>: a new <code>react-dom</code> API that returns a usable which errors during server rendering and resolves in the browser. <code>use(browser())</code> inside a <code><Suspense></code> boundary marks a subtree as browser-only without reporting a recoverable error (<a href="https://github.com/gnoff"><code>@gnoff</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37143">#37143</a>, <a href="https://redirect.github.com/facebook/react/pull/37241">#37241</a>) <ul> <li>Added an <code>onBrowserBailout</code> option to the <code>react-dom/server</code> APIs to observe when a subtree defers to the browser (<a href="https://github.com/gnoff"><code>@gnoff</code></a> <a href="https://redirect.github.com/facebook/react/pull/37193">#37193</a>)</li> </ul> </li> </ul> <h2>Notable changes</h2> <ul> <li>Enable Trusted Types API integration (<a href="https://github.com/rickhanlonii"><code>@rickhanlonii</code></a> <a href="https://redirect.github.com/facebook/react/pull/35816">#35816</a>)</li> <li>Transitions now render independently instead of being entangled into a single render, so a slow transition no longer holds up unrelated ones (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/37290">#37290</a>)</li> <li>Added a DEV-only warning when a component appears to have been unblocked by calling <code>use()</code> conditionally (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37104">#37104</a>, <a href="https://redirect.github.com/facebook/react/pull/37203">#37203</a>, <a href="https://redirect.github.com/facebook/react/pull/37491">#37491</a>)</li> </ul> <h2>All Changes</h2> <h3>React</h3> <ul> <li>Fast Refresh Fixes <ul> <li>Fix Fast Refresh to find and remount edits to components wrapped behind <code>lazy()</code> (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36965">#36965</a>)</li> <li>Fix Fast Refresh so edits to a <code>memo()</code> comparison function take effect (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36964">#36964</a>)</li> <li>Fix Fast Refresh crash when an edit changes the kind of a component's type (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36963">#36963</a>)</li> <li>Unify hot reload type resolution for Fast Refresh (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36962">#36962</a>)</li> <li>Fix Fast Refresh to remount correctly when an edit changes the component kind (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36950">#36950</a>)</li> <li>Double invoke effects in StrictMode after Fast Refresh (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35962">#35962</a>)</li> </ul> </li> <li>Performance Track Fixes <ul> <li>Prevent crash when accessing <code>$$typeof</code> in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35679">#35679</a>)</li> <li>Handle non-string function names in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35659">#35659</a>)</li> <li>Use minus (<code>-</code>) instead of en dash for removed props in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35649">#35649</a>)</li> <li>Handle arrays with bigints in deep objects in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/35648">#35648</a>)</li> <li>Don't enumerate typed array props in Performance Tracks in DEV (<a href="https://github.com/UditDewan"><code>@UditDewan</code></a> <a href="https://redirect.github.com/facebook/react/pull/36913">#36913</a>)</li> <li>Bail out of diffing wide objects and arrays in Performance Tracks (<a href="https://github.com/eps1lon"><code>@eps1lon</code></a> <a href="https://redirect.github.com/facebook/react/pull/34742">#34742</a>)</li> <li>Clear potentially large performance measures in DEV (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a> <a href="https://redirect.github.com/facebook/react/pull/34803">#34803</a>)</li> <li>Fix missing else branch for renders with no props change in Performance Tracks (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a> <a href="https://redirect.github.com/facebook/react/pull/34837">#34837</a>)</li> </ul> </li> <li>Activity Fixes <ul> <li>Fix <code>useSyncExternalStore</code> missing store mutations that happened while an Activity tree was hidden (<a href="https://github.com/sophiebits"><code>@sophiebits</code></a> <a href="https://redirect.github.com/facebook/react/pull/36947">#36947</a>)</li> <li>Hide portal contents when an Activity is hidden (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/35091">#35091</a>)</li> <li>Prevent metadata hoisting in hidden <code><Activity></code> trees (<a href="https://github.com/ronnakamoto"><code>@ronnakamoto</code></a> <a href="https://redirect.github.com/facebook/react/pull/34983">#34983</a>)</li> <li>Prevent errors thrown inside a hidden Activity from escaping to the visible UI (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/35074">#35074</a>)</li> <li>Don't unhide a node if a direct parent Offscreen is still hidden (<a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a> <a href="https://redirect.github.com/facebook/react/pull/34821">#34821</a>)</li> <li>Don't show internal <code><Offscreen></code> component in error messages (<a href="https://github.com/rickhanlonii"><code>@rickhanlonii</code></a> <a href="https://redirect.github.com/facebook/react/pull/35763">#35763</a>)</li> </ul> </li> <li>Warn in DEV when a component appears to have been unblocked by a conditional <code>use()</code> (<a href="https://github.com/hoxyq"><code>@hoxyq</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/37104">#37104</a>, <a href="https://redirect.github.com/facebook/react/pull/37203">#37203</a>, <a href="https://redirect.github.com/facebook/react/pull/37491">#37491</a>)</li> <li>Render transitions independently instead of entangling them into a single render (<a href="https://github.com/acdlite"><code>@acdlite</code></a> <a href="https://redirect.github.com/facebook/react/pull/37290">#37290</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/react/react/blob/main/CHANGELOG.md">react-dom's changelog</a>.</em></p> <blockquote> <h2>19.3.0 (September 9, 2026)</h2> <h3>New React Features</h3> <ul> <li><code><ViewTransition /></code>: Adds <code><ViewTransition /></code> and <code>addTransitionType</code> APIs to power View Transition animations in React (<a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a>, <a href="https://github.com/jackpope"><code>@jackpope</code></a>, <a href="https://github.com/gaearon"><code>@gaearon</code></a>: <a href="https://redirect.github.com/facebook/react/pull/31975">#31975</a>, <a href="https://redirect.github.com/facebook/react/pull/31987">#31987</a>, <a href="https://redirect.github.com/facebook/react/pull/31996">#31996</a>, <a href="https://redirect.github.com/facebook/react/pull/31999">#31999</a>, <a href="https://redirect.github.com/facebook/react/pull/32001">#32001</a>, <a href="https://redirect.github.com/facebook/react/pull/32002">#32002</a>, <a href="https://redirect.github.com/facebook/react/pull/32028">#32028</a>, <a href="https://redirect.github.com/facebook/react/pull/32029">#32029</a>, <a href="https://redirect.github.com/facebook/react/pull/32031">#32031</a>, <a href="https://redirect.github.com/facebook/react/pull/32034">#32034</a>, <a href="https://redirect.github.com/facebook/react/pull/32038">#32038</a>, <a href="https://redirect.github.com/facebook/react/pull/32041">#32041</a>, <a href="https://redirect.github.com/facebook/react/pull/32050">#32050</a>, <a href="https://redirect.github.com/facebook/react/pull/32090">#32090</a>, <a href="https://redirect.github.com/facebook/react/pull/32105">#32105</a>, <a href="https://redirect.github.com/facebook/react/pull/32254">#32254</a>, <a href="https://redirect.github.com/facebook/react/pull/32379">#32379</a>, <a href="https://redirect.github.com/facebook/react/pull/32422">#32422</a>, <a href="https://redirect.github.com/facebook/react/pull/32462">#32462</a>, <a href="https://redirect.github.com/facebook/react/pull/32540">#32540</a>, <a href="https://redirect.github.com/facebook/react/pull/32545">#32545</a>, <a href="https://redirect.github.com/facebook/react/pull/32585">#32585</a>, <a href="https://redirect.github.com/facebook/react/pull/32599">#32599</a>, <a href="https://redirect.github.com/facebook/react/pull/32611">#32611</a>, <a href="https://redirect.github.com/facebook/react/pull/32612">#32612</a>, <a href="https://redirect.github.com/facebook/react/pull/32617">#32617</a>, <a href="https://redirect.github.com/facebook/react/pull/32651">#32651</a>, <a href="https://redirect.github.com/facebook/react/pull/32653">#32653</a>, <a href="https://redirect.github.com/facebook/react/pull/32656">#32656</a>, <a href="https://redirect.github.com/facebook/react/pull/32664">#32664</a>, <a href="https://redirect.github.com/facebook/react/pull/32699">#32699</a>, <a href="https://redirect.github.com/facebook/react/pull/32723">#32723</a>, <a href="https://redirect.github.com/facebook/react/pull/32734">#32734</a>, <a href="https://redirect.github.com/facebook/react/pull/32751">#32751</a>, <a href="https://redirect.github.com/facebook/react/pull/32752">#32752</a>, <a href="https://redirect.github.com/facebook/react/pull/32760">#32760</a>, <a href="https://redirect.github.com/facebook/react/pull/32761">#32761</a>, <a href="https://redirect.github.com/facebook/react/pull/32764">#32764</a>, <a href="https://redirect.github.com/facebook/react/pull/32772">#32772</a>, <a href="https://redirect.github.com/facebook/react/pull/32790">#32790</a>, <a href="https://redirect.github.com/facebook/react/pull/32819">#32819</a>, <a href="https://redirect.github.com/facebook/react/pull/32820">#32820</a>, <a href="https://redirect.github.com/facebook/react/pull/32822">#32822</a>, <a href="https://redirect.github.com/facebook/react/pull/32833">#32833</a>, <a href="https://redirect.github.com/facebook/react/pull/32849">#32849</a>, <a href="https://redirect.github.com/facebook/react/pull/33094">#33094</a>, <a href="https://redirect.github.com/facebook/react/pull/33191">#33191</a>, <a href="https://redirect.github.com/facebook/react/pull/33200">#33200</a>, <a href="https://redirect.github.com/facebook/react/pull/33206">#33206</a>, <a href="https://redirect.github.com/facebook/react/pull/33293">#33293</a>, <a href="https://redirect.github.com/facebook/react/pull/33330">#33330</a>, <a href="https://redirect.github.com/facebook/react/pull/33331">#33331</a>, <a href="https://redirect.github.com/facebook/react/pull/33332">#33332</a>, <a href="https://redirect.github.com/facebook/react/pull/33357">#33357</a>, <a href="https://redirect.github.com/facebook/react/pull/33362">#33362</a>, <a href="https://redirect.github.com/facebook/react/pull/33433">#33433</a>, <a href="https://redirect.github.com/facebook/react/pull/33576">#33576</a>, <a href="https://redirect.github.com/facebook/react/pull/34374">#34374</a>, <a href="https://redirect.github.com/facebook/react/pull/34450">#34450</a>, <a href="https://redirect.github.com/facebook/react/pull/34481">#34481</a>, <a href="https://redirect.github.com/facebook/react/pull/34500">#34500</a>, <a href="https://redirect.github.com/facebook/react/pull/34502">#34502</a>, <a href="https://redirect.github.com/facebook/react/pull/34510">#34510</a>, <a href="https://redirect.github.com/facebook/react/pull/34511">#34511</a>, <a href="https://redirect.github.com/facebook/react/pull/34539">#34539</a>, <a href="https://redirect.github.com/facebook/react/pull/35567">#35567</a>, <a href="https://redirect.github.com/facebook/react/pull/35564">#35564</a>, <a href="https://redirect.github.com/facebook/react/pull/35485">#35485</a>, <a href="https://redirect.github.com/facebook/react/pull/35380">#35380</a>, <a href="https://redirect.github.com/facebook/react/pull/35063">#35063</a>, <a href="https://redirect.github.com/facebook/react/pull/35060">#35060</a>, <a href="https://redirect.github.com/facebook/react/pull/34676">#34676</a>, <a href="https://redirect.github.com/facebook/react/pull/36917">#36917</a>, <a href="https://redirect.github.com/facebook/react/pull/35337">#35337</a>, <a href="https://redirect.github.com/facebook/react/pull/35520">#35520</a>)</li> <li>Fragment Refs: Add Refs to <code><Fragment /></code> to support composable platform behavior (<a href="https://github.com/jackpope"><code>@jackpope</code></a>, <a href="https://github.com/sebmarkbage"><code>@sebmarkbage</code></a>, <a href="https://github.com/eps1lon"><code>@eps1lon</code></a>, <a href="https://github.com/Dhakshin2007"><code>@Dhakshin2007</code></a>, <a href="https://github.com/chirokas"><code>@chirokas</code></a>, <a href="https://github.com/teamleaderleo"><code>@teamleaderleo</code></a>, <a href="https://github.com/fallintoplace"><code>@fallintoplace</code></a>: <a href="https://redirect.github.com/facebook/react/pull/32465">#32465</a>, <a href="https://redirect.github.com/facebook/react/pull/32613">#32613</a>, <a href="https://redirect.github.com/facebook/react/pull/32619">#32619</a>, <a href="https://redirect.github.com/facebook/react/pull/32654">#32654</a>, <a href="https://redirect.github.com/facebook/react/pull/32660">#32660</a>, <a href="https://redirect.github.com/facebook/react/pull/32682">#32682</a>, <a href="https://redirect.github.com/facebook/react/pull/32722">#32722</a>, <a href="https://redirect.github.com/facebook/react/pull/32813">#32813</a>, <a href="https://redirect.github.com/facebook/react/pull/32814">#32814</a>, <a href="https://redirect.github.com/facebook/react/pull/33056">#33056</a>, <a href="https://redirect.github.com/facebook/react/pull/33058">#33058</a>, <a href="https://redirect.github.com/facebook/react/pull/33093">#33093</a>, <a href="https://redirect.github.com/facebook/react/pull/34069">#34069</a>, <a href="https://redirect... _Description has been truncated_ Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> |
||
|
|
aafce2be1d |
Added the ability to sort direct search results by Most downloads (#1351)
Now that we know about the AA Downloads stats for search results (#1336), this PR allows sorting them locally by "Most downloads" without doing another AA search. Not needing to do an AA search for this is faster than the other sorts which do new AA searches asking for their results to be sorted a certain way. Also added the "Settings->Search Mode->Default Sort Order->Most downloads" option. Universal downloads do not allow for results sorting so I did not include this feature there. NOTE: While adding this feature I noticed that shelfmark only looks at the first page of AA search results. So switching between different sort orders may result in different sets of results with the same search term. Here's a couple of pics showing the new sort option: <img width="1186" height="759" alt="search-mode-sort-order-most-downloads" src="https://github.com/user-attachments/assets/c43fe2e7-84ba-48cd-a850-383f1af0d28f" /> <img width="1172" height="828" alt="direct-search-results-most-downloads" src="https://github.com/user-attachments/assets/4e240180-6a9d-4ce1-ab86-006b286570dd" /> Coded with llama.cpp, opencode and 🤖 |
||
|
|
e5dd34ae0e |
fix: unbreak main and follow up on the Blackhole handoff review (#1346)
DownloadHistoryService.record_download and updated the single production caller, but not the eleven in the test suite, leaving main red with 32 failures. Pass None, which is what the pre-#1336 behaviour recorded. For the Blackhole handoff (#1345): add_download publishes the torrent before the cancel check runs, and BlackholeClient.remove() is a no-op, so the watcher picks the file up regardless. Reporting a bare "Cancelled" hid that from the user. Name the completed handoff in the cancellation message instead, drop the _handle_cancelled_download call whose usenet branch cannot apply to a handoff-only client, and record why the orchestrator no longer verifies HandoffResult.path. Finally, make tests/direct_download a package: test_libgen_extract.py imports tests.libgen.sample_html across test directories, so without an __init__.py pytest named its modules by bare basename and a same-named module elsewhere would collide. |
||
|
|
c53545d9fe |
Add configurable word separator for naming templates (#1333)
Closes #1230 ## What Adds a "Word Separator" setting (Space / Dot / Underscore / Hyphen / Custom) that replaces internal whitespace in each naming-template placeholder's rendered value — e.g. `{Author}` renders "Arthur.Conan.Doyle" instead of "Arthur Conan Doyle" when Dot is selected. This follows option 2 from the issue rather than inventing new dotted-keyword template syntax (`{Author.}`), since it's a smaller surface: one setting applies uniformly across all four templates (books/audiobooks × rename/organize) instead of needing a parallel token for every existing one. ## How it works - Literal characters typed into the template itself (e.g. the `.` in `{Author}.-.{Title}`) are never touched — only whitespace *inside* a placeholder's resolved value is affected. - Default is "Space", which is a no-op: existing templates produce byte-identical output after this change (verified via the existing test suite, unmodified, still passing). ## Where - `shelfmark/core/naming.py` — `word_separator` param on `parse_naming_template` / `build_library_path`. - `shelfmark/download/postprocess/policy.py` — `get_word_separator()`, mirroring the existing `get_file_organization()` accessor. - `shelfmark/download/postprocess/transfer.py` — wires the resolved separator through the four existing template-rendering call sites. - `shelfmark/config/settings.py` — new `Word Separator` / `Custom Word Separator` fields next to the existing naming-template fields. - `src/frontend/.../namingTemplatePreview.ts` + `NamingTemplateField.tsx` — the settings UI has its own TS mirror of the Python renderer for the live preview; updated it in lockstep so the preview doesn't lie about what the separator will actually do. - Tests added on both sides (pytest + vitest). ## Testing - `uv run pytest tests/core/test_naming.py tests/core/test_destination_file_organization.py` — all pass, including new cases. - `uv run pytest` (full suite) — same pre-existing failures as on `main` before this change (browser/network-dependent bypass & e2e tests unrelated to this diff), everything else green. - `uv run ruff check` / `ruff format --check` / `basedpyright` — clean. - `npm run lint` / `format:check` / `typecheck` / `test:unit` (196 tests) — clean. |
||
|
|
2ed2e9a5d4 |
Feature: Add Download counts to search result displays and Download sidebar (#1336)
Having the download counts from AA as an input on choosing which of the many search results to pick for downloading is useful. This PR makes the downloads numbers available on all the search result pages and also on the Download sidebar after the user presses a download button for a Direct Download. I have also included a SKILL.md and associated download_books.py that can be used just as a reference or with an LLM harness for automation. The Downloads info is used by the script to pick which search result to download out of the many available. Since a picture is worth a thousand words: <img width="1225" height="812" alt="search-results-with-downloads" src="https://github.com/user-attachments/assets/e108ebe2-4cad-45e2-bb6a-d4f49b502de9" /> <img width="443" height="267" alt="download-sidebar-with-downloads" src="https://github.com/user-attachments/assets/9ce9e6c4-dcf5-4f7c-ab22-71850398b534" /> Coded with llama.cpp and 🤖 |
||
|
|
8c902d7f7a |
build(deps-dev): bump vitest from 4.1.11 to 5.0.0 in /src/frontend (#1330)
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.11 to 5.0.0. <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.0</h2> <p>Vitest 5 is officially out! This release focuses on performance and brings a lot of new features while fixing long-standing bugs. See our <a href="https://vitest.dev/blog/vitest-5.html">blog post</a> for the official announcement.</p> <h3> 🚨 Breaking Changes</h3> <ul> <li>Replace <code>loupe.inspect</code> with pretty-format - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Claude Opus 5 (1M context)</strong> and <strong>OpenAI Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9609">vitest-dev/vitest#9609</a> <a href="https://github.com/vitest-dev/vitest/commit/3f802da4b"><!-- raw HTML omitted -->(3f802)<!-- raw HTML omitted --></a></li> <li>Remove quotes from string values in <code>test.for/each</code> title <code>$</code> variable (take 2) - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10170">vitest-dev/vitest#10170</a> <a href="https://github.com/vitest-dev/vitest/commit/04d37e9d7"><!-- raw HTML omitted -->(04d37)<!-- raw HTML omitted --></a></li> <li>Default <code>attachmentsDir</code> from <code>.vitest-attachements/</code> to <code>.vitest/attachments/</code> - by <a href="https://github.com/MdSadiqMd"><code>@MdSadiqMd</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10186">vitest-dev/vitest#10186</a> <a href="https://github.com/vitest-dev/vitest/commit/1ba7338c3"><!-- raw HTML omitted -->(1ba73)<!-- raw HTML omitted --></a></li> <li>Remove <code>sequential</code> test/suite options in favor of <code>concurrent</code> - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> and <strong>OpenAI Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10198">vitest-dev/vitest#10198</a> <a href="https://github.com/vitest-dev/vitest/commit/9229f2edc"><!-- raw HTML omitted -->(9229f)<!-- raw HTML omitted --></a></li> <li>Represent locator as an object instead of a string - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10212">vitest-dev/vitest#10212</a> <a href="https://github.com/vitest-dev/vitest/commit/80f07edf6"><!-- raw HTML omitted -->(80f07)<!-- raw HTML omitted --></a></li> <li>Inline <code>expect</code> package - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10221">vitest-dev/vitest#10221</a> <a href="https://github.com/vitest-dev/vitest/commit/ad16223e7"><!-- raw HTML omitted -->(ad162)<!-- raw HTML omitted --></a></li> <li>Remove deprecated entry points - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10222">vitest-dev/vitest#10222</a> <a href="https://github.com/vitest-dev/vitest/commit/994c6ddb9"><!-- raw HTML omitted -->(994c6)<!-- raw HTML omitted --></a></li> <li>Require Node.js 22 and Vite 6.4 - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10178">vitest-dev/vitest#10178</a> <a href="https://github.com/vitest-dev/vitest/commit/3876283e8"><!-- raw HTML omitted -->(38762)<!-- raw HTML omitted --></a></li> <li>Fail <code>expect.poll</code> when function didn't resolve in time - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> and <strong>OpenAI Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10233">vitest-dev/vitest#10233</a> <a href="https://github.com/vitest-dev/vitest/commit/4df048c11"><!-- raw HTML omitted -->(4df04)<!-- raw HTML omitted --></a></li> <li>Throw an error if hoistable methods are outside the top level scope - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10460">vitest-dev/vitest#10460</a> <a href="https://github.com/vitest-dev/vitest/commit/d0b4fddcb"><!-- raw HTML omitted -->(d0b4f)<!-- raw HTML omitted --></a></li> <li><code>toHaveTextContent</code> is strict, add <code>toMatchTextContent</code> as alternative - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10473">vitest-dev/vitest#10473</a> <a href="https://github.com/vitest-dev/vitest/commit/18f303079"><!-- raw HTML omitted -->(18f30)<!-- raw HTML omitted --></a></li> <li>Don't lookup config file from ancestor directories - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>OpenAI Codex</strong> and <strong>Hiroshi Ogawa</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10428">vitest-dev/vitest#10428</a> <a href="https://github.com/vitest-dev/vitest/commit/945d9090e"><!-- raw HTML omitted -->(945d9)<!-- raw HTML omitted --></a></li> <li>Inline <code>@vitest/runner</code> package, do not publish it anymore - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10511">vitest-dev/vitest#10511</a> <a href="https://github.com/vitest-dev/vitest/commit/6d6e46b1e"><!-- raw HTML omitted -->(6d6e4)<!-- raw HTML omitted --></a></li> <li>Allow mutating happy-dom/jsdom window object - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>OpenAI Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10373">vitest-dev/vitest#10373</a> <a href="https://github.com/vitest-dev/vitest/commit/206e8cff8"><!-- raw HTML omitted -->(206e8)<!-- raw HTML omitted --></a></li> <li>Expose <code>concurrencyId</code>/<code>workerId</code> on TestModule's diagnostics, make id 1-based - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10516">vitest-dev/vitest#10516</a> <a href="https://github.com/vitest-dev/vitest/commit/bdd985433"><!-- raw HTML omitted -->(bdd98)<!-- raw HTML omitted --></a></li> <li>Add <code>screenshotDirectory</code> config to <code>browser.expect.toMatchScreenshot</code> - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10592">vitest-dev/vitest#10592</a> <a href="https://github.com/vitest-dev/vitest/commit/a60ded0fb"><!-- raw HTML omitted -->(a60de)<!-- raw HTML omitted --></a></li> <li>Update <code>@sinonjs/fake-timers</code> and support mocking <code>Temporal</code> - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>OpenCode (gpt-5.6-sol)</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10654">vitest-dev/vitest#10654</a> <a href="https://github.com/vitest-dev/vitest/commit/f8b1532fe"><!-- raw HTML omitted -->(f8b15)<!-- raw HTML omitted --></a></li> <li>Remove webdriverio package - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10675">vitest-dev/vitest#10675</a> <a href="https://github.com/vitest-dev/vitest/commit/5fed68f72"><!-- raw HTML omitted -->(5fed6)<!-- raw HTML omitted --></a></li> <li>Clear mocks by default before each test - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10613">vitest-dev/vitest#10613</a> <a href="https://github.com/vitest-dev/vitest/commit/0f6463bf2"><!-- raw HTML omitted -->(0f646)<!-- raw HTML omitted --></a></li> <li>Don't emit localStorage warnings on Node 26, fail gracefully when worker fails to start - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10293">vitest-dev/vitest#10293</a> <a href="https://github.com/vitest-dev/vitest/commit/334edef92"><!-- raw HTML omitted -->(334ed)<!-- raw HTML omitted --></a></li> <li>Separate config resolution from the server creation - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10554">vitest-dev/vitest#10554</a> <a href="https://github.com/vitest-dev/vitest/commit/1c0ec3444"><!-- raw HTML omitted -->(1c0ec)<!-- raw HTML omitted --></a></li> <li>Inline projects extend the root config 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/10750">vitest-dev/vitest#10750</a> <a href="https://github.com/vitest-dev/vitest/commit/fec001ad3"><!-- raw HTML omitted -->(fec00)<!-- raw HTML omitted --></a></li> <li>Enable mocking Temporal without fake timers - by <a href="https://github.com/fabon-f"><code>@fabon-f</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>OpenCode (gpt-5.6-sol)</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10757">vitest-dev/vitest#10757</a> <a href="https://github.com/vitest-dev/vitest/commit/ac2d46b42"><!-- raw HTML omitted -->(ac2d4)<!-- raw HTML omitted --></a></li> <li>Support nested 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/10846">vitest-dev/vitest#10846</a> <a href="https://github.com/vitest-dev/vitest/commit/ec367cf2a"><!-- raw HTML omitted -->(ec367)<!-- raw HTML omitted --></a></li> <li>Use <code>></code> as separator in <code>-t</code>, calculate <code>only</code> once - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10686">vitest-dev/vitest#10686</a> <a href="https://github.com/vitest-dev/vitest/commit/a0b20bc86"><!-- raw HTML omitted -->(a0b20)<!-- raw HTML omitted --></a></li> <li>Fail the test when an asynchronous assertion is not awaited - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10868">vitest-dev/vitest#10868</a> <a href="https://github.com/vitest-dev/vitest/commit/86d4a9da9"><!-- raw HTML omitted -->(86d4a)<!-- raw HTML omitted --></a></li> <li>Share the Vite server between inline 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/10848">vitest-dev/vitest#10848</a> <a href="https://github.com/vitest-dev/vitest/commit/d87c96ee4"><!-- raw HTML omitted -->(d87c9)<!-- raw HTML omitted --></a></li> <li>Parse files statically in vitest list 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/11088">vitest-dev/vitest#11088</a> <a href="https://github.com/vitest-dev/vitest/commit/51e949416"><!-- raw HTML omitted -->(51e94)<!-- raw HTML omitted --></a></li> <li><strong>benchmark</strong>: <ul> <li>Rewrite the public API - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10113">vitest-dev/vitest#10113</a> <a href="https://github.com/vitest-dev/vitest/commit/19f6e8947"><!-- raw HTML omitted -->(19f6e)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>browser</strong>: <ul> <li>Iframe scale - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9745">vitest-dev/vitest#9745</a> <a href="https://github.com/vitest-dev/vitest/commit/b639852cc"><!-- raw HTML omitted -->(b6398)<!-- raw HTML omitted --></a></li> <li>Enable <code>locators.exact</code> 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/10430">vitest-dev/vitest#10430</a> <a href="https://github.com/vitest-dev/vitest/commit/e203202f9"><!-- raw HTML omitted -->(e2032)<!-- raw HTML omitted --></a></li> <li>Require <code>sessionId</code> for orchestrator html request - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>OpenAI Codex</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10522">vitest-dev/vitest#10522</a> <a href="https://github.com/vitest-dev/vitest/commit/79b7d8fcc"><!-- raw HTML omitted -->(79b7d)<!-- raw HTML omitted --></a></li> <li>Save failure screenshots in <code>attachmentsDir</code> - by <a href="https://github.com/macarie"><code>@macarie</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10917">vitest-dev/vitest#10917</a> <a href="https://github.com/vitest-dev/vitest/commit/3b5bbd8b4"><!-- raw HTML omitted -->(3b5bb)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>coverage</strong>: <ul> <li><code>include/exclude</code> globs too eager - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9818">vitest-dev/vitest#9818</a> <a href="https://github.com/vitest-dev/vitest/commit/edacb0fd4"><!-- raw HTML omitted -->(edacb)<!-- raw HTML omitted --></a></li> <li>Allow <code>thresholds.perFile</code> to accept an object - by <a href="https://github.com/vladlenskiy"><code>@vladlenskiy</code></a> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10190">vitest-dev/vitest#10190</a> <a href="https://github.com/vitest-dev/vitest/commit/13b78d98b"><!-- raw HTML omitted -->(13b78)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>expect</strong>: <ul> <li>Fix <code>toThrow("")</code> behavior by reverting <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/6710">#6710</a> - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/9643">vitest-dev/vitest#9643</a> and <a href="https://redirect.github.com/vitest-dev/vitest/issues/6710">vitest-dev/vitest#6710</a> <a href="https://github.com/vitest-dev/vitest/commit/6c3e4bdbf"><!-- raw HTML omitted -->(6c3e4)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>mocker</strong>: <ul> <li>Deserialize automock as automock - by <a href="https://github.com/nami8824"><code>@nami8824</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10192">vitest-dev/vitest#10192</a> <a href="https://github.com/vitest-dev/vitest/commit/2f892712d"><!-- raw HTML omitted -->(2f892)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>reporters</strong>: <ul> <li><code>blob</code> reporter and <code>--merge-reports</code> default to <code>.vitest/blob/</code> - by <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10232">vitest-dev/vitest#10232</a> <a href="https://github.com/vitest-dev/vitest/commit/d22b029ae"><!-- raw HTML omitted -->(d22b0)<!-- raw HTML omitted --></a></li> <li>Write json and junit reporter output files to <code>.vitest</code> by default - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong>, <strong>OpenCode (gpt-5.6-sol)</strong> and <a href="https://github.com/AriPerkkio"><code>@AriPerkkio</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10621">vitest-dev/vitest#10621</a> <a href="https://github.com/vitest-dev/vitest/commit/58577290a"><!-- raw HTML omitted -->(58577)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitest-dev/vitest/commit/f441c6fab25e579c5b7dd3dd50538416f415fbae"><code>f441c6f</code></a> chore: release v5.0.0 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11130">#11130</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/d46a7472266d5bb43595ea51dcdd64ab0f560f12"><code>d46a747</code></a> fix: treat test.describe as a suite during static collection (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11128">#11128</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/584cf308437069385b0fb905fa3ff7d7b7f65a90"><code>584cf30</code></a> fix: add a warning if inline project has duplicate plugins due to unexpected ...</li> <li><a href="https://github.com/vitest-dev/vitest/commit/f08ce4b7144542af128dcb884150c42074223653"><code>f08ce4b</code></a> fix: apply queued mocks from doMock() in queue order (fixes <a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/10706">#10706</a>) (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11127">#11127</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/897f51fd2493046c52ec9539b7d02fe3763bd63e"><code>897f51f</code></a> chore: release v5.0.0-rc.4 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11107">#11107</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/1339b0655dc4679aeb8f905bacee83b6f76f6b23"><code>1339b06</code></a> chore(deps): update all non-major dependencies (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11104">#11104</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/51e9494166d8d0108a621fce80c41b6dba760bae"><code>51e9494</code></a> feat!: parse files statically in vitest list by default (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11088">#11088</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/2122ffdfb42d86c9a2f1238100d6a031312cae32"><code>2122ffd</code></a> fix: propagate --maxWorkers to projects (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11102">#11102</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/dc10f5f8fb69b026afcf56f8a7a9dd36bd964d73"><code>dc10f5f</code></a> fix(browser): report the action error when a task times out (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11101">#11101</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/d4fe1986fe334d22940039e815ccdbcc907baa6a"><code>d4fe198</code></a> feat: promote clearCache out of experimental (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11086">#11086</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitest-dev/vitest/commits/v5.0.0/packages/vitest">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> |
||
|
|
68de5de241 |
build(deps-dev): bump the npm-deps group in /src/frontend with 4 updates (#1329)
Bumps the npm-deps group in /src/frontend with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom), [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) and [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint). Updates `@types/node` from 26.4.0 to 26.5.0 <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 `@types/react-dom` from 19.2.5 to 19.2.7 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom">compare view</a></li> </ul> </details> <br /> Updates `oxfmt` from 0.65.0 to 0.67.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/oxc-project/oxc/blob/main/npm/oxfmt/CHANGELOG.md">oxfmt's changelog</a>.</em></p> <blockquote> <h2>[0.67.0] - 2026-09-07</h2> <h3>🛡️ Security</h3> <ul> <li>9a612d5 deps: Update npm packages (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26178">#26178</a>) (renovate[bot])</li> </ul> <h2>[0.64.0] - 2026-08-18</h2> <h3>🚀 Features</h3> <ul> <li>c07fe7c oxfmt: Support <code>experimentalOperatorPosition</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/25643">#25643</a>) (leaysgur)</li> </ul> <h3>📚 Documentation</h3> <ul> <li>fed6681 oxfmt: Skip expanding overrides options (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/25572">#25572</a>) (leaysgur)</li> </ul> <h2>[0.62.0] - 2026-08-03</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>e6e584b oxfmt: Type jsdoc. enum options (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/25008">#25008</a>) (leaysgur)</li> </ul> <h2>[0.59.0] - 2026-07-13</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>415fe1e oxfmt: Error on ignorePatterns that cannot match files outside the config directory (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/24286">#24286</a>) (leaysgur)</li> </ul> <h2>[0.55.0] - 2026-06-15</h2> <h3>🚀 Features</h3> <ul> <li>9a2788b linter/unicorn: Implement <code>prefer-export-from</code> rule (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/22935">#22935</a>) (AliceLanniste)</li> </ul> <h2>[0.54.0] - 2026-06-08</h2> <h3>📚 Documentation</h3> <ul> <li>dadafe3 oxlint, oxfmt: Mention migrate skills in npm READMEs (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/22965">#22965</a>) (Boshen)</li> <li>f88961a oxfmt: Annotate each config option with supported languages (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/22953">#22953</a>) (leaysgur)</li> </ul> <h2>[0.52.0] - 2026-05-26</h2> <h3>🚀 Features</h3> <ul> <li>16b8058 oxfmt: Support <code>vite-plus/resolveConfig</code> for vite.config.ts (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/22454">#22454</a>) (leaysgur)</li> </ul> <h2>[0.50.0] - 2026-05-15</h2> <h3>🐛 Bug Fixes</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/b4da00b621ec2f6f67ed218f5366c45ed325331b"><code>b4da00b</code></a> release(apps): oxlint v1.82.0 && oxfmt v0.67.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26384">#26384</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/9a612d57e5f1ad9ee6f9f0d8d67692cd430f7ecf"><code>9a612d5</code></a> chore(deps): update npm packages (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26178">#26178</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/0b4e2e67f4193e7ebfcc64982275eb583ae82c83"><code>0b4e2e6</code></a> release(apps): oxlint v1.81.0 && oxfmt v0.66.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26199">#26199</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/5ff57f83c049e338db8b2435dd92f660bfe19ed4"><code>5ff57f8</code></a> fix(formatter/sort-imports): handle custom side effect groups (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26217">#26217</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/63bc313934bf1fe94f8e0e6e59336f6036b8506e"><code>63bc313</code></a> chore(npm): update funding URL (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26066">#26066</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxfmt_v0.67.0/npm/oxfmt">compare view</a></li> </ul> </details> <br /> Updates `oxlint` from 1.80.0 to 1.82.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.82.0 & oxfmt v0.67.0</h2> <h2>Table of Contents</h2> <ul> <li><a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/blob/HEAD/#oxlint-v1.82.0">Oxlint v1.82.0</a></li> <li><a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/blob/HEAD/#oxfmt-v0.67.0">Oxfmt v0.67.0</a></li> </ul> <h2>Oxlint v1.82.0</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>66744f0 parser: [<strong>BREAKING</strong>] Rename <code>panicked</code> to <code>fatal_error</code> in <code>ParserReturn</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26382">#26382</a>) (overlookmotel)</li> </ul> <h3>🚀 Features</h3> <ul> <li>6a0e19c linter/eslint/no-unmodified-loop-condition: Support <code>checkConditionalExpressions</code> option (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26249">#26249</a>) (camc314)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>aa38ddf linter/unicorn/numeric-separators-style: Correct schema defaults (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26393">#26393</a>) (camc314)</li> <li>562dd14 jsx-a11y/anchor-has-content: Allow anchors passed as custom component props (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26360">#26360</a>) (Mikhail Baev)</li> <li>253cdb2 linter/eslint/id-length: Exempt TS interface/type-literal members with never (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26310">#26310</a>) (Pearce Ropion)</li> <li>8c7ea76 ast_visit: Account for trimmed source offsets (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26223">#26223</a>) (Cameron)</li> <li>5f9cffc linter/typescript/no-explicit-any: Fix rest parameter to <code>unknown[]</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26279">#26279</a>) (camc314)</li> <li>4de9fa3 linter/react/jsx-no-literals: Check nested JSX expression literals (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26253">#26253</a>) (camc314)</li> <li>07851b9 parser: Fix debug assert failure when lexer error with tokens enabled (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26229">#26229</a>) (overlookmotel)</li> <li>9cee146 oxlint/lsp: Don't try to parse fix message, always fallback (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26204">#26204</a>) (Sysix)</li> <li>a662c40 linter/eslint/no-useless-assignment: Handle destructuring assignments (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25925">#25925</a>) (camc314)</li> <li>304bd9a linter/eslint/no-array-constructor: Handle ASI hazards in fixer (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26166">#26166</a>) (Hamody We)</li> <li>b41bb35 linter: Qualify rules in rules output (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26250">#26250</a>) (camc314)</li> <li>895c685 linter/typescript/no-extraneous-class: Avoid deleting class expressions (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26231">#26231</a>) (camc314)</li> <li>4ba33c8 linter/eslint/no-unused-vars: Handle stored arrow references (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26225">#26225</a>) (camc314)</li> </ul> <h3>🛡️ Security</h3> <ul> <li>9a612d5 deps: Update npm packages (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26178">#26178</a>) (renovate[bot])</li> </ul> <h2>Oxfmt v0.67.0</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>66744f0 parser: [<strong>BREAKING</strong>] Rename <code>panicked</code> to <code>fatal_error</code> in <code>ParserReturn</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26382">#26382</a>) (overlookmotel)</li> <li>2c9a947 parser: [<strong>BREAKING</strong>] Reduce <code>MAX_LEN</code> to 256 bytes below <code>u32::MAX</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26352">#26352</a>) (overlookmotel)</li> </ul> <h3>🚀 Features</h3> <ul> <li>68e12ab formatter_css: Follow the oxc-css-parser's acceptance line (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26337">#26337</a>) (leaysgur)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>f7acdc0 formatter: Treat a JSDoc cast target as opaque in chain layouts (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26375">#26375</a>) (leaysgur)</li> <li>104061b formatter: Keep JSDoc cast parens with a comment inside them (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26374">#26374</a>) (leaysgur)</li> <li>3d00a76 formatter_css: Keep comment inside important and simple-vars colon (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26370">#26370</a>) (leaysgur)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </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> <h2>[1.82.0] - 2026-09-07</h2> <h3>🚀 Features</h3> <ul> <li>6a0e19c linter/eslint/no-unmodified-loop-condition: Support <code>checkConditionalExpressions</code> option (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26249">#26249</a>) (camc314)</li> </ul> <h2>[1.81.0] - 2026-08-31</h2> <h3>📚 Documentation</h3> <ul> <li>d5be037 linter/typescript/switch-exhaustiveness-check: Clarify default case comment pattern (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26100">#26100</a>) (camc314)</li> </ul> <h2>[1.79.0] - 2026-08-18</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>8c4552d linter: [<strong>BREAKING</strong>] Split react/react-compiler into per-category rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25500">#25500</a>) (Boshen)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>228e8e0 linter: Resolve inactive React compiler rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25830">#25830</a>) (Boshen)</li> <li>aa49d86 linter: Allow spread rule options in config types (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25675">#25675</a>) (ch3rry)</li> <li>36f8451 linter/eslint/no-eval: Align indirect default with ESLint (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25656">#25656</a>) (camc314)</li> <li>beb724d linter/eslint/no-unused-vars: Report bare underscore parameters (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25663">#25663</a>) (camc314)</li> <li>4004c10 linter/eslint/no-irregular-whitespace: Check comments by default (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25660">#25660</a>) (camc314)</li> <li>285820e linter/no-large-snapshots: Precompile and document allowed snapshot matchers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25611">#25611</a>) (Mikhail Baev)</li> <li>4df5835 linter: Allow capitalized built-in calls (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25516">#25516</a>) (Boshen)</li> </ul> <h2>[1.78.0] - 2026-08-10</h2> <h3>🚀 Features</h3> <ul> <li>ccb8fe8 linter/jsdoc: Implement <code>no-blank-blocks</code> rule (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25207">#25207</a>) (Mikhail Baev)</li> <li>d4a897c linter/eslint: Implement <code>one-var</code> rule (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/24470">#24470</a>) (Cole Ellison)</li> <li>5ab9340 linter/jsx-a11y/anchor-has-content: Add options to match eslint (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/24571">#24571</a>) (Cole Ellison)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>9573937 linter/typescript: Validate <code>ban-ts-comment</code> description_format (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25320">#25320</a>) (Mikhail Baev)</li> </ul> <h2>[1.77.0] - 2026-08-03</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>5c0fa61 linter/eslint/no-warning-comments: Unify config structs and remove manual options docs (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25151">#25151</a>) (Mikhail Baev)</li> </ul> <h3>📚 Documentation</h3> <ul> <li>9dc7756 linter/typescript/no-unnecessary-condition: Clarify options (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25110">#25110</a>) (camc314)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/b4da00b621ec2f6f67ed218f5366c45ed325331b"><code>b4da00b</code></a> release(apps): oxlint v1.82.0 && oxfmt v0.67.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26384">#26384</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/aa38ddfbea657a9d332f86e42e235ff8cbdcac6d"><code>aa38ddf</code></a> fix(linter/unicorn/numeric-separators-style): correct schema defaults (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26393">#26393</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/6a0e19cfaae35ec882de6bc8dde7668d1b0cc58e"><code>6a0e19c</code></a> feat(linter/eslint/no-unmodified-loop-condition): support `checkConditionalEx...</li> <li><a href="https://github.com/oxc-project/oxc/commit/0b4e2e67f4193e7ebfcc64982275eb583ae82c83"><code>0b4e2e6</code></a> release(apps): oxlint v1.81.0 && oxfmt v0.66.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26199">#26199</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/d5be0375e6303202fcd6d34fa520103eceea0238"><code>d5be037</code></a> docs(linter/typescript/switch-exhaustiveness-check): clarify default case com...</li> <li><a href="https://github.com/oxc-project/oxc/commit/63bc313934bf1fe94f8e0e6e59336f6036b8506e"><code>63bc313</code></a> chore(npm): update funding URL (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26066">#26066</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxlint_v1.82.0/npm/oxlint">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> |
||
|
|
c576003319 |
feat(naming): add {FirstAuthor} template token (#1322)
Closes #930. ## What New `{FirstAuthor}` naming-template token. It renders only the first author when metadata lists several ("Author1, Author2, Author3"), so multi-author books can be filed alongside the rest of that author's work instead of getting their own "Author1, Author2, ..." folder. ``` {Author} -> Terry Pratchett, Neil Gaiman {FirstAuthor} -> Terry Pratchett ``` ## How - Added to `KNOWN_TOKENS` in `shelfmark/core/naming.py`, positioned before `author` so `{FirstAuthor}` isn't parsed as literal `First` + `{Author}`. - Derived inside `parse_naming_template` from the existing `Author` value (split on `,` / `;`), so every caller — folder transfer, rename, the settings preview — picks it up with no extra wiring. An explicit `FirstAuthor` key in the metadata still wins if one is ever passed. - `{Author}` behaviour is unchanged. - Frontend `namingTemplatePreview.ts` token list + `KNOWN_TOKENS` kept in lockstep (there's a test enforcing that), with a matching `firstAuthor` helper. - Settings field descriptions + `docs/environment-variables.md` list the new token. ## Known limitation A lone author written `Last, First` is split on the comma too and renders as `Last` — the source metadata doesn't mark which form it is. Called out in the token help text and covered by a test. `{Author}` remains available for anyone who wants the raw string. ## Checks - `make python-test` — 2963 passed - `make python-lint` / `make python-format` / `make python-typecheck` / vulture — clean - `make frontend-test` — 187 passed · `frontend-lint` / `frontend-format` / `frontend-typecheck` — clean 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> |
||
|
|
96d1b7c33a |
Keep default filters out of the URL hash (#1314)
Follow up to #1311, per your "no use keeping empty / default values in the url". A plain author search was coming out as ``` #q=herbert&search_by=author&sort=relevance&lang=default&format=epub&format=mobi&format=azw3&format=fb2&format=djvu&format=cbz&format=cbr ``` The builder serialized every advanced filter regardless of whether the user had touched it. Now `sort` drops when it equals the sort the app would apply anyway (the provider default in Universal, the configured one in Direct), `lang` drops while it is still the `default` sentinel, and `format` drops when the selection matches `supported_formats` from the config. Formats are compared as a set, so reselecting everything in a different order still counts as default. Anything the user actually changed stays. That also makes the comment I left in the builder true: a default-state URL now carries no hash at all. The second commit is an ordering bug that omitting defaults made visible. `loadConfig`'s `initial` branch seeds `formats` from `supported_formats` and `sort` from the mode default. The URL bootstrap is gated on config being loaded, so it normally runs after that and wins on its own, but nothing guarantees only one `initial` load happens, and a second one landing after the bootstrap resets `formats` to the full supported list and drops the sort the link asked for. StrictMode double-invokes the mount effect that triggers it, so it reproduces in development: `#q=dune&format=epub&lang=en` intermittently loses its `format=epub`. The seeding is now skipped once the bootstrap has applied, so a link's filters win over the defaults they were meant to override. Five new unit tests on the builder. I also drove both the dev server and a production build in Chromium with `/api` mocked: `#search_by=author&q=herbert` settles at `#q=herbert&search_by=author`, typing a plain query gives `#q=dune`, direct mode at rest carries no hash, and `#q=dune&format=epub&lang=en` keeps both filters in the hash and in the request. That last one was 3 for 5 on the dev server before the second commit and 5 for 5 after. |
||
|
|
46d21cafbc |
Deep-link Search By mode via URL hash (#1311)
Closes #1228. Search By mode (General/Author/Title/Series/Manual), content type and the search query now live in the URL as a hash fragment, updated live as you search, not just parsed once on load. A shared/bookmarked link like `#search_by=manual&q=foundation` reopens in that exact mode with the query filled in. Following the direction from the issue thread: - Hash fragment instead of query string, so it stays browser side only. - Live updates via `history.replaceState`, no history spam per keystroke. - Default Search By persisted in a client side cookie as fallback when there's no hash, no user accounts needed. Tested manually against a local build (search-by switching, hash live update, deep link reload, cookie fallback when there's no hash, and hash overriding a stale cookie). |
||
|
|
223d8a2256 |
build(deps): bump the npm-deps group in /src/frontend with 4 updates (#1308)
Bumps the npm-deps group in /src/frontend with 4 updates: [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) and [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip). Updates `react-router-dom` from 7.18.2 to 7.18.3 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/remix-run/react-router/blob/react-router-dom@7.18.3/packages/react-router-dom/CHANGELOG.md">react-router-dom's changelog</a>.</em></p> <blockquote> <h2>v7.18.3</h2> <h3>Patch Changes</h3> <ul> <li>Updated dependencies: <ul> <li><a href="https://github.com/remix-run/react-router/releases/tag/react-router@7.18.3"><code>react-router@7.18.3</code></a></li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/remix-run/react-router/commit/23166dfe7f61323f0d2775af67d2691f9ed0843d"><code>23166df</code></a> Release v7.18.3 (<a href="https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom/issues/15424">#15424</a>)</li> <li>See full diff in <a href="https://github.com/remix-run/react-router/commits/react-router-dom@7.18.3/packages/react-router-dom">compare view</a></li> </ul> </details> <br /> Updates `@types/node` from 26.3.0 to 26.4.0 <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.0 to 6.1.1 <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.1</h2> <h3>Add <code>compiler.logDiagnostics</code> option</h3> <p>Recoverable React Compiler diagnostics are no longer logged by default. Set <code>compiler.logDiagnostics</code> to <code>true</code> to log them through Vite. Fatal diagnostics are always logged and fail the transform.</p> <h3>Respect environment sourcemap option for React Compiler transform when <code>builder.sharedPlugins</code> is enabled (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1439">#1439</a>)</h3> <p>The React Compiler transform was using the top-level sourcemap option instead of the environment sourcemap option. This caused a problem when the experimental <code>builder.sharedPlugins</code> was enabled.</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.1 (2026-08-28)</h2> <h3>Add <code>compiler.logDiagnostics</code> option</h3> <p>Recoverable React Compiler diagnostics are no longer logged by default. Set <code>compiler.logDiagnostics</code> to <code>true</code> to log them through Vite. Fatal diagnostics are always logged and fail the transform.</p> <h3>Respect environment sourcemap option for React Compiler transform when <code>builder.sharedPlugins</code> is enabled (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1439">#1439</a>)</h3> <p>The React Compiler transform was using the top-level sourcemap option instead of the environment sourcemap option. This caused a problem when the experimental <code>builder.sharedPlugins</code> was enabled.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/04cac5020e349f452d76c5a4f6d788ad4b38930a"><code>04cac50</code></a> release: plugin-react@6.1.1 (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1440">#1440</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/82d35abe4946eddd4e6456802bf2b53444e264f2"><code>82d35ab</code></a> fix(react): respect environment sourcemap option when <code>builder.sharedPlugins</code>...</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/397e8471a559f18a16dd21bd797ac01a369dabdc"><code>397e847</code></a> fix(react): make logging diagnostics an opt-in for React Compiler (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1431">#1431</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/61006e6f52124821c24121a78712f7162ae36f5b"><code>61006e6</code></a> fix(deps): update all non-major dependencies (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1433">#1433</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/e2a649cbaa7334d6991f843563683975667e1be1"><code>e2a649c</code></a> chore: use <code>deps.neverBundle</code> instead of <code>external</code> in tsdown config (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1430">#1430</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/fb2d6f3635acbb0f3acbd0e9a914f6c620460957"><code>fb2d6f3</code></a> fix(deps): update all non-major dependencies (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1427">#1427</a>)</li> <li>See full diff in <a href="https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.1/packages/plugin-react">compare view</a></li> </ul> </details> <br /> Updates `knip` from 6.32.2 to 6.34.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.34.0</h2> <ul> <li>fix: report types used only in private parameters (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1950">#1950</a>) (3c785f55ce608d7921e37e41dd5fc61b623e5da2)</li> <li>💡 Add support for <code>node:fs/promises</code> <code>glob</code> (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1977">#1977</a>) (44faf08e7f56ce695d1541a6c337b76bea0328d1) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Respect JSDoc tags on URL dependencies (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1943">#1943</a>) (f93ad0997e1b8fc644f6487df52803cba6f7a9ad)</li> <li>Make prop access consistent while at it (1c90b49b1b196795df6dcf9d7e85bc1b1399667a)</li> <li>Set an explicit Bun test timeout (964085dfab0165db2658e51cb787e2301886f9ce)</li> <li>Add note re. one scoped PRs (8f9490a581874e0fd7246e60223b20938bf4ebb1)</li> <li>fix(cli): validate numeric options instead of passing NaN through (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1975">#1975</a>) (ab90e2428a16ff50fe5323ce73172f6f1efb9730) - thanks <a href="https://github.com/devYRPauli"><code>@devYRPauli</code></a>!</li> <li>fix: compile files with workspace-scoped compilers (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1997">#1997</a>) (462ae45df33a5ee2e2185f3b2db756b13dfbadd3) - thanks <a href="https://github.com/gioboa"><code>@gioboa</code></a>!</li> <li>Resolve Nuxt <code>#shared</code> imports from the shared directory (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1991">#1991</a>) (cc470611042b01761491c21f6987549db4c11df8) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Update dependencies (c4e0f082fbd7fb508a411c7dd0a782ea4556527c)</li> <li>Declare webpack directly instead of through <code>@types/webpack</code> (96ff2df58dd1d229d077212e1cd80f10889650ca)</li> <li>Assert counters in targeted regression tests (f0cf11dfcfbdeac053bba0dd12212356a67f6464)</li> </ul> <h2>Release 6.33.0</h2> <ul> <li>Support package manifest resolution under Yarn PnP (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1946">#1946</a>) (a82efb62b290e004bdabee40bcb337baf3701a1b) - thanks <a href="https://github.com/WooWan"><code>@WooWan</code></a>!</li> <li>Resolve oxlint jsPlugins from .oxlintrc.jsonc (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1973">#1973</a>) (d055023182789555a574eaefde80dac997190437) - thanks <a href="https://github.com/DreierF"><code>@DreierF</code></a>!</li> <li>Update dependency bun to v1.4.0 (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1964">#1964</a>) (937ab38ad514a00edafecff4ca04603b015bf921) - thanks <a href="https://github.com/renovate"><code>@renovate</code></a>[bot]!</li> <li>Expose <code>defineConfig</code> on a <code>./config</code> entrypoint (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1960">#1960</a>) (17f7a6051d9781860f248cc2a745dbe837713cd9) - thanks <a href="https://github.com/theRizwan"><code>@theRizwan</code></a>!</li> <li>Preserve all environment variables in exec.ts (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1979">#1979</a>) (c0a9ecf8d1c0cdd7789c1e1bea893706c060239d) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Add support for TypeScript content mappers (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1978">#1978</a>) (db67f9bd8cebf0ea3c298690d462c154827aa462) - thanks <a href="https://github.com/remcohaszing"><code>@remcohaszing</code></a>!</li> <li>fix(vitest): resolve array entries and root-relative setup dependencies (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1982">#1982</a>) (0ecf48538c339437e6f9dfe9a6013d307783cbd3) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Fix type annotation in dynamic configuration function example (ada88c7f01563b73643af34a147a71fd9ab9d2dc)</li> <li>Format docs with remark (7764c2a4ebecdbf226c19494d255d9cb14550822)</li> <li>Throw on configuration that is not an object (d7ac0cf1de8f79be6ec53412cac9f7edf8f35ba7)</li> <li>Clarify dependency inputs, isTypeOnly and toConfig in plugin docs (2bd367961554ad1addb520bdfad5e31125885969)</li> <li>Resolve content mapper process from package.json#typescript.contentMapper.exec (74640c03e450624409692f4cc17699775108fd7e)</li> <li>Encode argv arrays before parsing them as shell commands (b79234c15153fbf592e82c94e4e4e9f41b4479e0)</li> <li>Update dependencies (28510146c2b97d88f7188f1239b9307aac7dbf0c)</li> <li>Replace non-breaking space in module graph comment (4e22bfcd09deccc92ed158f5554fe3e03f3a2c51)</li> <li>Update fix format test for oxfmt package.json key sorting (65011bf6054d03fb5580f3381867b07d1b8a9a0c)</li> <li>fix(webpack): resolve entry descriptors using import field (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1981">#1981</a>) (cad8910e7fb89c2510fc9f5885289335dd4e60da) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>fix: count enum element access as a whole-object read (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1958">#1958</a>) (5a47d603aa23b388ae7ce4fe301656f1abc43b14) - thanks <a href="https://github.com/addielaruee"><code>@addielaruee</code></a>!</li> <li>Resolve oxlint/vite-plus import resolvers from <code>settings</code> (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1983">#1983</a>) (c1165b70efe27398b86fa50bcea7d85c253d3ee7) - thanks <a href="https://github.com/DreierF"><code>@DreierF</code></a>!</li> <li>fix(nuxt): resolve string extends configs (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1984">#1984</a>) (4a5d7068d6264ea45c78c832abe7ba052763517e) - thanks <a href="https://github.com/DreamLongYT"><code>@DreamLongYT</code></a>!</li> <li>Wrap up webpack entry resolution (505decdb821f9b76d194742cee7e98c75ef7d8e9)</li> <li>Keep element access precise for number-like enum member names (bcbac3a8b8283da3b32256584b3cc6569ae5c02f)</li> <li>Resolve <code>Object.*</code> enum enumeration through import aliases (347967daaed817ca20e1ad6148388a66ec8b421b)</li> <li>Resolve named string-key access on namespace-qualified enums (2ac1fbc1e92f3dae662ca4d4701cf010346be49a)</li> <li>Normalize line endings in nuxt-config-string fixture (9fe2b2b2db8690685ec7c6cf8b3d39b9ed7b3fdc)</li> <li>Resolve nuxt layer sources from all <code>extends</code> entry shapes (db136151d9f98801837b33646ef7b02ae7b5a86d)</li> <li>Report unused exports behind Vitest module promise mocks (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1966">#1966</a>) (74954c219367ca1577184cca08c30dbb3fb6222e)</li> <li>Check line endings against <code>.gitattributes</code> in <code>pnpm run ci</code> (ddc9fd0cc3328260665203c8573702bb6c9d0dd6)</li> </ul> <h2>Release 6.32.3</h2> <ul> <li>Update sentry production snapshot (9f18cba93c91de8554636b13692d6e7a937b7697)</li> <li>Pin TypeScript ecosystem test (de5162952d223050f3135afb02d4e8de6d46f381)</li> <li>Update query snapshot (f6964dd577d8f7967f9be6778f5c3953632e3c96)</li> <li>fix(tsup): match config files with .cts and .mts extensions (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1938">#1938</a>) (68d6f52f7913cfa1e36618e6b03f90734da34149) - thanks <a href="https://github.com/codeAnqiang-ma"><code>@codeAnqiang-ma</code></a>!</li> <li>fix(lefthook): match all config file names and extensions (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1940">#1940</a>) (4015ae0330c78e97360a2c8f697d17f82c5c24ae) - thanks <a href="https://github.com/codeAnqiang-ma"><code>@codeAnqiang-ma</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/4ffebb746c630147c5d94c14da0bafb60af3c027"><code>4ffebb7</code></a> Release knip@6.34.0</li> <li><a href="https://github.com/webpro-nl/knip/commit/f0cf11dfcfbdeac053bba0dd12212356a67f6464"><code>f0cf11d</code></a> Assert counters in targeted regression tests</li> <li><a href="https://github.com/webpro-nl/knip/commit/96ff2df58dd1d229d077212e1cd80f10889650ca"><code>96ff2df</code></a> Declare webpack directly instead of through <code>@types/webpack</code></li> <li><a href="https://github.com/webpro-nl/knip/commit/c4e0f082fbd7fb508a411c7dd0a782ea4556527c"><code>c4e0f08</code></a> Update dependencies</li> <li><a href="https://github.com/webpro-nl/knip/commit/cc470611042b01761491c21f6987549db4c11df8"><code>cc47061</code></a> Resolve Nuxt <code>#shared</code> imports from the shared directory (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1991">#1991</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/462ae45df33a5ee2e2185f3b2db756b13dfbadd3"><code>462ae45</code></a> fix: compile files with workspace-scoped compilers (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1997">#1997</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/ab90e2428a16ff50fe5323ce73172f6f1efb9730"><code>ab90e24</code></a> fix(cli): validate numeric options instead of passing NaN through (<a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1975">#1975</a>)</li> <li><a href="https://github.com/webpro-nl/knip/commit/964085dfab0165db2658e51cb787e2301886f9ce"><code>964085d</code></a> Set an explicit Bun test timeout</li> <li><a href="https://github.com/webpro-nl/knip/commit/1c90b49b1b196795df6dcf9d7e85bc1b1399667a"><code>1c90b49</code></a> Make prop access consistent while at it</li> <li><a href="https://github.com/webpro-nl/knip/commit/f93ad0997e1b8fc644f6487df52803cba6f7a9ad"><code>f93ad09</code></a> Respect JSDoc tags on URL dependencies (resolve <a href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1943">#1943</a>)</li> <li>Additional commits viewable in <a href="https://github.com/webpro-nl/knip/commits/knip@6.34.0/packages/knip">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> |
||
|
|
3d7ea40088 |
fix(search): reach the server's deadline, query one author (#1285, #1252) (#1287)
Two independent reasons a working search reported failure to the user. 1. The client gave up before the server did (#1285) `/api/releases` bounds one release search with RELEASE_SEARCH_TIMEOUT (default 300s) and answers a spent budget with a sentence naming the real cause - the machinery added for #1276. The frontend then aborted the direct_download search at a hard-coded 180s, so it always won the race: the user saw "Request timed out. Check your network connection or proxy configuration." instead, and raising RELEASE_SEARCH_TIMEOUT changed nothing they could observe, the 180s being baked into the hashed bundle inside the image. - /api/config reports the effective (clamped) budget, and the client derives its abort from it plus a margin, so the server always answers first. - Direct-mode search shows what the server actually said. Every non-auth failure was relabelled "Unable to reach download source. Network may be restricted or mirrors blocked.", which discarded the explanation and blamed the user's network. ApiResponseError now carries `serverMessage`, set only when the server explained itself, so the status-line placeholder still falls back. Two latency fixes for the cost that made the timeout reachable at all: - Fetch each distinct AA search URL once per search. The language-filter retry re-runs every title variant, and with DIRECT_DOWNLOAD_LANGUAGE_FROM_PATH on both passes build a byte-identical URL - behind DDoS-Guard each repeat is a fresh browser solve. - Drop the solve-only bypass method. `_bypass_method_cdp_gui_click` opens with exactly that call and returns the moment it works, so the entry ahead of it could only repeat the half that had already failed, plus the backoff before the method that does work started. Reported at 0/19 successes and ~5.5s of each ~26s solve against DDoS-Guard. 2. The query carried every contributor, not one author (#1252) `_pick_search_author` returned `book.search_author` verbatim while the authors[] fallback beside it deliberately narrowed to the first name before a comma. Both fields routinely arrive holding every contributor joined with ", ": the frontend builds `book.author` as `authors.join(', ')` for display (bookTransformers.ts) and the release modal sends that display string straight back as the `author` parameter, and `browse_record_to_book_metadata` and the manual-search branch both split the joined text into `authors` while still passing the unsplit string as `search_author`, so the split was never used. A book whose metadata lists translators was therefore searched for as Blindness Jose Saramago, Giovanni Pontiero, <persian translator> which matches nothing on Anna's Archive. The bypass succeeds, the search comes back empty, and the user is told the book has no releases. Narrowed in one place, `search_plan.first_author`, so the two branches cannot drift apart again, and applied to the IRC source, which built its query with the same verbatim preference. Hardcover is unaffected: it already sets `search_author` from `_simplify_author_for_search(authors[0])`, which resolves "Last, First" itself and never yields a multi-author string. |
||
|
|
3937ae119b |
feat(homepage): Always show controls (#1269)
I found using the main search menu frustrating. Often times, I would type in what I want, then select the category, only for it to get erased. And the menu closing over and over was distracting. So this PR makes the buttons stick around permanently and it removes the search field text changing with each button press. Obviously, this is just what I want, but I figured I'd at least put a PR up for it. <img width="1017" height="423" alt="image" src="https://github.com/user-attachments/assets/7b84fd69-d6d3-4749-842f-e04a6e792ccc" /> <img width="682" height="418" alt="image" src="https://github.com/user-attachments/assets/82a251ee-cb4a-488f-b1ba-45fb2bb6714d" /> |
||
|
|
be41a92436 |
build(deps-dev): bump the npm-deps group in /src/frontend with 7 updates (#1279)
Bumps the npm-deps group in /src/frontend with 7 updates: | Package | From | To | | --- | --- | --- | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.2.0` | `26.3.0` | | [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) | `19.2.4` | `19.2.5` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.5` | `6.1.0` | | [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) | `0.63.0` | `0.65.0` | | [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) | `1.78.0` | `1.80.0` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.2.1` | `8.2.2` | | [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.10` | `4.1.11` | Updates `@types/node` from 26.2.0 to 26.3.0 <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 `@types/react-dom` from 19.2.4 to 19.2.5 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom">compare view</a></li> </ul> </details> <br /> Updates `@vitejs/plugin-react` from 6.0.5 to 6.1.0 <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.0</h2> <h3>Add experimental native React Compiler support (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1419">#1419</a>)</h3> <p>Add experimental native React Compiler support.</p> <p>You can use it by installing <code>oxc-transform-react</code> and enabling it via the <code>compiler</code> option:</p> <pre lang="sh"><code>npm install -D oxc-transform-react </code></pre> <pre lang="js"><code>import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' <p>export default defineConfig({<br /> plugins: [<br /> react({ compiler: true })<br /> ]<br /> })<br /> </code></pre></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.0 (2026-08-19)</h2> <h3>Add experimental native React Compiler support (<a href="https://redirect.github.com/vitejs/vite-plugin-react/pull/1419">#1419</a>)</h3> <p>Add experimental native React Compiler support.</p> <p>You can use it by installing <code>oxc-transform-react</code> and enabling it via the <code>compiler</code> option:</p> <pre lang="sh"><code>npm install -D oxc-transform-react </code></pre> <pre lang="js"><code>import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' <p>export default defineConfig({<br /> plugins: [<br /> react({ compiler: true })<br /> ]<br /> })<br /> </code></pre></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/39b31735bf79c2dd380eedaba7ed849256f92a29"><code>39b3173</code></a> release: plugin-react@6.1.0 (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1428">#1428</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/f1340b0c760b1c16e1b780eeba46fd933ddd52eb"><code>f1340b0</code></a> feat(react): add native React Compiler support (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1419">#1419</a>)</li> <li><a href="https://github.com/vitejs/vite-plugin-react/commit/9ab698eafc38ffa14861db450291ed2f6f557557"><code>9ab698e</code></a> fix(deps): update all non-major dependencies (<a href="https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react/issues/1375">#1375</a>)</li> <li>See full diff in <a href="https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.0/packages/plugin-react">compare view</a></li> </ul> </details> <br /> Updates `oxfmt` from 0.63.0 to 0.65.0 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/97e99b85483776a72928d675cc05b1cfc1130ba0"><code>97e99b8</code></a> release(apps): oxlint v1.80.0 && oxfmt v0.65.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26045">#26045</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/0db127cc16d28b97d84bac4ebeb302caf1a78c7e"><code>0db127c</code></a> release(apps): oxlint v1.79.0 && oxfmt v0.64.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/25866">#25866</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/c07fe7c217774fd404740d34ee91ac03a6b726c2"><code>c07fe7c</code></a> feat(oxfmt): support <code>experimentalOperatorPosition</code> (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/25643">#25643</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/fed6681edaf3b9b45fbcc8fd7f987c86505d0b86"><code>fed6681</code></a> docs(oxfmt): skip expanding overrides options (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/25572">#25572</a>)</li> <li>See full diff in <a href="https://github.com/oxc-project/oxc/commits/oxfmt_v0.65.0/npm/oxfmt">compare view</a></li> </ul> </details> <br /> Updates `oxlint` from 1.78.0 to 1.80.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.80.0 & oxfmt v0.65.0</h2> <h2>Table of Contents</h2> <ul> <li><a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/blob/HEAD/#oxlint-v1.80.0">Oxlint v1.80.0</a></li> <li><a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/blob/HEAD/#oxfmt-v0.65.0">Oxfmt v0.65.0</a></li> </ul> <h2>Oxlint v1.80.0</h2> <h3>🚀 Features</h3> <ul> <li>70c3e35 linter/typescript/no-confusing-non-null-assertion: Implement suggestion (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26012">#26012</a>) (Mikhail Baev)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>17ae11c linter/oxc/double-comparisons: Handle grouped logical expressions (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26044">#26044</a>) (camc314)</li> <li>8a353a7 linter/eslint/no-control-regex: Refine help message text (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25996">#25996</a>) (Rahul Mishra)</li> <li>8a9bdbd estree: Include decorators in <code>FormalParameterRest </code> spans (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26021">#26021</a>) (camc314)</li> <li>8d94cd1 linter/eslint/no-useless-rename: Preserve type modifiers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26020">#26020</a>) (Cameron)</li> <li>2cde1f6 rust: Address nightly deprecations (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25998">#25998</a>) (Boshen)</li> <li>51d36d7 linter/vue: Resolve <code>vue</code> imports via shared import helpers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25903">#25903</a>) (Connor Shea)</li> <li>83a68d2 linter/react/no-react-children: Resolve <code>react</code> imports by symbol (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25901">#25901</a>) (Connor Shea)</li> <li>124e196 linter: Resolve globals by reference, not by name (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25905">#25905</a>) (Connor Shea)</li> <li>a701bcc linter: Remove invalid React compiler doc links (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25900">#25900</a>) (Boshen)</li> </ul> <h3>📚 Documentation</h3> <ul> <li>9b7e153 linter: Set <code>version</code> to 1.79.0 for rules shipped in 1.79.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25902">#25902</a>) (connorshea)</li> </ul> <h2>Oxfmt v0.65.0</h2> <h3>🐛 Bug Fixes</h3> <ul> <li>bf37dd5 formatter: Preserve class decorators before export when the statement is suppressed (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26034">#26034</a>) (leaysgur)</li> </ul> <h2>oxlint v1.79.0 & oxfmt v0.64.0</h2> <h2>Table of Contents</h2> <ul> <li><a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/blob/HEAD/#oxlint-v1.79.0">Oxlint v1.79.0</a></li> <li><a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/blob/HEAD/#oxfmt-v0.64.0">Oxfmt v0.64.0</a></li> </ul> <h2>Oxlint v1.79.0</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>8c4552d linter: [<strong>BREAKING</strong>] Split react/react-compiler into per-category rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25500">#25500</a>) (Boshen)</li> </ul> <p>See <a href="https://oxc.rs/blog/2026-08-18-react-compiler-support">React Compiler Support</a> for details.</p> <h3>🚀 Features</h3> <ul> <li>9b7394e linter/typescript/no-empty-object-type: Implement suggestion (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25833">#25833</a>) (Mikhail Baev)</li> </ul> <h3>🐛 Bug Fixes</h3> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </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.79.0] - 2026-08-18</h2> <h3>💥 BREAKING CHANGES</h3> <ul> <li>8c4552d linter: [<strong>BREAKING</strong>] Split react/react-compiler into per-category rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25500">#25500</a>) (Boshen)</li> </ul> <h3>🐛 Bug Fixes</h3> <ul> <li>228e8e0 linter: Resolve inactive React compiler rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25830">#25830</a>) (Boshen)</li> <li>aa49d86 linter: Allow spread rule options in config types (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25675">#25675</a>) (ch3rry)</li> <li>36f8451 linter/eslint/no-eval: Align indirect default with ESLint (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25656">#25656</a>) (camc314)</li> <li>beb724d linter/eslint/no-unused-vars: Report bare underscore parameters (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25663">#25663</a>) (camc314)</li> <li>4004c10 linter/eslint/no-irregular-whitespace: Check comments by default (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25660">#25660</a>) (camc314)</li> <li>285820e linter/no-large-snapshots: Precompile and document allowed snapshot matchers (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25611">#25611</a>) (Mikhail Baev)</li> <li>4df5835 linter: Allow capitalized built-in calls (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25516">#25516</a>) (Boshen)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/oxc-project/oxc/commit/97e99b85483776a72928d675cc05b1cfc1130ba0"><code>97e99b8</code></a> release(apps): oxlint v1.80.0 && oxfmt v0.65.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26045">#26045</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/0db127cc16d28b97d84bac4ebeb302caf1a78c7e"><code>0db127c</code></a> release(apps): oxlint v1.79.0 && oxfmt v0.64.0 (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25866">#25866</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/228e8e0f85c0e7aeded02c5e27fd810004d3b41a"><code>228e8e0</code></a> fix(linter): resolve inactive React compiler rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25830">#25830</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/aa49d860465e6c00b6edfcbb8973d8dc95cc11ca"><code>aa49d86</code></a> fix(linter): allow spread rule options in config types (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25675">#25675</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/892238149b7c4dff808817ec5e27d1e0ecf63b11"><code>8922381</code></a> refactor(linter): remove inactive react config rule (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25740">#25740</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/8c4552dfa6bce0a9f06f41ca13e45e50d842c38c"><code>8c4552d</code></a> feat(linter)!: split react/react-compiler into per-category rules (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25500">#25500</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/36f845168ce854c1c970fea13997e16a18cbe55f"><code>36f8451</code></a> fix(linter/eslint/no-eval): align indirect default with ESLint (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25656">#25656</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/beb724dce2e8b8466d851c04e16c38fa75623c5c"><code>beb724d</code></a> fix(linter/eslint/no-unused-vars): report bare underscore parameters (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25663">#25663</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/4004c101ca349f8e92932f6d056b18bfb4dff9a7"><code>4004c10</code></a> fix(linter/eslint/no-irregular-whitespace): check comments by default (<a href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25660">#25660</a>)</li> <li><a href="https://github.com/oxc-project/oxc/commit/285820eed6c49a45f8de18d3bfed1cc6b5d9da6d"><code>285820e</code></a> fix(linter/no-large-snapshots): precompile and document allowed snapshot matc...</li> <li>Additional commits viewable in <a href="https://github.com/oxc-project/oxc/commits/oxlint_v1.80.0/npm/oxlint">compare view</a></li> </ul> </details> <br /> Updates `vite` from 8.2.1 to 8.2.2 <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>plugin-legacy@8.2.2</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/plugin-legacy@8.2.2/packages/plugin-legacy/CHANGELOG.md">CHANGELOG.md</a> for details.</p> <h2>v8.2.2</h2> <p>Please refer to <a href="https://github.com/vitejs/vite/blob/v8.2.2/packages/vite/CHANGELOG.md">CHANGELOG.md</a> for details.</p> </blockquote> </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.2.1...v8.2.2">8.2.2</a> (2026-08-20)<!-- raw HTML omitted --></h2> <h3>Features</h3> <ul> <li><strong>deps:</strong> widen <code>@vitejs/devtools</code> peer range to v0.5.0 (<a href="https://redirect.github.com/vitejs/vite/issues/23302">#23302</a>) (<a href="https://github.com/vitejs/vite/commit/495d9ff5a7d843ca876a9e49799947a5deb704c7">495d9ff</a>)</li> </ul> <h3>Bug Fixes</h3> <ul> <li><strong>bundled-dev:</strong> handle lazy request error (<a href="https://redirect.github.com/vitejs/vite/issues/23291">#23291</a>) (<a href="https://github.com/vitejs/vite/commit/3ba026dade4af56df08815310d3458fa110f5c5c">3ba026d</a>)</li> <li><strong>bundled-dev:</strong> hot update through circular imports instead of reloading (<a href="https://redirect.github.com/vitejs/vite/issues/23259">#23259</a>) (<a href="https://github.com/vitejs/vite/commit/3dbddefaafc091a879b06f9279296f776691e455">3dbddef</a>)</li> <li><strong>config:</strong> resolve sourcemap paths against sourcemap location (<a href="https://redirect.github.com/vitejs/vite/issues/23239">#23239</a>) (<a href="https://github.com/vitejs/vite/commit/05a003e6a17a84d75f907ea0f1598bc39b8dce6c">05a003e</a>)</li> <li><strong>css:</strong> don't pass empty targets to lightningcss (<a href="https://redirect.github.com/vitejs/vite/issues/23295">#23295</a>) (<a href="https://github.com/vitejs/vite/commit/2804636ff608d105928009d274ffba7cfbe55340">2804636</a>)</li> <li><strong>define:</strong> fix match escaped dots to support $-prefixed define keys (<a href="https://redirect.github.com/vitejs/vite/issues/23249">#23249</a>) (<a href="https://github.com/vitejs/vite/commit/dcf88bd2ad2b1a8845f9029587cc8c825e382d42">dcf88bd</a>)</li> <li><strong>deps:</strong> update all non-major dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23217">#23217</a>) (<a href="https://github.com/vitejs/vite/commit/ba958bddfc9cabe302c6b34269dcf5c9634531e0">ba958bd</a>)</li> <li><strong>deps:</strong> update rolldown-related dependencies (<a href="https://redirect.github.com/vitejs/vite/issues/23218">#23218</a>) (<a href="https://github.com/vitejs/vite/commit/83ecb2c8059e8ce946a7cc835d4c14ef78aef4fd">83ecb2c</a>)</li> <li><strong>module-runner:</strong> exclude completed modules from in-flight cycle detection (fix <a href="https://redirect.github.com/vitejs/vite/issues/22999">#22999</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23009">#23009</a>) (<a href="https://github.com/vitejs/vite/commit/d9b10a98db1c293ee64300bd75d568b44c8ae931">d9b10a9</a>)</li> <li><strong>optimizer:</strong> close custom extension analysis bundles (<a href="https://redirect.github.com/vitejs/vite/issues/23207">#23207</a>) (<a href="https://github.com/vitejs/vite/commit/8fb76752836f61224d3095b502fa237b478a06b2">8fb7675</a>)</li> <li>reduce Windows 8.3-short-name detection false-positives (<a href="https://redirect.github.com/vitejs/vite/issues/23066">#23066</a>) (<a href="https://github.com/vitejs/vite/commit/02cffa9e2d38d5d8f12e4043ee9d0f7abb1471e2">02cffa9</a>)</li> <li>respect <code>resolve.preserveSymlinks</code> when resolving root (fix <a href="https://redirect.github.com/vitejs/vite/issues/23197">#23197</a>) (<a href="https://redirect.github.com/vitejs/vite/issues/23198">#23198</a>) (<a href="https://github.com/vitejs/vite/commit/8413052731836d4aaf3eb94a0f25788dd35d2888">8413052</a>)</li> <li><strong>ssr:</strong> rewrite computed key of destructing parameter (<a href="https://redirect.github.com/vitejs/vite/issues/23307">#23307</a>) (<a href="https://github.com/vitejs/vite/commit/9db0b61d4c9c7caad7ea1d9670b637faf2bb6c93">9db0b61</a>)</li> <li><strong>vite:</strong> update outdated upstream file links in license comments (<a href="https://redirect.github.com/vitejs/vite/issues/23285">#23285</a>) (<a href="https://github.com/vitejs/vite/commit/c0f2fc607ee97ee4499337b04826420c00654065">c0f2fc6</a>)</li> </ul> <h3>Documentation</h3> <ul> <li><strong>build:</strong> note cssTarget precedence (<a href="https://redirect.github.com/vitejs/vite/issues/23200">#23200</a>) (<a href="https://github.com/vitejs/vite/commit/a20a35ec0685e374519864d0f41dd5f6e9ba0271">a20a35e</a>)</li> </ul> <h3>Miscellaneous Chores</h3> <ul> <li>fix ts errors in build test cases (<a href="https://redirect.github.com/vitejs/vite/issues/23209">#23209</a>) (<a href="https://github.com/vitejs/vite/commit/a0cfcf72f8ef8bf0f2f11d553333b9bb31f1d316">a0cfcf7</a>)</li> </ul> <h3>Code Refactoring</h3> <ul> <li>use JSON import attributes instead of readFileSync in constants (<a href="https://redirect.github.com/vitejs/vite/issues/23258">#23258</a>) (<a href="https://github.com/vitejs/vite/commit/1d9fa392a43229241f80630236f8552ce8f7cd0f">1d9fa39</a>)</li> <li>use named regex constants over inline literals (<a href="https://redirect.github.com/vitejs/vite/issues/22964">#22964</a>) (<a href="https://github.com/vitejs/vite/commit/5c1c6c609718303202832f706884192e1f1e9223">5c1c6c6</a>)</li> </ul> <h3>Tests</h3> <ul> <li><strong>define:</strong> close rolldown bundler after generate (<a href="https://redirect.github.com/vitejs/vite/issues/23231">#23231</a>) (<a href="https://github.com/vitejs/vite/commit/b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab">b4d66fe</a>)</li> <li><strong>module-runner:</strong> add TLA circular import case (<a href="https://redirect.github.com/vitejs/vite/issues/23299">#23299</a>) (<a href="https://github.com/vitejs/vite/commit/4a261f242831bef92afd2f1aacfb81eab9dec371">4a261f2</a>)</li> <li><strong>module-runner:</strong> simplify server-hmr tests (<a href="https://redirect.github.com/vitejs/vite/issues/23300">#23300</a>) (<a href="https://github.com/vitejs/vite/commit/599b44b6600ec426e10cd556908d53b027b0c4fb">599b44b</a>)</li> <li><strong>ssr:</strong> add destructing assignment case for moduleRunnerTransform (<a href="https://redirect.github.com/vitejs/vite/issues/23308">#23308</a>) (<a href="https://github.com/vitejs/vite/commit/cb77e2a93bad2a8ece00b4aa0ef507c092582c45">cb77e2a</a>)</li> </ul> <h3>Build System</h3> <ul> <li>use JSON import attributes instead of readFIleSync in rolldown configs (<a href="https://redirect.github.com/vitejs/vite/issues/23251">#23251</a>) (<a href="https://github.com/vitejs/vite/commit/d615bcdb23d96c1ca5ce1ee45e21d8d87381106f">d615bcd</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitejs/vite/commit/de1111ab0be00879b404e7ed3b2a80e264edddc1"><code>de1111a</code></a> release: v8.2.2</li> <li><a href="https://github.com/vitejs/vite/commit/cb77e2a93bad2a8ece00b4aa0ef507c092582c45"><code>cb77e2a</code></a> test(ssr): add destructing assignment case for moduleRunnerTransform (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23308">#23308</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/9db0b61d4c9c7caad7ea1d9670b637faf2bb6c93"><code>9db0b61</code></a> fix(ssr): rewrite computed key of destructing parameter (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23307">#23307</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/8413052731836d4aaf3eb94a0f25788dd35d2888"><code>8413052</code></a> fix: respect <code>resolve.preserveSymlinks</code> when resolving root (fix <a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23197">#23197</a>) (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23">#23</a>...</li> <li><a href="https://github.com/vitejs/vite/commit/05a003e6a17a84d75f907ea0f1598bc39b8dce6c"><code>05a003e</code></a> fix(config): resolve sourcemap paths against sourcemap location (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23239">#23239</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/495d9ff5a7d843ca876a9e49799947a5deb704c7"><code>495d9ff</code></a> feat(deps): widen <code>@vitejs/devtools</code> peer range to v0.5.0 (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23302">#23302</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/1d9fa392a43229241f80630236f8552ce8f7cd0f"><code>1d9fa39</code></a> refactor: use JSON import attributes instead of readFileSync in constants (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/2">#2</a>...</li> <li><a href="https://github.com/vitejs/vite/commit/2804636ff608d105928009d274ffba7cfbe55340"><code>2804636</code></a> fix(css): don't pass empty targets to lightningcss (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23295">#23295</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/599b44b6600ec426e10cd556908d53b027b0c4fb"><code>599b44b</code></a> test(module-runner): simplify server-hmr tests (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23300">#23300</a>)</li> <li><a href="https://github.com/vitejs/vite/commit/4a261f242831bef92afd2f1aacfb81eab9dec371"><code>4a261f2</code></a> test(module-runner): add TLA circular import case (<a href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/23299">#23299</a>)</li> <li>Additional commits viewable in <a href="https://github.com/vitejs/vite/commits/v8.2.2/packages/vite">compare view</a></li> </ul> </details> <br /> Updates `vitest` from 4.1.10 to 4.1.11 <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>v4.1.11</h2> <h3> 🐞 Bug Fixes</h3> <ul> <li>Revive global concurrency limit for test lifecycle [backport to v4] - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> and <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10992">vitest-dev/vitest#10992</a> <a href="https://github.com/vitest-dev/vitest/commit/5146df80b"><!-- raw HTML omitted -->(5146d)<!-- raw HTML omitted --></a></li> <li><strong>browser</strong>: <ul> <li>Encode iframeId in tester iframe URL [backport to v4] - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a>, <strong>Pduhard</strong> and <strong>Claude Opus 4.8</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10955">vitest-dev/vitest#10955</a> <a href="https://github.com/vitest-dev/vitest/commit/10b2cd201"><!-- raw HTML omitted -->(10b2c)<!-- raw HTML omitted --></a></li> <li>Trigger playwright/chromium gc on lower disk availability [backport to v4] - by <a href="https://github.com/hi-ogawa"><code>@hi-ogawa</code></a>, <strong>Hiroshi Ogawa</strong> and <strong>OpenCode</strong> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10951">vitest-dev/vitest#10951</a> <a href="https://github.com/vitest-dev/vitest/commit/9851dbc41"><!-- raw HTML omitted -->(9851d)<!-- raw HTML omitted --></a></li> </ul> </li> <li><strong>mocker</strong>: <ul> <li>Restrict redirect mocks to the fs allowlist [backport to v4] - by <a href="https://github.com/sheremet-va"><code>@sheremet-va</code></a> in <a href="https://redirect.github.com/vitest-dev/vitest/issues/10974">vitest-dev/vitest#10974</a> <a href="https://github.com/vitest-dev/vitest/commit/fe5a11d3c"><!-- raw HTML omitted -->(fe5a1)<!-- raw HTML omitted --></a></li> </ul> </li> </ul> <h5> <a href="https://github.com/vitest-dev/vitest/compare/v4.1.10...v4.1.11">View changes on GitHub</a></h5> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/vitest-dev/vitest/commit/9bd8d464e6328c567c2dbcd8fdd977d57a9425c2"><code>9bd8d46</code></a> chore: release v4.1.11 (<a href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/10995">#10995</a>)</li> <li><a href="https://github.com/vitest-dev/vitest/commit/9851dbc41c286a30abfb6b29cce65f3e5b7b40a1"><code>9851dbc</code></a> fix(browser): trigger playwright/chromium gc on lower disk availability [back...</li> <li>See full diff in <a href="https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/vitest">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> |
||
|
|
b25acdb2ad |
fix(packs): don't disrupt normal downloads when inspecting for packs (#1274)
Follow-ups to the multi-book pack feature (#1270), which inspects every release before download. Two behaviours leaked into the ordinary single-book flow and are corrected here: - A flat folder of chaptered audio (`01 - Chapter.mp3`, `02 - ...`) was detected as a pack, because each track name parses to a series position, so clicking download popped the review panel for one normal audiobook. Flat folders are now split one-book-per-file only with real evidence of distinct books: two or more series positions, more than one title, and no chaptered audio (only the single-file m4b/m4a containers and ebook formats qualify). Subfolder packs and flat m4b/m4a packs are unchanged. - Every release that couldn't be inspected (usenet, magnet-only, sources without a list_files hook, ABB single-file) showed an info toast on download. That is now a console.warn, so a normal download is silent again. Adds regression tests for the chaptered-mp3 cases. |
||
|
|
f441b85da2 |
feat(packs): inspect multi-book releases and file each book separately (#1270)
## Multi-book packs: inspect a release before download and file each book separately Closes #576 ### Problem One queued release is always treated as one book. When a torrent is actually a whole series (`Series/Book 1 - Title/…`, or a flat folder of `Series 1.0 - Title.m4b` files), post-processing walks the whole tree, flattens every file into one list and renames them `Title - 01…10` under the searched book's `{Author}/{Title}`. Audiobookshelf then sees a single 10-file "book" and the user has to re-file everything by hand. ### What this does Most releases expose their file list *before* anything is downloaded, so the split is decided up front and approved by the user, then the download is fire-and-forget: 1. **Inspect** – clicking a release's download button now calls `POST /api/releases/inspect` first. A new optional `DownloadHandler.list_files(release_data)` hook returns the release's files without downloading: - **AudiobookBay** reads the torrent file table off the detail page it already fetches (the page is now cached for 120 s, so inspect + download cost ABB one request). - **Prowlarr** parses `info.files` from the `.torrent` it already fetches (the existing 120 s torrent-fetch cache is reused). Magnet-only and usenet releases report "can't inspect". - Other sources default to `None`. 2. **Review** – if the plan contains more than one book, the Find Releases modal swaps the list for a review panel: one row per book with editable title / series position / year, expandable file lists, non-book sidecars (`.txt`, covers) shown as ignored, a "Treat as a single book" switch, and **Download N books**. Single-book releases queue immediately, exactly as before. 3. **File** – the approved plan travels with the task (`DownloadTask.book_plan`, retry-safe) and post-processing files each book through the existing transfer code, one book at a time (`dataclasses.replace(task, title=…, series_position=…, year=…)`), so organize/rename templates, part numbering (now scoped per book), hardlinks, torrent copy-preserve and usenet handling are unchanged. Status reads `Complete (N books, M files)`. 4. **Fallback** – when a release can't be inspected the user gets a toast, and a small "Multi-book pack" toggle in the modal header forces a heuristic split (subfolder = book, or one book per file when the file names carry series positions). Planning lives in `shelfmark/download/postprocess/packs.py` and is shared by the inspect endpoint and post-processing, so what the user approved is what gets filed. The name parser strips `Book 3 -`, `03 -`, `1.0 -`, `3.`, `[03]`, `#3`, a leading series name, labels like "An Expanse Novella -", repeated titles (`Gods of Risk 2.5 - Gods of Risk`) and a trailing `(Year)`; author and series name come from the book that was searched, and the searched book's own series position is never applied to its siblings. ### Files - `shelfmark/download/postprocess/packs.py` (new) – `PackFile/PackBook/PackPlan`, `plan_pack`, `parse_pack_book_name`, `group_files_into_books`, `match_plan_to_files` - `shelfmark/core/release_inspect_routes.py` (new) – `POST /api/releases/inspect` - `shelfmark/release_sources/__init__.py` – `DownloadHandler.list_files` hook - `shelfmark/release_sources/audiobookbay/{scraper,handler}.py` – detail-page cache, `extract_file_list`, `list_files` - `shelfmark/release_sources/prowlarr/handler.py`, `download/clients/torrent_utils.py` – `extract_file_list_from_torrent`, `list_files` - `shelfmark/core/models.py`, `download/orchestrator.py` – `multi_book` / `book_plan` fields, queue + retry serialization - `shelfmark/download/postprocess/transfer.py`, `pipeline.py`, `outputs/folder.py` – per-book transfer branch and status message - `src/frontend`: `components/PackReviewPanel.tsx` (new), `ReleaseModal.tsx`, `App.tsx`, `services/api.ts`, `types/index.ts`, `utils/releasePayload.ts` (payload builder moved out of `App.tsx`), `utils/packReview.ts` - `docs/dev/release-sources-plugin-guide.md` – documents the `list_files` hook ### Out of scope (follow-ups) - Listing files from an NZB (Shelfmark already fetches the bytes; `<file subject>` names are noisy) - Inspecting magnet links via qBittorrent's files API after a paused add - BookLore / email outputs (they ignore `book_plan`; noted in code) - The combined ebook + audiobook flow ### Testing **Automated** (`make checks`, `make python-test`, `make frontend-test` all green; the only failures on my machine are the pre-existing `tests/config/test_entrypoint_permissions.py` cases, which need bash ≥ 4 and fail identically on `main` under macOS bash 3.2): - `tests/download/test_packs.py` – name parsing (markers, series name, novella labels, repeated titles, bare numeric titles like `1984`), nested / flat / mixed / deeper-nested packs, single wrapping folder not treated as a pack, plan-to-disk matching with basename fallback - `tests/core/test_processing_packs.py` – full `post_process_download` runs on a real temp filesystem: approved plan files each book under its own `{Author}/{Title}`, heuristic split of a nested pack, searched book's series position does not leak, multi-file book inside a pack keeps `- 01/- 02` per book, hardlinked torrent pack leaves the seeding tree intact, no pack fields ⇒ behaviour unchanged, single group degrades to the searched title, status message - `tests/core/test_release_inspect_routes.py` – plan response, not-inspectable, handler errors never 500, unknown source / missing `source_id` ⇒ 400, login required - `tests/audiobookbay/test_file_list.py` – file-table scraping from real ABB markup (multi-file and single-file pages), handler host validation, one page fetch shared by magnet + file list - `tests/prowlarr/test_torrent_file_list.py` – multi-file / single-file `.torrent` parsing, handler behaviour for torrent URL vs magnet vs usenet vs cache miss - `tests/download/test_orchestrator_pack_fields.py` – queue-time parsing and retry round-trip - Frontend: `releasePayload.test.ts`, `packReview.test.ts` (vitest) **Manual, on a real deployment** (arm64 image built from this branch, run as a side container next to production with the same qBittorrent / Audiobookshelf setup, `FILE_ORGANIZATION_AUDIOBOOK=organize`, hardlinks on): - AudiobookBay "The Expanse Complete 2.0" (7.87 GB, 36 files): clicking download opened the review panel in ~1 s showing **18 books · 18 files · 18 files ignored** (the `.txt` sidecars), with series positions 0.1–9.5 and years parsed from the file names; novella labels stripped ("The Churn", "The Butcher of Anderson Station"). Editing a title in the panel works. Confirming queued one task; the magnet resolved from the cached page in ~30 ms; after the download the task reported `Complete (18 books, 18 files)`, 18 hardlinks landed as `audiobooks/James S. A. Corey/<Title>/<Title>.m4b`, the torrent kept seeding, and Audiobookshelf scanned each folder as its own book (title, author, embedded chapters). - A second pack ("Expanse [01 - 9.5]", `Title N - Title` naming) was inspected to verify the repeated-title rule and the Back button, without downloading. - Single-book releases still queue immediately with no extra UI. |
||
|
|
02b7e9d958 |
feat(newznab): support multiple named indexers (#1271)
## Summary - add a named Newznab indexer table with per-indexer URL and API key settings - search every configured indexer and retain the originating indexer name on each result - namespace cached release IDs across connections and isolate individual indexer failures - preserve the legacy single-indexer settings as a fallback - support masked API-key cells and trusted SABnzbd prefetching for named indexers ## Validation - 121 Newznab and SABnzbd backend tests passed on Python 3.14 - Ruff passed for all changed Python files - frontend TypeScript and strict lint checks passed - all 134 frontend unit tests passed - frontend formatting check passed ## Compatibility Existing `NEWZNAB_URL` and `NEWZNAB_API_KEY` configurations continue to work whenever `NEWZNAB_INDEXERS` is empty. Co-authored-by: Ryan <zab1996@users.noreply.github.com> |
||
|
|
ff06a1a581 |
fix(search): follow-ups to per-user book languages (#1267)
Review follow-ups to #1255, all in the code that PR touched. Drop the dead user_id from the Prowlarr retry path. ProwlarrSource.search never reads plan.languages, and _refresh_release builds a synthetic book with no titles_by_language, so the title variants came out identical with and without it. It also should not language-filter: it re-finds one exact release by its guid. Pin the tab move in tests. BOOK_LANGUAGE moved from the General tab to Search Mode with no migration, which only works because both tabs persist into the same settings.json. Nothing asserted that, so splitting the files later would silently reset every install to ["en"]. Covers the stored value, a fresh install, and ENV precedence. Stop the UI inventing a default language. An empty BOOK_LANGUAGE is a deliberate "no default filter" that the backend preserves, but the two frontend call sites replaced it with the first supported language, so the filter said English where the server filtered nothing. resolveDefaultLanguageCodes now falls back only when the value is absent. Keep the normalized value for every validated search key. validate_user_settings gated the write-back on a hand-maintained subset of the keys the search validator recognises, so METADATA_PROVIDER_COMBINED, SHOW_COMBINED_SELECTOR and FORCE_COMBINED_SEARCH were validated and then stored raw -- a padded provider name was accepted and persisted with its padding. Reuse the validator's own key set instead. Skip blank language entries rather than rejecting them, so "" and "en," mean the same as [] and ["en"] instead of erroring on an unnamed language. Extract resolveListOverride for the list-override detection that was copy-pasted between the two user-settings sections, and mention languages in the Search Preferences section description. |