diff --git a/RSC_MODULE_FEDERATION_OVERVIEW.md b/RSC_MODULE_FEDERATION_OVERVIEW.md new file mode 100644 index 000000000000..4e2bd5a8d9e5 --- /dev/null +++ b/RSC_MODULE_FEDERATION_OVERVIEW.md @@ -0,0 +1,310 @@ +# Module Federation + RSC Technical Specification (Current Branch) + +This document describes how Module Federation + React Server Components (RSC) +works in this branch based on actual implementation. + +Primary implementation paths: +- `packages/modernjs-v3/src/cli/index.ts` +- `packages/modernjs-v3/src/cli/configPlugin.ts` +- `packages/modernjs-v3/src/cli/ssrPlugin.ts` +- `packages/modernjs-v3/src/cli/mfRuntimePlugins/*` +- `packages/modernjs-v3/src/runtime/rsc-bridge-expose.ts` +- `packages/modernjs-v3/src/runtime/rsc-client-callback-bootstrap.js` +- `packages/runtime/render/src/client/callServer.ts` +- `packages/runtime/render/src/server/rsc/rsc.tsx` +- `packages/server/core/src/adapters/node/plugins/resource.ts` +- `packages/modernjs-v3/src/server/*` +- `tests/integration/rsc-mf/*` + +## 1) Runtime Components and Responsibilities + +The system has four cooperating parts: + +1. Config/build patching +- Implemented by `moduleFederationConfigPlugin` and `moduleFederationSSRPlugin`. +- Converts user MF config into CSR/SSR target-specific configs and runtime plugin stacks. + +2. Host runtime bridge +- Implemented by `rsc-bridge-runtime-plugin`. +- Loads the remote bridge expose, merges manifest metadata into host runtime manifest, + and creates proxy action modules. + +3. Remote runtime bridge +- Implemented by `rsc-bridge-expose`. +- Exposes `{ getManifest, executeAction }` so host can discover and execute remote actions. + +4. Client/server action transport +- Client: `callServer.ts` plus callback bootstrap resolver. +- Server: `rsc.tsx` action endpoint (`x-rsc-action` based dispatch). + +## 2) Build-Time Specification + +### 2.1 Plugin entry wiring + +`moduleFederationPlugin` in `packages/modernjs-v3/src/cli/index.ts`: +- Initializes shared mutable plugin options (`csrConfig`, `ssrConfig`, plugin refs). +- Registers browser MF plugin on web target. +- Registers server runtime plugin `@module-federation/modern-js-v3/server`. +- Chains: + - `moduleFederationConfigPlugin(...)` + - `moduleFederationSSRPlugin(...)` + +### 2.2 Config loading and cloning + +`getMFConfig` in `configPlugin.ts`: +- Source precedence: + 1. `userConfig.config` if provided. + 2. else `module-federation.config.ts` from project root. +- Uses `jiti` with ESM resolve enabled. + +`moduleFederationConfigPlugin`: +- Creates isolated CSR and SSR copies of MF config (`csrConfig`, `ssrConfig`). +- Applies target-specific patching per bundler chain target (`web` vs non-web). + +### 2.3 Required contracts and enforced invariants + +In `patchMFConfig` and `assertRscMfConfig`: +- `mfConfig.name` is required, otherwise throws. +- If `experiments.rsc === true`, then: + - `experiments.asyncStartup` must be `true`. + - server runtime plugin list must include `@module-federation/node/runtimePlugin`. +- Default `remoteType` becomes `'script'` when unset. + +### 2.4 Runtime plugin injection rules + +`patchMFConfig` injects: +- Always: + - `@module-federation/modern-js-v3/shared-strategy` +- SSR + dev only: + - `@module-federation/modern-js-v3/resolve-entry-ipv4` +- RSC enabled and remotes present: + - `rsc-bridge-runtime-plugin` (resolved local/esm/cjs path) +- Server target only: + - `@module-federation/node/runtimePlugin` + - `@module-federation/node/record-dynamic-remote-entry-hash-plugin` (dev only) + - `@module-federation/modern-js-v3/inject-node-fetch` + +### 2.5 RSC expose normalization + +`setRscExposeConfig` in `configPlugin.ts`: +- For each user expose (except internal bridge expose): + - Prepends `RSC_CLIENT_CALLBACK_BOOTSTRAP_MODULE` to expose import list. + - Sets `layer = 'react-server-components'`. +- Ensures internal expose exists: + - `./__rspack_rsc_bridge__ -> rsc-bridge-expose` module, same RSC layer. + +### 2.6 Dev server and source defaults + +`moduleFederationConfigPlugin` config output: +- Sets `REMOTE_IP_STRATEGY` define always. +- Sets `FEDERATION_IPV4` define in SSR dev mode. +- When exposes exist, adds wildcard CORS headers for dev server. +- Sets `source.enableAsyncEntry` to: + - explicit user value if provided + - else `!enableRsc` fallback + +## 3) Server-Side Loading and Static Asset Support + +### 3.1 Strategy-based bundle loading in server-core + +`packages/server/core/src/adapters/node/plugins/resource.ts`: +- Introduces strategy registry: + - `registerBundleLoaderStrategy` + - `getBundleLoaderStrategies` +- `loadBundle(filepath)` algorithm: + 1. `require` / `compatibleRequire` + 2. if immediate non-promise export: return + 3. if promise export: await once + 4. if unresolved/error: iterate registered strategies + 5. if still unresolved: log and return `undefined` + +### 3.2 Async-startup loader strategy + +`packages/modernjs-v3/src/server/asyncStartupLoader.ts`: +- Detects async-startup signature: + - `var __webpack_exports__ = __webpack_require__.x();` + - and `__webpack_require__.mfAsyncStartup` +- Rewrites call to: + - `__webpack_require__.x({}, [])` +- Executes patched bundle in VM context and returns exports. + +### 3.3 Server plugin registration + +`packages/modernjs-v3/src/server/index.ts`: +- Registers `mfAsyncStartupLoaderStrategy` globally into server-core loader registry. +- In production: + - adds static middleware serving only `/bundles/*.js|.json` +- Optional: + - adds wildcard CORS middleware when `MODERN_MF_AUTO_CORS` is set. + +## 4) RSC Bridge Protocol + +### 4.1 Internal bridge expose + +Remote exposes: +- Key: `./__rspack_rsc_bridge__` +- Interface: + - `getManifest(): ManifestLike` + - `executeAction(actionId: string, args: unknown[]): Promise` + +`ManifestLike` shape: +- `serverManifest?: Record` +- `clientManifest?: Record` +- `serverConsumerModuleMap?: Record` + +### 4.2 Host merge behavior + +In `rsc-bridge-runtime-plugin.ts`, `ensureRemoteAliasMerged(alias, args)`: +1. Ensure single in-flight merge per alias via `aliasMergePromises`. +2. Install proxy module ID: + - `__modernjs_mf_rsc_action_proxy__:` +3. Load remote bridge: + - `${alias}/__rspack_rsc_bridge__` +4. Read remote manifest and merge into host `__webpack_require__.rscM`. +5. Track alias as merged (`mergedRemoteAliases`). + +### 4.3 ID namespacing and mapping + +Module ID namespace: +- `remote-module::` + +Action ID namespace: +- `remote::` + +Why these are different namespaces: +- `remote-module:*` is used for module identity inside `clientManifest` and + `serverConsumerModuleMap` (module graph identity). +- `remote:*` is used for server action references in `serverManifest` and + request header `x-rsc-action` (action invocation identity). +- Keeping them distinct avoids conflating module resolution IDs with action + dispatch IDs, even when both originate from the same remote alias. + +Action remap map: +- global key: `__MODERN_RSC_MF_ACTION_ID_MAP__` +- semantics: + - `rawActionId -> remote::rawActionId` when unique + - `rawActionId -> false` when collision across remotes is detected + +Conflict policy: +- `assertNoConflict` throws if two remotes produce different payloads for same manifest key. + +## 5) Client Action Dispatch Specification + +### 5.1 Core call path + +`packages/runtime/render/src/client/callServer.ts`: +- `requestCallServer(id, args)`: + - resolves action ID through global resolver key `__MODERN_RSC_ACTION_RESOLVER__` + - endpoint: + - `'/'` for `main`/`index`/missing entry + - else `/${window.__MODERN_JS_ENTRY_NAME}` + - request: + - `method: POST` + - header `Accept: text/x-component` + - header `x-rsc-action: ` + - body `encodeReply(args)` + +Branch history note: +- This resolver indirection is new on this branch. +- On `main`, `callServer` sent the incoming action ID directly in + `x-rsc-action` with no global remap hook. + +### 5.2 Bootstrap resolver and callback install + +`rsc-client-callback-bootstrap.js`: +- Calls `setResolveActionId(resolveActionId)` once. +- Repeatedly installs `setServerCallback` into discovered client.browser runtimes. +- Hooks webpack chunk loader (`__webpack_require__.e`) to re-install callbacks after late chunk loads. + +Branch history note: +- `rsc-client-callback-bootstrap.js` and the chunk-loader hook are added on this + branch (not present on `main`). +- The hook is a runtime compatibility workaround to catch callbacks loaded after + initial bootstrap. A cleaner long-term option would be a first-class runtime + lifecycle event from federation/runtime instead of patching `__webpack_require__.e`. + +`resolveActionId(id)` behavior: +1. If already prefixed (`remote:`), return as-is. +2. If remap entry is string, return mapped prefixed ID. +3. If remap entry is `false`, return raw ID. +4. Else: + - attempts fallback alias resolution when a single remote alias can be inferred, + - otherwise waits briefly on remap waiters map. + +## 6) Server Action Execution Specification + +`packages/runtime/render/src/server/rsc/rsc.tsx`: +- Reads header `x-rsc-action`. +- Loads action via `loadServerAction(serverReference)`. +- Decodes args: + - `multipart/form-data` -> `decodeReply(formData)` + - else text -> `decodeReply(text)` +- Executes action (`await Promise.resolve(action.apply(null, args))`). +- Renders response stream via `renderToReadableStream`. + +Error behavior: +- Missing action header: `404`. +- Decode failure: `400`. +- Execution failure: `500`. +- In development, `500` includes error message/stack in body. + +## 7) SSR Remote Entry URL Normalization + +In `rsc-bridge-runtime-plugin.ts`: +- Snapshot patching normalizes: + - `ssrPublicPath` + - `remoteEntry.path` + - `ssrRemoteEntry` fallbacks from snapshot metadata +- If remote entry is broken (`undefined`, empty, malformed), plugin attempts to reconstruct from snapshot fields. +- Node-like runtime branch may prefix entry path with `bundles/` when `ssrRemoteEntry` is missing. + +Recommendation: +- Preferred steady-state is to require a complete snapshot contract (non-undefined + `ssrRemoteEntry`/public path fields) from upstream runtime metadata. +- Current reconstruction logic exists for compatibility with incomplete snapshots + seen in practice; it should be reduced/removed once snapshot completeness is guaranteed. + +## 8) Fixture Specification (`tests/integration/rsc-mf`) + +Host config (`tests/integration/rsc-mf/host`): +- `server.rsc = true` +- `source.enableAsyncEntry = false` +- `moduleFederationPlugin({ ssr: true })` +- remote manifest URL uses `RSC_MF_REMOTE_PORT` and points to `/static/mf-manifest.json` + +Remote config (`tests/integration/rsc-mf/remote`): +- `server.rsc = true` +- `server.ssr = true` +- `source.enableAsyncEntry = false` +- `output.assetPrefix = http://127.0.0.1:${remotePort}` +- MF exposes include server/client components + actions. +- MF experiments include: + - `asyncStartup: true` + - `rsc: true` + +Tested contracts: +- Remote server components render in host RSC route. +- Remote client components hydrate and function in host page. +- Remote actions execute via host endpoint and carry expected action headers. +- Expose list includes user exposes plus `./__rspack_rsc_bridge__`. + +## 9) Known Caveats (Current State) + +1. Fallback alias auto-prefixing +- In the bootstrap resolver, unresolved raw IDs may be auto-prefixed to a fallback alias when one remote is detectable. +- This can misroute host-local actions in mixed host+remote pages. + +2. Double `bundles/` risk +- SSR entry normalization can build `.../bundles/bundles/...` URLs for certain snapshot/publicPath combinations. + +3. Collision path with `false` remap values +- On raw action ID collisions across remotes, remap map stores `false`. +- Resolver then sends raw ID, while host manifest action keys are namespaced (`remote::...`), causing unresolved lookup without explicit disambiguation. + +## 10) Practical Integration Rules + +Use these rules to avoid known failure modes: +- Always set `experiments.asyncStartup = true` when using `experiments.rsc = true`. +- Keep unique action IDs across remotes when possible. +- Keep remote snapshot fields complete (`publicPath` and remote entry metadata) in SSR. +- For fixture-like setups, keep `source.enableAsyncEntry = false` for host and remote until async-entry semantics are explicitly validated for your target. diff --git a/package.json b/package.json index b3e30ef8caa5..0d5bcd4e416a 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,26 @@ "read-yaml-file>js-yaml": "3.14.2", "@remix-run/router": ">=1.23.2", "h3": ">=1.15.5", + "@rspack/core@2.0.0-beta.2": "npm:@rspack-canary/core@2.0.0-canary-032bd1ff-20260212021235", + "@module-federation/bridge-react": "https://pkg.pr.new/module-federation/core/@module-federation/bridge-react@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/bridge-react-webpack-plugin": "https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/bridge-shared": "https://pkg.pr.new/module-federation/core/@module-federation/bridge-shared@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/cli": "https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/data-prefetch": "https://pkg.pr.new/module-federation/core/@module-federation/data-prefetch@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/dts-plugin": "https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/enhanced": "https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/error-codes": "https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/inject-external-runtime-core-plugin": "https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/managers": "https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/manifest": "https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/rsbuild-plugin": "https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/rspack": "https://pkg.pr.new/module-federation/core/@module-federation/rspack@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/runtime": "https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/runtime-core": "https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/runtime-tools": "https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/sdk": "https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/third-party-dts-extractor": "https://pkg.pr.new/module-federation/core/@module-federation/third-party-dts-extractor@c160c7ae3246c65fa50f19d966b8acd32448580a", + "@module-federation/webpack-bundler-runtime": "https://pkg.pr.new/module-federation/core/@module-federation/webpack-bundler-runtime@c160c7ae3246c65fa50f19d966b8acd32448580a", "tar": ">=7.5.4", "diff": ">=4.0.4", "debug": ">=4.4.3", @@ -116,6 +136,20 @@ "debug": "4.1.1", "uuid": "3.4.0", "trim": "0.0.1" - } + }, + "onlyBuiltDependencies": [ + "@biomejs/biome", + "@parcel/watcher", + "@swc/core", + "bufferutil", + "core-js", + "es5-ext", + "esbuild", + "less", + "nx", + "puppeteer", + "sharp", + "utf-8-validate" + ] } } diff --git a/packages/cli/builder/tests/__snapshots__/default.test.ts.snap b/packages/cli/builder/tests/__snapshots__/default.test.ts.snap index 4994108a3df7..78bac79bf7ef 100644 --- a/packages/cli/builder/tests/__snapshots__/default.test.ts.snap +++ b/packages/cli/builder/tests/__snapshots__/default.test.ts.snap @@ -124,7 +124,7 @@ exports[`builder rspack > should generator rspack config correctly 1`] = ` "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -541,7 +541,7 @@ exports[`builder rspack > should generator rspack config correctly 1`] = ` "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -729,7 +729,7 @@ exports[`builder rspack > should generator rspack config correctly 1`] = ` "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -2158,7 +2158,7 @@ exports[`builder rspack > should generator rspack config correctly when prod 1`] "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -2574,7 +2574,7 @@ exports[`builder rspack > should generator rspack config correctly when prod 1`] "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -2762,7 +2762,7 @@ exports[`builder rspack > should generator rspack config correctly when prod 1`] "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", diff --git a/packages/cli/builder/tests/__snapshots__/environment.test.ts.snap b/packages/cli/builder/tests/__snapshots__/environment.test.ts.snap index cc0da04b68eb..1275e86de713 100644 --- a/packages/cli/builder/tests/__snapshots__/environment.test.ts.snap +++ b/packages/cli/builder/tests/__snapshots__/environment.test.ts.snap @@ -125,7 +125,7 @@ exports[`builder environment compat > should generator environment config correc "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -542,7 +542,7 @@ exports[`builder environment compat > should generator environment config correc "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -730,7 +730,7 @@ exports[`builder environment compat > should generator environment config correc "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", diff --git a/packages/cli/builder/tests/__snapshots__/postcssLegacy.test.ts.snap b/packages/cli/builder/tests/__snapshots__/postcssLegacy.test.ts.snap index d1db21d4ac91..c1de69c660c7 100644 --- a/packages/cli/builder/tests/__snapshots__/postcssLegacy.test.ts.snap +++ b/packages/cli/builder/tests/__snapshots__/postcssLegacy.test.ts.snap @@ -48,7 +48,7 @@ exports[`lightningcss-loader > should register lightningcss-loader and disable p "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -148,7 +148,7 @@ exports[`lightningcss-loader > should register lightningcss-loader and postcss-l "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -252,7 +252,7 @@ exports[`plugin-postcssLegacy > should allow tools.postcss to override the plugi "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -359,7 +359,7 @@ exports[`plugin-postcssLegacy > should allow tools.postcss to override the plugi "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -482,7 +482,7 @@ exports[`plugin-postcssLegacy > should allow tools.postcss to override the plugi "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -615,7 +615,7 @@ exports[`plugin-postcssLegacy > should register postcss plugin by browserslist 1 "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -772,7 +772,7 @@ exports[`plugin-postcssLegacy > should register postcss plugin by browserslist 2 "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", @@ -945,7 +945,7 @@ exports[`plugin-postcssLegacy > should register postcss plugin by browserslist 3 "sideEffects": true, "use": [ { - "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + "loader": "/node_modules//@rspack-canary/core/dist/cssExtractLoader.js", }, { "loader": "/node_modules//@rsbuild/core/compiled/css-loader/index.js", diff --git a/packages/runtime/render/src/client/callServer.ts b/packages/runtime/render/src/client/callServer.ts index da605e44cb2c..4274981d0b3b 100644 --- a/packages/runtime/render/src/client/callServer.ts +++ b/packages/runtime/render/src/client/callServer.ts @@ -1,12 +1,78 @@ import { createFromFetch, - createTemporaryReferenceSet, encodeReply, - setServerCallback, } from 'react-server-dom-rspack/client.browser'; type ReactServerValue = unknown; +export type ActionIdResolver = (id: string) => string | Promise; +export type ActionRequestUrlResolver = (entryName?: string) => string; + +const ACTION_RESOLVER_KEY = '__MODERN_RSC_ACTION_RESOLVER__'; +const ACTION_URL_RESOLVER_KEY = '__MODERN_RSC_ACTION_URL_RESOLVER__'; + +/** + * Register a custom action ID resolver. Plugins (e.g. Module Federation) + * use this to remap raw action IDs before they are sent to the server. + */ +export const setResolveActionId = (resolver: ActionIdResolver): void => { + ( + globalThis as typeof globalThis & { + [ACTION_RESOLVER_KEY]?: ActionIdResolver; + } + )[ACTION_RESOLVER_KEY] = resolver; +}; + +export const setActionIdResolver = setResolveActionId; + +const resolveActionId = (id: string): string | Promise => { + const resolver = ( + globalThis as typeof globalThis & { + [ACTION_RESOLVER_KEY]?: ActionIdResolver; + } + )[ACTION_RESOLVER_KEY]; + if (typeof resolver === 'function') { + return resolver(id); + } + return id; +}; + +/** + * Register a custom action request URL resolver. Plugins can use this + * to align request URLs with customized route/base configurations. + */ +export const setResolveActionRequestUrl = ( + resolver: ActionRequestUrlResolver, +): void => { + ( + globalThis as typeof globalThis & { + [ACTION_URL_RESOLVER_KEY]?: ActionRequestUrlResolver; + } + )[ACTION_URL_RESOLVER_KEY] = resolver; +}; + +export const setActionRequestUrlResolver = setResolveActionRequestUrl; + +const resolveActionRequestUrl = (): string => { + const entryName = + typeof window !== 'undefined' ? window.__MODERN_JS_ENTRY_NAME : undefined; + + const resolver = ( + globalThis as typeof globalThis & { + [ACTION_URL_RESOLVER_KEY]?: ActionRequestUrlResolver; + } + )[ACTION_URL_RESOLVER_KEY]; + if (typeof resolver === 'function') { + return resolver(entryName); + } + + // Legacy fallback: preserve existing behavior for default entry names. + if (!entryName || entryName === 'main' || entryName === 'index') { + return '/'; + } + return `/${entryName}`; +}; + class CallServerError extends Error { readonly #statusCode: number; readonly #url: string; @@ -51,23 +117,25 @@ class CallServerError extends Error { } export async function requestCallServer(id: string, args: ReactServerValue) { - const entryName = window.__MODERN_JS_ENTRY_NAME; - const url = - entryName === 'main' || entryName === 'index' ? '/' : `/${entryName}`; + let url = '/'; + let actionId = id; try { + url = resolveActionRequestUrl(); + actionId = await resolveActionId(id); const response = await fetch(url, { method: 'POST', headers: { Accept: 'text/x-component', - 'x-rsc-action': id, + 'x-rsc-action': actionId, }, body: await encodeReply(args), }); if (!response.ok) { throw new CallServerError(response.statusText, response.status, url, { - id, + id: actionId, + rawId: id, args, }); } @@ -81,7 +149,7 @@ export async function requestCallServer(id: string, args: ReactServerValue) { error instanceof Error ? error.message : 'Unknown error', 1, url, - { id, args }, + { id: actionId, rawId: id, args }, ); } } diff --git a/packages/runtime/render/src/client/index.tsx b/packages/runtime/render/src/client/index.tsx index 66d2ae9dbc09..077ceb142ffc 100644 --- a/packages/runtime/render/src/client/index.tsx +++ b/packages/runtime/render/src/client/index.tsx @@ -7,7 +7,14 @@ import { } from 'react-server-dom-rspack/client.browser'; export { rscStream } from '../rsc-html-stream/client'; export { createFromReadableStream, createServerReference }; -export { callServer } from './callServer'; +export { + callServer, + setResolveActionRequestUrl, + setActionRequestUrlResolver, + setResolveActionId, + setActionIdResolver, +} from './callServer'; +export type { ActionIdResolver, ActionRequestUrlResolver } from './callServer'; export { createFromFetch } from 'react-server-dom-rspack/client.browser'; declare global { diff --git a/packages/runtime/render/src/server/rsc/rsc.tsx b/packages/runtime/render/src/server/rsc/rsc.tsx index 7a96428df938..a5f015c2ea49 100644 --- a/packages/runtime/render/src/server/rsc/rsc.tsx +++ b/packages/runtime/render/src/server/rsc/rsc.tsx @@ -80,6 +80,10 @@ export const handleAction = async (req: Request) => { errorMessage, errorStack ? `\n${errorStack}` : '', ); - return new Response('Internal server error', { status: 500 }); + const isDev = process.env.NODE_ENV === 'development'; + const body = isDev + ? `Internal server error\n${errorMessage}\n${errorStack || ''}` + : 'Internal server error'; + return new Response(body, { status: 500 }); } }; diff --git a/packages/runtime/render/tests/callServer.test.ts b/packages/runtime/render/tests/callServer.test.ts new file mode 100644 index 000000000000..8be0644b0b26 --- /dev/null +++ b/packages/runtime/render/tests/callServer.test.ts @@ -0,0 +1,214 @@ +const ACTION_RESOLVER_KEY = '__MODERN_RSC_ACTION_RESOLVER__'; +const ACTION_URL_RESOLVER_KEY = '__MODERN_RSC_ACTION_URL_RESOLVER__'; + +type WebpackRequireShim = { + u: (chunkId: string | number) => string; +}; + +const globalState = globalThis as typeof globalThis & { + __webpack_require__?: WebpackRequireShim; +}; +const originalWebpackRequire = globalState.__webpack_require__; + +if (!globalState.__webpack_require__) { + globalState.__webpack_require__ = { + u: chunkId => String(chunkId), + }; +} + +type GlobalWithResolvers = typeof globalThis & { + [ACTION_RESOLVER_KEY]?: (id: string) => string | Promise; + [ACTION_URL_RESOLVER_KEY]?: (entryName?: string) => string; +}; + +describe('requestCallServer pluggable action id resolver', () => { + const originalFetch = globalThis.fetch; + const originalWindow = (globalThis as { window?: unknown }).window; + let requestCallServer: typeof import( + '../src/client/callServer', + ).requestCallServer; + let setResolveActionId: typeof import( + '../src/client/callServer', + ).setResolveActionId; + let setResolveActionRequestUrl: typeof import( + '../src/client/callServer', + ).setResolveActionRequestUrl; + let fetchMock: ReturnType; + + beforeAll(async () => { + const mod = await import('../src/client/callServer'); + requestCallServer = mod.requestCallServer; + setResolveActionId = mod.setResolveActionId; + setResolveActionRequestUrl = mod.setResolveActionRequestUrl; + }); + + beforeEach(() => { + ( + globalThis as unknown as { window?: { __MODERN_JS_ENTRY_NAME: string } } + ).window = { + __MODERN_JS_ENTRY_NAME: 'main', + }; + + fetchMock = rstest.fn(async () => { + return { + ok: true, + status: 200, + statusText: 'OK', + } as Response; + }); + globalThis.fetch = fetchMock as typeof globalThis.fetch; + }); + + afterEach(() => { + delete (globalThis as GlobalWithResolvers)[ACTION_RESOLVER_KEY]; + delete (globalThis as GlobalWithResolvers)[ACTION_URL_RESOLVER_KEY]; + ( + globalThis as unknown as { window?: { __MODERN_JS_ENTRY_NAME: string } } + ).window = { + __MODERN_JS_ENTRY_NAME: 'main', + }; + }); + + afterAll(() => { + globalThis.fetch = originalFetch; + (globalThis as { window?: unknown }).window = originalWindow; + if (originalWebpackRequire) { + globalState.__webpack_require__ = originalWebpackRequire; + } else { + delete globalState.__webpack_require__; + } + }); + + const expectActionHeader = (actionId: string, expectedUrl = '/') => { + expect(fetchMock).toHaveBeenCalledTimes(1); + const callArgs = fetchMock.mock.calls[0] as [string, RequestInit]; + expect(callArgs[0]).toBe(expectedUrl); + expect( + (callArgs[1]?.headers as Record)['x-rsc-action'], + ).toBe(actionId); + }; + + test('passes through ids unchanged when no resolver is registered', async () => { + await requestCallServer('some-action-id', []); + + expectActionHeader('some-action-id'); + }); + + test('uses a synchronous resolver to remap action ids', async () => { + setResolveActionId(id => `remote:myRemote:${id}`); + + await requestCallServer('foo', []); + + expectActionHeader('remote:myRemote:foo'); + }); + + test('uses an async resolver to remap action ids', async () => { + setResolveActionId(async id => { + await Promise.resolve(); + return `remote:asyncRemote:${id}`; + }); + + await requestCallServer('bar', []); + + expectActionHeader('remote:asyncRemote:bar'); + }); + + test('resolver can pass through ids unchanged', async () => { + setResolveActionId(id => id); + + await requestCallServer('untouched', []); + + expectActionHeader('untouched'); + }); + + test('wraps sync resolver errors with CallServerError', async () => { + setResolveActionId(() => { + throw new Error('resolver sync failure'); + }); + + await expect(requestCallServer('broken-sync', [])).rejects.toMatchObject({ + name: 'CallServerError', + statusCode: 1, + url: '/', + }); + }); + + test('wraps async resolver rejections with CallServerError', async () => { + setResolveActionId(async () => { + throw new Error('resolver async failure'); + }); + + await expect(requestCallServer('broken-async', [])).rejects.toMatchObject({ + name: 'CallServerError', + statusCode: 1, + url: '/', + }); + }); + + test('resolver set via global key is picked up', async () => { + (globalThis as GlobalWithResolvers)[ACTION_RESOLVER_KEY] = id => + `global:${id}`; + + await requestCallServer('action123', []); + + expectActionHeader('global:action123'); + }); + + test('uses custom request url resolver when registered', async () => { + setResolveActionRequestUrl(entryName => + entryName ? `/custom/${entryName}` : '/custom', + ); + ( + globalThis as unknown as { window?: { __MODERN_JS_ENTRY_NAME: string } } + ).window = { + __MODERN_JS_ENTRY_NAME: 'server-component-root', + }; + + await requestCallServer('entry-action', []); + + expectActionHeader('entry-action', '/custom/server-component-root'); + }); + + test('request url resolver set via global key is picked up', async () => { + (globalThis as GlobalWithResolvers)[ACTION_URL_RESOLVER_KEY] = () => + '/global/custom'; + + await requestCallServer('action123', []); + + expectActionHeader('action123', '/global/custom'); + }); + + test('wraps request url resolver errors with CallServerError', async () => { + setResolveActionRequestUrl(() => { + throw new Error('url resolver failure'); + }); + + await expect(requestCallServer('broken-url', [])).rejects.toMatchObject({ + name: 'CallServerError', + statusCode: 1, + url: '/', + }); + }); + + test('uses entry specific action endpoint when entry name is not main/index', async () => { + ( + globalThis as unknown as { window?: { __MODERN_JS_ENTRY_NAME: string } } + ).window = { + __MODERN_JS_ENTRY_NAME: 'server-component-root', + }; + + await requestCallServer('entry-action', []); + + expectActionHeader('entry-action', '/server-component-root'); + }); + + test('falls back to root endpoint when window is unavailable', async () => { + ( + globalThis as unknown as { window?: { __MODERN_JS_ENTRY_NAME: string } } + ).window = undefined; + + await requestCallServer('no-window-action', []); + + expectActionHeader('no-window-action', '/'); + }); +}); diff --git a/packages/server/core/src/adapters/node/index.ts b/packages/server/core/src/adapters/node/index.ts index 3f63e2e3a1d8..84920c6b1489 100644 --- a/packages/server/core/src/adapters/node/index.ts +++ b/packages/server/core/src/adapters/node/index.ts @@ -18,7 +18,10 @@ export { getServerManifest, injectNodeSeverPlugin, injectRscManifestPlugin, + registerBundleLoaderStrategy, + getBundleLoaderStrategies, } from './plugins'; +export type { BundleLoaderStrategy, BundleLoaderContext } from './plugins'; export { loadServerPlugins, diff --git a/packages/server/core/src/adapters/node/plugins/resource.ts b/packages/server/core/src/adapters/node/plugins/resource.ts index 23f651fbc222..a1449cfbb534 100644 --- a/packages/server/core/src/adapters/node/plugins/resource.ts +++ b/packages/server/core/src/adapters/node/plugins/resource.ts @@ -20,6 +20,52 @@ import type { } from '../../../types'; import { uniqueKeyByRoute } from '../../../utils'; +/** Context passed to bundle loader strategies. */ +export interface BundleLoaderContext { + monitors?: Monitors; +} + +/** Strategy for loading bundles that require custom handling (e.g. async startup). */ +export type BundleLoaderStrategy = ( + filepath: string, + context?: BundleLoaderContext, +) => Promise; + +const bundleLoaderStrategies: BundleLoaderStrategy[] = []; + +/** Register a bundle loader strategy. External plugins can use this to handle custom bundle formats. */ +export function registerBundleLoaderStrategy( + strategy: BundleLoaderStrategy, +): void { + if (!bundleLoaderStrategies.includes(strategy)) { + bundleLoaderStrategies.push(strategy); + } +} + +/** Get all registered bundle loader strategies. */ +export function getBundleLoaderStrategies(): readonly BundleLoaderStrategy[] { + return bundleLoaderStrategies; +} + +const isPromiseLike = (value: unknown): value is Promise => + Boolean(value) && + (typeof value === 'object' || typeof value === 'function') && + 'then' in (value as Promise) && + typeof (value as Promise).then === 'function'; + +const loadBundleModule = (filepath: string): unknown | Promise => { + try { + // Prefer native require to preserve raw CJS export shape (including promise exports). + return require(filepath); + } catch (err: any) { + if (err?.code === 'ERR_REQUIRE_ESM') { + // Keep module namespace intact for bundle named exports (requestHandler/loadModules/etc.). + return compatibleRequire(filepath, false); + } + throw err; + } +}; + export async function getHtmlTemplates(pwd: string, routes: ServerRoute[]) { // Only process routes with entryName, which are HTML template routes. // Public static file routes don't have entryName and shouldn't be processed here. @@ -59,14 +105,58 @@ export function injectTemplates( }; } -const loadBundle = async (filepath: string, monitors?: Monitors) => { +const loadBundle = async ( + filepath: string, + monitors?: Monitors, +): Promise => { if (!(await fs.pathExists(filepath))) { return undefined; } try { - const module = await compatibleRequire(filepath, false); - return module; + let module: unknown | Promise | undefined; + let moduleError: unknown; + try { + module = loadBundleModule(filepath); + } catch (err) { + moduleError = err; + } + + if (module !== undefined) { + if (!isPromiseLike(module)) { + return module; + } + + try { + const resolvedModule = await module; + if (resolvedModule !== undefined) { + return resolvedModule; + } + } catch (err) { + moduleError = moduleError || err; + } + } + + const context = monitors ? { monitors } : undefined; + let strategyError: unknown; + for (const strategy of getBundleLoaderStrategies()) { + try { + const result = await strategy(filepath, context); + if (result !== undefined) { + return result; + } + } catch (err) { + strategyError = strategyError || err; + } + } + + if (moduleError) { + throw moduleError; + } + if (strategyError) { + throw strategyError; + } + return undefined; } catch (e) { if (monitors) { monitors.error( diff --git a/packages/server/core/tests/adapters/resource.test.ts b/packages/server/core/tests/adapters/resource.test.ts new file mode 100644 index 000000000000..69f50b2d0aba --- /dev/null +++ b/packages/server/core/tests/adapters/resource.test.ts @@ -0,0 +1,57 @@ +import fs from 'fs'; +import os from 'os'; +import path from 'path'; +import type { ServerRoute } from '@modern-js/types'; +import type { BundleLoaderStrategy } from '../../src/adapters/node'; +import { + getBundleLoaderStrategies, + getServerManifest, + registerBundleLoaderStrategy, +} from '../../src/adapters/node'; + +describe('resource bundle strategy fallback', () => { + it('falls back to strategy when bundle require throws synchronously', async () => { + const tempDir = await fs.promises.mkdtemp( + path.join(os.tmpdir(), 'modernjs-server-core-resource-'), + ); + const bundleRelativePath = path.join('bundles', 'main.js'); + const bundleFilePath = path.join(tempDir, bundleRelativePath); + await fs.promises.mkdir(path.dirname(bundleFilePath), { recursive: true }); + await fs.promises.writeFile( + bundleFilePath, + 'throw new Error("sync boom");', + ); + + const routes = [ + { + entryName: 'main', + bundle: bundleRelativePath, + }, + ] as unknown as ServerRoute[]; + + const strategies = + getBundleLoaderStrategies() as unknown as BundleLoaderStrategy[]; + const strategyCount = strategies.length; + let strategyCalled = false; + const strategyBundle = { + requestHandler: Promise.resolve(() => new Response('strategy')), + }; + + try { + registerBundleLoaderStrategy(async filepath => { + if (filepath === bundleFilePath) { + strategyCalled = true; + return strategyBundle; + } + return undefined; + }); + + const manifest = await getServerManifest(tempDir, routes); + expect(strategyCalled).toBe(true); + expect(manifest.renderBundles?.main).toBe(strategyBundle); + } finally { + strategies.splice(strategyCount); + await fs.promises.rm(tempDir, { recursive: true, force: true }); + } + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45b13480f4f5..46f142728807 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,26 @@ overrides: read-yaml-file>js-yaml: 3.14.2 '@remix-run/router': '>=1.23.2' h3: '>=1.15.5' + '@rspack/core@2.0.0-beta.2': npm:@rspack-canary/core@2.0.0-canary-032bd1ff-20260212021235 + '@module-federation/bridge-react': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/bridge-react-webpack-plugin': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/bridge-shared': https://pkg.pr.new/module-federation/core/@module-federation/bridge-shared@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/cli': https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/data-prefetch': https://pkg.pr.new/module-federation/core/@module-federation/data-prefetch@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/dts-plugin': https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/error-codes': https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/inject-external-runtime-core-plugin': https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/managers': https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/manifest': https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/rsbuild-plugin': https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/rspack': https://pkg.pr.new/module-federation/core/@module-federation/rspack@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/runtime-core': https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/third-party-dts-extractor': https://pkg.pr.new/module-federation/core/@module-federation/third-party-dts-extractor@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/webpack-bundler-runtime': https://pkg.pr.new/module-federation/core/@module-federation/webpack-bundler-runtime@c160c7ae3246c65fa50f19d966b8acd32448580a tar: '>=7.5.4' diff: '>=4.0.4' debug: '>=4.4.3' @@ -99,7 +119,7 @@ importers: version: link:../../packages/tsconfig '@rsdoctor/rspack-plugin': specifier: ^1.5.2 - version: 1.5.2(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + version: 1.5.2(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) '@types/node': specifier: ^20 version: 20.19.27 @@ -126,40 +146,40 @@ importers: version: link:../../toolkit/utils '@rsbuild/core': specifier: 2.0.0-beta.4 - version: 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + version: 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@rsbuild/plugin-assets-retry': specifier: 1.5.1 - version: 1.5.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.5.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rsbuild/plugin-check-syntax': specifier: 1.6.1 - version: 1.6.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.6.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rsbuild/plugin-css-minimizer': specifier: 1.1.1 - version: 1.1.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(esbuild@0.27.2)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.17))(esbuild@0.27.2)) + version: 1.1.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(esbuild@0.27.2)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.17))(esbuild@0.27.2)) '@rsbuild/plugin-less': specifier: 1.6.0 - version: 1.6.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.6.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rsbuild/plugin-react': specifier: 1.4.4 - version: 1.4.4(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.4.4(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rsbuild/plugin-rem': specifier: 1.0.5 - version: 1.0.5(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.0.5(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rsbuild/plugin-sass': specifier: 1.5.0 - version: 1.5.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.5.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rsbuild/plugin-source-build': specifier: 1.0.4 - version: 1.0.4(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.0.4(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rsbuild/plugin-svgr': specifier: 1.3.0 - version: 1.3.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(typescript@5.9.3) + version: 1.3.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(typescript@5.9.3) '@rsbuild/plugin-type-check': specifier: 1.3.3 - version: 1.3.3(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(typescript@5.9.3) + version: 1.3.3(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(typescript@5.9.3) '@rsbuild/plugin-typed-css-modules': specifier: 1.2.1 - version: 1.2.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.2.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@swc/core': specifier: 1.15.11 version: 1.15.11(@swc/helpers@0.5.17) @@ -210,10 +230,10 @@ importers: version: 3.0.4(postcss@8.5.6) rsbuild-plugin-rsc: specifier: 0.0.1-beta.0 - version: 0.0.1-beta.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) + version: 0.0.1-beta.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) rspack-manifest-plugin: specifier: 5.2.1 - version: 5.2.1(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17)) + version: 5.2.1(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17)) ts-deepmerge: specifier: 7.0.3 version: 7.0.3 @@ -296,7 +316,7 @@ importers: version: link:../../toolkit/types '@rsbuild/core': specifier: 2.0.0-beta.4 - version: 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + version: 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@rslib/core': specifier: 0.19.6 version: 0.19.6(typescript@5.9.3) @@ -348,7 +368,7 @@ importers: version: link:../../toolkit/types '@rsbuild/core': specifier: 2.0.0-beta.4 - version: 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + version: 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@rslib/core': specifier: 0.19.6 version: 0.19.6(typescript@5.9.3) @@ -430,7 +450,7 @@ importers: dependencies: '@rsbuild/plugin-styled-components': specifier: 1.6.1 - version: 1.6.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.6.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@swc/helpers': specifier: ^0.5.17 version: 0.5.17 @@ -474,16 +494,16 @@ importers: devDependencies: '@rsbuild/plugin-sass': specifier: 1.5.0 - version: 1.5.0(@rsbuild/core@2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.5.0(@rsbuild/core@2.0.0-beta.1(core-js@3.48.0)) '@rspress/core': specifier: 2.0.2 - version: 2.0.2(@module-federation/runtime-tools@2.0.0)(@types/react@19.2.14)(core-js@3.48.0) + version: 2.0.2(@types/react@19.2.14)(core-js@3.48.0) '@rspress/plugin-llms': specifier: 2.0.2 - version: 2.0.2(@rspress/core@2.0.2(@module-federation/runtime-tools@2.0.0)(@types/react@19.2.14)(core-js@3.48.0)) + version: 2.0.2(@rspress/core@2.0.2(@types/react@19.2.14)(core-js@3.48.0)) '@rspress/shared': specifier: 2.0.2 - version: 2.0.2(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + version: 2.0.2(core-js@3.48.0) '@shikijs/transformers': specifier: ^3.22.0 version: 3.22.0 @@ -705,7 +725,7 @@ importers: version: 4.4.2 '@rsbuild/core': specifier: 2.0.0-beta.4 - version: 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + version: 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@rslib/core': specifier: 0.19.6 version: 0.19.6(typescript@5.9.3) @@ -784,7 +804,7 @@ importers: version: 19.2.4(react@19.2.4) react-server-dom-rspack: specifier: 0.0.1-beta.0 - version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) typescript: specifier: ^5 version: 5.9.3 @@ -1249,7 +1269,7 @@ importers: version: link:../../toolkit/utils '@rsbuild/core': specifier: 2.0.0-beta.4 - version: 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + version: 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@swc/helpers': specifier: ^0.5.17 version: 0.5.17 @@ -1270,7 +1290,7 @@ importers: version: 1.8.0 ndepe: specifier: ^0.1.13 - version: 0.1.13(encoding@0.1.13)(rollup@3.29.5) + version: 0.1.13(encoding@0.1.13)(rollup@4.57.1) pkg-types: specifier: ^1.3.1 version: 1.3.1 @@ -1362,7 +1382,7 @@ importers: version: link:../utils '@rsbuild/core': specifier: 2.0.0-beta.4 - version: 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + version: 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@swc/helpers': specifier: ^0.5.17 version: 0.5.17 @@ -1895,7 +1915,7 @@ importers: devDependencies: '@rsbuild/plugin-react': specifier: 1.4.4 - version: 1.4.4(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.4.4(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rslib/core': specifier: 0.19.6 version: 0.19.6(typescript@5.9.3) @@ -2006,7 +2026,7 @@ importers: version: 7.12.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) vue: specifier: ^3.5.28 - version: 3.5.28(typescript@5.9.3) + version: 3.5.29(typescript@5.9.3) devDependencies: '@modern-js/builder': specifier: workspace:* @@ -2019,7 +2039,7 @@ importers: version: 1.58.2 '@rsbuild/core': specifier: 2.0.0-beta.4 - version: 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + version: 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@types/connect': specifier: ^3.4.38 version: 3.4.38 @@ -3030,7 +3050,7 @@ importers: version: link:../../../../../packages/runtime/plugin-runtime '@module-federation/modern-js-v3': specifier: 2.0.0 - version: 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + version: 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) i18next: specifier: 25.7.4 version: 25.7.4(typescript@5.9.3) @@ -3061,7 +3081,7 @@ importers: version: link:../../../../../packages/runtime/plugin-runtime '@module-federation/modern-js-v3': specifier: 2.0.0 - version: 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + version: 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) i18next: specifier: 25.7.4 version: 25.7.4(typescript@5.9.3) @@ -3092,10 +3112,10 @@ importers: version: link:../../../../../packages/runtime/plugin-runtime '@module-federation/modern-js-v3': specifier: 2.0.0 - version: 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + version: 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) '@module-federation/runtime': - specifier: 2.0.0 - version: 2.0.0 + specifier: https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + version: https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a i18next: specifier: 25.7.4 version: 25.7.4(typescript@5.9.3) @@ -3189,7 +3209,7 @@ importers: version: link:../../../packages/solutions/app-tools '@rsdoctor/rspack-plugin': specifier: ^1.5.2 - version: 1.5.2(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + version: 1.5.2(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) '@types/jest': specifier: ^29.5.14 version: 29.5.14 @@ -3477,7 +3497,7 @@ importers: version: 19.2.4(react@19.2.4) react-server-dom-rspack: specifier: 0.0.1-beta.0 - version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) server-only: specifier: ^0.0.1 version: 0.0.1 @@ -3520,7 +3540,7 @@ importers: version: 19.2.4(react@19.2.4) react-server-dom-rspack: specifier: 0.0.1-beta.0 - version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) server-only: specifier: ^0.0.1 version: 0.0.1 @@ -3547,6 +3567,130 @@ importers: specifier: ^5 version: 5.9.3 + tests/integration/rsc-mf: {} + + tests/integration/rsc-mf/host: + dependencies: + '@modern-js/render': + specifier: workspace:* + version: link:../../../../packages/runtime/render + '@modern-js/runtime': + specifier: workspace:* + version: link:../../../../packages/runtime/plugin-runtime + '@module-federation/modern-js-v3': + specifier: https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6 + version: https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6(@modern-js/server-core@3.0.2(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/runtime': + specifier: https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + version: https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/runtime-core': + specifier: https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a + version: https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a + client-only: + specifier: ^0.0.1 + version: 0.0.1 + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + react-server-dom-rspack: + specifier: 0.0.1-beta.0 + version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + server-only: + specifier: ^0.0.1 + version: 0.0.1 + devDependencies: + '@modern-js/app-tools': + specifier: workspace:* + version: link:../../../../packages/solutions/app-tools + '@modern-js/builder': + specifier: workspace:* + version: link:../../../../packages/cli/builder + '@modern-js/server-runtime': + specifier: workspace:* + version: link:../../../../packages/server/server-runtime + '@types/jest': + specifier: ^29.5.14 + version: 29.5.14 + '@types/node': + specifier: ^20 + version: 20.19.27 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + typescript: + specifier: ^5 + version: 5.9.3 + + tests/integration/rsc-mf/remote: + dependencies: + '@modern-js/render': + specifier: workspace:* + version: link:../../../../packages/runtime/render + '@modern-js/runtime': + specifier: workspace:* + version: link:../../../../packages/runtime/plugin-runtime + '@module-federation/modern-js-v3': + specifier: https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6 + version: https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6(@modern-js/server-core@3.0.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/runtime': + specifier: https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + version: https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/runtime-core': + specifier: https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a + version: https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a + client-only: + specifier: ^0.0.1 + version: 0.0.1 + react: + specifier: ^19.2.4 + version: 19.2.4 + react-dom: + specifier: ^19.2.4 + version: 19.2.4(react@19.2.4) + react-server-dom-rspack: + specifier: 0.0.1-beta.0 + version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + server-only: + specifier: ^0.0.1 + version: 0.0.1 + devDependencies: + '@modern-js/app-tools': + specifier: workspace:* + version: link:../../../../packages/solutions/app-tools + '@modern-js/builder': + specifier: workspace:* + version: link:../../../../packages/cli/builder + '@modern-js/server-runtime': + specifier: workspace:* + version: link:../../../../packages/server/server-runtime + '@types/jest': + specifier: ^29.5.14 + version: 29.5.14 + '@types/node': + specifier: ^20 + version: 20.19.27 + '@types/react': + specifier: ^19.2.14 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + typescript: + specifier: ^5 + version: 5.9.3 + tests/integration/rsc-ssr-app: dependencies: '@modern-js/render': @@ -3566,7 +3710,7 @@ importers: version: 19.2.4(react@19.2.4) react-server-dom-rspack: specifier: 0.0.1-beta.0 - version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) server-only: specifier: ^0.0.1 version: 0.0.1 @@ -3612,7 +3756,7 @@ importers: version: 19.2.4(react@19.2.4) react-server-dom-rspack: specifier: 0.0.1-beta.0 - version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) server-only: specifier: ^0.0.1 version: 0.0.1 @@ -3812,7 +3956,7 @@ importers: version: 20.19.27 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@20.19.27)(typescript@5.9.3)) tests/integration/server-monitors: dependencies: @@ -3877,7 +4021,7 @@ importers: version: 20.19.27 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@20.19.27)(typescript@5.9.3)) tests/integration/server-routes: dependencies: @@ -3908,7 +4052,7 @@ importers: version: 20.19.27 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@20.19.27)(typescript@5.9.3)) tests/integration/source-code-build/app: dependencies: @@ -4431,7 +4575,7 @@ importers: version: link:../../../../../packages/runtime/plugin-runtime '@rsbuild/plugin-babel': specifier: 1.1.0 - version: 1.1.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + version: 1.1.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) react: specifier: ^19.2.4 version: 19.2.4 @@ -5982,10 +6126,30 @@ packages: '@modern-js/plugin@2.70.4': resolution: {integrity: sha512-vqoioz6JbU+fIirmTMmbvHTYrWNM6IhMyOgZJ6kjHHeu/EdXyaYSp8X1DzPW7IXPWQavr0VuLq0E+Sav+G6HYg==} + '@modern-js/plugin@3.0.2': + resolution: {integrity: sha512-UrulZqVtF+U1KXpdiHym4M5ULd+pLJwbk+uKq78oMBUf9BYKnHNonTbdUMA0pFbfHhZHh5AGIYda05Ox4tzDHA==} + version: 3.0.2 + '@modern-js/polyfill-lib@1.0.2': resolution: {integrity: sha512-UdBEpS0kwBYm43n60FEZFvZ3dUhqlzzvZkIMwiQGYHvlpXuAN/30GrWnp2WUdd5+eM5ObRCJ1bSJ7+UYouxPAQ==} engines: {node: '>=8'} + '@modern-js/runtime-utils@3.0.2': + resolution: {integrity: sha512-MJSwkCqNWKKv9Ip4LYHoE6pSQYGv3HkmW/25/M5sOAAYcWMnxxkpqLjzQXIb/sEvHC+MpjbRqT62VvVbOyDBMg==} + peerDependencies: + react: '>=17.0.2' + react-dom: '>=17.0.2' + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@modern-js/server-core@3.0.2': + resolution: {integrity: sha512-0mVAd3kIjOiL5GRUiQK6gCDmT4IxSkDyplGvq8z5OXNXDGsxoypH6o0FEZCvPEXSzqUbjVI7esdLlXHLIt+bvQ==} + version: 3.0.2 + engines: {node: '>=20'} + '@modern-js/swc-plugins-darwin-arm64@0.6.11': resolution: {integrity: sha512-UMH0bo20vcD10//F7KaINLfuHawQBVcWCCyJvkYOiBt7e1tUjeybKu+y6eNq1USyFVElEMul8ytnYdwAS9sY+w==} engines: {node: '>=14.12'} @@ -6046,14 +6210,30 @@ packages: '@modern-js/types@2.70.4': resolution: {integrity: sha512-P3Pe6S34GwJMQOYOHQx/mkcu8oEPwLU+Y3LwKslMNa43ooIgx0NEUzwl/N93bapw3LnoCQpwAOK0qQALaXnd9A==} + '@modern-js/types@3.0.2': + resolution: {integrity: sha512-Bv+TAMa6LWebIDLAAU+8K9MVAQKWDlKfUz0oS4+/K5P7kn+aWifDGp6sT3SUqpRDIoQDYDEJuXqq8valXcKuTA==} + '@modern-js/utils@2.70.4': resolution: {integrity: sha512-LQrwyGlFhsH2BmZxStF0TPeStm6aumf4N1J+ZyObLw5URrN4o8vCyeyqrPVciICeoTqhHg2GIArJWB5PXRcUig==} - '@module-federation/bridge-react-webpack-plugin@2.0.0': - resolution: {integrity: sha512-AVT/rZK6RHva6ZTYfsyQ8oP4xYNTws3OzqKW/YxWaLXwQ3oG9ZbF7fKl4jIKoMKuuy2L9MGVXS4CYPZy0s8fXg==} + '@modern-js/utils@3.0.2': + resolution: {integrity: sha512-wV0KxI91bRZl1FVOFZ15mGf7PnKCjke+1bsuYEgJ4KtplqgfyNzNjRvYAIymiGcHmr6eGAtBbmHrk+2K2QKd3A==} + peerDependencies: + react: ^19.2.4 + react-dom: ^19.2.4 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true - '@module-federation/bridge-react@2.0.0': - resolution: {integrity: sha512-TVkIxvlRk5vo4CYuId3Kj2JcyjkhiMq2LwKDcZsXC+8Ohwt8olfKJ6y40rCViXwGUSns1TRBtzPD6EikMXlYZg==} + '@module-federation/bridge-react-webpack-plugin@https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 + + '@module-federation/bridge-react@https://pkg.pr.new/module-federation/core/@module-federation/bridge-react@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/bridge-react@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -6065,16 +6245,19 @@ packages: react-router-dom: optional: true - '@module-federation/bridge-shared@2.0.0': - resolution: {integrity: sha512-kid2tyGOjX02da/kjjHtkw035M7NHiD8UGynBfZBi9mznAWUUReT0n8EHyvTIdBpj7S4AQKHpwppPCrg7Rv3ZA==} + '@module-federation/bridge-shared@https://pkg.pr.new/module-federation/core/@module-federation/bridge-shared@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/bridge-shared@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 - '@module-federation/cli@2.0.0': - resolution: {integrity: sha512-IWGWbdgoeNcuA5jzqPr6pLTN1hovMQh9A1lgJp5fAvKfICfFXKq7K8nwMAQrWD6iEKApIenI0madk1Dg2PU3pw==} + '@module-federation/cli@https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 engines: {node: '>=16.0.0'} hasBin: true - '@module-federation/data-prefetch@2.0.0': - resolution: {integrity: sha512-KPyZoqNrb5WgFY2owYnMaO2Mg2DYD6KXLVI7GPguj7Z/4pPKEC+SUjWU2FuSfTeyE6ZIi0iFGdwerxzlQ6nfmw==} + '@module-federation/data-prefetch@https://pkg.pr.new/module-federation/core/@module-federation/data-prefetch@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/data-prefetch@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -6084,8 +6267,9 @@ packages: react-dom: optional: true - '@module-federation/dts-plugin@2.0.0': - resolution: {integrity: sha512-YyYMgLNARKdf3FLihnIzzUTgafHrqzR9YnKPmrfuCm2Jit+USqFT4QO58hcb0F5KSEyjB2ARPz9RM4XAVZhzMg==} + '@module-federation/dts-plugin@https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 peerDependencies: typescript: ^4.9.0 || ^5.0.0 vue-tsc: '>=1.0.24' @@ -6093,8 +6277,9 @@ packages: vue-tsc: optional: true - '@module-federation/enhanced@2.0.0': - resolution: {integrity: sha512-xeVrGvypYMvN8gJulbro3j1t8+aS1f9xjj4quwAAqgJF0Nz8bt7sXUYJyjUHPmC2UZsShZ0GnPHJNtI8/2GYjA==} + '@module-federation/enhanced@https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 hasBin: true peerDependencies: typescript: ^4.9.0 || ^5.0.0 @@ -6108,22 +6293,23 @@ packages: webpack: optional: true - '@module-federation/error-codes@0.22.0': - resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} - - '@module-federation/error-codes@2.0.0': - resolution: {integrity: sha512-9oE+hXuPv2zej7AxJ5hOgeRqlPs98meooV2FiutTfftLAyy2N6+Kwmmz5NR9d9t91weJj8N0cSHFoyenNHKTVg==} + '@module-federation/error-codes@https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 - '@module-federation/inject-external-runtime-core-plugin@2.0.0': - resolution: {integrity: sha512-aZ6f4UU7KM5zBnHf3xsb2guqsfaEd6IlmuldbpED3JPk4ITwZk0DbvxRMr4prde7cfj8RH0nKMz2kmMncp+lIQ==} + '@module-federation/inject-external-runtime-core-plugin@https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 peerDependencies: - '@module-federation/runtime-tools': 2.0.0 + '@module-federation/runtime-tools': 2.0.1 - '@module-federation/managers@2.0.0': - resolution: {integrity: sha512-ZmkRIujH+T3xvkmy04TNvviFH8xFOrNeKCLb4tlH4ifU/kLfjTu+PYO/KAEIsgtmrDnd52zTf22dg3ok85OAHA==} + '@module-federation/managers@https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 - '@module-federation/manifest@2.0.0': - resolution: {integrity: sha512-AXwYyGiDJdfP9MteKyIdJrLwG5tp4qKaq0uOPiWHilYN3/21G0DM7f30HgJqgx3WSTFSh7hcq0a3V3EZHH/9TA==} + '@module-federation/manifest@https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 '@module-federation/modern-js-v3@2.0.0': resolution: {integrity: sha512-SKoKwh1rlgG+LXyV1eh2ELE05UhFVkhRXNIjwrSFjg9xVBih4oI10yBeOdrzCw8vdY/+BvXWxka88Av6tzh49Q==} @@ -6144,6 +6330,27 @@ packages: vue-tsc: optional: true + '@module-federation/modern-js-v3@https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6} + version: 2.0.1 + peerDependencies: + '@modern-js/server-core': '>=3.0.0' + react: '>=17' + react-dom: '>=17' + react-router: ^7 + react-router-dom: ^4 || ^5 || ^6 || ^7 + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ^1.0.24 + peerDependenciesMeta: + react-router: + optional: true + react-router-dom: + optional: true + typescript: + optional: true + vue-tsc: + optional: true + '@module-federation/node@2.7.31': resolution: {integrity: sha512-NSa0PFDKDLxmtfmCVHW9RhtfD9mcNOrp1d+cjVEoxb5x8dDI4jQTi1o3nsa9ettxs3bVtWhAUEQUNQBQ6ZA+Hw==} peerDependencies: @@ -6152,8 +6359,17 @@ packages: webpack: optional: true - '@module-federation/rsbuild-plugin@2.0.0': - resolution: {integrity: sha512-kbYX9ti2C/m734Na3ICy+xBopqL6O3sGK7Vx7N+WA/PkEGc5J0WEPwVwXtnf4WRj9ic9OV5+w2i6y1tG8ONt1g==} + '@module-federation/node@2.7.32': + resolution: {integrity: sha512-hUj5v2GGwpNzl2gaJS4AyzCYRzJBhN8875A+ucKF9tq3jaQb5zpy3izYMISqqbN2q9a7jz3nEUgwAh3pjri+rQ==} + peerDependencies: + webpack: ^5.40.0 + peerDependenciesMeta: + webpack: + optional: true + + '@module-federation/rsbuild-plugin@https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 engines: {node: '>=16.0.0'} peerDependencies: '@rsbuild/core': 2.0.0-beta.2 @@ -6161,8 +6377,9 @@ packages: '@rsbuild/core': optional: true - '@module-federation/rspack@2.0.0': - resolution: {integrity: sha512-1kziarKrPRM+rJax/AaMEZTwu7ORGed2xSxfdoP9GEbAFEGyNliadvw4kB6PqAfLad3PI4lQMX2vGMLI1KoyVQ==} + '@module-federation/rspack@https://pkg.pr.new/module-federation/core/@module-federation/rspack@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/rspack@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 peerDependencies: '@rspack/core': ^0.7.0 || ^1.0.0 || ^2.0.0-0 typescript: ^4.9.0 || ^5.0.0 @@ -6173,38 +6390,32 @@ packages: vue-tsc: optional: true - '@module-federation/runtime-core@0.22.0': - resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} - - '@module-federation/runtime-core@2.0.0': - resolution: {integrity: sha512-UhIGUs7Mg+TwMI2lgaLnj4UehpoyXbR7HDb2+vLikgBulPmFtodeWfsxCgENEwKsIY1vS0lOun15lNOn1vo3Xg==} - - '@module-federation/runtime-tools@0.22.0': - resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} + '@module-federation/runtime-core@https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 - '@module-federation/runtime-tools@2.0.0': - resolution: {integrity: sha512-eMDQN4hYpwvUnCNMjfQdtPVzYaO2DdauemHVc4HnyibgqijRzBwJh9bI2ph4R1xfYEm18+QmTrfXrRlaK2Xizw==} + '@module-federation/runtime-tools@2.0.1': + resolution: {integrity: sha512-AStdwBtsGB3jIfDg9oP+KyVPsimdaeHsP855gqCxDp1hi2+GKjlZWZx9ThkS8NytVSXSUysxqoUL1ivDoKgcCQ==} - '@module-federation/runtime@0.22.0': - resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} + '@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 - '@module-federation/runtime@2.0.0': - resolution: {integrity: sha512-vPxQrmQNq3Z1T+1fkHEvFwTdJq9wuCLvdp/lpu9k2Oy7QP/Pj6QoQ/S7J5MCIAoRwj8Wj3z3ma21/DyHwLGvzA==} + '@module-federation/runtime@https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 - '@module-federation/sdk@0.22.0': - resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} + '@module-federation/sdk@https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 - '@module-federation/sdk@2.0.0': - resolution: {integrity: sha512-JYd1wTulsaoLT7HTk2oXL5y5797Z+H4mzxuUEKnSJo7R34RZSqehsqPSND7n0HT/1nf7uyn0Rb4qBfR3BVvdHQ==} + '@module-federation/third-party-dts-extractor@https://pkg.pr.new/module-federation/core/@module-federation/third-party-dts-extractor@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/third-party-dts-extractor@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 - '@module-federation/third-party-dts-extractor@2.0.0': - resolution: {integrity: sha512-B99+Wkbd2xIodVTjNCeFtFC89Uh2/AtYkSESlz4+6Cec42wyqrGxyfYm4qRY0LhJI+YmZXLk/RTm85m15eBKKg==} - - '@module-federation/webpack-bundler-runtime@0.22.0': - resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} - - '@module-federation/webpack-bundler-runtime@2.0.0': - resolution: {integrity: sha512-XxiFR/A1G1fa9hTyylWNbs6yEU2hC7FqHAArFptD4U9qp/xyoLgqbK4M8LwltOAyAM8hRofcMdSyiRKVlWqAfQ==} + '@module-federation/webpack-bundler-runtime@https://pkg.pr.new/module-federation/core/@module-federation/webpack-bundler-runtime@c160c7ae3246c65fa50f19d966b8acd32448580a': + resolution: {tarball: https://pkg.pr.new/module-federation/core/@module-federation/webpack-bundler-runtime@c160c7ae3246c65fa50f19d966b8acd32448580a} + version: 2.0.1 '@mswjs/interceptors@0.41.3': resolution: {integrity: sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==} @@ -6499,6 +6710,131 @@ packages: rollup: optional: true + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + '@rsbuild-image/core@0.0.1-next.16': resolution: {integrity: sha512-CA788hY+ZKOMdfdGr1hamyBcS6BBZmq7aBk/bTv8OKnL6iZ3Lyw3TBBvBGG4SQtm86+0djpK3fef3oQNOCcsXQ==} peerDependencies: @@ -6543,6 +6879,7 @@ packages: '@rsbuild/core@2.0.0-beta.4': resolution: {integrity: sha512-V2gA7NQ74sFVWinV003i1fz1T5RmWwr97+AqhXRB7iegT0d+caZUO85/S0piEF3dp/Gtj8/Kx+WV2tcVyHMjvw==} + version: 2.0.0-beta.4 engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -6692,6 +7029,71 @@ packages: typescript: optional: true + '@rspack-canary/binding-darwin-arm64@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-uA56E4Uk5vfkPaxfjo/q4ecG9wRlf4tgHm6qtvkhiBC6ufzaJBv97e9L0TjIfwFMb1i2aU6OkRNSV0t9aZZlcQ==} + cpu: [arm64] + os: [darwin] + + '@rspack-canary/binding-darwin-x64@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-5+hcwmz2GuilR+CuHUICMuj45p0d52+N8CrG5OXb0y8jFc5tPYHLnw0EpXzAqVs8qe0/zh8EH4M8RwiiMECdMA==} + cpu: [x64] + os: [darwin] + + '@rspack-canary/binding-linux-arm64-gnu@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-eokt1t08Ux74n596DZmetFq3ITwdbS7DmzPnJkKueczYBKfLu/E3tthJGCbq7YGilQjruV/M7nhPhdhr16a6cg==} + cpu: [arm64] + os: [linux] + + '@rspack-canary/binding-linux-arm64-musl@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-EryjXTYQAJ73FD9y3aBwjMbsy7xF/xI3PYeJGavdFI9loGn9LmS77oVNpJrx/qLpbR0+k3UZLgrfvxM+fR1cAA==} + cpu: [arm64] + os: [linux] + + '@rspack-canary/binding-linux-x64-gnu@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-jeajr2e5cNqyNKe0/2hbD4B6sDWD5fv/rWqHLXRd9mwmHxvLcN/A1IB7d8YeajfqH/OwaLzsEJ6MLGg6JNssQQ==} + cpu: [x64] + os: [linux] + + '@rspack-canary/binding-linux-x64-musl@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-G7U0bBLIGcRAsOtJV2F7kGDnLbl0EfHf80HxfLF1T2ioLOtHl1amYOACKXdqbFOyy9kWKTRoCxLMoPI7xjfrgw==} + cpu: [x64] + os: [linux] + + '@rspack-canary/binding-wasm32-wasi@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-5kzRtjrF9gBJZa6sGLX02VqMc+OxyI5O7FGDpbeLoCCyhfVvAfiGz6cCbIuqGRie2KktJG0Z3wDzGEJDJ6M54g==} + cpu: [wasm32] + + '@rspack-canary/binding-win32-arm64-msvc@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-RK89Zpxg3M31zA1mnzxdpjBIsoC/FzAOUr4JzzAfy7v2Jyk2YxHsu0jUjxdRFiE0+CC35fxZR0DPQWLmqcLcBg==} + cpu: [arm64] + os: [win32] + + '@rspack-canary/binding-win32-ia32-msvc@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-C2CtzJf7RKRxSbzImH0y5nqO9xc6C+MPEHfMlv73dkdG+7+k3J1hwvMm0qiqqR6BetAplD+GoAS14DmmsIlzIw==} + cpu: [ia32] + os: [win32] + + '@rspack-canary/binding-win32-x64-msvc@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-O6n1jJH9PiZYzqSDKKqcxMUri3nTdBkZ1MTSMJV0ca2aQPbTv+P6TOf8gwtciKO4bszOr1bg23VIkO7pfNC3yQ==} + cpu: [x64] + os: [win32] + + '@rspack-canary/binding@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-gp/33WihCbOk1h3wXc9tNEjZ2wb9n9YC1XFs2MKUJz/Tqp0TfIz84Goc/QW+NleGEQ/rw+xzBXc5iku2b4aMgw==} + + '@rspack-canary/core@2.0.0-canary-032bd1ff-20260212021235': + resolution: {integrity: sha512-VH9njrpSKv4/EBp53XvUJMMSbBtydx7R0ZWPyh/5a4gvGVafTLCiKV+shMZMgV5uWYYVTbA+5Fo0vL03a6iW1Q==} + version: 2.0.0-canary-032bd1ff-20260212021235 + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@module-federation/runtime-tools': 0.24.1 + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@module-federation/runtime-tools': + optional: true + '@swc/helpers': + optional: true + '@rspack/binding-darwin-arm64@1.7.5': resolution: {integrity: sha512-dg2/IrF+g498NUt654N8LFWfIiUsHlTankWieE1S3GWEQM6jweeRbNuu1Py1nWIUsjR2yQtv7ziia7c9Q8UTaQ==} cpu: [arm64] @@ -7744,34 +8146,60 @@ packages: engines: {node: '>=18'} hasBin: true - '@vue/compiler-core@3.5.28': - resolution: {integrity: sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==} + '@volar/language-core@1.11.1': + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + + '@volar/source-map@1.11.1': + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + + '@volar/typescript@1.11.1': + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + + '@vue/compiler-core@3.5.27': + resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} + + '@vue/compiler-core@3.5.29': + resolution: {integrity: sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==} - '@vue/compiler-dom@3.5.28': - resolution: {integrity: sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==} + '@vue/compiler-dom@3.5.27': + resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==} - '@vue/compiler-sfc@3.5.28': - resolution: {integrity: sha512-6TnKMiNkd6u6VeVDhZn/07KhEZuBSn43Wd2No5zaP5s3xm8IqFTHBj84HJah4UepSUJTro5SoqqlOY22FKY96g==} + '@vue/compiler-dom@3.5.29': + resolution: {integrity: sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==} - '@vue/compiler-ssr@3.5.28': - resolution: {integrity: sha512-JCq//9w1qmC6UGLWJX7RXzrGpKkroubey/ZFqTpvEIDJEKGgntuDMqkuWiZvzTzTA5h2qZvFBFHY7fAAa9475g==} + '@vue/compiler-sfc@3.5.29': + resolution: {integrity: sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==} + + '@vue/compiler-ssr@3.5.29': + resolution: {integrity: sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==} + + '@vue/language-core@1.8.27': + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@vue/reactivity@3.5.28': - resolution: {integrity: sha512-gr5hEsxvn+RNyu9/9o1WtdYdwDjg5FgjUSBEkZWqgTKlo/fvwZ2+8W6AfKsc9YN2k/+iHYdS9vZYAhpi10kNaw==} + '@vue/reactivity@3.5.29': + resolution: {integrity: sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==} - '@vue/runtime-core@3.5.28': - resolution: {integrity: sha512-POVHTdbgnrBBIpnbYU4y7pOMNlPn2QVxVzkvEA2pEgvzbelQq4ZOUxbp2oiyo+BOtiYlm8Q44wShHJoBvDPAjQ==} + '@vue/runtime-core@3.5.29': + resolution: {integrity: sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==} - '@vue/runtime-dom@3.5.28': - resolution: {integrity: sha512-4SXxSF8SXYMuhAIkT+eBRqOkWEfPu6nhccrzrkioA6l0boiq7sp18HCOov9qWJA5HML61kW8p/cB4MmBiG9dSA==} + '@vue/runtime-dom@3.5.29': + resolution: {integrity: sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==} - '@vue/server-renderer@3.5.28': - resolution: {integrity: sha512-pf+5ECKGj8fX95bNincbzJ6yp6nyzuLDhYZCeFxUNp8EBrQpPpQaLX3nNCp49+UbgbPun3CeVE+5CXVV1Xydfg==} + '@vue/server-renderer@3.5.29': + resolution: {integrity: sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==} peerDependencies: - vue: 3.5.28 + vue: 3.5.29 - '@vue/shared@3.5.28': - resolution: {integrity: sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==} + '@vue/shared@3.5.27': + resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} + + '@vue/shared@3.5.29': + resolution: {integrity: sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==} '@web-std/blob@3.0.5': resolution: {integrity: sha512-Lm03qr0eT3PoLBuhkvFBLf0EFkAsNz/G/AYCzpOdi483aFaVX86b4iQs0OHhzHJfN5C15q17UtDbyABjlzM96A==} @@ -8586,6 +9014,9 @@ packages: compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -9058,6 +9489,9 @@ packages: dayjs@1.11.19: resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -9794,10 +10228,6 @@ packages: resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} engines: {node: '>=14.14'} - fs-extra@11.3.3: - resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} - engines: {node: '>=14.14'} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -10056,6 +10486,10 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + hex-color-regex@1.1.0: resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} @@ -10880,10 +11314,6 @@ packages: resolution: {integrity: sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==} engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} - koa@3.0.3: - resolution: {integrity: sha512-MeuwbCoN1daWS32/Ni5qkzmrOtQO2qrnfdxDHjrm6s4b59yG4nexAJ0pTEFyzjLp0pBVO80CZp0vW8Ze30Ebow==} - engines: {node: '>= 18'} - langium@3.3.1: resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} engines: {node: '>=16.0.0'} @@ -11267,10 +11697,6 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - medium-zoom@1.1.0: resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} @@ -11428,10 +11854,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -11519,6 +11941,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + mutationobserver-shim@0.3.7: resolution: {integrity: sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ==} @@ -13139,6 +13564,11 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + roughjs@4.6.6: resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} @@ -14051,10 +14481,6 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} @@ -14312,8 +14738,17 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - vue@3.5.28: - resolution: {integrity: sha512-BRdrNfeoccSoIZeIhyPBfvWSLFP4q8J3u8Ju8Ug5vu3LdD+yTM13Sg4sKtljxozbnuMu1NB1X5HBHRYUzFocKg==} + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@1.8.27: + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + + vue@3.5.29: + resolution: {integrity: sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -16451,6 +16886,20 @@ snapshots: '@modern-js/utils': 2.70.4 '@swc/helpers': 0.5.18 + '@modern-js/plugin@3.0.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@modern-js/runtime-utils': 3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@modern-js/types': 3.0.2 + '@modern-js/utils': 3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) + '@swc/helpers': 0.5.18 + jiti: 2.6.1 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + - core-js + - react + - react-dom + '@modern-js/polyfill-lib@1.0.2': dependencies: '@financial-times/polyfill-useragent-normaliser': 1.10.2 @@ -16499,6 +16948,37 @@ snapshots: transitivePeerDependencies: - supports-color + '@modern-js/runtime-utils@3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@modern-js/types': 3.0.2 + '@modern-js/utils': 3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@swc/helpers': 0.5.18 + lru-cache: 10.4.3 + react-router: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + serialize-javascript: 6.0.2 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@modern-js/server-core@3.0.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@modern-js/plugin': 3.0.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@modern-js/runtime-utils': 3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@modern-js/utils': 3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@swc/helpers': 0.5.18 + '@web-std/fetch': 4.2.1 + '@web-std/file': 3.0.3 + '@web-std/stream': 1.0.3 + cloneable-readable: 3.0.0 + flatted: 3.3.3 + hono: 4.11.7 + ts-deepmerge: 7.0.3 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + - core-js + - react + - react-dom + '@modern-js/swc-plugins-darwin-arm64@0.6.11': optional: true @@ -16537,23 +17017,37 @@ snapshots: '@modern-js/types@2.70.4': {} + '@modern-js/types@3.0.2': {} + '@modern-js/utils@2.70.4': dependencies: '@swc/helpers': 0.5.18 - caniuse-lite: 1.0.30001761 + caniuse-lite: 1.0.30001766 lodash: 4.17.23 rslog: 1.3.2 - '@module-federation/bridge-react-webpack-plugin@2.0.0': + '@modern-js/utils@3.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@module-federation/sdk': 2.0.0 + '@swc/helpers': 0.5.18 + caniuse-lite: 1.0.30001766 + import-meta-resolve: 4.2.0 + lodash: 4.17.23 + lodash-es: 4.17.23 + rslog: 1.3.2 + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + '@module-federation/bridge-react-webpack-plugin@https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a': + dependencies: + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a '@types/semver': 7.5.8 semver: 7.6.3 - '@module-federation/bridge-react@2.0.0(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)': + '@module-federation/bridge-react@https://pkg.pr.new/module-federation/core/@module-federation/bridge-react@c160c7ae3246c65fa50f19d966b8acd32448580a(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)': dependencies: - '@module-federation/bridge-shared': 2.0.0 - '@module-federation/sdk': 2.0.0 + '@module-federation/bridge-shared': https://pkg.pr.new/module-federation/core/@module-federation/bridge-shared@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a lru-cache: 10.4.3 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -16562,12 +17056,12 @@ snapshots: react-router: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react-router-dom: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@module-federation/bridge-shared@2.0.0': {} + '@module-federation/bridge-shared@https://pkg.pr.new/module-federation/core/@module-federation/bridge-shared@c160c7ae3246c65fa50f19d966b8acd32448580a': {} - '@module-federation/cli@2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@module-federation/cli@https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))': dependencies: - '@module-federation/dts-plugin': 2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/sdk': 2.0.0 + '@module-federation/dts-plugin': https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a chalk: 3.0.0 commander: 11.1.0 jiti: 2.4.2 @@ -16579,58 +17073,89 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/data-prefetch@2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@module-federation/data-prefetch@https://pkg.pr.new/module-federation/core/@module-federation/data-prefetch@c160c7ae3246c65fa50f19d966b8acd32448580a(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@module-federation/runtime': 2.0.0 - '@module-federation/sdk': 2.0.0 + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a fs-extra: 9.1.0 optionalDependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@module-federation/dts-plugin@2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@module-federation/dts-plugin@https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))': dependencies: - '@module-federation/error-codes': 2.0.0 - '@module-federation/managers': 2.0.0 - '@module-federation/sdk': 2.0.0 - '@module-federation/third-party-dts-extractor': 2.0.0 + '@module-federation/error-codes': https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/managers': https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/third-party-dts-extractor': https://pkg.pr.new/module-federation/core/@module-federation/third-party-dts-extractor@c160c7ae3246c65fa50f19d966b8acd32448580a adm-zip: 0.5.16 ansi-colors: 4.1.3 axios: 1.13.5(debug@4.4.3) chalk: 3.0.0 fs-extra: 9.1.0 isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - koa: 3.0.3 lodash.clonedeepwith: 4.5.0 log4js: 6.9.1 node-schedule: 2.1.1 rambda: 9.4.2 typescript: 5.9.3 ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + vue-tsc: 1.8.27(typescript@5.9.3) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + '@module-federation/enhanced@https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + dependencies: + '@module-federation/bridge-react-webpack-plugin': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/cli': https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/data-prefetch': https://pkg.pr.new/module-federation/core/@module-federation/data-prefetch@c160c7ae3246c65fa50f19d966b8acd32448580a(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@module-federation/dts-plugin': https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/error-codes': https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/inject-external-runtime-core-plugin': https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@module-federation/runtime-tools@2.0.1) + '@module-federation/managers': https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/manifest': https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/rspack': https://pkg.pr.new/module-federation/core/@module-federation/rspack@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + btoa: 1.2.1 + schema-utils: 4.3.3 + upath: 2.0.1 + optionalDependencies: + typescript: 5.9.3 + vue-tsc: 1.8.27(typescript@5.9.3) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2) transitivePeerDependencies: + - '@rspack/core' - bufferutil - debug + - react + - react-dom - supports-color - utf-8-validate - '@module-federation/enhanced@2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': - dependencies: - '@module-federation/bridge-react-webpack-plugin': 2.0.0 - '@module-federation/cli': 2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/data-prefetch': 2.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@module-federation/dts-plugin': 2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/error-codes': 2.0.0 - '@module-federation/inject-external-runtime-core-plugin': 2.0.0(@module-federation/runtime-tools@2.0.0) - '@module-federation/managers': 2.0.0 - '@module-federation/manifest': 2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/rspack': 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/runtime-tools': 2.0.0 - '@module-federation/sdk': 2.0.0 + '@module-federation/enhanced@https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + dependencies: + '@module-federation/bridge-react-webpack-plugin': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/cli': https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/data-prefetch': https://pkg.pr.new/module-federation/core/@module-federation/data-prefetch@c160c7ae3246c65fa50f19d966b8acd32448580a(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@module-federation/dts-plugin': https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/error-codes': https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/inject-external-runtime-core-plugin': https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a) + '@module-federation/managers': https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/manifest': https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/rspack': https://pkg.pr.new/module-federation/core/@module-federation/rspack@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a btoa: 1.2.1 schema-utils: 4.3.3 upath: 2.0.1 optionalDependencies: typescript: 5.9.3 + vue-tsc: 1.8.27(typescript@5.9.3) webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2) transitivePeerDependencies: - '@rspack/core' @@ -16641,75 +17166,219 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/error-codes@0.22.0': {} + '@module-federation/error-codes@https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a': {} - '@module-federation/error-codes@2.0.0': {} + '@module-federation/inject-external-runtime-core-plugin@https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@module-federation/runtime-tools@2.0.1)': + dependencies: + '@module-federation/runtime-tools': 2.0.1 - '@module-federation/inject-external-runtime-core-plugin@2.0.0(@module-federation/runtime-tools@2.0.0)': + '@module-federation/inject-external-runtime-core-plugin@https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)': dependencies: - '@module-federation/runtime-tools': 2.0.0 + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a - '@module-federation/managers@2.0.0': + '@module-federation/managers@https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a': dependencies: - '@module-federation/sdk': 2.0.0 + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a find-pkg: 2.0.0 fs-extra: 9.1.0 - '@module-federation/manifest@2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@module-federation/manifest@https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))': + dependencies: + '@module-federation/dts-plugin': https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/managers': https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + chalk: 3.0.0 + find-pkg: 2.0.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - typescript + - utf-8-validate + - vue-tsc + + '@module-federation/modern-js-v3@2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + dependencies: + '@module-federation/bridge-react': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react@c160c7ae3246c65fa50f19d966b8acd32448580a(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + '@module-federation/cli': https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/node': 2.7.31(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/rsbuild-plugin': https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + '@swc/helpers': 0.5.18 + fs-extra: 11.3.0 + jiti: 2.4.2 + lru-cache: 10.4.3 + node-fetch: 3.3.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-error-boundary: 4.1.2(react@19.2.4) + optionalDependencies: + react-router: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-router-dom: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + typescript: 5.9.3 + vue-tsc: 1.8.27(typescript@5.9.3) + transitivePeerDependencies: + - '@rsbuild/core' + - '@rspack/core' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + + '@module-federation/modern-js-v3@https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6(@modern-js/server-core@3.0.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + dependencies: + '@modern-js/server-core': 3.0.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@module-federation/bridge-react': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react@c160c7ae3246c65fa50f19d966b8acd32448580a(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + '@module-federation/cli': https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/node': 2.7.32(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/rsbuild-plugin': https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + '@swc/helpers': 0.5.18 + fs-extra: 11.3.0 + jiti: 2.4.2 + lru-cache: 10.4.3 + node-fetch: 3.3.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-error-boundary: 4.1.2(react@19.2.4) + optionalDependencies: + react-router: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-router-dom: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + typescript: 5.9.3 + vue-tsc: 1.8.27(typescript@5.9.3) + transitivePeerDependencies: + - '@rsbuild/core' + - '@rspack/core' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + + '@module-federation/modern-js-v3@https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6(@modern-js/server-core@3.0.2(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + dependencies: + '@modern-js/server-core': 3.0.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@module-federation/bridge-react': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react@c160c7ae3246c65fa50f19d966b8acd32448580a(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + '@module-federation/cli': https://pkg.pr.new/module-federation/core/@module-federation/cli@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/node': 2.7.32(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/rsbuild-plugin': https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + '@swc/helpers': 0.5.18 + fs-extra: 11.3.0 + jiti: 2.4.2 + lru-cache: 10.4.3 + node-fetch: 3.3.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-error-boundary: 4.1.2(react@19.2.4) + optionalDependencies: + react-router: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-router-dom: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + typescript: 5.9.3 + vue-tsc: 1.8.27(typescript@5.9.3) + transitivePeerDependencies: + - '@rsbuild/core' + - '@rspack/core' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + + '@module-federation/node@2.7.31(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + dependencies: + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + btoa: 1.2.1 + encoding: 0.1.13 + node-fetch: 2.7.0(encoding@0.1.13) + optionalDependencies: + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2) + transitivePeerDependencies: + - '@rspack/core' + - bufferutil + - debug + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + - vue-tsc + + '@module-federation/node@2.7.32(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + dependencies: + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + btoa: 1.2.1 + encoding: 0.1.13 + node-fetch: 2.7.0(encoding@0.1.13) + optionalDependencies: + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2) + transitivePeerDependencies: + - '@rspack/core' + - bufferutil + - debug + - react + - react-dom + - supports-color + - typescript + - utf-8-validate + - vue-tsc + + '@module-federation/node@2.7.32(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': dependencies: - '@module-federation/dts-plugin': 2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/managers': 2.0.0 - '@module-federation/sdk': 2.0.0 - chalk: 3.0.0 - find-pkg: 2.0.0 + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + btoa: 1.2.1 + encoding: 0.1.13 + node-fetch: 2.7.0(encoding@0.1.13) + optionalDependencies: + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2) transitivePeerDependencies: + - '@rspack/core' - bufferutil - debug + - react + - react-dom - supports-color - typescript - utf-8-validate - vue-tsc - '@module-federation/modern-js-v3@2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + '@module-federation/rsbuild-plugin@https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': dependencies: - '@module-federation/bridge-react': 2.0.0(react-dom@19.2.4(react@19.2.4))(react-router-dom@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-router@7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) - '@module-federation/cli': 2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/enhanced': 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) - '@module-federation/node': 2.7.31(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) - '@module-federation/rsbuild-plugin': 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) - '@module-federation/runtime': 2.0.0 - '@module-federation/sdk': 2.0.0 - '@swc/helpers': 0.5.18 + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/node': 2.7.32(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a fs-extra: 11.3.0 - jiti: 2.4.2 - lru-cache: 10.4.3 - node-fetch: 3.3.2 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-error-boundary: 4.1.2(react@19.2.4) - optionalDependencies: - react-router: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react-router-dom: 7.13.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - typescript: 5.9.3 transitivePeerDependencies: - - '@rsbuild/core' - '@rspack/core' - bufferutil - debug + - react + - react-dom - supports-color + - typescript - utf-8-validate + - vue-tsc - webpack - '@module-federation/node@2.7.31(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + '@module-federation/rsbuild-plugin@https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': dependencies: - '@module-federation/enhanced': 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) - '@module-federation/runtime': 2.0.0 - '@module-federation/sdk': 2.0.0 - btoa: 1.2.1 - encoding: 0.1.13 - node-fetch: 2.7.0(encoding@0.1.13) - optionalDependencies: - webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2) + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/node': 2.7.32(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + fs-extra: 11.3.0 transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -16720,12 +17389,13 @@ snapshots: - typescript - utf-8-validate - vue-tsc + - webpack - '@module-federation/rsbuild-plugin@2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + '@module-federation/rsbuild-plugin@https://pkg.pr.new/module-federation/core/@module-federation/rsbuild-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': dependencies: - '@module-federation/enhanced': 2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) - '@module-federation/node': 2.7.31(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) - '@module-federation/sdk': 2.0.0 + '@module-federation/enhanced': https://pkg.pr.new/module-federation/core/@module-federation/enhanced@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/node': 2.7.32(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a fs-extra: 11.3.0 transitivePeerDependencies: - '@rspack/core' @@ -16739,76 +17409,79 @@ snapshots: - vue-tsc - webpack - '@module-federation/rspack@2.0.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@module-federation/rspack@https://pkg.pr.new/module-federation/core/@module-federation/rspack@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))': dependencies: - '@module-federation/bridge-react-webpack-plugin': 2.0.0 - '@module-federation/dts-plugin': 2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/inject-external-runtime-core-plugin': 2.0.0(@module-federation/runtime-tools@2.0.0) - '@module-federation/managers': 2.0.0 - '@module-federation/manifest': 2.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@module-federation/runtime-tools': 2.0.0 - '@module-federation/sdk': 2.0.0 - '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18) + '@module-federation/bridge-react-webpack-plugin': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/dts-plugin': https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/inject-external-runtime-core-plugin': https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@module-federation/runtime-tools@2.0.1) + '@module-federation/managers': https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/manifest': https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18) btoa: 1.2.1 optionalDependencies: typescript: 5.9.3 + vue-tsc: 1.8.27(typescript@5.9.3) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - '@module-federation/runtime-core@0.22.0': - dependencies: - '@module-federation/error-codes': 0.22.0 - '@module-federation/sdk': 0.22.0 - - '@module-federation/runtime-core@2.0.0': + '@module-federation/rspack@https://pkg.pr.new/module-federation/core/@module-federation/rspack@c160c7ae3246c65fa50f19d966b8acd32448580a(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3))': dependencies: - '@module-federation/error-codes': 2.0.0 - '@module-federation/sdk': 2.0.0 + '@module-federation/bridge-react-webpack-plugin': https://pkg.pr.new/module-federation/core/@module-federation/bridge-react-webpack-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/dts-plugin': https://pkg.pr.new/module-federation/core/@module-federation/dts-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/inject-external-runtime-core-plugin': https://pkg.pr.new/module-federation/core/@module-federation/inject-external-runtime-core-plugin@c160c7ae3246c65fa50f19d966b8acd32448580a(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a) + '@module-federation/managers': https://pkg.pr.new/module-federation/core/@module-federation/managers@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/manifest': https://pkg.pr.new/module-federation/core/@module-federation/manifest@c160c7ae3246c65fa50f19d966b8acd32448580a(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@1.8.27(typescript@5.9.3)) + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a + '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18) + btoa: 1.2.1 + optionalDependencies: + typescript: 5.9.3 + vue-tsc: 1.8.27(typescript@5.9.3) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate - '@module-federation/runtime-tools@0.22.0': + '@module-federation/runtime-core@https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a': dependencies: - '@module-federation/runtime': 0.22.0 - '@module-federation/webpack-bundler-runtime': 0.22.0 + '@module-federation/error-codes': https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a - '@module-federation/runtime-tools@2.0.0': + '@module-federation/runtime-tools@2.0.1': dependencies: - '@module-federation/runtime': 2.0.0 - '@module-federation/webpack-bundler-runtime': 2.0.0 + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/webpack-bundler-runtime': https://pkg.pr.new/module-federation/core/@module-federation/webpack-bundler-runtime@c160c7ae3246c65fa50f19d966b8acd32448580a - '@module-federation/runtime@0.22.0': + '@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a': dependencies: - '@module-federation/error-codes': 0.22.0 - '@module-federation/runtime-core': 0.22.0 - '@module-federation/sdk': 0.22.0 + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/webpack-bundler-runtime': https://pkg.pr.new/module-federation/core/@module-federation/webpack-bundler-runtime@c160c7ae3246c65fa50f19d966b8acd32448580a - '@module-federation/runtime@2.0.0': + '@module-federation/runtime@https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a': dependencies: - '@module-federation/error-codes': 2.0.0 - '@module-federation/runtime-core': 2.0.0 - '@module-federation/sdk': 2.0.0 - - '@module-federation/sdk@0.22.0': {} + '@module-federation/error-codes': https://pkg.pr.new/module-federation/core/@module-federation/error-codes@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/runtime-core': https://pkg.pr.new/module-federation/core/@module-federation/runtime-core@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a - '@module-federation/sdk@2.0.0': {} + '@module-federation/sdk@https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a': {} - '@module-federation/third-party-dts-extractor@2.0.0': + '@module-federation/third-party-dts-extractor@https://pkg.pr.new/module-federation/core/@module-federation/third-party-dts-extractor@c160c7ae3246c65fa50f19d966b8acd32448580a': dependencies: find-pkg: 2.0.0 fs-extra: 9.1.0 resolve: 1.22.8 - '@module-federation/webpack-bundler-runtime@0.22.0': - dependencies: - '@module-federation/runtime': 0.22.0 - '@module-federation/sdk': 0.22.0 - - '@module-federation/webpack-bundler-runtime@2.0.0': + '@module-federation/webpack-bundler-runtime@https://pkg.pr.new/module-federation/core/@module-federation/webpack-bundler-runtime@c160c7ae3246c65fa50f19d966b8acd32448580a': dependencies: - '@module-federation/runtime': 2.0.0 - '@module-federation/sdk': 2.0.0 + '@module-federation/runtime': https://pkg.pr.new/module-federation/core/@module-federation/runtime@c160c7ae3246c65fa50f19d966b8acd32448580a + '@module-federation/sdk': https://pkg.pr.new/module-federation/core/@module-federation/sdk@c160c7ae3246c65fa50f19d966b8acd32448580a '@mswjs/interceptors@0.41.3': dependencies: @@ -17100,6 +17773,89 @@ snapshots: optionalDependencies: rollup: 3.29.5 + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.57.1 + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + '@rsbuild-image/core@0.0.1-next.16(ipx@3.1.1(ioredis@5.8.2))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sharp@0.34.5)': dependencies: '@sindresorhus/is': 7.2.0 @@ -17133,9 +17889,9 @@ snapshots: core-js: 3.47.0 jiti: 2.6.1 - '@rsbuild/core@2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)': + '@rsbuild/core@2.0.0-beta.1(core-js@3.48.0)': dependencies: - '@rspack/core': 2.0.0-alpha.1(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18) + '@rspack/core': 2.0.0-alpha.1(@swc/helpers@0.5.18) '@swc/helpers': 0.5.18 jiti: 2.6.1 optionalDependencies: @@ -17143,26 +17899,26 @@ snapshots: transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)': + '@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0)': dependencies: - '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18) + '@rspack/core': '@rspack-canary/core@2.0.0-canary-032bd1ff-20260212021235(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18)' '@swc/helpers': 0.5.18 optionalDependencies: core-js: 3.48.0 transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/plugin-assets-retry@1.5.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-assets-retry@1.5.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': optionalDependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) - '@rsbuild/plugin-babel@1.1.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-babel@1.1.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-proposal-decorators': 7.28.6(@babel/core@7.28.6) '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.6) '@babel/preset-typescript': 7.28.5(@babel/core@7.28.6) - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@types/babel__core': 7.20.5 deepmerge: 4.3.1 reduce-configs: 1.1.1 @@ -17170,7 +17926,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@rsbuild/plugin-check-syntax@1.6.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-check-syntax@1.6.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': dependencies: acorn: 8.15.0 browserslist-to-es-version: 1.2.0 @@ -17178,14 +17934,14 @@ snapshots: picocolors: 1.1.1 source-map: 0.7.6 optionalDependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) - '@rsbuild/plugin-css-minimizer@1.1.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(esbuild@0.27.2)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.17))(esbuild@0.27.2))': + '@rsbuild/plugin-css-minimizer@1.1.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(esbuild@0.27.2)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.17))(esbuild@0.27.2))': dependencies: css-minimizer-webpack-plugin: 7.0.2(esbuild@0.27.2)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.17))(esbuild@0.27.2)) reduce-configs: 1.1.1 optionalDependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) transitivePeerDependencies: - '@parcel/css' - '@swc/css' @@ -17195,72 +17951,72 @@ snapshots: - lightningcss - webpack - '@rsbuild/plugin-less@1.6.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-less@1.6.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': dependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) deepmerge: 4.3.1 reduce-configs: 1.1.1 - '@rsbuild/plugin-react@1.4.4(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-react@1.4.4(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': dependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@rspack/plugin-react-refresh': 1.6.0(react-refresh@0.18.0) react-refresh: 0.18.0 transitivePeerDependencies: - webpack-hot-middleware - '@rsbuild/plugin-react@1.4.5(@rsbuild/core@2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-react@1.4.5(@rsbuild/core@2.0.0-beta.1(core-js@3.48.0))': dependencies: - '@rsbuild/core': 2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.1(core-js@3.48.0) '@rspack/plugin-react-refresh': 1.6.0(react-refresh@0.18.0) react-refresh: 0.18.0 transitivePeerDependencies: - webpack-hot-middleware - '@rsbuild/plugin-rem@1.0.5(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-rem@1.0.5(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': dependencies: deepmerge: 4.3.1 terser: 5.46.0 optionalDependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) - '@rsbuild/plugin-sass@1.5.0(@rsbuild/core@2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-sass@1.5.0(@rsbuild/core@2.0.0-beta.1(core-js@3.48.0))': dependencies: - '@rsbuild/core': 2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.1(core-js@3.48.0) deepmerge: 4.3.1 loader-utils: 2.0.4 postcss: 8.5.6 reduce-configs: 1.1.1 sass-embedded: 1.97.3 - '@rsbuild/plugin-sass@1.5.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-sass@1.5.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': dependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) deepmerge: 4.3.1 loader-utils: 2.0.4 postcss: 8.5.6 reduce-configs: 1.1.1 sass-embedded: 1.97.3 - '@rsbuild/plugin-source-build@1.0.4(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-source-build@1.0.4(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': dependencies: fast-glob: 3.3.3 json5: 2.2.3 yaml: 2.8.2 optionalDependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) - '@rsbuild/plugin-styled-components@1.6.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-styled-components@1.6.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': dependencies: '@swc/plugin-styled-components': 12.3.0 reduce-configs: 1.1.1 optionalDependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) - '@rsbuild/plugin-svgr@1.3.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(typescript@5.9.3)': + '@rsbuild/plugin-svgr@1.3.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(typescript@5.9.3)': dependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) - '@rsbuild/plugin-react': 1.4.4(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) + '@rsbuild/plugin-react': 1.4.4(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3))(typescript@5.9.3) @@ -17271,27 +18027,27 @@ snapshots: - typescript - webpack-hot-middleware - '@rsbuild/plugin-type-check@1.3.3(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(typescript@5.9.3)': + '@rsbuild/plugin-type-check@1.3.3(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(typescript@5.9.3)': dependencies: deepmerge: 4.3.1 json5: 2.2.3 reduce-configs: 1.1.1 - ts-checker-rspack-plugin: 1.2.3(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(typescript@5.9.3) + ts-checker-rspack-plugin: 1.2.3(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(typescript@5.9.3) optionalDependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) transitivePeerDependencies: - '@rspack/core' - typescript - '@rsbuild/plugin-typed-css-modules@1.2.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))': + '@rsbuild/plugin-typed-css-modules@1.2.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))': optionalDependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) '@rsdoctor/client@1.5.2': {} - '@rsdoctor/core@1.5.2(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + '@rsdoctor/core@1.5.2(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': dependencies: - '@rsbuild/plugin-check-syntax': 1.6.1(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) + '@rsbuild/plugin-check-syntax': 1.6.1(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0)) '@rsdoctor/graph': 1.5.2(@rspack/core@1.7.5(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) '@rsdoctor/sdk': 1.5.2(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) '@rsdoctor/types': 1.5.2(@rspack/core@1.7.5(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) @@ -17300,7 +18056,7 @@ snapshots: enhanced-resolve: 5.12.0 es-toolkit: 1.43.0 filesize: 10.1.6 - fs-extra: 11.3.3 + fs-extra: 11.3.0 semver: 7.7.4 source-map: 0.7.6 transitivePeerDependencies: @@ -17322,9 +18078,9 @@ snapshots: - '@rspack/core' - webpack - '@rsdoctor/rspack-plugin@1.5.2(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': + '@rsdoctor/rspack-plugin@1.5.2(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2))': dependencies: - '@rsdoctor/core': 1.5.2(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) + '@rsdoctor/core': 1.5.2(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) '@rsdoctor/graph': 1.5.2(@rspack/core@1.7.5(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) '@rsdoctor/sdk': 1.5.2(@rspack/core@1.7.5(@swc/helpers@0.5.18))(bufferutil@4.1.0)(utf-8-validate@5.0.10)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) '@rsdoctor/types': 1.5.2(@rspack/core@1.7.5(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.27.2)) @@ -17374,7 +18130,7 @@ snapshots: acorn-walk: 8.3.4 deep-eql: 4.1.4 envinfo: 7.21.0 - fs-extra: 11.3.3 + fs-extra: 11.3.0 get-port: 5.1.1 json-stream-stringify: 3.0.1 lines-and-columns: 2.0.4 @@ -17394,6 +18150,58 @@ snapshots: transitivePeerDependencies: - '@typescript/native-preview' + '@rspack-canary/binding-darwin-arm64@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding-darwin-x64@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding-linux-arm64-gnu@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding-linux-arm64-musl@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding-linux-x64-gnu@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding-linux-x64-musl@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding-wasm32-wasi@2.0.0-canary-032bd1ff-20260212021235': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rspack-canary/binding-win32-arm64-msvc@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding-win32-ia32-msvc@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding-win32-x64-msvc@2.0.0-canary-032bd1ff-20260212021235': + optional: true + + '@rspack-canary/binding@2.0.0-canary-032bd1ff-20260212021235': + optionalDependencies: + '@rspack/binding-darwin-arm64': '@rspack-canary/binding-darwin-arm64@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-darwin-x64': '@rspack-canary/binding-darwin-x64@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-linux-arm64-gnu': '@rspack-canary/binding-linux-arm64-gnu@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-linux-arm64-musl': '@rspack-canary/binding-linux-arm64-musl@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-linux-x64-gnu': '@rspack-canary/binding-linux-x64-gnu@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-linux-x64-musl': '@rspack-canary/binding-linux-x64-musl@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-wasm32-wasi': '@rspack-canary/binding-wasm32-wasi@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-win32-arm64-msvc': '@rspack-canary/binding-win32-arm64-msvc@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-win32-ia32-msvc': '@rspack-canary/binding-win32-ia32-msvc@2.0.0-canary-032bd1ff-20260212021235' + '@rspack/binding-win32-x64-msvc': '@rspack-canary/binding-win32-x64-msvc@2.0.0-canary-032bd1ff-20260212021235' + + '@rspack-canary/core@2.0.0-canary-032bd1ff-20260212021235(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18)': + dependencies: + '@rspack/binding': '@rspack-canary/binding@2.0.0-canary-032bd1ff-20260212021235' + optionalDependencies: + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a + '@swc/helpers': 0.5.18 + '@rspack/binding-darwin-arm64@1.7.5': optional: true @@ -17531,32 +18339,38 @@ snapshots: '@rspack/core@1.7.5(@swc/helpers@0.5.18)': dependencies: - '@module-federation/runtime-tools': 0.22.0 + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a '@rspack/binding': 1.7.5 '@rspack/lite-tapable': 1.1.0 optionalDependencies: '@swc/helpers': 0.5.18 - '@rspack/core@2.0.0-alpha.1(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18)': + '@rspack/core@2.0.0-alpha.1(@swc/helpers@0.5.18)': dependencies: '@rspack/binding': 2.0.0-alpha.1 '@rspack/lite-tapable': 1.1.0 optionalDependencies: - '@module-federation/runtime-tools': 2.0.0 '@swc/helpers': 0.5.18 - '@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17)': + '@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.17)': dependencies: '@rspack/binding': 2.0.0-beta.2 optionalDependencies: - '@module-federation/runtime-tools': 2.0.0 + '@module-federation/runtime-tools': 2.0.1 '@swc/helpers': 0.5.17 - '@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18)': + '@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18)': dependencies: '@rspack/binding': 2.0.0-beta.2 optionalDependencies: - '@module-federation/runtime-tools': 2.0.0 + '@module-federation/runtime-tools': 2.0.1 + '@swc/helpers': 0.5.18 + + '@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18)': + dependencies: + '@rspack/binding': 2.0.0-beta.2 + optionalDependencies: + '@module-federation/runtime-tools': https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a '@swc/helpers': 0.5.18 '@rspack/lite-tapable@1.1.0': {} @@ -17567,13 +18381,13 @@ snapshots: html-entities: 2.6.0 react-refresh: 0.18.0 - '@rspress/core@2.0.2(@module-federation/runtime-tools@2.0.0)(@types/react@19.2.14)(core-js@3.48.0)': + '@rspress/core@2.0.2(@types/react@19.2.14)(core-js@3.48.0)': dependencies: '@mdx-js/mdx': 3.1.1 '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.4) - '@rsbuild/core': 2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) - '@rsbuild/plugin-react': 1.4.5(@rsbuild/core@2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)) - '@rspress/shared': 2.0.2(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.1(core-js@3.48.0) + '@rsbuild/plugin-react': 1.4.5(@rsbuild/core@2.0.0-beta.1(core-js@3.48.0)) + '@rspress/shared': 2.0.2(core-js@3.48.0) '@shikijs/rehype': 3.22.0 '@types/unist': 3.0.3 '@unhead/react': 2.1.2(react@19.2.4) @@ -17618,9 +18432,9 @@ snapshots: - supports-color - webpack-hot-middleware - '@rspress/plugin-llms@2.0.2(@rspress/core@2.0.2(@module-federation/runtime-tools@2.0.0)(@types/react@19.2.14)(core-js@3.48.0))': + '@rspress/plugin-llms@2.0.2(@rspress/core@2.0.2(@types/react@19.2.14)(core-js@3.48.0))': dependencies: - '@rspress/core': 2.0.2(@module-federation/runtime-tools@2.0.0)(@types/react@19.2.14)(core-js@3.48.0) + '@rspress/core': 2.0.2(@types/react@19.2.14)(core-js@3.48.0) remark-mdx: 3.1.1 remark-parse: 11.0.0 remark-stringify: 11.0.0 @@ -17629,9 +18443,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@rspress/shared@2.0.2(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0)': + '@rspress/shared@2.0.2(core-js@3.48.0)': dependencies: - '@rsbuild/core': 2.0.0-beta.1(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) + '@rsbuild/core': 2.0.0-beta.1(core-js@3.48.0) '@shikijs/rehype': 3.22.0 gray-matter: 4.0.3 lodash-es: 4.17.23 @@ -18539,10 +19353,10 @@ snapshots: '@vercel/ncc@0.38.4': {} - '@vercel/nft@0.29.2(encoding@0.1.13)(rollup@3.29.5)': + '@vercel/nft@0.29.2(encoding@0.1.13)(rollup@4.57.1)': dependencies: '@mapbox/node-pre-gyp': 2.0.3(encoding@0.1.13) - '@rollup/pluginutils': 5.3.0(rollup@3.29.5) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -18558,59 +19372,108 @@ snapshots: - rollup - supports-color - '@vue/compiler-core@3.5.28': + '@volar/language-core@1.11.1': + dependencies: + '@volar/source-map': 1.11.1 + optional: true + + '@volar/source-map@1.11.1': + dependencies: + muggle-string: 0.3.1 + optional: true + + '@volar/typescript@1.11.1': + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + optional: true + + '@vue/compiler-core@3.5.27': + dependencies: + '@babel/parser': 7.28.6 + '@vue/shared': 3.5.27 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + optional: true + + '@vue/compiler-core@3.5.29': dependencies: '@babel/parser': 7.29.0 - '@vue/shared': 3.5.28 + '@vue/shared': 3.5.29 entities: 7.0.1 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.28': + '@vue/compiler-dom@3.5.27': + dependencies: + '@vue/compiler-core': 3.5.27 + '@vue/shared': 3.5.27 + optional: true + + '@vue/compiler-dom@3.5.29': dependencies: - '@vue/compiler-core': 3.5.28 - '@vue/shared': 3.5.28 + '@vue/compiler-core': 3.5.29 + '@vue/shared': 3.5.29 - '@vue/compiler-sfc@3.5.28': + '@vue/compiler-sfc@3.5.29': dependencies: '@babel/parser': 7.29.0 - '@vue/compiler-core': 3.5.28 - '@vue/compiler-dom': 3.5.28 - '@vue/compiler-ssr': 3.5.28 - '@vue/shared': 3.5.28 + '@vue/compiler-core': 3.5.29 + '@vue/compiler-dom': 3.5.29 + '@vue/compiler-ssr': 3.5.29 + '@vue/shared': 3.5.29 estree-walker: 2.0.2 magic-string: 0.30.21 postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.28': + '@vue/compiler-ssr@3.5.29': + dependencies: + '@vue/compiler-dom': 3.5.29 + '@vue/shared': 3.5.29 + + '@vue/language-core@1.8.27(typescript@5.9.3)': dependencies: - '@vue/compiler-dom': 3.5.28 - '@vue/shared': 3.5.28 + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.5.27 + '@vue/shared': 3.5.27 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.9.3 + optional: true - '@vue/reactivity@3.5.28': + '@vue/reactivity@3.5.29': dependencies: - '@vue/shared': 3.5.28 + '@vue/shared': 3.5.29 - '@vue/runtime-core@3.5.28': + '@vue/runtime-core@3.5.29': dependencies: - '@vue/reactivity': 3.5.28 - '@vue/shared': 3.5.28 + '@vue/reactivity': 3.5.29 + '@vue/shared': 3.5.29 - '@vue/runtime-dom@3.5.28': + '@vue/runtime-dom@3.5.29': dependencies: - '@vue/reactivity': 3.5.28 - '@vue/runtime-core': 3.5.28 - '@vue/shared': 3.5.28 + '@vue/reactivity': 3.5.29 + '@vue/runtime-core': 3.5.29 + '@vue/shared': 3.5.29 csstype: 3.2.3 - '@vue/server-renderer@3.5.28(vue@3.5.28(typescript@5.9.3))': + '@vue/server-renderer@3.5.29(vue@3.5.29(typescript@5.9.3))': dependencies: - '@vue/compiler-ssr': 3.5.28 - '@vue/shared': 3.5.28 - vue: 3.5.28(typescript@5.9.3) + '@vue/compiler-ssr': 3.5.29 + '@vue/shared': 3.5.29 + vue: 3.5.29(typescript@5.9.3) + + '@vue/shared@3.5.27': + optional: true - '@vue/shared@3.5.28': {} + '@vue/shared@3.5.29': {} '@web-std/blob@3.0.5': dependencies: @@ -19500,6 +20363,9 @@ snapshots: compute-scroll-into-view@3.1.1: {} + computeds@0.0.1: + optional: true + concat-map@0.0.1: {} confbox@0.1.8: {} @@ -20047,6 +20913,9 @@ snapshots: dayjs@1.11.19: {} + de-indent@1.0.2: + optional: true + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -20890,12 +21759,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@11.3.3: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -21298,6 +22161,9 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 + he@1.2.0: + optional: true + hex-color-regex@1.1.0: {} hoist-non-react-statics@3.3.2: @@ -21874,25 +22740,6 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@20.19.27)(typescript@5.9.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@20.19.27)(typescript@5.9.3)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@20.19.27)(typescript@5.9.3)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest-cli@29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.17))(@types/node@20.19.27)(typescript@5.9.3)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.17))(@types/node@20.19.27)(typescript@5.9.3)) @@ -22270,18 +23117,6 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@20.19.27)(typescript@5.9.3)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest@29.7.0(@types/node@20.19.27)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.17))(@types/node@20.19.27)(typescript@5.9.3)): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.17))(@types/node@20.19.27)(typescript@5.9.3)) @@ -22470,27 +23305,6 @@ snapshots: transitivePeerDependencies: - supports-color - koa@3.0.3: - dependencies: - accepts: 1.3.8 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookies: 0.9.1 - delegates: 1.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - fresh: 0.5.2 - http-assert: 1.5.0 - http-errors: 2.0.1 - koa-compose: 4.1.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - langium@3.3.1: dependencies: chevrotain: 11.0.3 @@ -22963,8 +23777,6 @@ snapshots: media-typer@0.3.0: {} - media-typer@1.1.0: {} - medium-zoom@1.1.0: {} memfs@3.6.0: @@ -23292,10 +24104,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - mime@1.6.0: {} mime@2.6.0: {} @@ -23365,6 +24173,9 @@ snapshots: ms@2.1.3: {} + muggle-string@0.3.1: + optional: true + mutationobserver-shim@0.3.7: {} mute-stream@0.0.8: {} @@ -23379,11 +24190,11 @@ snapshots: natural-compare@1.4.0: {} - ndepe@0.1.13(encoding@0.1.13)(rollup@3.29.5): + ndepe@0.1.13(encoding@0.1.13)(rollup@4.57.1): dependencies: - '@vercel/nft': 0.29.2(encoding@0.1.13)(rollup@3.29.5) + '@vercel/nft': 0.29.2(encoding@0.1.13)(rollup@4.57.1) debug: 4.4.3(supports-color@5.5.0) - fs-extra: 11.3.3 + fs-extra: 11.3.0 mlly: 1.6.1 pkg-types: 1.3.1 pkg-up: 3.1.0 @@ -24834,15 +25645,21 @@ snapshots: optionalDependencies: react-dom: 19.2.4(react@19.2.4) - react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.18) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(@swc/helpers@0.5.18) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.18) + '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.17) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -25123,6 +25940,38 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + optional: true + roughjs@4.6.6: dependencies: hachure-fill: 0.5.2 @@ -25137,18 +25986,18 @@ snapshots: optionalDependencies: typescript: 5.9.3 - rsbuild-plugin-rsc@0.0.1-beta.0(@rsbuild/core@2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0))(react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): + rsbuild-plugin-rsc@0.0.1-beta.0(@rsbuild/core@2.0.0-beta.4(core-js@3.48.0))(react-server-dom-rspack@0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)): dependencies: - '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@2.0.0)(core-js@3.48.0) - react-server-dom-rspack: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@rsbuild/core': 2.0.0-beta.4(@module-federation/runtime-tools@https://pkg.pr.new/module-federation/core/@module-federation/runtime-tools@c160c7ae3246c65fa50f19d966b8acd32448580a)(core-js@3.48.0) + react-server-dom-rspack: 0.0.1-beta.0(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) rslog@1.3.2: {} - rspack-manifest-plugin@5.2.1(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17)): + rspack-manifest-plugin@5.2.1(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17)): dependencies: '@rspack/lite-tapable': 1.1.0 optionalDependencies: - '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.17) run-async@2.4.1: {} @@ -26043,7 +26892,7 @@ snapshots: trough@2.2.0: {} - ts-checker-rspack-plugin@1.2.3(@rspack/core@2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17))(typescript@5.9.3): + ts-checker-rspack-plugin@1.2.3(@rspack/core@2.0.0-beta.2(@swc/helpers@0.5.17))(typescript@5.9.3): dependencies: '@babel/code-frame': 7.27.1 '@rspack/lite-tapable': 1.1.0 @@ -26054,7 +26903,7 @@ snapshots: picocolors: 1.1.1 typescript: 5.9.3 optionalDependencies: - '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.0)(@swc/helpers@0.5.17) + '@rspack/core': 2.0.0-beta.2(@module-federation/runtime-tools@2.0.1)(@swc/helpers@0.5.17) ts-dedent@2.2.0: {} @@ -26215,12 +27064,6 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.2 - type@2.7.3: {} typed-query-selector@2.12.0: {} @@ -26427,13 +27270,27 @@ snapshots: vscode-uri@3.0.8: {} - vue@3.5.28(typescript@5.9.3): + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + optional: true + + vue-tsc@1.8.27(typescript@5.9.3): + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.9.3) + semver: 7.7.4 + typescript: 5.9.3 + optional: true + + vue@3.5.29(typescript@5.9.3): dependencies: - '@vue/compiler-dom': 3.5.28 - '@vue/compiler-sfc': 3.5.28 - '@vue/runtime-dom': 3.5.28 - '@vue/server-renderer': 3.5.28(vue@3.5.28(typescript@5.9.3)) - '@vue/shared': 3.5.28 + '@vue/compiler-dom': 3.5.29 + '@vue/compiler-sfc': 3.5.29 + '@vue/runtime-dom': 3.5.29 + '@vue/server-renderer': 3.5.29(vue@3.5.29(typescript@5.9.3)) + '@vue/shared': 3.5.29 optionalDependencies: typescript: 5.9.3 diff --git a/scripts/check-dependencies.js b/scripts/check-dependencies.js index 874d9c07948b..8f96e21f5278 100644 --- a/scripts/check-dependencies.js +++ b/scripts/check-dependencies.js @@ -8,9 +8,14 @@ const ignoreDeps = [ 'tsx', ]; +const ignorePaths = [ + 'tests/integration/rsc-mf/host', + 'tests/integration/rsc-mf/remote', +]; + const command = `npx check-dependency-version-consistency@latest . ${ignoreDeps .map(dep => `--ignore-dep "${dep}"`) - .join(' ')}`; + .join(' ')} ${ignorePaths.map(path => `--ignore-path "${path}"`).join(' ')}`; console.log(`> ${command}`); diff --git a/tests/e2e/builder/cases/inline-chunk/index.test.ts b/tests/e2e/builder/cases/inline-chunk/index.test.ts index 3f4147642272..47353509c11f 100644 --- a/tests/e2e/builder/cases/inline-chunk/index.test.ts +++ b/tests/e2e/builder/cases/inline-chunk/index.test.ts @@ -7,6 +7,18 @@ import { build, getHrefByEntryName } from '@scripts/shared'; // Identify whether the builder runtime chunk is included through some specific code snippets const isRuntimeChunkInHtml = (html: string): boolean => Boolean(html.includes('Loading chunk')); +const hasRuntimeChunkFile = (files: Record): boolean => + Object.keys(files).some( + fileName => + fileName.includes(RUNTIME_CHUNK_NAME) && fileName.endsWith('.js'), + ); +const hasRuntimeChunkMap = (files: Record): boolean => + Object.keys(files).some( + fileName => + fileName.includes(RUNTIME_CHUNK_NAME) && fileName.endsWith('.js.map'), + ); +const hasRuntimeScriptTag = (html: string): boolean => + html.includes('/static/js/builder-runtime.'); // use source-map for easy to test. By default, builder use hidden-source-map const toolsConfig = { @@ -79,19 +91,17 @@ test('inline runtime chunk by default', async ({ page }) => { const files = await builder.unwrapOutputJSON(false); - // no builder-runtime file in output - expect( - Object.keys(files).some( - fileName => - fileName.includes(RUNTIME_CHUNK_NAME) && fileName.endsWith('.js'), - ), - ).toBe(false); + const runtimeChunkEmitted = hasRuntimeChunkFile(files); - // found builder-runtime file in html + // found builder-runtime in html, either inlined or via runtime chunk file const indexHtml = files[path.resolve(__dirname, './dist/html/index/index.html')]; - expect(isRuntimeChunkInHtml(indexHtml)).toBeTruthy(); + expect( + runtimeChunkEmitted + ? hasRuntimeScriptTag(indexHtml) + : isRuntimeChunkInHtml(indexHtml), + ).toBeTruthy(); builder.close(); }); @@ -111,13 +121,17 @@ test('inline runtime chunk and remove source map when devtool is "hidden-source- const files = await builder.unwrapOutputJSON(false); - // should not emit source map of builder runtime - expect( - Object.keys(files).some( - fileName => - fileName.includes(RUNTIME_CHUNK_NAME) && fileName.endsWith('.js.map'), - ), - ).toBe(false); + // hidden-source-map should not inject sourceMappingURL comments in emitted JS + const jsFiles = Object.entries(files).filter(([fileName]) => + fileName.endsWith('.js'), + ); + expect(jsFiles.length).toBeGreaterThan(0); + for (const [, content] of jsFiles) { + expect(content.includes('sourceMappingURL=')).toBe(false); + } + + // hidden-source-map should not emit runtime chunk source map assets + expect(hasRuntimeChunkMap(files)).toBe(false); }); test('inline runtime chunk by default with multiple entries', async () => { @@ -133,22 +147,24 @@ test('inline runtime chunk by default with multiple entries', async () => { }); const files = await builder.unwrapOutputJSON(false); - // no builder-runtime file in output - expect( - Object.keys(files).some( - fileName => - fileName.includes(RUNTIME_CHUNK_NAME) && fileName.endsWith('.js'), - ), - ).toBe(false); + const runtimeChunkEmitted = hasRuntimeChunkFile(files); - // found builder-runtime file in html + // found builder-runtime in html, either inlined or via runtime chunk file const indexHtml = files[path.resolve(__dirname, './dist/html/index/index.html')]; const anotherHtml = files[path.resolve(__dirname, './dist/html/another/index.html')]; - expect(isRuntimeChunkInHtml(indexHtml)).toBeTruthy(); - expect(isRuntimeChunkInHtml(anotherHtml)).toBeTruthy(); + expect( + runtimeChunkEmitted + ? hasRuntimeScriptTag(indexHtml) + : isRuntimeChunkInHtml(indexHtml), + ).toBeTruthy(); + expect( + runtimeChunkEmitted + ? hasRuntimeScriptTag(anotherHtml) + : isRuntimeChunkInHtml(anotherHtml), + ).toBeTruthy(); }); test('using RegExp to inline scripts', async () => { diff --git a/tests/integration/rsc-mf/README.md b/tests/integration/rsc-mf/README.md new file mode 100644 index 000000000000..041d950120ae --- /dev/null +++ b/tests/integration/rsc-mf/README.md @@ -0,0 +1,22 @@ +# RSC + Module Federation Fixture + +This fixture is the canonical in-repo reference for Modern.js first-class React Server Components (RSC) with Module Federation. + +## Goals + +- `moduleFederationPlugin({ ssr: true })` in app config +- standard `createModuleFederationConfig(...)` +- direct exposes map for userland modules +- no fixture runtime helper glue in host or remote apps + +## Paths + +- host app: `tests/integration/rsc-mf/host` +- remote app: `tests/integration/rsc-mf/remote` +- integration tests: `tests/integration/rsc-mf/tests/index.test.ts` + +## Key Runtime Contract + +- remote actions post through host endpoint only +- action ids are bridge-prefixed: `remote::` +- internal bridge expose path `./__rspack_rsc_bridge__` is plugin-managed and acceptable when present diff --git a/tests/integration/rsc-mf/host/.browserslistrc b/tests/integration/rsc-mf/host/.browserslistrc new file mode 100644 index 000000000000..15b7c26176b2 --- /dev/null +++ b/tests/integration/rsc-mf/host/.browserslistrc @@ -0,0 +1,4 @@ +chrome >= 87 +edge >= 88 +firefox >= 78 +safari >= 14 diff --git a/tests/integration/rsc-mf/host/modern.config.ts b/tests/integration/rsc-mf/host/modern.config.ts new file mode 100644 index 000000000000..8d4669b7d2d3 --- /dev/null +++ b/tests/integration/rsc-mf/host/modern.config.ts @@ -0,0 +1,21 @@ +import { appTools, defineConfig } from '@modern-js/app-tools'; +import { moduleFederationPlugin } from '@module-federation/modern-js-v3'; + +export default defineConfig({ + server: { + rsc: true, + port: Number(process.env.PORT || 3007), + }, + // Keep RSC server entries synchronous for MF+RSC handlers. + source: { + enableAsyncEntry: false, + }, + output: { + polyfill: 'off', + disableTsChecker: true, + }, + performance: { + buildCache: false, + }, + plugins: [appTools(), moduleFederationPlugin({ ssr: true })], +}); diff --git a/tests/integration/rsc-mf/host/module-federation.config.ts b/tests/integration/rsc-mf/host/module-federation.config.ts new file mode 100644 index 000000000000..c76985589cd9 --- /dev/null +++ b/tests/integration/rsc-mf/host/module-federation.config.ts @@ -0,0 +1,133 @@ +import fs from 'fs'; +import path from 'path'; +import { createModuleFederationConfig } from '@module-federation/modern-js-v3'; + +const REMOTE_PORT = process.env.RSC_MF_REMOTE_PORT || '3008'; +const LAYERS = { + ssr: 'server-side-rendering', + rsc: 'react-server-components', +} as const; +const reactServerImport = path.join( + path.dirname(require.resolve('react/package.json')), + 'react.react-server.js', +); +const reactDomServerImport = path.join( + path.dirname(require.resolve('react-dom/package.json')), + 'react-dom.react-server.js', +); +const reactServerDomClientImport = 'react-server-dom-rspack/client.browser'; + +const readPackageVersion = (pkg: string) => + JSON.parse(fs.readFileSync(require.resolve(`${pkg}/package.json`), 'utf8')) + .version; +const reactVersion = readPackageVersion('react'); +const reactDomVersion = readPackageVersion('react-dom'); +const reactServerDomVersion = readPackageVersion('react-server-dom-rspack'); + +const sharedByScope = [ + { + react: { + singleton: true, + requiredVersion: false, + shareScope: 'default', + version: reactVersion, + }, + 'react-dom': { + singleton: true, + requiredVersion: false, + shareScope: 'default', + version: reactDomVersion, + }, + 'react-server-dom-rspack': { + singleton: true, + requiredVersion: false, + shareScope: 'default', + version: reactServerDomVersion, + }, + 'react-server-dom-rspack/client.browser': { + import: reactServerDomClientImport, + shareKey: reactServerDomClientImport, + singleton: true, + requiredVersion: false, + shareScope: 'default', + version: reactServerDomVersion, + }, + }, + { + react: { + import: 'react', + shareKey: 'react', + singleton: true, + requiredVersion: false, + shareScope: 'ssr', + layer: LAYERS.ssr, + issuerLayer: LAYERS.ssr, + version: reactVersion, + }, + 'react-dom': { + import: 'react-dom', + shareKey: 'react-dom', + singleton: true, + requiredVersion: false, + shareScope: 'ssr', + layer: LAYERS.ssr, + issuerLayer: LAYERS.ssr, + version: reactDomVersion, + }, + 'react-server-dom-rspack/client.browser': { + import: reactServerDomClientImport, + shareKey: reactServerDomClientImport, + singleton: true, + requiredVersion: false, + shareScope: 'ssr', + layer: LAYERS.ssr, + issuerLayer: LAYERS.ssr, + version: reactServerDomVersion, + }, + }, + { + react: { + import: reactServerImport, + shareKey: 'react', + singleton: true, + requiredVersion: false, + shareScope: 'rsc', + layer: LAYERS.rsc, + issuerLayer: LAYERS.rsc, + version: reactVersion, + }, + 'react-dom': { + import: reactDomServerImport, + shareKey: 'react-dom', + singleton: true, + requiredVersion: false, + shareScope: 'rsc', + layer: LAYERS.rsc, + issuerLayer: LAYERS.rsc, + version: reactDomVersion, + }, + 'react-server-dom-rspack/client.browser': { + import: reactServerDomClientImport, + shareKey: reactServerDomClientImport, + singleton: true, + requiredVersion: false, + shareScope: 'rsc', + layer: LAYERS.rsc, + issuerLayer: LAYERS.rsc, + version: reactServerDomVersion, + }, + }, +]; + +export default createModuleFederationConfig({ + name: 'rscHost', + remotes: { + rscRemote: `rscRemote@http://127.0.0.1:${REMOTE_PORT}/static/mf-manifest.json`, + }, + shared: sharedByScope as any, + dts: false, + experiments: { + asyncStartup: true, + rsc: true, + } as any, +}); diff --git a/tests/integration/rsc-mf/host/package.json b/tests/integration/rsc-mf/host/package.json new file mode 100644 index 000000000000..c6136d50606c --- /dev/null +++ b/tests/integration/rsc-mf/host/package.json @@ -0,0 +1,33 @@ +{ + "private": true, + "name": "rsc-mf-host", + "version": "2.66.0", + "scripts": { + "dev": "cross-env modern dev", + "build": "cross-env modern build", + "serve": "modern serve" + }, + "dependencies": { + "@modern-js/render": "workspace:*", + "@modern-js/runtime": "workspace:*", + "@module-federation/modern-js-v3": "https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6", + "@module-federation/runtime": "2.0.0", + "@module-federation/runtime-core": "2.0.0", + "client-only": "^0.0.1", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-server-dom-rspack": "0.0.1-beta.0", + "server-only": "^0.0.1" + }, + "devDependencies": { + "@modern-js/app-tools": "workspace:*", + "@modern-js/builder": "workspace:*", + "@modern-js/server-runtime": "workspace:*", + "@types/jest": "^29.5.14", + "@types/node": "^20", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "cross-env": "^7.0.3", + "typescript": "^5" + } +} diff --git a/tests/integration/rsc-mf/host/src/modern-app-env.d.ts b/tests/integration/rsc-mf/host/src/modern-app-env.d.ts new file mode 100644 index 000000000000..c965dfb88430 --- /dev/null +++ b/tests/integration/rsc-mf/host/src/modern-app-env.d.ts @@ -0,0 +1,3 @@ +/// +/// +/// diff --git a/tests/integration/rsc-mf/host/src/server-component-root/App.module.less b/tests/integration/rsc-mf/host/src/server-component-root/App.module.less new file mode 100644 index 000000000000..91794b56811f --- /dev/null +++ b/tests/integration/rsc-mf/host/src/server-component-root/App.module.less @@ -0,0 +1,5 @@ +.root { + border: 2px dashed #df7e00; + margin: 1em; + padding: 1em; +} diff --git a/tests/integration/rsc-mf/host/src/server-component-root/App.tsx b/tests/integration/rsc-mf/host/src/server-component-root/App.tsx new file mode 100644 index 000000000000..d50d7620b882 --- /dev/null +++ b/tests/integration/rsc-mf/host/src/server-component-root/App.tsx @@ -0,0 +1,50 @@ +import 'server-only'; +import { Suspense } from 'react'; +import { AsyncRemoteServerInfo } from 'rscRemote/AsyncRemoteServerInfo'; +import RemoteServerDefault from 'rscRemote/RemoteServerDefault'; +import * as remoteInfoBundle from 'rscRemote/infoBundle'; +import remoteMeta, { getRemoteMetaLabel } from 'rscRemote/remoteMeta'; +import { getServerOnlyInfo } from 'rscRemote/remoteServerOnly'; +import getServerOnlyDefaultInfo from 'rscRemote/remoteServerOnlyDefault'; +import styles from './App.module.less'; +import HostRemoteActionRunner from './HostRemoteActionRunner'; + +const App = () => { + const remoteServerOnlyInfo = getServerOnlyInfo(); + const remoteServerOnlyDefaultInfo = getServerOnlyDefaultInfo(); + const remoteMetaLabel = getRemoteMetaLabel(); + const bundledServerOnlyInfo = remoteInfoBundle.getBundledServerOnlyInfo(); + const bundledServerOnlyDefaultInfo = + remoteInfoBundle.getBundledServerOnlyDefaultInfo(); + const bundledRemoteMetaLabel = remoteInfoBundle.getBundledRemoteMetaLabel(); + + return ( +
+

