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 @@ [![npm version](https://img.shields.io/npm/v/rspress-plugin-third-parties.svg?style=for-the-badge&color=A855F7&labelColor=1F2937)](https://www.npmjs.com/package/rspress-plugin-third-parties) [![npm downloads](https://img.shields.io/npm/dm/rspress-plugin-third-parties.svg?style=for-the-badge&color=3B82F6&labelColor=1F2937)](https://www.npmjs.com/package/rspress-plugin-third-parties) [![license](https://img.shields.io/npm/l/rspress-plugin-third-parties.svg?style=for-the-badge&color=10B981&labelColor=1F2937)](https://github.com/rstackjs/rspress-plugins/blob/main/packages/rspress-plugin-third-parties/LICENSE) -[![React 19](https://img.shields.io/badge/React-19-61DAFB?style=for-the-badge&logo=react&logoColor=black&labelColor=1F2937)](https://react.dev/) +[![React 18 & 19](https://img.shields.io/badge/React-18%20%26%2019-61DAFB?style=for-the-badge&logo=react&logoColor=black&labelColor=1F2937)](https://react.dev/) [![Rspress](https://img.shields.io/badge/Rspress-Plugin-FF4154?style=for-the-badge&logo=rspack&logoColor=white&labelColor=1F2937)](https://rspress.rs/) [![Docs & Demo](https://img.shields.io/badge/Docs_%26_Demo-Explore_Site-34268A?style=for-the-badge&logo=githubpages&logoColor=white&labelColor=0C1D48)](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",