From 83b39820acb89b5f2aff7130780df5fefeda4665 Mon Sep 17 00:00:00 2001 From: "factory[bot]" Date: Mon, 28 Sep 2026 09:48:13 +0000 Subject: [PATCH 1/3] fix(dev): use stable CSS Module class names in dev to fix HMR for mixed hydrated/non-hydrated components --- .changeset/fancy-spies-jog.md | 5 ++ packages/astro/src/core/create-vite.ts | 19 +++++ .../units/dev/css-module-scoped-name.test.ts | 80 +++++++++++++++++++ pnpm-lock.yaml | 56 ++++++++++++- 4 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 .changeset/fancy-spies-jog.md create mode 100644 packages/astro/test/units/dev/css-module-scoped-name.test.ts diff --git a/.changeset/fancy-spies-jog.md b/.changeset/fancy-spies-jog.md new file mode 100644 index 000000000000..e7c85d526934 --- /dev/null +++ b/.changeset/fancy-spies-jog.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Fixes CSS Module HMR in dev when a component is rendered both with and without hydration on the same page. Astro now uses path-based class name hashing in dev mode so that editing CSS declarations no longer changes the generated selectors, allowing Vite's CSS HMR to update styles without a full page reload. diff --git a/packages/astro/src/core/create-vite.ts b/packages/astro/src/core/create-vite.ts index 3954b670ddb1..1f6ee5551a93 100644 --- a/packages/astro/src/core/create-vite.ts +++ b/packages/astro/src/core/create-vite.ts @@ -1,3 +1,4 @@ +import { createHash } from 'node:crypto'; import nodeFs from 'node:fs'; import { fileURLToPath } from 'node:url'; import * as vite from 'vite'; @@ -288,6 +289,24 @@ export async function createVite( ], }, build: { assetsDir: settings.config.build.assets }, + css: !isBuild + ? { + modules: { + // Vite's default postcss-modules scoped-name generator hashes the CSS + // *content*, so every declaration edit changes class names. In dev this + // breaks HMR for server-rendered HTML because the DOM still references + // the previous names. Use a path-based hash instead so selectors stay + // stable and Vite's CSS HMR can swap rules without a full page reload. + generateScopedName(name, filename) { + const hash = createHash('sha256') + .update(filename + '\0' + name) + .digest('base64url') + .substring(0, 5); + return `_${name}_${hash}`; + }, + }, + } + : undefined, environments: { [ASTRO_VITE_ENVIRONMENT_NAMES.astro]: { // This is all that's needed to create a new RunnableDevEnvironment diff --git a/packages/astro/test/units/dev/css-module-scoped-name.test.ts b/packages/astro/test/units/dev/css-module-scoped-name.test.ts new file mode 100644 index 000000000000..028d6d058df2 --- /dev/null +++ b/packages/astro/test/units/dev/css-module-scoped-name.test.ts @@ -0,0 +1,80 @@ +import * as assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; +import { createVite } from '../../../dist/core/create-vite.js'; +import { createBasicSettings, defaultLogger } from '../test-utils.ts'; + +describe('CSS module scoped name in dev', () => { + it('provides a stable generateScopedName in dev mode', async () => { + const settings = await createBasicSettings(); + const routesList = { routes: [] }; + const config = await createVite( + {}, + { + settings, + logger: defaultLogger, + mode: 'development', + command: 'dev', + routesList, + sync: false, + }, + ); + + const generateScopedName = config.css?.modules + ? (config.css.modules as { generateScopedName?: Function }).generateScopedName + : undefined; + + assert.ok( + typeof generateScopedName === 'function', + 'dev config should have generateScopedName', + ); + + // Same file + class name should produce the same result regardless of CSS content + const name1 = generateScopedName('card', '/src/Card.module.css', '.card { color: red; }'); + const name2 = generateScopedName('card', '/src/Card.module.css', '.card { color: blue; }'); + assert.equal(name1, name2, 'class name should be stable across CSS content changes'); + + // Different files should produce different names for the same class + const nameA = generateScopedName('card', '/src/A.module.css', '.card { color: red; }'); + const nameB = generateScopedName('card', '/src/B.module.css', '.card { color: red; }'); + assert.notEqual(nameA, nameB, 'different files should produce different class names'); + + // Different class names in the same file should produce different names + const nameCard = generateScopedName('card', '/src/Card.module.css', ''); + const nameTitle = generateScopedName('title', '/src/Card.module.css', ''); + assert.notEqual( + nameCard, + nameTitle, + 'different classes in the same file should produce different names', + ); + + // Name should include the local class name for debuggability + assert.ok(name1.includes('card'), 'generated name should include the local class name'); + }); + + it('does not set generateScopedName in build mode', async () => { + const settings = await createBasicSettings(); + const routesList = { routes: [] }; + const config = await createVite( + {}, + { + settings, + logger: defaultLogger, + mode: 'production', + command: 'build', + routesList, + sync: false, + }, + ); + + const modules = config.css?.modules; + const generateScopedName = modules + ? (modules as { generateScopedName?: Function }).generateScopedName + : undefined; + + assert.equal( + generateScopedName, + undefined, + 'build config should not override generateScopedName', + ); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ece61ce119a1..c2dc013a0293 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7196,6 +7196,28 @@ importers: specifier: ^4.22.0 version: 4.23.13 + triage/gh-18105: + dependencies: + '@astrojs/react': + specifier: workspace:* + version: link:../../packages/integrations/react + astro: + specifier: workspace:* + version: link:../../packages/astro + react: + specifier: 19.2.6 + version: 19.2.6 + react-dom: + specifier: 19.2.6 + version: 19.2.6(react@19.2.6) + devDependencies: + '@types/react': + specifier: 19.2.7 + version: 19.2.7 + '@types/react-dom': + specifier: 19.2.3 + version: 19.2.3(@types/react@19.2.7) + packages: '@anthropic-ai/sdk@0.91.1': @@ -11131,6 +11153,11 @@ packages: peerDependencies: '@types/react': ^18.0.0 + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + '@types/react-dom@19.2.7': resolution: {integrity: sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==} peerDependencies: @@ -11142,6 +11169,9 @@ packages: '@types/react@19.2.18': resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} + '@types/react@19.2.7': + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -15348,6 +15378,11 @@ packages: peerDependencies: react: ^19.2.4 + react-dom@19.2.6: + resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} + peerDependencies: + react: ^19.2.6 + react-dom@19.3.0: resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==} peerDependencies: @@ -15364,6 +15399,10 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} + react@19.2.6: + resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} + engines: {node: '>=0.10.0'} + react@19.3.0: resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} @@ -21048,6 +21087,10 @@ snapshots: dependencies: '@types/react': 18.3.31 + '@types/react-dom@19.2.3(@types/react@19.2.7)': + dependencies: + '@types/react': 19.2.7 + '@types/react-dom@19.2.7(@types/react@19.2.18)': dependencies: '@types/react': 19.2.18 @@ -21061,6 +21104,10 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/react@19.2.7': + dependencies: + csstype: 3.2.3 + '@types/retry@0.12.0': {} '@types/retry@0.12.2': {} @@ -26063,6 +26110,11 @@ snapshots: react: 19.2.4 scheduler: 0.27.0 + react-dom@19.2.6(react@19.2.6): + dependencies: + react: 19.2.6 + scheduler: 0.27.0 + react-dom@19.3.0(react@19.3.0): dependencies: react: 19.3.0 @@ -26076,6 +26128,8 @@ snapshots: react@19.2.4: {} + react@19.2.6: {} + react@19.3.0: {} read-package-up@11.0.0: @@ -27205,7 +27259,7 @@ snapshots: types-react-dom@19.0.0-alpha.3: dependencies: - '@types/react': 18.3.31 + '@types/react': 19.2.7 types-react@19.0.0-alpha.3: dependencies: From 594052be2047afc531a1990122cf6543b647386f Mon Sep 17 00:00:00 2001 From: "factory[bot]" Date: Mon, 28 Sep 2026 14:34:12 +0000 Subject: [PATCH 2/3] fix: address review feedback on CSS Module dev HMR - Remove orphan `triage/gh-18105` importer and unrelated React resolution entries from pnpm-lock.yaml. - Replace `Function` type in the unit test with an explicit `GenerateScopedName` function type to satisfy ESLint. - Add an integration test in `packages/astro/test/0-css.test.ts` that verifies CSS Module class names stay stable across SSR and a hydrated island after a CSS edit. --- packages/astro/test/0-css.test.ts | 61 +++++++++++++++++++ .../0-css/src/components/CssModuleHmr.jsx | 7 +++ .../src/components/CssModuleHmr.module.css | 3 + .../0-css/src/pages/css-module-hmr.astro | 17 ++++++ .../units/dev/css-module-scoped-name.test.ts | 6 +- pnpm-lock.yaml | 47 -------------- 6 files changed, 92 insertions(+), 49 deletions(-) create mode 100644 packages/astro/test/fixtures/0-css/src/components/CssModuleHmr.jsx create mode 100644 packages/astro/test/fixtures/0-css/src/components/CssModuleHmr.module.css create mode 100644 packages/astro/test/fixtures/0-css/src/pages/css-module-hmr.astro diff --git a/packages/astro/test/0-css.test.ts b/packages/astro/test/0-css.test.ts index 335287df4703..87daaee8dac1 100644 --- a/packages/astro/test/0-css.test.ts +++ b/packages/astro/test/0-css.test.ts @@ -394,6 +394,7 @@ describe('CSS', function () { after(async () => { await devServer.stop(); + fixture.resetAllFiles(); }); it('resolves CSS in public/', async () => { @@ -479,5 +480,65 @@ describe('CSS', function () { const el = $('#css-raw'); assert.equal(el.text(), '.foo {color: red;}'); }); + + it('keeps CSS Module class names stable for SSR and hydrated island after style edits', async () => { + const initialRes = await fixture.fetch('/css-module-hmr'); + assert.equal(initialRes.status, 200); + const initialHtml = await initialRes.text(); + const $initial = cheerio.load(initialHtml); + + const ssrClass = $initial('#ssr h1').attr('class'); + const islandClass = $initial('#island h1').attr('class'); + + assert.ok(ssrClass, 'SSR instance should have a generated class name'); + assert.equal( + ssrClass, + islandClass, + 'SSR and hydrated island should use the same generated class name', + ); + + const initialStyles = $initial('style').text(); + assert.match( + initialStyles, + /font-family:\s*fantasy/, + 'initial inline styles should contain the original declaration', + ); + + await fixture.editFile('/src/components/CssModuleHmr.module.css', (contents) => + contents.replace('font-family: fantasy', 'font-family: monospace'), + ); + await new Promise((resolve) => setTimeout(resolve, 500)); + + const updatedRes = await fixture.fetch('/css-module-hmr'); + assert.equal(updatedRes.status, 200); + const updatedHtml = await updatedRes.text(); + const $updated = cheerio.load(updatedHtml); + + const ssrClassAfter = $updated('#ssr h1').attr('class'); + const islandClassAfter = $updated('#island h1').attr('class'); + + assert.equal( + ssrClassAfter, + ssrClass, + 'SSR class name should stay stable after the CSS edit', + ); + assert.equal( + islandClassAfter, + ssrClass, + 'hydrated island class name should stay stable after the CSS edit', + ); + + const updatedStyles = $updated('style').text(); + assert.doesNotMatch( + updatedStyles, + /font-family:\s*fantasy/, + 'updated inline styles should no longer contain the original declaration', + ); + assert.match( + updatedStyles, + /font-family:\s*monospace/, + 'updated inline styles should contain the new declaration', + ); + }); }); }); diff --git a/packages/astro/test/fixtures/0-css/src/components/CssModuleHmr.jsx b/packages/astro/test/fixtures/0-css/src/components/CssModuleHmr.jsx new file mode 100644 index 000000000000..bc9dc805359d --- /dev/null +++ b/packages/astro/test/fixtures/0-css/src/components/CssModuleHmr.jsx @@ -0,0 +1,7 @@ +import Styles from './CssModuleHmr.module.css'; + +export default function CssModuleHmr() { + return ( +

