Refresh framework frontend pins and locked backend dependencies
Merged
MA
6h ago+2680+2680+0123456789012345678901234567890123456789-2154-2154-0123456789012345678901234567890123456789
Type of change
- Bug fix (non-breaking change which fixes an issue)
Routine dependency sweep: framework frontend pins plus the locked backend environment. I applied one rule throughout: take the newest release that is at least seven days old. The backend lock already enforces this with exclude-newer = "7 days". This PR applies it to npm pins as well, with one exception noted below.
Frontend
| Package | From | To | Where |
|---|---|---|---|
| react / react-dom | 19.3.0 | 19.3.1 | reflex-base |
| vite | 8.3.2 | 8.3.4 | reflex-base |
| postcss | 8.5.29 | 8.5.30 | reflex-base |
| postcss-import | 17.0.0 | 17.0.1 | reflex-base |
| @radix-ui/react-accordion | 1.2.20 | 1.3.1 | radix |
| @radix-ui/react-dialog (dialog, drawer) | 1.1.23 | 1.3.1 | radix |
| @radix-ui/react-form | 0.1.16 | 0.3.0 | radix |
| @radix-ui/react-progress | 1.1.16 | 1.2.1 | radix |
| @radix-ui/react-slider | 1.4.7 | 1.6.1 | radix |
| react-syntax-highlighter | 16.1.1 | 16.1.2 | code |
| tailwind-merge | 3.6.0 | 3.7.0 | internal |
| @icons-pack/react-simple-icons | 13.13.0 | 13.15.1 | internal |
- React 19.3.1 contains one commit, a React Server Components (Flight) transport fix. Reflex doesn't use RSC; taking it keeps React current.
- Radix: the old pins matched exactly the primitives inside
radix-ui@1.6.7, which@radix-ui/themesdepends on, so apps loaded one copy of each primitive. The new set matchesradix-ui@1.8.1, the current release a fresh Themes install resolves to. Bumping them individually would load two copies of the Radix internals (separate dismissable-layer and focus stacks). This set is about 3 hours inside the 7-day window; keeping a single copy seemed worth the exception. The upstream changelogs list type fixes and additive features only. - Held for the next sweep (too new): react-router 8.5.0 (published Oct 19) and vite 8.3.5.
- Unchanged: the existing holds in
[tool.check-outdated-deps](plotly.js, tailwind, react-dropzone, lucide-react, ag-grid and others),@babel/core(8.x is a major), and Bun 1.4.4 from #7639. - Regenerated
docs/app/reflex.lock. It resolvesradix-ui@1.8.1with no nested duplicate@radix-ui/*copies.
Backend
uv lock --upgradewithin the existing window, keepingruffandpyrightat their pinned versions. Notable moves: SQLAlchemy 2.1.4, pydantic 2.14.1, Starlette 1.8.0, granian 2.8.4, FastAPI 0.143.2, python-engineio 4.14.0, playwright 1.64.0, reflex-enterprise 0.9.8, towncrier 26.9.0.- Main is merged in, so the lock keeps
virtualenv21.14.12 from #7644 (the Dependabot security fix). - reflex-release: widened
towncrierfrom<26to<27. Version 26 is CalVer with no breaking changes. - docs app:
xy0.0.7 → 0.0.8. It's a single bugfix that restores live chart rendering on Reflex 0.10. [tool.check-outdated-deps]:- Hold the Python
plotlypackage, because plotly.py 7 targets plotly.js 4, which is still held at 3.x (#7002). - Drop the
pydantic-coreandpyeeholds; both now resolve to their latest versions, so the script flagged them as stale.
- Hold the Python
scripts/check_outdated_deps.py backendpasses.
Fixes the upgrades required
- SQLAlchemy 2.1 typing: its catch-all
returning(*cols)overload types rows as one-element tuples, which broke pyright in reflex-workflow.lease()is now annotated-> Update, soexecute()returns untyped rows. I checked this with pyright on both SQLAlchemy 2.0.52 and 2.1.4. One test helper gets anassert until is not None. test_get_leaf_vars_sorts_every_cached_operation(from #7606):- reflex-enterprise 0.9.8 registers a
reflex_apppytest plugin that imports itsLambdaVar. Var.__init_subclass__then generates aLambdaCastedVarinsidereflex_base.vars.base, and the test counted it as one of Reflex's own operations.- The subclass walk now stops at classes defined outside Reflex. The test passes with the plugin loaded and with
-p no:reflex_app.
- reflex-enterprise 0.9.8 registers a
tests/integration/test_urls.pynow useshttpxinstead ofrequests:pytest-playwright0.10 dropped itspytest-base-urldependency, which was the only thing installingrequestsin the integration environment.- Without it, collecting the module failed and took every app-harness job down.
httpxis already a reflex runtime dependency.
Validation
- Unit suite: 13,177 passed. The only failures are 14 tests in
tests/units/reflex_bench/drivers/test_browser.py. They fail identically with the previous Playwright, because this container's preinstalled Chromium (build 1194) is older than Playwright needs. ruff check,ruff format --check,pyright reflex tests, fullpyright, the pre-committycheck,uv lock --check,reflex-release changelog-checkandreflex-release sync --checkall pass. Stub regeneration leavespyi_hashes.jsonunchanged.- Real app: built a production app with Bun 1.4.4 on React 19.3.1, Vite 8.3.4 and PostCSS 8.5.30. In Chromium, checked the accordion, dialog, drawer, form submit (backend round trip), slider (state update), progress bar, code block and markdown code. No page errors.
- I left out docs-only frontend packages outside the framework (
@mantine/core,@xyflow/react,rehype-sanitize,react-colorful).
News fragments were added for reflex-base, components-radix, components-code, components-internal, reflex-release and reflex-workflow.
Generated by Claude Code