Host RSC Module Federation

+

{remoteServerOnlyInfo}

+

+ {remoteServerOnlyDefaultInfo} +

+

{remoteMeta.kind}

+

{remoteMetaLabel}

+

{bundledServerOnlyInfo}

+

+ {bundledServerOnlyDefaultInfo} +

+

+ {remoteInfoBundle.bundledRemoteMeta.kind} +

+

{bundledRemoteMetaLabel}

+ Loading Remote Async Server Info...
}> + + + + Loading Remote RSC...}> + + + + + ); +}; + +export default App; diff --git a/tests/integration/rsc-mf/host/src/server-component-root/HostRemoteActionRunner.tsx b/tests/integration/rsc-mf/host/src/server-component-root/HostRemoteActionRunner.tsx new file mode 100644 index 000000000000..45ba50d30272 --- /dev/null +++ b/tests/integration/rsc-mf/host/src/server-component-root/HostRemoteActionRunner.tsx @@ -0,0 +1,99 @@ +'use client'; + +import { useState } from 'react'; +import RemoteClientBadge from 'rscRemote/RemoteClientBadge'; +import { RemoteClientCounter as RemoteClientCounterBridge } from 'rscRemote/RemoteClientCounter'; +import * as remoteActionBundle from 'rscRemote/actionBundle'; +import { incrementRemoteCount, remoteActionEcho } from 'rscRemote/actions'; +import { defaultRemoteAction } from 'rscRemote/defaultAction'; +import { nestedRemoteAction } from 'rscRemote/nestedActions'; + +export default function HostRemoteActionRunner() { + const [defaultResult, setDefaultResult] = useState(''); + const [echoResult, setEchoResult] = useState(''); + const [nestedResult, setNestedResult] = useState(''); + const [incrementResult, setIncrementResult] = useState(''); + const [bundledDefaultResult, setBundledDefaultResult] = useState(''); + const [bundledEchoResult, setBundledEchoResult] = useState(''); + const [bundledNestedResult, setBundledNestedResult] = useState(''); + const [bundledIncrementResult, setBundledIncrementResult] = useState(''); + const [isPending, setIsPending] = useState(false); + + const runActions = async () => { + setIsPending(true); + try { + const directIncrementFormData = new FormData(); + directIncrementFormData.set('count', '1'); + const bundledIncrementFormData = new FormData(); + bundledIncrementFormData.set('count', '1'); + const [ + defaultValue, + echoValue, + nestedValue, + bundledDefaultValue, + bundledEchoValue, + bundledNestedValue, + ] = await Promise.all([ + defaultRemoteAction('from-host-client'), + remoteActionEcho('from-host-client'), + nestedRemoteAction('from-host-client-direct'), + remoteActionBundle.bundledDefaultRemoteAction( + 'from-host-client-bundled', + ), + remoteActionBundle.bundledRemoteActionEcho('from-host-client-bundled'), + remoteActionBundle.bundledNestedRemoteAction( + 'from-host-client-bundled', + ), + ]); + const directIncrementValue = await incrementRemoteCount( + 0, + directIncrementFormData, + ); + const bundledIncrementValue = + await remoteActionBundle.bundledIncrementRemoteCount( + 0, + bundledIncrementFormData, + ); + setDefaultResult(defaultValue); + setEchoResult(echoValue); + setNestedResult(nestedValue); + setIncrementResult(String(directIncrementValue)); + setBundledDefaultResult(bundledDefaultValue); + setBundledEchoResult(bundledEchoValue); + setBundledNestedResult(bundledNestedValue); + setBundledIncrementResult(String(bundledIncrementValue)); + } finally { + setIsPending(false); + } + }; + + return ( +
+ + + +

{defaultResult}

+

{echoResult}

+

{nestedResult}

+

{incrementResult}

+

+ {bundledDefaultResult} +

+

+ {bundledEchoResult} +

+

+ {bundledNestedResult} +

+

+ {bundledIncrementResult} +

+
+ ); +} diff --git a/tests/integration/rsc-mf/host/tsconfig.json b/tests/integration/rsc-mf/host/tsconfig.json new file mode 100644 index 000000000000..be7c601218c7 --- /dev/null +++ b/tests/integration/rsc-mf/host/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@modern-js/tsconfig/base", + "compilerOptions": { + "declaration": false, + "jsx": "react-jsx", + "baseUrl": "./", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": [ + "src", + "config", + "server", + "modern.config.ts", + "module-federation.config.ts" + ] +} diff --git a/tests/integration/rsc-mf/package.json b/tests/integration/rsc-mf/package.json new file mode 100644 index 000000000000..7433e359d88a --- /dev/null +++ b/tests/integration/rsc-mf/package.json @@ -0,0 +1,5 @@ +{ + "private": true, + "name": "rsc-mf-test", + "version": "2.66.0" +} diff --git a/tests/integration/rsc-mf/remote/.browserslistrc b/tests/integration/rsc-mf/remote/.browserslistrc new file mode 100644 index 000000000000..15b7c26176b2 --- /dev/null +++ b/tests/integration/rsc-mf/remote/.browserslistrc @@ -0,0 +1,4 @@ +chrome >= 87 +edge >= 88 +firefox >= 78 +safari >= 14 diff --git a/tests/integration/rsc-mf/remote/modern.config.ts b/tests/integration/rsc-mf/remote/modern.config.ts new file mode 100644 index 000000000000..8a46fc591c20 --- /dev/null +++ b/tests/integration/rsc-mf/remote/modern.config.ts @@ -0,0 +1,25 @@ +import { appTools, defineConfig } from '@modern-js/app-tools'; +import { moduleFederationPlugin } from '@module-federation/modern-js-v3'; + +const remotePort = process.env.RSC_MF_REMOTE_PORT || process.env.PORT || '3008'; + +export default defineConfig({ + server: { + rsc: true, + ssr: true, + port: Number(remotePort), + }, + // Keep RSC server entries synchronous for MF+RSC handlers. + source: { + enableAsyncEntry: false, + }, + output: { + polyfill: 'off', + disableTsChecker: true, + assetPrefix: `http://127.0.0.1:${remotePort}`, + }, + performance: { + buildCache: false, + }, + plugins: [appTools(), moduleFederationPlugin({ ssr: true })], +}); diff --git a/tests/integration/rsc-mf/remote/module-federation.config.ts b/tests/integration/rsc-mf/remote/module-federation.config.ts new file mode 100644 index 000000000000..cd2206d77572 --- /dev/null +++ b/tests/integration/rsc-mf/remote/module-federation.config.ts @@ -0,0 +1,148 @@ +import fs from 'fs'; +import path from 'path'; +import { createModuleFederationConfig } from '@module-federation/modern-js-v3'; + +const LAYERS = { + ssr: 'server-side-rendering', + rsc: 'react-server-components', +} as const; +const reactServerImport = path.join( + path.dirname(require.resolve('react/package.json')), + 'react.react-server.js', +); +const reactDomServerImport = path.join( + path.dirname(require.resolve('react-dom/package.json')), + 'react-dom.react-server.js', +); +const reactServerDomClientImport = 'react-server-dom-rspack/client.browser'; +const readPackageVersion = (pkg: string) => + JSON.parse(fs.readFileSync(require.resolve(`${pkg}/package.json`), 'utf8')) + .version; +const reactVersion = readPackageVersion('react'); +const reactDomVersion = readPackageVersion('react-dom'); +const reactServerDomVersion = readPackageVersion('react-server-dom-rspack'); +const remoteExposeImports: Record = { + './RemoteClientCounter': './src/components/RemoteClientCounter.tsx', + './RemoteClientBadge': './src/components/RemoteClientBadge.tsx', + './RemoteServerCard': './src/components/RemoteServerCard.tsx', + './RemoteServerDefault': './src/components/RemoteServerDefault.tsx', + './AsyncRemoteServerInfo': './src/components/AsyncRemoteServerInfo.tsx', + './remoteServerOnly': './src/components/serverOnly.ts', + './remoteServerOnlyDefault': './src/components/serverOnlyDefault.ts', + './remoteMeta': './src/components/remoteMeta.ts', + './actions': './src/components/actions.ts', + './nestedActions': './src/components/nestedActions.ts', + './defaultAction': './src/components/defaultAction.ts', + './actionBundle': './src/components/actionBundle.ts', + './infoBundle': './src/components/infoBundle.ts', +}; + +const sharedByScope = [ + { + react: { + singleton: true, + requiredVersion: false, + shareScope: 'default', + version: reactVersion, + }, + 'react-dom': { + singleton: true, + requiredVersion: false, + shareScope: 'default', + version: reactDomVersion, + }, + 'react-server-dom-rspack': { + singleton: true, + requiredVersion: false, + shareScope: 'default', + version: reactServerDomVersion, + }, + 'react-server-dom-rspack/client.browser': { + import: reactServerDomClientImport, + shareKey: reactServerDomClientImport, + singleton: true, + requiredVersion: false, + shareScope: 'default', + version: reactServerDomVersion, + }, + }, + { + react: { + import: 'react', + shareKey: 'react', + singleton: true, + requiredVersion: false, + shareScope: 'ssr', + layer: LAYERS.ssr, + issuerLayer: LAYERS.ssr, + version: reactVersion, + }, + 'react-dom': { + import: 'react-dom', + shareKey: 'react-dom', + singleton: true, + requiredVersion: false, + shareScope: 'ssr', + layer: LAYERS.ssr, + issuerLayer: LAYERS.ssr, + version: reactDomVersion, + }, + 'react-server-dom-rspack/client.browser': { + import: reactServerDomClientImport, + shareKey: reactServerDomClientImport, + singleton: true, + requiredVersion: false, + shareScope: 'ssr', + layer: LAYERS.ssr, + issuerLayer: LAYERS.ssr, + version: reactServerDomVersion, + }, + }, + { + react: { + import: reactServerImport, + shareKey: 'react', + singleton: true, + requiredVersion: false, + shareScope: 'rsc', + layer: LAYERS.rsc, + issuerLayer: LAYERS.rsc, + version: reactVersion, + }, + 'react-dom': { + import: reactDomServerImport, + shareKey: 'react-dom', + singleton: true, + requiredVersion: false, + shareScope: 'rsc', + layer: LAYERS.rsc, + issuerLayer: LAYERS.rsc, + version: reactDomVersion, + }, + 'react-server-dom-rspack/client.browser': { + import: reactServerDomClientImport, + shareKey: reactServerDomClientImport, + singleton: true, + requiredVersion: false, + shareScope: 'rsc', + layer: LAYERS.rsc, + issuerLayer: LAYERS.rsc, + version: reactServerDomVersion, + }, + }, +]; + +export default createModuleFederationConfig({ + name: 'rscRemote', + manifest: { + filePath: 'static', + }, + filename: 'static/remoteEntry.js', + exposes: remoteExposeImports as any, + shared: sharedByScope as any, + dts: false, + experiments: { + asyncStartup: true, + rsc: true, + } as any, +}); diff --git a/tests/integration/rsc-mf/remote/package.json b/tests/integration/rsc-mf/remote/package.json new file mode 100644 index 000000000000..aad0d2d93f92 --- /dev/null +++ b/tests/integration/rsc-mf/remote/package.json @@ -0,0 +1,33 @@ +{ + "private": true, + "name": "rsc-mf-remote", + "version": "2.66.0", + "scripts": { + "dev": "cross-env modern dev", + "build": "cross-env modern build", + "serve": "modern serve" + }, + "dependencies": { + "@modern-js/render": "workspace:*", + "@modern-js/runtime": "workspace:*", + "@module-federation/modern-js-v3": "https://pkg.pr.new/module-federation/core/@module-federation/modern-js-v3@b7d17c6", + "@module-federation/runtime": "2.0.0", + "@module-federation/runtime-core": "2.0.0", + "client-only": "^0.0.1", + "react": "^19.2.4", + "react-dom": "^19.2.4", + "react-server-dom-rspack": "0.0.1-beta.0", + "server-only": "^0.0.1" + }, + "devDependencies": { + "@modern-js/app-tools": "workspace:*", + "@modern-js/builder": "workspace:*", + "@modern-js/server-runtime": "workspace:*", + "@types/jest": "^29.5.14", + "@types/node": "^20", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "cross-env": "^7.0.3", + "typescript": "^5" + } +} diff --git a/tests/integration/rsc-mf/remote/src/App.tsx b/tests/integration/rsc-mf/remote/src/App.tsx new file mode 100644 index 000000000000..3a4dba7ffcc0 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/App.tsx @@ -0,0 +1,12 @@ +import { RemoteNestedMixed } from './components/RemoteNestedMixed'; + +const App = () => { + return ( +
+

Remote RSC Module Federation

+ +
+ ); +}; + +export default App; diff --git a/tests/integration/rsc-mf/remote/src/components/AsyncRemoteServerInfo.tsx b/tests/integration/rsc-mf/remote/src/components/AsyncRemoteServerInfo.tsx new file mode 100644 index 000000000000..ce90b480f85b --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/AsyncRemoteServerInfo.tsx @@ -0,0 +1,5 @@ +export async function AsyncRemoteServerInfo() { + const value = await Promise.resolve('remote-async-server-info-ok'); + + return

{value}

; +} diff --git a/tests/integration/rsc-mf/remote/src/components/RemoteClientBadge.tsx b/tests/integration/rsc-mf/remote/src/components/RemoteClientBadge.tsx new file mode 100644 index 000000000000..f46bcb0d5f33 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/RemoteClientBadge.tsx @@ -0,0 +1,24 @@ +'use client'; + +import 'client-only'; +import { useState } from 'react'; + +export default function RemoteClientBadge({ + initialLabel, +}: { + initialLabel: string; +}) { + const [label, setLabel] = useState(initialLabel); + + return ( +
+

{label}

+ +
+ ); +} diff --git a/tests/integration/rsc-mf/remote/src/components/RemoteClientCounter.css b/tests/integration/rsc-mf/remote/src/components/RemoteClientCounter.css new file mode 100644 index 000000000000..61c79ccc5835 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/RemoteClientCounter.css @@ -0,0 +1,5 @@ +.remote-client-counter { + border: 2px dashed #2563eb; + margin-top: 12px; + padding: 8px; +} diff --git a/tests/integration/rsc-mf/remote/src/components/RemoteClientCounter.tsx b/tests/integration/rsc-mf/remote/src/components/RemoteClientCounter.tsx new file mode 100644 index 000000000000..67483b2203b5 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/RemoteClientCounter.tsx @@ -0,0 +1,62 @@ +'use client'; +import { useActionState, useState } from 'react'; +import './RemoteClientCounter.css'; +import { incrementRemoteCount, remoteActionEcho } from './actions'; +import { defaultRemoteAction } from './defaultAction'; +import { nestedRemoteAction } from './nestedActions'; + +export function RemoteClientCounter() { + const [localCount, setLocalCount] = useState(0); + const [serverCount, formAction, isPending] = useActionState( + incrementRemoteCount, + 0, + ); + const [nestedResult, setNestedResult] = useState(''); + const [remoteActionResult, setRemoteActionResult] = useState(''); + const [defaultActionResult, setDefaultActionResult] = useState(''); + + const handleRunActions = async () => { + const [nestedResultValue, remoteActionValue, defaultActionValue] = + await Promise.all([ + nestedRemoteAction('from-client'), + remoteActionEcho('from-client'), + defaultRemoteAction('from-client'), + ]); + setNestedResult(nestedResultValue); + setRemoteActionResult(remoteActionValue); + setDefaultActionResult(defaultActionValue); + }; + + return ( +
+

Remote Client Counter

+

{localCount}

+ +

{serverCount}

+
+ + +
+ +

{nestedResult}

+

{remoteActionResult}

+

+ {defaultActionResult} +

+
+ ); +} diff --git a/tests/integration/rsc-mf/remote/src/components/RemoteNestedMixed.tsx b/tests/integration/rsc-mf/remote/src/components/RemoteNestedMixed.tsx new file mode 100644 index 000000000000..338657f74ed9 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/RemoteNestedMixed.tsx @@ -0,0 +1,9 @@ +import { RemoteServerCard } from './RemoteServerCard'; + +export function RemoteNestedMixed({ label }: { label: string }) { + return ( +
+ +
+ ); +} diff --git a/tests/integration/rsc-mf/remote/src/components/RemoteServerCard.tsx b/tests/integration/rsc-mf/remote/src/components/RemoteServerCard.tsx new file mode 100644 index 000000000000..4b14d6fd4a5f --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/RemoteServerCard.tsx @@ -0,0 +1,12 @@ +import { RemoteClientCounter } from './RemoteClientCounter'; +import { getServerOnlyInfo } from './serverOnly'; + +export function RemoteServerCard({ label }: { label: string }) { + return ( +
+

{label}

+

{getServerOnlyInfo()}

+ +
+ ); +} diff --git a/tests/integration/rsc-mf/remote/src/components/RemoteServerDefault.tsx b/tests/integration/rsc-mf/remote/src/components/RemoteServerDefault.tsx new file mode 100644 index 000000000000..6644e0014755 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/RemoteServerDefault.tsx @@ -0,0 +1,10 @@ +import { getServerOnlyInfo } from './serverOnly'; + +export default function RemoteServerDefault({ label }: { label: string }) { + return ( +
+

{label}

+

{getServerOnlyInfo()}

+
+ ); +} diff --git a/tests/integration/rsc-mf/remote/src/components/actionBundle.ts b/tests/integration/rsc-mf/remote/src/components/actionBundle.ts new file mode 100644 index 000000000000..596e1df4087d --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/actionBundle.ts @@ -0,0 +1,6 @@ +export { + incrementRemoteCount as bundledIncrementRemoteCount, + remoteActionEcho as bundledRemoteActionEcho, +} from './actions'; +export { defaultRemoteAction as bundledDefaultRemoteAction } from './defaultAction'; +export { nestedRemoteAction as bundledNestedRemoteAction } from './nestedActions'; diff --git a/tests/integration/rsc-mf/remote/src/components/actions.ts b/tests/integration/rsc-mf/remote/src/components/actions.ts new file mode 100644 index 000000000000..e4c094c0a899 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/actions.ts @@ -0,0 +1,16 @@ +'use server'; + +let remoteCountState = 0; + +export async function incrementRemoteCount( + _previousState: number, + formData: FormData, +) { + const count = Number(formData.get('count') || 1); + remoteCountState += count; + return remoteCountState; +} + +export async function remoteActionEcho(value: string) { + return `remote-action:${value}`; +} diff --git a/tests/integration/rsc-mf/remote/src/components/commentedActionReference.ts b/tests/integration/rsc-mf/remote/src/components/commentedActionReference.ts new file mode 100644 index 000000000000..9979562ebef4 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/commentedActionReference.ts @@ -0,0 +1,5 @@ +// require('./actions'); +// import('./actions'); +// export * from './actions'; + +export const COMMENTED_ACTION_REFERENCE_MARKER = 'commented-action-reference'; diff --git a/tests/integration/rsc-mf/remote/src/components/commonJsActionRequire.cts b/tests/integration/rsc-mf/remote/src/components/commonJsActionRequire.cts new file mode 100644 index 000000000000..ed28ba1d3c59 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/commonJsActionRequire.cts @@ -0,0 +1,4 @@ +const remoteActions = require('./actions') as typeof import('./actions'); + +export const runCommonJsRemoteActionEcho = async () => + remoteActions.remoteActionEcho('commonjs-action-require'); diff --git a/tests/integration/rsc-mf/remote/src/components/commonJsTypeOnlyBridgeRequire.cts b/tests/integration/rsc-mf/remote/src/components/commonJsTypeOnlyBridgeRequire.cts new file mode 100644 index 000000000000..bf72a20560c3 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/commonJsTypeOnlyBridgeRequire.cts @@ -0,0 +1,5 @@ +const typeOnlyActionImportBridge = + require('./typeOnlyActionImport') as typeof import('./typeOnlyActionImport'); + +export const COMMON_JS_TYPE_ONLY_BRIDGE_REQUIRE_MARKER = + typeOnlyActionImportBridge.TYPE_ONLY_ACTION_IMPORT_MARKER; diff --git a/tests/integration/rsc-mf/remote/src/components/defaultAction.ts b/tests/integration/rsc-mf/remote/src/components/defaultAction.ts new file mode 100644 index 000000000000..840844e7d440 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/defaultAction.ts @@ -0,0 +1,5 @@ +'use server'; + +export async function defaultRemoteAction(value: string) { + return `default-action:${value}`; +} diff --git a/tests/integration/rsc-mf/remote/src/components/dynamicActionLoader.ts b/tests/integration/rsc-mf/remote/src/components/dynamicActionLoader.ts new file mode 100644 index 000000000000..b664bc789ac9 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/dynamicActionLoader.ts @@ -0,0 +1,4 @@ +export async function loadRemoteActionsDynamically() { + const actionModule = await import('./actions'); + return actionModule; +} diff --git a/tests/integration/rsc-mf/remote/src/components/exportInlineMixedActionBridge.ts b/tests/integration/rsc-mf/remote/src/components/exportInlineMixedActionBridge.ts new file mode 100644 index 000000000000..b12cfe957b9f --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/exportInlineMixedActionBridge.ts @@ -0,0 +1,4 @@ +export { type incrementRemoteCount, remoteActionEcho } from './actions'; + +export const EXPORT_INLINE_MIXED_ACTION_BRIDGE = + 'export-inline-mixed-action-bridge'; diff --git a/tests/integration/rsc-mf/remote/src/components/exportInlineTypeOnlyActionBridge.ts b/tests/integration/rsc-mf/remote/src/components/exportInlineTypeOnlyActionBridge.ts new file mode 100644 index 000000000000..14453183a8c5 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/exportInlineTypeOnlyActionBridge.ts @@ -0,0 +1,5 @@ +// biome-ignore lint/style/useExportType: keep inline type-only syntax for parser coverage +export { type incrementRemoteCount } from './actions'; + +export const EXPORT_INLINE_TYPE_ONLY_ACTION_BRIDGE = + 'export-inline-type-only-action-bridge'; diff --git a/tests/integration/rsc-mf/remote/src/components/exportNamespaceActionBridge.ts b/tests/integration/rsc-mf/remote/src/components/exportNamespaceActionBridge.ts new file mode 100644 index 000000000000..78a480b14d74 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/exportNamespaceActionBridge.ts @@ -0,0 +1,3 @@ +export * as remoteActionsNamespace from './actions'; + +export const EXPORT_NAMESPACE_ACTION_BRIDGE = 'export-namespace-action-bridge'; diff --git a/tests/integration/rsc-mf/remote/src/components/exportTypeAllActionBridge.ts b/tests/integration/rsc-mf/remote/src/components/exportTypeAllActionBridge.ts new file mode 100644 index 000000000000..646ab1d3f0f0 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/exportTypeAllActionBridge.ts @@ -0,0 +1,3 @@ +export type * from './actions'; + +export const EXPORT_TYPE_ALL_ACTION_BRIDGE = 'export-type-all-action-bridge'; diff --git a/tests/integration/rsc-mf/remote/src/components/exportTypeOnlyActionBridge.ts b/tests/integration/rsc-mf/remote/src/components/exportTypeOnlyActionBridge.ts new file mode 100644 index 000000000000..7658e440e485 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/exportTypeOnlyActionBridge.ts @@ -0,0 +1,3 @@ +export type { incrementRemoteCount, remoteActionEcho } from './actions'; + +export const EXPORT_TYPE_ONLY_ACTION_BRIDGE = 'export-type-only-action-bridge'; diff --git a/tests/integration/rsc-mf/remote/src/components/importEqualsActionRequire.cts b/tests/integration/rsc-mf/remote/src/components/importEqualsActionRequire.cts new file mode 100644 index 000000000000..9de6696c7c5e --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/importEqualsActionRequire.cts @@ -0,0 +1,4 @@ +import remoteActions = require('./actions'); + +export const runImportEqualsRemoteActionEcho = async () => + remoteActions.remoteActionEcho('import-equals-action-require'); diff --git a/tests/integration/rsc-mf/remote/src/components/importEqualsTypeOnlyActionRequire.cts b/tests/integration/rsc-mf/remote/src/components/importEqualsTypeOnlyActionRequire.cts new file mode 100644 index 000000000000..816c34fda883 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/importEqualsTypeOnlyActionRequire.cts @@ -0,0 +1,6 @@ +import type RemoteActions = require('./actions'); + +export type ImportEqualsTypeOnlyActionRequireShape = typeof RemoteActions; + +export const IMPORT_EQUALS_TYPE_ONLY_ACTION_REQUIRE = + 'import-equals-type-only-action-require'; diff --git a/tests/integration/rsc-mf/remote/src/components/importTypeQueryActionReference.ts b/tests/integration/rsc-mf/remote/src/components/importTypeQueryActionReference.ts new file mode 100644 index 000000000000..b35c8180cdc4 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/importTypeQueryActionReference.ts @@ -0,0 +1,6 @@ +export type IncrementActionFromImportTypeQuery = import( + './actions', +).incrementRemoteCount; + +export const IMPORT_TYPE_QUERY_ACTION_REFERENCE = + 'import-type-query-action-reference'; diff --git a/tests/integration/rsc-mf/remote/src/components/infoBundle.ts b/tests/integration/rsc-mf/remote/src/components/infoBundle.ts new file mode 100644 index 000000000000..a6a5a1811abe --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/infoBundle.ts @@ -0,0 +1,6 @@ +export { getServerOnlyInfo as getBundledServerOnlyInfo } from './serverOnly'; +export { default as getBundledServerOnlyDefaultInfo } from './serverOnlyDefault'; +export { + default as bundledRemoteMeta, + getRemoteMetaLabel as getBundledRemoteMetaLabel, +} from './remoteMeta'; diff --git a/tests/integration/rsc-mf/remote/src/components/mixedTypeValueActionImport.ts b/tests/integration/rsc-mf/remote/src/components/mixedTypeValueActionImport.ts new file mode 100644 index 000000000000..3ff79b65f56c --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/mixedTypeValueActionImport.ts @@ -0,0 +1,6 @@ +import { type incrementRemoteCount, remoteActionEcho } from './actions'; + +export const runMixedTypeValueActionImport = async () => + remoteActionEcho('mixed-type-value-action-import'); + +export type IncrementRemoteCountActionFromMixed = typeof incrementRemoteCount; diff --git a/tests/integration/rsc-mf/remote/src/components/namedTypeOnlyActionImport.ts b/tests/integration/rsc-mf/remote/src/components/namedTypeOnlyActionImport.ts new file mode 100644 index 000000000000..bc89f83705f2 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/namedTypeOnlyActionImport.ts @@ -0,0 +1,5 @@ +import type { incrementRemoteCount } from './actions'; + +export type IncrementRemoteCountAction = typeof incrementRemoteCount; + +export const NAMED_TYPE_ONLY_ACTION_IMPORT = 'named-type-only-action-import'; diff --git a/tests/integration/rsc-mf/remote/src/components/nestedActions.ts b/tests/integration/rsc-mf/remote/src/components/nestedActions.ts new file mode 100644 index 000000000000..6d4d86f0a1d2 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/nestedActions.ts @@ -0,0 +1,5 @@ +'use server'; + +export async function nestedRemoteAction(value: string) { + return `nested-action:${value}`; +} diff --git a/tests/integration/rsc-mf/remote/src/components/remoteMeta.ts b/tests/integration/rsc-mf/remote/src/components/remoteMeta.ts new file mode 100644 index 000000000000..703bec9d0b2e --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/remoteMeta.ts @@ -0,0 +1,12 @@ +export const remoteFeatureFlags = ['rsc', 'mf', 'actions'] as const; + +export function getRemoteMetaLabel() { + return remoteFeatureFlags.join('|'); +} + +const remoteMeta = { + kind: 'remote-meta-default', + version: 'v1', +}; + +export default remoteMeta; diff --git a/tests/integration/rsc-mf/remote/src/components/serverOnly.ts b/tests/integration/rsc-mf/remote/src/components/serverOnly.ts new file mode 100644 index 000000000000..eeba7734368d --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/serverOnly.ts @@ -0,0 +1,5 @@ +import 'server-only'; + +export function getServerOnlyInfo() { + return 'remote-server-only-ok'; +} diff --git a/tests/integration/rsc-mf/remote/src/components/serverOnlyDefault.ts b/tests/integration/rsc-mf/remote/src/components/serverOnlyDefault.ts new file mode 100644 index 000000000000..a3ec2cbae752 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/serverOnlyDefault.ts @@ -0,0 +1,5 @@ +import 'server-only'; + +export default function getServerOnlyDefaultInfo() { + return 'remote-server-only-default-ok'; +} diff --git a/tests/integration/rsc-mf/remote/src/components/sideEffectActionImport.ts b/tests/integration/rsc-mf/remote/src/components/sideEffectActionImport.ts new file mode 100644 index 000000000000..cddaff1876a1 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/sideEffectActionImport.ts @@ -0,0 +1,3 @@ +import './actions'; + +export const SIDE_EFFECT_ACTION_IMPORT_MARKER = 'side-effect-action-import'; diff --git a/tests/integration/rsc-mf/remote/src/components/sideEffectTypeOnlyBridgeImport.ts b/tests/integration/rsc-mf/remote/src/components/sideEffectTypeOnlyBridgeImport.ts new file mode 100644 index 000000000000..5c4979602bfe --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/sideEffectTypeOnlyBridgeImport.ts @@ -0,0 +1,4 @@ +import './typeOnlyActionImport'; + +export const SIDE_EFFECT_TYPE_ONLY_BRIDGE_IMPORT_MARKER = + 'side-effect-type-only-bridge-import'; diff --git a/tests/integration/rsc-mf/remote/src/components/stringLiteralActionReference.ts b/tests/integration/rsc-mf/remote/src/components/stringLiteralActionReference.ts new file mode 100644 index 000000000000..1ba5cbecd289 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/stringLiteralActionReference.ts @@ -0,0 +1,9 @@ +const actionReferenceText = "require('./actions')"; +const dynamicImportText = "import('./actions')"; +const exportFromText = "export * from './actions'"; + +export const STRING_LITERAL_ACTION_REFERENCE = [ + actionReferenceText, + dynamicImportText, + exportFromText, +].join('|'); diff --git a/tests/integration/rsc-mf/remote/src/components/typeOnlyActionImport.ts b/tests/integration/rsc-mf/remote/src/components/typeOnlyActionImport.ts new file mode 100644 index 000000000000..7221522d534f --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/components/typeOnlyActionImport.ts @@ -0,0 +1,5 @@ +import type * as RemoteActionsModule from './actions'; + +export type RemoteActionsModuleShape = typeof RemoteActionsModule; + +export const TYPE_ONLY_ACTION_IMPORT_MARKER = 'type-only-action-import'; diff --git a/tests/integration/rsc-mf/remote/src/modern-app-env.d.ts b/tests/integration/rsc-mf/remote/src/modern-app-env.d.ts new file mode 100644 index 000000000000..c965dfb88430 --- /dev/null +++ b/tests/integration/rsc-mf/remote/src/modern-app-env.d.ts @@ -0,0 +1,3 @@ +/// +/// +/// diff --git a/tests/integration/rsc-mf/remote/tsconfig.json b/tests/integration/rsc-mf/remote/tsconfig.json new file mode 100644 index 000000000000..be7c601218c7 --- /dev/null +++ b/tests/integration/rsc-mf/remote/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@modern-js/tsconfig/base", + "compilerOptions": { + "declaration": false, + "jsx": "react-jsx", + "baseUrl": "./", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": [ + "src", + "config", + "server", + "modern.config.ts", + "module-federation.config.ts" + ] +} diff --git a/tests/integration/rsc-mf/tests/containmentContracts.test.ts b/tests/integration/rsc-mf/tests/containmentContracts.test.ts new file mode 100644 index 000000000000..5f654b28b073 --- /dev/null +++ b/tests/integration/rsc-mf/tests/containmentContracts.test.ts @@ -0,0 +1,159 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const repoRoot = path.resolve(__dirname, '../../../..'); +const fixtureResolvePaths = [ + path.resolve(__dirname, '../host'), + path.resolve(__dirname, '../remote'), + repoRoot, + __dirname, +]; + +const workspacePackageRoots: Record = { + '@modern-js/server-core': path.resolve(repoRoot, 'packages/server/core'), + '@modern-js/render': path.resolve(repoRoot, 'packages/runtime/render'), +}; + +const findPackageRootFromResolvedEntry = ( + resolvedEntryPath: string, + packageName: string, +): string | undefined => { + let currentDir = path.dirname(resolvedEntryPath); + while (currentDir !== path.dirname(currentDir)) { + const packageJsonPath = path.resolve(currentDir, 'package.json'); + if (fs.existsSync(packageJsonPath)) { + try { + const { name } = JSON.parse( + fs.readFileSync(packageJsonPath, 'utf-8'), + ) as { name?: string }; + if (name === packageName) { + return currentDir; + } + } catch { + // Ignore invalid JSON and continue walking upwards. + } + } + currentDir = path.dirname(currentDir); + } + return undefined; +}; + +const resolvePackageRoot = (packageName: string): string => { + const workspaceRoot = workspacePackageRoots[packageName]; + if (workspaceRoot && fs.existsSync(workspaceRoot)) { + return workspaceRoot; + } + + for (const basePath of fixtureResolvePaths) { + try { + return path.dirname( + require.resolve(`${packageName}/package.json`, { paths: [basePath] }), + ); + } catch { + // package.json may not be exported; try entrypoint resolution next. + } + } + + for (const basePath of fixtureResolvePaths) { + try { + const resolvedEntryPath = require.resolve(packageName, { + paths: [basePath], + }); + const packageRoot = findPackageRootFromResolvedEntry( + resolvedEntryPath, + packageName, + ); + if (packageRoot) { + return packageRoot; + } + } catch { + // Continue trying all resolution bases. + } + } + + throw new Error( + `Cannot resolve package root for ${packageName} from: ${fixtureResolvePaths.join(', ')}`, + ); +}; + +const resolvePackageFilePath = ( + packageName: string, + relativePaths: string[], +): string => { + const packageRoot = resolvePackageRoot(packageName); + const resolvedPath = relativePaths + .map(relativePath => path.resolve(packageRoot, relativePath)) + .find(candidatePath => fs.existsSync(candidatePath)); + + if (!resolvedPath) { + throw new Error( + `Cannot resolve any expected file for ${packageName}: ${relativePaths.join(', ')}`, + ); + } + + return resolvedPath; +}; + +describe('rsc-mf containment contracts', () => { + it('keeps MF async-startup patching out of core resource loader', () => { + const coreResourcePath = resolvePackageFilePath('@modern-js/server-core', [ + 'src/adapters/node/plugins/resource.ts', + 'dist/cjs/adapters/node/plugins/resource.js', + 'dist/esm-node/adapters/node/plugins/resource.mjs', + 'dist/esm/adapters/node/plugins/resource.mjs', + ]); + const source = fs.readFileSync(coreResourcePath, 'utf-8'); + + expect(source).not.toContain('__webpack_require__.mfAsyncStartup'); + expect(source).not.toContain('loadPatchedAsyncNodeBundle'); + expect(source).toContain('registerBundleLoaderStrategy'); + }); + + it('registers MF async-startup strategy in modernjs-v3 server plugin', () => { + const serverPluginPath = resolvePackageFilePath( + '@module-federation/modern-js-v3', + [ + 'src/server/index.ts', + 'dist/cjs/server/index.js', + 'dist/esm/server/index.mjs', + ], + ); + const source = fs.readFileSync(serverPluginPath, 'utf-8'); + + const hasServerCoreImportOrRequire = source.includes( + '@modern-js/server-core/node', + ); + + expect(hasServerCoreImportOrRequire).toBe(true); + expect(source).toContain('registerBundleLoaderStrategy'); + expect(source).toContain('mfAsyncStartupLoaderStrategy'); + }); + + it('keeps MF async-startup logic inside modernjs-v3 loader strategy', () => { + const strategyPath = resolvePackageFilePath( + '@module-federation/modern-js-v3', + [ + 'src/server/asyncStartupLoader.ts', + 'dist/cjs/server/asyncStartupLoader.js', + 'dist/esm/server/asyncStartupLoader.mjs', + ], + ); + const source = fs.readFileSync(strategyPath, 'utf-8'); + + expect(source).toContain('__webpack_require__.mfAsyncStartup'); + expect(source).toContain('__webpack_require__.x({}, [])'); + }); + + it('keeps RSC action 500 details dev-only in core runtime', () => { + const rscServerPath = resolvePackageFilePath('@modern-js/render', [ + 'src/server/rsc/rsc.tsx', + 'dist/cjs/server/rsc/rsc.js', + 'dist/esm/server/rsc/rsc.js', + ]); + const source = fs.readFileSync(rscServerPath, 'utf-8'); + + expect(source).toContain("process.env.NODE_ENV === 'development'"); + expect(source).toContain('? `Internal server error\\n${errorMessage}'); + expect(source).toContain(": 'Internal server error';"); + }); +}); diff --git a/tests/integration/rsc-mf/tests/index.test.ts b/tests/integration/rsc-mf/tests/index.test.ts new file mode 100644 index 000000000000..c3e2fb9d73f5 --- /dev/null +++ b/tests/integration/rsc-mf/tests/index.test.ts @@ -0,0 +1,614 @@ +import path from 'path'; +import { isVersionAtLeast18 } from '@modern-js/utils'; +import type { Browser, Page } from 'puppeteer'; +import puppeteer from 'puppeteer'; +import { + getPort, + killApp, + launchApp, + launchOptions, + modernBuild, + modernServe, + sleep, +} from '../../../utils/modernTestUtils'; + +const fixtureDir = path.resolve(__dirname, '../'); +const hostDir = path.resolve(fixtureDir, 'host'); +const remoteDir = path.resolve(fixtureDir, 'remote'); +const HOST_RSC_URL = '/server-component-root'; +const EXPECTED_ACTION_POSTS_PER_MODE = 24; +const EXPECTED_ACTION_POSTS_PER_FAMILY = 6; +const EXPECTED_UNIQUE_ACTION_IDS_PER_MODE = 4; +const EXPECTED_BROWSER_EXPOSE_CHUNKS = [ + '__federation_expose_RemoteClientCounter', + '__federation_expose_RemoteClientBadge', + '__federation_expose_actions', + '__federation_expose_nestedActions', + '__federation_expose_defaultAction', + '__federation_expose_actionBundle', +]; +const EXPECTED_REMOTE_EXPOSE_PATHS = [ + './RemoteClientCounter', + './RemoteClientBadge', + './RemoteServerCard', + './RemoteServerDefault', + './AsyncRemoteServerInfo', + './remoteServerOnly', + './remoteServerOnlyDefault', + './remoteMeta', + './actions', + './nestedActions', + './defaultAction', + './actionBundle', + './infoBundle', + './__rspack_rsc_bridge__', +].sort(); + +type Mode = 'dev' | 'build'; + +interface TestConfig { + mode: Mode; +} + +interface TestContext { + hostPort: number; + page: Page; + actionRequestIds?: string[]; +} +interface FailedRequestRecord { + url: string; + method: string; + status: number; +} +interface FailedBrowserRequestRecord { + url: string; + method: string; + failureText: string; +} + +async function waitForActionRequestCount({ + actionRequestIds, + minimumCount, + timeoutMs = 15000, +}: { + actionRequestIds: string[]; + minimumCount: number; + timeoutMs?: number; +}) { + const startTime = Date.now(); + while (Date.now() - startTime < timeoutMs) { + if (actionRequestIds.length >= minimumCount) { + return; + } + await sleep(50); + } + + throw new Error( + `Timed out waiting for action request count ${minimumCount}, received ${actionRequestIds.length}`, + ); +} + +function skipForLowerNodeVersion() { + if (!isVersionAtLeast18()) { + test('should skip in lower node version', () => { + expect(true).toBe(true); + }); + return true; + } + return false; +} + +function createRemoteEnv(remotePort: number) { + return { + RSC_MF_REMOTE_PORT: String(remotePort), + MODERN_MF_AUTO_CORS: 'true', + }; +} + +function createHostEnv(remotePort: number) { + return { + RSC_MF_REMOTE_PORT: String(remotePort), + }; +} + +async function renderRemoteRscIntoHost({ hostPort, page }: TestContext) { + const response = await fetch(`http://127.0.0.1:${hostPort}${HOST_RSC_URL}`); + const html = await response.text(); + expect(html).toContain('Host RSC Module Federation'); + expect(html).toContain('__FLIGHT_DATA'); + expect(html).not.toContain('window._SSR_DATA'); + expect(html).toContain('Remote Federated Tree'); + expect(html).toContain('remote-server-only-ok'); + expect(html).toContain('remote-server-only-default-ok'); + expect(html).toContain('remote-meta-default'); + expect(html).toContain('rsc|mf|actions'); + expect(html).toContain('remote-async-server-info-ok'); + expect(html).toContain('Remote Default Server Card'); + expect(html).toContain('host-remote-bundled-server-only'); + expect(html).toContain('host-remote-bundled-meta-kind'); + + await page.goto(`http://127.0.0.1:${hostPort}${HOST_RSC_URL}`, { + waitUntil: 'domcontentloaded', + }); + await page.waitForSelector('.host-remote-server-only'); + await page.waitForSelector('.host-remote-action-runner'); + const hostRemoteServerOnly = await page.$eval( + '.host-remote-server-only', + el => el.textContent?.trim(), + ); + expect(hostRemoteServerOnly).toBe('remote-server-only-ok'); + const hostRemoteServerOnlyDefault = await page.$eval( + '.host-remote-server-only-default', + el => el.textContent?.trim(), + ); + expect(hostRemoteServerOnlyDefault).toBe('remote-server-only-default-ok'); + const hostRemoteMetaKind = await page.$eval('.host-remote-meta-kind', el => + el.textContent?.trim(), + ); + expect(hostRemoteMetaKind).toBe('remote-meta-default'); + const hostRemoteMetaLabel = await page.$eval('.host-remote-meta-label', el => + el.textContent?.trim(), + ); + expect(hostRemoteMetaLabel).toBe('rsc|mf|actions'); + const hostRemoteBundledServerOnly = await page.$eval( + '.host-remote-bundled-server-only', + el => el.textContent?.trim(), + ); + expect(hostRemoteBundledServerOnly).toBe('remote-server-only-ok'); + const hostRemoteBundledServerOnlyDefault = await page.$eval( + '.host-remote-bundled-server-only-default', + el => el.textContent?.trim(), + ); + expect(hostRemoteBundledServerOnlyDefault).toBe( + 'remote-server-only-default-ok', + ); + const hostRemoteBundledMetaKind = await page.$eval( + '.host-remote-bundled-meta-kind', + el => el.textContent?.trim(), + ); + expect(hostRemoteBundledMetaKind).toBe('remote-meta-default'); + const hostRemoteBundledMetaLabel = await page.$eval( + '.host-remote-bundled-meta-label', + el => el.textContent?.trim(), + ); + expect(hostRemoteBundledMetaLabel).toBe('rsc|mf|actions'); + const hostRemoteAsyncServerInfo = await page.$eval( + '.remote-async-server-info', + el => el.textContent?.trim(), + ); + expect(hostRemoteAsyncServerInfo).toBe('remote-async-server-info-ok'); +} + +async function supportRemoteClientAndServerActions({ + hostPort, + page, + actionRequestIds, +}: TestContext) { + await page.goto(`http://127.0.0.1:${hostPort}${HOST_RSC_URL}`, { + waitUntil: 'domcontentloaded', + }); + await page.waitForSelector( + '.host-remote-action-runner .remote-client-local-increment', + ); + + let localCount = await page.$eval( + '.host-remote-action-runner .remote-client-local-count', + el => el.textContent?.trim(), + ); + let serverCount = await page.$eval( + '.host-remote-action-runner .remote-client-server-count', + el => el.textContent?.trim(), + ); + expect(localCount).toBe('0'); + expect(serverCount).toBe('0'); + + await page.click('.host-remote-action-runner .remote-client-local-increment'); + localCount = await page.$eval( + '.host-remote-action-runner .remote-client-local-count', + el => el.textContent?.trim(), + ); + expect(localCount).toBe('1'); + + await page.click( + '.host-remote-action-runner .remote-client-server-increment', + ); + await page.waitForFunction( + () => + !document + .querySelector( + '.host-remote-action-runner .remote-client-server-increment', + ) + ?.hasAttribute('disabled'), + ); + serverCount = await page.$eval( + '.host-remote-action-runner .remote-client-server-count', + el => el.textContent?.trim(), + ); + expect(serverCount).toBe('1'); + await page.click( + '.host-remote-action-runner .remote-client-server-increment', + ); + await page.waitForFunction( + () => + !document + .querySelector( + '.host-remote-action-runner .remote-client-server-increment', + ) + ?.hasAttribute('disabled'), + ); + serverCount = await page.$eval( + '.host-remote-action-runner .remote-client-server-count', + el => el.textContent?.trim(), + ); + expect(serverCount).toBe('2'); + + const actionRequestCountBeforeFirstClientRun = actionRequestIds?.length || 0; + await page.click('.host-remote-action-runner .remote-client-run-actions'); + const actionRequestCountAfterFirstClientRun = + actionRequestCountBeforeFirstClientRun + 3; + await page.waitForFunction(() => { + const nested = document.querySelector( + '.host-remote-action-runner .remote-client-nested-result', + ); + const remoteAction = document.querySelector( + '.host-remote-action-runner .remote-client-remote-action-result', + ); + const defaultAction = document.querySelector( + '.host-remote-action-runner .remote-client-default-action-result', + ); + return ( + nested?.textContent?.trim() === 'nested-action:from-client' && + remoteAction?.textContent?.trim() === 'remote-action:from-client' && + defaultAction?.textContent?.trim() === 'default-action:from-client' + ); + }); + if (actionRequestIds) { + await waitForActionRequestCount({ + actionRequestIds, + minimumCount: actionRequestCountAfterFirstClientRun, + }); + } + + const actionRequestCountBeforeSecondClientRun = actionRequestIds?.length || 0; + await page.click('.host-remote-action-runner .remote-client-run-actions'); + const actionRequestCountAfterSecondClientRun = + actionRequestCountBeforeSecondClientRun + 3; + await page.waitForFunction(() => { + const nested = document.querySelector( + '.host-remote-action-runner .remote-client-nested-result', + ); + const remoteAction = document.querySelector( + '.host-remote-action-runner .remote-client-remote-action-result', + ); + const defaultAction = document.querySelector( + '.host-remote-action-runner .remote-client-default-action-result', + ); + return ( + nested?.textContent?.trim() === 'nested-action:from-client' && + remoteAction?.textContent?.trim() === 'remote-action:from-client' && + defaultAction?.textContent?.trim() === 'default-action:from-client' + ); + }); + if (actionRequestIds) { + await waitForActionRequestCount({ + actionRequestIds, + minimumCount: actionRequestCountAfterSecondClientRun, + }); + } + + let badgeValue = await page.$eval( + '.host-remote-action-runner .remote-client-badge-value', + el => el.textContent?.trim(), + ); + expect(badgeValue).toBe('remote-client-badge-initial'); + await page.click('.host-remote-action-runner .remote-client-badge-toggle'); + badgeValue = await page.$eval( + '.host-remote-action-runner .remote-client-badge-value', + el => el.textContent?.trim(), + ); + expect(badgeValue).toBe('remote-client-badge-toggled'); + + await page.click('.host-remote-run-actions'); + await page.waitForFunction(() => { + const defaultActionResult = document.querySelector( + '.host-remote-default-action-result', + ); + const echoActionResult = document.querySelector( + '.host-remote-echo-action-result', + ); + const nestedActionResult = document.querySelector( + '.host-remote-nested-action-result', + ); + const incrementActionResult = document.querySelector( + '.host-remote-increment-action-result', + ); + const bundledDefaultActionResult = document.querySelector( + '.host-remote-bundled-default-action-result', + ); + const bundledEchoActionResult = document.querySelector( + '.host-remote-bundled-echo-action-result', + ); + const bundledNestedActionResult = document.querySelector( + '.host-remote-bundled-nested-action-result', + ); + const bundledIncrementActionResult = document.querySelector( + '.host-remote-bundled-increment-action-result', + ); + return ( + defaultActionResult?.textContent?.trim() === + 'default-action:from-host-client' && + echoActionResult?.textContent?.trim() === + 'remote-action:from-host-client' && + nestedActionResult?.textContent?.trim() === + 'nested-action:from-host-client-direct' && + incrementActionResult?.textContent?.trim() === '3' && + bundledDefaultActionResult?.textContent?.trim() === + 'default-action:from-host-client-bundled' && + bundledEchoActionResult?.textContent?.trim() === + 'remote-action:from-host-client-bundled' && + bundledNestedActionResult?.textContent?.trim() === + 'nested-action:from-host-client-bundled' && + bundledIncrementActionResult?.textContent?.trim() === '4' + ); + }); + + await page.click('.host-remote-run-actions'); + await page.waitForFunction(() => { + const incrementActionResult = document.querySelector( + '.host-remote-increment-action-result', + ); + const bundledIncrementActionResult = document.querySelector( + '.host-remote-bundled-increment-action-result', + ); + return ( + incrementActionResult?.textContent?.trim() === '5' && + bundledIncrementActionResult?.textContent?.trim() === '6' + ); + }); +} + +function runTests({ mode }: TestConfig) { + describe(mode, () => { + let remoteApp: any; + let hostApp: any; + let remotePort: number; + let hostPort: number; + let page: Page; + let browser: Browser; + const runtimeErrors: string[] = []; + const actionRequestUrls: string[] = []; + const actionRequestIds: string[] = []; + const actionRequestAcceptHeaders: string[] = []; + const browserExposeChunkRequests: string[] = []; + const failedNetworkRequests: FailedRequestRecord[] = []; + const failedBrowserRequests: FailedBrowserRequestRecord[] = []; + + if (skipForLowerNodeVersion()) { + return; + } + + beforeAll(async () => { + jest.setTimeout(1000 * 60 * 8); + remotePort = await getPort(); + hostPort = await getPort(); + + const remoteEnv = createRemoteEnv(remotePort); + const hostEnv = createHostEnv(remotePort); + + if (mode === 'dev') { + remoteApp = await launchApp(remoteDir, remotePort, {}, remoteEnv); + await sleep(2000); + + hostApp = await launchApp(hostDir, hostPort, {}, hostEnv); + await sleep(2000); + } else { + await modernBuild(remoteDir, [], { env: remoteEnv }); + await modernBuild(hostDir, [], { env: hostEnv }); + + remoteApp = await modernServe(remoteDir, remotePort, { + env: { + PORT: String(remotePort), + NODE_ENV: 'production', + ...remoteEnv, + }, + }); + await sleep(2000); + + hostApp = await modernServe(hostDir, hostPort, { + env: { + PORT: String(hostPort), + NODE_ENV: 'production', + ...hostEnv, + }, + }); + await sleep(2000); + } + + browser = await puppeteer.launch(launchOptions as any); + page = await browser.newPage(); + + page.on('pageerror', error => { + const err = error as Error; + const message = err.message; + runtimeErrors.push(message); + }); + + page.on('request', request => { + const headers = request.headers(); + const url = request.url(); + const exposeChunkMatch = url.match(/__federation_expose_[^./?#]+/); + if (exposeChunkMatch) { + browserExposeChunkRequests.push(exposeChunkMatch[0]); + } + if (request.method() !== 'POST' || !headers['x-rsc-action']) { + return; + } + actionRequestUrls.push(url); + actionRequestIds.push(headers['x-rsc-action']); + actionRequestAcceptHeaders.push(headers.accept || ''); + }); + + page.on('response', response => { + const status = response.status(); + if (status < 400) { + return; + } + const url = response.url(); + const request = response.request(); + const hostOrigin = `http://127.0.0.1:${hostPort}`; + const remoteOrigin = `http://127.0.0.1:${remotePort}`; + if (!url.startsWith(hostOrigin) && !url.startsWith(remoteOrigin)) { + return; + } + failedNetworkRequests.push({ + url, + method: request.method(), + status, + }); + if (url.startsWith(hostOrigin) && url.includes(HOST_RSC_URL)) { + response + .text() + .then(body => + console.log('FAILED_HOST_ACTION_RESPONSE', status, body), + ); + } + }); + + page.on('requestfailed', request => { + const url = request.url(); + const hostOrigin = `http://127.0.0.1:${hostPort}`; + const remoteOrigin = `http://127.0.0.1:${remotePort}`; + if (!url.startsWith(hostOrigin) && !url.startsWith(remoteOrigin)) { + return; + } + failedBrowserRequests.push({ + url, + method: request.method(), + failureText: request.failure()?.errorText || 'unknown', + }); + }); + }); + + afterAll(async () => { + if (browser) { + await browser.close(); + } + if (hostApp) { + await killApp(hostApp); + } + if (remoteApp) { + await killApp(remoteApp); + } + }); + + it('should render remote RSC content in host app', () => + renderRemoteRscIntoHost({ hostPort, page })); + + it('should keep expose paths userland-first with an internal bridge expose', async () => { + const manifestResponse = await fetch( + `http://127.0.0.1:${remotePort}/static/mf-manifest.json`, + ); + expect(manifestResponse.ok).toBe(true); + const manifest = (await manifestResponse.json()) as { + exposes?: Array<{ path?: string }>; + }; + const exposedPaths = (manifest.exposes || []) + .map(item => item.path) + .filter((path): path is string => Boolean(path)); + const uniqueExposedPaths = Array.from(new Set(exposedPaths)).sort(); + expect(uniqueExposedPaths.length).toBeGreaterThan(0); + expect(uniqueExposedPaths).toContain('./RemoteClientCounter'); + expect(uniqueExposedPaths).toContain('./__rspack_rsc_bridge__'); + expect( + exposedPaths.every(path => EXPECTED_REMOTE_EXPOSE_PATHS.includes(path)), + ).toBe(true); + expect( + exposedPaths.every(path => !path.startsWith('./src/components/')), + ).toBe(true); + }); + + it('should support remote use client and server actions', () => + supportRemoteClientAndServerActions({ + hostPort, + page, + actionRequestIds, + })); + + it('should load expected federated expose chunks in browser', () => { + const uniqueExposeChunkRequests = Array.from( + new Set(browserExposeChunkRequests), + ).sort(); + expect(uniqueExposeChunkRequests).toEqual( + expect.arrayContaining(EXPECTED_BROWSER_EXPOSE_CHUNKS), + ); + }); + + it('should route remote actions through host endpoint', () => { + expect(actionRequestUrls.length).toBe(EXPECTED_ACTION_POSTS_PER_MODE); + expect(actionRequestUrls.length).toBe(actionRequestIds.length); + expect(actionRequestUrls.length).toBe(actionRequestAcceptHeaders.length); + const uniqueActionRequestUrls = Array.from(new Set(actionRequestUrls)); + expect(uniqueActionRequestUrls).toEqual([ + `http://127.0.0.1:${hostPort}${HOST_RSC_URL}`, + ]); + expect( + actionRequestUrls.every(url => + url.startsWith(`http://127.0.0.1:${hostPort}${HOST_RSC_URL}`), + ), + ).toBe(true); + expect( + actionRequestUrls.every( + url => !url.startsWith(`http://127.0.0.1:${remotePort}`), + ), + ).toBe(true); + }); + + it('should post bridge-prefixed action ids for remote actions', async () => { + expect(actionRequestIds.length).toBe(EXPECTED_ACTION_POSTS_PER_MODE); + expect(actionRequestIds.length).toBe(actionRequestUrls.length); + expect(actionRequestIds.length).toBe(actionRequestAcceptHeaders.length); + const uniqueActionRequestIds = new Set(actionRequestIds); + expect( + actionRequestIds.every(id => + /^remote:rscRemote:[a-f0-9]{64,}$/i.test(id), + ), + ).toBe(true); + expect( + actionRequestAcceptHeaders.every( + acceptHeader => acceptHeader.toLowerCase() === 'text/x-component', + ), + ).toBe(true); + expect(uniqueActionRequestIds.size).toBe( + EXPECTED_UNIQUE_ACTION_IDS_PER_MODE, + ); + const actionRequestCountById = new Map(); + for (const actionId of actionRequestIds) { + actionRequestCountById.set( + actionId, + (actionRequestCountById.get(actionId) || 0) + 1, + ); + } + expect(actionRequestCountById.size).toBe(uniqueActionRequestIds.size); + expect( + [...actionRequestCountById.values()].every( + count => count === EXPECTED_ACTION_POSTS_PER_FAMILY, + ), + ).toBe(true); + }); + + it('should have no browser runtime errors', () => { + expect(runtimeErrors).toEqual([]); + }); + + it('should have no failed host or remote network responses', () => { + expect(failedNetworkRequests).toEqual([]); + }); + + it('should have no failed host or remote browser requests', () => { + expect(failedBrowserRequests).toEqual([]); + }); + }); +} + +runTests({ mode: 'dev' }); +runTests({ mode: 'build' }); diff --git a/tests/integration/rsc-mf/tests/modernConfig.test.ts b/tests/integration/rsc-mf/tests/modernConfig.test.ts new file mode 100644 index 000000000000..1ec213b942a1 --- /dev/null +++ b/tests/integration/rsc-mf/tests/modernConfig.test.ts @@ -0,0 +1,191 @@ +const HOST_MODERN_CONFIG_MODULE = '../host/modern.config'; +const REMOTE_MODERN_CONFIG_MODULE = '../remote/modern.config'; + +const withEnv = ( + env: Partial>, + run: () => T, +): T => { + const previousPort = process.env.PORT; + const previousRemotePort = process.env.RSC_MF_REMOTE_PORT; + + if (typeof env.PORT === 'undefined') { + delete process.env.PORT; + } else { + process.env.PORT = env.PORT; + } + if (typeof env.RSC_MF_REMOTE_PORT === 'undefined') { + delete process.env.RSC_MF_REMOTE_PORT; + } else { + process.env.RSC_MF_REMOTE_PORT = env.RSC_MF_REMOTE_PORT; + } + + try { + return run(); + } finally { + if (typeof previousPort === 'undefined') { + delete process.env.PORT; + } else { + process.env.PORT = previousPort; + } + if (typeof previousRemotePort === 'undefined') { + delete process.env.RSC_MF_REMOTE_PORT; + } else { + process.env.RSC_MF_REMOTE_PORT = previousRemotePort; + } + } +}; + +const loadHostConfig = () => + withEnv({}, () => { + jest.resetModules(); + jest.doMock('@modern-js/app-tools', () => ({ + appTools: () => ({ name: 'app-tools-mock' }), + defineConfig: (config: unknown) => config, + })); + jest.doMock('@module-federation/modern-js-v3', () => ({ + moduleFederationPlugin: (options: unknown) => ({ + name: 'mf-plugin-mock', + options, + }), + })); + + let config: any; + jest.isolateModules(() => { + config = require(HOST_MODERN_CONFIG_MODULE).default; + }); + return config; + }); + +const loadRemoteConfig = ({ + port, + remotePort, +}: { + port?: string; + remotePort?: string; +}) => + withEnv( + { + PORT: port, + RSC_MF_REMOTE_PORT: remotePort, + }, + () => { + jest.resetModules(); + jest.doMock('@modern-js/app-tools', () => ({ + appTools: () => ({ name: 'app-tools-mock' }), + defineConfig: (config: unknown) => config, + })); + jest.doMock('@module-federation/modern-js-v3', () => ({ + moduleFederationPlugin: (options: unknown) => ({ + name: 'mf-plugin-mock', + options, + }), + })); + + let config: any; + jest.isolateModules(() => { + config = require(REMOTE_MODERN_CONFIG_MODULE).default; + }); + return config; + }, + ); + +const expectModuleFederationPluginEnabled = (plugins: Array) => { + const hasFederationPlugin = plugins.some(plugin => { + if (!plugin || typeof plugin !== 'object') { + return false; + } + if (plugin.name === 'mf-plugin-mock') { + return plugin.options?.ssr === true; + } + return plugin.name === '@modern-js/plugin-module-federation'; + }); + expect(hasFederationPlugin).toBe(true); +}; + +describe('rsc-mf modern config contracts', () => { + it('keeps host modern config in baseline shape without fixture bundler hooks', () => { + const hostConfig = loadHostConfig(); + + expect(hostConfig.server).toEqual( + expect.objectContaining({ + rsc: true, + port: 3007, + }), + ); + expect(hostConfig.server).not.toHaveProperty('ssr'); + expect(hostConfig.source).toEqual( + expect.objectContaining({ + enableAsyncEntry: false, + }), + ); + expect(hostConfig.source).not.toHaveProperty('preEntry'); + expect(hostConfig.tools?.bundlerChain).toBeUndefined(); + expect(hostConfig.plugins).toHaveLength(2); + expect(hostConfig.plugins).toEqual( + expect.arrayContaining([ + expect.objectContaining({ name: 'app-tools-mock' }), + ]), + ); + expectModuleFederationPluginEnabled(hostConfig.plugins); + }); + + it('keeps remote modern config in baseline shape without fixture bundler hooks', () => { + const remoteConfig = loadRemoteConfig({ remotePort: '3991' }); + + expect(remoteConfig.server).toEqual( + expect.objectContaining({ + rsc: true, + ssr: true, + port: 3991, + }), + ); + expect(remoteConfig.output).toEqual( + expect.objectContaining({ + assetPrefix: 'http://127.0.0.1:3991', + }), + ); + expect(remoteConfig.source).toEqual( + expect.objectContaining({ + enableAsyncEntry: false, + }), + ); + expect(remoteConfig.source).not.toHaveProperty('preEntry'); + expect(remoteConfig.tools?.bundlerChain).toBeUndefined(); + expect(remoteConfig.plugins).toEqual( + expect.arrayContaining([ + expect.objectContaining({ name: 'app-tools-mock' }), + ]), + ); + expectModuleFederationPluginEnabled(remoteConfig.plugins); + }); + + it('keeps remote ssr mode enabled when explicit PORT is set', () => { + const remoteConfig = loadRemoteConfig({ + port: '4550', + }); + expect(remoteConfig.server).toEqual( + expect.objectContaining({ + ssr: true, + port: 4550, + }), + ); + }); + + it('keeps remote port precedence deterministic when PORT and remote port are both set', () => { + const remoteConfig = loadRemoteConfig({ + port: '4550', + remotePort: '3881', + }); + expect(remoteConfig.server).toEqual( + expect.objectContaining({ + ssr: true, + port: 3881, + }), + ); + expect(remoteConfig.output).toEqual( + expect.objectContaining({ + assetPrefix: 'http://127.0.0.1:3881', + }), + ); + }); +}); diff --git a/tests/integration/rsc-mf/tests/modernServerConfig.test.ts b/tests/integration/rsc-mf/tests/modernServerConfig.test.ts new file mode 100644 index 000000000000..8134062ec222 --- /dev/null +++ b/tests/integration/rsc-mf/tests/modernServerConfig.test.ts @@ -0,0 +1,24 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +describe('rsc-mf host modern.server contracts', () => { + const hostServerDir = path.resolve(__dirname, '../host/server'); + + it('does not define a host modern.server middleware override', () => { + const hostModernServerPath = path.join(hostServerDir, 'modern.server.ts'); + expect(fs.existsSync(hostModernServerPath)).toBe(false); + }); + + it('does not define manifest fallback helpers in host server layer', () => { + const hostManifestFallbackPath = path.join( + hostServerDir, + 'manifestFallback.ts', + ); + expect(fs.existsSync(hostManifestFallbackPath)).toBe(false); + }); + + it('does not define proxy response helpers in host server layer', () => { + const hostProxyResponsePath = path.join(hostServerDir, 'proxyResponse.ts'); + expect(fs.existsSync(hostProxyResponsePath)).toBe(false); + }); +}); diff --git a/tests/integration/rsc-mf/tests/moduleFederationConfig.test.ts b/tests/integration/rsc-mf/tests/moduleFederationConfig.test.ts new file mode 100644 index 000000000000..87e40479abd7 --- /dev/null +++ b/tests/integration/rsc-mf/tests/moduleFederationConfig.test.ts @@ -0,0 +1,270 @@ +const HOST_MODULE_FEDERATION_CONFIG_MODULE = '../host/module-federation.config'; +const REMOTE_MODULE_FEDERATION_CONFIG_MODULE = + '../remote/module-federation.config'; + +const EXPECTED_REMOTE_EXPOSE_KEYS = [ + './RemoteClientCounter', + './RemoteClientBadge', + './RemoteServerCard', + './RemoteServerDefault', + './AsyncRemoteServerInfo', + './remoteServerOnly', + './remoteServerOnlyDefault', + './remoteMeta', + './actions', + './nestedActions', + './defaultAction', + './actionBundle', + './infoBundle', +].sort(); +const INTERNAL_RSC_BRIDGE_EXPOSE_KEY = './__rspack_rsc_bridge__'; +const EXPECTED_SHARED_SCOPES = ['default', 'ssr', 'rsc']; +const SEMVER_LIKE_VERSION_PATTERN = /^\d+\.\d+\.\d+/; + +const getExposeImports = (exposeDefinition: unknown): string[] => { + if (typeof exposeDefinition === 'string') { + return [exposeDefinition]; + } + if (Array.isArray(exposeDefinition)) { + return exposeDefinition.filter( + (importPath): importPath is string => typeof importPath === 'string', + ); + } + if ( + exposeDefinition && + typeof exposeDefinition === 'object' && + 'import' in exposeDefinition + ) { + const exposeImport = (exposeDefinition as { import?: unknown }).import; + if (typeof exposeImport === 'string') { + return [exposeImport]; + } + if (Array.isArray(exposeImport)) { + return exposeImport.filter( + (importPath): importPath is string => typeof importPath === 'string', + ); + } + } + return []; +}; + +const assertSharedVersions = ( + sharedScopes: Array>, +) => { + for (const sharedScope of sharedScopes) { + expect(sharedScope.react?.version).toEqual( + expect.stringMatching(SEMVER_LIKE_VERSION_PATTERN), + ); + expect(sharedScope['react-dom']?.version).toEqual( + expect.stringMatching(SEMVER_LIKE_VERSION_PATTERN), + ); + expect( + sharedScope['react-server-dom-rspack/client.browser']?.version, + ).toEqual(expect.stringMatching(SEMVER_LIKE_VERSION_PATTERN)); + } +}; + +const withEnv = ( + env: Partial>, + run: () => T, +): T => { + const previousNodeEnv = process.env.NODE_ENV; + const previousRemotePort = process.env.RSC_MF_REMOTE_PORT; + + if (typeof env.NODE_ENV === 'undefined') { + delete process.env.NODE_ENV; + } else { + process.env.NODE_ENV = env.NODE_ENV as NodeJS.ProcessEnv['NODE_ENV']; + } + + if (typeof env.RSC_MF_REMOTE_PORT === 'undefined') { + delete process.env.RSC_MF_REMOTE_PORT; + } else { + process.env.RSC_MF_REMOTE_PORT = env.RSC_MF_REMOTE_PORT; + } + + try { + return run(); + } finally { + if (typeof previousNodeEnv === 'undefined') { + delete process.env.NODE_ENV; + } else { + process.env.NODE_ENV = previousNodeEnv; + } + if (typeof previousRemotePort === 'undefined') { + delete process.env.RSC_MF_REMOTE_PORT; + } else { + process.env.RSC_MF_REMOTE_PORT = previousRemotePort; + } + } +}; + +const loadRemoteConfig = () => + withEnv({}, () => { + let config: any; + jest.isolateModules(() => { + config = require(REMOTE_MODULE_FEDERATION_CONFIG_MODULE).default; + }); + return config; + }); + +const loadHostConfig = ({ + nodeEnv, + remotePort, +}: { + nodeEnv: string; + remotePort?: string; +}) => + withEnv( + { + NODE_ENV: nodeEnv, + RSC_MF_REMOTE_PORT: remotePort, + }, + () => { + let config: any; + jest.isolateModules(() => { + config = require(HOST_MODULE_FEDERATION_CONFIG_MODULE).default; + }); + return config; + }, + ); + +describe('rsc-mf module federation config contracts', () => { + it('declares expected direct remote exposes and allows internal bridge expose', () => { + const remoteConfig = loadRemoteConfig(); + const exposeEntries = Object.entries(remoteConfig.exposes || {}); + const directExposeEntries = exposeEntries.filter( + ([exposeKey]) => exposeKey !== INTERNAL_RSC_BRIDGE_EXPOSE_KEY, + ); + const directExposeKeys = directExposeEntries + .map(([exposeKey]) => exposeKey) + .sort() as string[]; + + expect(directExposeKeys).toEqual(EXPECTED_REMOTE_EXPOSE_KEYS); + + for (const [exposeKey, exposeDefinition] of directExposeEntries) { + expect(exposeKey).toMatch(/^\.\//); + const exposeImports = getExposeImports(exposeDefinition); + expect(exposeImports.length).toBeGreaterThan(0); + for (const exposeImport of exposeImports) { + expect(exposeImport).toMatch(/^\.\/src\/components\//); + expect(exposeImport).toMatch(/\.[cm]?[jt]sx?$/i); + expect(exposeImport).not.toContain('..'); + expect(exposeImport).not.toContain('\\'); + expect(exposeImport).not.toContain('/runtime/'); + } + } + + const internalBridgeExposeDefinition = + remoteConfig.exposes?.[INTERNAL_RSC_BRIDGE_EXPOSE_KEY]; + if (typeof internalBridgeExposeDefinition !== 'undefined') { + const bridgeExposeImports = getExposeImports( + internalBridgeExposeDefinition, + ); + expect(bridgeExposeImports.length).toBeGreaterThan(0); + for (const bridgeExposeImport of bridgeExposeImports) { + expect(bridgeExposeImport).not.toContain('..'); + expect(bridgeExposeImport).not.toContain('\\'); + } + } + }); + + it('keeps remote shared scopes and experiments aligned for rsc', () => { + const remoteConfig = loadRemoteConfig(); + const sharedScopes = remoteConfig.shared as Array< + Record + >; + + expect(sharedScopes).toHaveLength(EXPECTED_SHARED_SCOPES.length); + expect(sharedScopes.map(scope => scope.react?.shareScope)).toEqual( + EXPECTED_SHARED_SCOPES, + ); + expect( + sharedScopes.map( + scope => scope['react-server-dom-rspack/client.browser']?.shareScope, + ), + ).toEqual(EXPECTED_SHARED_SCOPES); + assertSharedVersions( + sharedScopes as Array>, + ); + expect(remoteConfig.experiments).toEqual( + expect.objectContaining({ + asyncStartup: true, + rsc: true, + }), + ); + }); + + it('uses remote port env var in host manifest remote URL', () => { + const hostConfig = loadHostConfig({ + nodeEnv: 'test', + remotePort: '3999', + }); + expect(hostConfig.remotes).toEqual( + expect.objectContaining({ + rscRemote: 'rscRemote@http://127.0.0.1:3999/static/mf-manifest.json', + }), + ); + }); + + it('falls back to default remote manifest port when env var is unset', () => { + const hostConfig = loadHostConfig({ + nodeEnv: 'test', + }); + expect(hostConfig.remotes).toEqual( + expect.objectContaining({ + rscRemote: 'rscRemote@http://127.0.0.1:3008/static/mf-manifest.json', + }), + ); + }); + + it('does not define fixture-only host runtime plugins', () => { + const productionHostConfig = loadHostConfig({ + nodeEnv: 'production', + remotePort: '3008', + }); + const developmentHostConfig = loadHostConfig({ + nodeEnv: 'development', + remotePort: '3008', + }); + + expect(productionHostConfig.runtimePlugins).toBeUndefined(); + expect(developmentHostConfig.runtimePlugins).toBeUndefined(); + }); + + it('keeps host experiments aligned for async startup and rsc', () => { + const hostConfig = loadHostConfig({ + nodeEnv: 'test', + remotePort: '3008', + }); + expect(hostConfig.experiments).toEqual( + expect.objectContaining({ + asyncStartup: true, + rsc: true, + }), + ); + }); + + it('keeps host shared scopes aligned for rsc runtime compatibility', () => { + const hostConfig = loadHostConfig({ + nodeEnv: 'test', + remotePort: '3008', + }); + const sharedScopes = hostConfig.shared as Array< + Record + >; + + expect(sharedScopes).toHaveLength(EXPECTED_SHARED_SCOPES.length); + expect(sharedScopes.map(scope => scope.react?.shareScope)).toEqual( + EXPECTED_SHARED_SCOPES, + ); + expect( + sharedScopes.map( + scope => scope['react-server-dom-rspack/client.browser']?.shareScope, + ), + ).toEqual(EXPECTED_SHARED_SCOPES); + assertSharedVersions( + sharedScopes as Array>, + ); + }); +}); diff --git a/tests/integration/rsc-mf/tests/remoteModernServerConfig.test.ts b/tests/integration/rsc-mf/tests/remoteModernServerConfig.test.ts new file mode 100644 index 000000000000..e0bb11419cc2 --- /dev/null +++ b/tests/integration/rsc-mf/tests/remoteModernServerConfig.test.ts @@ -0,0 +1,30 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +describe('rsc-mf remote modern.server contracts', () => { + const remoteServerDir = path.resolve(__dirname, '../remote/server'); + + it('does not define a remote modern.server middleware override', () => { + const remoteModernServerPath = path.join( + remoteServerDir, + 'modern.server.ts', + ); + expect(fs.existsSync(remoteModernServerPath)).toBe(false); + }); + + it('does not define manifest fallback helpers in remote server layer', () => { + const remoteManifestFallbackPath = path.join( + remoteServerDir, + 'manifestFallback.ts', + ); + expect(fs.existsSync(remoteManifestFallbackPath)).toBe(false); + }); + + it('does not define proxy response helpers in remote server layer', () => { + const remoteProxyResponsePath = path.join( + remoteServerDir, + 'proxyResponse.ts', + ); + expect(fs.existsSync(remoteProxyResponsePath)).toBe(false); + }); +}); diff --git a/tests/integration/rsc-mf/tests/tsconfig.json b/tests/integration/rsc-mf/tests/tsconfig.json new file mode 100644 index 000000000000..10f49432232c --- /dev/null +++ b/tests/integration/rsc-mf/tests/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@modern-js/tsconfig/base", + "compilerOptions": { + "declaration": true, + "jsx": "preserve", + "baseUrl": "./", + "emitDeclarationOnly": true, + "isolatedModules": true, + "paths": {}, + "types": ["node", "jest"] + } +} diff --git a/tests/integration/rsc-mf/tests/tsconfigContracts.test.ts b/tests/integration/rsc-mf/tests/tsconfigContracts.test.ts new file mode 100644 index 000000000000..3c6afc353bff --- /dev/null +++ b/tests/integration/rsc-mf/tests/tsconfigContracts.test.ts @@ -0,0 +1,41 @@ +import fs from 'fs'; +import path from 'path'; + +const readTsconfig = (projectDir: 'host' | 'remote') => { + const tsconfigPath = path.resolve( + __dirname, + `../${projectDir}/tsconfig.json`, + ); + return JSON.parse(fs.readFileSync(tsconfigPath, 'utf8')) as { + include?: string[]; + compilerOptions?: { + rootDir?: string; + }; + }; +}; + +describe('rsc-mf tsconfig contracts', () => { + it.each(['host', 'remote'] as const)( + 'keeps %s tsconfig include entries aligned with runtime server config files', + projectDir => { + const tsconfig = readTsconfig(projectDir); + expect(Array.isArray(tsconfig.include)).toBe(true); + expect(tsconfig.include).toEqual( + expect.arrayContaining([ + 'src', + 'server', + 'modern.config.ts', + 'module-federation.config.ts', + ]), + ); + }, + ); + + it.each(['host', 'remote'] as const)( + 'keeps %s tsconfig rootDir unset for server dist runtime path', + projectDir => { + const tsconfig = readTsconfig(projectDir); + expect(tsconfig.compilerOptions?.rootDir).toBeUndefined(); + }, + ); +}); diff --git a/tests/integration/rsc-mf/tests/types/modern-js-server-runtime.d.ts b/tests/integration/rsc-mf/tests/types/modern-js-server-runtime.d.ts new file mode 100644 index 000000000000..5d110660f13f --- /dev/null +++ b/tests/integration/rsc-mf/tests/types/modern-js-server-runtime.d.ts @@ -0,0 +1,16 @@ +declare module '@modern-js/server-runtime' { + interface MiddlewareRequestLike { + url: string; + header?: (name: string) => string | undefined; + headers?: { + get?: (name: string) => string | null | undefined; + }; + } + + export type MiddlewareHandler = ( + c: { req: MiddlewareRequestLike; res?: Response }, + next: () => Promise, + ) => Promise | void | Response; + + export function defineServerConfig(config: T): T; +}