CSS Module HMR

+ ); +} diff --git a/packages/astro/test/fixtures/0-css/src/components/CssModuleHmr.module.css b/packages/astro/test/fixtures/0-css/src/components/CssModuleHmr.module.css new file mode 100644 index 000000000000..8e1e3298f56d --- /dev/null +++ b/packages/astro/test/fixtures/0-css/src/components/CssModuleHmr.module.css @@ -0,0 +1,3 @@ +.title { + font-family: fantasy; +} diff --git a/packages/astro/test/fixtures/0-css/src/pages/css-module-hmr.astro b/packages/astro/test/fixtures/0-css/src/pages/css-module-hmr.astro new file mode 100644 index 000000000000..02f5ee17f720 --- /dev/null +++ b/packages/astro/test/fixtures/0-css/src/pages/css-module-hmr.astro @@ -0,0 +1,17 @@ +--- +import CssModuleHmr from '../components/CssModuleHmr.jsx'; +--- + + + + CSS Module HMR + + +
+ +
+
+ +
+ + diff --git a/packages/astro/test/units/dev/css-module-scoped-name.test.ts b/packages/astro/test/units/dev/css-module-scoped-name.test.ts index 028d6d058df2..afb2a62af00c 100644 --- a/packages/astro/test/units/dev/css-module-scoped-name.test.ts +++ b/packages/astro/test/units/dev/css-module-scoped-name.test.ts @@ -3,6 +3,8 @@ import { describe, it } from 'node:test'; import { createVite } from '../../../dist/core/create-vite.js'; import { createBasicSettings, defaultLogger } from '../test-utils.ts'; +type GenerateScopedName = (name: string, filename: string, css: string) => string; + describe('CSS module scoped name in dev', () => { it('provides a stable generateScopedName in dev mode', async () => { const settings = await createBasicSettings(); @@ -20,7 +22,7 @@ describe('CSS module scoped name in dev', () => { ); const generateScopedName = config.css?.modules - ? (config.css.modules as { generateScopedName?: Function }).generateScopedName + ? (config.css.modules as { generateScopedName?: GenerateScopedName }).generateScopedName : undefined; assert.ok( @@ -68,7 +70,7 @@ describe('CSS module scoped name in dev', () => { const modules = config.css?.modules; const generateScopedName = modules - ? (modules as { generateScopedName?: Function }).generateScopedName + ? (modules as { generateScopedName?: GenerateScopedName }).generateScopedName : undefined; assert.equal( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2dc013a0293..b7680c3d0696 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7196,28 +7196,6 @@ importers: specifier: ^4.22.0 version: 4.23.13 - triage/gh-18105: - dependencies: - '@astrojs/react': - specifier: workspace:* - version: link:../../packages/integrations/react - astro: - specifier: workspace:* - version: link:../../packages/astro - react: - specifier: 19.2.6 - version: 19.2.6 - react-dom: - specifier: 19.2.6 - version: 19.2.6(react@19.2.6) - devDependencies: - '@types/react': - specifier: 19.2.7 - version: 19.2.7 - '@types/react-dom': - specifier: 19.2.3 - version: 19.2.3(@types/react@19.2.7) - packages: '@anthropic-ai/sdk@0.91.1': @@ -11153,11 +11131,6 @@ packages: peerDependencies: '@types/react': ^18.0.0 - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 - '@types/react-dom@19.2.7': resolution: {integrity: sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==} peerDependencies: @@ -15378,11 +15351,6 @@ packages: peerDependencies: react: ^19.2.4 - react-dom@19.2.6: - resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} - peerDependencies: - react: ^19.2.6 - react-dom@19.3.0: resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==} peerDependencies: @@ -15399,10 +15367,6 @@ packages: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} - react@19.2.6: - resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} - engines: {node: '>=0.10.0'} - react@19.3.0: resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} @@ -21087,10 +21051,6 @@ snapshots: dependencies: '@types/react': 18.3.31 - '@types/react-dom@19.2.3(@types/react@19.2.7)': - dependencies: - '@types/react': 19.2.7 - '@types/react-dom@19.2.7(@types/react@19.2.18)': dependencies: '@types/react': 19.2.18 @@ -26110,11 +26070,6 @@ snapshots: react: 19.2.4 scheduler: 0.27.0 - react-dom@19.2.6(react@19.2.6): - dependencies: - react: 19.2.6 - scheduler: 0.27.0 - react-dom@19.3.0(react@19.3.0): dependencies: react: 19.3.0 @@ -26128,8 +26083,6 @@ snapshots: react@19.2.4: {} - react@19.2.6: {} - react@19.3.0: {} read-package-up@11.0.0: From 74025aa291a001dfbf161ab11f1f4b46e5bf9fff Mon Sep 17 00:00:00 2001 From: "factory[bot]" Date: Mon, 28 Sep 2026 15:07:13 +0000 Subject: [PATCH 3/3] fix: address review feedback on CSS Module dev HMR - Remove the unrelated `@types/react@19.2.7` package/snapshot entries from pnpm-lock.yaml and restore the `types-react-dom@19.0.0-alpha.3` snapshot to resolve `@types/react@18.3.31`. - Add a Playwright e2e regression test in `e2e/hmr.test.ts` that edits a CSS module shared by an SSR instance and a `client:load` island and verifies both update via HMR without a full reload and keep the same generated class name. --- .../pages/scss-module-ssr-and-island.astro | 17 +++++++++++ packages/astro/e2e/hmr.test.ts | 29 +++++++++++++++++++ pnpm-lock.yaml | 9 +----- 3 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 packages/astro/e2e/fixtures/hmr/src/pages/scss-module-ssr-and-island.astro diff --git a/packages/astro/e2e/fixtures/hmr/src/pages/scss-module-ssr-and-island.astro b/packages/astro/e2e/fixtures/hmr/src/pages/scss-module-ssr-and-island.astro new file mode 100644 index 000000000000..20428cb72012 --- /dev/null +++ b/packages/astro/e2e/fixtures/hmr/src/pages/scss-module-ssr-and-island.astro @@ -0,0 +1,17 @@ +--- +import ScssModuleHeading from '../components/ScssModuleHeading.jsx'; +--- + + + + Test + + +
+ +
+
+ +
+ + diff --git a/packages/astro/e2e/hmr.test.ts b/packages/astro/e2e/hmr.test.ts index bf1024d3acfa..24cd3c9230da 100644 --- a/packages/astro/e2e/hmr.test.ts +++ b/packages/astro/e2e/hmr.test.ts @@ -110,6 +110,35 @@ test.describe('Styles', () => { await expect(h).toHaveCSS('color', 'rgb(255, 0, 0)'); }); + test('SCSS modules shared by SSR and hydrated island refresh with HMR', async ({ page, astro }) => { + await page.goto(astro.resolveUrl('/scss-module-ssr-and-island')); + await waitForViteToSettle(page); + + page.once('load', throwPageShouldNotReload); + + const ssr = page.locator('#ssr h1'); + const island = page.locator('#island h1'); + + await expect(ssr).toHaveCSS('color', 'rgb(0, 0, 255)'); + await expect(island).toHaveCSS('color', 'rgb(0, 0, 255)'); + + const ssrClass = await ssr.getAttribute('class'); + const islandClass = await island.getAttribute('class'); + expect(ssrClass).toBe(islandClass); + + await astro.editFile('./src/styles/scss-module.module.scss', (original) => + original.replace('blue', 'red'), + ); + + await expect(ssr).toHaveCSS('color', 'rgb(255, 0, 0)'); + await expect(island).toHaveCSS('color', 'rgb(255, 0, 0)'); + + const ssrClassAfter = await ssr.getAttribute('class'); + const islandClassAfter = await island.getAttribute('class'); + expect(ssrClassAfter).toBe(ssrClass); + expect(islandClassAfter).toBe(islandClass); + }); + test('external SCSS refresh with HMR', async ({ page, astro }) => { await page.goto(astro.resolveUrl('/scss-external')); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7680c3d0696..ece61ce119a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11142,9 +11142,6 @@ packages: '@types/react@19.2.18': resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} - '@types/react@19.2.7': - resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} - '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -21064,10 +21061,6 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/react@19.2.7': - dependencies: - csstype: 3.2.3 - '@types/retry@0.12.0': {} '@types/retry@0.12.2': {} @@ -27212,7 +27205,7 @@ snapshots: types-react-dom@19.0.0-alpha.3: dependencies: - '@types/react': 19.2.7 + '@types/react': 18.3.31 types-react@19.0.0-alpha.3: dependencies: