diff --git a/.changeset/icy-donkeys-worry.md b/.changeset/icy-donkeys-worry.md new file mode 100644 index 0000000000..727f08c096 --- /dev/null +++ b/.changeset/icy-donkeys-worry.md @@ -0,0 +1,5 @@ +--- +'@tanstack/start-plugin-core': patch +--- + +Fix Rsbuild RSC builds so client directives in packages under `node_modules` are compiled and detected correctly. diff --git a/e2e/react-start/rsc-rsbuild/.gitignore b/e2e/react-start/rsc-rsbuild/.gitignore new file mode 100644 index 0000000000..5524c48fa4 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/.gitignore @@ -0,0 +1,24 @@ +node_modules +!src/node_modules/ +!src/node_modules/rsc-client-pkg/ +!src/node_modules/rsc-client-pkg/** +package-lock.json +yarn.lock + +.DS_Store +.cache +.env +.vercel +.output + +/build/ +/api/ +/server/build +/public/build +/dist/ +/dist-rsbuild-*/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ +port-*.txt diff --git a/e2e/react-start/rsc-rsbuild/.prettierignore b/e2e/react-start/rsc-rsbuild/.prettierignore new file mode 100644 index 0000000000..69750fb197 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/.prettierignore @@ -0,0 +1 @@ +.prettierrc diff --git a/e2e/react-start/rsc-rsbuild/package.json b/e2e/react-start/rsc-rsbuild/package.json new file mode 100644 index 0000000000..6dc5f5f5a1 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/package.json @@ -0,0 +1,40 @@ +{ + "name": "tanstack-react-start-e2e-rsc-rsbuild", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "dev": "rsbuild dev", + "dev:e2e": "rsbuild dev --port $PORT", + "build": "rsbuild build && tsc --noEmit", + "start": "node server.js", + "test:e2e-full": "pnpm build && sh -c 'rm -f \"port-${E2E_PORT_KEY:-$npm_package_name}.txt\" \"port-${E2E_PORT_KEY:-$npm_package_name}-external.txt\"' && playwright test --project=chromium" + }, + "nx": { + "metadata": { + "playwrightModes": [ + { + "toolchain": "rsbuild", + "mode": "ssr" + } + ] + } + }, + "dependencies": { + "@tanstack/react-router": "workspace:^", + "@tanstack/react-start": "workspace:^", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@playwright/test": "^1.50.1", + "@rsbuild/core": "^2.0.8", + "@rsbuild/plugin-react": "^2.0.0", + "@tanstack/router-e2e-utils": "workspace:^", + "@types/node": "^22.10.2", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "srvx": "^0.10.0", + "typescript": "^5.7.2" + } +} diff --git a/e2e/react-start/rsc-rsbuild/playwright.config.ts b/e2e/react-start/rsc-rsbuild/playwright.config.ts new file mode 100644 index 0000000000..9bb7586df5 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/playwright.config.ts @@ -0,0 +1,58 @@ +import fs from 'node:fs' +import { defineConfig, devices } from '@playwright/test' +import { + getDummyServerPort, + getTestServerPort, +} from '@tanstack/router-e2e-utils' +import packageJson from './package.json' with { type: 'json' } + +const e2ePortKey = process.env.E2E_PORT_KEY ?? packageJson.name +const distDir = process.env.E2E_DIST_DIR ?? 'dist' + +if (process.env.TEST_WORKER_INDEX === undefined) { + for (const portFile of [ + `port-${e2ePortKey}.txt`, + `port-${e2ePortKey}-external.txt`, + ]) { + fs.rmSync(portFile, { force: true }) + } +} + +const PORT = await getTestServerPort(e2ePortKey) +const EXTERNAL_PORT = await getDummyServerPort(e2ePortKey) +const baseURL = `http://localhost:${PORT}` + +export default defineConfig({ + testDir: './tests', + workers: 1, + reporter: [['line']], + + globalSetup: './tests/setup/global.setup.ts', + globalTeardown: './tests/setup/global.teardown.ts', + + use: { + baseURL, + }, + + webServer: { + command: 'pnpm start', + url: baseURL, + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + env: { + PORT: String(PORT), + E2E_DIST_DIR: distDir, + E2E_PORT_KEY: e2ePortKey, + EXTERNAL_SERVER_URL: `http://localhost:${EXTERNAL_PORT}`, + }, + }, + + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + }, + }, + ], +}) diff --git a/e2e/react-start/rsc-rsbuild/rsbuild.config.ts b/e2e/react-start/rsc-rsbuild/rsbuild.config.ts new file mode 100644 index 0000000000..9d34d884f5 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/rsbuild.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from '@rsbuild/core' +import { pluginReact } from '@rsbuild/plugin-react' +import { tanstackStart } from '@tanstack/react-start/plugin/rsbuild' + +const outDir = process.env.E2E_DIST_DIR ?? 'dist' + +export default defineConfig({ + plugins: [ + pluginReact({ splitChunks: false }), + tanstackStart({ + rsc: { + enabled: true, + }, + }), + ], + output: { + distPath: { + root: outDir, + }, + }, +}) diff --git a/e2e/react-start/rsc-rsbuild/server.js b/e2e/react-start/rsc-rsbuild/server.js new file mode 100644 index 0000000000..6d53885821 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/server.js @@ -0,0 +1,57 @@ +import fs from 'node:fs' +import path from 'node:path' +import { spawn } from 'node:child_process' +import { pathToFileURL } from 'node:url' + +const distDir = process.env.E2E_DIST_DIR || 'dist' + +function resolveDistClientDir() { + return path.resolve(distDir, 'client') +} + +function resolveDistServerEntryPath() { + const serverJsPath = path.resolve(distDir, 'server', 'server.js') + if (fs.existsSync(serverJsPath)) { + return serverJsPath + } + + const indexJsPath = path.resolve(distDir, 'server', 'index.js') + if (fs.existsSync(indexJsPath)) { + return indexJsPath + } + + return serverJsPath +} + +export function resolveStartCommand() { + const distClientDir = resolveDistClientDir() + const distServerEntryPath = resolveDistServerEntryPath() + return `srvx --prod -s ${JSON.stringify(distClientDir)} ${JSON.stringify(distServerEntryPath)}` +} + +export function start() { + const child = spawn( + 'srvx', + ['--prod', '-s', resolveDistClientDir(), resolveDistServerEntryPath()], + { + stdio: 'inherit', + shell: process.platform === 'win32', + }, + ) + + child.on('exit', (code, signal) => { + if (signal) { + process.kill(process.pid, signal) + return + } + + process.exit(code ?? 0) + }) +} + +if ( + process.argv[1] && + import.meta.url === pathToFileURL(process.argv[1]).href +) { + start() +} diff --git a/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/index.d.ts b/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/index.d.ts new file mode 100644 index 0000000000..38ecad9927 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/index.d.ts @@ -0,0 +1,5 @@ +import type { ReactElement } from 'react' + +export function NodeModuleClientWidget(props: { + label: string +}): ReactElement diff --git a/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/index.js b/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/index.js new file mode 100644 index 0000000000..75080ca08a --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/index.js @@ -0,0 +1,17 @@ +'use client' + +import * as React from 'react' + +export function NodeModuleClientWidget(props) { + const [count, setCount] = React.useState(0) + + return React.createElement( + 'button', + { + type: 'button', + 'data-testid': 'node-module-client-widget', + onClick: () => setCount((value) => value + 1), + }, + `${props.label}: ${count}`, + ) +} diff --git a/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/package.json b/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/package.json new file mode 100644 index 0000000000..d848213277 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/node_modules/rsc-client-pkg/package.json @@ -0,0 +1,13 @@ +{ + "name": "rsc-client-pkg", + "private": true, + "version": "0.0.0", + "type": "module", + "types": "./index.d.ts", + "exports": { + ".": { + "types": "./index.d.ts", + "default": "./index.js" + } + } +} diff --git a/e2e/react-start/rsc-rsbuild/src/routeTree.gen.ts b/e2e/react-start/rsc-rsbuild/src/routeTree.gen.ts new file mode 100644 index 0000000000..84c964d11b --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/routeTree.gen.ts @@ -0,0 +1,86 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as RscNodeModuleClientRouteImport } from './routes/rsc-node-module-client' +import { Route as IndexRouteImport } from './routes/index' + +const RscNodeModuleClientRoute = RscNodeModuleClientRouteImport.update({ + id: '/rsc-node-module-client', + path: '/rsc-node-module-client', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/rsc-node-module-client': typeof RscNodeModuleClientRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/rsc-node-module-client': typeof RscNodeModuleClientRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/rsc-node-module-client': typeof RscNodeModuleClientRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/rsc-node-module-client' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/rsc-node-module-client' + id: '__root__' | '/' | '/rsc-node-module-client' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + RscNodeModuleClientRoute: typeof RscNodeModuleClientRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/rsc-node-module-client': { + id: '/rsc-node-module-client' + path: '/rsc-node-module-client' + fullPath: '/rsc-node-module-client' + preLoaderRoute: typeof RscNodeModuleClientRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + RscNodeModuleClientRoute: RscNodeModuleClientRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +import type { getRouter } from './router.tsx' +import type { createStart } from '@tanstack/react-start' +declare module '@tanstack/react-start' { + interface Register { + ssr: true + router: Awaited> + } +} diff --git a/e2e/react-start/rsc-rsbuild/src/router.tsx b/e2e/react-start/rsc-rsbuild/src/router.tsx new file mode 100644 index 0000000000..e59e199b48 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/router.tsx @@ -0,0 +1,10 @@ +import { createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +export function getRouter() { + return createRouter({ + routeTree, + scrollRestoration: true, + defaultPreload: 'intent', + }) +} diff --git a/e2e/react-start/rsc-rsbuild/src/routes/__root.tsx b/e2e/react-start/rsc-rsbuild/src/routes/__root.tsx new file mode 100644 index 0000000000..1573aae4f5 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/routes/__root.tsx @@ -0,0 +1,37 @@ +import { + HeadContent, + Outlet, + Scripts, + createRootRoute, + useHydrated, +} from '@tanstack/react-router' + +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { charSet: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + { title: 'Rsbuild RSC test' }, + ], + }), + component: RootComponent, +}) + +function RootComponent() { + const hydrated = useHydrated() + + return ( + + + + + + + {hydrated ? 'hydrated' : 'hydrating'} + + + + + + ) +} diff --git a/e2e/react-start/rsc-rsbuild/src/routes/index.tsx b/e2e/react-start/rsc-rsbuild/src/routes/index.tsx new file mode 100644 index 0000000000..d66168b65d --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/routes/index.tsx @@ -0,0 +1,14 @@ +import { Link, createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Rsbuild RSC fixture

+ Node module client component +
+ ) +} diff --git a/e2e/react-start/rsc-rsbuild/src/routes/rsc-node-module-client.tsx b/e2e/react-start/rsc-rsbuild/src/routes/rsc-node-module-client.tsx new file mode 100644 index 0000000000..00994ffb50 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/routes/rsc-node-module-client.tsx @@ -0,0 +1,23 @@ +import { createFileRoute } from '@tanstack/react-router' +import { getNodeModuleClientServerComponent } from '~/utils/nodeModuleClientServerComponent' + +export const Route = createFileRoute('/rsc-node-module-client')({ + loader: async () => { + const Server = await getNodeModuleClientServerComponent() + return { Server } + }, + component: RscNodeModuleClientComponent, +}) + +function RscNodeModuleClientComponent() { + const { Server } = Route.useLoaderData() + + return ( +
+

+ RSC node_modules client component +

+ {Server} +
+ ) +} diff --git a/e2e/react-start/rsc-rsbuild/src/utils/RscClientPkgContent.tsx b/e2e/react-start/rsc-rsbuild/src/utils/RscClientPkgContent.tsx new file mode 100644 index 0000000000..742f6cbc1a --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/utils/RscClientPkgContent.tsx @@ -0,0 +1,12 @@ +import { NodeModuleClientWidget } from 'rsc-client-pkg' + +export function RscClientPkgContent() { + return ( +
+

+ Server rendered package boundary +

+ +
+ ) +} diff --git a/e2e/react-start/rsc-rsbuild/src/utils/nodeModuleClientServerComponent.tsx b/e2e/react-start/rsc-rsbuild/src/utils/nodeModuleClientServerComponent.tsx new file mode 100644 index 0000000000..1b1fc4727c --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/src/utils/nodeModuleClientServerComponent.tsx @@ -0,0 +1,9 @@ +import { createServerFn } from '@tanstack/react-start' +import { renderServerComponent } from '@tanstack/react-start/rsc' +import { RscClientPkgContent } from './RscClientPkgContent' + +export const getNodeModuleClientServerComponent = createServerFn({ + method: 'GET', +}).handler(async () => { + return renderServerComponent() +}) diff --git a/e2e/react-start/rsc-rsbuild/tests/hydration.ts b/e2e/react-start/rsc-rsbuild/tests/hydration.ts new file mode 100644 index 0000000000..ed6e97c673 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/tests/hydration.ts @@ -0,0 +1,7 @@ +import { expect, type Page } from '@playwright/test' + +export async function waitForHydration(page: Page) { + await expect(page.getByTestId('app-hydrated')).toHaveText('hydrated', { + timeout: 15000, + }) +} diff --git a/e2e/react-start/rsc-rsbuild/tests/rsc-node-module-client.spec.ts b/e2e/react-start/rsc-rsbuild/tests/rsc-node-module-client.spec.ts new file mode 100644 index 0000000000..cd41cc1e6c --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/tests/rsc-node-module-client.spec.ts @@ -0,0 +1,24 @@ +import { expect } from '@playwright/test' +import { test } from '@tanstack/router-e2e-utils' +import { waitForHydration } from './hydration' + +test('hydrates client component imported from node_modules in RSC', async ({ + page, +}) => { + const response = await page.goto('/rsc-node-module-client') + expect(response?.status()).toBe(200) + + await expect(page.getByTestId('rsc-node-module-client-title')).toHaveText( + 'RSC node_modules client component', + ) + await expect(page.getByTestId('rsc-node-module-client-server')).toBeVisible() + await expect(page.getByTestId('node-module-client-widget')).toHaveText( + 'Node module clicks: 0', + ) + + await waitForHydration(page) + await page.getByTestId('node-module-client-widget').click() + await expect(page.getByTestId('node-module-client-widget')).toHaveText( + 'Node module clicks: 1', + ) +}) diff --git a/e2e/react-start/rsc-rsbuild/tests/setup/global.setup.ts b/e2e/react-start/rsc-rsbuild/tests/setup/global.setup.ts new file mode 100644 index 0000000000..3def5f6941 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/tests/setup/global.setup.ts @@ -0,0 +1,6 @@ +import { e2eStartDummyServer } from '@tanstack/router-e2e-utils' +import packageJson from '../../package.json' with { type: 'json' } + +export default async function setup() { + await e2eStartDummyServer(process.env.E2E_PORT_KEY ?? packageJson.name) +} diff --git a/e2e/react-start/rsc-rsbuild/tests/setup/global.teardown.ts b/e2e/react-start/rsc-rsbuild/tests/setup/global.teardown.ts new file mode 100644 index 0000000000..a9ad1445f7 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/tests/setup/global.teardown.ts @@ -0,0 +1,6 @@ +import { e2eStopDummyServer } from '@tanstack/router-e2e-utils' +import packageJson from '../../package.json' with { type: 'json' } + +export default async function teardown() { + await e2eStopDummyServer(process.env.E2E_PORT_KEY ?? packageJson.name) +} diff --git a/e2e/react-start/rsc-rsbuild/tsconfig.json b/e2e/react-start/rsc-rsbuild/tsconfig.json new file mode 100644 index 0000000000..cef9369516 --- /dev/null +++ b/e2e/react-start/rsc-rsbuild/tsconfig.json @@ -0,0 +1,21 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "paths": { + "~/*": ["./src/*"] + }, + "noEmit": true + } +} diff --git a/packages/start-plugin-core/src/rsbuild/plugin.ts b/packages/start-plugin-core/src/rsbuild/plugin.ts index c18222f426..f9e48fe7a2 100644 --- a/packages/start-plugin-core/src/rsbuild/plugin.ts +++ b/packages/start-plugin-core/src/rsbuild/plugin.ts @@ -185,6 +185,21 @@ export function tanStackStartRsbuild( return mergeRsbuildConfig(rsbuildConfig, { source: { + ...(rscEnabled + ? { + include: [ + // RSC needs SWC to inspect package code in node_modules so directives such as "use client" can be discovered. + // This follows Rsbuild's documented broad include form for compiling node_modules, with core-js excluded: + // https://rsbuild.rs/config/source/include#compile-node_modules + // + // TODO: Once the Rspack rule matching needed here is ready, narrow this to React-aware packages, for example via + // descriptionData: { "peerDependencies.react": /./ }, so unrelated dependencies are not sent through swc-loader. + { + not: /[\\/]core-js[\\/]/, + }, + ], + } + : {}), define: { 'process.env.TSS_SERVER_FN_BASE': JSON.stringify(serverFnBase), 'import.meta.env.TSS_SERVER_FN_BASE': diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6aa9b16fea..c8fd476dbf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2018,7 +2018,7 @@ importers: version: 2.0.1 '@rsbuild/plugin-react': specifier: ^2.0.0 - version: 2.0.0(@rsbuild/core@2.0.1)(@rspack/core@2.0.5(@swc/helpers@0.5.21)) + version: 2.0.0(@rsbuild/core@2.0.1)(@rspack/core@2.0.5(@swc/helpers@0.5.23)) '@tanstack/router-e2e-utils': specifier: workspace:^ version: link:../../e2e-utils @@ -2622,6 +2622,49 @@ importers: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + e2e/react-start/rsc-rsbuild: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + devDependencies: + '@playwright/test': + specifier: ^1.57.0 + version: 1.58.0 + '@rsbuild/core': + specifier: ^2.0.8 + version: 2.0.8 + '@rsbuild/plugin-react': + specifier: ^2.0.0 + version: 2.0.0(@rsbuild/core@2.0.8)(@rspack/core@2.0.5(@swc/helpers@0.5.23)) + '@tanstack/router-e2e-utils': + specifier: workspace:^ + version: link:../../e2e-utils + '@types/node': + specifier: 25.0.9 + version: 25.0.9 + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.9) + srvx: + specifier: ^0.10.0 + version: 0.10.1 + typescript: + specifier: ^5.7.2 + version: 5.9.3 + e2e/react-start/scroll-restoration: dependencies: '@tanstack/react-router': @@ -31503,9 +31546,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@rsbuild/plugin-react@2.0.0(@rsbuild/core@2.0.1)(@rspack/core@2.0.5(@swc/helpers@0.5.21))': + '@rsbuild/plugin-react@2.0.0(@rsbuild/core@2.0.1)(@rspack/core@2.0.5(@swc/helpers@0.5.23))': dependencies: - '@rspack/plugin-react-refresh': 2.0.0(@rspack/core@2.0.5(@swc/helpers@0.5.21))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.0(@rspack/core@2.0.5(@swc/helpers@0.5.23))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: '@rsbuild/core': 2.0.1 @@ -31696,13 +31739,6 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.23 - '@rspack/core@2.0.5(@swc/helpers@0.5.21)': - dependencies: - '@rspack/binding': 2.0.5 - optionalDependencies: - '@swc/helpers': 0.5.21 - optional: true - '@rspack/core@2.0.5(@swc/helpers@0.5.23)': dependencies: '@rspack/binding': 2.0.5 @@ -31711,12 +31747,6 @@ snapshots: '@rspack/lite-tapable@1.1.0': {} - '@rspack/plugin-react-refresh@2.0.0(@rspack/core@2.0.5(@swc/helpers@0.5.21))(react-refresh@0.18.0)': - dependencies: - react-refresh: 0.18.0 - optionalDependencies: - '@rspack/core': 2.0.5(@swc/helpers@0.5.21) - '@rspack/plugin-react-refresh@2.0.0(@rspack/core@2.0.5(@swc/helpers@0.5.23))(react-refresh@0.18.0)': dependencies: react-refresh: 0.18.0