Repository navigation
chore: consolidate with master - #1973
Merged
Merged
Conversation
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.2.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 /> [](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) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/GetStream/stream-chat-js/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Title: fix(poll): keep translations from poll.updated in the poll state ## CLA - [x] Code changes are tested ## Description of the changes, What, Why and How? The v9 counterpart of <v10 PR link> (`release-v10`), for the stable 9.x line that stream-chat-react v14 depends on. **What.** `Poll.handlePollUpdated` now keeps the server's question and description translations (`name_i18n`, `description_i18n`) from a `poll.updated` event. **Why.** The backend translates polls automatically ([CHA-5308](https://linear.app/stream/issue/CHA-5308/implement-api-changes)), and #1878 added the `TranslatedField` response fields in 9.54.0. But `handlePollUpdated` copies the event through `extractPollData`, which builds the `PollData` request type and lists its fields one by one. The translations aren't in that list, so they never reached `poll.state`. Two cases are affected: - **Edited question:** readers in other languages see the old translation, or the new question untranslated, until they reload. - **Language added on demand:** `translateMessage` on a poll message translates the poll on the server and sends `poll.updated`. The question's new language never reaches open clients. Option translations were not affected, because `options` is copied whole. The other paths that write poll state keep translations: `message.new`, vote events (`answer_text_i18n` arrives with `poll_vote`), `query()` and `reinitializeState`. **How.** `handlePollUpdated` copies both fields from `event.poll` explicitly, also when they are absent. `poll.updated` carries the whole poll, and a change made under channel-only translation removes the old translations, so an absent field clears the stale ones. `extractPollData` is public and returns a request type, so it is left as it is. There are no public API or type changes: `PollState` already has both fields. **Tests** - `test/unit/poll.test.js`: an edited question's translations are stored, a language added later is stored, the description's translations are stored, and translations the event no longer carries are cleared. - `test/unit/poll_manager.test.ts`: `poll.updated` sent through the client updates the cached poll's `name_i18n`. `yarn types`, `yarn lint` and `yarn test` pass (3212 tests). The run reports 1unhandled error, from `poll.test.js` (`slowRequest.reject`). It also happens on an unmodified `master` and is unrelated. **Verified live** against an app with auto-translation on: - **Published 9.54.0:** a `translateMessage` to Portuguese reached the server, but the open client's cached poll didn't keep `pt_text`. - **This build:** a `translateMessage` to Dutch added `nl_text` to the cached poll. Consumer: GetStream/stream-chat-react <React v14 PR link>, poll translations in the React v14 UI. ## Changelog - Fix: `poll.updated` now keeps the poll's question and description translations (`name_i18n`, `description_i18n`), so edited questions and languages added with `translateMessage` show without a reload
## CLA - [x] I have signed the [Stream CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform) (required). - [x] Code changes are tested ## Description of the changes, What, Why and How? Ports GetStream/stream-video-js#2464. Adds a Claude Code PreToolUse hook that blocks PR creation (`gh pr create` and MCP PR-creation tools) unless a Linear ticket ID is in the PR title or PR body. The branch name does not count. - `.claude/hooks/require-linear-ticket.sh` needs only bash, jq and curl. Every other tool call exits 0. - Accepted team keys: `REACT`, `RN`, `CHAT` and `VID` (override with `LINEAR_TEAM_KEYS`). - For `gh pr create`, only the text from the `gh pr create` invocation onward is scanned, and `--head`/`--base`/`--repo` values are ignored. `--body-file` contents are included. For MCP tools, only `title` and `body` are read. - If `LINEAR_API_KEY` is set, the ticket's existence is checked via Linear GraphQL. Only a "not found" response blocks; auth or network errors warn and allow. - Registered in a new project `.claude/settings.json`; the workflow is documented in `AGENTS.md` (file tickets in `REACT`, or `RN` for React Native-driven work). - Pipe-tested: missing ticket, ID only in the branch name or `--head`, and IDs from other teams (e.g. `FEEDS-…`) exit 2; `REACT`/`RN`/`CHAT`/`VID` IDs in the title or body exit 0; unrelated commands exit 0. Ticket: https://linear.app/stream/issue/REACT-1188 ## Changelog - No user-facing changes (repository tooling only).
… expired (#1944) ## CLA - [ ] I have signed the [Stream CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform) (required). - [x] Code changes are tested ## Description of the changes, What, Why and How? Linear: [CHA-6335](https://linear.app/stream/issue/CHA-6335) ### What the server now does GetStream/chat#19359 (merged, ships with the next backend release) changes how chat-ws closes a connected socket whose token expires while the app has `auto_disconnect_ws` on. Before, the socket was dropped with no frame, so the client saw a 1006. Now the server: 1. sends the existing `connection.error` event, the same payload a handshake with an expired token gets: `{"type":"connection.error","error":{"code":40,"StatusCode":401,"message":"JWTAuth error: token is expired (exp)"}}` 2. closes with **1008**. It is deliberately not 1000, because this SDK treats 1000 as final and would not reconnect. ### Why this SDK needs a change The Swift, Kotlin and Flutter SDKs already refresh the token when they get that event, then reconnect. `StableWSConnection` only looks at `connection.error` before the connection resolves. After that the event is dispatched and otherwise ignored, and the close takes the normal `_reconnect()` path. That path reconnects with the **expired** token, gets rejected with `token_expired`, and only then calls the `tokenProvider` (`_reconnect({ refreshToken: true })`). Every token expiry on such an app therefore costs one rejected connect and a few seconds without a socket. ### The change (`src/connection.ts`) - `onmessage` sets `tokenExpiredByServer` when a resolved socket receives `connection.error` with code 40. The event is still dispatched as before. - `onclose` (non-1000 branch) and `onerror` go through a new `_reconnectAfterFailure()`. When the flag is set and the token manager is not static, it calls `_reconnect({ refreshToken: true })`. Otherwise it calls `_reconnect()` exactly as today. - `onerror` is covered too, so an error event fired next to the close cannot win the race and reconnect with the stale token. - The flag is cleared whenever a new socket is set up (`_setupConnectionPromise`) and on `disconnect()`, so it never carries over to another socket. ### Measured effect Measured on one production region (us-east4) over 24h, plus a peak-hour sample: - About **2.8M rejected reconnects/day** came within 10s of the server closing the same user's socket at token expiry. - **More than 99.9%** of those came from stream-chat-js (React and React Native); the native SDKs make up ~0.05%. - For the most affected app, this pattern was about half of all its `token_expired` rejects. 92% of those users connected with a new token within 2 minutes (median ~4s), which means a `tokenProvider` was in use: the stale retry was pure waste. Once both the backend release and this change are out, those reconnects should go straight through with a fresh token. ### Backward compatibility - **Older servers** (and v2 / video transports) never send this event after connect, so the flag is never set and nothing changes. - **Static tokens** (no `tokenProvider`): the token cannot be refreshed, so they reconnect exactly as before. - **1000 closes** and **`disconnect()`** are unaffected: the 1000 branch does not reconnect, and `disconnect()` clears the flag. - **No public API change.** `tokenExpiredByServer` is a new field on the internal `StableWSConnection` class. ### Not changed here In `_reconnect`, `loadToken()` for `refreshToken` runs outside the `try`. If the `tokenProvider` rejects, the reconnect loop stops. This is the same hazard the existing `token_expired` → `refreshToken` path already has. This PR only reaches that path one round trip earlier. ### Tests New `token expired by the server after connect` block in `test/unit/connection.test.js`: - With a provider, a code 40 event followed by a 1008 close (or an error and then a close) reconnects with `refreshToken: true`. - With a static token, the reconnect is called with no arguments. - A close without the event (1008 or 1006), or a `connection.error` with another code, does not refresh. - The event followed by a 1000 close does not reconnect. - The event is still dispatched. - The flag is cleared on new-socket setup and on `disconnect()`. - A round trip against a local WS server that sends the event and closes with 1008: the second connect carries the new provider token (`token-1`, `token-2`). Without the fix it reconnects with `token-1` twice. Results: - `yarn lint` and `yarn types` pass. - `yarn vitest run`: 81 files, 3221 passed and 1 skipped on Node 22. - On Node 20, 3 `client.test.js` tests that use `Promise.withResolvers` fail on `master` too; they are unrelated to this change. ## Changelog - Refresh the token before reconnecting when the server reports that the token of a connected socket expired (`connection.error` code 40). This avoids one rejected `token_expired` reconnect per token expiry for apps using a `tokenProvider`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Laurent Schaffner <laurentschaffner@Laurents-MacBook-Pro-Stream.local> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
## [9.54.1](v9.54.0...v9.54.1) (2026-10-27) ### Bug Fixes * **poll:** keep translations from poll.updated in the poll state ([#1938](#1938)) ([3c1a18a](3c1a18a)), closes [#1878](#1878) * refresh the token before reconnecting when the server reports it expired ([#1944](#1944)) ([2910396](2910396)), closes [GetStream/chat#19359](https://github.com/GetStream/chat/issues/19359) * type fixes from docs check; add docs snippet runner ([#1902](#1902)) ([2095fc1](2095fc1)) * type issues from platform docs check; add docs snippet test for the platform docs ([#1914](#1914)) ([c7706d2](c7706d2))
## CLA - [x] I have signed the [Stream CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform) (required). - [x] Code changes are tested ## Description of the changes, What, Why and How? Ticket: https://linear.app/stream/issue/REACT-1415/uncaught-error-when-removing-the-last-vote-in-a-poll Removing the last vote on an option optimistically (added in 9.54.0, #1895) left `latest_votes_by_option[optionId]` as an empty array. The server never sends that: it drops the key once an option has no votes. SDKs that read the first vote of each option without a guard crash on it. React Native crashes in its channel list preview when the last vote of a poll that is the channel's last message is removed. We already dropped the key for `vote_counts_by_option` but missed `latest_votes_by_option`. The fake-server simulation only compares vote counts and own votes against the server, so it couldn't catch this. `applyOwnVoteDelta` now deletes the key when an option's latest votes become empty, the same as for vote counts. The existing removal test asserted `[]` and now asserts the key is gone. ## Changelog - Fixed optimistic vote removal leaving an empty `latest_votes_by_option` entry, which crashed SDKs reading the first vote of each option.
…d latest pages (#1934) ## CLA - [ ] I have signed the [Stream CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform) (required). - [x] Code changes are tested ## Description of the changes, What, Why and How? Fixes two message pagination bugs, one commit each. ### #1931: `queryChannels` with `message_limit: 0` sets `hasPrev` to false `hydrateActiveChannels` computed the page size with `message_limit || 25`, so `0` became 25. The empty page then failed the `0 >= 25` "has more" check and reset `hasPrev` to false on every returned channel, so older messages could never be loaded (and channels with nothing loaded stayed empty). - `||` is now `??`, matching `Channel.query`. - `messageSetPagination` leaves the pagination of a set that already has messages untouched when the requested page size is 0, since an empty page says nothing about what else exists. This also applies to `Channel.query({ messages: { limit: 0 } })`, which previously forced `hasPrev: true` even on fully loaded channels. A set with no messages still ends up with `hasPrev: true`, so it can load messages. ### #1930: messages sent while disconnected are missing and unreachable When the newest page of a channel (from `queryChannels`, `recoverState` or `watch`) shares no messages with the loaded latest messages and is newer than all of them, `findTargetMessageSet`'s `'latest'` case appended it to the latest set as if continuous. Pagination then asked for messages older than the oldest loaded one, so the gap was never requested. - New `ChannelState._dropLatestMessagesDisjointFrom(page)` empties the stale latest set in that situation, so the newest page starts fresh and paginating back loads the gap and eventually reconnects with the older messages. - `Channel._initializeState` calls it only for `'latest'` and only when the query has no message cursor (new `hasMessagePaginationCursor` util), so forward-cursor queries like `watch({ messages: { id_gt } })` still extend the latest messages. - It is skipped while the latest set holds local-only messages (`sending`, `failed`, `error`, `ephemeral`). Keeping them while dropping the rest would make one of them the oldest message, whose id SDKs use as the pagination cursor and the server does not know. In that edge case the previous merge behavior applies. - Live `message.new` events are unaffected; they do not go through `_initializeState`. ### Notes for reviewers - `ChannelState._dropLatestMessagesDisjointFrom` is a new underscore-prefixed method on an exported class, following the existing `_initializeState` convention. `hasMessagePaginationCursor` is not re-exported from `src/index.ts`. - Not addressed here: `messageSetBounds` in `channel_state.ts` treats `a[0]` as the newest message while sets are stored oldest first, so `messageSetsOverlapByTimestamp` misses partial overlaps. This fix does not rely on it; correcting it changes other message set paths and is better as a separate change. ### Tests New regression tests in `test/unit/client.test.js` cover: `message_limit: 0` on loaded, fully loaded and empty channels; paginating back through the gap after recovery until all messages are in one set; the `watch()` path; overlapping pages still merging; forward-cursor pages; a stale latest set replaced while the user is viewing an older jumped-to set; failed local messages being kept; and live `message.new` not wiping messages. Each guard's test was checked to fail with that guard removed. ## Changelog - Fixed `queryChannels` with `message_limit: 0` resetting `hasPrev` so channels stopped loading older messages (#1931) - Fixed messages that arrived while disconnected being hidden behind the newest page and unreachable by pagination (#1930) --------- Co-authored-by: Ivan Sekovanikj <31964049+isekovanic@users.noreply.github.com>
Ticket: https://linear.app/stream/issue/REACT-1211 Fixes #1903 ## CLA - [x] I have signed the [Stream CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform) (required). - [ ] Code changes are tested (docs only, no code changes; every changed link was checked and returns 200) ## Description of the changes, What, Why and How? Fixes dead links in the repo's markdown docs. - `README.md`: the v9 release guide link pointed to `/chat/docs/node/upgrade-stream-chat-to-v9`, which returns 404. The guide lives at `/chat/docs/javascript/upgrade-stream-chat-to-v9/`. - `docs/fileUpload.md`: the Stream Dashboard link had a typo (`getsream.io`). - `CONTRIBUTING.md`: the release section linked to the removed `initiate_release` workflow and described the old PR-based release flow. It now describes the current process: run the `Release` workflow from `master`, `release-v8` or `rc`, with semantic-release deriving the version and changelog from commit messages, plus the `dry_run` option. I checked every other link in the non-changelog markdown files and found no other broken ones. ## Changelog - Fix broken links in README and docs, and update the release guide in CONTRIBUTING.md
## CLA - [x] I have signed the [Stream CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform) (required). - [x] Code changes are tested ## Description of the changes, What, Why and How? Ticket: https://linear.app/stream/issue/RN-469/edits-drop-custom-attachments-from-messages Editing a message dropped its attachments that are not uploads (custom types, giphy, ...). The composer loads them into the attachment manager, but the composition middlewares only composed finished uploads, so they were left out. For a message with only such attachments, `localMessage` kept the `attachments: []` that `compose()` starts with, and SDKs that send `localMessage` as the update (React Native) made the server delete them all. In a mixed message, the custom ones were dropped from both payloads. Confirmed against the API: `[product]` came back as `[]` after an edit, and `[product, image]` as `[image]`. The attachment middlewares (default, pending uploads and draft) now treat an attachment as sendable when its upload finished or when it was never an upload. Attachments added during the edit behave as before: pending uploads only go on the optimistic message, and failed ones are left out. Tests compose real edits and assert the `updateMessage` request: custom only, custom + image (with and without pending uploads), custom + a new pending upload, and a new upload that failed. The existing middleware tests now mock `attachments` instead of `successfulUploads`. ## Changelog - Fixed editing a message dropping its custom and other non-upload attachments.
## [9.54.2](v9.54.1...v9.54.2) (2026-10-28) ### Bug Fixes * avoid dropping custom attachments on edit ([#1953](#1953)) ([ebc794c](ebc794c)) * message pagination after message_limit 0 queries and disconnected latest pages ([#1934](#1934)) ([6faedbc](6faedbc)), closes [#1931](#1931) [#1930](#1930) * poll crash on last vote removal ([#1952](#1952)) ([c5c923a](c5c923a)), closes [#1895](#1895)
## CLA - [x] I have signed the [Stream CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform) (required). - [x] Code changes are tested ## Description of the changes, What, Why and How? Fixes the `stream-chat` part of GetStream/stream-chat-react-native#3903. Linear ticket: https://linear.app/stream/issue/RN-471/offline-support-channels-hydrated-from-the-local-db-get-hasprev-false With offline support, `ChannelManager.queryChannels` first hydrates the channels it reads from the offline DB. It called `hydrateActiveChannels` without the query's options, so the cached messages of each channel were judged against the default page size of 25 instead of the `message_limit` the query asked for. A channel with fewer than 25 cached messages ended up with `messagePagination.hasPrev = false`, even when the server had older messages. The online `queryChannels` page that follows did not correct it. It merges into the cached messages, and `hasPrev` is only recalculated when the page starts at the first message of the set. With `message_limit: 10` and, for example, 20 cached messages, that never happens, so scrolling up never requested older messages for the rest of the session. `ChannelManager` now passes the query's options to `hydrateActiveChannels` when hydrating from the offline DB, so a cached page is read the same way as a page from the server. A full page leaves older messages to load, and a shorter one marks the start of the channel. `hydrateActiveChannels` only reads `message_limit` from those options, so nothing else changes. The React Native SDK's offline DB is being changed to return the newest `message_limit` messages of each channel (25 when the query sets none) in a separate PR. This change also works with the current SDK, which returns up to 24 cached messages: a channel with more cached messages than `message_limit` is no longer marked as having nothing older. Tests: - `channel_manager.test.ts` checks that the query's options are passed to `hydrateActiveChannels`. - `client.test.js` covers a full and a short cached page, and the online page arriving afterwards. - Verified end to end on an Android emulator with the React Native SDK `SampleApp` (`message_limit: 10`, a channel with 20 of 50 messages cached). Before the change the list stopped at the cached messages and sent no request when scrolling up. With it, scrolling up loaded the full history. ## Changelog - Channels hydrated from the offline database are now read against the query's `message_limit`, so a channel with older messages on the server no longer gets `hasPrev = false` from its cached messages.
## [9.54.3](v9.54.2...v9.54.3) (2026-10-28) ### Bug Fixes * read cached channels against the query's message_limit ([#1958](#1958)) ([bbddea0](bbddea0))
…1962) ## CLA - [ ] I have signed the [Stream CLA](https://docs.google.com/forms/d/e/1FAIpQLScFKsKkAJI7mhCr7K9rEIOpqIDThrWxuvxnwUq2XkHyG154vQ/viewform) (required). - [x] Code changes are tested ## Description of the changes, What, Why and How? Fixes #1961. **What:** when the `tokenProvider` rejected during `_reconnect({ refreshToken: true })`, the rejection escaped as an unhandled promise rejection (`Call to tokenProvider failed with message: ...`). Integrators can't catch it, because no caller awaits `_reconnect()`. Mobile error trackers report it as a crash, for example when the token refresh happens in a network dead spot. **Why:** `tokenManager.loadToken()` was awaited outside the `try` in `_reconnect()`. **How:** the refresh now has its own `try/catch`. A failed refresh is handled like a failed connect: the connection is marked unhealthy, `consecutiveFailures` goes up, and `_reconnect({ refreshToken: true })` is scheduled again with the usual backoff (capped at 25s). The fix suggested in the issue moves `loadToken()` into the existing `try`, but that `catch` only retries on `isWSFailure` or `TOKEN_EXPIRED`. A token-provider error is neither, so the connection would stay dead until something else triggered a reconnect. The "abort if another reconnect started while the token was loading" check is unchanged. The retry is skipped once `disconnect()` has been called. Otherwise an old connection would keep calling the `tokenProvider`, because `_reconnect()` only aborts after a disconnect when `enableWSFallback` is on. v10 port: #1963. ## Changelog - Fixed an unhandled promise rejection when the `tokenProvider` fails while the WebSocket reconnects after an expired token. The reconnect now retries with backoff.
## [9.54.4](v9.54.3...v9.54.4) (2026-10-29) ### Bug Fixes * handle tokenProvider rejection during reconnect token refresh ([#1962](#1962)) ([7721bd5](7721bd5))
oliverlaz
approved these changes
Oct 30, 2026
|
🎉 This PR is included in version 10.0.0-rc.29 🎉 The release is available on: Your semantic-release bot 📦🚀 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
CLA
Description of the changes, What, Why and How?
Changelog