diff --git a/.changeset/third-parties-react-19.md b/.changeset/third-parties-react-19.md
new file mode 100644
index 0000000..eba103e
--- /dev/null
+++ b/.changeset/third-parties-react-19.md
@@ -0,0 +1,5 @@
+---
+'rspress-plugin-third-parties': patch
+---
+
+Remove React Compiler and its runtime dependency while preserving compatibility with React 18 and React 19.
diff --git a/packages/rspress-plugin-third-parties/README.md b/packages/rspress-plugin-third-parties/README.md
index 58a2d8e..40c50c8 100644
--- a/packages/rspress-plugin-third-parties/README.md
+++ b/packages/rspress-plugin-third-parties/README.md
@@ -10,7 +10,7 @@
[](https://www.npmjs.com/package/rspress-plugin-third-parties)
[](https://www.npmjs.com/package/rspress-plugin-third-parties)
[](https://github.com/rstackjs/rspress-plugins/blob/main/packages/rspress-plugin-third-parties/LICENSE)
-[](https://react.dev/)
+[](https://react.dev/)
[](https://rspress.rs/)
[](https://sanjaiyan-dev.github.io/rspress-plugin-third-parties)
@@ -34,7 +34,7 @@
External embeds (like YouTube, Google Maps, and Twitter/X posts) and script tags (like GA4 and GTM) are notorious for blocking the main thread, lowering Lighthouse performance scores, and causing layout shifts. This plugin solves that by providing:
-- β‘ **React Compiler Pre-Optimized**: Ships fully compiled with automated auto-memoization at build-time. Zero unnecessary re-renders.
+- β‘ **React 18 & 19 Compatible**: Supports both React versions with the matching React DOM version.
- π **Non-Blocking Execution**: Lazy loading scripts using `requestIdleCallback` and fine-grained loading strategies.
- β‘ **React 19 Resource Pre-initialization**: Leverages native `ReactDOM.preinit` and `ReactDOM.preload` during SSG/SSR.
- π§ **Smart Memory Caching**: Built-in script deduplication and stylesheet cache registry.
@@ -63,6 +63,8 @@ External embeds (like YouTube, Google Maps, and Twitter/X posts) and script tags
## π¦ Installation
+Supports React 18 and React 19 with the matching React DOM version.
+
Install via your preferred package manager:
diff --git a/packages/rspress-plugin-third-parties/docs/index.mdx b/packages/rspress-plugin-third-parties/docs/index.mdx
index d020202..14927ce 100644
--- a/packages/rspress-plugin-third-parties/docs/index.mdx
+++ b/packages/rspress-plugin-third-parties/docs/index.mdx
@@ -6,7 +6,7 @@ titleSuffix: 'Zero Main-Thread Blocking Third-Party Integrations'
hero:
name: Rspress Third Parties
text: High-Performance Third-Party Integrations
- tagline: Zero main-thread blocking YouTube, Google Maps, Tweet/X Embeds, GA4, GTM & custom script strategies built for React 19 & React Compiler.
+ tagline: YouTube, Google Maps, Tweet/X Embeds, GA4, GTM & custom script loading strategies for React 18 & 19.
image:
src: /rspress-plugin-third-party-hero.png
alt: Rspress Third Parties Hero Image
@@ -22,8 +22,8 @@ features:
- title: 'β‘ Zero Main-Thread Blocking'
details: Defers heavy third-party scripts via requestIdleCallback and lazy loading strategies to preserve 100/100 Lighthouse performance.
icon: π
- - title: 'π§ React Compiler Pre-Optimized'
- details: Ships pre-compiled with React 19 auto-memoization at build time for instant client-side rendering with zero runtime overhead.
+ - title: 'π§ React 18 & 19 Compatible'
+ details: Supports React 18 and React 19 with the matching React DOM version.
icon: β‘
- title: 'πΊοΈ Media, Tweets & Location Embeds'
details: High-performance, zero-layout-shift components for YouTube, Twitter/X Posts, Google Maps (Point Pedro!), GA4, and Google Tag Manager.
diff --git a/packages/rspress-plugin-third-parties/package.json b/packages/rspress-plugin-third-parties/package.json
index cd46575..65f30cf 100644
--- a/packages/rspress-plugin-third-parties/package.json
+++ b/packages/rspress-plugin-third-parties/package.json
@@ -52,7 +52,6 @@
"provenance": true
},
"dependencies": {
- "react-compiler-runtime": "0.0.0-experimental-a1856f3-20260507",
"react-tweet": "^3.3.1",
"third-party-capital": "^3.0.0"
},
@@ -66,11 +65,9 @@
"@rspress/core": "catalog:",
"@types/node": "catalog:",
"@types/react": "catalog:",
- "@types/react-dom": "^18.3.7",
- "babel-plugin-react-compiler": "0.0.0-experimental-a1856f3-20260507",
+ "@types/react-dom": "catalog:",
"react": "catalog:",
"react-dom": "catalog:",
- "react-render-to-markdown": "^18.3.1",
"rspress-plugin-third-parties": "workspace:*",
"typescript": "catalog:"
}
diff --git a/packages/rspress-plugin-third-parties/rstack.config.ts b/packages/rspress-plugin-third-parties/rstack.config.ts
index a5b45d1..418a896 100644
--- a/packages/rspress-plugin-third-parties/rstack.config.ts
+++ b/packages/rspress-plugin-third-parties/rstack.config.ts
@@ -28,7 +28,7 @@ define.lib({
target: 'web',
autoExternal: true,
},
- plugins: [pluginReact({ reactCompiler: { target: '18' } })],
+ plugins: [pluginReact()],
},
],
});
diff --git a/packages/rspress-plugin-third-parties/src/components/Script.tsx b/packages/rspress-plugin-third-parties/src/components/Script.tsx
index 9447b70..4854a94 100644
--- a/packages/rspress-plugin-third-parties/src/components/Script.tsx
+++ b/packages/rspress-plugin-third-parties/src/components/Script.tsx
@@ -10,7 +10,7 @@ import { requestIdleCallback, setAttributesFromProps } from './utils';
const ScriptCache = new Map>();
const LoadCache = new Set();
-// Deduplication tracker for React 18 stylesheets
+// Deduplication tracker for stylesheets inserted without resource APIs
const insertedStylesheets = new Set();
export interface ScriptProps extends Omit<
@@ -57,7 +57,7 @@ const insertStylesheets = (stylesheets: string[]) => {
return;
}
- // Fall back to standard DOM manipulation on React 18 client-side
+ // Fall back to standard DOM manipulation when resource APIs are unavailable
if (typeof window !== 'undefined') {
const head = document.head;
stylesheets.forEach((stylesheet: string) => {
diff --git a/packages/rspress-plugin-third-parties/tests/components.spec.ts b/packages/rspress-plugin-third-parties/tests/components.spec.ts
index adb178b..5c10f98 100644
--- a/packages/rspress-plugin-third-parties/tests/components.spec.ts
+++ b/packages/rspress-plugin-third-parties/tests/components.spec.ts
@@ -7,6 +7,7 @@ import {
type PlaywrightFixture,
} from '../../../e2e/test.ts';
import { useRspressDevServer } from '../../../e2e/utils.ts';
+import { reactDom } from '../src/components/reactDom';
const pageUrl = useRspressDevServer(join(import.meta.dirname, 'fixture'));
const scenarioUrl = (scenario: string) =>
@@ -189,15 +190,22 @@ describe('Script', () => {
});
}
- test('preinitializes stylesheets with medium precedence', async ({
+ test('loads stylesheets with resource APIs or the DOM fallback', async ({
page,
}) => {
await page.goto(scenarioUrl('script-styles'));
- await expect(
- page.locator(
- 'link[rel="stylesheet"][href="https://example.com/style.css"]',
- ),
- ).toHaveAttribute('data-precedence', 'medium');
+ const stylesheet = page.locator(
+ 'link[rel="stylesheet"][href="https://example.com/style.css"]',
+ );
+ await expect(stylesheet).toHaveCount(1);
+ if (
+ typeof reactDom.preinit === 'function' ||
+ typeof reactDom.experimental_preinit === 'function'
+ ) {
+ await expect(stylesheet).toHaveAttribute('data-precedence', 'medium');
+ } else {
+ await expect(stylesheet).not.toHaveAttribute('data-precedence');
+ }
});
test('creates exactly one scroll button from the native load callback', async ({
@@ -265,14 +273,25 @@ describe('YouTubeEmbed', () => {
await expect(embed.locator('..')).toHaveCSS('height', '360px');
});
- test('preconnects to the script CDN', async ({ page }) => {
+ test('preconnects to the script CDN when resource APIs are available', async ({
+ page,
+ }) => {
await page.goto(scenarioUrl('youtube-default'));
- await expect(
- page.locator('link[rel="preconnect"][href="https://cdn.jsdelivr.net"]'),
- ).toHaveAttribute('crossorigin', '');
+ await expect(page.locator('lite-youtube')).toHaveCount(1);
+ const preconnect = page.locator(
+ 'link[rel="preconnect"][href="https://cdn.jsdelivr.net"]',
+ );
+ if (
+ typeof reactDom.preconnect === 'function' ||
+ typeof reactDom.experimental_preconnect === 'function'
+ ) {
+ await expect(preconnect).toHaveAttribute('crossorigin', '');
+ } else {
+ await expect(preconnect).toHaveCount(0);
+ }
});
- test('loads with the React 18 resource API fallback', async ({ page }) => {
+ test('loads when resource APIs are unavailable', async ({ page }) => {
await page.goto(scenarioUrl('youtube-no-resources'));
await expect(page.locator('lite-youtube')).toHaveAttribute(
'videoid',
diff --git a/packages/rspress-plugin-third-parties/tests/fixture/Scenarios.tsx b/packages/rspress-plugin-third-parties/tests/fixture/Scenarios.tsx
index b4a1645..5682019 100644
--- a/packages/rspress-plugin-third-parties/tests/fixture/Scenarios.tsx
+++ b/packages/rspress-plugin-third-parties/tests/fixture/Scenarios.tsx
@@ -112,13 +112,13 @@ export function Scenarios(): JSX.Element {
useEffect(() => {
const name = new URLSearchParams(location.search).get('scenario') || '';
if (name === 'youtube-no-resources') {
- // Exercise the React 18 fallback without resource APIs. This page has its
+ // Exercise the fallback without resource APIs. This page has its
// own browser context, so the override cannot leak into other tests.
- reactDom.preconnect = undefined;
+ Reflect.set(reactDom, 'preconnect', undefined);
reactDom.experimental_preconnect = undefined;
- reactDom.preinit = undefined;
+ Reflect.set(reactDom, 'preinit', undefined);
reactDom.experimental_preinit = undefined;
- reactDom.preload = undefined;
+ Reflect.set(reactDom, 'preload', undefined);
reactDom.experimental_preload = undefined;
}
setScenario(name);
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 398f566..7aef97c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,14 +20,17 @@ catalogs:
specifier: ^24.13.3
version: 24.13.3
'@types/react':
- specifier: ^18.3.31
- version: 18.3.31
+ specifier: ^19.3.0
+ version: 19.3.0
+ '@types/react-dom':
+ specifier: ^19.3.0
+ version: 19.3.0
react:
- specifier: ^18.3.1
- version: 18.3.1
+ specifier: ^19.2.8
+ version: 19.2.8
react-dom:
- specifier: ^18.3.1
- version: 18.3.1
+ specifier: ^19.2.8
+ version: 19.2.8
typescript:
specifier: ^6.0.3
version: 6.0.3
@@ -65,7 +68,7 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
concurrently:
specifier: ^10.0.4
version: 10.0.4
@@ -86,10 +89,10 @@ importers:
version: 1.61.1
react:
specifier: 'catalog:'
- version: 18.3.1
+ version: 19.2.8
react-dom:
specifier: 'catalog:'
- version: 18.3.1(react@18.3.1)
+ version: 19.2.8(react@19.2.8)
rsbuild-plugin-publint:
specifier: ^1.0.0
version: 1.0.0(@rsbuild/core@2.1.8)
@@ -142,13 +145,13 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
'@types/throttle-debounce':
specifier: ^5.0.2
version: 5.0.2
react:
specifier: 'catalog:'
- version: 18.3.1
+ version: 19.2.8
rspress-plugin-back-to-top:
specifier: workspace:*
version: 'link:'
@@ -253,16 +256,16 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
material-icon-theme:
specifier: ^5.30.0
version: 5.37.0
react:
specifier: 'catalog:'
- version: 18.3.1
+ version: 19.2.8
react-dom:
specifier: 'catalog:'
- version: 18.3.1(react@18.3.1)
+ version: 19.2.8(react@19.2.8)
rspress-plugin-file-tree:
specifier: workspace:*
version: 'link:'
@@ -312,7 +315,7 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
rspress-plugin-google-analytics:
specifier: workspace:*
version: 'link:'
@@ -368,7 +371,7 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
rspress-plugin-live2d:
specifier: workspace:*
version: 'link:'
@@ -393,7 +396,7 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
rspress-plugin-mermaid:
specifier: workspace:*
version: 'link:'
@@ -418,7 +421,7 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
rspress-plugin-reading-time:
specifier: workspace:*
version: 'link:'
@@ -447,12 +450,9 @@ importers:
packages/rspress-plugin-third-parties:
dependencies:
- react-compiler-runtime:
- specifier: 0.0.0-experimental-a1856f3-20260507
- version: 0.0.0-experimental-a1856f3-20260507(react@18.3.1)
react-tweet:
specifier: ^3.3.1
- version: 3.3.1(react-dom@18.3.1)(react@18.3.1)
+ version: 3.3.1(react-dom@19.2.8)(react@19.2.8)
third-party-capital:
specifier: ^3.0.0
version: 3.0.0
@@ -468,22 +468,16 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
'@types/react-dom':
- specifier: ^18.3.7
- version: 18.3.7(@types/react@18.3.31)
- babel-plugin-react-compiler:
- specifier: 0.0.0-experimental-a1856f3-20260507
- version: 0.0.0-experimental-a1856f3-20260507
+ specifier: 'catalog:'
+ version: 19.3.0(@types/react@19.3.0)
react:
specifier: 'catalog:'
- version: 18.3.1
+ version: 19.2.8
react-dom:
specifier: 'catalog:'
- version: 18.3.1(react@18.3.1)
- react-render-to-markdown:
- specifier: ^18.3.1
- version: 18.3.2(react@18.3.1)
+ version: 19.2.8(react@19.2.8)
rspress-plugin-third-parties:
specifier: workspace:*
version: 'link:'
@@ -505,7 +499,7 @@ importers:
version: 24.13.3
'@types/react':
specifier: 'catalog:'
- version: 18.3.31
+ version: 19.3.0
rspress-plugin-vercel-analytics:
specifier: workspace:*
version: 'link:'
@@ -577,22 +571,10 @@ packages:
resolution: {integrity: sha512-4cmGQEHoP9GLHEhGvd1vgSzO3Y6KF7FczDk4+q/VfXV9/9sNxNVgNHC8t3BglhIADDcoHrCMc9aw4lHG+M240A==}
engines: {node: '>= 10'}
- '@babel/helper-string-parser@7.29.7':
- resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-identifier@7.29.7':
- resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
- engines: {node: '>=6.9.0'}
-
'@babel/runtime@7.29.7':
resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
engines: {node: '>=6.9.0'}
- '@babel/types@7.29.8':
- resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
- engines: {node: '>=6.9.0'}
-
'@braintree/sanitize-url@6.0.4':
resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==}
@@ -1478,16 +1460,10 @@ packages:
'@types/node@26.4.1':
resolution: {integrity: sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==}
- '@types/prop-types@15.7.15':
- resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
-
- '@types/react-dom@18.3.7':
- resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==}
+ '@types/react-dom@19.3.0':
+ resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==}
peerDependencies:
- '@types/react': ^18.0.0
-
- '@types/react@18.3.31':
- resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==}
+ '@types/react': ^19.3.0
'@types/react@19.3.0':
resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==}
@@ -1745,9 +1721,6 @@ packages:
async@3.2.6:
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
- babel-plugin-react-compiler@0.0.0-experimental-a1856f3-20260507:
- resolution: {integrity: sha512-NH/o9ojGrQ5xQhkLry8KulKssfWuM68myEGVUpIJhExt1/WVWBOTBPSPGiSRoJtfB9yP8Kj4UXZpLXKFCXineg==}
-
bail@2.0.2:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
@@ -2418,9 +2391,6 @@ packages:
jju@1.4.0:
resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
js-yaml@3.15.0:
resolution: {integrity: sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==}
hasBin: true
@@ -2486,10 +2456,6 @@ packages:
longest-streak@3.1.0:
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
- loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
- hasBin: true
-
make-dir@3.1.0:
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
engines: {node: '>=8'}
@@ -2966,16 +2932,6 @@ packages:
queue-microtask@1.2.3:
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
- react-compiler-runtime@0.0.0-experimental-a1856f3-20260507:
- resolution: {integrity: sha512-2UOQV9KDc/W7/aIFp+Y817a4nOoj9kWjvg3dVrlTb9I9dtXyMgC6/FnaWRYE50xOwJbbz2h/v6vemVu1u1ZaBQ==}
- peerDependencies:
- react: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental
-
- react-dom@18.3.1:
- resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
- peerDependencies:
- react: ^18.3.1
-
react-dom@19.2.8:
resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==}
peerDependencies:
@@ -2984,12 +2940,6 @@ packages:
react-lazy-with-preload@2.2.1:
resolution: {integrity: sha512-ONSb8gizLE5jFpdHAclZ6EAAKuFX2JydnFXPPPjoUImZlLjGtKzyBS8SJgJq7CpLgsGKh9QCZdugJyEEOVC16Q==}
- react-reconciler@0.29.2:
- resolution: {integrity: sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==}
- engines: {node: '>=0.10.0'}
- peerDependencies:
- react: ^18.3.1
-
react-reconciler@0.33.0:
resolution: {integrity: sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==}
engines: {node: '>=0.10.0'}
@@ -3000,11 +2950,6 @@ packages:
resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==}
engines: {node: '>=0.10.0'}
- react-render-to-markdown@18.3.2:
- resolution: {integrity: sha512-sBYF4ItGTbP3+EXik2wWV7AwrLbD1OVIfWh53a3ueEzicZgZc64eW4Fw8j19bx0GXLVNOAQzs/isSPPVSIqmlw==}
- peerDependencies:
- react: '>=18.2.0'
-
react-render-to-markdown@19.1.0:
resolution: {integrity: sha512-dF9b3tO41ezqdmHP8X92kbHbMexJ6iC7iHw4ykC8fwiO7DgpFc9PhMoKlI+BcPzRxGcWgQSdrixVB9RykhjJpQ==}
peerDependencies:
@@ -3033,10 +2978,6 @@ packages:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
- react@18.3.1:
- resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
- engines: {node: '>=0.10.0'}
-
react@19.2.8:
resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==}
engines: {node: '>=0.10.0'}
@@ -3199,9 +3140,6 @@ packages:
resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
engines: {node: '>=11.0.0'}
- scheduler@0.23.2:
- resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
-
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
@@ -3557,17 +3495,8 @@ snapshots:
'@ast-grep/napi-win32-ia32-msvc': 0.45.1
'@ast-grep/napi-win32-x64-msvc': 0.45.1
- '@babel/helper-string-parser@7.29.7': {}
-
- '@babel/helper-validator-identifier@7.29.7': {}
-
'@babel/runtime@7.29.7': {}
- '@babel/types@7.29.8':
- dependencies:
- '@babel/helper-string-parser': 7.29.7
- '@babel/helper-validator-identifier': 7.29.7
-
'@braintree/sanitize-url@6.0.4': {}
'@changesets/apply-release-plan@7.1.1':
@@ -4537,16 +4466,9 @@ snapshots:
dependencies:
undici-types: 8.3.0
- '@types/prop-types@15.7.15': {}
-
- '@types/react-dom@18.3.7(@types/react@18.3.31)':
- dependencies:
- '@types/react': 18.3.31
-
- '@types/react@18.3.31':
+ '@types/react-dom@19.3.0(@types/react@19.3.0)':
dependencies:
- '@types/prop-types': 15.7.15
- csstype: 3.2.3
+ '@types/react': 19.3.0
'@types/react@19.3.0':
dependencies:
@@ -4698,10 +4620,6 @@ snapshots:
async@3.2.6: {}
- babel-plugin-react-compiler@0.0.0-experimental-a1856f3-20260507:
- dependencies:
- '@babel/types': 7.29.8
-
bail@2.0.2: {}
balanced-match@4.0.4: {}
@@ -5448,8 +5366,6 @@ snapshots:
jju@1.4.0: {}
- js-tokens@4.0.0: {}
-
js-yaml@3.15.0:
dependencies:
argparse: 1.0.10
@@ -5515,10 +5431,6 @@ snapshots:
longest-streak@3.1.0: {}
- loose-envify@1.4.0:
- dependencies:
- js-tokens: 4.0.0
-
make-dir@3.1.0:
dependencies:
semver: 6.3.1
@@ -6376,16 +6288,6 @@ snapshots:
queue-microtask@1.2.3: {}
- react-compiler-runtime@0.0.0-experimental-a1856f3-20260507(react@18.3.1):
- dependencies:
- react: 18.3.1
-
- react-dom@18.3.1(react@18.3.1):
- dependencies:
- loose-envify: 1.4.0
- react: 18.3.1
- scheduler: 0.23.2
-
react-dom@19.2.8(react@19.2.8):
dependencies:
react: 19.2.8
@@ -6393,12 +6295,6 @@ snapshots:
react-lazy-with-preload@2.2.1: {}
- react-reconciler@0.29.2(react@18.3.1):
- dependencies:
- loose-envify: 1.4.0
- react: 18.3.1
- scheduler: 0.23.2
-
react-reconciler@0.33.0(react@19.2.8):
dependencies:
react: 19.2.8
@@ -6406,11 +6302,6 @@ snapshots:
react-refresh@0.18.0: {}
- react-render-to-markdown@18.3.2(react@18.3.1):
- dependencies:
- react: 18.3.1
- react-reconciler: 0.29.2(react@18.3.1)
-
react-render-to-markdown@19.1.0(react@19.2.8):
dependencies:
react: 19.2.8
@@ -6430,17 +6321,13 @@ snapshots:
optionalDependencies:
react-dom: 19.2.8(react@19.2.8)
- react-tweet@3.3.1(react-dom@18.3.1)(react@18.3.1):
+ react-tweet@3.3.1(react-dom@19.2.8)(react@19.2.8):
dependencies:
'@swc/helpers': 0.5.23
clsx: 2.1.1
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- swr: 2.5.1(react@18.3.1)
-
- react@18.3.1:
- dependencies:
- loose-envify: 1.4.0
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ swr: 2.5.1(react@19.2.8)
react@19.2.8: {}
@@ -6704,10 +6591,6 @@ snapshots:
sax@1.6.1:
optional: true
- scheduler@0.23.2:
- dependencies:
- loose-envify: 1.4.0
-
scheduler@0.27.0: {}
scroll-into-view-if-needed@3.1.0:
@@ -6816,11 +6699,11 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
- swr@2.5.1(react@18.3.1):
+ swr@2.5.1(react@19.2.8):
dependencies:
dequal: 2.0.3
- react: 18.3.1
- use-sync-external-store: 1.6.0(react@18.3.1)
+ react: 19.2.8
+ use-sync-external-store: 1.6.0(react@19.2.8)
term-size@2.2.1: {}
@@ -6935,9 +6818,9 @@ snapshots:
universalify@2.0.1: {}
- use-sync-external-store@1.6.0(react@18.3.1):
+ use-sync-external-store@1.6.0(react@19.2.8):
dependencies:
- react: 18.3.1
+ react: 19.2.8
util-ts-types@1.0.0: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 88320de..2448ee9 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -11,9 +11,10 @@ catalog:
'@rsbuild/plugin-react': '^2.1.0'
'@rspress/core': '^2.0.22'
'@types/node': '^24.13.3'
- '@types/react': '^18.3.31'
- react: '^18.3.1'
- react-dom: '^18.3.1'
+ '@types/react': '^19.3.0'
+ '@types/react-dom': '^19.3.0'
+ react: '^19.2.8'
+ react-dom: '^19.2.8'
typescript: '^6.0.3'
dedupePeers: true
diff --git a/templates/package.json b/templates/package.json
index ef8c9bd..9a32825 100644
--- a/templates/package.json
+++ b/templates/package.json
@@ -27,10 +27,10 @@
},
"devDependencies": {
"@types/node": "^24.13.3",
- "@types/react": "^18.3.31",
+ "@types/react": "^19.3.0",
"concurrently": "^10.0.4",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
+ "react": "^19.2.8",
+ "react-dom": "^19.2.8",
"rsbuild-plugin-publint": "^1.0.0",
"rspress-plugin-_PLUGIN_NAME_": "workspace:*",
"rstack": "^0.3.2",