From ad446afe9c981c328d73029e337ea2b3eb8b7526 Mon Sep 17 00:00:00 2001 From: Zack Jackson <25274700+ScriptedAlchemy@users.noreply.github.com> Date: Tue, 3 Jun 2025 07:11:54 -0700 Subject: [PATCH 01/30] fix(enhanced): support OR || operations in SemVer (#3808) --- .changeset/early-tools-compete.md | 5 + .../runtime-core/src/utils/semver/index.ts | 143 +++++++++++++----- 2 files changed, 108 insertions(+), 40 deletions(-) create mode 100644 .changeset/early-tools-compete.md diff --git a/.changeset/early-tools-compete.md b/.changeset/early-tools-compete.md new file mode 100644 index 00000000000..9964ded9cbb --- /dev/null +++ b/.changeset/early-tools-compete.md @@ -0,0 +1,5 @@ +--- +'@module-federation/enhanced': patch +--- + +support `||` pipes in semver parsing diff --git a/packages/runtime-core/src/utils/semver/index.ts b/packages/runtime-core/src/utils/semver/index.ts index 6a93200ebfe..f974cfa45ae 100644 --- a/packages/runtime-core/src/utils/semver/index.ts +++ b/packages/runtime-core/src/utils/semver/index.ts @@ -69,20 +69,12 @@ export function satisfy(version: string, range: string): boolean { return false; } - const parsedRange = parseRange(range); - const parsedComparator = parsedRange - .split(' ') - .map((rangeVersion) => parseComparatorString(rangeVersion)) - .join(' '); - const comparators = parsedComparator - .split(/\s+/) - .map((comparator) => parseGTE0(comparator)); + // Extract version details once const extractedVersion = extractComparator(version); - if (!extractedVersion) { + // If the version string is invalid, it can't satisfy any range return false; } - const [ , versionOperator, @@ -106,42 +98,113 @@ export function satisfy(version: string, range: string): boolean { preRelease: versionPreRelease?.split('.'), }; - for (const comparator of comparators) { - const extractedComparator = extractComparator(comparator); + // Split the range by || to handle OR conditions + const orRanges = range.split('||'); - if (!extractedComparator) { - return false; + for (const orRange of orRanges) { + const trimmedOrRange = orRange.trim(); + if (!trimmedOrRange) { + // An empty range string signifies wildcard *, satisfy any valid version + // (We already checked if the version itself is valid) + return true; } - const [ - , - rangeOperator, - , - rangeMajor, - rangeMinor, - rangePatch, - rangePreRelease, - ] = extractedComparator; - const rangeAtom: CompareAtom = { - operator: rangeOperator, - version: combineVersion( - rangeMajor, - rangeMinor, - rangePatch, - rangePreRelease, - ), // exclude build atom - major: rangeMajor, - minor: rangeMinor, - patch: rangePatch, - preRelease: rangePreRelease?.split('.'), - }; - - if (!compare(rangeAtom, versionAtom)) { - return false; // early return + // Handle simple wildcards explicitly before complex parsing + if (trimmedOrRange === '*' || trimmedOrRange === 'x') { + return true; + } + + try { + // Apply existing parsing logic to the current OR sub-range + const parsedSubRange = parseRange(trimmedOrRange); // Handles hyphens, trims etc. + + // Check if the result of initial parsing is empty, which can happen + // for some wildcard cases handled by parseRange/parseComparatorString. + // E.g. `parseStar` used in `parseComparatorString` returns ''. + if (!parsedSubRange.trim()) { + // If parsing results in empty string, treat as wildcard match + return true; + } + + const parsedComparatorString = parsedSubRange + .split(' ') + .map((rangeVersion) => parseComparatorString(rangeVersion)) // Expands ^, ~ + .join(' '); + + // Check again if the comparator string became empty after specific parsing like ^ or ~ + if (!parsedComparatorString.trim()) { + return true; + } + + // Split the sub-range by space for implicit AND conditions + const comparators = parsedComparatorString + .split(/\s+/) + .map((comparator) => parseGTE0(comparator)) + // Filter out empty strings that might result from multiple spaces + .filter(Boolean); + + // If a sub-range becomes empty after parsing (e.g., invalid characters), + // it cannot be satisfied. This check might be redundant now but kept for safety. + if (comparators.length === 0) { + continue; + } + + let subRangeSatisfied = true; + for (const comparator of comparators) { + const extractedComparator = extractComparator(comparator); + + // If any part of the AND sub-range is invalid, the sub-range is not satisfied + if (!extractedComparator) { + subRangeSatisfied = false; + break; + } + + const [ + , + rangeOperator, + , + rangeMajor, + rangeMinor, + rangePatch, + rangePreRelease, + ] = extractedComparator; + const rangeAtom: CompareAtom = { + operator: rangeOperator, + version: combineVersion( + rangeMajor, + rangeMinor, + rangePatch, + rangePreRelease, + ), + major: rangeMajor, + minor: rangeMinor, + patch: rangePatch, + preRelease: rangePreRelease?.split('.'), + }; + + // Check if the version satisfies this specific comparator in the AND chain + if (!compare(rangeAtom, versionAtom)) { + subRangeSatisfied = false; // This part of the AND condition failed + break; // No need to check further comparators in this sub-range + } + } + + // If all AND conditions within this OR sub-range were met, the overall range is satisfied + if (subRangeSatisfied) { + return true; + } + } catch (e) { + // Log error and treat this sub-range as unsatisfied + console.error( + `[semver] Error processing range part "${trimmedOrRange}":`, + e, + ); + continue; } } - return true; + // If none of the OR sub-ranges were satisfied + return false; } export function isLegallyVersion(version: string): boolean { From 43c1729fd972e194d8db57262aee2ee2387782d8 Mon Sep 17 00:00:00 2001 From: Yannik Peschke Date: Tue, 3 Jun 2025 17:41:50 +0200 Subject: [PATCH 02/30] docs(website-new): add docs on resolving @mf-types generation behind local proxy (#3765) --- .../en/guide/troubleshooting/type/overview.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/website-new/docs/en/guide/troubleshooting/type/overview.md b/apps/website-new/docs/en/guide/troubleshooting/type/overview.md index fdfd3043b96..1bb58648633 100644 --- a/apps/website-new/docs/en/guide/troubleshooting/type/overview.md +++ b/apps/website-new/docs/en/guide/troubleshooting/type/overview.md @@ -41,4 +41,21 @@ The type generated by the producer contains aliases and cannot be processed norm ``` 3. Set [dts.generateTypes.compilerInstance](../../../configure/dts#compilerinstance) to `tspc`(`ts-patch` cli) -4. Regenerate types \ No newline at end of file +4. Regenerate types + +### Generated types not updating when working behind a local proxy + +**Phenomenon description** + +The types generated by the producer are successfully generated, the consumer log shows that the types are successfully processed, but the `@mf-types` directory does not update. +The issue can be a proxy configuration problem not allowing the resource to be downloaded. + +**How ​​to solve** +1. Check if the `@mf-types` directory is generated in the `dist` directory of the producer. +2. Check your proxy log for any errors related to `TLS` or `SSL`. +3. Adapt your proxy configuration to add `TLS` certification for your local environment. +4. In some scenarios this is not working. An alternative is, to define the environment variable `NODE_TLS_REJECT_UNAUTHORIZED=0` to ignore the `TLS` or `SSL` errors. This will allow the `@mf-types.zip` to be properly handled. + +:::danger Important note +Only set NODE_TLS_REJECT_UNAUTHORIZED=0 in your local development environment. It is not meant for production use. If you go this route, please make sure to commit the generated types to your repository. +::: From c3435890bc32da524b584978ac1f61e05717b293 Mon Sep 17 00:00:00 2001 From: Hanric Date: Wed, 4 Jun 2025 14:15:00 +0800 Subject: [PATCH 03/30] fix: only inject ipv4 str in dev mode (#3813) --- .changeset/beige-apricots-switch.md | 5 +++++ .changeset/rare-rockets-wink.md | 5 +++++ packages/dts-plugin/src/plugins/DevPlugin.ts | 8 +++++--- packages/modernjs/src/cli/configPlugin.ts | 15 ++++++++++----- 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 .changeset/beige-apricots-switch.md create mode 100644 .changeset/rare-rockets-wink.md diff --git a/.changeset/beige-apricots-switch.md b/.changeset/beige-apricots-switch.md new file mode 100644 index 00000000000..60528a0aff1 --- /dev/null +++ b/.changeset/beige-apricots-switch.md @@ -0,0 +1,5 @@ +--- +'@module-federation/dts-plugin': patch +--- + +fix(dts-plugin): only inject ipv4 str in dev mode diff --git a/.changeset/rare-rockets-wink.md b/.changeset/rare-rockets-wink.md new file mode 100644 index 00000000000..c49d3afe26c --- /dev/null +++ b/.changeset/rare-rockets-wink.md @@ -0,0 +1,5 @@ +--- +'@module-federation/modern-js': patch +--- + +fix(modern-js-plugin): only inject ipv4 str in dev mode diff --git a/packages/dts-plugin/src/plugins/DevPlugin.ts b/packages/dts-plugin/src/plugins/DevPlugin.ts index 7e51d7f88e8..97a09daca27 100644 --- a/packages/dts-plugin/src/plugins/DevPlugin.ts +++ b/packages/dts-plugin/src/plugins/DevPlugin.ts @@ -117,9 +117,7 @@ export class DevPlugin implements WebpackPluginInstance { const { _options: { name, dev, dts }, } = this; - new compiler.webpack.DefinePlugin({ - FEDERATION_IPV4: JSON.stringify(getIPV4()), - }).apply(compiler); + const normalizedDev = normalizeOptions( true, @@ -135,6 +133,10 @@ export class DevPlugin implements WebpackPluginInstance { return; } + new compiler.webpack.DefinePlugin({ + FEDERATION_IPV4: JSON.stringify(getIPV4()), + }).apply(compiler); + if ( normalizedDev.disableHotTypesReload && normalizedDev.disableLiveReload && diff --git a/packages/modernjs/src/cli/configPlugin.ts b/packages/modernjs/src/cli/configPlugin.ts index e5dfa5447a0..be12e81e6f0 100644 --- a/packages/modernjs/src/cli/configPlugin.ts +++ b/packages/modernjs/src/cli/configPlugin.ts @@ -144,6 +144,7 @@ export const patchMFConfig = ( mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions, isServer: boolean, remoteIpStrategy?: 'ipv4' | 'inherit', + enableSSR?: boolean, ) => { replaceRemoteUrl(mfConfig, remoteIpStrategy); if (mfConfig.remoteType === undefined) { @@ -161,7 +162,7 @@ export const patchMFConfig = ( runtimePlugins, ); - if (isDev) { + if (enableSSR && isDev) { injectRuntimePlugins( require.resolve('@module-federation/modern-js/resolve-entry-ipv4'), runtimePlugins, @@ -393,6 +394,7 @@ export const moduleFederationConfigPlugin = ( targetMFConfig, !isWeb, userConfig.remoteIpStrategy || 'ipv4', + enableSSR, ); patchBundlerConfig({ @@ -451,6 +453,12 @@ export const moduleFederationConfigPlugin = ( 'Access-Control-Allow-Headers': '*', } : undefined; + const defineConfig = { + REMOTE_IP_STRATEGY: JSON.stringify(userConfig.remoteIpStrategy), + }; + if (enableSSR && isDev) { + defineConfig['FEDERATION_IPV4'] = JSON.stringify(ipv4); + } return { tools: { devServer: { @@ -464,10 +472,7 @@ export const moduleFederationConfigPlugin = ( '@module-federation/modern-js/runtime', ), }, - define: { - FEDERATION_IPV4: JSON.stringify(ipv4), - REMOTE_IP_STRATEGY: JSON.stringify(userConfig.remoteIpStrategy), - }, + define: defineConfig, enableAsyncEntry: bundlerType === 'rspack' ? (modernjsConfig.source?.enableAsyncEntry ?? true) From f77771016f331cb728f0cf81d91ea9f00446554e Mon Sep 17 00:00:00 2001 From: Hanric Date: Wed, 4 Jun 2025 16:42:06 +0800 Subject: [PATCH 04/30] feat(rsbuild-plugin): support generate MF SSR in Rslib (#3804) --- .changeset/violet-boxes-happen.md | 5 + .../@mf-types/dynamic_remote/Image.d.ts | 2 - .../src/components/Content.tsx | 2 +- .../module-federation.config.ts | 2 +- apps/modernjs-ssr/dynamic-remote/.npmrc | 1 - apps/modernjs-ssr/dynamic-remote/CHANGELOG.md | 159 -- .../dynamic-remote/modern.config.ts | 20 - .../module-federation.config.ts | 2 +- apps/modernjs-ssr/dynamic-remote/package.json | 56 +- apps/modernjs-ssr/dynamic-remote/project.json | 25 +- .../dynamic-remote/rslib.config.ts | 49 + .../dynamic-remote/src/.eslintrc.js | 9 - .../src/{components/Image.tsx => Index.tsx} | 1 - .../dynamic-remote/src/modern-app-env.d.ts | 3 - .../dynamic-remote/src/routes/index.css | 127 - .../dynamic-remote/src/routes/layout.tsx | 9 - .../dynamic-remote/src/routes/page.tsx | 13 - .../src/{components => }/stuff.module.css | 0 .../{components => }/stuff.module.css.d.ts | 0 apps/modernjs-ssr/dynamic-remote/src/test.ts | 1 - .../dynamic-remote/tsconfig.app.json | 17 - .../modernjs-ssr/dynamic-remote/tsconfig.json | 14 +- .../dynamic-remote/tsconfig.spec.json | 14 - .../host/module-federation.config.ts | 2 +- .../modernjs-ssr/host/src/routes/all/page.tsx | 2 +- .../host/src/routes/dynamic-remote/page.tsx | 4 +- .../nested-remote/module-federation.config.ts | 2 +- .../router-demo/router-host-2000/package.json | 2 +- .../router-host-v5-2200/package.json | 2 +- .../router-host-vue3-2100/package.json | 2 +- .../router-remote1-2001/package.json | 2 +- .../router-remote2-2002/package.json | 2 +- .../router-remote3-2003/package.json | 2 +- .../router-remote4-2004/package.json | 2 +- .../router-remote5-2005/package.json | 2 +- apps/rslib-module/package.json | 6 +- .../3008-runtime-remote/package.json | 2 +- .../docs/en/guide/basic/rsbuild.mdx | 57 + .../docs/en/guide/framework/modernjs.mdx | 2 +- .../docs/zh/guide/basic/rsbuild.mdx | 56 + .../docs/zh/guide/framework/modernjs.mdx | 2 +- package.json | 2 +- .../create-module-federation/package.json | 2 +- .../package.json.handlebars | 10 +- .../provider-rslib-ts/package.json.handlebars | 4 +- packages/manifest/src/ManifestManager.ts | 7 +- packages/modernjs/package.json | 2 +- packages/modernjs/src/cli/configPlugin.ts | 2 - packages/modernjs/src/cli/ssrPlugin.ts | 2 +- packages/rsbuild-plugin/package.json | 16 +- packages/rsbuild-plugin/rollup.config.js | 1 + packages/rsbuild-plugin/src/cli/index.ts | 248 +- .../src/cli/manifest.ts | 7 +- packages/rsbuild-plugin/src/cli/ssr.spec.ts | 205 ++ packages/rsbuild-plugin/src/cli/ssr.ts | 106 + packages/runtime-core/src/module/index.ts | 3 +- packages/storybook-addon/package.json | 2 +- pnpm-lock.yaml | 2172 +++++++---------- 58 files changed, 1577 insertions(+), 1896 deletions(-) create mode 100644 .changeset/violet-boxes-happen.md delete mode 100644 apps/modernjs-ssr/dynamic-nested-remote/@mf-types/dynamic_remote/Image.d.ts delete mode 100644 apps/modernjs-ssr/dynamic-remote/.npmrc delete mode 100644 apps/modernjs-ssr/dynamic-remote/CHANGELOG.md delete mode 100644 apps/modernjs-ssr/dynamic-remote/modern.config.ts create mode 100644 apps/modernjs-ssr/dynamic-remote/rslib.config.ts delete mode 100644 apps/modernjs-ssr/dynamic-remote/src/.eslintrc.js rename apps/modernjs-ssr/dynamic-remote/src/{components/Image.tsx => Index.tsx} (94%) delete mode 100644 apps/modernjs-ssr/dynamic-remote/src/modern-app-env.d.ts delete mode 100644 apps/modernjs-ssr/dynamic-remote/src/routes/index.css delete mode 100644 apps/modernjs-ssr/dynamic-remote/src/routes/layout.tsx delete mode 100644 apps/modernjs-ssr/dynamic-remote/src/routes/page.tsx rename apps/modernjs-ssr/dynamic-remote/src/{components => }/stuff.module.css (100%) rename apps/modernjs-ssr/dynamic-remote/src/{components => }/stuff.module.css.d.ts (100%) delete mode 100644 apps/modernjs-ssr/dynamic-remote/src/test.ts delete mode 100644 apps/modernjs-ssr/dynamic-remote/tsconfig.app.json delete mode 100644 apps/modernjs-ssr/dynamic-remote/tsconfig.spec.json rename packages/{modernjs => rsbuild-plugin}/src/cli/manifest.ts (89%) create mode 100644 packages/rsbuild-plugin/src/cli/ssr.spec.ts create mode 100644 packages/rsbuild-plugin/src/cli/ssr.ts diff --git a/.changeset/violet-boxes-happen.md b/.changeset/violet-boxes-happen.md new file mode 100644 index 00000000000..79fce83c6a6 --- /dev/null +++ b/.changeset/violet-boxes-happen.md @@ -0,0 +1,5 @@ +--- +'@module-federation/rsbuild-plugin': patch +--- + +feat(rsbuild-plugin): support generate MF SSR in Rslib diff --git a/apps/modernjs-ssr/dynamic-nested-remote/@mf-types/dynamic_remote/Image.d.ts b/apps/modernjs-ssr/dynamic-nested-remote/@mf-types/dynamic_remote/Image.d.ts deleted file mode 100644 index d4a0c1006a9..00000000000 --- a/apps/modernjs-ssr/dynamic-nested-remote/@mf-types/dynamic_remote/Image.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './compiled-types/src/components/Image'; -export { default } from './compiled-types/src/components/Image'; \ No newline at end of file diff --git a/apps/modernjs-ssr/dynamic-nested-remote/src/components/Content.tsx b/apps/modernjs-ssr/dynamic-nested-remote/src/components/Content.tsx index b7c0b91a060..312936b2d32 100644 --- a/apps/modernjs-ssr/dynamic-nested-remote/src/components/Content.tsx +++ b/apps/modernjs-ssr/dynamic-nested-remote/src/components/Content.tsx @@ -17,7 +17,7 @@ registerRemotes([ ]); const RemoteSSRComponent = createRemoteSSRComponent({ - loader: () => loadRemote('dynamic_remote/Image'), + loader: () => loadRemote('dynamic_remote'), loading: 'loading...', fallback: ({ error }) => { if (error instanceof Error && error.message.includes('not exist')) { diff --git a/apps/modernjs-ssr/dynamic-remote-new-version/module-federation.config.ts b/apps/modernjs-ssr/dynamic-remote-new-version/module-federation.config.ts index c3277397e8a..60f8d56f53e 100644 --- a/apps/modernjs-ssr/dynamic-remote-new-version/module-federation.config.ts +++ b/apps/modernjs-ssr/dynamic-remote-new-version/module-federation.config.ts @@ -2,7 +2,7 @@ import { createModuleFederationConfig } from '@module-federation/modern-js'; export default createModuleFederationConfig({ name: 'dynamic_remote', exposes: { - './Image': './src/components/Image.tsx', + '.': './src/components/Image.tsx', }, shared: { react: { singleton: true }, diff --git a/apps/modernjs-ssr/dynamic-remote/.npmrc b/apps/modernjs-ssr/dynamic-remote/.npmrc deleted file mode 100644 index fa4e095233f..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/.npmrc +++ /dev/null @@ -1 +0,0 @@ -strict-peer-dependencies=false \ No newline at end of file diff --git a/apps/modernjs-ssr/dynamic-remote/CHANGELOG.md b/apps/modernjs-ssr/dynamic-remote/CHANGELOG.md deleted file mode 100644 index 30fd14c3e13..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/CHANGELOG.md +++ /dev/null @@ -1,159 +0,0 @@ -# modernjs-ssr-dynamic-remote - -## 0.1.34 - -### Patch Changes - -- Updated dependencies [ad605d2] - - @module-federation/modern-js@0.6.14 - -## 0.1.33 - -### Patch Changes - -- @module-federation/modern-js@0.6.13 - -## 0.1.32 - -### Patch Changes - -- @module-federation/modern-js@0.6.12 - -## 0.1.31 - -### Patch Changes - -- @module-federation/modern-js@0.6.11 - -## 0.1.30 - -### Patch Changes - -- @module-federation/modern-js@0.6.10 - -## 0.1.29 - -### Patch Changes - -- @module-federation/modern-js@0.6.9 - -## 0.1.28 - -### Patch Changes - -- @module-federation/modern-js@0.6.8 - -## 0.1.27 - -### Patch Changes - -- @module-federation/modern-js@0.6.7 - -## 0.1.26 - -### Patch Changes - -- @module-federation/modern-js@0.6.6 - -## 0.1.25 - -### Patch Changes - -- @module-federation/modern-js@0.6.5 - -## 0.1.24 - -### Patch Changes - -- @module-federation/modern-js@0.6.4 - -## 0.1.23 - -### Patch Changes - -- Updated dependencies [81201b8] - - @module-federation/modern-js@0.6.3 - -## 0.1.22 - -### Patch Changes - -- Updated dependencies [541494d] -- Updated dependencies [2394e38] - - @module-federation/modern-js@0.6.2 - -## 0.1.21 - -### Patch Changes - -- @module-federation/modern-js@0.6.1 - -## 0.1.20 - -### Patch Changes - -- @module-federation/modern-js@0.6.0 - -## 0.1.19 - -### Patch Changes - -- @module-federation/modern-js@0.5.2 - -## 0.1.18 - -### Patch Changes - -- @module-federation/modern-js@0.5.1 - -## 0.1.17 - -### Patch Changes - -- @module-federation/modern-js@0.5.0 - -## 0.1.16 - -### Patch Changes - -- Updated dependencies [88dec4e] - - @module-federation/modern-js@0.4.0 - -## 0.1.15 - -### Patch Changes - -- @module-federation/modern-js@0.3.5 - -## 0.1.14 - -### Patch Changes - -- Updated dependencies [951d705] - - @module-federation/modern-js@0.3.4 - -## 0.1.13 - -### Patch Changes - -- @module-federation/modern-js@0.3.3 - -## 0.1.12 - -### Patch Changes - -- Updated dependencies [85ae159] - - @module-federation/modern-js@0.3.2 - -## 0.1.13 - -### Patch Changes - -- @module-federation/modern-js@0.3.1 - -## 0.1.12 - -### Patch Changes - -- Updated dependencies [fa37cc4] - - @module-federation/modern-js@0.2.0 diff --git a/apps/modernjs-ssr/dynamic-remote/modern.config.ts b/apps/modernjs-ssr/dynamic-remote/modern.config.ts deleted file mode 100644 index 9446e89d1cd..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/modern.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { appTools, defineConfig } from '@modern-js/app-tools'; -import { moduleFederationPlugin } from '@module-federation/modern-js'; - -// https://modernjs.dev/en/configure/app/usage -export default defineConfig({ - dev: { - port: 3053, - }, - runtime: { - router: true, - }, - server: { - ssr: { - mode: 'stream', - }, - }, - - plugins: [appTools(), moduleFederationPlugin()], - // plugins: [appTools()], -}); diff --git a/apps/modernjs-ssr/dynamic-remote/module-federation.config.ts b/apps/modernjs-ssr/dynamic-remote/module-federation.config.ts index c30d986c625..76973405754 100644 --- a/apps/modernjs-ssr/dynamic-remote/module-federation.config.ts +++ b/apps/modernjs-ssr/dynamic-remote/module-federation.config.ts @@ -3,7 +3,7 @@ export default createModuleFederationConfig({ name: 'dynamic_remote', filename: 'remoteEntry.js', exposes: { - './Image': './src/components/Image.tsx', + '.': './src/Index.tsx', }, shared: { react: { singleton: true }, diff --git a/apps/modernjs-ssr/dynamic-remote/package.json b/apps/modernjs-ssr/dynamic-remote/package.json index 4c18ff8cff1..59a040d0545 100644 --- a/apps/modernjs-ssr/dynamic-remote/package.json +++ b/apps/modernjs-ssr/dynamic-remote/package.json @@ -1,49 +1,23 @@ { "name": "modernjs-ssr-dynamic-remote", "private": true, - "version": "0.1.34", "scripts": { - "reset": "npx rimraf ./**/node_modules", - "dev": "modern dev", - "build": "modern build", - "start": "FEDERATION_DEBUG=true modern start", - "serve": "modern serve", - "new": "modern new", - "lint": "modern lint", - "upgrade": "modern upgrade" - }, - "engines": { - "node": ">=16.18.1" - }, - "lint-staged": { - "*.{js,jsx,ts,tsx,mjs,cjs}": [ - "node --max_old_space_size=8192 ./node_modules/eslint/bin/eslint.js --fix --color --cache --quiet" - ] - }, - "eslintIgnore": [ - "node_modules/", - "dist/" - ], - "dependencies": { - "@babel/runtime": "7.26.0", - "@modern-js/runtime": "2.67.6", - "@module-federation/modern-js": "workspace:*", - "antd": "4.24.15", - "react": "~18.3.1", - "react-dom": "~18.3.1" + "build": "rslib build", + "serve": "rslib mf-dev", + "dev": "rslib mf-dev", + "storybook": "storybook dev -p 6006" }, + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.mjs", + "types": "./dist/cjs/index.d.ts", "devDependencies": { - "@modern-js-app/eslint-config": "2.59.0", - "@modern-js/app-tools": "2.67.6", - "@modern-js/eslint-config": "2.59.0", - "@modern-js/tsconfig": "2.67.6", - "@types/jest": "~29.5.0", - "@types/node": "~16.11.7", - "@types/react": "~18.2.0", - "@types/react-dom": "~18.3.0", - "lint-staged": "~13.1.0", - "prettier": "~3.3.3", - "rimraf": "~6.0.1", - "typescript": "~5.0.4" + "@module-federation/enhanced": "workspace:*", + "@module-federation/rsbuild-plugin": "workspace:*", + "@rsbuild/plugin-react": "^1.3.1", + "@rslib/core": "^0.9.0", + "@types/react": "^18.3.11", + "http-server": "^14.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1" } } diff --git a/apps/modernjs-ssr/dynamic-remote/project.json b/apps/modernjs-ssr/dynamic-remote/project.json index 43ba720612e..d93708f7027 100644 --- a/apps/modernjs-ssr/dynamic-remote/project.json +++ b/apps/modernjs-ssr/dynamic-remote/project.json @@ -8,18 +8,7 @@ "build": { "executor": "nx:run-commands", "options": { - "dependsOn": [ - { - "target": "build", - "dependencies": true - } - ], - "commands": [ - { - "command": "cd apps/modernjs-ssr/dynamic-remote; pnpm run build", - "forwardAllArgs": true - } - ] + "commands": ["cd apps/modernjs-ssr/dynamic-remote; pnpm run build"] } }, "serve": { @@ -39,6 +28,18 @@ ] } }, + "dev": { + "executor": "nx:run-commands", + "options": { + "commands": ["cd apps/modernjs-ssr/dynamic-remote; pnpm run dev"] + }, + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ] + }, "e2e": { "executor": "@nx/cypress:cypress", "options": { diff --git a/apps/modernjs-ssr/dynamic-remote/rslib.config.ts b/apps/modernjs-ssr/dynamic-remote/rslib.config.ts new file mode 100644 index 00000000000..34297f1a97a --- /dev/null +++ b/apps/modernjs-ssr/dynamic-remote/rslib.config.ts @@ -0,0 +1,49 @@ +import { pluginModuleFederation } from '@module-federation/rsbuild-plugin'; +import { pluginReact } from '@rsbuild/plugin-react'; +import { defineConfig } from '@rslib/core'; +import mfConfig from './module-federation.config'; + +const shared = { + dts: { + bundle: false, + }, +}; + +export default defineConfig({ + output: { + cleanDistPath: true, + }, + lib: [ + { + ...shared, + format: 'esm', + output: { + distPath: { + root: './dist/esm', + }, + }, + }, + { + ...shared, + format: 'cjs', + output: { + distPath: { + root: './dist/cjs', + }, + }, + }, + { + ...shared, + format: 'mf', + output: { + distPath: { + root: './dist/mf', + }, + }, + }, + ], + server: { + port: 3053, + }, + plugins: [pluginReact(), pluginModuleFederation(mfConfig, { ssr: true })], +}); diff --git a/apps/modernjs-ssr/dynamic-remote/src/.eslintrc.js b/apps/modernjs-ssr/dynamic-remote/src/.eslintrc.js deleted file mode 100644 index fafc0032305..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/src/.eslintrc.js +++ /dev/null @@ -1,9 +0,0 @@ -// eslint-disable-next-line import/no-commonjs -module.exports = { - root: true, - extends: ['@modern-js-app'], - parserOptions: { - tsconfigRootDir: __dirname, - project: ['../tsconfig.json'], - }, -}; diff --git a/apps/modernjs-ssr/dynamic-remote/src/components/Image.tsx b/apps/modernjs-ssr/dynamic-remote/src/Index.tsx similarity index 94% rename from apps/modernjs-ssr/dynamic-remote/src/components/Image.tsx rename to apps/modernjs-ssr/dynamic-remote/src/Index.tsx index 0d9a3b6a286..4d7754ccee5 100644 --- a/apps/modernjs-ssr/dynamic-remote/src/components/Image.tsx +++ b/apps/modernjs-ssr/dynamic-remote/src/Index.tsx @@ -1,6 +1,5 @@ import React from 'react'; import Button from 'antd/lib/button'; -import mfSvg from '../assets/module-federation.svg'; import stuff from './stuff.module.css'; export default ({ text }: { text: string }): JSX.Element => ( diff --git a/apps/modernjs-ssr/dynamic-remote/src/modern-app-env.d.ts b/apps/modernjs-ssr/dynamic-remote/src/modern-app-env.d.ts deleted file mode 100644 index 3f453508cee..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/src/modern-app-env.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -/// -/// diff --git a/apps/modernjs-ssr/dynamic-remote/src/routes/index.css b/apps/modernjs-ssr/dynamic-remote/src/routes/index.css deleted file mode 100644 index e890f8aa146..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/src/routes/index.css +++ /dev/null @@ -1,127 +0,0 @@ -html, -body { - padding: 0; - margin: 0; - font-family: - PingFang SC, - Hiragino Sans GB, - Microsoft YaHei, - Arial, - sans-serif; - background: linear-gradient(to bottom, transparent, #fff) #eceeef; -} - -p { - margin: 0; -} - -* { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - box-sizing: border-box; -} - -.container-box { - min-height: 100vh; - max-width: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - padding-top: 10px; -} - -main { - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.title { - display: flex; - margin: 4rem 0 4rem; - align-items: center; - font-size: 4rem; - font-weight: 600; -} - -.logo { - width: 6rem; - margin: 7px 0 0 1rem; -} - -.name { - color: #4ecaff; -} - -.description { - text-align: center; - line-height: 1.5; - font-size: 1.3rem; - color: #1b3a42; - margin-bottom: 5rem; -} - -.code { - background: #fafafa; - border-radius: 12px; - padding: 0.6rem 0.9rem; - font-size: 1.05rem; - font-family: - Menlo, - Monaco, - Lucida Console, - Liberation Mono, - DejaVu Sans Mono, - Bitstream Vera Sans Mono, - Courier New, - monospace; -} - -.container-box .grid { - display: flex; - align-items: center; - justify-content: center; - width: 1100px; - margin-top: 3rem; -} - -.card { - padding: 1.5rem; - display: flex; - flex-direction: column; - justify-content: center; - height: 100px; - color: inherit; - text-decoration: none; - transition: 0.15s ease; - width: 45%; -} - -.card:hover, -.card:focus { - transform: scale(1.05); -} - -.card h2 { - display: flex; - align-items: center; - font-size: 1.5rem; - margin: 0; - padding: 0; -} - -.card p { - opacity: 0.6; - font-size: 0.9rem; - line-height: 1.5; - margin-top: 1rem; -} - -.arrow-right { - width: 1.3rem; - margin-left: 0.5rem; - margin-top: 3px; -} diff --git a/apps/modernjs-ssr/dynamic-remote/src/routes/layout.tsx b/apps/modernjs-ssr/dynamic-remote/src/routes/layout.tsx deleted file mode 100644 index 6433ea79e92..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/src/routes/layout.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { Outlet } from '@modern-js/runtime/router'; - -export default function Layout() { - return ( -
- -
- ); -} diff --git a/apps/modernjs-ssr/dynamic-remote/src/routes/page.tsx b/apps/modernjs-ssr/dynamic-remote/src/routes/page.tsx deleted file mode 100644 index c44577f00a6..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/src/routes/page.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; -import './index.css'; -import Image from '../components/Image'; - -const Index = () => ( -
- - - -
-); - -export default Index; diff --git a/apps/modernjs-ssr/dynamic-remote/src/components/stuff.module.css b/apps/modernjs-ssr/dynamic-remote/src/stuff.module.css similarity index 100% rename from apps/modernjs-ssr/dynamic-remote/src/components/stuff.module.css rename to apps/modernjs-ssr/dynamic-remote/src/stuff.module.css diff --git a/apps/modernjs-ssr/dynamic-remote/src/components/stuff.module.css.d.ts b/apps/modernjs-ssr/dynamic-remote/src/stuff.module.css.d.ts similarity index 100% rename from apps/modernjs-ssr/dynamic-remote/src/components/stuff.module.css.d.ts rename to apps/modernjs-ssr/dynamic-remote/src/stuff.module.css.d.ts diff --git a/apps/modernjs-ssr/dynamic-remote/src/test.ts b/apps/modernjs-ssr/dynamic-remote/src/test.ts deleted file mode 100644 index 2ea084092a2..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/src/test.ts +++ /dev/null @@ -1 +0,0 @@ -export default 'test'; diff --git a/apps/modernjs-ssr/dynamic-remote/tsconfig.app.json b/apps/modernjs-ssr/dynamic-remote/tsconfig.app.json deleted file mode 100644 index b5b3e6e9e03..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/tsconfig.app.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "types": ["node", "express"], - "target": "ES2015", - "module": "commonjs", - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true - }, - "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], - "include": ["src/**/*.ts"] -} diff --git a/apps/modernjs-ssr/dynamic-remote/tsconfig.json b/apps/modernjs-ssr/dynamic-remote/tsconfig.json index ce7f951eefc..a310c424b23 100644 --- a/apps/modernjs-ssr/dynamic-remote/tsconfig.json +++ b/apps/modernjs-ssr/dynamic-remote/tsconfig.json @@ -1,14 +1,12 @@ { - "extends": "@modern-js/tsconfig/base", "compilerOptions": { - "declaration": false, - "jsx": "preserve", - "baseUrl": "./", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, "paths": { - "@/*": ["./src/*"], - "@shared/*": ["./shared/*"] + "*": ["./@mf-types/*"] } }, - "include": ["src", "shared", "config", "modern.config.ts"], - "exclude": ["**/node_modules"] + "include": ["src/**/*"] } diff --git a/apps/modernjs-ssr/dynamic-remote/tsconfig.spec.json b/apps/modernjs-ssr/dynamic-remote/tsconfig.spec.json deleted file mode 100644 index 9b2a121d114..00000000000 --- a/apps/modernjs-ssr/dynamic-remote/tsconfig.spec.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "module": "commonjs", - "types": ["jest", "node"] - }, - "include": [ - "jest.config.ts", - "src/**/*.test.ts", - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] -} diff --git a/apps/modernjs-ssr/host/module-federation.config.ts b/apps/modernjs-ssr/host/module-federation.config.ts index baa3e501024..925feed42ce 100644 --- a/apps/modernjs-ssr/host/module-federation.config.ts +++ b/apps/modernjs-ssr/host/module-federation.config.ts @@ -2,7 +2,7 @@ import { createModuleFederationConfig } from '@module-federation/modern-js'; export default createModuleFederationConfig({ name: 'host', remotes: { - remote: 'remote@http://localhost:3051/mf-manifest.json', + remote: 'remote@http://localhost:3051/static/mf-manifest.json', nested_remote: 'nested_remote@http://localhost:3052/mf-manifest.json', }, shared: { diff --git a/apps/modernjs-ssr/host/src/routes/all/page.tsx b/apps/modernjs-ssr/host/src/routes/all/page.tsx index 91afca6d49f..2c99fef20f6 100644 --- a/apps/modernjs-ssr/host/src/routes/all/page.tsx +++ b/apps/modernjs-ssr/host/src/routes/all/page.tsx @@ -22,7 +22,7 @@ const DynamicNestedRemote = React.lazy(() => ); const DynamicRemote = React.lazy(() => - loadRemote('dynamic_remote/Image').then((m) => { + loadRemote('dynamic_remote').then((m) => { return m; }), ); diff --git a/apps/modernjs-ssr/host/src/routes/dynamic-remote/page.tsx b/apps/modernjs-ssr/host/src/routes/dynamic-remote/page.tsx index 3001ed8711d..d95ab03769b 100644 --- a/apps/modernjs-ssr/host/src/routes/dynamic-remote/page.tsx +++ b/apps/modernjs-ssr/host/src/routes/dynamic-remote/page.tsx @@ -15,7 +15,7 @@ registerRemotes([ ]); const RemoteSSRComponent = createRemoteSSRComponent({ - loader: () => loadRemote('dynamic_remote/Image'), + loader: () => loadRemote('dynamic_remote'), loading: 'loading...', fallback: ({ error }) => { if (error instanceof Error && error.message.includes('not exist')) { @@ -26,7 +26,7 @@ const RemoteSSRComponent = createRemoteSSRComponent({ }); const NewRemoteCom = React.lazy(() => - loadRemote('dynamic_remote/Image').then((m) => { + loadRemote('dynamic_remote').then((m) => { console.log('加载'); return m; }), diff --git a/apps/modernjs-ssr/nested-remote/module-federation.config.ts b/apps/modernjs-ssr/nested-remote/module-federation.config.ts index 4a59d0c07f6..227675ea5c6 100644 --- a/apps/modernjs-ssr/nested-remote/module-federation.config.ts +++ b/apps/modernjs-ssr/nested-remote/module-federation.config.ts @@ -6,7 +6,7 @@ export default createModuleFederationConfig({ './Content': './src/components/Content.tsx', }, remotes: { - remote: 'remote@http://localhost:3051/mf-manifest.json', + remote: 'remote@http://localhost:3051/static/mf-manifest.json', }, shared: { react: { singleton: true }, diff --git a/apps/router-demo/router-host-2000/package.json b/apps/router-demo/router-host-2000/package.json index 84259051c11..a3a6b550c62 100644 --- a/apps/router-demo/router-host-2000/package.json +++ b/apps/router-demo/router-host-2000/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@module-federation/rsbuild-plugin": "workspace:*", - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-react": "^1.0.6", "@types/react": "^18.2.79", "@types/react-dom": "^18.3.0", diff --git a/apps/router-demo/router-host-v5-2200/package.json b/apps/router-demo/router-host-v5-2200/package.json index 92b29da9f3d..a58c1c892ac 100644 --- a/apps/router-demo/router-host-v5-2200/package.json +++ b/apps/router-demo/router-host-v5-2200/package.json @@ -19,7 +19,7 @@ }, "devDependencies": { "@module-federation/rsbuild-plugin": "workspace:*", - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-react": "^1.0.6", "@types/react": "^18.2.79", "@types/react-dom": "^18.3.0", diff --git a/apps/router-demo/router-host-vue3-2100/package.json b/apps/router-demo/router-host-vue3-2100/package.json index 1fed76c7584..d059851c8a1 100644 --- a/apps/router-demo/router-host-vue3-2100/package.json +++ b/apps/router-demo/router-host-vue3-2100/package.json @@ -15,7 +15,7 @@ }, "devDependencies": { "@module-federation/rsbuild-plugin": "workspace:*", - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-vue": "^1.0.3", "tailwindcss": "^3.4.3", "typescript": "^5.4.2" diff --git a/apps/router-demo/router-remote1-2001/package.json b/apps/router-demo/router-remote1-2001/package.json index a55ce473c17..ff5c2c32c11 100644 --- a/apps/router-demo/router-remote1-2001/package.json +++ b/apps/router-demo/router-remote1-2001/package.json @@ -18,7 +18,7 @@ }, "devDependencies": { "@ant-design/cssinjs": "^1.20.0", - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-react": "^1.0.6", "@rsbuild/shared": "^0.7.10", "@types/react": "^18.2.79", diff --git a/apps/router-demo/router-remote2-2002/package.json b/apps/router-demo/router-remote2-2002/package.json index 59ba6a25887..2fdfa89ca5b 100644 --- a/apps/router-demo/router-remote2-2002/package.json +++ b/apps/router-demo/router-remote2-2002/package.json @@ -17,7 +17,7 @@ "react-router-dom": "6.24.1" }, "devDependencies": { - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-react": "^1.0.6", "@types/react": "^18.2.79", "@types/react-dom": "^18.3.0", diff --git a/apps/router-demo/router-remote3-2003/package.json b/apps/router-demo/router-remote3-2003/package.json index c9c5c86f307..d60df809f9b 100644 --- a/apps/router-demo/router-remote3-2003/package.json +++ b/apps/router-demo/router-remote3-2003/package.json @@ -14,7 +14,7 @@ "vue-router": "^4.4.5" }, "devDependencies": { - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-vue": "^1.0.3", "@vue/tsconfig": "^0.5.1", "tailwindcss": "^3.4.3", diff --git a/apps/router-demo/router-remote4-2004/package.json b/apps/router-demo/router-remote4-2004/package.json index 3667976e4a8..da5fcd1e30d 100644 --- a/apps/router-demo/router-remote4-2004/package.json +++ b/apps/router-demo/router-remote4-2004/package.json @@ -17,7 +17,7 @@ "react-router-dom": "6.24.1" }, "devDependencies": { - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-react": "^1.0.6", "@types/react": "^18.2.79", "@types/react-dom": "^18.3.0", diff --git a/apps/router-demo/router-remote5-2005/package.json b/apps/router-demo/router-remote5-2005/package.json index be345437835..218bf68def4 100644 --- a/apps/router-demo/router-remote5-2005/package.json +++ b/apps/router-demo/router-remote5-2005/package.json @@ -17,7 +17,7 @@ "react-router-dom": "6.24.1" }, "devDependencies": { - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-react": "^1.0.6", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", diff --git a/apps/rslib-module/package.json b/apps/rslib-module/package.json index b17a32e469d..1b1cdaac4c5 100644 --- a/apps/rslib-module/package.json +++ b/apps/rslib-module/package.json @@ -23,14 +23,14 @@ "@module-federation/rsbuild-plugin": "workspace:*", "@module-federation/storybook-addon": "workspace:*", "@rsbuild/plugin-react": "^1.0.6", - "@rslib/core": "0.2.0", + "@rslib/core": "^0.9.0", "@types/react": "^18.3.11", "http-server": "^14.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", "storybook": "^8.3.6", - "storybook-react-rsbuild": "^0.1.5", - "storybook-addon-rslib": "^0.1.4" + "storybook-react-rsbuild": "^1.0.1", + "storybook-addon-rslib": "^1.0.1" }, "peerDependencies": { "react": "*" diff --git a/apps/runtime-demo/3008-runtime-remote/package.json b/apps/runtime-demo/3008-runtime-remote/package.json index b3863efdd0a..ec1aa05684b 100644 --- a/apps/runtime-demo/3008-runtime-remote/package.json +++ b/apps/runtime-demo/3008-runtime-remote/package.json @@ -13,7 +13,7 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-react": "^1.0.6" } } diff --git a/apps/website-new/docs/en/guide/basic/rsbuild.mdx b/apps/website-new/docs/en/guide/basic/rsbuild.mdx index 58df77a26ef..7b95cc1d410 100644 --- a/apps/website-new/docs/en/guide/basic/rsbuild.mdx +++ b/apps/website-new/docs/en/guide/basic/rsbuild.mdx @@ -83,3 +83,60 @@ export default defineConfig({ ### Note If you need to use the Module Federation runtime capabilities, please install [@module-federation/enhanced](/en/guide/basic/runtime.html) + +## Configuration + +* Type: + +```ts +export declare const pluginModuleFederation: (moduleFederationOptions: ModuleFederationOptions, rsbuildOptions?: RSBUILD_PLUGIN_OPTIONS) => RsbuildPlugin; + +type RSBUILD_PLUGIN_OPTIONS = { + ssr?: boolean; +} +``` + +### moduleFederationOptions + +[Module Federation Configuration](../../configure/index) + +### rsbuildOptions + +Additional configuration for the Rsbuild plugin. + + +#### ssr + +:::tip +Only supports Rslib global plugins. +::: + +* Type: `boolean` +* Default: `false` + + +Enables the generation of SSR artifacts. + +**Example:** + +First, create an Rslib project using `npm create module-federation@next`: + +```bash +# Here, three parameters (template, role, name) are passed. You can also run npm create module-federation@latest directly and follow the prompts. +npm create module-federation@next -- --template provider-rslib --role provider --name rslib_ssr_provider +``` + +Then, modify the `rslib.config.ts` configuration to add `ssr:true`: +```diff title='rslib.config.ts' +- plugins: [pluginReact(), pluginModuleFederation(moduleFederationConfig)], ++ plugins: [pluginReact(), pluginModuleFederation(moduleFederationConfig, { ssr: true })], +``` + +Install dependencies and start the project: +```bash +pnpm install +pnpm run mf-dev +``` +This will generate a `dist/mf/ssr` directory containing the SSR artifacts. + +Then, refer to the [Create a Modern.js Consumer](../../practice/frameworks/modern/index) section to create a consumer, reference the Rslib SSR provider, and then start project development. diff --git a/apps/website-new/docs/en/guide/framework/modernjs.mdx b/apps/website-new/docs/en/guide/framework/modernjs.mdx index 78c34010d0a..ef2f2fb1787 100644 --- a/apps/website-new/docs/en/guide/framework/modernjs.mdx +++ b/apps/website-new/docs/en/guide/framework/modernjs.mdx @@ -120,7 +120,7 @@ const { createRemoteSSRComponent } = kit; const RemoteSSRComponent = createRemoteSSRComponent({ // The remote declared in the build plug-in can also be loaded using this function: loader: () => import('remote/Image'), - loader: () => loadRemote('dynamic_remote/Image'), + loader: () => loadRemote('dynamic_remote'), loading:
loading...
, fallback: ({ error }) => { if (error instanceof Error && error.message.includes('not exist')) { diff --git a/apps/website-new/docs/zh/guide/basic/rsbuild.mdx b/apps/website-new/docs/zh/guide/basic/rsbuild.mdx index 3d1574c6d97..fe3fa60b293 100644 --- a/apps/website-new/docs/zh/guide/basic/rsbuild.mdx +++ b/apps/website-new/docs/zh/guide/basic/rsbuild.mdx @@ -83,3 +83,59 @@ export default defineConfig({ ### 注意 如果需要使用 Module Federation 运行时能力,请安装 [@module-federation/enhanced](/zh/guide/basic/runtime.html) + +## 配置 + +* 类型: + +```ts +export declare const pluginModuleFederation: (moduleFederationOptions: ModuleFederationOptions, rsbuildOptions?: RSBUILD_PLUGIN_OPTIONS) => RsbuildPlugin; + +type RSBUILD_PLUGIN_OPTIONS = { + ssr?: boolean; +} +``` + +### moduleFederationOptions + +[Module Federation 配置项](../../configure/index) + +### rsbuildOptions + +Rsbuild 插件额外配置。 + +#### ssr + +:::tip +仅支持 Rslib 全局插件。 +::: + +* 类型:`boolean` +* 默认值:`false` + + +开启后可以生成 SSR 产物。 + +**示例:** + +先通过 `npm create module-federation@next` 创建 Rslib 项目: + +```bash +# 这里传递了 template role name 三个参数,你也可以直接执行 npm create module-federation@latest ,然后根据提示进行选择 +npm create module-federation@next -- --template provider-rslib --role provider --name rslib_ssr_provider +``` + +然后修改 `rslib.config.ts` 配置,增加 `ssr:true` : +```diff title='rslib.config.ts' +- plugins: [pluginReact(), pluginModuleFederation(moduleFederationConfig)], ++ plugins: [pluginReact(), pluginModuleFederation(moduleFederationConfig, { ssr: true })], +``` + +安装依赖,并启动项目: +```bash +pnpm install +pnpm run mf-dev +``` +此时会生成 `dist/mf/ssr` 目录,里面包含了 SSR 产物。 + +然后参考[创建 Modern.js 消费者](../../practice/frameworks/modern/index) 章节,创建消费者,并引用 Rslib SSR 生产者,随后启动项目开发。 diff --git a/apps/website-new/docs/zh/guide/framework/modernjs.mdx b/apps/website-new/docs/zh/guide/framework/modernjs.mdx index 18bf324805e..ee9de49da91 100644 --- a/apps/website-new/docs/zh/guide/framework/modernjs.mdx +++ b/apps/website-new/docs/zh/guide/framework/modernjs.mdx @@ -126,7 +126,7 @@ const { createRemoteSSRComponent } = kit; const RemoteSSRComponent = createRemoteSSRComponent({ // 在构建插件声明过的 remote 也可以使用此函数加载:loader: () => import('remote/Image'), - loader: () => loadRemote('dynamic_remote/Image'), + loader: () => loadRemote('dynamic_remote'), loading:
loading...
, fallback: ({ error }) => { if (error instanceof Error && error.message.includes('not exist')) { diff --git a/package.json b/package.json index d0110b108a9..4e2f9b093c3 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "app:manifest:dev": "NX_TUI=false nx run-many --target=serve --configuration=development --parallel=100 -p modernjs,manifest-webpack-host,3009-webpack-provider,3010-rspack-provider,3011-rspack-manifest-provider,3012-rspack-js-entry-provider", "app:manifest:prod": "NX_TUI=false nx run-many --target=serve --configuration=production --parallel=100 -p modernjs,manifest-webpack-host,3009-webpack-provider,3010-rspack-provider,3011-rspack-manifest-provider,3012-rspack-js-entry-provider", "app:ts:dev": "nx run-many --target=serve -p react_ts_host,react_ts_nested_remote,react_ts_remote", - "app:modern:dev": "nx run-many --target=serve --parallel=10 --configuration=development -p modernjs-ssr-dynamic-nested-remote,modernjs-ssr-dynamic-remote,modernjs-ssr-dynamic-remote-new-version,modernjs-ssr-host,modernjs-ssr-nested-remote,modernjs-ssr-remote,modernjs-ssr-remote-new-version", + "app:modern:dev": "NX_TUI=false nx run-many --target=serve --parallel=10 --configuration=development -p modernjs-ssr-dynamic-nested-remote,modernjs-ssr-dynamic-remote,modernjs-ssr-dynamic-remote-new-version,modernjs-ssr-host,modernjs-ssr-nested-remote,modernjs-ssr-remote,modernjs-ssr-remote-new-version", "commitlint": "commitlint --edit", "prepare": "husky install", "changeset": "changeset", diff --git a/packages/create-module-federation/package.json b/packages/create-module-federation/package.json index 8f29c2b892d..eea80ccdc54 100644 --- a/packages/create-module-federation/package.json +++ b/packages/create-module-federation/package.json @@ -41,7 +41,7 @@ "@types/glob": "7.2.0", "@types/minimist": "^1.2.5", "@types/fs-extra": "9.0.6", - "@rslib/core": "^0.3.1", + "@rslib/core": "^0.9.0", "rsbuild-plugin-publint": "^0.2.1" } } diff --git a/packages/create-module-federation/templates/provider-rslib-storybook-ts/package.json.handlebars b/packages/create-module-federation/templates/provider-rslib-storybook-ts/package.json.handlebars index bb66ed78102..5793a0cadc9 100644 --- a/packages/create-module-federation/templates/provider-rslib-storybook-ts/package.json.handlebars +++ b/packages/create-module-federation/templates/provider-rslib-storybook-ts/package.json.handlebars @@ -21,9 +21,9 @@ "mf-dev": "rslib mf-dev" }, "devDependencies": { - "@rsbuild/core": "^1.2.15", - "@rsbuild/plugin-react": "^1.1.1", - "@rslib/core": ">=0.5.3", + "@rsbuild/core": "^1.3.22", + "@rsbuild/plugin-react": "^1.3.1", + "@rslib/core": ">=0.9.0", "@storybook/addon-essentials": "^8.4.7", "@storybook/addon-interactions": "^8.4.7", "@storybook/addon-links": "^8.4.7", @@ -36,8 +36,8 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "storybook": "^8.4.7", - "storybook-addon-rslib": "^0.1.7", - "storybook-react-rsbuild": "^0.1.7", + "storybook-addon-rslib": "^1.0.1", + "storybook-react-rsbuild": "^1.0.1", "typescript": "^5.7.3", "@types/node": "^22.13.9", "@module-federation/rsbuild-plugin":"^{{mfVersion}}", diff --git a/packages/create-module-federation/templates/provider-rslib-ts/package.json.handlebars b/packages/create-module-federation/templates/provider-rslib-ts/package.json.handlebars index 4c7c52ee9ce..74984eb81d1 100644 --- a/packages/create-module-federation/templates/provider-rslib-ts/package.json.handlebars +++ b/packages/create-module-federation/templates/provider-rslib-ts/package.json.handlebars @@ -19,9 +19,9 @@ "mf-dev": "rslib mf-dev" }, "devDependencies": { - "@rsbuild/core": "^1.2.15", + "@rsbuild/core": "^1.3.21", "@rsbuild/plugin-react": "^1.1.1", - "@rslib/core": ">=0.5.3", + "@rslib/core": ">=0.9.0", "@types/react": "^18.3.11", "react": "^18.3.1", "typescript": "^5.7.3", diff --git a/packages/manifest/src/ManifestManager.ts b/packages/manifest/src/ManifestManager.ts index 4134b2c3947..f86c4734cc5 100644 --- a/packages/manifest/src/ManifestManager.ts +++ b/packages/manifest/src/ManifestManager.ts @@ -131,7 +131,12 @@ class ManifestManager { ); } - if (isDev()) { + if ( + isDev() && + (process.env['MF_SSR_PRJ'] + ? compiler.options.target !== 'async-node' + : true) + ) { logger.info( `Manifest Link: ${chalk.cyan( `${ diff --git a/packages/modernjs/package.json b/packages/modernjs/package.json index 750eab11225..288e1ba22df 100644 --- a/packages/modernjs/package.json +++ b/packages/modernjs/package.json @@ -107,7 +107,7 @@ "react-error-boundary": "4.1.2" }, "devDependencies": { - "@rsbuild/core": "1.2.8", + "@rsbuild/core": "1.3.21", "@modern-js/app-tools": "2.67.6", "@modern-js/server-runtime": "2.67.6", "@modern-js/module-tools": "2.67.6", diff --git a/packages/modernjs/src/cli/configPlugin.ts b/packages/modernjs/src/cli/configPlugin.ts index be12e81e6f0..18b7e1e93bc 100644 --- a/packages/modernjs/src/cli/configPlugin.ts +++ b/packages/modernjs/src/cli/configPlugin.ts @@ -386,7 +386,6 @@ export const moduleFederationConfigPlugin = ( return; } const isWeb = isWebTarget(target); - // @ts-expect-error chain type is not correct addMyTypes2Ignored(chain, !isWeb ? ssrConfig : csrConfig); const targetMFConfig = !isWeb ? ssrConfig : csrConfig; @@ -398,7 +397,6 @@ export const moduleFederationConfigPlugin = ( ); patchBundlerConfig({ - // @ts-expect-error chain type is not correct chain, isServer: !isWeb, modernjsConfig, diff --git a/packages/modernjs/src/cli/ssrPlugin.ts b/packages/modernjs/src/cli/ssrPlugin.ts index b108b9ea77e..482b6c105ad 100644 --- a/packages/modernjs/src/cli/ssrPlugin.ts +++ b/packages/modernjs/src/cli/ssrPlugin.ts @@ -3,7 +3,7 @@ import fs from 'fs-extra'; import { ModuleFederationPlugin } from '@module-federation/enhanced/webpack'; import { ModuleFederationPlugin as RspackModuleFederationPlugin } from '@module-federation/enhanced/rspack'; import UniverseEntryChunkTrackerPlugin from '@module-federation/node/universe-entry-chunk-tracker-plugin'; -import { updateStatsAndManifest } from './manifest'; +import { updateStatsAndManifest } from '@module-federation/rsbuild-plugin/manifest'; import { isDev } from './constant'; import logger from './logger'; import { isWebTarget, skipByTarget } from './utils'; diff --git a/packages/rsbuild-plugin/package.json b/packages/rsbuild-plugin/package.json index e2980f4ce8c..3261b7c8ad9 100644 --- a/packages/rsbuild-plugin/package.json +++ b/packages/rsbuild-plugin/package.json @@ -22,6 +22,11 @@ "types": "./dist/utils.cjs.d.ts", "import": "./dist/utils.esm.js", "require": "./dist/utils.cjs.js" + }, + "./manifest": { + "types": "./dist/manifest.cjs.d.ts", + "import": "./dist/manifest.esm.js", + "require": "./dist/manifest.cjs.js" } }, "main": "./dist/index.cjs.js", @@ -33,6 +38,9 @@ ], "utils": [ "./dist/utils.cjs.d.ts" + ], + "manifest": [ + "./dist/manifest.cjs.d.ts" ] } }, @@ -40,14 +48,16 @@ "dist" ], "dependencies": { + "fs-extra": "11.3.0", "@module-federation/sdk": "workspace:*", - "@module-federation/enhanced": "workspace:*" + "@module-federation/enhanced": "workspace:*", + "@module-federation/node": "workspace:*" }, "devDependencies": { - "@rsbuild/core": "^1.3.17" + "@rsbuild/core": "^1.3.21" }, "peerDependencies": { - "@rsbuild/core": "1.x" + "@rsbuild/core": "^1.3.21" }, "peerDependenciesMeta": { "@rsbuild/core": { diff --git a/packages/rsbuild-plugin/rollup.config.js b/packages/rsbuild-plugin/rollup.config.js index f5b204786dc..422537e4ada 100644 --- a/packages/rsbuild-plugin/rollup.config.js +++ b/packages/rsbuild-plugin/rollup.config.js @@ -14,6 +14,7 @@ module.exports = (rollupConfig, _projectOptions) => { rollupConfig.input = { index: 'packages/rsbuild-plugin/src/cli/index.ts', utils: 'packages/rsbuild-plugin/src/utils/index.ts', + manifest: 'packages/rsbuild-plugin/src/cli/manifest.ts', }; return rollupConfig; }; diff --git a/packages/rsbuild-plugin/src/cli/index.ts b/packages/rsbuild-plugin/src/cli/index.ts index a034c45af1d..90b90c17436 100644 --- a/packages/rsbuild-plugin/src/cli/index.ts +++ b/packages/rsbuild-plugin/src/cli/index.ts @@ -4,34 +4,51 @@ import { PLUGIN_NAME, } from '@module-federation/enhanced/rspack'; import { isRequiredVersion } from '@module-federation/sdk'; - import { isRegExp, autoDeleteSplitChunkCacheGroups } from '../utils/index'; import pkgJson from '../../package.json'; +import logger from '../logger'; +import { + createSSRMFConfig, + createSSRREnvConfig, + setSSREnv, + SSR_ENV_NAME, + SSR_DIR, +} from './ssr'; +import { updateStatsAndManifest } from './manifest'; import type { moduleFederationPlugin, sharePlugin, } from '@module-federation/sdk'; import type { RsbuildConfig, RsbuildPlugin, Rspack } from '@rsbuild/core'; -import logger from '../logger'; type ModuleFederationOptions = moduleFederationPlugin.ModuleFederationPluginOptions; -export type { ModuleFederationOptions }; +type RSBUILD_PLUGIN_OPTIONS = { + ssr?: boolean; +}; + +type ExposedAPIType = { + options: { + nodePlugin?: ModuleFederationPlugin; + browserPlugin?: ModuleFederationPlugin; + distOutputDir?: string; + }; + isSSRConfig: typeof isSSRConfig; +}; +export type { ModuleFederationOptions, ExposedAPIType }; const RSBUILD_PLUGIN_MODULE_FEDERATION_NAME = 'rsbuild:module-federation-enhanced'; -const RSPACK_PLUGIN_MODULE_FEDERATION_NAME = 'module-federation'; +const RSBUILD_PLUGIN_NAME = '@module-federation/rsbuild-plugin'; -export { - RSBUILD_PLUGIN_MODULE_FEDERATION_NAME, - RSPACK_PLUGIN_MODULE_FEDERATION_NAME, - PLUGIN_NAME, -}; +export { RSBUILD_PLUGIN_MODULE_FEDERATION_NAME, PLUGIN_NAME, SSR_DIR }; const LIB_FORMAT = ['umd', 'modern-module']; +const DEFAULT_MF_ENVIRONMENT_NAME = 'mf'; + function isStoryBook(rsbuildConfig: RsbuildConfig) { if ( rsbuildConfig.plugins?.find( @@ -45,6 +62,9 @@ function isStoryBook(rsbuildConfig: RsbuildConfig) { export function isMFFormat(bundlerConfig: Rspack.Configuration) { const library = bundlerConfig.output?.library; + if (bundlerConfig.name === SSR_ENV_NAME) { + return true; + } return !( typeof library === 'object' && @@ -55,11 +75,47 @@ export function isMFFormat(bundlerConfig: Rspack.Configuration) { ); } +const isSSRConfig = (bundlerConfigName?: string) => + Boolean(bundlerConfigName === SSR_ENV_NAME); + export const pluginModuleFederation = ( moduleFederationOptions: ModuleFederationOptions, + rsbuildOptions?: RSBUILD_PLUGIN_OPTIONS, ): RsbuildPlugin => ({ name: RSBUILD_PLUGIN_MODULE_FEDERATION_NAME, setup: (api) => { + const { callerName } = api.context; + const originalRsbuildConfig = api.getRsbuildConfig(); + if (!callerName) { + throw new Error( + '`callerName` is undefined. Please ensure the @rsbuild/core version is higher than 1.3.21 .', + ); + } + const isRslib = callerName === 'rslib'; + const isSSR = Boolean(rsbuildOptions?.ssr); + + if (isSSR && !isStoryBook(originalRsbuildConfig)) { + if (!isRslib) { + throw new Error(`'ssr' option is only supported in rslib.`); + } + const rsbuildConfig = api.getRsbuildConfig(); + + if ( + !rsbuildConfig.environments?.[DEFAULT_MF_ENVIRONMENT_NAME] || + Object.keys(rsbuildConfig.environments).some( + (key) => + key.startsWith(DEFAULT_MF_ENVIRONMENT_NAME) && + key !== DEFAULT_MF_ENVIRONMENT_NAME, + ) + ) { + throw new Error( + `Please set ${RSBUILD_PLUGIN_NAME} as global plugin in rslib.config.ts if you set 'ssr:true' .`, + ); + } + + setSSREnv(); + } + const sharedOptions: [string, sharePlugin.SharedConfig][] = parseOptions( moduleFederationOptions.shared || [], (item, key) => { @@ -83,6 +139,91 @@ export const pluginModuleFederation = ( shared[0].endsWith('/') ? shared[0].slice(0, -1) : shared[0], ); + api.modifyRsbuildConfig((config) => { + // skip storybook + if (isStoryBook(config)) { + return; + } + + // Change some default configs for remote modules + if (moduleFederationOptions.exposes) { + config.dev ||= {}; + config.server ||= {}; + const userConfig = api.getRsbuildConfig('original'); + + // Allow remote modules to be loaded by setting CORS headers + // This is required for MF to work properly across different origins + config.server.headers ||= {}; + if ( + !config.server.headers['Access-Control-Allow-Origin'] && + !( + typeof userConfig.server?.cors === 'object' && + userConfig.server.cors.origin + ) + ) { + const corsWarnMsgs = [ + 'Detect that CORS options are not set, mf Rsbuild plugin will add default cors header: server.headers["Access-Control-Allow-Headers"] = "*". It is recommended to specify an allowlist of trusted origins in "server.cors" instead.', + 'View https://module-federation.io/guide/troubleshooting/other.html#cors-warn for more details.', + ]; + + !isRslib && logger.warn(corsWarnMsgs.join('\n')); + config.server.headers['Access-Control-Allow-Origin'] = '*'; + } + + // For remote modules, Rsbuild should send the ws request to the provider's dev server. + // This allows the provider to do HMR when the provider module is loaded in the consumer's page. + if (config.server?.port && !config.dev.client?.port) { + config.dev.client ||= {}; + config.dev.client.port = config.server.port; + } + + // Change the default assetPrefix to `true` for remote modules. + // This ensures that the remote module's assets can be requested by consumer apps with the correct URL. + const originalConfig = api.getRsbuildConfig('original'); + if ( + originalConfig.dev?.assetPrefix === undefined && + config.dev.assetPrefix === config.server?.base + ) { + config.dev.assetPrefix = true; + } + } + + if (isSSR) { + if (config.environments?.[SSR_ENV_NAME]) { + throw new Error( + `'${SSR_ENV_NAME}' environment is already defined. Please use another name.`, + ); + } + config.environments![SSR_ENV_NAME] = createSSRREnvConfig( + config.environments?.[DEFAULT_MF_ENVIRONMENT_NAME]!, + moduleFederationOptions, + ); + } + }); + + api.modifyEnvironmentConfig((config) => { + // Module Federation runtime uses ES6+ syntax, + // adding to include and let SWC transform it + config.source.include = [ + ...(config.source.include || []), + /@module-federation[\\/]/, + ]; + + return config; + }); + + const generateMergedStatsAndManifestOptions: ExposedAPIType = { + options: { + nodePlugin: undefined, + browserPlugin: undefined, + distOutputDir: undefined, + }, + isSSRConfig, + }; + api.expose( + RSBUILD_PLUGIN_MODULE_FEDERATION_NAME, + generateMergedStatsAndManifestOptions, + ); api.onBeforeCreateCompiler(({ bundlerConfigs }) => { if (!bundlerConfigs) { throw new Error('Can not get bundlerConfigs!'); @@ -90,7 +231,7 @@ export const pluginModuleFederation = ( bundlerConfigs.forEach((bundlerConfig) => { if (!isMFFormat(bundlerConfig)) { return; - } else if (isStoryBook(api.getRsbuildConfig())) { + } else if (isStoryBook(originalRsbuildConfig)) { bundlerConfig.output!.uniqueName = `${moduleFederationOptions.name}-storybook-host`; } else { // mf @@ -99,6 +240,7 @@ export const pluginModuleFederation = ( bundlerConfig?.optimization?.splitChunks, ); + delete bundlerConfig.optimization?.runtimeChunk; const externals = bundlerConfig.externals; if (Array.isArray(externals)) { const sharedModules = new Set(); @@ -148,8 +290,12 @@ export const pluginModuleFederation = ( } } - if (!bundlerConfig.output?.chunkLoadingGlobal) { + if ( + !bundlerConfig.output?.chunkLoadingGlobal && + !isSSRConfig(bundlerConfig.name) + ) { bundlerConfig.output!.chunkLoading = 'jsonp'; + bundlerConfig.output!.chunkLoadingGlobal = `chunk_${moduleFederationOptions.name}`; } // `uniqueName` is required for react refresh to work @@ -160,73 +306,43 @@ export const pluginModuleFederation = ( if ( !bundlerConfig.plugins!.find((p) => p && p.name === PLUGIN_NAME) ) { + if (isSSRConfig(bundlerConfig.name)) { + generateMergedStatsAndManifestOptions.options.nodePlugin = + new ModuleFederationPlugin( + createSSRMFConfig(moduleFederationOptions), + ); + bundlerConfig.plugins!.push( + generateMergedStatsAndManifestOptions.options.nodePlugin, + ); + return; + } + generateMergedStatsAndManifestOptions.options.browserPlugin = + new ModuleFederationPlugin(moduleFederationOptions); + generateMergedStatsAndManifestOptions.options.distOutputDir = + bundlerConfig.output?.path || ''; bundlerConfig.plugins!.push( - new ModuleFederationPlugin(moduleFederationOptions), + generateMergedStatsAndManifestOptions.options.browserPlugin, ); } } }); }); - // dev config only works on format: 'mf' - api.modifyRsbuildConfig((config) => { - // skip storybook - if (isStoryBook(config)) { + const generateMergedStatsAndManifest = () => { + const { nodePlugin, browserPlugin, distOutputDir } = + generateMergedStatsAndManifestOptions.options; + if (!nodePlugin || !browserPlugin || !distOutputDir) { return; } - // Change some default configs for remote modules - if (moduleFederationOptions.exposes) { - config.dev ||= {}; - config.server ||= {}; - const userConfig = api.getRsbuildConfig('original'); - - // Allow remote modules to be loaded by setting CORS headers - // This is required for MF to work properly across different origins - config.server.headers ||= {}; - if ( - !config.server.headers['Access-Control-Allow-Origin'] && - !( - typeof userConfig.server?.cors === 'object' && - userConfig.server.cors.origin - ) - ) { - const corsWarnMsgs = [ - 'Detect that CORS options are not set, mf Rsbuild plugin will add default cors header: server.headers["Access-Control-Allow-Headers"] = "*". It is recommended to specify an allowlist of trusted origins in "server.cors" instead.', - 'View https://module-federation.io/guide/troubleshooting/other.html#cors-warn for more details.', - ]; - - logger.warn(corsWarnMsgs.join('\n')); - config.server.headers['Access-Control-Allow-Origin'] = '*'; - } + updateStatsAndManifest(nodePlugin, browserPlugin, distOutputDir); + }; - // For remote modules, Rsbuild should send the ws request to the provider's dev server. - // This allows the provider to do HMR when the provider module is loaded in the consumer's page. - if (config.server?.port && !config.dev.client?.port) { - config.dev.client ||= {}; - config.dev.client.port = config.server.port; - } - - // Change the default assetPrefix to `true` for remote modules. - // This ensures that the remote module's assets can be requested by consumer apps with the correct URL. - const originalConfig = api.getRsbuildConfig('original'); - if ( - originalConfig.dev?.assetPrefix === undefined && - config.dev.assetPrefix === config.server?.base - ) { - config.dev.assetPrefix = true; - } - } + api.onDevCompileDone(() => { + generateMergedStatsAndManifest(); }); - api.modifyEnvironmentConfig((config) => { - // Module Federation runtime uses ES6+ syntax, - // adding to include and let SWC transform it - config.source.include = [ - ...(config.source.include || []), - /@module-federation[\\/]/, - ]; - - return config; + api.onAfterBuild(() => { + generateMergedStatsAndManifest(); }); }, }); diff --git a/packages/modernjs/src/cli/manifest.ts b/packages/rsbuild-plugin/src/cli/manifest.ts similarity index 89% rename from packages/modernjs/src/cli/manifest.ts rename to packages/rsbuild-plugin/src/cli/manifest.ts index eed85433fba..d4836e16a2a 100644 --- a/packages/modernjs/src/cli/manifest.ts +++ b/packages/rsbuild-plugin/src/cli/manifest.ts @@ -1,7 +1,12 @@ import path from 'path'; import { Stats, Manifest } from '@module-federation/sdk'; import fs from 'fs-extra'; -import { BundlerPlugin } from '../types'; +import type { ModuleFederationPlugin as WebpackModuleFederationPlugin } from '@module-federation/enhanced'; +import type { ModuleFederationPlugin as RspackModuleFederationPlugin } from '@module-federation/enhanced/rspack'; + +type BundlerPlugin = + | WebpackModuleFederationPlugin + | RspackModuleFederationPlugin; function mergeStats(browserStats: Stats, nodeStats: Stats): Stats { const ssrRemoteEntry = nodeStats.metaData.remoteEntry; diff --git a/packages/rsbuild-plugin/src/cli/ssr.spec.ts b/packages/rsbuild-plugin/src/cli/ssr.spec.ts new file mode 100644 index 00000000000..2a399461e4e --- /dev/null +++ b/packages/rsbuild-plugin/src/cli/ssr.spec.ts @@ -0,0 +1,205 @@ +import { describe, it, expect, vi } from 'vitest'; +import { createSSRMFConfig, patchSSRRspackConfig, SSR_DIR } from './ssr'; // Assuming SSR_DIR is exported or mockable +import type { Rspack } from '@rsbuild/core'; +import type { moduleFederationPlugin } from '@module-federation/sdk'; + +describe('createSSRMFConfig', () => { + const baseMFConfig: moduleFederationPlugin.ModuleFederationPluginOptions = { + name: 'testApp', + }; + + it('should correctly transform basic mfConfig for SSR', () => { + const ssrMFConfig = createSSRMFConfig(baseMFConfig); + expect(ssrMFConfig.name).toBe('testApp'); + expect(ssrMFConfig.library?.type).toBe('commonjs-module'); + expect(ssrMFConfig.dts).toBe(false); + expect(ssrMFConfig.dev).toBe(false); + expect(ssrMFConfig.runtimePlugins).toEqual([ + require.resolve('@module-federation/node/runtimePlugin'), + ]); + }); + + it('should preserve library.type if already defined', () => { + const mfConfigWithLibraryType: moduleFederationPlugin.ModuleFederationPluginOptions = + { + ...baseMFConfig, + library: { + name: 'testApp', + type: 'umd', + }, + }; + const ssrMFConfig = createSSRMFConfig(mfConfigWithLibraryType); + expect(ssrMFConfig.library?.type).toBe('umd'); + }); + + it('should add record-dynamic-remote-entry-hash-plugin in development', () => { + const originalNodeEnv = process.env.NODE_ENV; + process.env.NODE_ENV = 'development'; + const ssrMFConfig = createSSRMFConfig(baseMFConfig); + expect(ssrMFConfig.runtimePlugins).toContain( + require.resolve('@module-federation/node/runtimePlugin'), + ); + expect(ssrMFConfig.runtimePlugins).toContain( + require.resolve( + '@module-federation/node/record-dynamic-remote-entry-hash-plugin', + ), + ); + process.env.NODE_ENV = originalNodeEnv; // Restore original NODE_ENV + }); + + it('should not add record-dynamic-remote-entry-hash-plugin in production', () => { + const originalNodeEnv = process.env.NODE_ENV; + process.env.NODE_ENV = 'production'; + const ssrMFConfig = createSSRMFConfig(baseMFConfig); + expect(ssrMFConfig.runtimePlugins).toEqual([ + require.resolve('@module-federation/node/runtimePlugin'), + ]); + process.env.NODE_ENV = originalNodeEnv; // Restore original NODE_ENV + }); + + it('should initialize runtimePlugins if it is undefined', () => { + const mfConfigWithoutRuntimePlugins: moduleFederationPlugin.ModuleFederationPluginOptions = + { + name: 'testApp', + runtimePlugins: undefined, + }; + const ssrMFConfig = createSSRMFConfig(mfConfigWithoutRuntimePlugins); + expect(ssrMFConfig.runtimePlugins).toEqual([ + require.resolve('@module-federation/node/runtimePlugin'), + ]); + }); +}); + +describe('patchSSRRspackConfig', () => { + const baseConfig: Rspack.Configuration = { + output: { + publicPath: '/test/', + chunkFilename: 'chunks/[name].js', + }, + plugins: [], + }; + + const baseMfConfig: moduleFederationPlugin.ModuleFederationPluginOptions = { + name: 'testApp', + }; + + it('should throw error if publicPath is not a string', () => { + const config = JSON.parse(JSON.stringify(baseConfig)); + config.output.publicPath = undefined; + expect(() => patchSSRRspackConfig(config, baseMfConfig)).toThrow( + 'publicPath must be string!', + ); + }); + + it('should throw error if publicPath is "auto"', () => { + const config = JSON.parse(JSON.stringify(baseConfig)); + config.output.publicPath = 'auto'; + expect(() => patchSSRRspackConfig(config, baseMfConfig)).toThrow( + 'publicPath can not be "auto"!', + ); + }); + + it('should update publicPath correctly', () => { + const config = JSON.parse(JSON.stringify(baseConfig)); + const patchedConfig = patchSSRRspackConfig(config, baseMfConfig); + expect(patchedConfig.output?.publicPath).toBe(`/test/${SSR_DIR}/`); + }); + + it('should set target to async-node', () => { + const config = JSON.parse(JSON.stringify(baseConfig)); + const patchedConfig = patchSSRRspackConfig(config, baseMfConfig); + expect(patchedConfig.target).toBe('async-node'); + }); + + it('should add UniverseEntryChunkTrackerPlugin to plugins', () => { + const env = process.env.NODE_ENV; + process.env.NODE_ENV = 'development'; + const config = JSON.parse(JSON.stringify(baseConfig)); + const patchedConfig = patchSSRRspackConfig(config, baseMfConfig); + expect(patchedConfig.plugins).toHaveLength(1); + // @ts-expect-error default is a class + expect(patchedConfig.plugins?.[0].constructor.name).toBe( + 'UniverseEntryChunkTrackerPlugin', + ); + process.env.NODE_ENV = env; + }); + + describe('chunkFilename modification', () => { + it('should modify chunkFilename when conditions are met (uniqueName from mfConfig.name)', () => { + const config: Rspack.Configuration = { + output: { + publicPath: '/test/', + chunkFilename: 'js/[name].js', + }, + plugins: [], + }; + const mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions = { + name: 'myApp', + }; + const patchedConfig = patchSSRRspackConfig(config, mfConfig); + expect(patchedConfig.output?.chunkFilename).toBe( + 'js/[name]myApp-[chunkhash].js', + ); + }); + + it('should modify chunkFilename when conditions are met (uniqueName from config.output.uniqueName)', () => { + const config: Rspack.Configuration = { + output: { + publicPath: '/test/', + chunkFilename: 'js/[name].js', + uniqueName: 'myOutputUniqueName', + }, + plugins: [], + }; + const mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions = {}; // No name in mfConfig + const patchedConfig = patchSSRRspackConfig(config, mfConfig); + expect(patchedConfig.output?.chunkFilename).toBe( + 'js/[name]myOutputUniqueName-[chunkhash].js', + ); + }); + + it('should not modify chunkFilename if chunkFilename is not a string', () => { + const config: Rspack.Configuration = { + output: { + publicPath: '/test/', + chunkFilename: () => 'test.js', + }, + plugins: [], + }; + const mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions = { + name: 'myApp', + }; + const patchedConfig = patchSSRRspackConfig(config, mfConfig); + expect(typeof patchedConfig.output?.chunkFilename).toBe('function'); + }); + + it('should not modify chunkFilename if uniqueName is not present', () => { + const config: Rspack.Configuration = { + output: { + publicPath: '/test/', + chunkFilename: 'js/[name].js', + }, + plugins: [], + }; + const mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions = {}; // No name + const patchedConfig = patchSSRRspackConfig(config, mfConfig); + expect(patchedConfig.output?.chunkFilename).toBe('js/[name].js'); + }); + + it('should not modify chunkFilename if it already includes uniqueName', () => { + const config: Rspack.Configuration = { + output: { + publicPath: '/test/', + chunkFilename: 'js/myApp-[name].js', + uniqueName: 'myApp', + }, + plugins: [], + }; + const mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions = { + name: 'myApp', + }; + const patchedConfig = patchSSRRspackConfig(config, mfConfig); + expect(patchedConfig.output?.chunkFilename).toBe('js/myApp-[name].js'); + }); + }); +}); diff --git a/packages/rsbuild-plugin/src/cli/ssr.ts b/packages/rsbuild-plugin/src/cli/ssr.ts new file mode 100644 index 00000000000..58743767fcd --- /dev/null +++ b/packages/rsbuild-plugin/src/cli/ssr.ts @@ -0,0 +1,106 @@ +import path from 'path'; +import { encodeName } from '@module-federation/sdk'; +import type { EnvironmentConfig, Rspack } from '@rsbuild/core'; +import type { moduleFederationPlugin } from '@module-federation/sdk'; + +export const SSR_DIR = 'ssr'; +export const SSR_ENV_NAME = 'mf-ssr'; + +export function setSSREnv() { + process.env['MF_DISABLE_EMIT_STATS'] = 'true'; + process.env['MF_SSR_PRJ'] = 'true'; +} + +const isDev = () => { + return process.env.NODE_ENV === 'development'; +}; + +export function patchSSRRspackConfig( + config: Rspack.Configuration, + mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions, +) { + if (typeof config.output?.publicPath !== 'string') { + throw new Error('publicPath must be string!'); + } + const publicPath = config.output.publicPath; + if (publicPath === 'auto') { + throw new Error('publicPath can not be "auto"!'); + } + config.output.publicPath = `${config.output.publicPath}${SSR_DIR}/`; + config.target = 'async-node'; + // @module-federation/node/universe-entry-chunk-tracker-plugin only export cjs + const UniverseEntryChunkTrackerPlugin = + require('@module-federation/node/universe-entry-chunk-tracker-plugin').default; + config.plugins ||= []; + isDev() && config.plugins.push(new UniverseEntryChunkTrackerPlugin()); + + const uniqueName = mfConfig.name || config.output?.uniqueName; + const chunkFileName = config.output.chunkFilename; + if ( + typeof chunkFileName === 'string' && + uniqueName && + !chunkFileName.includes(uniqueName) + ) { + const suffix = `${encodeName(uniqueName)}-[chunkhash].js`; + config.output.chunkFilename = chunkFileName.replace('.js', suffix); + } + + return config; +} + +export function createSSRREnvConfig( + envConfig: EnvironmentConfig, + mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions, +) { + const ssrEnvConfig: EnvironmentConfig = { + ...envConfig, + tools: { + rspack: (config, { environment }) => { + if (environment.name !== SSR_ENV_NAME) { + return; + } + patchSSRRspackConfig(config, mfConfig); + }, + }, + }; + ssrEnvConfig.output = { + ...ssrEnvConfig.output, + // https://rsbuild.rs/config/output/target#other-targets + // Rsbuild not support all rspack targets, so modify to async-node in modifyRspackConfig + target: 'node', + distPath: { + ...ssrEnvConfig.output?.distPath, + root: path.join(ssrEnvConfig.output?.distPath?.root || '', SSR_DIR), + }, + }; + return ssrEnvConfig; +} + +export function createSSRMFConfig( + mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions, +) { + const ssrMFConfig = { + ...mfConfig, + library: { + ...mfConfig.library, + name: mfConfig.name, + type: mfConfig.library?.type ?? 'commonjs-module', + }, + dts: false, + dev: false, + }; + + ssrMFConfig.runtimePlugins ||= []; + ssrMFConfig.runtimePlugins.push( + require.resolve('@module-federation/node/runtimePlugin'), + ); + if (isDev()) { + ssrMFConfig.runtimePlugins.push( + require.resolve( + '@module-federation/node/record-dynamic-remote-entry-hash-plugin', + ), + ); + } + + return ssrMFConfig; +} diff --git a/packages/runtime-core/src/module/index.ts b/packages/runtime-core/src/module/index.ts index f13bd082f7f..8d700707d82 100644 --- a/packages/runtime-core/src/module/index.ts +++ b/packages/runtime-core/src/module/index.ts @@ -122,7 +122,8 @@ class Module { if (typeof remoteEntryExports?.init === 'undefined') { error( getShortErrorMsg(RUNTIME_002, runtimeDescMap, { - remoteName: name, + hostName: this.host.name, + remoteName: this.remoteInfo.name, remoteEntryUrl: this.remoteInfo.entry, remoteEntryKey: this.remoteInfo.entryGlobalName, }), diff --git a/packages/storybook-addon/package.json b/packages/storybook-addon/package.json index ea77bb27420..a0c827683f2 100644 --- a/packages/storybook-addon/package.json +++ b/packages/storybook-addon/package.json @@ -55,7 +55,7 @@ "devDependencies": { "jest-fixed-jsdom": "^0.0.9", "@module-federation/utilities": "workspace:*", - "@rsbuild/core": "^1.0.19", + "@rsbuild/core": "^1.3.21", "@storybook/node-logger": "7.6.20", "@storybook/core": "^8.4.6", "webpack": "5.94.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5edb798b54..43ce77b4f01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -895,62 +895,31 @@ importers: version: 5.0.4 apps/modernjs-ssr/dynamic-remote: - dependencies: - '@babel/runtime': - specifier: 7.26.0 - version: 7.26.0 - '@modern-js/runtime': - specifier: 2.67.6 - version: 2.67.6(react-dom@18.3.1)(react@18.3.1) - '@module-federation/modern-js': + devDependencies: + '@module-federation/enhanced': specifier: workspace:* - version: link:../../../packages/modernjs - antd: - specifier: 4.24.15 - version: 4.24.15(react-dom@18.3.1)(react@18.3.1) + version: link:../../../packages/enhanced + '@module-federation/rsbuild-plugin': + specifier: workspace:* + version: link:../../../packages/rsbuild-plugin + '@rsbuild/plugin-react': + specifier: ^1.3.1 + version: 1.3.1(@rsbuild/core@1.3.21) + '@rslib/core': + specifier: ^0.9.0 + version: 0.9.0(typescript@5.7.3) + '@types/react': + specifier: ^18.3.11 + version: 18.3.11 + http-server: + specifier: ^14.1.1 + version: 14.1.1 react: - specifier: ~18.3.1 + specifier: ^18.3.1 version: 18.3.1 react-dom: - specifier: ~18.3.1 + specifier: ^18.3.1 version: 18.3.1(react@18.3.1) - devDependencies: - '@modern-js-app/eslint-config': - specifier: 2.59.0 - version: 2.59.0(typescript@5.0.4) - '@modern-js/app-tools': - specifier: 2.67.6 - version: 2.67.6(@rspack/core@1.3.9)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) - '@modern-js/eslint-config': - specifier: 2.59.0 - version: 2.59.0(typescript@5.0.4) - '@modern-js/tsconfig': - specifier: 2.67.6 - version: 2.67.6 - '@types/jest': - specifier: ~29.5.0 - version: 29.5.13 - '@types/node': - specifier: ~16.11.7 - version: 16.11.68 - '@types/react': - specifier: ~18.2.0 - version: 18.2.79 - '@types/react-dom': - specifier: ~18.3.0 - version: 18.3.0 - lint-staged: - specifier: ~13.1.0 - version: 13.1.4 - prettier: - specifier: ~3.3.3 - version: 3.3.3 - rimraf: - specifier: ~6.0.1 - version: 6.0.1 - typescript: - specifier: ~5.0.4 - version: 5.0.4 apps/modernjs-ssr/dynamic-remote-new-version: dependencies: @@ -1170,7 +1139,7 @@ importers: version: 18.2.79 '@types/react-dom': specifier: ~18.3.0 - version: 18.3.0 + version: 18.3.7(@types/react@18.2.79) lint-staged: specifier: ~13.1.0 version: 13.1.4 @@ -1569,11 +1538,11 @@ importers: specifier: workspace:* version: link:../../../packages/rsbuild-plugin '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-react': specifier: ^1.0.6 - version: 1.0.6(@rsbuild/core@1.0.19) + version: 1.0.6(@rsbuild/core@1.3.21) '@types/react': specifier: ^18.2.79 version: 18.2.79 @@ -1618,11 +1587,11 @@ importers: specifier: workspace:* version: link:../../../packages/rsbuild-plugin '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-react': specifier: ^1.0.6 - version: 1.0.6(@rsbuild/core@1.0.19) + version: 1.0.6(@rsbuild/core@1.3.21) '@types/react': specifier: ^18.2.79 version: 18.2.79 @@ -1655,11 +1624,11 @@ importers: specifier: workspace:* version: link:../../../packages/rsbuild-plugin '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-vue': specifier: ^1.0.3 - version: 1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.25.0)(vue@3.5.10)(webpack-cli@5.1.4) + version: 1.0.3(@rsbuild/core@1.3.21)(@swc/core@1.7.26)(esbuild@0.25.0)(vue@3.5.10)(webpack-cli@5.1.4) tailwindcss: specifier: ^3.4.3 version: 3.4.3 @@ -1695,11 +1664,11 @@ importers: specifier: ^1.20.0 version: 1.21.1(react-dom@17.0.2)(react@17.0.2) '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-react': specifier: ^1.0.6 - version: 1.0.6(@rsbuild/core@1.0.19) + version: 1.0.6(@rsbuild/core@1.3.21) '@rsbuild/shared': specifier: ^0.7.10 version: 0.7.10(@swc/helpers@0.5.13) @@ -1741,11 +1710,11 @@ importers: version: 6.24.1(react-dom@18.3.1)(react@18.3.1) devDependencies: '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-react': specifier: ^1.0.6 - version: 1.0.6(@rsbuild/core@1.0.19) + version: 1.0.6(@rsbuild/core@1.3.21) '@types/react': specifier: ^18.2.79 version: 18.2.79 @@ -1772,11 +1741,11 @@ importers: version: 4.4.5(vue@3.5.10) devDependencies: '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-vue': specifier: ^1.0.3 - version: 1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.25.0)(vue@3.5.10)(webpack-cli@5.1.4) + version: 1.0.3(@rsbuild/core@1.3.21)(@swc/core@1.7.26)(esbuild@0.25.0)(vue@3.5.10)(webpack-cli@5.1.4) '@vue/tsconfig': specifier: ^0.5.1 version: 0.5.1 @@ -1815,11 +1784,11 @@ importers: version: 6.24.1(react-dom@18.3.1)(react@18.3.1) devDependencies: '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-react': specifier: ^1.0.6 - version: 1.0.6(@rsbuild/core@1.0.19) + version: 1.0.6(@rsbuild/core@1.3.21) '@types/react': specifier: ^18.2.79 version: 18.2.79 @@ -1855,11 +1824,11 @@ importers: version: 6.24.1(react-dom@19.0.0)(react@19.0.0) devDependencies: '@rsbuild/core': - specifier: ^1.0.19 - version: 1.2.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-react': specifier: ^1.0.6 - version: 1.1.0(@rsbuild/core@1.2.19) + version: 1.1.0(@rsbuild/core@1.3.21) '@types/react': specifier: ^19.0.0 version: 19.0.12 @@ -1883,10 +1852,10 @@ importers: version: link:../../packages/storybook-addon '@rsbuild/plugin-react': specifier: ^1.0.6 - version: 1.0.6(@rsbuild/core@1.3.20) + version: 1.0.6(@rsbuild/core@1.3.21) '@rslib/core': - specifier: 0.2.0 - version: 0.2.0(typescript@5.7.3) + specifier: ^0.9.0 + version: 0.9.0(typescript@5.7.3) '@types/react': specifier: ^18.3.11 version: 18.3.11 @@ -1903,11 +1872,11 @@ importers: specifier: ^8.3.6 version: 8.4.2(prettier@3.3.3) storybook-addon-rslib: - specifier: ^0.1.4 - version: 0.1.4(@rsbuild/core@1.3.20)(@rslib/core@0.2.0)(storybook-builder-rsbuild@1.0.1)(typescript@5.7.3) + specifier: ^1.0.1 + version: 1.0.1(@rsbuild/core@1.3.21)(@rslib/core@0.9.0)(storybook-builder-rsbuild@1.0.1)(typescript@5.7.3) storybook-react-rsbuild: - specifier: ^0.1.5 - version: 0.1.5(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(rollup@4.40.0)(storybook@8.4.2)(typescript@5.7.3)(webpack@5.98.0) + specifier: ^1.0.1 + version: 1.0.1(@rsbuild/core@1.3.21)(@rspack/core@1.3.9)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(rollup@4.40.0)(storybook@8.4.2)(typescript@5.7.3)(webpack@5.98.0) apps/runtime-demo/3005-runtime-host: dependencies: @@ -1994,11 +1963,11 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@rsbuild/plugin-react': specifier: ^1.0.6 - version: 1.0.6(@rsbuild/core@1.0.19) + version: 1.0.6(@rsbuild/core@1.3.21) apps/website: {} @@ -2255,7 +2224,7 @@ importers: version: 1.49.1 '@storybook/addon-essentials': specifier: ^8 - version: 8.3.3(storybook@8.6.12) + version: 8.3.3(storybook@8.6.14) '@types/chrome': specifier: ^0.0.272 version: 0.0.272 @@ -2343,8 +2312,8 @@ importers: version: 1.2.3 devDependencies: '@rslib/core': - specifier: ^0.3.1 - version: 0.3.2(typescript@5.7.3) + specifier: ^0.9.0 + version: 0.9.0(typescript@5.7.3) '@types/fs-extra': specifier: 9.0.6 version: 9.0.6 @@ -2356,7 +2325,7 @@ importers: version: 1.2.5 rsbuild-plugin-publint: specifier: ^0.2.1 - version: 0.2.1(@rsbuild/core@1.2.0-beta.1) + version: 0.2.1(@rsbuild/core@1.3.21) packages/data-prefetch: dependencies: @@ -2710,8 +2679,8 @@ importers: specifier: workspace:* version: link:../manifest '@rsbuild/core': - specifier: 1.2.8 - version: 1.2.8 + specifier: 1.3.21 + version: 1.3.21 packages/native-federation-tests: dependencies: @@ -2847,13 +2816,19 @@ importers: '@module-federation/enhanced': specifier: workspace:* version: link:../enhanced + '@module-federation/node': + specifier: workspace:* + version: link:../node '@module-federation/sdk': specifier: workspace:* version: link:../sdk + fs-extra: + specifier: 11.3.0 + version: 11.3.0 devDependencies: '@rsbuild/core': - specifier: ^1.3.17 - version: 1.3.17 + specifier: ^1.3.21 + version: 1.3.21 packages/rspack: dependencies: @@ -2949,8 +2924,8 @@ importers: specifier: workspace:* version: link:../utilities '@rsbuild/core': - specifier: ^1.0.19 - version: 1.0.19 + specifier: ^1.3.21 + version: 1.3.21 '@storybook/core': specifier: ^8.4.6 version: 8.4.7(prettier@3.3.3) @@ -3077,7 +3052,7 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 @@ -3237,6 +3212,15 @@ packages: dev: true optional: true + /@ast-grep/napi-darwin-arm64@0.37.0: + resolution: {integrity: sha512-QAiIiaAbLvMEg/yBbyKn+p1gX2/FuaC0SMf7D7capm/oG4xGMzdeaQIcSosF4TCxxV+hIH4Bz9e4/u7w6Bnk3Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi-darwin-x64@0.35.0: resolution: {integrity: sha512-pEYiN6JI1HY2uWhMYJ9+3yIMyVYKuYdFzeD+dL7odA3qzK0o9N9AM3/NOt4ynU2EhufaWCJr0P5NoQ636qN6MQ==} engines: {node: '>= 10'} @@ -3246,6 +3230,15 @@ packages: dev: true optional: true + /@ast-grep/napi-darwin-x64@0.37.0: + resolution: {integrity: sha512-zvcvdgekd4ySV3zUbUp8HF5nk5zqwiMXTuVzTUdl/w08O7JjM6XPOIVT+d2o/MqwM9rsXdzdergY5oY2RdhSPA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi-linux-arm64-gnu@0.35.0: resolution: {integrity: sha512-NBuzQngABGKz7lhG08IQb+7nPqUx81Ol37xmS3ZhVSdSgM0mtp93rCbgFTkJcAFE8IMfCHQSg7G4g0Iotz4ABQ==} engines: {node: '>= 10'} @@ -3255,6 +3248,15 @@ packages: dev: true optional: true + /@ast-grep/napi-linux-arm64-gnu@0.37.0: + resolution: {integrity: sha512-L7Sj0lXy8X+BqSMgr1LB8cCoWk0rericdeu+dC8/c8zpsav5Oo2IQKY1PmiZ7H8IHoFBbURLf8iklY9wsD+cyA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi-linux-arm64-musl@0.35.0: resolution: {integrity: sha512-1EcvHPwyWpCL/96LuItBYGfeI5FaMTRvL+dHbO/hL5q1npqbb5qn+ppJwtNOjTPz8tayvgggxVk9T4C2O7taYA==} engines: {node: '>= 10'} @@ -3264,6 +3266,15 @@ packages: dev: true optional: true + /@ast-grep/napi-linux-arm64-musl@0.37.0: + resolution: {integrity: sha512-LF9sAvYy6es/OdyJDO3RwkX3I82Vkfsng1sqUBcoWC1jVb1wX5YVzHtpQox9JrEhGl+bNp7FYxB4Qba9OdA5GA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi-linux-x64-gnu@0.35.0: resolution: {integrity: sha512-FDzNdlqmQnsiWXhnLxusw5AOfEcEM+5xtmrnAf3SBRFr86JyWD9qsynnFYC2pnP9hlMfifNH2TTmMpyGJW49Xw==} engines: {node: '>= 10'} @@ -3273,6 +3284,15 @@ packages: dev: true optional: true + /@ast-grep/napi-linux-x64-gnu@0.37.0: + resolution: {integrity: sha512-TViz5/klqre6aSmJzswEIjApnGjJzstG/SE8VDWsrftMBMYt2PTu3MeluZVwzSqDao8doT/P+6U11dU05UOgxw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi-linux-x64-musl@0.35.0: resolution: {integrity: sha512-wlmndjfBafT8u5p4DBnoRQyoCSGNuVSz7rT3TqhvlHcPzUouRWMn95epU9B1LNLyjXvr9xHeRjSktyCN28w57Q==} engines: {node: '>= 10'} @@ -3282,6 +3302,15 @@ packages: dev: true optional: true + /@ast-grep/napi-linux-x64-musl@0.37.0: + resolution: {integrity: sha512-/BcCH33S9E3ovOAEoxYngUNXgb+JLg991sdyiNP2bSoYd30a9RHrG7CYwW6fMgua3ijQ474eV6cq9yZO1bCpXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi-win32-arm64-msvc@0.35.0: resolution: {integrity: sha512-gkhJeYc4rrZLX2icLxalPikTLMR57DuIYLwLr9g+StHYXIsGHrbfrE6Nnbdd8Izfs34ArFCrcwdaMrGlvOPSeg==} engines: {node: '>= 10'} @@ -3291,6 +3320,15 @@ packages: dev: true optional: true + /@ast-grep/napi-win32-arm64-msvc@0.37.0: + resolution: {integrity: sha512-TjQA4cFoIEW2bgjLkaL9yqT4XWuuLa5MCNd0VCDhGRDMNQ9+rhwi9eLOWRaap3xzT7g+nlbcEHL3AkVCD2+b3A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi-win32-ia32-msvc@0.35.0: resolution: {integrity: sha512-OdUuRa3chHCZ65y+qALfkUjz0W0Eg21YZ9TyPquV5why07M6HAK38mmYGzLxFH6294SvRQhs+FA/rAfbKeH0jA==} engines: {node: '>= 10'} @@ -3300,6 +3338,15 @@ packages: dev: true optional: true + /@ast-grep/napi-win32-ia32-msvc@0.37.0: + resolution: {integrity: sha512-uNmVka8fJCdYsyOlF9aZqQMLTatEYBynjChVTzUfFMDfmZ0bihs/YTqJVbkSm8TZM7CUX82apvn50z/dX5iWRA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi-win32-x64-msvc@0.35.0: resolution: {integrity: sha512-pcQRUHqbroTN1oQ56V982a7IZTUUySQYWa2KEyksiifHGuBuitlzcyzFGjT96ThcqD9XW0UVJMvpoF2Qjh006Q==} engines: {node: '>= 10'} @@ -3309,6 +3356,15 @@ packages: dev: true optional: true + /@ast-grep/napi-win32-x64-msvc@0.37.0: + resolution: {integrity: sha512-vCiFOT3hSCQuHHfZ933GAwnPzmL0G04JxQEsBRfqONywyT8bSdDc/ECpAfr3S9VcS4JZ9/F6tkePKW/Om2Dq2g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@ast-grep/napi@0.35.0: resolution: {integrity: sha512-3ucaaSxV6fxXoqHrE/rxAvP1THnDdY5jNzGlnvx+JvnY9C/dSRKc0jlRMRz59N3El572+/yNRUUpAV1T9aBJug==} engines: {node: '>= 10'} @@ -3324,6 +3380,21 @@ packages: '@ast-grep/napi-win32-x64-msvc': 0.35.0 dev: true + /@ast-grep/napi@0.37.0: + resolution: {integrity: sha512-Hb4o6h1Pf6yRUAX07DR4JVY7dmQw+RVQMW5/m55GoiAT/VRoKCWBtIUPPOnqDVhbx1Cjfil9b6EDrgJsUAujEQ==} + engines: {node: '>= 10'} + optionalDependencies: + '@ast-grep/napi-darwin-arm64': 0.37.0 + '@ast-grep/napi-darwin-x64': 0.37.0 + '@ast-grep/napi-linux-arm64-gnu': 0.37.0 + '@ast-grep/napi-linux-arm64-musl': 0.37.0 + '@ast-grep/napi-linux-x64-gnu': 0.37.0 + '@ast-grep/napi-linux-x64-musl': 0.37.0 + '@ast-grep/napi-win32-arm64-msvc': 0.37.0 + '@ast-grep/napi-win32-ia32-msvc': 0.37.0 + '@ast-grep/napi-win32-x64-msvc': 0.37.0 + dev: true + /@aw-web-design/x-default-browser@1.4.126: resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} hasBin: true @@ -3360,7 +3431,6 @@ packages: '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - dev: true /@babel/compat-data@7.25.8: resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} @@ -3378,16 +3448,16 @@ packages: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.12.9) + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.12.9) '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 convert-source-map: 1.9.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 lodash: 4.17.21 @@ -3413,35 +3483,12 @@ packages: '@babel/traverse': 7.25.7 '@babel/types': 7.25.7 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@9.3.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - /@babel/core@7.25.7: - resolution: {integrity: sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.7) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.25.9 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/core@7.25.8: resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} @@ -3458,7 +3505,7 @@ packages: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3481,7 +3528,7 @@ packages: '@babel/traverse': 7.26.9 '@babel/types': 7.27.0 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3493,45 +3540,22 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.26.10) '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - /@babel/core@7.26.9: - resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helpers': 7.26.9 - '@babel/parser': 7.27.0 - '@babel/template': 7.26.9 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.57.1): resolution: {integrity: sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==} @@ -3599,7 +3623,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 @@ -3608,8 +3632,8 @@ packages: resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 @@ -3618,8 +3642,8 @@ packages: resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 @@ -3633,7 +3657,6 @@ packages: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - dev: true /@babel/helper-annotate-as-pure@7.25.9: resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} @@ -3652,8 +3675,8 @@ packages: resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -3677,23 +3700,12 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-compilation-targets@7.26.5: - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-compilation-targets@7.27.0: resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} engines: {node: '>=6.9.0'} dependencies: '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -3710,7 +3722,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.7 '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3728,7 +3740,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.7 '@babel/helper-replace-supers': 7.25.7(@babel/core@7.26.10) '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3746,7 +3758,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.9 '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3764,7 +3776,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.9 '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.10) '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3817,7 +3829,7 @@ packages: '@babel/core': 7.26.10 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -3827,8 +3839,8 @@ packages: resolution: {integrity: sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -3836,8 +3848,8 @@ packages: resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -3886,7 +3898,6 @@ packages: '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} @@ -3902,34 +3913,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.26.0(@babel/core@7.12.9): - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-module-transforms@7.26.0(@babel/core@7.25.7): - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.25.7 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-module-transforms@7.26.0(@babel/core@7.25.8): resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} @@ -3938,8 +3921,8 @@ packages: dependencies: '@babel/core': 7.25.8 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color dev: true @@ -3952,8 +3935,8 @@ packages: dependencies: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color @@ -3965,21 +3948,21 @@ packages: dependencies: '@babel/core': 7.26.10 '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9): - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + /@babel/helper-module-transforms@7.27.1(@babel/core@7.12.9): + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/core': 7.12.9 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color dev: true @@ -3996,19 +3979,18 @@ packages: '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-optimise-call-expression@7.25.7: resolution: {integrity: sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 /@babel/helper-optimise-call-expression@7.25.9: resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 /@babel/helper-optimise-call-expression@7.27.1: resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} @@ -4039,7 +4021,7 @@ packages: '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color @@ -4052,7 +4034,7 @@ packages: '@babel/core': 7.25.2 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color dev: true @@ -4066,7 +4048,7 @@ packages: '@babel/core': 7.26.10 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color dev: false @@ -4080,7 +4062,7 @@ packages: '@babel/core': 7.25.2 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color dev: true @@ -4094,7 +4076,7 @@ packages: '@babel/core': 7.26.10 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color @@ -4116,8 +4098,8 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -4125,8 +4107,8 @@ packages: resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color dev: true @@ -4135,8 +4117,8 @@ packages: resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -4144,8 +4126,8 @@ packages: resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -4153,8 +4135,8 @@ packages: resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -4179,7 +4161,6 @@ packages: /@babel/helper-string-parser@7.27.1: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} @@ -4196,7 +4177,6 @@ packages: /@babel/helper-validator-identifier@7.27.1: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.25.7: resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} @@ -4209,15 +4189,14 @@ packages: /@babel/helper-validator-option@7.27.1: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-wrap-function@7.25.9: resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color @@ -4233,28 +4212,20 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.27.0 - - /@babel/helpers@7.26.9: - resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - dev: true + '@babel/types': 7.27.1 /@babel/helpers@7.27.0: resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 /@babel/highlight@7.24.7: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -4280,7 +4251,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 dev: true /@babel/parser@7.26.9: @@ -4288,7 +4259,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 /@babel/parser@7.27.0: resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} @@ -4303,7 +4274,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.27.1 - dev: true /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10): resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} @@ -4420,7 +4390,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 dev: true /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9): @@ -4430,7 +4400,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.12.9) dev: true @@ -4453,7 +4423,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 dev: true /@babel/plugin-proposal-pipeline-operator@7.24.7(@babel/core@7.26.10): @@ -4474,7 +4444,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-pipeline-operator': 7.25.7(@babel/core@7.26.10) dev: true @@ -4615,7 +4585,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 dev: true /@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10): @@ -4698,7 +4668,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 dev: true /@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.2): @@ -5164,7 +5134,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-flow': 7.25.7(@babel/core@7.26.10) dev: true @@ -5862,8 +5832,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-validator-option': 7.25.9 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-flow-strip-types': 7.25.7(@babel/core@7.26.10) dev: true @@ -6010,25 +5980,25 @@ packages: resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 /@babel/template@7.26.9: resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 /@babel/template@7.27.0: resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 /@babel/template@7.27.2: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} @@ -6037,7 +6007,6 @@ packages: '@babel/code-frame': 7.27.1 '@babel/parser': 7.27.2 '@babel/types': 7.27.1 - dev: true /@babel/traverse@7.25.7: resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} @@ -6048,7 +6017,7 @@ packages: '@babel/parser': 7.27.0 '@babel/template': 7.25.9 '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6057,12 +6026,12 @@ packages: resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/generator': 7.26.2 '@babel/parser': 7.27.0 '@babel/template': 7.25.9 - '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@8.1.1) + '@babel/types': 7.27.1 + debug: 4.4.0(supports-color@9.3.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6071,12 +6040,12 @@ packages: resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/generator': 7.26.9 '@babel/parser': 7.27.0 '@babel/template': 7.26.9 - '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@8.1.1) + '@babel/types': 7.27.1 + debug: 4.4.0(supports-color@9.3.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6090,7 +6059,7 @@ packages: '@babel/parser': 7.27.0 '@babel/template': 7.27.0 '@babel/types': 7.27.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6118,11 +6087,10 @@ packages: '@babel/parser': 7.27.2 '@babel/template': 7.27.2 '@babel/types': 7.27.1 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true /@babel/types@7.25.7: resolution: {integrity: sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==} @@ -6139,14 +6107,6 @@ packages: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - /@babel/types@7.26.9: - resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - dev: true - /@babel/types@7.27.0: resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} @@ -6160,7 +6120,6 @@ packages: dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - dev: true /@base2/pretty-print-object@1.0.1: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} @@ -8592,7 +8551,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -8609,7 +8568,7 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -8698,7 +8657,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -8709,7 +8668,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -9525,7 +9484,7 @@ packages: peerDependencies: typescript: ^4 || ^5 dependencies: - '@babel/core': 7.25.7 + '@babel/core': 7.26.10 '@babel/eslint-parser': 7.25.7(@babel/core@7.26.10)(eslint@8.57.1) '@babel/eslint-plugin': 7.25.7(@babel/eslint-parser@7.25.7)(eslint@8.57.1) '@modern-js/babel-preset': 2.59.0(@rsbuild/core@1.0.1-rc.4) @@ -9540,7 +9499,7 @@ packages: eslint-plugin-node: 11.1.0(eslint@8.57.1) eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.1)(prettier@2.8.8) eslint-plugin-promise: 6.6.0(eslint@8.57.1) - eslint-plugin-react: 7.37.1(eslint@8.57.1) + eslint-plugin-react: 7.37.2(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) prettier: 2.8.8 typescript: 5.0.4 @@ -9638,9 +9597,9 @@ packages: tsconfig-paths: optional: true dependencies: - '@babel/parser': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 '@modern-js/core': 2.67.6 '@modern-js/node-bundle-require': 2.67.6 '@modern-js/plugin': 2.67.6 @@ -9649,9 +9608,9 @@ packages: '@modern-js/plugin-v2': 2.67.6(react-dom@18.3.1)(react@18.3.1) '@modern-js/prod-server': 2.67.6(react-dom@18.3.1)(react@18.3.1) '@modern-js/rsbuild-plugin-esbuild': 2.67.6(@swc/core@1.7.26)(webpack-cli@5.1.4) - '@modern-js/server': 2.67.6(@babel/traverse@7.27.0)(@rsbuild/core@1.3.20)(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server': 2.67.6(@babel/traverse@7.27.1)(@rsbuild/core@1.3.20)(react-dom@18.3.1)(react@18.3.1) '@modern-js/server-core': 2.67.6(react-dom@18.3.1)(react@18.3.1) - '@modern-js/server-utils': 2.67.6(@babel/traverse@7.27.0)(@rsbuild/core@1.3.20) + '@modern-js/server-utils': 2.67.6(@babel/traverse@7.27.1)(@rsbuild/core@1.3.20) '@modern-js/types': 2.67.6 '@modern-js/uni-builder': 2.67.6(@rspack/core@1.3.9)(esbuild@0.17.19)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/utils': 2.67.6 @@ -9788,14 +9747,14 @@ packages: dependencies: '@babel/core': 7.26.10 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-proposal-export-default-from': 7.24.7(@babel/core@7.26.10) - '@babel/plugin-proposal-partial-application': 7.24.7(@babel/core@7.26.10) - '@babel/plugin-proposal-pipeline-operator': 7.24.7(@babel/core@7.26.10) + '@babel/plugin-proposal-export-default-from': 7.25.8(@babel/core@7.26.10) + '@babel/plugin-proposal-partial-application': 7.25.8(@babel/core@7.26.10) + '@babel/plugin-proposal-pipeline-operator': 7.25.7(@babel/core@7.26.10) '@babel/plugin-transform-runtime': 7.25.7(@babel/core@7.26.10) '@babel/preset-env': 7.26.0(@babel/core@7.26.10) - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.10) + '@babel/preset-typescript': 7.27.1(@babel/core@7.26.10) '@babel/runtime': 7.26.0 - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@rsbuild/plugin-babel': 1.0.1-rc.4(@rsbuild/core@1.0.1-rc.4) '@swc/helpers': 0.5.3 '@types/babel__core': 7.20.5 @@ -9816,9 +9775,9 @@ packages: '@babel/plugin-proposal-pipeline-operator': 7.25.7(@babel/core@7.26.10) '@babel/plugin-transform-runtime': 7.25.7(@babel/core@7.26.10) '@babel/preset-env': 7.26.0(@babel/core@7.26.10) - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.10) + '@babel/preset-typescript': 7.27.1(@babel/core@7.26.10) '@babel/runtime': 7.26.0 - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@rsbuild/plugin-babel': 1.0.5(@rsbuild/core@1.3.20) '@swc/helpers': 0.5.17 '@types/babel__core': 7.20.5 @@ -10181,6 +10140,26 @@ packages: - supports-color dev: true + /@modern-js/server-utils@2.67.6(@babel/traverse@7.27.1)(@rsbuild/core@1.3.20): + resolution: {integrity: sha512-q411M9JQjZ9NTeK6GgCjp4QbPlKegaVGqtaeJs1s3vLdwk4Rswdb+0ZK9EhisAoYkeh+ZtmUGRoHJEN6J//7xw==} + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10) + '@babel/preset-env': 7.26.0(@babel/core@7.26.10) + '@babel/preset-react': 7.26.3(@babel/core@7.26.10) + '@babel/preset-typescript': 7.26.0(@babel/core@7.26.10) + '@modern-js/babel-compiler': 2.67.6 + '@modern-js/babel-plugin-module-resolver': 2.67.6 + '@modern-js/babel-preset': 2.67.6(@rsbuild/core@1.3.20) + '@modern-js/utils': 2.67.6 + '@swc/helpers': 0.5.17 + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.10)(@babel/traverse@7.27.1) + transitivePeerDependencies: + - '@babel/traverse' + - '@rsbuild/core' + - supports-color + dev: true + /@modern-js/server@2.67.6(@babel/traverse@7.27.0)(@rsbuild/core@1.3.20)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Qh7cojbn50tdRrlQhYeEfirEXgUcJo7k711uArXptZP7avaGi5I+Zop1VLnyflUkof+ljdrcFuOXzAIIMa9yXQ==} peerDependencies: @@ -10220,6 +10199,45 @@ packages: - utf-8-validate dev: true + /@modern-js/server@2.67.6(@babel/traverse@7.27.1)(@rsbuild/core@1.3.20)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Qh7cojbn50tdRrlQhYeEfirEXgUcJo7k711uArXptZP7avaGi5I+Zop1VLnyflUkof+ljdrcFuOXzAIIMa9yXQ==} + peerDependencies: + devcert: ^1.2.2 + ts-node: ^10.1.0 + tsconfig-paths: '>= 3.0.0 || >= 4.0.0' + peerDependenciesMeta: + devcert: + optional: true + ts-node: + optional: true + tsconfig-paths: + optional: true + dependencies: + '@babel/core': 7.26.10 + '@babel/register': 7.25.7(@babel/core@7.26.10) + '@modern-js/runtime-utils': 2.67.6(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server-core': 2.67.6(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server-utils': 2.67.6(@babel/traverse@7.27.1)(@rsbuild/core@1.3.20) + '@modern-js/types': 2.67.6 + '@modern-js/utils': 2.67.6 + '@swc/helpers': 0.5.17 + axios: 1.8.2 + connect-history-api-fallback: 2.0.0 + http-compression: 1.0.6 + minimatch: 3.1.2 + path-to-regexp: 6.3.0 + ws: 8.18.0 + transitivePeerDependencies: + - '@babel/traverse' + - '@rsbuild/core' + - bufferutil + - debug + - react + - react-dom + - supports-color + - utf-8-validate + dev: true + /@modern-js/storybook-builder@2.67.6(@rspack/core@1.3.9)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4)(webpack@5.98.0): resolution: {integrity: sha512-oHxbtDX7l5dlv9CCJmAhw+Bhxvh3jsa7CcJFxRYDGa7RITZfCGw7ZUaP+I1uIwvWd50PIt25XilRZFIR6kyk1g==} engines: {node: '>=16.0.0'} @@ -10418,7 +10436,7 @@ packages: dependencies: '@babel/core': 7.26.10 '@babel/preset-react': 7.26.3(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@modern-js/babel-preset': 2.67.6(@rsbuild/core@1.3.20) '@modern-js/flight-server-transform-plugin': 2.67.6 '@modern-js/utils': 2.67.6 @@ -10580,7 +10598,7 @@ packages: dependencies: '@babel/core': 7.26.10 '@babel/preset-react': 7.26.3(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@modern-js/babel-preset': 2.67.6(@rsbuild/core@1.3.20) '@modern-js/flight-server-transform-plugin': 2.67.6 '@modern-js/utils': 2.67.6 @@ -10660,7 +10678,7 @@ packages: resolution: {integrity: sha512-RQuROvNA68Dr2SI0mEc1MmG5X2yVmz+aWViZP1Q89z9ErVSJGCSspUHpM2kFQaCwDgbB7Oz84bcAnP0C+ED9TQ==} dependencies: '@swc/helpers': 0.5.13 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 lodash: 4.17.21 rslog: 1.2.3 dev: false @@ -10669,7 +10687,7 @@ packages: resolution: {integrity: sha512-HrChf19F+6nALo5XPra8ycjhXGQfGi23+S7Y2FLfTKe8vaNnky8duT/XvRWpbS4pp3SQj8ryO8m/qWSsJ1Rogw==} dependencies: '@swc/helpers': 0.5.13 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 lodash: 4.17.21 rslog: 1.2.3 dev: true @@ -10985,10 +11003,6 @@ packages: /@module-federation/error-codes@0.13.1: resolution: {integrity: sha512-azgGDBnFRfqlivHOl96ZjlFUFlukESz2Rnnz/pINiSqoBBNjUE0fcAZP4X6jgrVITuEg90YkruZa7pW9I3m7Uw==} - /@module-federation/error-codes@0.8.4: - resolution: {integrity: sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==} - dev: true - /@module-federation/error-codes@0.9.1: resolution: {integrity: sha512-q8spCvlwUzW42iX1irnlBTcwcZftRNHyGdlaoFO1z/fW4iphnBIfijzkigWQzOMhdPgzqN/up7XN+g5hjBGBtw==} dev: true @@ -11243,13 +11257,6 @@ packages: '@module-federation/webpack-bundler-runtime': 0.6.9 dev: false - /@module-federation/runtime-tools@0.8.4: - resolution: {integrity: sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==} - dependencies: - '@module-federation/runtime': 0.8.4 - '@module-federation/webpack-bundler-runtime': 0.8.4 - dev: true - /@module-federation/runtime-tools@0.9.1: resolution: {integrity: sha512-JQZ//ab+lEXoU2DHAH+JtYASGzxEjXB0s4rU+6VJXc8c+oUPxH3kWIwzjdncg2mcWBmC1140DCk+K+kDfOZ5CQ==} dependencies: @@ -11281,13 +11288,6 @@ packages: '@module-federation/sdk': 0.6.9 dev: false - /@module-federation/runtime@0.8.4: - resolution: {integrity: sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==} - dependencies: - '@module-federation/error-codes': 0.8.4 - '@module-federation/sdk': 0.8.4 - dev: true - /@module-federation/runtime@0.9.1: resolution: {integrity: sha512-jp7K06weabM5BF5sruHr/VLyalO+cilvRDy7vdEBqq88O9mjc0RserD8J+AP4WTl3ZzU7/GRqwRsiwjjN913dA==} dependencies: @@ -11314,12 +11314,6 @@ packages: resolution: {integrity: sha512-xmTxb9LgncxPGsBrN6AT/+aHnFGv8swbeNl0PcSeVbXTGLu3Gp7j+5J+AhJoWNB++SLguRwBd8LjB1d8mNKLDg==} dev: false - /@module-federation/sdk@0.8.4: - resolution: {integrity: sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==} - dependencies: - isomorphic-rslog: 0.0.6 - dev: true - /@module-federation/sdk@0.9.1: resolution: {integrity: sha512-YQonPTImgnCqZjE/A+3N2g3J5ypR6kx1tbBzc9toUANKr/dw/S63qlh/zHKzWQzxjjNNVMdXRtTMp07g3kgEWg==} dev: true @@ -11374,13 +11368,6 @@ packages: '@module-federation/sdk': 0.6.9 dev: false - /@module-federation/webpack-bundler-runtime@0.8.4: - resolution: {integrity: sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==} - dependencies: - '@module-federation/runtime': 0.8.4 - '@module-federation/sdk': 0.8.4 - dev: true - /@module-federation/webpack-bundler-runtime@0.9.1: resolution: {integrity: sha512-CxySX01gT8cBowKl9xZh+voiHvThMZ471icasWnlDIZb14KasZoX1eCh9wpGvwoOdIk9rIRT7h70UvW9nmop6w==} dependencies: @@ -11403,7 +11390,7 @@ packages: '@open-draft/until': 1.0.3 '@types/debug': 4.1.12 '@xmldom/xmldom': 0.8.10 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) headers-polyfill: 3.2.5 outvariant: 1.4.3 strict-event-emitter: 0.2.8 @@ -12231,7 +12218,7 @@ packages: '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.26.10) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.10)(@babel/traverse@7.27.0) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.10)(@babel/traverse@7.27.1) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -12282,7 +12269,7 @@ packages: '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.26.10) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.10)(@babel/traverse@7.27.0) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.10)(@babel/traverse@7.27.1) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -12333,7 +12320,7 @@ packages: '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.26.10) babel-plugin-macros: 3.1.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.10)(@babel/traverse@7.27.0) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.26.10)(@babel/traverse@7.27.1) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -13514,7 +13501,7 @@ packages: ansi-html: 0.0.9 core-js-pure: 3.38.1 error-stack-parser: 2.1.4 - html-entities: 2.5.2 + html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.14.2 schema-utils: 4.3.0 @@ -14700,7 +14687,7 @@ packages: dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.25.9 - '@rollup/pluginutils': 5.1.3(rollup@4.40.0) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) rollup: 4.40.0 transitivePeerDependencies: - supports-color @@ -14731,7 +14718,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.40.0) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 @@ -14768,7 +14755,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.40.0) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) mini-svg-data-uri: 1.4.4 rollup: 4.40.0 dev: true @@ -14791,7 +14778,7 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.40.0) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) rollup: 4.40.0 dev: true @@ -14895,7 +14882,7 @@ packages: tslib: optional: true dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.40.0) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) resolve: 1.22.8 rollup: 4.40.0 tslib: 2.8.1 @@ -14960,7 +14947,22 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + rollup: 4.40.0 + dev: true + + /@rollup/pluginutils@5.1.4(rollup@4.40.0): + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 rollup: 4.40.0 @@ -15251,7 +15253,7 @@ packages: '@babel/preset-env': 7.26.0(@babel/core@7.26.10) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.10) '@babel/runtime': 7.26.0 - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@rsbuild/plugin-babel': 0.7.10(@rsbuild/core@0.7.10)(@swc/helpers@0.5.13) '@types/babel__core': 7.20.5 babel-plugin-dynamic-import-node: 2.3.3 @@ -15283,7 +15285,7 @@ packages: '@rspack/core': 1.0.14(@swc/helpers@0.5.13) '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.13 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 core-js: 3.38.1 optionalDependencies: fsevents: 2.3.3 @@ -15300,74 +15302,26 @@ packages: core-js: 3.38.1 optionalDependencies: fsevents: 2.3.3 + dev: false - /@rsbuild/core@1.1.12: - resolution: {integrity: sha512-9f+E47fMf51Cg4W7CF2Q4f7BRSslVV/+TRvs5ScclYanqXEFtAGV9nuecJEL6Qc9jJV61lES0esPTFdPPnWPGw==} - engines: {node: '>=16.7.0'} - hasBin: true - dependencies: - '@rspack/core': 1.1.8(@swc/helpers@0.5.17) - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.17 - core-js: 3.39.0 - dev: true - - /@rsbuild/core@1.2.0-beta.1: - resolution: {integrity: sha512-+TzwALD2xEpgc2FQgjn1CtNtE2CTS1FELuWXpjI4AABjytYDGdaOHvHyCLXHiJpuvDdnyJumoN/T8i8zhbTkPg==} - engines: {node: '>=16.7.0'} - hasBin: true - dependencies: - '@rspack/core': 1.2.0-beta.0(@swc/helpers@0.5.17) - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.17 - core-js: 3.40.0 - dev: true - - /@rsbuild/core@1.2.19: - resolution: {integrity: sha512-k76is4HygmbYYMLG2V1d1yQeurHHC+ZEtGs/nwE11y6HmwSndoFhmjOeQbQ2Ul0b2B8HErksqSMtlCxd37YPPQ==} - engines: {node: '>=16.7.0'} - hasBin: true - dependencies: - '@rspack/core': 1.2.8(@swc/helpers@0.5.15) - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.15 - core-js: 3.41.0 - jiti: 2.4.2 - transitivePeerDependencies: - - '@rspack/tracing' - dev: true - - /@rsbuild/core@1.2.8: - resolution: {integrity: sha512-I5cPKnJxkc+K552x17s2BlSs2Ox8bauoWPpy8mPtW7xwT3h9pprPO6zsMPkj/TJhkGLmeJ1bcVxf6NcrP/jWSA==} - engines: {node: '>=16.7.0'} - hasBin: true - dependencies: - '@rspack/core': 1.2.3(@swc/helpers@0.5.15) - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.15 - core-js: 3.40.0 - transitivePeerDependencies: - - '@rspack/tracing' - dev: true - - /@rsbuild/core@1.3.17: - resolution: {integrity: sha512-vDRUjPws7vUcdn2uXOSOknGRF9Jt0wQRH6AU0G7O0GsX8liUmE/I7+EpYvhuQIRp2ekOz1cmmSTrRntEjp7WoQ==} + /@rsbuild/core@1.3.20: + resolution: {integrity: sha512-5VxOddgGHaq5x4ONdKOZvLYLj8dhVfCAz+cERNLXrKLzBISouY1A9TJcbZBK4xoH/0DJrDtDzapNA+dI9Jr07Q==} engines: {node: '>=16.10.0'} hasBin: true dependencies: - '@rspack/core': 1.3.9(@swc/helpers@0.5.17) + '@rspack/core': 1.3.10(@swc/helpers@0.5.17) '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 core-js: 3.42.0 jiti: 2.4.2 dev: true - /@rsbuild/core@1.3.20: - resolution: {integrity: sha512-5VxOddgGHaq5x4ONdKOZvLYLj8dhVfCAz+cERNLXrKLzBISouY1A9TJcbZBK4xoH/0DJrDtDzapNA+dI9Jr07Q==} + /@rsbuild/core@1.3.21: + resolution: {integrity: sha512-0Xy3CEFiLFXZpPmmVmX1XvfAENGrb5IyXYL7zkJ8vF7v3fmZgo3yy3ZeY8SesPTsiZIbCObJ6PemFbLee3S3oA==} engines: {node: '>=16.10.0'} hasBin: true dependencies: - '@rspack/core': 1.3.10(@swc/helpers@0.5.17) + '@rspack/core': 1.3.11(@swc/helpers@0.5.17) '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 core-js: 3.42.0 @@ -15411,11 +15365,11 @@ packages: '@babel/core': 7.26.10 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.10) + '@babel/preset-typescript': 7.27.1(@babel/core@7.26.10) '@rsbuild/core': 1.0.1-rc.4 '@types/babel__core': 7.20.5 deepmerge: 4.3.1 - reduce-configs: 1.0.0 + reduce-configs: 1.1.0 upath: 2.0.1 transitivePeerDependencies: - supports-color @@ -15574,23 +15528,24 @@ packages: '@rsbuild/core': 1.0.19 '@rspack/plugin-react-refresh': 1.0.0(react-refresh@0.14.2) react-refresh: 0.14.2 + dev: false - /@rsbuild/plugin-react@1.0.6(@rsbuild/core@1.3.20): + /@rsbuild/plugin-react@1.0.6(@rsbuild/core@1.3.21): resolution: {integrity: sha512-k2VS7nvNm74DlVQROK+w+Ua1j60n3qSnVFva8zjmj6uakLCxxp85aRwfEHzaVP/YdDLffweypROuQPYvTZ57ew==} peerDependencies: '@rsbuild/core': 1.x dependencies: - '@rsbuild/core': 1.3.20 + '@rsbuild/core': 1.3.21 '@rspack/plugin-react-refresh': 1.0.0(react-refresh@0.14.2) react-refresh: 0.14.2 dev: true - /@rsbuild/plugin-react@1.1.0(@rsbuild/core@1.2.19): + /@rsbuild/plugin-react@1.1.0(@rsbuild/core@1.3.21): resolution: {integrity: sha512-uqdRoV2V91G1XIA14dAmxqYTlTDVf0ktpE7TgwG29oQ2j+DerF1kh29WPHK9HvGE34JTfaBrsme2Zmb6bGD0cw==} peerDependencies: '@rsbuild/core': 1.x dependencies: - '@rsbuild/core': 1.2.19 + '@rsbuild/core': 1.3.21 '@rspack/plugin-react-refresh': 1.0.0(react-refresh@0.16.0) react-refresh: 0.16.0 dev: true @@ -15607,6 +15562,18 @@ packages: - webpack-hot-middleware dev: true + /@rsbuild/plugin-react@1.3.1(@rsbuild/core@1.3.21): + resolution: {integrity: sha512-1PfE0CZDwiSIUFaMFOEprwsHK6oo29zU6DdtFH2D49uLcpUdOUvU1u2p00RCVO1CIgnAjRajLS7dnPdQUwFOuQ==} + peerDependencies: + '@rsbuild/core': 1.x + dependencies: + '@rsbuild/core': 1.3.21 + '@rspack/plugin-react-refresh': 1.4.3(react-refresh@0.17.0) + react-refresh: 0.17.0 + transitivePeerDependencies: + - webpack-hot-middleware + dev: true + /@rsbuild/plugin-rem@1.0.2(@rsbuild/core@1.3.20): resolution: {integrity: sha512-YI/X4fM4UUmMoCPIukQ40KZ4fPsr9MGW6BRc/+SoLy5dxZVsRuRa568i4znn+X1c8hTihfNn2EtzrVbvNCPzrQ==} peerDependencies: @@ -15721,24 +15688,6 @@ packages: toml: 3.0.0 dev: true - /@rsbuild/plugin-type-check@1.2.1(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(typescript@5.7.3): - resolution: {integrity: sha512-PtbjeMqDQy8IiPDTuaj8ZmvR42b0AsRq6RUF6wxa8dDsOzD0Dl1GcvemVGCto+/Dh8frLUmnlWF+T8riBw5rtA==} - peerDependencies: - '@rsbuild/core': 1.x - peerDependenciesMeta: - '@rsbuild/core': - optional: true - dependencies: - '@rsbuild/core': 1.3.20 - deepmerge: 4.3.1 - json5: 2.2.3 - reduce-configs: 1.1.0 - ts-checker-rspack-plugin: 1.1.1(@rspack/core@1.3.9)(typescript@5.7.3) - transitivePeerDependencies: - - '@rspack/core' - - typescript - dev: true - /@rsbuild/plugin-type-check@1.2.2(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(typescript@5.0.4): resolution: {integrity: sha512-7hRPT9Vi5uXLkvjy9gGHttpCvK7afGXS7bukyf0XCYAWj6XMPJvUQpXBatVVdNdNfeYt0ffHo5GqiPz/eeCorQ==} peerDependencies: @@ -15775,7 +15724,7 @@ packages: - typescript dev: true - /@rsbuild/plugin-type-check@1.2.2(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(typescript@5.7.3): + /@rsbuild/plugin-type-check@1.2.2(@rsbuild/core@1.3.21)(@rspack/core@1.3.9)(typescript@5.7.3): resolution: {integrity: sha512-7hRPT9Vi5uXLkvjy9gGHttpCvK7afGXS7bukyf0XCYAWj6XMPJvUQpXBatVVdNdNfeYt0ffHo5GqiPz/eeCorQ==} peerDependencies: '@rsbuild/core': 1.x @@ -15783,7 +15732,7 @@ packages: '@rsbuild/core': optional: true dependencies: - '@rsbuild/core': 1.3.20 + '@rsbuild/core': 1.3.21 deepmerge: 4.3.1 json5: 2.2.3 reduce-configs: 1.1.0 @@ -15804,12 +15753,12 @@ packages: '@rsbuild/core': 1.3.20 dev: true - /@rsbuild/plugin-vue@1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.25.0)(vue@3.5.10)(webpack-cli@5.1.4): + /@rsbuild/plugin-vue@1.0.3(@rsbuild/core@1.3.21)(@swc/core@1.7.26)(esbuild@0.25.0)(vue@3.5.10)(webpack-cli@5.1.4): resolution: {integrity: sha512-+g6PaZUQDNBDhM5lx1YuXqNHDdZGBnPwIi1DLMqNLwqKeG4wdAggT4oOj2LjXXyMIvlMrWz0No5J8QroZ3WkEA==} peerDependencies: '@rsbuild/core': 1.x dependencies: - '@rsbuild/core': 1.0.19 + '@rsbuild/core': 1.3.21 vue-loader: 17.4.2(vue@3.5.10)(webpack@5.95.0) webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.25.0)(webpack-cli@5.1.4) transitivePeerDependencies: @@ -15900,28 +15849,9 @@ packages: - webpack-cli dev: true - /@rslib/core@0.2.0(typescript@5.7.3): - resolution: {integrity: sha512-SuqdKdHdXrdN2FgVzrb+RShl6op608FZ1mOd8NX4H8lGp6E+CAAL9gnH/H4n7ahBQvM1920w1WTmaYZPyhhLUg==} - engines: {node: '>=16.0.0'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7 - typescript: ^5 - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - typescript: - optional: true - dependencies: - '@rsbuild/core': 1.1.12 - rsbuild-plugin-dts: 0.2.0(@rsbuild/core@1.1.12)(typescript@5.7.3) - tinyglobby: 0.2.10 - typescript: 5.7.3 - dev: true - - /@rslib/core@0.3.2(typescript@5.7.3): - resolution: {integrity: sha512-BdR/1kjR+Jk614je0ijjEwGoY44fLtPg6PoWHoKfzMkqNMtFg40AwMaBS04SylvR4BuUt1Q+9k6NQ/IWdE5HWg==} - engines: {node: '>=16.0.0'} + /@rslib/core@0.9.0(typescript@5.7.3): + resolution: {integrity: sha512-nWpST4+oPPTi/P4EfYqtmPLAu7AJxDevt8/+D3aULHwYkjZCVn5l3v1/tcvUJImEWsKnquknu3QIjUBNDwLzwg==} + engines: {node: '>=16.7.0'} hasBin: true peerDependencies: '@microsoft/api-extractor': ^7 @@ -15932,9 +15862,9 @@ packages: typescript: optional: true dependencies: - '@rsbuild/core': 1.2.0-beta.1 - rsbuild-plugin-dts: 0.3.2(@rsbuild/core@1.2.0-beta.1)(typescript@5.7.3) - tinyglobby: 0.2.10 + '@rsbuild/core': 1.3.21 + rsbuild-plugin-dts: 0.9.0(@rsbuild/core@1.3.21)(typescript@5.7.3) + tinyglobby: 0.2.14 typescript: 5.7.3 dev: true @@ -15961,40 +15891,16 @@ packages: dev: true optional: true - /@rspack/binding-darwin-arm64@1.1.8: - resolution: {integrity: sha512-I7avr471ghQ3LAqKm2fuXuJPLgQ9gffn5Q4nHi8rsukuZUtiLDPfYzK1QuupEp2JXRWM1gG5lIbSUOht3cD6Ug==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-darwin-arm64@1.2.0-beta.0: - resolution: {integrity: sha512-g8NgY4OIjZf5LabAKOHNr2rs/WzVaxXpOSVsdHztQL6ETdeEpIPUul4p/5zivFNcrvJxVVeHzKJHyB5lqxDcTA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-darwin-arm64@1.2.3: - resolution: {integrity: sha512-xuwYzhPgNCr4BtKXCU3xe4249TFsXAZglIlbxv8Qs3PeIarrZMRddcqH2zUXi+nJavNw3yN12sCYEzk1f+O4FQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-darwin-arm64@1.2.8: - resolution: {integrity: sha512-bDlrlroY3iMlzna/3i1gD6eRmhJW2zRyC3Ov6aR1micshVQ9RteigYZWkjZuQfyC5Z8dCcLUQJVojz+pqp0JXg==} + /@rspack/binding-darwin-arm64@1.3.10: + resolution: {integrity: sha512-0k/j8OeMSVm5u5Nzckp9Ie7S7hprnvNegebnGr+L6VCyD7sMqm4m+4rLHs99ZklYdH0dZtY2+LrzrtjUZCqfew==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rspack/binding-darwin-arm64@1.3.10: - resolution: {integrity: sha512-0k/j8OeMSVm5u5Nzckp9Ie7S7hprnvNegebnGr+L6VCyD7sMqm4m+4rLHs99ZklYdH0dZtY2+LrzrtjUZCqfew==} + /@rspack/binding-darwin-arm64@1.3.11: + resolution: {integrity: sha512-sGoFDXYNinubhEiPSjtA/ua3qhMj6VVBPTSDvprZj+MT18YV7tQQtwBpm+8sbqJ1P5y+a3mzsP3IphRWyIQyXw==} cpu: [arm64] os: [darwin] requiresBuild: true @@ -16031,40 +15937,16 @@ packages: dev: true optional: true - /@rspack/binding-darwin-x64@1.1.8: - resolution: {integrity: sha512-vfqf/c+mcx8rr1M8LnqKmzDdnrgguflZnjGerBLjNerAc+dcUp3lCvNxRIvZ2TkSZZBW8BpCMgjj3n70CZ4VLQ==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-darwin-x64@1.2.0-beta.0: - resolution: {integrity: sha512-+BH/1UpG96exJc6KhDOiSHAb05bUwxbYCd37HAJwcLxQgB7IEmPtBYvV5CtHysteM5NBtbNeeAcyXK+dIYvUew==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-darwin-x64@1.2.3: - resolution: {integrity: sha512-afiIN8elcrO2EtO27UN0qyZqu5FXGUdclud56DrhvEfnWS3GGxJEdjA8XUYVXkfCYakdXHucIJKlkkgaAjEvHg==} + /@rspack/binding-darwin-x64@1.3.10: + resolution: {integrity: sha512-jOyqYW/18cgxw60wK5oqJvM194pbD4H99xaif89McNtLkH3npFvBkXBHVWWuOHGoXNX0LhRpHcI89p9b9THQZQ==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rspack/binding-darwin-x64@1.2.8: - resolution: {integrity: sha512-0/qOVbMuzZ+WbtDa4TbH46R4vph/W6MHcXbrXDO+vpdTMFDVJ64DnZXT7aqvGcY+7vTCIGm0GT+6ooR4KaIX8A==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-darwin-x64@1.3.10: - resolution: {integrity: sha512-jOyqYW/18cgxw60wK5oqJvM194pbD4H99xaif89McNtLkH3npFvBkXBHVWWuOHGoXNX0LhRpHcI89p9b9THQZQ==} + /@rspack/binding-darwin-x64@1.3.11: + resolution: {integrity: sha512-4zgOkCLxhp4Ki98GuDaZgz4exXcE4+sgvXY/xA/A5FGPVRbfQLQ5psSOk0F/gvMua1r15E66loQRJpuzUK6bTA==} cpu: [x64] os: [darwin] requiresBuild: true @@ -16101,40 +15983,16 @@ packages: dev: true optional: true - /@rspack/binding-linux-arm64-gnu@1.1.8: - resolution: {integrity: sha512-lZlO/rAJSeozi+qtVLkGSXfe+riPawCwM4FsrflELfNlvvEXpANwtrdJ+LsaNVXcgvhh50ZX2KicTdmx9G2b6Q==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-arm64-gnu@1.2.0-beta.0: - resolution: {integrity: sha512-LdIBNy5WAXJ1J9nB3bEyvqz7mJrMN/7cCtPHMmFBR1aTFbh1NAjYZl24fc+f59aSV5jAU9wfTrOtqtSwnXg4tQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-arm64-gnu@1.2.3: - resolution: {integrity: sha512-K2u/fPUmKujlKSWL3q2zaUu8/6ZK/bOGKcqJSib8jdanQQ/GFKwKtPAFOOa/vvqbzhDocqKOobFR10FhgJqCHg==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-arm64-gnu@1.2.8: - resolution: {integrity: sha512-En/SMl45s19iUVb1/ZDFQvFDxIjnlfk7yqV3drMWWAL5HSgksNejaTIFTO52aoohIBbmwuk5wSGcbU0G0IFiPg==} + /@rspack/binding-linux-arm64-gnu@1.3.10: + resolution: {integrity: sha512-zhF5ZNaT/7pxrm8xD3dWG1b4x+FO3LbVeZZG448CjpSo5T57kPD+SaGUU1GcPpn6mexf795x0SVS49aH7/e3Dg==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rspack/binding-linux-arm64-gnu@1.3.10: - resolution: {integrity: sha512-zhF5ZNaT/7pxrm8xD3dWG1b4x+FO3LbVeZZG448CjpSo5T57kPD+SaGUU1GcPpn6mexf795x0SVS49aH7/e3Dg==} + /@rspack/binding-linux-arm64-gnu@1.3.11: + resolution: {integrity: sha512-NIOaIfYUmJs1XL4lbGVtcMm1KlA/6ZR6oAbs2ekofKXtJYAFQgnLTf7ZFmIwVjS0mP78BmeSNcIM6pd2w5id4w==} cpu: [arm64] os: [linux] requiresBuild: true @@ -16171,40 +16029,16 @@ packages: dev: true optional: true - /@rspack/binding-linux-arm64-musl@1.1.8: - resolution: {integrity: sha512-bX7exULSZwy8xtDh6Z65b6sRC4uSxGuyvSLCEKyhmG6AnJkg0gQMxk3hoO0hWnyGEZgdJEn+jEhk0fjl+6ZRAQ==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-arm64-musl@1.2.0-beta.0: - resolution: {integrity: sha512-4tRi87UyEWV25X6Ul68kJJ/de/cwmASmrIUrCYmdWEdtWMN46UOz0OvxCYvcHTf0DCP8M1CZf0cSiRuG/hsxGA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-arm64-musl@1.2.3: - resolution: {integrity: sha512-mgovdzGb6cH9hQsjTyzDbfZWCPhTcoHcLro1P7UbiqcLPMDJp/k3Io9xV2/EJhaDA1aynIdq7XfY0fuk4+6Irw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-arm64-musl@1.2.8: - resolution: {integrity: sha512-N1oZsXfJ9VLLcK7p1PS65cxLYQCZ7iqHW2OP6Ew2+hlz/d1hzngxgzrtZMCXFOHXDvTzVu5ff6jGS2v7+zv2tA==} + /@rspack/binding-linux-arm64-musl@1.3.10: + resolution: {integrity: sha512-o3x7IrOSCHK6lcRvdZgsSuOG1CHRQR00xiyLW7kkWmNm7t417LC9xdFWKIK62C5fKXGC5YcTbUkDMnQujespkg==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rspack/binding-linux-arm64-musl@1.3.10: - resolution: {integrity: sha512-o3x7IrOSCHK6lcRvdZgsSuOG1CHRQR00xiyLW7kkWmNm7t417LC9xdFWKIK62C5fKXGC5YcTbUkDMnQujespkg==} + /@rspack/binding-linux-arm64-musl@1.3.11: + resolution: {integrity: sha512-CRRAQ379uzA2QfD9HHNtxuuqzGksUapMVcTLY5NIXWfvHLUJShdlSJQv3UQcqgAJNrMY7Ex1PnoQs1jZgUiqZA==} cpu: [arm64] os: [linux] requiresBuild: true @@ -16241,40 +16075,16 @@ packages: dev: true optional: true - /@rspack/binding-linux-x64-gnu@1.1.8: - resolution: {integrity: sha512-2Prw2USgTJ3aLdLExfik8pAwAHbX4MZrACBGEmR7Vbb56kLjC+++fXkciRc50pUDK4JFr1VQ7eNZrJuDR6GG6Q==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-x64-gnu@1.2.0-beta.0: - resolution: {integrity: sha512-rWWrPwUH3V4yG46acZDIlqr7H/yCxbu+WdPhdIRBvgT7bisQkZa2HYx6MXmUXxx94U2iFy5bh+un0ho5FZOeCg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-x64-gnu@1.2.3: - resolution: {integrity: sha512-542lwJzB1RMGuVdBdA3cOWTlmL9okpOppHUBWcNCjmJM+9zTI+0jwjVe8HaqOqtuR8XzNsoCwT9QonU/GLcuhg==} + /@rspack/binding-linux-x64-gnu@1.3.10: + resolution: {integrity: sha512-FMSi28VZhXMr15picOHFynULhqZ/FODPxRIS6uNrvPRYcbNuiO1v+VHV6X88mhOMmJ/aVF6OwjUO/o2l1FVa9Q==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rspack/binding-linux-x64-gnu@1.2.8: - resolution: {integrity: sha512-BdPaepoLKuaVwip4QK/nGqNi1xpbCWSxiycPbKRrGqKgt/QGihxxFgiqr4EpWQVIJNIMy4nCsg4arO0+H1KWGQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-x64-gnu@1.3.10: - resolution: {integrity: sha512-FMSi28VZhXMr15picOHFynULhqZ/FODPxRIS6uNrvPRYcbNuiO1v+VHV6X88mhOMmJ/aVF6OwjUO/o2l1FVa9Q==} + /@rspack/binding-linux-x64-gnu@1.3.11: + resolution: {integrity: sha512-k3OyvLneX2ZeL8z/OzPojpImqy6PgqKJD+NtOvcr/TgbgADHZ3xQttf6B2X+qnZMAgOZ+RTeTkOFrvsg9AEKmA==} cpu: [x64] os: [linux] requiresBuild: true @@ -16311,40 +16121,16 @@ packages: dev: true optional: true - /@rspack/binding-linux-x64-musl@1.1.8: - resolution: {integrity: sha512-bnVGB/mQBKEdzOU/CPmcOE3qEXxGOGGW7/i6iLl2MamVOykJq8fYjL9j86yi6L0r009ja16OgWckykQGc4UqGw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-x64-musl@1.2.0-beta.0: - resolution: {integrity: sha512-9pgL17Bk8aSrTBx6VfQbb313RInDjlY9DfgV5ybbSsWaFs/oAs4oPy+kepWWixfb9Y2q/74bSBPrBNTBYQpknw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-x64-musl@1.2.3: - resolution: {integrity: sha512-dJromiREDcTWqzfCOI5y1IVoYmUnCv7vCp63AEq0+13fJJdk7+pcNN3VV2jOKpk9VECSvjg1c01wl+UzXAXFMw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-linux-x64-musl@1.2.8: - resolution: {integrity: sha512-GFv0Bod268OcXIcjeLoPlK0oz8rClEIxIRFkz+ejhbvfCwRJ+Fd+EKaaKQTBfZQujPqc0h2GctIF25nN5pFTmA==} + /@rspack/binding-linux-x64-musl@1.3.10: + resolution: {integrity: sha512-e0xbY9SlbRGIFz41v1yc0HfREvmgMnLV1bLmTSPK8wI2suIEJ7iYYqsocHOAOk86qLZcxVrTnL6EjUcNaRTWlg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rspack/binding-linux-x64-musl@1.3.10: - resolution: {integrity: sha512-e0xbY9SlbRGIFz41v1yc0HfREvmgMnLV1bLmTSPK8wI2suIEJ7iYYqsocHOAOk86qLZcxVrTnL6EjUcNaRTWlg==} + /@rspack/binding-linux-x64-musl@1.3.11: + resolution: {integrity: sha512-2agcELyyQ95jWGCW0YWD0TvAcN40yUjmxn9NXQBLHPX5Eb07NaHXairMsvV9vqQsPsq0nxxfd9Wsow18Y5r/Hw==} cpu: [x64] os: [linux] requiresBuild: true @@ -16381,40 +16167,16 @@ packages: dev: true optional: true - /@rspack/binding-win32-arm64-msvc@1.1.8: - resolution: {integrity: sha512-u+na3gxhzeksm4xZyAzn1+XWo5a5j7hgWA/KcFPDQ8qQNkRknx4jnQMxVtcZ9pLskAYV4AcOV/AIximx7zvv8A==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-arm64-msvc@1.2.0-beta.0: - resolution: {integrity: sha512-JQ06Q3uTclIk4AvKUqx0Royx2PqVcUuumEUFVWERbd01fntkQqI3RFrPazBYAIvk5JmXk40+CKA1CsFef4RKOA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-arm64-msvc@1.2.3: - resolution: {integrity: sha512-S8ZKddMMQDGy8jx/R0i2m1XrmfY2CpI+t6lIEpsuZuKUR4MbOGKN2DuL4MDnT3m8JaYvC8ihsvQjBXQCy3SNxQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-arm64-msvc@1.2.8: - resolution: {integrity: sha512-aEU+uJdbvJJGrzzAsjbjrPeNbG/bcG8JoXK2kSsUB+/sWHTIkHX0AQ3oX3aV/lcLKgZWrUxLAfLoCXEnIHMEyQ==} + /@rspack/binding-win32-arm64-msvc@1.3.10: + resolution: {integrity: sha512-YHJPvEujWeWjU6EUF6sDpaec9rsOtKVvy16YCtGaxRpDQXqfuxibnp6Ge0ZTTrY+joRiWehRA9OUI+3McqI+QA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rspack/binding-win32-arm64-msvc@1.3.10: - resolution: {integrity: sha512-YHJPvEujWeWjU6EUF6sDpaec9rsOtKVvy16YCtGaxRpDQXqfuxibnp6Ge0ZTTrY+joRiWehRA9OUI+3McqI+QA==} + /@rspack/binding-win32-arm64-msvc@1.3.11: + resolution: {integrity: sha512-sjGoChazu0krigT/LVwGUsgCv3D3s/4cR/3P4VzuDNVlb4pbh1CDa642Fr0TceqAXCeKW5GiL/EQOfZ4semtcQ==} cpu: [arm64] os: [win32] requiresBuild: true @@ -16451,40 +16213,16 @@ packages: dev: true optional: true - /@rspack/binding-win32-ia32-msvc@1.1.8: - resolution: {integrity: sha512-FijUxym1INd5fFHwVCLuVP8XEAb4Sk1sMwEEQUlugiDra9ZsLaPw4OgPGxbxkD6SB0DeUz9Zq46Xbcf6d3OgfA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-ia32-msvc@1.2.0-beta.0: - resolution: {integrity: sha512-rNz/sXjXLAqCZkDuTumqm9Aa47Hiu45+vkJ0XvbirJ0A+dzuyGjdtlinwLyZtCY+dVAlS+AcX5znJLlpTSnjjA==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-ia32-msvc@1.2.3: - resolution: {integrity: sha512-74lqSMKQJcJcgfFaxm+G9YVJSl2KK9/v4fRoMsWApztNy2qNgee+UguNBCOU6JLa3rVSj8Z5OVVDtJkGFrSvVg==} + /@rspack/binding-win32-ia32-msvc@1.3.10: + resolution: {integrity: sha512-2iwSBzVBC89ZSk56MYwgirh3bda2WKmL9I3qPajiTEivChXpX7jp83jAtGE6CPqPYcccYz6nrURTHNUZhqXxVw==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rspack/binding-win32-ia32-msvc@1.2.8: - resolution: {integrity: sha512-GHYzNOSoiLyG9elLTmMqADJMQzjll+co4irp5AgZ+KHG9EVq0qEHxDqDIJxZnUA15U8JDvCgo6YAo3T0BFEL0Q==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-ia32-msvc@1.3.10: - resolution: {integrity: sha512-2iwSBzVBC89ZSk56MYwgirh3bda2WKmL9I3qPajiTEivChXpX7jp83jAtGE6CPqPYcccYz6nrURTHNUZhqXxVw==} + /@rspack/binding-win32-ia32-msvc@1.3.11: + resolution: {integrity: sha512-tjywW84oQLSqRmvQZ+fXP7e3eNmjScYrlWEPAQFjf08N19iAJ9UOGuuFw8Fk5ZmrlNZ2Qo9ASSOI7Nnwx2aZYg==} cpu: [ia32] os: [win32] requiresBuild: true @@ -16521,40 +16259,16 @@ packages: dev: true optional: true - /@rspack/binding-win32-x64-msvc@1.1.8: - resolution: {integrity: sha512-SBzIcND4qpDt71jlu1MCDxt335tqInT3YID9V4DoQ4t8wgM/uad7EgKOWKTK6vc2RRaOIShfS2XzqjNUxPXh4w==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-x64-msvc@1.2.0-beta.0: - resolution: {integrity: sha512-LKFcgaeEo7G6YLE5aKIbeWzXUpVZc02u0q4as0TjTTRBHd8r21GeaGJVh1Xm9YBkHpIX8Ho1DMftYVd+F6gHzw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-x64-msvc@1.2.3: - resolution: {integrity: sha512-fcU532PgFdd5Bil8jwQW0Dcb/80oM6V0qSstGIxZ4M77t4t8e/PcukXfORTL71FfNQ64Rd4Dp6XRl1NHNJVxeg==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rspack/binding-win32-x64-msvc@1.2.8: - resolution: {integrity: sha512-EigKLhKLH1kfv1e/ZgXuSKlIjkbyneJtiLbNDz7EeEVFGV1XMM6bsCea1sb2WOxsPYiOX4Q5JmR1j1KGrZS/LA==} + /@rspack/binding-win32-x64-msvc@1.3.10: + resolution: {integrity: sha512-ehWJ9Y5Zezj/+uJpiWbt29RZaRIM00f91PWuabM6/sKmHJhdCEE21u5iI3B8DeW/EjJsH8zkI69YYAxJWwGn9A==} cpu: [x64] os: [win32] requiresBuild: true dev: true optional: true - /@rspack/binding-win32-x64-msvc@1.3.10: - resolution: {integrity: sha512-ehWJ9Y5Zezj/+uJpiWbt29RZaRIM00f91PWuabM6/sKmHJhdCEE21u5iI3B8DeW/EjJsH8zkI69YYAxJWwGn9A==} + /@rspack/binding-win32-x64-msvc@1.3.11: + resolution: {integrity: sha512-pPy3yU6SAMfEPY7ki1KAetiDFfRbkYMiX3F89P9kX01UAePkLRNsjacHF4w7N3EsBsWn1FlGaYZdlzmOI5pg2Q==} cpu: [x64] os: [win32] requiresBuild: true @@ -16609,62 +16323,6 @@ packages: '@rspack/binding-win32-x64-msvc': 1.0.8 dev: true - /@rspack/binding@1.1.8: - resolution: {integrity: sha512-+/JzXx1HctfgPj+XtsCTbRkxiaOfAXGZZLEvs7jgp04WgWRSZ5u97WRCePNPvy+sCfOEH/2zw2ZK36Z7oQRGhQ==} - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.1.8 - '@rspack/binding-darwin-x64': 1.1.8 - '@rspack/binding-linux-arm64-gnu': 1.1.8 - '@rspack/binding-linux-arm64-musl': 1.1.8 - '@rspack/binding-linux-x64-gnu': 1.1.8 - '@rspack/binding-linux-x64-musl': 1.1.8 - '@rspack/binding-win32-arm64-msvc': 1.1.8 - '@rspack/binding-win32-ia32-msvc': 1.1.8 - '@rspack/binding-win32-x64-msvc': 1.1.8 - dev: true - - /@rspack/binding@1.2.0-beta.0: - resolution: {integrity: sha512-ZUBWVKCVC3uunZhjH7FAVLP83r/6QvPmYViA6n0JF3ycBmcJLkHJb26v42j6d5EfYfTtNvfRUlzHckIkFDQeDQ==} - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.2.0-beta.0 - '@rspack/binding-darwin-x64': 1.2.0-beta.0 - '@rspack/binding-linux-arm64-gnu': 1.2.0-beta.0 - '@rspack/binding-linux-arm64-musl': 1.2.0-beta.0 - '@rspack/binding-linux-x64-gnu': 1.2.0-beta.0 - '@rspack/binding-linux-x64-musl': 1.2.0-beta.0 - '@rspack/binding-win32-arm64-msvc': 1.2.0-beta.0 - '@rspack/binding-win32-ia32-msvc': 1.2.0-beta.0 - '@rspack/binding-win32-x64-msvc': 1.2.0-beta.0 - dev: true - - /@rspack/binding@1.2.3: - resolution: {integrity: sha512-enpOXZPQOJO800wdWcR7H5Dx5UZfwkaT0D0xsHD53WbpI09Z2KJbLX7I/i1FLLy3K1KQTB+2FIHLVdRikasXZA==} - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.2.3 - '@rspack/binding-darwin-x64': 1.2.3 - '@rspack/binding-linux-arm64-gnu': 1.2.3 - '@rspack/binding-linux-arm64-musl': 1.2.3 - '@rspack/binding-linux-x64-gnu': 1.2.3 - '@rspack/binding-linux-x64-musl': 1.2.3 - '@rspack/binding-win32-arm64-msvc': 1.2.3 - '@rspack/binding-win32-ia32-msvc': 1.2.3 - '@rspack/binding-win32-x64-msvc': 1.2.3 - dev: true - - /@rspack/binding@1.2.8: - resolution: {integrity: sha512-T3FMB3N9P1AbSAryfkSRJkPtmeSYs/Gj9zUZoPz1ckPEIcWZmpUOQbJylldjbw5waxtCL1haHNbi0pcSvxiaJw==} - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.2.8 - '@rspack/binding-darwin-x64': 1.2.8 - '@rspack/binding-linux-arm64-gnu': 1.2.8 - '@rspack/binding-linux-arm64-musl': 1.2.8 - '@rspack/binding-linux-x64-gnu': 1.2.8 - '@rspack/binding-linux-x64-musl': 1.2.8 - '@rspack/binding-win32-arm64-msvc': 1.2.8 - '@rspack/binding-win32-ia32-msvc': 1.2.8 - '@rspack/binding-win32-x64-msvc': 1.2.8 - dev: true - /@rspack/binding@1.3.10: resolution: {integrity: sha512-9TjO+Ig5U4VqdYWpBsv01n4d2KsgFfdXGIE7zdHXDDbry0avL0J4109ESqSeP9uC+Bi7ZCF53iaxJRvZDflNVQ==} optionalDependencies: @@ -16679,6 +16337,20 @@ packages: '@rspack/binding-win32-x64-msvc': 1.3.10 dev: true + /@rspack/binding@1.3.11: + resolution: {integrity: sha512-BbMfZHqfH+CzFtZDg+v9nbKifJIJDUPD6KuoWlHq581koKvD3UMx6oVrj9w13JvO2xWNPeHclmqWAFgoD7faEQ==} + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.3.11 + '@rspack/binding-darwin-x64': 1.3.11 + '@rspack/binding-linux-arm64-gnu': 1.3.11 + '@rspack/binding-linux-arm64-musl': 1.3.11 + '@rspack/binding-linux-x64-gnu': 1.3.11 + '@rspack/binding-linux-x64-musl': 1.3.11 + '@rspack/binding-win32-arm64-msvc': 1.3.11 + '@rspack/binding-win32-ia32-msvc': 1.3.11 + '@rspack/binding-win32-x64-msvc': 1.3.11 + dev: true + /@rspack/binding@1.3.9: resolution: {integrity: sha512-3FFen1/0F2aP5uuCm8vPaJOrzM3karCPNMsc5gLCGfEy2rsK38Qinf9W4p1bw7+FhjOTzoSdkX+LFHeMDVxJhw==} optionalDependencies: @@ -16721,7 +16393,7 @@ packages: '@module-federation/runtime-tools': 0.1.6 '@rspack/binding': 0.7.5 '@swc/helpers': 0.5.3 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 tapable: 2.2.1 webpack-sources: 3.2.3 dev: true @@ -16739,7 +16411,7 @@ packages: '@rspack/binding': 1.0.14 '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.13 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 /@rspack/core@1.0.8(@swc/helpers@0.5.13): resolution: {integrity: sha512-pbXwXYb4WQwb0l35P5v3l/NpDJXy1WiVE4IcQ/6LxZYU5NyZuqtsK0trR88xIVRZb9qU0JUeCdQq7Xa6Q+c3Xw==} @@ -16757,76 +16429,6 @@ packages: caniuse-lite: 1.0.30001667 dev: true - /@rspack/core@1.1.8(@swc/helpers@0.5.17): - resolution: {integrity: sha512-pcZtcj5iXLCuw9oElTYC47bp/RQADm/MMEb3djHdwJuSlFWfWPQi5QFgJ/lJAxIW9UNHnTFrYtytycfjpuoEcA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@swc/helpers': - optional: true - dependencies: - '@module-federation/runtime-tools': 0.5.1 - '@rspack/binding': 1.1.8 - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.17 - caniuse-lite: 1.0.30001717 - dev: true - - /@rspack/core@1.2.0-beta.0(@swc/helpers@0.5.17): - resolution: {integrity: sha512-0o0EYNeCwbRrh1l+P6HEKGS3Y+SVE/+J6SqDGGBsOixt/YzFeYNeaePWUnFfQ8a27jp9s//Ix6iuxMYGjWmitA==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@swc/helpers': - optional: true - dependencies: - '@module-federation/runtime-tools': 0.8.4 - '@rspack/binding': 1.2.0-beta.0 - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.17 - caniuse-lite: 1.0.30001717 - dev: true - - /@rspack/core@1.2.3(@swc/helpers@0.5.15): - resolution: {integrity: sha512-BFgdUYf05/hjjY9Nlwq8DpWaRJN5w2kTl8ZJi20SRL60oAx+ZD2ABT+fsPhBiFSmfTZDdvGGIq5e3vfRzoIuqg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@rspack/tracing': ^1.x - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@rspack/tracing': - optional: true - '@swc/helpers': - optional: true - dependencies: - '@module-federation/runtime-tools': 0.8.4 - '@rspack/binding': 1.2.3 - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001714 - dev: true - - /@rspack/core@1.2.8(@swc/helpers@0.5.15): - resolution: {integrity: sha512-ppj3uQQtkhgrYDLrUqb33YbpNEZCpAudpfVuOHGsvUrAnu1PijbfJJymoA5ZvUhM+HNMvPI5D1ie97TXyb0UVg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@rspack/tracing': ^1.x - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@rspack/tracing': - optional: true - '@swc/helpers': - optional: true - dependencies: - '@module-federation/runtime-tools': 0.8.4 - '@rspack/binding': 1.2.8 - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001706 - dev: true - /@rspack/core@1.3.10(@swc/helpers@0.5.17): resolution: {integrity: sha512-YomvSRGuMUQgCE2rNMdff2q1Z0YpZw/z6m5+PVTMSs9l/q69YKUzpbpSD8YyB5i1DddrRxC2RE34DkrBuwlREQ==} engines: {node: '>=16.0.0'} @@ -16840,11 +16442,11 @@ packages: '@rspack/binding': 1.3.10 '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 dev: true - /@rspack/core@1.3.9(@swc/helpers@0.5.13): - resolution: {integrity: sha512-u7usd9srCBPBfNJCSvsfh14AOPq6LCVna0Vb/aA2nyJTawHqzfAMz1QRb/e27nP3NrV6RPiwx03W494Dd6r6wg==} + /@rspack/core@1.3.11(@swc/helpers@0.5.17): + resolution: {integrity: sha512-aSYPtT1gum5MCfcFANdTroJ4JwzozuL3wX0twMGNAB7amq6+nZrbsUKWjcHgneCeZdahxzrKdyYef3FHaJ7lEA==} engines: {node: '>=16.0.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -16853,12 +16455,13 @@ packages: optional: true dependencies: '@module-federation/runtime-tools': 0.13.1 - '@rspack/binding': 1.3.9 + '@rspack/binding': 1.3.11 '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.13 - caniuse-lite: 1.0.30001717 + '@swc/helpers': 0.5.17 + caniuse-lite: 1.0.30001718 + dev: true - /@rspack/core@1.3.9(@swc/helpers@0.5.17): + /@rspack/core@1.3.9(@swc/helpers@0.5.13): resolution: {integrity: sha512-u7usd9srCBPBfNJCSvsfh14AOPq6LCVna0Vb/aA2nyJTawHqzfAMz1QRb/e27nP3NrV6RPiwx03W494Dd6r6wg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -16870,9 +16473,8 @@ packages: '@module-federation/runtime-tools': 0.13.1 '@rspack/binding': 1.3.9 '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.13 caniuse-lite: 1.0.30001717 - dev: true /@rspack/dev-server@1.1.1(@rspack/core@1.3.9)(@types/express@4.17.21)(webpack-cli@5.1.4)(webpack@5.98.0): resolution: {integrity: sha512-9r7vOml2SrFA8cvbcJdSan9wHEo1TPXezF22+s5jvdyAAywg8w7HqDol6TPVv64NUonP1DOdyLxZ+6UW6WZiwg==} @@ -16935,7 +16537,7 @@ packages: optional: true dependencies: error-stack-parser: 2.1.4 - html-entities: 2.5.2 + html-entities: 2.6.0 react-refresh: 0.16.0 dev: true @@ -17310,7 +16912,7 @@ packages: conventional-changelog-writer: 8.0.1 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.1.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) import-from-esm: 2.0.0 lodash-es: 4.17.21 micromatch: 4.0.8 @@ -17337,7 +16939,7 @@ packages: dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 execa: 5.1.1 lodash: 4.17.21 parse-json: 5.2.0 @@ -17354,7 +16956,7 @@ packages: dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 dir-glob: 3.0.1 execa: 5.1.1 lodash: 4.17.21 @@ -17377,7 +16979,7 @@ packages: '@octokit/plugin-throttling': 9.4.0(@octokit/core@6.1.4) '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) dir-glob: 3.0.1 globby: 14.1.0 http-proxy-agent: 7.0.2 @@ -17446,7 +17048,7 @@ packages: conventional-changelog-writer: 8.0.1 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.1.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) get-stream: 7.0.1 import-from-esm: 2.0.0 into-stream: 7.0.0 @@ -17510,7 +17112,7 @@ packages: '@sinonjs/commons': 3.0.1 dev: true - /@storybook/addon-actions@8.3.3(storybook@8.6.12): + /@storybook/addon-actions@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-cbpksmld7iADwDGXgojZ4r8LGI3YA3NP68duAHg2n1dtnx1oUaFK5wd6dbNuz7GdjyhIOIy3OKU1dAuylYNGOQ==} peerDependencies: storybook: ^8.3.3 @@ -17519,7 +17121,7 @@ packages: '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) uuid: 9.0.1 dev: true @@ -17536,14 +17138,14 @@ packages: uuid: 9.0.1 dev: true - /@storybook/addon-backgrounds@8.3.3(storybook@8.6.12): + /@storybook/addon-backgrounds@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-aX0OIrtjIB7UgSaiv20SFkfC1iWwJIGMPsPSJ5ZPhXIIOWIEBtSujh8YXwjDEXSC4DOHalmeT4bitRRe5KrVKA==} peerDependencies: storybook: ^8.3.3 dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) ts-dedent: 2.2.0 dev: true @@ -17558,7 +17160,7 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/addon-controls@8.3.3(storybook@8.6.12): + /@storybook/addon-controls@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-78xRtVpY7eX/Lti00JLgwYCBRB6ZcvzY3SWk0uQjEqcTnQGoQkVg2L7oWFDlDoA1LBY18P5ei2vu8MYT9GXU4g==} peerDependencies: storybook: ^8.3.3 @@ -17566,7 +17168,7 @@ packages: '@storybook/global': 5.0.0 dequal: 2.0.3 lodash: 4.17.21 - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) ts-dedent: 2.2.0 dev: true @@ -17581,23 +17183,23 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/addon-docs@8.3.3(storybook@8.6.12): + /@storybook/addon-docs@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-REUandqq1RnMNOhsocRwx5q2fdlBAYPTDFlKASYfEn4Ln5NgbQRGxOAWl7yXAAFzbDmUDU7K20hkauecF0tyMw==} peerDependencies: storybook: ^8.3.3 dependencies: '@mdx-js/react': 3.0.1(@types/react@18.3.11)(react@18.3.1) - '@storybook/blocks': 8.3.3(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.12) - '@storybook/csf-plugin': 8.3.3(storybook@8.6.12) + '@storybook/blocks': 8.3.3(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.14) + '@storybook/csf-plugin': 8.3.3(storybook@8.6.14) '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 8.3.3(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.12) + '@storybook/react-dom-shim': 8.3.3(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.14) '@types/react': 18.3.11 fs-extra: 11.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) rehype-external-links: 3.0.0 rehype-slug: 6.0.0 - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) ts-dedent: 2.2.0 transitivePeerDependencies: - webpack-sources @@ -17620,15 +17222,15 @@ packages: - '@types/react' dev: true - /@storybook/addon-docs@8.6.12(@types/react@18.3.11)(storybook@8.4.2): - resolution: {integrity: sha512-kEezQjAf/p3SpDzLABgg4fbT48B6dkT2LiZCKTRmCrJVtuReaAr4R9MMM6Jsph6XjbIj/SvOWf3CMeOPXOs9sg==} + /@storybook/addon-docs@8.6.14(@types/react@18.3.11)(storybook@8.4.2): + resolution: {integrity: sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ==} peerDependencies: - storybook: ^8.6.12 + storybook: ^8.6.14 dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) - '@storybook/blocks': 8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2) - '@storybook/csf-plugin': 8.6.12(storybook@8.4.2) - '@storybook/react-dom-shim': 8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2) + '@storybook/blocks': 8.6.14(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2) + '@storybook/csf-plugin': 8.6.14(storybook@8.4.2) + '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) storybook: 8.4.2(prettier@3.3.3) @@ -17637,38 +17239,21 @@ packages: - '@types/react' dev: true - /@storybook/addon-docs@8.6.4(@types/react@18.3.11)(storybook@8.4.2): - resolution: {integrity: sha512-+kbcjvEAH0Xs+k+raAwfC0WmJilWhxBYnLLeazP3m5AkVI3sIjbzuuZ78NR0DCdRkw9BpuuXMHv5o4tIvLIUlw==} - peerDependencies: - storybook: ^8.6.4 - dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) - '@storybook/blocks': 8.6.4(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2) - '@storybook/csf-plugin': 8.6.4(storybook@8.4.2) - '@storybook/react-dom-shim': 8.6.4(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 8.4.2(prettier@3.3.3) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - dev: true - - /@storybook/addon-essentials@8.3.3(storybook@8.6.12): + /@storybook/addon-essentials@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-E/uXoUYcg8ulG3lVbsEKb4v5hnMeGkq9YJqiZYKgVK7iRFa6p4HeVB1wU1adnm7RgjWvh+p0vQRo4KL2CTNXqw==} peerDependencies: storybook: ^8.3.3 dependencies: - '@storybook/addon-actions': 8.3.3(storybook@8.6.12) - '@storybook/addon-backgrounds': 8.3.3(storybook@8.6.12) - '@storybook/addon-controls': 8.3.3(storybook@8.6.12) - '@storybook/addon-docs': 8.3.3(storybook@8.6.12) - '@storybook/addon-highlight': 8.3.3(storybook@8.6.12) - '@storybook/addon-measure': 8.3.3(storybook@8.6.12) - '@storybook/addon-outline': 8.3.3(storybook@8.6.12) - '@storybook/addon-toolbars': 8.3.3(storybook@8.6.12) - '@storybook/addon-viewport': 8.3.3(storybook@8.6.12) - storybook: 8.6.12(prettier@3.3.3) + '@storybook/addon-actions': 8.3.3(storybook@8.6.14) + '@storybook/addon-backgrounds': 8.3.3(storybook@8.6.14) + '@storybook/addon-controls': 8.3.3(storybook@8.6.14) + '@storybook/addon-docs': 8.3.3(storybook@8.6.14) + '@storybook/addon-highlight': 8.3.3(storybook@8.6.14) + '@storybook/addon-measure': 8.3.3(storybook@8.6.14) + '@storybook/addon-outline': 8.3.3(storybook@8.6.14) + '@storybook/addon-toolbars': 8.3.3(storybook@8.6.14) + '@storybook/addon-viewport': 8.3.3(storybook@8.6.14) + storybook: 8.6.14(prettier@3.3.3) ts-dedent: 2.2.0 transitivePeerDependencies: - webpack-sources @@ -17694,13 +17279,13 @@ packages: - '@types/react' dev: true - /@storybook/addon-highlight@8.3.3(storybook@8.6.12): + /@storybook/addon-highlight@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-MB084xJM66rLU+iFFk34kjLUiAWzDiy6Kz4uZRa1CnNqEK0sdI8HaoQGgOxTIa2xgJor05/8/mlYlMkP/0INsQ==} peerDependencies: storybook: ^8.3.3 dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) dev: true /@storybook/addon-highlight@8.6.12(storybook@8.3.5): @@ -17725,13 +17310,13 @@ packages: ts-dedent: 2.2.0 dev: false - /@storybook/addon-measure@8.3.3(storybook@8.6.12): + /@storybook/addon-measure@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-R20Z83gnxDRrocES344dw1Of/zDhe3XHSM6TLq80UQTJ9PhnMI+wYHQlK9DsdP3KiRkI+pQA6GCOp0s2ZRy5dg==} peerDependencies: storybook: ^8.3.3 dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) tiny-invariant: 1.3.3 dev: true @@ -17745,13 +17330,13 @@ packages: tiny-invariant: 1.3.3 dev: true - /@storybook/addon-outline@8.3.3(storybook@8.6.12): + /@storybook/addon-outline@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-OwqYfieNuqSqWNtUZLu3UmsfQNnwA2UaSMBZyeC2Dte9Jd59PPYggcWmH+b0S6OTbYXWNAUK5U6WdK+X9Ypzdw==} peerDependencies: storybook: ^8.3.3 dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) ts-dedent: 2.2.0 dev: true @@ -17765,12 +17350,12 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/addon-toolbars@8.3.3(storybook@8.6.12): + /@storybook/addon-toolbars@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-4WyiVqDm4hlJdENIVQg9pLNLdfhnNKa+haerYYSzTVjzYrUx0X6Bxafshq+sud6aRtSYU14abwP56lfW8hgTlA==} peerDependencies: storybook: ^8.3.3 dependencies: - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) dev: true /@storybook/addon-toolbars@8.6.12(storybook@8.3.5): @@ -17781,13 +17366,13 @@ packages: storybook: 8.3.5 dev: true - /@storybook/addon-viewport@8.3.3(storybook@8.6.12): + /@storybook/addon-viewport@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-2S+UpbKAL+z1ppzUCkixjaem2UDMkfmm/kyJ1wm3A/ofGLYi4fjMSKNRckk+7NdolXGQJjBo0RcaotUTxFIFwQ==} peerDependencies: storybook: ^8.3.3 dependencies: memoizerific: 1.11.3 - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) dev: true /@storybook/addon-viewport@8.6.12(storybook@8.3.5): @@ -17799,7 +17384,7 @@ packages: storybook: 8.3.5 dev: true - /@storybook/blocks@8.3.3(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.12): + /@storybook/blocks@8.3.3(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.14): resolution: {integrity: sha512-8Vsvxqstop3xfbsx3Dn1nEjyxvQUcOYd8vpxyp2YumxYO8FlXIRuYL6HAkYbcX8JexsKvCZYxor52D2vUGIKZg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta @@ -17813,7 +17398,7 @@ packages: dependencies: '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 - '@storybook/icons': 1.2.12(react-dom@18.3.1)(react@18.3.1) + '@storybook/icons': 1.4.0(react-dom@18.3.1)(react@18.3.1) '@types/lodash': 4.17.9 color-convert: 2.0.1 dequal: 2.0.3 @@ -17824,7 +17409,7 @@ packages: react: 18.3.1 react-colorful: 5.6.1(react-dom@18.3.1)(react@18.3.1) react-dom: 18.3.1(react@18.3.1) - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) telejson: 7.2.0 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -17849,31 +17434,12 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/blocks@8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2): - resolution: {integrity: sha512-DohlTq6HM1jDbHYiXL4ZvZ00VkhpUp5uftzj/CZDLY1fYHRjqtaTwWm2/OpceivMA8zDitLcq5atEZN+f+siTg==} + /@storybook/blocks@8.6.14(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2): + resolution: {integrity: sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^8.6.12 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - dependencies: - '@storybook/icons': 1.4.0(react-dom@18.3.1)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 8.4.2(prettier@3.3.3) - ts-dedent: 2.2.0 - dev: true - - /@storybook/blocks@8.6.4(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2): - resolution: {integrity: sha512-+oPXwT3KzJzsdkQuGEzBqOKTIFlb6qmlCWWbDwAnP0SEqYHoTVRTAIa44icFP0EZeIe+ypFVAm1E7kWTLmw1hQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^8.6.4 + storybook: ^8.6.14 peerDependenciesMeta: react: optional: true @@ -17971,7 +17537,7 @@ packages: dependencies: '@babel/core': 7.26.10 '@babel/preset-env': 7.26.0(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.6.20 '@storybook/core-common': 7.6.20(encoding@0.1.13) @@ -18027,7 +17593,7 @@ packages: dependencies: '@babel/core': 7.26.10 '@babel/preset-env': 7.26.0(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@storybook/csf': 0.1.12 '@storybook/csf-tools': 7.6.20 '@storybook/node-logger': 7.6.20 @@ -18066,20 +17632,20 @@ packages: - '@types/react-dom' dev: true - /@storybook/components@8.3.5(storybook@8.4.2): - resolution: {integrity: sha512-Rq28YogakD3FO4F8KwAtGpo1g3t4V/gfCLqTQ8B6oQUFoxLqegkWk/DlwCzvoJndXuQJfdSyM6+r1JcA4Nql5A==} + /@storybook/components@8.6.12(storybook@8.3.5): + resolution: {integrity: sha512-FiaE8xvCdvKC2arYusgtlDNZ77b8ysr8njAYQZwwaIHjy27TbR2tEpLDCmUwSbANNmivtc/xGEiDDwcNppMWlQ==} peerDependencies: - storybook: ^8.3.5 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.4.2(prettier@3.3.3) + storybook: 8.3.5 dev: true - /@storybook/components@8.6.12(storybook@8.3.5): + /@storybook/components@8.6.12(storybook@8.4.2): resolution: {integrity: sha512-FiaE8xvCdvKC2arYusgtlDNZ77b8ysr8njAYQZwwaIHjy27TbR2tEpLDCmUwSbANNmivtc/xGEiDDwcNppMWlQ==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.3.5 + storybook: 8.4.2(prettier@3.3.3) dev: true /@storybook/core-client@7.6.20: @@ -18210,15 +17776,6 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/core-webpack@8.6.4(storybook@8.4.2): - resolution: {integrity: sha512-/E+NDs4Ls2KQhQJyEbqyddvcevPGCNbBIRoR691gq2lnZV7lYFfhpGfYlXL1uSoA3WUWmql/gBsa2/O3vB+HKg==} - peerDependencies: - storybook: ^8.6.4 - dependencies: - storybook: 8.4.2(prettier@3.3.3) - ts-dedent: 2.2.0 - dev: true - /@storybook/core@8.3.5: resolution: {integrity: sha512-GOGfTvdioNa/n+Huwg4u/dsyYyBcM+gEcdxi3B7i5x4yJ3I912KoVshumQAOF2myKSRdI8h8aGWdx7nnjd0+5Q==} dependencies: @@ -18231,7 +17788,7 @@ packages: express: 4.21.2 jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 - recast: 0.23.9 + recast: 0.23.11 semver: 7.6.3 util: 0.12.5 ws: 8.18.0 @@ -18292,15 +17849,15 @@ packages: - utf-8-validate dev: true - /@storybook/core@8.6.12(prettier@3.3.3)(storybook@8.6.12): - resolution: {integrity: sha512-t+ZuDzAlsXKa6tLxNZT81gEAt4GNwsKP/Id2wluhmUWD/lwYW0uum1JiPUuanw8xD6TdakCW/7ULZc7aQUBLCQ==} + /@storybook/core@8.6.14(prettier@3.3.3)(storybook@8.6.14): + resolution: {integrity: sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==} peerDependencies: prettier: ^2 || ^3 peerDependenciesMeta: prettier: optional: true dependencies: - '@storybook/theming': 8.6.12(storybook@8.6.12) + '@storybook/theming': 8.6.14(storybook@8.6.14) better-opn: 3.0.2 browser-assert: 1.2.1 esbuild: 0.25.0 @@ -18328,12 +17885,12 @@ packages: - supports-color dev: true - /@storybook/csf-plugin@8.3.3(storybook@8.6.12): + /@storybook/csf-plugin@8.3.3(storybook@8.6.14): resolution: {integrity: sha512-7AD7ojpXr3THqpTcEI4K7oKUfSwt1hummgL/cASuQvEPOwAZCVZl2gpGtKxcXhtJXTkn3GMCAvlYMoe7O/1YWw==} peerDependencies: storybook: ^8.3.3 dependencies: - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) unplugin: 1.14.1 transitivePeerDependencies: - webpack-sources @@ -18348,19 +17905,10 @@ packages: unplugin: 1.16.1 dev: true - /@storybook/csf-plugin@8.6.12(storybook@8.4.2): - resolution: {integrity: sha512-6s8CnP1aoKPb3XtC0jRLUp8M5vTA8RhGAwQDKUsFpCC7g89JR9CaKs9FY2ZSzsNbjR15uASi7b3K8BzeYumYQg==} + /@storybook/csf-plugin@8.6.14(storybook@8.4.2): + resolution: {integrity: sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ==} peerDependencies: - storybook: ^8.6.12 - dependencies: - storybook: 8.4.2(prettier@3.3.3) - unplugin: 1.16.1 - dev: true - - /@storybook/csf-plugin@8.6.4(storybook@8.4.2): - resolution: {integrity: sha512-7UpEp4PFTy1iKjZiRaYMG7zvnpLIRPyD0+lUJUlLYG4UIemV3onvnIi1Je1tSZ4hfTup+ulom7JLztVSHZGRMg==} - peerDependencies: - storybook: ^8.6.4 + storybook: ^8.6.14 dependencies: storybook: 8.4.2(prettier@3.3.3) unplugin: 1.16.1 @@ -18369,10 +17917,10 @@ packages: /@storybook/csf-tools@7.6.20: resolution: {integrity: sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==} dependencies: - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 '@storybook/csf': 0.1.12 '@storybook/types': 7.6.20 fs-extra: 11.3.0 @@ -18415,17 +17963,6 @@ packages: /@storybook/global@5.0.0: resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - /@storybook/icons@1.2.12(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-UxgyK5W3/UV4VrI3dl6ajGfHM4aOqMAkFLWe2KibeQudLf6NJpDrDMSHwZj+3iKC4jFU7dkKbbtH2h/al4sW3Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@storybook/icons@1.4.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} engines: {node: '>=14.0.0'} @@ -18446,20 +17983,20 @@ packages: '@vitest/utils': 2.1.1 storybook: 8.3.5 - /@storybook/manager-api@8.3.5(storybook@8.4.2): - resolution: {integrity: sha512-fEQoKKi7h7pzh2z9RfuzatJxubrsfL/CB99fNXQ0wshMSY/7O4ckd18pK4fzG9ErnCtLAO9qsim4N/4eQC+/8Q==} + /@storybook/manager-api@8.6.12(storybook@8.3.5): + resolution: {integrity: sha512-O0SpISeJLNTQvhSBOsWzzkCgs8vCjOq1578rwqHlC6jWWm4QmtfdyXqnv7rR1Hk08kQ+Dzqh0uhwHx0nfwy4nQ==} peerDependencies: - storybook: ^8.3.5 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.4.2(prettier@3.3.3) + storybook: 8.3.5 dev: true - /@storybook/manager-api@8.6.12(storybook@8.3.5): + /@storybook/manager-api@8.6.12(storybook@8.4.2): resolution: {integrity: sha512-O0SpISeJLNTQvhSBOsWzzkCgs8vCjOq1578rwqHlC6jWWm4QmtfdyXqnv7rR1Hk08kQ+Dzqh0uhwHx0nfwy4nQ==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.3.5 + storybook: 8.4.2(prettier@3.3.3) dev: true /@storybook/manager@7.6.20: @@ -18587,7 +18124,7 @@ packages: find-up: 5.0.0 magic-string: 0.30.17 react: 18.3.1 - react-docgen: 7.1.0 + react-docgen: 7.1.1 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.8 semver: 7.6.3 @@ -18623,20 +18160,20 @@ packages: util-deprecate: 1.0.2 dev: true - /@storybook/preview-api@8.3.5(storybook@8.4.2): - resolution: {integrity: sha512-VPqpudE8pmjTLvdNJoW/2//nqElDgUOmIn3QxbbCmdZTHDg5tFtxuqwdlNfArF0TxvTSBDIulXt/Q6K56TAfTg==} + /@storybook/preview-api@8.6.12(storybook@8.3.5): + resolution: {integrity: sha512-84FE3Hrs0AYKHqpDZOwx1S/ffOfxBdL65lhCoeI8GoWwCkzwa9zEP3kvXBo/BnEDO7nAfxvMhjASTZXbKRJh5Q==} peerDependencies: - storybook: ^8.3.5 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.4.2(prettier@3.3.3) + storybook: 8.3.5 dev: true - /@storybook/preview-api@8.6.12(storybook@8.3.5): + /@storybook/preview-api@8.6.12(storybook@8.4.2): resolution: {integrity: sha512-84FE3Hrs0AYKHqpDZOwx1S/ffOfxBdL65lhCoeI8GoWwCkzwa9zEP3kvXBo/BnEDO7nAfxvMhjASTZXbKRJh5Q==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.3.5 + storybook: 8.4.2(prettier@3.3.3) dev: true /@storybook/preview@7.6.20: @@ -18649,7 +18186,7 @@ packages: typescript: '>= 3.x' webpack: '>= 4' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -18668,7 +18205,7 @@ packages: typescript: '>= 4.x' webpack: '>= 4' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -18687,7 +18224,7 @@ packages: typescript: '>= 4.x' webpack: '>= 4' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -18710,7 +18247,7 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: true - /@storybook/react-dom-shim@8.3.3(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.12): + /@storybook/react-dom-shim@8.3.3(react-dom@18.3.1)(react@18.3.1)(storybook@8.6.14): resolution: {integrity: sha512-0dPC9K7+K5+X/bt3GwYmh+pCpisUyKVjWsI+PkzqGnWqaXFakzFakjswowIAIO1rf7wYZR591x3ehUAyL2bJiQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta @@ -18719,19 +18256,7 @@ packages: dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.6.12(prettier@3.3.3) - dev: true - - /@storybook/react-dom-shim@8.3.5(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2): - resolution: {integrity: sha512-Hf0UitJ/K0C7ajooooUK/PxOR4ihUWqsC7iCV1Gqth8U37dTeLMbaEO4PBwu0VQ+Ufg0N8BJLWfg7o6G4hrODw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.3.5 - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - storybook: 8.4.2(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) dev: true /@storybook/react-dom-shim@8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5): @@ -18758,12 +18283,12 @@ packages: storybook: 8.4.2(prettier@3.3.3) dev: true - /@storybook/react-dom-shim@8.6.4(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2): - resolution: {integrity: sha512-kTGJ3aFdmfCFzYaDFGmZWfTXr9xhbUaf0tJ6+nEjc4tME6mFwMI+tTUT6U/J6mJhZuc2DjvIRA7bM0x77dIDqw==} + /@storybook/react-dom-shim@8.6.14(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2): + resolution: {integrity: sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.4 + storybook: ^8.6.14 dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -18810,14 +18335,14 @@ packages: - supports-color dev: true - /@storybook/react@8.3.5(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2)(typescript@5.7.3): - resolution: {integrity: sha512-kuBPe/wBin10SWr4EWPKxiTRGQ4RD2etGEVWVQLqVpOuJp/J2hVvXQHtCfZXU4TZT5x4PBbPRswbr58+XlF+kQ==} + /@storybook/react@8.6.12(@storybook/test@8.6.12)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.7.3): + resolution: {integrity: sha512-NzxlHLA5DkDgZM/dMwTYinuzRs6rsUPmlqP+NIv6YaciQ4NGnTYyOC7R/SqI6HHFm8ZZ5eMYvpfiFmhZ9rU+rQ==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.3.5 + '@storybook/test': 8.6.12 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.3.5 + storybook: ^8.6.12 typescript: '>= 4.2.x' peerDependenciesMeta: '@storybook/test': @@ -18825,33 +18350,20 @@ packages: typescript: optional: true dependencies: - '@storybook/components': 8.3.5(storybook@8.4.2) + '@storybook/components': 8.6.12(storybook@8.3.5) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.3.5(storybook@8.4.2) - '@storybook/preview-api': 8.3.5(storybook@8.4.2) - '@storybook/react-dom-shim': 8.3.5(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2) - '@storybook/theming': 8.3.5(storybook@8.4.2) - '@types/escodegen': 0.0.6 - '@types/estree': 0.0.51 - '@types/node': 22.7.4 - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - acorn-walk: 7.2.0 - escodegen: 2.1.0 - html-tags: 3.3.1 - prop-types: 15.8.1 + '@storybook/manager-api': 8.6.12(storybook@8.3.5) + '@storybook/preview-api': 8.6.12(storybook@8.3.5) + '@storybook/react-dom-shim': 8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5) + '@storybook/test': 8.6.12(storybook@8.3.5) + '@storybook/theming': 8.6.12(storybook@8.3.5) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-element-to-jsx-string: 15.0.0(react-dom@18.3.1)(react@18.3.1) - semver: 7.6.3 - storybook: 8.4.2(prettier@3.3.3) - ts-dedent: 2.2.0 - type-fest: 2.19.0 + storybook: 8.3.5 typescript: 5.7.3 - util-deprecate: 1.0.2 dev: true - /@storybook/react@8.6.12(@storybook/test@8.6.12)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.7.3): + /@storybook/react@8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2)(typescript@5.7.3): resolution: {integrity: sha512-NzxlHLA5DkDgZM/dMwTYinuzRs6rsUPmlqP+NIv6YaciQ4NGnTYyOC7R/SqI6HHFm8ZZ5eMYvpfiFmhZ9rU+rQ==} engines: {node: '>=18.0.0'} peerDependencies: @@ -18866,16 +18378,15 @@ packages: typescript: optional: true dependencies: - '@storybook/components': 8.6.12(storybook@8.3.5) + '@storybook/components': 8.6.12(storybook@8.4.2) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.12(storybook@8.3.5) - '@storybook/preview-api': 8.6.12(storybook@8.3.5) - '@storybook/react-dom-shim': 8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5) - '@storybook/test': 8.6.12(storybook@8.3.5) - '@storybook/theming': 8.6.12(storybook@8.3.5) + '@storybook/manager-api': 8.6.12(storybook@8.4.2) + '@storybook/preview-api': 8.6.12(storybook@8.4.2) + '@storybook/react-dom-shim': 8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2) + '@storybook/theming': 8.6.12(storybook@8.4.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.3.5 + storybook: 8.4.2(prettier@3.3.3) typescript: 5.7.3 dev: true @@ -18931,28 +18442,28 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: true - /@storybook/theming@8.3.5(storybook@8.4.2): - resolution: {integrity: sha512-9HmDDyC691oqfg4RziIM9ElsS2HITaxmH7n/yeUPtuirkPdAQzqOzhvH/Sa0qOhifzs8VjR+Gd/a/ZQ+S38r7w==} + /@storybook/theming@8.6.12(storybook@8.3.5): + resolution: {integrity: sha512-6VjZg8HJ2Op7+KV7ihJpYrDnFtd9D1jrQnUS8LckcpuBXrIEbaut5+34ObY8ssQnSqkk2GwIZBBBQYQBCVvkOw==} peerDependencies: - storybook: ^8.3.5 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.4.2(prettier@3.3.3) + storybook: 8.3.5 dev: true - /@storybook/theming@8.6.12(storybook@8.3.5): + /@storybook/theming@8.6.12(storybook@8.4.2): resolution: {integrity: sha512-6VjZg8HJ2Op7+KV7ihJpYrDnFtd9D1jrQnUS8LckcpuBXrIEbaut5+34ObY8ssQnSqkk2GwIZBBBQYQBCVvkOw==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.3.5 + storybook: 8.4.2(prettier@3.3.3) dev: true - /@storybook/theming@8.6.12(storybook@8.6.12): - resolution: {integrity: sha512-6VjZg8HJ2Op7+KV7ihJpYrDnFtd9D1jrQnUS8LckcpuBXrIEbaut5+34ObY8ssQnSqkk2GwIZBBBQYQBCVvkOw==} + /@storybook/theming@8.6.14(storybook@8.6.14): + resolution: {integrity: sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 dependencies: - storybook: 8.6.12(prettier@3.3.3) + storybook: 8.6.14(prettier@3.3.3) dev: true /@storybook/types@7.6.20: @@ -19089,7 +18600,7 @@ packages: resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} engines: {node: '>=14'} dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 entities: 4.5.0 /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0): @@ -19183,7 +18694,7 @@ packages: '@swc-node/sourcemap-support': 0.5.1 '@swc/core': 1.7.26(@swc/helpers@0.5.13) colorette: 2.0.20 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) oxc-resolver: 5.2.0 pirates: 4.0.7 tslib: 2.8.1 @@ -19456,12 +18967,6 @@ packages: dependencies: tslib: 2.6.3 - /@swc/helpers@0.5.15: - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - dependencies: - tslib: 2.8.1 - dev: true - /@swc/helpers@0.5.17: resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} dependencies: @@ -19723,20 +19228,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 dev: true /@types/babel__traverse@7.20.6: resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 dev: true /@types/body-parser@1.19.5: @@ -20365,12 +19870,6 @@ packages: undici-types: 5.26.5 dev: true - /@types/node@22.7.4: - resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} - dependencies: - undici-types: 6.19.8 - dev: true - /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true @@ -20413,6 +19912,14 @@ packages: '@types/react': 18.2.79 dev: true + /@types/react-dom@18.3.7(@types/react@18.2.79): + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + dependencies: + '@types/react': 18.2.79 + dev: true + /@types/react-dom@19.0.4(@types/react@19.0.12): resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} peerDependencies: @@ -20601,7 +20108,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.0.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.0.4) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -20653,7 +20160,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.0.4) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) eslint: 8.57.1 typescript: 5.0.4 transitivePeerDependencies: @@ -20674,7 +20181,7 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) eslint: 8.57.1 typescript: 5.7.3 transitivePeerDependencies: @@ -20695,7 +20202,7 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) eslint: 9.0.0 typescript: 5.4.5 transitivePeerDependencies: @@ -20716,7 +20223,7 @@ packages: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 eslint: 8.57.1 typescript: 5.7.3 transitivePeerDependencies: @@ -20775,7 +20282,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.0.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.0.4) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) eslint: 8.57.1 tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 @@ -20795,7 +20302,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) eslint: 8.57.1 ts-api-utils: 1.3.0(typescript@5.7.3) typescript: 5.7.3 @@ -20814,7 +20321,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.7.3) '@typescript-eslint/utils': 8.8.0(eslint@8.57.1)(typescript@5.7.3) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) ts-api-utils: 1.3.0(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: @@ -20858,7 +20365,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -20879,7 +20386,7 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -20901,7 +20408,7 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -20923,7 +20430,7 @@ packages: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -20945,7 +20452,7 @@ packages: dependencies: '@typescript-eslint/types': 8.14.0 '@typescript-eslint/visitor-keys': 8.14.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -20967,7 +20474,7 @@ packages: dependencies: '@typescript-eslint/types': 8.8.0 '@typescript-eslint/visitor-keys': 8.8.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -21308,7 +20815,7 @@ packages: '@verdaccio/loaders': 8.0.0-next-8.6 '@verdaccio/signature': 8.0.0-next-8.7 '@verdaccio/utils': 8.1.0-next-8.15 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) lodash: 4.17.21 verdaccio-htpasswd: 13.0.0-next-8.15 transitivePeerDependencies: @@ -21327,7 +20834,7 @@ packages: dependencies: '@verdaccio/core': 8.0.0-next-8.15 '@verdaccio/utils': 8.1.0-next-8.15 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) js-yaml: 4.1.0 lodash: 4.17.21 minimatch: 7.4.6 @@ -21361,7 +20868,7 @@ packages: resolution: {integrity: sha512-yuqD8uAZJcgzuNHjV6C438UNT5r2Ai9+SnUlO34AHZdWSYcluO3Zj5R3p5uf+C7YPCE31pUD27wBU74xVbUoBw==} engines: {node: '>=18'} dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) lodash: 4.17.21 transitivePeerDependencies: - supports-color @@ -21388,7 +20895,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.15 '@verdaccio/logger-prettify': 8.0.0-next-8.2 colorette: 2.0.20 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color @@ -21419,7 +20926,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.15 '@verdaccio/url': 13.0.0-next-8.15 '@verdaccio/utils': 8.1.0-next-8.15 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) express: 4.21.2 express-rate-limit: 5.5.1 lodash: 4.17.21 @@ -21437,7 +20944,7 @@ packages: engines: {node: '>=18'} dependencies: '@verdaccio/config': 8.0.0-next-8.15 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) jsonwebtoken: 9.0.2 transitivePeerDependencies: - supports-color @@ -21453,7 +20960,7 @@ packages: '@verdaccio/core': 8.0.0-next-8.15 '@verdaccio/url': 13.0.0-next-8.15 '@verdaccio/utils': 8.1.0-next-8.15 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) gunzip-maybe: 1.4.2 lodash: 4.17.21 tar-stream: 3.1.7 @@ -21468,7 +20975,7 @@ packages: engines: {node: '>=18'} dependencies: '@verdaccio/core': 8.0.0-next-8.15 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) lodash: 4.17.21 validator: 13.12.0 transitivePeerDependencies: @@ -21558,7 +21065,7 @@ packages: peerDependencies: vitest: 1.6.0 dependencies: - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 @@ -21579,7 +21086,7 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -21807,7 +21314,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 @@ -21829,7 +21336,7 @@ packages: /@vue/compiler-core@3.5.13: resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} dependencies: - '@babel/parser': 7.27.0 + '@babel/parser': 7.27.2 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -22695,7 +22202,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color @@ -22703,7 +22210,7 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -23572,7 +23079,7 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -23745,7 +23252,7 @@ packages: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - '@babel/traverse': 7.27.0 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color @@ -23786,8 +23293,8 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.27.0 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 dev: true @@ -23890,6 +23397,20 @@ packages: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 '@babel/traverse': 7.27.0 + dev: true + + /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.26.10)(@babel/traverse@7.27.1): + resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} + peerDependencies: + '@babel/core': ^7 + '@babel/traverse': ^7 + peerDependenciesMeta: + '@babel/traverse': + optional: true + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.27.1 /babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2): resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} @@ -23963,7 +23484,7 @@ packages: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 dev: true /bail@1.0.5: @@ -24263,7 +23784,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 electron-to-chromium: 1.5.86 node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.4) @@ -24495,7 +24016,7 @@ packages: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001717 + caniuse-lite: 1.0.30001718 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -24513,13 +24034,12 @@ packages: /caniuse-lite@1.0.30001706: resolution: {integrity: sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==} - /caniuse-lite@1.0.30001714: - resolution: {integrity: sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==} - dev: true - /caniuse-lite@1.0.30001717: resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} + /caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} engines: {node: '>=4'} @@ -25268,8 +24788,8 @@ packages: /constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 dev: true /constants-browserify@1.0.0: @@ -25489,20 +25009,10 @@ packages: resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} requiresBuild: true - /core-js@3.39.0: - resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==} - requiresBuild: true - dev: true - /core-js@3.40.0: resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} requiresBuild: true - /core-js@3.41.0: - resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} - requiresBuild: true - dev: true - /core-js@3.42.0: resolution: {integrity: sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==} requiresBuild: true @@ -26499,7 +26009,7 @@ packages: dependencies: ms: 2.1.2 - /debug@4.3.7(supports-color@9.3.1): + /debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: @@ -26509,7 +26019,6 @@ packages: optional: true dependencies: ms: 2.1.3 - supports-color: 9.3.1 /debug@4.4.0(supports-color@5.5.0): resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} @@ -26534,6 +26043,19 @@ packages: dependencies: ms: 2.1.3 supports-color: 8.1.1 + dev: true + + /debug@4.4.0(supports-color@9.3.1): + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 9.3.1 /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -26778,7 +26300,7 @@ packages: hasBin: true dependencies: address: 1.2.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color @@ -27234,7 +26756,7 @@ packages: is-string: 1.0.7 is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.2 + object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.2 @@ -27504,7 +27026,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) esbuild: 0.17.19 transitivePeerDependencies: - supports-color @@ -27515,7 +27037,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) esbuild: 0.18.20 transitivePeerDependencies: - supports-color @@ -27526,7 +27048,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) esbuild: 0.23.0 transitivePeerDependencies: - supports-color @@ -27536,7 +27058,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) esbuild: 0.24.0 transitivePeerDependencies: - supports-color @@ -27547,7 +27069,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) esbuild: 0.25.0 transitivePeerDependencies: - supports-color @@ -27915,7 +27437,7 @@ packages: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7(supports-color@8.1.1) - is-core-module: 2.15.1 + is-core-module: 2.16.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color @@ -27935,7 +27457,7 @@ packages: optional: true dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) enhanced-resolve: 5.17.1 eslint: 9.0.0 eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.0.0) @@ -28104,7 +27626,7 @@ packages: eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -28141,7 +27663,7 @@ packages: eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.0.0) hasown: 2.0.2 - is-core-module: 2.15.1 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -28504,7 +28026,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -28550,7 +28072,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -28633,8 +28155,8 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -29169,16 +28691,6 @@ packages: picomatch: 2.3.1 dev: false - /fdir@6.4.2(picomatch@4.0.2): - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - dependencies: - picomatch: 4.0.2 - /fdir@6.4.4(picomatch@4.0.2): resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: @@ -29188,7 +28700,6 @@ packages: optional: true dependencies: picomatch: 4.0.2 - dev: true /fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} @@ -29537,7 +29048,7 @@ packages: debug: optional: true dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -29636,7 +29147,7 @@ packages: typescript: '>3.6.0' webpack: ^5.11.0 dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -30915,7 +30426,6 @@ packages: /html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - dev: true /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -31055,7 +30565,7 @@ packages: peerDependencies: react: '>=15.6.1' dependencies: - html-entities: 2.5.2 + html-entities: 2.6.0 htmlparser2: 6.1.0 react: 18.3.1 dev: false @@ -31146,7 +30656,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -31156,7 +30666,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -31184,7 +30694,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/http-proxy': 1.17.15 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) http-proxy: 1.18.1(debug@4.4.0) is-glob: 4.0.3 is-plain-object: 5.0.0 @@ -31255,7 +30765,7 @@ packages: engines: {node: '>= 6.0.0'} dependencies: agent-base: 5.1.1 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -31265,7 +30775,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color @@ -31274,7 +30784,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -31284,7 +30794,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -31441,7 +30951,7 @@ packages: resolution: {integrity: sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==} engines: {node: '>=18.20'} dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) import-meta-resolve: 4.1.0 transitivePeerDependencies: - supports-color @@ -31594,7 +31104,7 @@ packages: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 dev: true /interpret@3.1.1: @@ -31741,6 +31251,13 @@ packages: dependencies: hasown: 2.0.2 + /is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + /is-data-descriptor@1.0.1: resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} engines: {node: '>= 0.4'} @@ -32213,11 +31730,6 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - /isomorphic-rslog@0.0.6: - resolution: {integrity: sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==} - engines: {node: '>=14.17.6'} - dev: true - /isomorphic-ws@5.0.0(ws@8.17.1): resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: @@ -32257,7 +31769,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/parser': 7.27.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -32270,7 +31782,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/parser': 7.27.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.3 @@ -32291,7 +31803,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -32303,7 +31815,7 @@ packages: engines: {node: '>=10'} dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -32703,7 +32215,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -32832,7 +32344,7 @@ packages: '@babel/generator': 7.26.9 '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.26.10) '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.26.10) - '@babel/types': 7.27.0 + '@babel/types': 7.27.1 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -33035,7 +32547,7 @@ packages: optional: true dependencies: '@babel/core': 7.26.10 - '@babel/parser': 7.27.0 + '@babel/parser': 7.27.2 '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.10) @@ -33043,7 +32555,7 @@ packages: '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) '@babel/preset-env': 7.26.0(@babel/core@7.26.10) '@babel/preset-flow': 7.25.7(@babel/core@7.26.10) - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.10) + '@babel/preset-typescript': 7.27.1(@babel/core@7.26.10) '@babel/register': 7.25.7(@babel/core@7.26.10) babel-core: 7.0.0-bridge.0(@babel/core@7.26.10) chalk: 4.1.2 @@ -33369,7 +32881,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -33400,7 +32912,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -33431,7 +32943,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -33630,17 +33142,17 @@ packages: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.1 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.4.0(supports-color@9.3.1) execa: 7.2.0 lilconfig: 2.1.0 listr2: 5.0.8 micromatch: 4.0.8 normalize-path: 3.0.0 - object-inspect: 1.13.2 + object-inspect: 1.13.4 pidtree: 0.6.0 string-argv: 0.3.2 supports-color: 9.3.1 - yaml: 2.5.1 + yaml: 2.7.0 transitivePeerDependencies: - enquirer dev: true @@ -33698,7 +33210,7 @@ packages: log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.4.1 - rxjs: 7.8.1 + rxjs: 7.8.2 through: 2.3.8 wrap-ansi: 7.0.0 dev: true @@ -33945,7 +33457,7 @@ packages: engines: {node: '>=8.0'} dependencies: date-format: 4.0.14 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 flatted: 3.3.1 rfdc: 1.4.1 streamroller: 3.1.5 @@ -34811,7 +34323,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -34977,7 +34489,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - schema-utils: 4.3.0 + schema-utils: 4.3.2 tapable: 2.2.1 webpack: 5.99.9(@swc/core@1.10.18)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true @@ -35290,7 +34802,7 @@ packages: resolution: {integrity: sha512-0mvZ1o5F0GStEzsZIrlGAYmLOtrILwMCh2vHAT1J2qZdyCqgMUo/5FBVk1B54pmCZCDxOS8mMm3MAIW5nCDL3w==} dependencies: '@vercel/nft': 0.27.3(encoding@0.1.13) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) fs-extra: 11.3.0 mlly: 1.6.1 pkg-types: 1.2.1 @@ -36116,10 +35628,6 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} - /object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - /object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -36649,7 +36157,7 @@ packages: resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} engines: {node: '>=18'} dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 index-to-position: 0.1.2 type-fest: 4.37.0 dev: true @@ -38370,7 +37878,7 @@ packages: engines: {node: '>=8.16.0'} dependencies: '@types/mime-types': 2.1.4 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) extract-zip: 1.7.0 https-proxy-agent: 4.0.0 mime: 2.6.0 @@ -40050,7 +39558,7 @@ packages: hasBin: true dependencies: '@babel/core': 7.26.10 - '@babel/generator': 7.27.0 + '@babel/generator': 7.27.1 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -40063,13 +39571,13 @@ packages: - supports-color dev: true - /react-docgen@7.1.0: - resolution: {integrity: sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==} + /react-docgen@7.1.1: + resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} engines: {node: '>=16.14.0'} dependencies: - '@babel/core': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/core': 7.26.10 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 '@types/doctrine': 0.0.9 @@ -40699,7 +40207,6 @@ packages: source-map: 0.6.1 tiny-invariant: 1.3.3 tslib: 2.8.1 - dev: true /recast@0.23.9: resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==} @@ -40710,6 +40217,7 @@ packages: source-map: 0.6.1 tiny-invariant: 1.3.3 tslib: 2.8.1 + dev: true /rechoir@0.8.0: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} @@ -40728,6 +40236,7 @@ packages: resolution: {integrity: sha512-/JCYSgL/QeXXsq0Lv/7kOZfqvof7vyzHWfyNQPt3c6vc73mU4WRyT8RJ6ZH5Ci08vUOqXwk7jkZy6BycHTDD9w==} dependencies: browserslist: 4.24.4 + dev: false /reduce-configs@1.1.0: resolution: {integrity: sha512-DQxy6liNadHfrLahZR7lMdc227NYVaQZhY5FMsxLEjX8X0SCuH+ESHSLCoz2yDZFq1/CLMDOAHdsEHwOEXKtvg==} @@ -41143,6 +40652,16 @@ packages: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} + /resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -41155,7 +40674,7 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -41369,29 +40888,9 @@ packages: resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} dev: true - /rsbuild-plugin-dts@0.2.0(@rsbuild/core@1.1.12)(typescript@5.7.3): - resolution: {integrity: sha512-62ioO9WoBeSzaE81Vq+MLJm0ZPdP8osyYnQLdy49pFHw8avhyR58NJdMevrwVC54k4ziaTQrTa4mAJwXN0Z62A==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@microsoft/api-extractor': ^7 - '@rsbuild/core': 1.x - typescript: ^5 - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - typescript: - optional: true - dependencies: - '@rsbuild/core': 1.1.12 - magic-string: 0.30.17 - picocolors: 1.1.1 - tinyglobby: 0.2.10 - typescript: 5.7.3 - dev: true - - /rsbuild-plugin-dts@0.3.2(@rsbuild/core@1.2.0-beta.1)(typescript@5.7.3): - resolution: {integrity: sha512-Gjaf5ANA6R9t92Va6utNG1iyRxCE0QLoswKvR5UkOkX5GUpNyWveze+k/6L/qrkgqGRuJqUuYX3lrwatrOUZ3A==} - engines: {node: '>=16.0.0'} + /rsbuild-plugin-dts@0.9.0(@rsbuild/core@1.3.21)(typescript@5.7.3): + resolution: {integrity: sha512-cWlBxFWo2t2wVUFIa0nnGUkqaHsSEQuGr4/vh1W9aPtFxjuu3UYnDK8b6CYmbLpUbiRB1R4gkjARoaBx74gyTQ==} + engines: {node: '>=16.7.0'} peerDependencies: '@microsoft/api-extractor': ^7 '@rsbuild/core': 1.x @@ -41402,14 +40901,16 @@ packages: typescript: optional: true dependencies: - '@rsbuild/core': 1.2.0-beta.1 + '@ast-grep/napi': 0.37.0 + '@rsbuild/core': 1.3.21 magic-string: 0.30.17 picocolors: 1.1.1 - tinyglobby: 0.2.10 + tinyglobby: 0.2.14 + tsconfig-paths: 4.2.0 typescript: 5.7.3 dev: true - /rsbuild-plugin-html-minifier-terser@1.1.1(@rsbuild/core@1.3.20): + /rsbuild-plugin-html-minifier-terser@1.1.1(@rsbuild/core@1.3.21): resolution: {integrity: sha512-rbDLv+XmGeSQo9JWKSwBst3Qwx1opLqtQCnQ3t9Z0F0ZTxKOC1S/ypPv5tSn/S3GMHct5Yb76mMgh6p80hjOAQ==} peerDependencies: '@rsbuild/core': 1.x || ^1.0.1-beta.0 @@ -41417,12 +40918,12 @@ packages: '@rsbuild/core': optional: true dependencies: - '@rsbuild/core': 1.3.20 + '@rsbuild/core': 1.3.21 '@types/html-minifier-terser': 7.0.2 html-minifier-terser: 7.2.0 dev: true - /rsbuild-plugin-publint@0.2.1(@rsbuild/core@1.2.0-beta.1): + /rsbuild-plugin-publint@0.2.1(@rsbuild/core@1.3.21): resolution: {integrity: sha512-iD/qeXWHmx2KKRT3cZ0lWa6Nz+K3NWFkVBfq+NQC3LAtHZCMftBbUzbjbJsjDiH195PVPdPmy+5qbxLf6HYqKg==} peerDependencies: '@rsbuild/core': 1.x @@ -41430,7 +40931,7 @@ packages: '@rsbuild/core': optional: true dependencies: - '@rsbuild/core': 1.2.0-beta.1 + '@rsbuild/core': 1.3.21 picocolors: 1.1.1 publint: 0.2.12 dev: true @@ -42438,7 +41939,7 @@ packages: '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.3) aggregate-error: 5.0.0 cosmiconfig: 9.0.0(typescript@5.7.3) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) env-ci: 11.1.0 execa: 9.5.2 figures: 6.1.0 @@ -42549,7 +42050,7 @@ packages: resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} engines: {node: '>= 18'} dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -42767,7 +42268,7 @@ packages: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.3.0 - object-inspect: 1.13.2 + object-inspect: 1.13.4 /side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} @@ -43084,7 +42585,7 @@ packages: /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -43097,7 +42598,7 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -43198,61 +42699,24 @@ packages: dependencies: graceful-fs: 4.2.11 - /storybook-addon-rslib@0.1.4(@rsbuild/core@1.3.20)(@rslib/core@0.2.0)(storybook-builder-rsbuild@1.0.1)(typescript@5.7.3): - resolution: {integrity: sha512-JXF2OZb3NXE7iYztLxiOTMP1j2BGHSNhREu+5LCjsOXxXFXiJrh4T8OeVLKsg7FlBSfnTkALSra0vHHnerFlfA==} - engines: {node: '>=18.0.0'} + /storybook-addon-rslib@1.0.1(@rsbuild/core@1.3.21)(@rslib/core@0.9.0)(storybook-builder-rsbuild@1.0.1)(typescript@5.7.3): + resolution: {integrity: sha512-8V2rH61GCi9QGLoV+RwdWZ1IY4mdWMsLDp5bflbs5MyAaYd+jA+Bz3GAngv05lBjb+KnJHhZ6jWvunxUTUkiCQ==} peerDependencies: '@rsbuild/core': ^1.0.1 - '@rslib/core': '*' + '@rslib/core': '>= 0.1.1 || >= 0.2' storybook-builder-rsbuild: '*' typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@rsbuild/core': 1.3.20 - '@rslib/core': 0.2.0(typescript@5.7.3) - storybook-builder-rsbuild: 1.0.1(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(@types/react@18.3.11)(storybook@8.4.2)(typescript@5.7.3) + '@rsbuild/core': 1.3.21 + '@rslib/core': 0.9.0(typescript@5.7.3) + storybook-builder-rsbuild: 1.0.1(@rsbuild/core@1.3.21)(@rspack/core@1.3.9)(@types/react@18.3.11)(storybook@8.4.2)(typescript@5.7.3) typescript: 5.7.3 dev: true - /storybook-builder-rsbuild@0.1.5(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(@types/react@18.3.11)(storybook@8.4.2)(typescript@5.7.3): - resolution: {integrity: sha512-g8/pVX+2YixHpWt/Q8dQWtkuKpWKxm1i9h+ihTFPO5LQWc3HvlF6PAXccPvedicLizGR2xTaI/RcJkE+2bYXqA==} - peerDependencies: - '@rsbuild/core': ^1.0.1 - storybook: ^8.2.1 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@rsbuild/core': 1.3.20 - '@rsbuild/plugin-type-check': 1.2.1(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(typescript@5.7.3) - '@storybook/addon-docs': 8.6.4(@types/react@18.3.11)(storybook@8.4.2) - '@storybook/core-webpack': 8.6.4(storybook@8.4.2) - browser-assert: 1.2.1 - case-sensitive-paths-webpack-plugin: 2.4.0 - cjs-module-lexer: 1.4.3 - constants-browserify: 1.0.0 - es-module-lexer: 1.6.0 - fs-extra: 11.3.0 - magic-string: 0.30.17 - path-browserify: 1.0.1 - process: 0.11.10 - rsbuild-plugin-html-minifier-terser: 1.1.1(@rsbuild/core@1.3.20) - sirv: 2.0.4 - storybook: 8.4.2(prettier@3.3.3) - ts-dedent: 2.2.0 - typescript: 5.7.3 - url: 0.11.4 - util: 0.12.5 - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@rspack/core' - - '@types/react' - dev: true - - /storybook-builder-rsbuild@1.0.1(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(@types/react@18.3.11)(storybook@8.4.2)(typescript@5.7.3): + /storybook-builder-rsbuild@1.0.1(@rsbuild/core@1.3.21)(@rspack/core@1.3.9)(@types/react@18.3.11)(storybook@8.4.2)(typescript@5.7.3): resolution: {integrity: sha512-sfr0qg3r76A9qlQRXE3ekAiJQM8v31skfuC+qc3m1GPoUeerfiBAWUOFBMdpNqUimt0eGSM5HUiY/vs3VRd3LQ==} peerDependencies: '@rsbuild/core': ^1.0.1 @@ -43262,9 +42726,9 @@ packages: typescript: optional: true dependencies: - '@rsbuild/core': 1.3.20 - '@rsbuild/plugin-type-check': 1.2.2(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(typescript@5.7.3) - '@storybook/addon-docs': 8.6.12(@types/react@18.3.11)(storybook@8.4.2) + '@rsbuild/core': 1.3.21 + '@rsbuild/plugin-type-check': 1.2.2(@rsbuild/core@1.3.21)(@rspack/core@1.3.9)(typescript@5.7.3) + '@storybook/addon-docs': 8.6.14(@types/react@18.3.11)(storybook@8.4.2) '@storybook/core-webpack': 8.6.12(storybook@8.4.2) browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 @@ -43276,7 +42740,7 @@ packages: magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 - rsbuild-plugin-html-minifier-terser: 1.1.1(@rsbuild/core@1.3.20) + rsbuild-plugin-html-minifier-terser: 1.1.1(@rsbuild/core@1.3.21) sirv: 2.0.4 storybook: 8.4.2(prettier@3.3.3) ts-dedent: 2.2.0 @@ -43289,8 +42753,8 @@ packages: - '@types/react' dev: true - /storybook-react-rsbuild@0.1.5(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(rollup@4.40.0)(storybook@8.4.2)(typescript@5.7.3)(webpack@5.98.0): - resolution: {integrity: sha512-Cy7Ms5COLR1FTelGRxS5pE9LVlDSvaJeBsTH2MVi/29ZK8UEE0VH+Mnve2MboB93GbC3fhZFtIcNSF2dy9pjTw==} + /storybook-react-rsbuild@1.0.1(@rsbuild/core@1.3.21)(@rspack/core@1.3.9)(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1)(rollup@4.40.0)(storybook@8.4.2)(typescript@5.7.3)(webpack@5.98.0): + resolution: {integrity: sha512-OCTWHrOCNatiadKND7/uE211KytgS/rLmJc/cR9ovMZ9Y5jD+n8NlHUjw0fUdCWNpPUx3p/Ey0Z2usG6YO+CeQ==} engines: {node: '>=18.0.0'} peerDependencies: '@rsbuild/core': ^1.0.1 @@ -43302,19 +42766,20 @@ packages: typescript: optional: true dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.40.0) - '@rsbuild/core': 1.3.20 - '@storybook/react': 8.3.5(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2)(typescript@5.7.3) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + '@rsbuild/core': 1.3.21 + '@storybook/react': 8.6.12(react-dom@18.3.1)(react@18.3.1)(storybook@8.4.2)(typescript@5.7.3) '@storybook/react-docgen-typescript-plugin': 1.0.1(typescript@5.7.3)(webpack@5.98.0) '@types/node': 18.16.9 find-up: 5.0.0 magic-string: 0.30.17 react: 18.3.1 - react-docgen: 7.1.0 + react-docgen: 7.1.1 + react-docgen-typescript: 2.2.2(typescript@5.7.3) react-dom: 18.3.1(react@18.3.1) - resolve: 1.22.8 + resolve: 1.22.10 storybook: 8.4.2(prettier@3.3.3) - storybook-builder-rsbuild: 0.1.5(@rsbuild/core@1.3.20)(@rspack/core@1.3.9)(@types/react@18.3.11)(storybook@8.4.2)(typescript@5.7.3) + storybook-builder-rsbuild: 1.0.1(@rsbuild/core@1.3.21)(@rspack/core@1.3.9)(@types/react@18.3.11)(storybook@8.4.2)(typescript@5.7.3) tsconfig-paths: 4.2.0 typescript: 5.7.3 transitivePeerDependencies: @@ -43365,8 +42830,8 @@ packages: - utf-8-validate dev: true - /storybook@8.6.12(prettier@3.3.3): - resolution: {integrity: sha512-Z/nWYEHBTLK1ZBtAWdhxC0l5zf7ioJ7G4+zYqtTdYeb67gTnxNj80gehf8o8QY9L2zA2+eyMRGLC2V5fI7Z3Tw==} + /storybook@8.6.14(prettier@3.3.3): + resolution: {integrity: sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -43374,7 +42839,7 @@ packages: prettier: optional: true dependencies: - '@storybook/core': 8.6.12(prettier@3.3.3)(storybook@8.6.12) + '@storybook/core': 8.6.14(prettier@3.3.3)(storybook@8.6.14) prettier: 3.3.3 transitivePeerDependencies: - bufferutil @@ -43433,7 +42898,7 @@ packages: engines: {node: '>=8.0'} dependencies: date-format: 4.0.14 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -43912,7 +43377,7 @@ packages: hasBin: true dependencies: '@adobe/css-tools': 4.3.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) glob: 10.4.5 sax: 1.4.1 source-map: 0.7.4 @@ -44705,8 +44170,9 @@ packages: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 + dev: false /tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} @@ -44716,6 +44182,14 @@ packages: picomatch: 4.0.2 dev: true + /tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + dev: true + /tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -44950,7 +44424,7 @@ packages: '@rspack/core': optional: true dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@rspack/core': 1.3.9(@swc/helpers@0.5.13) '@rspack/lite-tapable': 1.0.1 chokidar: 3.6.0 @@ -44971,7 +44445,7 @@ packages: '@rspack/core': optional: true dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@rspack/core': 1.3.9(@swc/helpers@0.5.13) '@rspack/lite-tapable': 1.0.1 chokidar: 3.6.0 @@ -44992,7 +44466,7 @@ packages: '@rspack/core': optional: true dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@rspack/core': 1.3.9(@swc/helpers@0.5.13) '@rspack/lite-tapable': 1.0.1 chokidar: 3.6.0 @@ -45366,7 +44840,7 @@ packages: bundle-require: 4.2.1(esbuild@0.19.2) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) esbuild: 0.19.2 execa: 5.1.1 globby: 11.1.0 @@ -45408,7 +44882,7 @@ packages: cac: 6.7.14 chokidar: 4.0.1 consola: 3.2.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) esbuild: 0.24.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -45692,10 +45166,6 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - dev: true - /undici@5.26.5: resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} engines: {node: '>=14.0'} @@ -45788,7 +45258,7 @@ packages: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} engines: {node: '>= 0.8.0'} dependencies: - qs: 6.13.0 + qs: 6.14.0 /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} @@ -46074,7 +45544,7 @@ packages: engines: {node: '>= 0.4'} dependencies: punycode: 1.4.1 - qs: 6.13.0 + qs: 6.14.0 dev: true /use-callback-ref@1.3.2(@types/react@18.2.79)(react@18.3.1): @@ -46287,7 +45757,7 @@ packages: apache-md5: 1.1.8 bcryptjs: 2.4.3 core-js: 3.40.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) http-errors: 2.0.0 unix-crypt-td-js: 1.1.4 transitivePeerDependencies: @@ -46318,7 +45788,7 @@ packages: clipanion: 4.0.0-rc.4(typanion@3.14.0) compression: 1.8.0 cors: 2.8.5 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) envinfo: 7.14.0 express: 4.21.2 handlebars: 4.7.8 @@ -46426,7 +45896,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) pathe: 1.1.2 picocolors: 1.1.1 vite: 5.4.18(@types/node@20.12.14)(less@4.3.0)(stylus@0.64.0) @@ -46448,7 +45918,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) pathe: 1.1.2 picocolors: 1.1.1 vite: 5.4.18(@types/node@18.16.9)(less@4.3.0)(stylus@0.64.0) @@ -46479,7 +45949,7 @@ packages: '@volar/typescript': 2.4.5 '@vue/language-core': 2.1.6(typescript@5.5.2) compare-versions: 6.1.1 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 kolorist: 1.8.0 local-pkg: 0.5.0 magic-string: 0.30.17 @@ -46506,7 +45976,7 @@ packages: '@volar/typescript': 2.4.5 '@vue/language-core': 2.1.6(typescript@5.5.2) compare-versions: 6.1.1 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 kolorist: 1.8.0 local-pkg: 0.5.0 magic-string: 0.30.17 @@ -46526,7 +45996,7 @@ packages: vite: optional: true dependencies: - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.7.3) vite: 6.3.5(@types/node@18.16.9)(jiti@2.4.2)(less@4.3.0)(stylus@0.64.0) @@ -46759,7 +46229,7 @@ packages: acorn-walk: 8.3.4 cac: 6.7.14 chai: 4.5.0 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.11 @@ -46817,7 +46287,7 @@ packages: '@vitest/utils': 1.6.0 acorn-walk: 8.3.4 chai: 4.5.0 - debug: 4.3.7(supports-color@9.3.1) + debug: 4.3.7 execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.11 @@ -46867,7 +46337,7 @@ packages: peerDependencies: eslint: '>=6.0.0' dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0(supports-color@9.3.1) eslint: 8.57.1 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -47197,7 +46667,7 @@ packages: connect-history-api-fallback: 2.0.0 express: 4.21.2 graceful-fs: 4.2.11 - html-entities: 2.5.2 + html-entities: 2.6.0 http-proxy-middleware: 2.0.7(@types/express@4.17.21) ipaddr.js: 2.2.0 launch-editor: 2.9.1 @@ -47322,7 +46792,7 @@ packages: resolution: {integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==} dependencies: ansi-html-community: 0.0.8 - html-entities: 2.5.2 + html-entities: 2.6.0 strip-ansi: 6.0.1 dev: true @@ -47983,8 +47453,8 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 assert-never: 1.3.0 babel-walk: 3.0.0-canary-5 dev: true From f43261928c74968b190b005d49aca0231ee90075 Mon Sep 17 00:00:00 2001 From: Hanric Date: Wed, 4 Jun 2025 19:07:34 +0800 Subject: [PATCH 05/30] feat: support component data fetch in ssr mode (#3753) --- .changeset/rich-bees-applaud.md | 5 + .changeset/spotty-trains-stare.md | 5 + .../webpack-host/runtimePlugin.ts | 4 + apps/modern-component-data-fetch/README.md | 20 + apps/modern-component-data-fetch/host/.npmrc | 1 + .../host/CHANGELOG.md | 1 + .../host/cypress.config.ts | 12 + .../cypress/e2e/csr-with-fetch-data.cy.ts | 27 + .../host/cypress/e2e/downgrade.cy.ts | 63 ++ .../host/cypress/e2e/route-check.cy.ts | 68 ++ .../cypress/e2e/ssr-with-fetch-data.cy.ts | 26 + .../host/cypress/support/app.po.ts | 3 + .../host/cypress/support/commands.ts | 32 + .../host/cypress/support/e2e.ts | 17 + .../host/cypress/tsconfig.json | 20 + .../host/modern.config.ts | 23 + .../host/module-federation.config.ts | 12 + .../host/package.json | 50 ++ .../host/project.json | 85 ++ .../host/src/.eslintrc.js | 9 + .../host/src/modern-app-env.d.ts | 4 + .../host/src/routes/basic/page.tsx | 36 + .../host/src/routes/client-downgrade/page.tsx | 33 + .../host/src/routes/csr/page.tsx | 31 + .../host/src/routes/index.css | 127 +++ .../host/src/routes/layout.tsx | 57 ++ .../host/src/routes/page.tsx | 9 + .../host/src/routes/server-downgrade/page.tsx | 39 + .../host/tsconfig.app.json | 17 + .../host/tsconfig.json | 15 + .../host/tsconfig.spec.json | 14 + .../provider-csr/module-federation.config.ts | 13 + .../provider-csr/package.json | 21 + .../provider-csr/project.json | 79 ++ .../provider-csr/rslib.config.ts | 28 + .../provider-csr/src/index.data.ts | 13 + .../provider-csr/src/index.tsx | 30 + .../provider-csr/tsconfig.json | 12 + .../provider/.npmrc | 1 + .../provider/CHANGELOG.md | 1 + .../provider/modern.config.ts | 21 + .../provider/module-federation.config.ts | 14 + .../provider/package.json | 49 + .../provider/project.json | 77 ++ .../provider/src/.eslintrc.js | 9 + .../BasicComponent/index.data.client.ts | 13 + .../components/BasicComponent/index.data.ts | 13 + .../src/components/BasicComponent/index.tsx | 34 + .../BasicComponent/stuff.module.css | 3 + .../BasicComponent/stuff.module.css.d.ts | 3 + .../ClientDowngrade/index.data.client.ts | 13 + .../components/ClientDowngrade/index.data.ts | 15 + .../src/components/ClientDowngrade/index.tsx | 15 + .../components/ServerDowngrade/index.data.ts | 17 + .../src/components/ServerDowngrade/index.tsx | 16 + .../provider/src/modern-app-env.d.ts | 4 + .../provider/src/routes/index.css | 127 +++ .../provider/src/routes/layout.tsx | 9 + .../provider/src/routes/page.data.ts | 6 + .../provider/src/routes/page.tsx | 17 + .../provider/tsconfig.app.json | 17 + .../provider/tsconfig.json | 15 + .../provider/tsconfig.spec.json | 14 + .../docs/en/guide/framework/modernjs.mdx | 430 +++++++-- .../docs/zh/guide/framework/modernjs.mdx | 409 +++++++-- package.json | 1 + packages/dts-plugin/src/plugins/DtsPlugin.ts | 23 +- packages/managers/src/ContainerManager.ts | 22 + packages/manifest/src/ModuleHandler.ts | 8 +- packages/manifest/src/StatsManager.ts | 52 +- packages/modernjs/package.json | 35 +- .../modernjs/src/cli/configPlugin.spec.ts | 2 + packages/modernjs/src/cli/configPlugin.ts | 28 +- packages/modernjs/src/cli/constant.ts | 1 - packages/modernjs/src/cli/index.ts | 3 + .../cli/mfRuntimePlugins/auto-fetch-data.ts | 104 +++ .../cli/server/data-fetch-server-plugin.ts | 207 +++++ packages/modernjs/src/cli/ssrPlugin.ts | 35 +- packages/modernjs/src/cli/utils.ts | 4 + packages/modernjs/src/constant.ts | 26 + packages/modernjs/src/interfaces/global.ts | 28 + packages/modernjs/src/{cli => }/logger.ts | 2 +- .../modernjs/src/runtime/AwaitDataFetch.tsx | 176 ++++ .../src/runtime/createRemoteComponent.tsx | 395 +++++++++ .../src/runtime/createRemoteSSRComponent.tsx | 207 ----- packages/modernjs/src/runtime/index.ts | 18 +- packages/modernjs/src/runtime/wrapNoSSR.tsx | 10 + .../ssr-runtime/{plugin.tsx => devPlugin.tsx} | 5 +- .../modernjs/src/ssr-runtime/downgrade.ts | 102 +++ packages/modernjs/src/ssr-runtime/index.ts | 1 - .../injectDataFetchFunctionPlugin.tsx | 129 +++ packages/modernjs/src/types/index.ts | 2 + packages/modernjs/src/utils/dataFetch.ts | 221 +++++ packages/modernjs/src/utils/index.ts | 32 + packages/modernjs/tsconfig.json | 2 +- packages/rsbuild-plugin/package.json | 8 + packages/rsbuild-plugin/rollup.config.js | 1 + packages/rsbuild-plugin/src/cli/index.ts | 10 +- packages/rsbuild-plugin/src/cli/ssr.ts | 1 + .../src/utils/addDataFetchExposes.ts | 85 ++ .../utils/autoDeleteSplitChunkCacheGroups.ts | 2 +- packages/rsbuild-plugin/src/utils/constant.ts | 2 + packages/rsbuild-plugin/src/utils/index.ts | 5 +- .../src/plugins/snapshot/SnapshotHandler.ts | 40 +- .../src/plugins/snapshot/index.ts | 7 +- packages/runtime-core/src/remote/index.ts | 4 +- packages/runtime-core/src/type/config.ts | 1 + packages/runtime/src/index.ts | 2 + packages/sdk/src/constant.ts | 1 - packages/sdk/src/env.ts | 4 +- pnpm-lock.yaml | 834 +++++++++++++++--- pnpm-workspace.yaml | 1 + 112 files changed, 4797 insertions(+), 515 deletions(-) create mode 100644 .changeset/rich-bees-applaud.md create mode 100644 .changeset/spotty-trains-stare.md create mode 100644 apps/modern-component-data-fetch/README.md create mode 100644 apps/modern-component-data-fetch/host/.npmrc create mode 100644 apps/modern-component-data-fetch/host/CHANGELOG.md create mode 100644 apps/modern-component-data-fetch/host/cypress.config.ts create mode 100644 apps/modern-component-data-fetch/host/cypress/e2e/csr-with-fetch-data.cy.ts create mode 100644 apps/modern-component-data-fetch/host/cypress/e2e/downgrade.cy.ts create mode 100644 apps/modern-component-data-fetch/host/cypress/e2e/route-check.cy.ts create mode 100644 apps/modern-component-data-fetch/host/cypress/e2e/ssr-with-fetch-data.cy.ts create mode 100644 apps/modern-component-data-fetch/host/cypress/support/app.po.ts create mode 100644 apps/modern-component-data-fetch/host/cypress/support/commands.ts create mode 100644 apps/modern-component-data-fetch/host/cypress/support/e2e.ts create mode 100644 apps/modern-component-data-fetch/host/cypress/tsconfig.json create mode 100644 apps/modern-component-data-fetch/host/modern.config.ts create mode 100644 apps/modern-component-data-fetch/host/module-federation.config.ts create mode 100644 apps/modern-component-data-fetch/host/package.json create mode 100644 apps/modern-component-data-fetch/host/project.json create mode 100644 apps/modern-component-data-fetch/host/src/.eslintrc.js create mode 100644 apps/modern-component-data-fetch/host/src/modern-app-env.d.ts create mode 100644 apps/modern-component-data-fetch/host/src/routes/basic/page.tsx create mode 100644 apps/modern-component-data-fetch/host/src/routes/client-downgrade/page.tsx create mode 100644 apps/modern-component-data-fetch/host/src/routes/csr/page.tsx create mode 100644 apps/modern-component-data-fetch/host/src/routes/index.css create mode 100644 apps/modern-component-data-fetch/host/src/routes/layout.tsx create mode 100644 apps/modern-component-data-fetch/host/src/routes/page.tsx create mode 100644 apps/modern-component-data-fetch/host/src/routes/server-downgrade/page.tsx create mode 100644 apps/modern-component-data-fetch/host/tsconfig.app.json create mode 100644 apps/modern-component-data-fetch/host/tsconfig.json create mode 100644 apps/modern-component-data-fetch/host/tsconfig.spec.json create mode 100644 apps/modern-component-data-fetch/provider-csr/module-federation.config.ts create mode 100644 apps/modern-component-data-fetch/provider-csr/package.json create mode 100644 apps/modern-component-data-fetch/provider-csr/project.json create mode 100644 apps/modern-component-data-fetch/provider-csr/rslib.config.ts create mode 100644 apps/modern-component-data-fetch/provider-csr/src/index.data.ts create mode 100644 apps/modern-component-data-fetch/provider-csr/src/index.tsx create mode 100644 apps/modern-component-data-fetch/provider-csr/tsconfig.json create mode 100644 apps/modern-component-data-fetch/provider/.npmrc create mode 100644 apps/modern-component-data-fetch/provider/CHANGELOG.md create mode 100644 apps/modern-component-data-fetch/provider/modern.config.ts create mode 100644 apps/modern-component-data-fetch/provider/module-federation.config.ts create mode 100644 apps/modern-component-data-fetch/provider/package.json create mode 100644 apps/modern-component-data-fetch/provider/project.json create mode 100644 apps/modern-component-data-fetch/provider/src/.eslintrc.js create mode 100644 apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.data.client.ts create mode 100644 apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.data.ts create mode 100644 apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.tsx create mode 100644 apps/modern-component-data-fetch/provider/src/components/BasicComponent/stuff.module.css create mode 100644 apps/modern-component-data-fetch/provider/src/components/BasicComponent/stuff.module.css.d.ts create mode 100644 apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.data.client.ts create mode 100644 apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.data.ts create mode 100644 apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.tsx create mode 100644 apps/modern-component-data-fetch/provider/src/components/ServerDowngrade/index.data.ts create mode 100644 apps/modern-component-data-fetch/provider/src/components/ServerDowngrade/index.tsx create mode 100644 apps/modern-component-data-fetch/provider/src/modern-app-env.d.ts create mode 100644 apps/modern-component-data-fetch/provider/src/routes/index.css create mode 100644 apps/modern-component-data-fetch/provider/src/routes/layout.tsx create mode 100644 apps/modern-component-data-fetch/provider/src/routes/page.data.ts create mode 100644 apps/modern-component-data-fetch/provider/src/routes/page.tsx create mode 100644 apps/modern-component-data-fetch/provider/tsconfig.app.json create mode 100644 apps/modern-component-data-fetch/provider/tsconfig.json create mode 100644 apps/modern-component-data-fetch/provider/tsconfig.spec.json delete mode 100644 packages/modernjs/src/cli/constant.ts create mode 100644 packages/modernjs/src/cli/mfRuntimePlugins/auto-fetch-data.ts create mode 100644 packages/modernjs/src/cli/server/data-fetch-server-plugin.ts create mode 100644 packages/modernjs/src/interfaces/global.ts rename packages/modernjs/src/{cli => }/logger.ts (72%) create mode 100644 packages/modernjs/src/runtime/AwaitDataFetch.tsx create mode 100644 packages/modernjs/src/runtime/createRemoteComponent.tsx delete mode 100644 packages/modernjs/src/runtime/createRemoteSSRComponent.tsx create mode 100644 packages/modernjs/src/runtime/wrapNoSSR.tsx rename packages/modernjs/src/ssr-runtime/{plugin.tsx => devPlugin.tsx} (82%) create mode 100644 packages/modernjs/src/ssr-runtime/downgrade.ts delete mode 100644 packages/modernjs/src/ssr-runtime/index.ts create mode 100644 packages/modernjs/src/ssr-runtime/injectDataFetchFunctionPlugin.tsx create mode 100644 packages/modernjs/src/utils/dataFetch.ts create mode 100644 packages/modernjs/src/utils/index.ts create mode 100644 packages/rsbuild-plugin/src/utils/addDataFetchExposes.ts diff --git a/.changeset/rich-bees-applaud.md b/.changeset/rich-bees-applaud.md new file mode 100644 index 00000000000..8c6718cf4e5 --- /dev/null +++ b/.changeset/rich-bees-applaud.md @@ -0,0 +1,5 @@ +--- +'@module-federation/manifest': patch +--- + +fix(manifest): record all exposes even if the expose value is the same file diff --git a/.changeset/spotty-trains-stare.md b/.changeset/spotty-trains-stare.md new file mode 100644 index 00000000000..c52a229951d --- /dev/null +++ b/.changeset/spotty-trains-stare.md @@ -0,0 +1,5 @@ +--- +'@module-federation/modern-js': minor +--- + +feat(modern-js-plugin): support component-level data fetch diff --git a/apps/manifest-demo/webpack-host/runtimePlugin.ts b/apps/manifest-demo/webpack-host/runtimePlugin.ts index 6e7a4607dfc..d318363e607 100644 --- a/apps/manifest-demo/webpack-host/runtimePlugin.ts +++ b/apps/manifest-demo/webpack-host/runtimePlugin.ts @@ -4,6 +4,10 @@ export default function (): FederationRuntimePlugin { return { name: 'custom-plugin-build', beforeInit(args) { + const { userOptions, origin } = args; + if (origin.options.name && origin.options.name !== userOptions.name) { + userOptions.name = origin.options.name; + } console.log('[build time inject] beforeInit: ', args); return args; }, diff --git a/apps/modern-component-data-fetch/README.md b/apps/modern-component-data-fetch/README.md new file mode 100644 index 00000000000..7b647a02ac4 --- /dev/null +++ b/apps/modern-component-data-fetch/README.md @@ -0,0 +1,20 @@ +# modern-component-data-fetch + +## Running Demo + +- host: [localhost:5001](http://localhost:5001/) +- provider: [localhost:5002](http://localhost:5002/) +- provider-csr: [localhost:5003](http://localhost:5003/) + +## How to start the demos ? + +```bash +# Root directory +pnpm i + +nx build modern-js-plugin + +pnpm run app:component-data-fetch:dev + +open http://localhost:5001/ +``` diff --git a/apps/modern-component-data-fetch/host/.npmrc b/apps/modern-component-data-fetch/host/.npmrc new file mode 100644 index 00000000000..fa4e095233f --- /dev/null +++ b/apps/modern-component-data-fetch/host/.npmrc @@ -0,0 +1 @@ +strict-peer-dependencies=false \ No newline at end of file diff --git a/apps/modern-component-data-fetch/host/CHANGELOG.md b/apps/modern-component-data-fetch/host/CHANGELOG.md new file mode 100644 index 00000000000..94dad013e00 --- /dev/null +++ b/apps/modern-component-data-fetch/host/CHANGELOG.md @@ -0,0 +1 @@ +# modernjs-ssr-nested-remote diff --git a/apps/modern-component-data-fetch/host/cypress.config.ts b/apps/modern-component-data-fetch/host/cypress.config.ts new file mode 100644 index 00000000000..988862e43cc --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress.config.ts @@ -0,0 +1,12 @@ +import { nxE2EPreset } from '@nx/cypress/plugins/cypress-preset'; +import { defineConfig } from 'cypress'; + +export default defineConfig({ + projectId: 'sa6wfn', + e2e: nxE2EPreset(__filename, { cypressDir: 'cypress' }), + defaultCommandTimeout: 20000, + retries: { + runMode: 2, + openMode: 1, + }, +}); diff --git a/apps/modern-component-data-fetch/host/cypress/e2e/csr-with-fetch-data.cy.ts b/apps/modern-component-data-fetch/host/cypress/e2e/csr-with-fetch-data.cy.ts new file mode 100644 index 00000000000..4f985780b32 --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress/e2e/csr-with-fetch-data.cy.ts @@ -0,0 +1,27 @@ +import { getH2 } from '../support/app.po'; + +describe('csr with fetch data', () => { + it('[ /csr ] - should render in client side and fetch data from server', () => { + cy.visit('/csr'); + cy.wait(3000); + cy.url().should('include', '/csr'); + getH2().contains('[ csr provider - server ] fetched data'); + + const stub = cy.stub(); + cy.on('window:alert', stub); + + cy.get('#provider-csr-btn') + .should('be.visible') + .click() + .then(() => { + expect(stub.getCall(0)).to.be.calledWith( + '[provider-csr-btn] Client side Javascript works!', + ); + }); + + // it only render in client side, so it not have downgrade identifier + cy.window().then((win) => { + expect(win.globalThis._mfSSRDowngrade).to.not.exist; + }); + }); +}); diff --git a/apps/modern-component-data-fetch/host/cypress/e2e/downgrade.cy.ts b/apps/modern-component-data-fetch/host/cypress/e2e/downgrade.cy.ts new file mode 100644 index 00000000000..7de8b69f4bb --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress/e2e/downgrade.cy.ts @@ -0,0 +1,63 @@ +import { getH1, getH2, getH3 } from '../support/app.po'; + +declare global { + interface Window { + globalThis: { + _mfSSRDowngrade?: boolean | string[]; + }; + } +} + +describe('downgrade', () => { + beforeEach(() => { + // the page will hydrate failed and downgrade, so catch the error, keep on testing + cy.on('uncaught:exception', (err, runnable) => { + return false; + }); + }); + + it('[ /client-downgrade ] - should downgrade load data.client.js to fetch data', () => { + cy.visit('/client-downgrade'); + cy.wait(3000); + cy.url().should('include', '/client-downgrade'); + getH2().contains('fetch data from provider client'); + + const stub = cy.stub(); + cy.on('window:alert', stub); + + cy.get('#client-downgrade-btn') + .should('be.visible') + .click() + .then(() => { + expect(stub.getCall(0)).to.be.calledWith( + '[client-downgrade] Client side Javascript works!', + ); + }); + cy.window().then((win) => { + expect(win.globalThis._mfSSRDowngrade).to.exist; + }); + }); + + it('[ /server-downgrade ] - should downgrade and fetch data from server', () => { + cy.visit('/server-downgrade'); + cy.wait(3000); + cy.url().should('include', '/server-downgrade'); + getH2().contains('[ provider - server - ServerDowngrade]'); + + const stub = cy.stub(); + cy.on('window:alert', stub); + + cy.get('#server-downgrade-btn') + .should('be.visible') + .click() + .then(() => { + expect(stub.getCall(0)).to.be.calledWith( + '[server-downgrade] Client side Javascript works!', + ); + }); + cy.window().then((win) => { + console.log(win); + expect(win.globalThis._mfSSRDowngrade).to.exist; + }); + }); +}); diff --git a/apps/modern-component-data-fetch/host/cypress/e2e/route-check.cy.ts b/apps/modern-component-data-fetch/host/cypress/e2e/route-check.cy.ts new file mode 100644 index 00000000000..f218fc5fd6c --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress/e2e/route-check.cy.ts @@ -0,0 +1,68 @@ +import { getH1, getH2, getH3 } from '../support/app.po'; + +declare global { + interface Window { + globalThis: { + _mfSSRDowngrade?: boolean | string[]; + }; + } +} + +describe('/', () => { + beforeEach(() => cy.visit('/')); + + describe('Welcome message', () => { + it('should display welcome message', () => { + getH1().contains('Welcome message from host'); + }); + }); + + // check that clicking back and forwards in client side routeing still renders the content correctly + describe('Routing checks', () => { + it('[ /basic ] - should render in client side and fetch data from server side', () => { + // wait nav hydration + cy.wait(3000); + cy.get('.basic').parent().click(); + cy.url().should('include', '/basic'); + getH2().contains('[ provider - client ] fetched data'); + + const stub = cy.stub(); + cy.on('window:alert', stub); + + cy.get('#provider-btn') + .should('be.visible') + .click() + .then(() => { + expect(stub.getCall(0)).to.be.calledWith( + '[provider] Client side Javascript works!', + ); + }); + + cy.window().then((win) => { + expect(win.globalThis._mfSSRDowngrade).to.not.exist; + }); + }); + + it('[ /client-downgrade ] - should render in client side and load data.client.js to fetch data', () => { + cy.wait(3000); + cy.get('.client-downgrade').parent().click(); + cy.url().should('include', '/client-downgrade'); + getH2().contains('fetch data from provider client'); + + const stub = cy.stub(); + cy.on('window:alert', stub); + + cy.get('#client-downgrade-btn') + .should('be.visible') + .click() + .then(() => { + expect(stub.getCall(0)).to.be.calledWith( + '[client-downgrade] Client side Javascript works!', + ); + }); + cy.window().then((win) => { + expect(win.globalThis._mfSSRDowngrade).to.not.exist; + }); + }); + }); +}); diff --git a/apps/modern-component-data-fetch/host/cypress/e2e/ssr-with-fetch-data.cy.ts b/apps/modern-component-data-fetch/host/cypress/e2e/ssr-with-fetch-data.cy.ts new file mode 100644 index 00000000000..defe72a2240 --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress/e2e/ssr-with-fetch-data.cy.ts @@ -0,0 +1,26 @@ +import { getH1, getH2, getH3 } from '../support/app.po'; + +describe('ssr with fetch data', () => { + it('[ /basic ] - should render in server side and fetch data from server', () => { + cy.visit('/basic'); + cy.wait(3000); + cy.url().should('include', '/basic'); + getH2().contains('[ provider - server ] fetched data'); + + const stub = cy.stub(); + cy.on('window:alert', stub); + + cy.get('#provider-btn') + .should('be.visible') + .click() + .then(() => { + expect(stub.getCall(0)).to.be.calledWith( + '[provider] Client side Javascript works!', + ); + }); + + cy.window().then((win) => { + expect(win.globalThis._mfSSRDowngrade).to.not.exist; + }); + }); +}); diff --git a/apps/modern-component-data-fetch/host/cypress/support/app.po.ts b/apps/modern-component-data-fetch/host/cypress/support/app.po.ts new file mode 100644 index 00000000000..1fc2527567e --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress/support/app.po.ts @@ -0,0 +1,3 @@ +export const getH1 = () => cy.get('h1'); +export const getH2 = () => cy.get('h2'); +export const getH3 = () => cy.get('h3'); diff --git a/apps/modern-component-data-fetch/host/cypress/support/commands.ts b/apps/modern-component-data-fetch/host/cypress/support/commands.ts new file mode 100644 index 00000000000..f5953a9500a --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress/support/commands.ts @@ -0,0 +1,32 @@ +/// + +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** + +// eslint-disable-next-line @typescript-eslint/no-namespace +declare namespace Cypress { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + interface Chainable { + login(email: string, password: string): void; + } +} + +// -- This is a parent command -- +// +// -- This is a child command -- +// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/apps/modern-component-data-fetch/host/cypress/support/e2e.ts b/apps/modern-component-data-fetch/host/cypress/support/e2e.ts new file mode 100644 index 00000000000..1c1a9e772ba --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress/support/e2e.ts @@ -0,0 +1,17 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.ts using ES2015 syntax: +import './commands'; diff --git a/apps/modern-component-data-fetch/host/cypress/tsconfig.json b/apps/modern-component-data-fetch/host/cypress/tsconfig.json new file mode 100644 index 00000000000..0285a6e4c66 --- /dev/null +++ b/apps/modern-component-data-fetch/host/cypress/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "allowJs": true, + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["cypress", "node"], + "sourceMap": false + }, + "include": [ + "**/*.ts", + "**/*.js", + "../cypress.config.ts", + "../**/*.cy.ts", + "../**/*.cy.tsx", + "../**/*.cy.js", + "../**/*.cy.jsx", + "../**/*.d.ts" + ] +} diff --git a/apps/modern-component-data-fetch/host/modern.config.ts b/apps/modern-component-data-fetch/host/modern.config.ts new file mode 100644 index 00000000000..4b9cb6d78c5 --- /dev/null +++ b/apps/modern-component-data-fetch/host/modern.config.ts @@ -0,0 +1,23 @@ +import { appTools, defineConfig } from '@modern-js/app-tools'; +import { moduleFederationPlugin } from '@module-federation/modern-js'; + +// https://modernjs.dev/en/configure/app/usage +export default defineConfig({ + runtime: { + router: true, + }, + server: { + ssr: { + mode: 'stream', + }, + port: 5001, + }, + plugins: [ + appTools({ + bundler: 'rspack', + }), + moduleFederationPlugin({ + fetchServerQuery: { extraQuery: true }, + }), + ], +}); diff --git a/apps/modern-component-data-fetch/host/module-federation.config.ts b/apps/modern-component-data-fetch/host/module-federation.config.ts new file mode 100644 index 00000000000..44a9c3a6634 --- /dev/null +++ b/apps/modern-component-data-fetch/host/module-federation.config.ts @@ -0,0 +1,12 @@ +import { createModuleFederationConfig } from '@module-federation/modern-js'; +export default createModuleFederationConfig({ + name: 'host', + remotes: { + remote: 'provider@http://localhost:5002/mf-manifest.json', + 'provider-csr': 'provider_csr@http://localhost:5003/mf-manifest.json', + }, + shared: { + react: { singleton: true }, + 'react-dom': { singleton: true }, + }, +}); diff --git a/apps/modern-component-data-fetch/host/package.json b/apps/modern-component-data-fetch/host/package.json new file mode 100644 index 00000000000..3dd0d43d2b2 --- /dev/null +++ b/apps/modern-component-data-fetch/host/package.json @@ -0,0 +1,50 @@ +{ + "name": "modernjs-ssr-data-fetch-host", + "private": true, + "version": "0.1.34", + "scripts": { + "reset": "npx rimraf ./**/node_modules", + "dev": "modern dev", + "build": "modern build", + "start": "modern start", + "serve": "modern serve", + "new": "modern new", + "lint": "modern lint", + "upgrade": "modern upgrade", + "inspect": "modern inspect" + }, + "engines": { + "node": ">=16.18.1" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,mjs,cjs}": [ + "node --max_old_space_size=8192 ./node_modules/eslint/bin/eslint.js --fix --color --cache --quiet" + ] + }, + "eslintIgnore": [ + "node_modules/", + "dist/" + ], + "dependencies": { + "@babel/runtime": "7.26.0", + "@modern-js/runtime": "2.67.5", + "@module-federation/modern-js": "workspace:*", + "antd": "4.24.15", + "react": "~18.3.1", + "react-dom": "~18.3.1" + }, + "devDependencies": { + "@modern-js-app/eslint-config": "2.59.0", + "@modern-js/app-tools": "2.67.5", + "@modern-js/eslint-config": "2.59.0", + "@modern-js/tsconfig": "2.67.5", + "@types/jest": "~29.5.0", + "@types/node": "~16.11.7", + "@types/react": "~18.2.0", + "@types/react-dom": "~18.3.0", + "lint-staged": "~13.1.0", + "prettier": "~3.3.3", + "rimraf": "~3.0.2", + "typescript": "~5.0.4" + } +} diff --git a/apps/modern-component-data-fetch/host/project.json b/apps/modern-component-data-fetch/host/project.json new file mode 100644 index 00000000000..f840f3dabcf --- /dev/null +++ b/apps/modern-component-data-fetch/host/project.json @@ -0,0 +1,85 @@ +{ + "name": "modernjs-ssr-data-fetch-host", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/modern-component-data-fetch/host/src", + "projectType": "application", + "tags": [], + "implicitDependencies": ["typescript"], + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/host; pnpm run build", + "forwardAllArgs": true + } + ] + } + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/modern-component-data-fetch/host; pnpm run dev", + "forwardAllArgs": false + } + ] + } + }, + "e2e": { + "executor": "@nx/cypress:cypress", + "options": { + "cypressConfig": "apps/modern-component-data-fetch/host/cypress.config.ts", + "testingType": "e2e", + "baseUrl": "http://localhost:5001", + "browser": "chrome" + }, + "configurations": { + "development": { + "runnerUi": true, + "browser": "electron", + "exit": false, + "watch": true + } + } + }, + "test:e2e": { + "executor": "nx:run-commands", + "options": { + "parallel": true, + "commands": [ + { + "command": "nx run modernjs-ssr-data-fetch-host:e2e", + "forwardAllArgs": true + } + ] + } + }, + "test:e2e:watch": { + "executor": "nx:run-commands", + "options": { + "parallel": true, + "commands": [ + { + "command": "nx run modernjs-ssr-data-fetch-host:e2e --watch", + "forwardAllArgs": true + } + ] + } + } + } +} diff --git a/apps/modern-component-data-fetch/host/src/.eslintrc.js b/apps/modern-component-data-fetch/host/src/.eslintrc.js new file mode 100644 index 00000000000..fafc0032305 --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/.eslintrc.js @@ -0,0 +1,9 @@ +// eslint-disable-next-line import/no-commonjs +module.exports = { + root: true, + extends: ['@modern-js-app'], + parserOptions: { + tsconfigRootDir: __dirname, + project: ['../tsconfig.json'], + }, +}; diff --git a/apps/modern-component-data-fetch/host/src/modern-app-env.d.ts b/apps/modern-component-data-fetch/host/src/modern-app-env.d.ts new file mode 100644 index 00000000000..827e6c01d97 --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/modern-app-env.d.ts @@ -0,0 +1,4 @@ +/// +/// +/// +/// diff --git a/apps/modern-component-data-fetch/host/src/routes/basic/page.tsx b/apps/modern-component-data-fetch/host/src/routes/basic/page.tsx new file mode 100644 index 00000000000..03de3de3524 --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/routes/basic/page.tsx @@ -0,0 +1,36 @@ +import { kit, ERROR_TYPE } from '@module-federation/modern-js/runtime'; + +const { createRemoteComponent } = kit; + +const Basic = createRemoteComponent({ + loader: () => { + return import('remote/BasicComponent'); + }, + loading: 'loading...', + export: 'default', + fallback: ({ error, errorType, dataFetchMapKey }) => { + console.error(error); + if (errorType === ERROR_TYPE.LOAD_REMOTE) { + return
load remote failed
; + } + if (errorType === ERROR_TYPE.DATA_FETCH) { + return ( +
+ data fetch failed, the dataFetchMapKey key is: {dataFetchMapKey} +
+ ); + } + return
error type is unknown
; + }, +}); + +const Index = (): JSX.Element => { + return ( +
+

Basic usage with data fetch

+ +
+ ); +}; + +export default Index; diff --git a/apps/modern-component-data-fetch/host/src/routes/client-downgrade/page.tsx b/apps/modern-component-data-fetch/host/src/routes/client-downgrade/page.tsx new file mode 100644 index 00000000000..b01971f8aed --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/routes/client-downgrade/page.tsx @@ -0,0 +1,33 @@ +import { kit } from '@module-federation/modern-js/runtime'; + +const { createRemoteComponent } = kit; + +const ClientDowngrade = createRemoteComponent({ + loader: () => { + return import('remote/ClientDowngrade'); + }, + loading: 'loading...', + export: 'default', + fallback: ({ error }) => { + console.error(error); + // throw new Error('error no caught'); + if (error instanceof Error && error.message.includes('not exist')) { + return
fallback - not existed id
; + } + return
fallback
; + }, +}); + +const Index = (): JSX.Element => { + return ( +
+

+ This component will be force downgraded , and fetch dataFetch js in + browser, and then call this request{' '} +

+ +
+ ); +}; + +export default Index; diff --git a/apps/modern-component-data-fetch/host/src/routes/csr/page.tsx b/apps/modern-component-data-fetch/host/src/routes/csr/page.tsx new file mode 100644 index 00000000000..80fed2d9778 --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/routes/csr/page.tsx @@ -0,0 +1,31 @@ +import { kit } from '@module-federation/modern-js/runtime'; + +const { createRemoteComponent, wrapNoSSR } = kit; + +const CsrWithFetchDataFromServerComponent = wrapNoSSR(createRemoteComponent)({ + loader: () => { + return import('provider-csr'); + }, + loading: 'loading...', + export: 'default', + fallback: ({ error }) => { + // throw new Error('error no caught'); + if (error instanceof Error && error.message.includes('not exist')) { + return
fallback - not existed id
; + } + return
fallback
; + }, +}); + +const Index = (): JSX.Element => { + return ( +
+

+ The component will be render in csr but fetch data from server +

+ +
+ ); +}; + +export default Index; diff --git a/apps/modern-component-data-fetch/host/src/routes/index.css b/apps/modern-component-data-fetch/host/src/routes/index.css new file mode 100644 index 00000000000..e890f8aa146 --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/routes/index.css @@ -0,0 +1,127 @@ +html, +body { + padding: 0; + margin: 0; + font-family: + PingFang SC, + Hiragino Sans GB, + Microsoft YaHei, + Arial, + sans-serif; + background: linear-gradient(to bottom, transparent, #fff) #eceeef; +} + +p { + margin: 0; +} + +* { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + box-sizing: border-box; +} + +.container-box { + min-height: 100vh; + max-width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding-top: 10px; +} + +main { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.title { + display: flex; + margin: 4rem 0 4rem; + align-items: center; + font-size: 4rem; + font-weight: 600; +} + +.logo { + width: 6rem; + margin: 7px 0 0 1rem; +} + +.name { + color: #4ecaff; +} + +.description { + text-align: center; + line-height: 1.5; + font-size: 1.3rem; + color: #1b3a42; + margin-bottom: 5rem; +} + +.code { + background: #fafafa; + border-radius: 12px; + padding: 0.6rem 0.9rem; + font-size: 1.05rem; + font-family: + Menlo, + Monaco, + Lucida Console, + Liberation Mono, + DejaVu Sans Mono, + Bitstream Vera Sans Mono, + Courier New, + monospace; +} + +.container-box .grid { + display: flex; + align-items: center; + justify-content: center; + width: 1100px; + margin-top: 3rem; +} + +.card { + padding: 1.5rem; + display: flex; + flex-direction: column; + justify-content: center; + height: 100px; + color: inherit; + text-decoration: none; + transition: 0.15s ease; + width: 45%; +} + +.card:hover, +.card:focus { + transform: scale(1.05); +} + +.card h2 { + display: flex; + align-items: center; + font-size: 1.5rem; + margin: 0; + padding: 0; +} + +.card p { + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + margin-top: 1rem; +} + +.arrow-right { + width: 1.3rem; + margin-left: 0.5rem; + margin-top: 3px; +} diff --git a/apps/modern-component-data-fetch/host/src/routes/layout.tsx b/apps/modern-component-data-fetch/host/src/routes/layout.tsx new file mode 100644 index 00000000000..25ce86d7e1a --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/routes/layout.tsx @@ -0,0 +1,57 @@ +import React from 'react'; +import { Outlet, useNavigate, useLocation } from '@modern-js/runtime/router'; +import { Layout, Menu } from 'antd'; + +const { Header, Content } = Layout; + +const App: React.FC = () => { + const navi = useNavigate(); + + const Navs = [ + 'home', + 'basic', + 'csr', + 'server-downgrade', + 'client-downgrade', + ].map((i) => ({ + key: i, + label: i, + icon: , + onClick: ({ key }: { key: string }) => { + console.log('key', key); + if (key === 'home') { + navi(`/`); + } else { + navi(`/${key}`); + } + }, + })); + const location = useLocation(); + const nav = location.pathname.slice(1); + const defaultSelectedKeys = [nav === '' ? 'home' : nav]; + return ( + +
+ +
+ +
+ +
+
+
+ ); +}; + +export default App; diff --git a/apps/modern-component-data-fetch/host/src/routes/page.tsx b/apps/modern-component-data-fetch/host/src/routes/page.tsx new file mode 100644 index 00000000000..ffc89805529 --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/routes/page.tsx @@ -0,0 +1,9 @@ +const Index = () => { + return ( + <> +

Welcome message from host

+ + ); +}; + +export default Index; diff --git a/apps/modern-component-data-fetch/host/src/routes/server-downgrade/page.tsx b/apps/modern-component-data-fetch/host/src/routes/server-downgrade/page.tsx new file mode 100644 index 00000000000..d4d2a5661c7 --- /dev/null +++ b/apps/modern-component-data-fetch/host/src/routes/server-downgrade/page.tsx @@ -0,0 +1,39 @@ +import { kit } from '@module-federation/modern-js/runtime'; + +const { createRemoteComponent } = kit; + +const ServerDowngrade = createRemoteComponent({ + loader: () => { + return import('remote/ServerDowngrade'); + }, + loading: 'loading...', + export: 'default', + fallback: ({ error }) => { + console.error(error); + // throw new Error('error no caught'); + if (error instanceof Error && error.message.includes('not exist')) { + return
fallback - not existed id
; + } + return
fallback
; + }, +}); +const Index = (): JSX.Element => { + return ( +
+

+ This component will be force downgraded , and send fetchData request to + host server{' '} +

+

+ Check this request:{' '} + + http://localhost:5001/?x-mf-data-fetch=provider%2FServerDowngrade.data%3Ahost¶ms=%7B%22isDowngrade%22%3Afalse%7D + {' '} + in network +

+ +
+ ); +}; + +export default Index; diff --git a/apps/modern-component-data-fetch/host/tsconfig.app.json b/apps/modern-component-data-fetch/host/tsconfig.app.json new file mode 100644 index 00000000000..b5b3e6e9e03 --- /dev/null +++ b/apps/modern-component-data-fetch/host/tsconfig.app.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["node", "express"], + "target": "ES2015", + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], + "include": ["src/**/*.ts"] +} diff --git a/apps/modern-component-data-fetch/host/tsconfig.json b/apps/modern-component-data-fetch/host/tsconfig.json new file mode 100644 index 00000000000..26ef0ff0304 --- /dev/null +++ b/apps/modern-component-data-fetch/host/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@modern-js/tsconfig/base", + "compilerOptions": { + "declaration": false, + "jsx": "preserve", + "baseUrl": "./", + "paths": { + "@/*": ["./src/*"], + "@shared/*": ["./shared/*"], + "*": ["./@mf-types/*"] + } + }, + "include": ["src", "shared", "config", "modern.config.ts"], + "exclude": ["**/node_modules"] +} diff --git a/apps/modern-component-data-fetch/host/tsconfig.spec.json b/apps/modern-component-data-fetch/host/tsconfig.spec.json new file mode 100644 index 00000000000..9b2a121d114 --- /dev/null +++ b/apps/modern-component-data-fetch/host/tsconfig.spec.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/apps/modern-component-data-fetch/provider-csr/module-federation.config.ts b/apps/modern-component-data-fetch/provider-csr/module-federation.config.ts new file mode 100644 index 00000000000..bc0fc0ec85d --- /dev/null +++ b/apps/modern-component-data-fetch/provider-csr/module-federation.config.ts @@ -0,0 +1,13 @@ +import { createModuleFederationConfig } from '@module-federation/modern-js'; + +export default createModuleFederationConfig({ + name: 'provider_csr', + filename: 'remoteEntry.js', + exposes: { + '.': './src/index.tsx', + }, + shared: { + react: { singleton: true }, + 'react-dom': { singleton: true }, + }, +}); diff --git a/apps/modern-component-data-fetch/provider-csr/package.json b/apps/modern-component-data-fetch/provider-csr/package.json new file mode 100644 index 00000000000..beee230d6b9 --- /dev/null +++ b/apps/modern-component-data-fetch/provider-csr/package.json @@ -0,0 +1,21 @@ +{ + "name": "modernjs-ssr-data-fetch-provider-csr", + "private": true, + "version": "0.1.34", + "scripts": { + "build": "rslib build", + "dev": "rslib mf-dev", + "build:watch": "rslib build --watch" + }, + "devDependencies": { + "@module-federation/enhanced": "workspace:*", + "@module-federation/rsbuild-plugin": "workspace:*", + "@module-federation/storybook-addon": "workspace:*", + "@rsbuild/plugin-react": "^1.0.6", + "@rslib/core": "^0.9.0", + "@types/react": "^18.3.11", + "http-server": "^14.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1" + } +} diff --git a/apps/modern-component-data-fetch/provider-csr/project.json b/apps/modern-component-data-fetch/provider-csr/project.json new file mode 100644 index 00000000000..2abaec5140c --- /dev/null +++ b/apps/modern-component-data-fetch/provider-csr/project.json @@ -0,0 +1,79 @@ +{ + "name": "modernjs-ssr-data-fetch-provider-csr", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/modern-component-data-fetch/provider-csr/src", + "projectType": "application", + "tags": [], + "implicitDependencies": ["typescript"], + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "npm run build --prefix apps/modern-component-data-fetch/provider-csr" + ] + } + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "npm run dev --prefix apps/modern-component-data-fetch/provider-csr" + ] + }, + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ] + }, + "dev": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "npm run dev --prefix apps/modern-component-data-fetch/provider-csr" + ] + }, + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ] + }, + "e2e": { + "executor": "@nx/cypress:cypress", + "options": { + "cypressConfig": "apps/modern-component-data-fetch/provider-csr/cypress.config.ts", + "testingType": "e2e", + "baseUrl": "http://localhost:4001", + "browser": "chrome" + }, + "configurations": { + "development": { + "runnerUi": true, + "browser": "electron", + "exit": false, + "watch": true + } + } + }, + "test:e2e": { + "executor": "nx:run-commands", + "options": { + "parallel": true, + "commands": [ + { + "command": "lsof -i :8080 || nx run modernjs-ssr-data-fetch-provider-csr:serve & echo 'done'", + "forwardAllArgs": false + }, + { + "command": "sleep 20 && nx run modernjs-ssr-data-fetch-provider-csr:e2e", + "forwardAllArgs": true + } + ] + } + } + } +} diff --git a/apps/modern-component-data-fetch/provider-csr/rslib.config.ts b/apps/modern-component-data-fetch/provider-csr/rslib.config.ts new file mode 100644 index 00000000000..993fcddf9db --- /dev/null +++ b/apps/modern-component-data-fetch/provider-csr/rslib.config.ts @@ -0,0 +1,28 @@ +import { pluginModuleFederation } from '@module-federation/rsbuild-plugin'; +import { pluginReact } from '@rsbuild/plugin-react'; +import { defineConfig } from '@rslib/core'; +import mfConfig from './module-federation.config'; + +const shared = { + dts: { + bundle: false, + }, +}; + +export default defineConfig({ + lib: [ + { + ...shared, + format: 'mf', + output: { + distPath: { + root: './dist/mf', + }, + }, + }, + ], + server: { + port: 5003, + }, + plugins: [pluginReact(), pluginModuleFederation(mfConfig, { ssr: true })], +}); diff --git a/apps/modern-component-data-fetch/provider-csr/src/index.data.ts b/apps/modern-component-data-fetch/provider-csr/src/index.data.ts new file mode 100644 index 00000000000..9cbe4997e71 --- /dev/null +++ b/apps/modern-component-data-fetch/provider-csr/src/index.data.ts @@ -0,0 +1,13 @@ +export type Data = { + data: string; +}; + +export const fetchData = async (): Promise => { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: `[ csr provider - server ] fetched data: ${new Date()}`, + }); + }, 1000); + }); +}; diff --git a/apps/modern-component-data-fetch/provider-csr/src/index.tsx b/apps/modern-component-data-fetch/provider-csr/src/index.tsx new file mode 100644 index 00000000000..38f2dc01d83 --- /dev/null +++ b/apps/modern-component-data-fetch/provider-csr/src/index.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import Button from 'antd/lib/button'; +import type { Data } from './index.data'; + +const Content = (props: { mfData?: Data }): JSX.Element => { + return ( +
+

+ {props?.mfData?.data || 'csr fallback data'} +

+ + +
+ ); +}; + +export default Content; diff --git a/apps/modern-component-data-fetch/provider-csr/tsconfig.json b/apps/modern-component-data-fetch/provider-csr/tsconfig.json new file mode 100644 index 00000000000..e6cfa6be441 --- /dev/null +++ b/apps/modern-component-data-fetch/provider-csr/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "esModuleInterop": true, + "paths": { + "*": ["./@mf-types/*"] + } + }, + "include": ["src/**/*", "src/stories"] +} diff --git a/apps/modern-component-data-fetch/provider/.npmrc b/apps/modern-component-data-fetch/provider/.npmrc new file mode 100644 index 00000000000..fa4e095233f --- /dev/null +++ b/apps/modern-component-data-fetch/provider/.npmrc @@ -0,0 +1 @@ +strict-peer-dependencies=false \ No newline at end of file diff --git a/apps/modern-component-data-fetch/provider/CHANGELOG.md b/apps/modern-component-data-fetch/provider/CHANGELOG.md new file mode 100644 index 00000000000..94dad013e00 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/CHANGELOG.md @@ -0,0 +1 @@ +# modernjs-ssr-nested-remote diff --git a/apps/modern-component-data-fetch/provider/modern.config.ts b/apps/modern-component-data-fetch/provider/modern.config.ts new file mode 100644 index 00000000000..cdec2c7bea7 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/modern.config.ts @@ -0,0 +1,21 @@ +import { appTools, defineConfig } from '@modern-js/app-tools'; +import { moduleFederationPlugin } from '@module-federation/modern-js'; + +// https://modernjs.dev/en/configure/app/usage +export default defineConfig({ + runtime: { + router: true, + }, + server: { + ssr: { + mode: 'stream', + }, + port: 5002, + }, + plugins: [ + appTools({ + bundler: 'rspack', + }), + moduleFederationPlugin(), + ], +}); diff --git a/apps/modern-component-data-fetch/provider/module-federation.config.ts b/apps/modern-component-data-fetch/provider/module-federation.config.ts new file mode 100644 index 00000000000..9cd74aa806c --- /dev/null +++ b/apps/modern-component-data-fetch/provider/module-federation.config.ts @@ -0,0 +1,14 @@ +import { createModuleFederationConfig } from '@module-federation/modern-js'; +export default createModuleFederationConfig({ + name: 'provider', + filename: 'remoteEntry.js', + exposes: { + './BasicComponent': './src/components/BasicComponent/index.tsx', + './ClientDowngrade': './src/components/ClientDowngrade/index.tsx', + './ServerDowngrade': './src/components/ServerDowngrade/index.tsx', + }, + shared: { + react: { singleton: true }, + 'react-dom': { singleton: true }, + }, +}); diff --git a/apps/modern-component-data-fetch/provider/package.json b/apps/modern-component-data-fetch/provider/package.json new file mode 100644 index 00000000000..e28430f9333 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/package.json @@ -0,0 +1,49 @@ +{ + "name": "modernjs-ssr-data-fetch-provider", + "private": true, + "version": "0.1.34", + "scripts": { + "reset": "npx rimraf ./**/node_modules", + "dev": "modern dev", + "build": "modern build", + "start": "modern start", + "serve": "modern serve", + "new": "modern new", + "lint": "modern lint", + "upgrade": "modern upgrade" + }, + "engines": { + "node": ">=16.18.1" + }, + "lint-staged": { + "*.{js,jsx,ts,tsx,mjs,cjs}": [ + "node --max_old_space_size=8192 ./node_modules/eslint/bin/eslint.js --fix --color --cache --quiet" + ] + }, + "eslintIgnore": [ + "node_modules/", + "dist/" + ], + "dependencies": { + "@babel/runtime": "7.26.0", + "@modern-js/runtime": "2.67.5", + "@module-federation/modern-js": "workspace:*", + "antd": "4.24.15", + "react": "~18.3.1", + "react-dom": "~18.3.1" + }, + "devDependencies": { + "@modern-js-app/eslint-config": "2.59.0", + "@modern-js/app-tools": "2.67.5", + "@modern-js/eslint-config": "2.59.0", + "@modern-js/tsconfig": "2.67.5", + "@types/jest": "~29.5.0", + "@types/node": "~16.11.7", + "@types/react": "~18.2.0", + "@types/react-dom": "~18.3.0", + "lint-staged": "~13.1.0", + "prettier": "~3.3.3", + "rimraf": "~3.0.2", + "typescript": "~5.0.4" + } +} diff --git a/apps/modern-component-data-fetch/provider/project.json b/apps/modern-component-data-fetch/provider/project.json new file mode 100644 index 00000000000..bc8a5aadf7f --- /dev/null +++ b/apps/modern-component-data-fetch/provider/project.json @@ -0,0 +1,77 @@ +{ + "name": "modernjs-ssr-data-fetch-provider", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/modern-component-data-fetch/provider/src", + "projectType": "application", + "tags": [], + "implicitDependencies": ["typescript"], + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/modern-component-data-fetch/provider; pnpm run build", + "forwardAllArgs": true + } + ] + } + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/modern-component-data-fetch/provider; pnpm run dev", + "forwardAllArgs": false + } + ] + } + }, + "e2e": { + "executor": "@nx/cypress:cypress", + "options": { + "cypressConfig": "apps/modern-component-data-fetch/provider/cypress.config.ts", + "testingType": "e2e", + "baseUrl": "http://localhost:4001", + "browser": "chrome" + }, + "configurations": { + "development": { + "runnerUi": true, + "browser": "electron", + "exit": false, + "watch": true + } + } + }, + "test:e2e": { + "executor": "nx:run-commands", + "options": { + "parallel": true, + "commands": [ + { + "command": "lsof -i :8080 || nx run modernjs-ssr-data-fetch-provider:serve & echo 'done'", + "forwardAllArgs": false + }, + { + "command": "sleep 20 && nx run modernjs-ssr-data-fetch-provider:e2e", + "forwardAllArgs": true + } + ] + } + } + } +} diff --git a/apps/modern-component-data-fetch/provider/src/.eslintrc.js b/apps/modern-component-data-fetch/provider/src/.eslintrc.js new file mode 100644 index 00000000000..fafc0032305 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/.eslintrc.js @@ -0,0 +1,9 @@ +// eslint-disable-next-line import/no-commonjs +module.exports = { + root: true, + extends: ['@modern-js-app'], + parserOptions: { + tsconfigRootDir: __dirname, + project: ['../tsconfig.json'], + }, +}; diff --git a/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.data.client.ts b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.data.client.ts new file mode 100644 index 00000000000..924656f7871 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.data.client.ts @@ -0,0 +1,13 @@ +export type Data = { + data: string; +}; + +export const fetchData = async (): Promise => { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: `[ provider - client ] fetched data: ${new Date()}`, + }); + }, 1000); + }); +}; diff --git a/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.data.ts b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.data.ts new file mode 100644 index 00000000000..5586247ab1c --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.data.ts @@ -0,0 +1,13 @@ +export type Data = { + data: string; +}; + +export const fetchData = async (): Promise => { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: `[ provider - server ] fetched data: ${new Date()}`, + }); + }, 1000); + }); +}; diff --git a/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.tsx b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.tsx new file mode 100644 index 00000000000..a7d8c6c692e --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/index.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import Button from 'antd/lib/button'; +import stuff from './stuff.module.css'; +import type { Data } from './index.data'; + +const Content = (props: { + mfData?: Data; + providerName?: string; + backgroundColor?: string; +}): JSX.Element => { + const providerName = props.providerName || 'provider'; + return ( +
+

+ {props?.mfData?.data || 'fallback data'} +

+ +
+ ); +}; + +export default Content; diff --git a/apps/modern-component-data-fetch/provider/src/components/BasicComponent/stuff.module.css b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/stuff.module.css new file mode 100644 index 00000000000..f486682a963 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/stuff.module.css @@ -0,0 +1,3 @@ +.test-remote2 { + background: rgb(119, 218, 59); +} diff --git a/apps/modern-component-data-fetch/provider/src/components/BasicComponent/stuff.module.css.d.ts b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/stuff.module.css.d.ts new file mode 100644 index 00000000000..9c66e6a39aa --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/BasicComponent/stuff.module.css.d.ts @@ -0,0 +1,3 @@ +const classes: { readonly 'test-remote2': string }; + +export default classes; diff --git a/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.data.client.ts b/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.data.client.ts new file mode 100644 index 00000000000..4722bdd4145 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.data.client.ts @@ -0,0 +1,13 @@ +export type Data = { + data: string; +}; + +export const fetchData = async (): Promise => { + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: `fetch data from provider client \n${new Date()}`, + }); + }, 1000); + }); +}; diff --git a/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.data.ts b/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.data.ts new file mode 100644 index 00000000000..9bef726226e --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.data.ts @@ -0,0 +1,15 @@ +export type Data = { + data: string; +}; + +export const fetchData = async (): Promise => { + throw new Error('force downgrade!'); + + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: `fetch data from provider \n${new Date()}`, + }); + }, 1000); + }); +}; diff --git a/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.tsx b/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.tsx new file mode 100644 index 00000000000..b013e4a9c08 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/ClientDowngrade/index.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import Basic from '../BasicComponent'; +import type { Data } from './index.data'; + +const Content = (props: { mfData?: Data }): JSX.Element => { + return ( + + ); +}; + +export default Content; diff --git a/apps/modern-component-data-fetch/provider/src/components/ServerDowngrade/index.data.ts b/apps/modern-component-data-fetch/provider/src/components/ServerDowngrade/index.data.ts new file mode 100644 index 00000000000..bb577925b53 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/ServerDowngrade/index.data.ts @@ -0,0 +1,17 @@ +import type { DataFetchParams } from '@module-federation/modern-js/runtime'; +export type Data = { + data: string; +}; + +export const fetchData = async (params: DataFetchParams): Promise => { + if (!params.isDowngrade) { + throw new Error('force downgrade!'); + } + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: `[ provider - server - ServerDowngrade] ${new Date()}`, + }); + }, 1000); + }); +}; diff --git a/apps/modern-component-data-fetch/provider/src/components/ServerDowngrade/index.tsx b/apps/modern-component-data-fetch/provider/src/components/ServerDowngrade/index.tsx new file mode 100644 index 00000000000..0428bfab9a7 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/components/ServerDowngrade/index.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import Basic from '../BasicComponent'; +import type { Data } from './index.data'; + +console.log('server-downgrade'); +const Content = (props: { mfData?: Data }): JSX.Element => { + return ( + + ); +}; + +export default Content; diff --git a/apps/modern-component-data-fetch/provider/src/modern-app-env.d.ts b/apps/modern-component-data-fetch/provider/src/modern-app-env.d.ts new file mode 100644 index 00000000000..827e6c01d97 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/modern-app-env.d.ts @@ -0,0 +1,4 @@ +/// +/// +/// +/// diff --git a/apps/modern-component-data-fetch/provider/src/routes/index.css b/apps/modern-component-data-fetch/provider/src/routes/index.css new file mode 100644 index 00000000000..e890f8aa146 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/routes/index.css @@ -0,0 +1,127 @@ +html, +body { + padding: 0; + margin: 0; + font-family: + PingFang SC, + Hiragino Sans GB, + Microsoft YaHei, + Arial, + sans-serif; + background: linear-gradient(to bottom, transparent, #fff) #eceeef; +} + +p { + margin: 0; +} + +* { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + box-sizing: border-box; +} + +.container-box { + min-height: 100vh; + max-width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding-top: 10px; +} + +main { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.title { + display: flex; + margin: 4rem 0 4rem; + align-items: center; + font-size: 4rem; + font-weight: 600; +} + +.logo { + width: 6rem; + margin: 7px 0 0 1rem; +} + +.name { + color: #4ecaff; +} + +.description { + text-align: center; + line-height: 1.5; + font-size: 1.3rem; + color: #1b3a42; + margin-bottom: 5rem; +} + +.code { + background: #fafafa; + border-radius: 12px; + padding: 0.6rem 0.9rem; + font-size: 1.05rem; + font-family: + Menlo, + Monaco, + Lucida Console, + Liberation Mono, + DejaVu Sans Mono, + Bitstream Vera Sans Mono, + Courier New, + monospace; +} + +.container-box .grid { + display: flex; + align-items: center; + justify-content: center; + width: 1100px; + margin-top: 3rem; +} + +.card { + padding: 1.5rem; + display: flex; + flex-direction: column; + justify-content: center; + height: 100px; + color: inherit; + text-decoration: none; + transition: 0.15s ease; + width: 45%; +} + +.card:hover, +.card:focus { + transform: scale(1.05); +} + +.card h2 { + display: flex; + align-items: center; + font-size: 1.5rem; + margin: 0; + padding: 0; +} + +.card p { + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + margin-top: 1rem; +} + +.arrow-right { + width: 1.3rem; + margin-left: 0.5rem; + margin-top: 3px; +} diff --git a/apps/modern-component-data-fetch/provider/src/routes/layout.tsx b/apps/modern-component-data-fetch/provider/src/routes/layout.tsx new file mode 100644 index 00000000000..6433ea79e92 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/routes/layout.tsx @@ -0,0 +1,9 @@ +import { Outlet } from '@modern-js/runtime/router'; + +export default function Layout() { + return ( +
+ +
+ ); +} diff --git a/apps/modern-component-data-fetch/provider/src/routes/page.data.ts b/apps/modern-component-data-fetch/provider/src/routes/page.data.ts new file mode 100644 index 00000000000..68ab0ea565c --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/routes/page.data.ts @@ -0,0 +1,6 @@ +import { fetchData } from '../components/BasicComponent/index.data'; +import type { Data } from '../components/BasicComponent/index.data'; + +export const loader = fetchData; + +export type { Data }; diff --git a/apps/modern-component-data-fetch/provider/src/routes/page.tsx b/apps/modern-component-data-fetch/provider/src/routes/page.tsx new file mode 100644 index 00000000000..d7e07c905bb --- /dev/null +++ b/apps/modern-component-data-fetch/provider/src/routes/page.tsx @@ -0,0 +1,17 @@ +import { useLoaderData } from '@modern-js/runtime/router'; +import Content from '../components/BasicComponent'; +import './index.css'; +import type { Data } from './page.data'; + +const Index = () => { + const data = useLoaderData() as Data; + console.log('page data', data); + + return ( +
+ +
+ ); +}; + +export default Index; diff --git a/apps/modern-component-data-fetch/provider/tsconfig.app.json b/apps/modern-component-data-fetch/provider/tsconfig.app.json new file mode 100644 index 00000000000..b5b3e6e9e03 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/tsconfig.app.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["node", "express"], + "target": "ES2015", + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], + "include": ["src/**/*.ts"] +} diff --git a/apps/modern-component-data-fetch/provider/tsconfig.json b/apps/modern-component-data-fetch/provider/tsconfig.json new file mode 100644 index 00000000000..26ef0ff0304 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "@modern-js/tsconfig/base", + "compilerOptions": { + "declaration": false, + "jsx": "preserve", + "baseUrl": "./", + "paths": { + "@/*": ["./src/*"], + "@shared/*": ["./shared/*"], + "*": ["./@mf-types/*"] + } + }, + "include": ["src", "shared", "config", "modern.config.ts"], + "exclude": ["**/node_modules"] +} diff --git a/apps/modern-component-data-fetch/provider/tsconfig.spec.json b/apps/modern-component-data-fetch/provider/tsconfig.spec.json new file mode 100644 index 00000000000..9b2a121d114 --- /dev/null +++ b/apps/modern-component-data-fetch/provider/tsconfig.spec.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/apps/website-new/docs/en/guide/framework/modernjs.mdx b/apps/website-new/docs/en/guide/framework/modernjs.mdx index ef2f2fb1787..98ddd161d4d 100644 --- a/apps/website-new/docs/en/guide/framework/modernjs.mdx +++ b/apps/website-new/docs/en/guide/framework/modernjs.mdx @@ -1,20 +1,24 @@ # Modern.js -This plugin provides Module Federation supporting functions for Modern.js +[Modern.js](https://modernjs.dev/guides/get-started/introduction.html) is a progressive web development framework based on React. Internally at ByteDance, Modern.js supports the development of thousands of web applications. + +The Module Federation team works closely with the Modern.js team and provides the `@module-federation/modern-js` plugin to help users better utilize Module Federation within Modern.js. ## Supports - modern.js ^2.56.1 -- Server-Side Rendering +- Includes Server-Side Rendering (SSR) + +We highly recommend referencing these applications, which showcases the best practices for integrating Modern.js with Module Federation: -We highly recommend referencing this application which takes advantage of the best capabilities: -[module-federation example](https://github.com/module-federation/core/tree/main/apps/modernjs-ssr) +* [Server-Side Rendering (SSR)](https://github.com/module-federation/core/tree/main/apps/modernjs-ssr) +* [Component-Level Data Fetch](https://github.com/module-federation/core/tree/main/apps/modern-component-data-fetch) ## Quick Start ### Installation -You can install the plugin with the following commands: +You can install the plugin using the following commands: import { PackageManagerTabs } from '@theme'; @@ -29,7 +33,7 @@ import { PackageManagerTabs } from '@theme'; ### Apply Plugin -Apply this plugin in `plugins` of `modern.config.ts`: +Apply this plugin in the `plugins` section of `modern.config.ts`: ```ts title="modern.config.ts" import { appTools, defineConfig } from '@modern-js/app-tools'; @@ -42,12 +46,12 @@ export default defineConfig({ runtime: { router: true, }, - // moduleFederationPlugin is a plug-in for modern.js, which can make certain modifications to the build/runtime + // moduleFederationPlugin is a plugin for modern.js that can make certain modifications to the build/runtime plugins: [appTools(), moduleFederationPlugin()], }); ``` -Then create the `module-federation.config.ts` file and write the required configuration: +Then, create the `module-federation.config.ts` file and add the required configuration: ```ts title="module-federation.config.ts" import { createModuleFederationConfig } from '@module-federation/modern-js'; @@ -63,39 +67,260 @@ export default createModuleFederationConfig({ }); ``` -### Type support +## Server-Side Rendering (SSR) + +:::info Note +For a better performance experience, Module Federation X Modern.js SSR only supports stream SSR. +::: + +There is no difference in using Module Federation in SSR scenarios compared to CSR scenarios; developers can continue with their existing development practices. + +## Component-Level Data Fetch + +### Introduction + +In SSR scenarios, `useEffect` does not execute, which normally prevents fetching data before rendering a component. + +To support this functionality, mainstream frameworks typically prefetch data based on React Router's `data loader` and inject it into route components. Route components then access and render this data using [useLoaderData](https://reactrouter.com/api/hooks/useLoaderData#useloaderdata). + +This approach heavily relies on routing functionality and cannot be used directly with Module Federation. + +To address this issue, Module Federation provides **component-level** data fetching capabilities, enabling developers to fetch and render data in SSR scenarios. + +:::tip What does component-level mean? +Module Federation usage can be broadly categorized into two parts: components (functions) and applications. The difference lies in whether they include *routing* functionality. +::: + +### How to Use + +Different actions are required depending on the role. + +#### Provider +::: info Note +Producers can use [Rslib](../basic/rsbuild#ssr) to generate SSR components. + +However, it should be noted that because the data in "Data Fetching" is injected by the consumer. Therefore, if "Data Fetching" is used in Rslib, the exported non-MF components cannot be isomorphic with MF components. +::: -add `/// ` in `modern-app-env.d.ts` to get type support. +Each exposed module can have a corresponding `.data` file with the same name. These files can export a loader function, which we call a Data Loader. This function executes before the corresponding `expose` component renders, providing data to the component. Here's an example: -```diff title='modern-app-env.d.ts' -+ /// +```bash +. +└── src + ├── List.tsx + └── List.data.ts ``` -## Server-Side Rendering +The `List.data.ts` file needs to export a function named `fetchData`. This function will execute before the `List` component renders and inject its data. Here's an example: -:::info -For a better performance experience, Module Federation X Modern.js SSR only supports stream SSR. +```ts title="List.data.ts" +import type { DataFetchParams } from '@module-federation/modern-js/runtime'; +export type Data = { + data: string; +}; + +export const fetchData = async (params: DataFetchParams): Promise => { + console.log('params: ', params); + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: `data: ${new Date()}`, + }); + }, 1000); + }); +}; +``` + +The data from the loader function is injected into the producer's props with the key `mfData`. Therefore, the producer needs to modify its code to consume this data, as shown in the example below: + +```tsx title="List.tsx" +import React from 'react'; +import type { Data } from './index.data'; + +const List = (props: { + mfData?: Data; +}): JSX.Element => { + return ( +
+ {props.mfData?.data && props.mfData?.data.map((item,index)=>

{item}

)} +
+ ); +}; + +export default List; +``` + + +##### Producer Consuming Its Own Data + +If Modern.js is used to develop a producer, and this producer page is also accessed independently, then Modern.js's [Data Loader](https://modernjs.dev/zh/guides/basic-features/data/data-fetch.html) can be used to inject data. + +Its usage is basically the same as Module Federation, except for the function name. Therefore, you can easily consume Data Loader in the producer, as shown in the example below: + +* Create a `page.data.ts` file in the producer page and export a function named `loader`: + +```ts title="page.data.ts" +import { fetchData } from '../components/List.data'; +import type { Data } from '../components/List.data'; + +export const loader = fetchData + +export type {Data} +``` +* Consume this data in the producer page : + +```tsx title="page.tsx" +import { useLoaderData } from '@modern-js/runtime/router'; +import List from '../components/List'; +import './index.css'; + +import type { Data } from './page.data'; + +const Index = () => { + const data = useLoaderData() as Data; + console.log('page data', data); + + return ( +
+ +
+)}; + +export default Index; +``` + +#### Consumer + +In the consumer, we need to use `createRemoteComponent` to load the remote component and fetch data. + +```tsx +import { kit, ERROR_TYPE } from '@module-federation/modern-js/runtime'; + +const { createRemoteComponent } = kit; + +const List = createRemoteComponent({ + loader: () => { + return import('remote/List'); + }, + loading: 'loading...', + export: 'default', + fallback: ({error,errorType,dataFetchMapKey}) => { + console.error(error) + if(errorType === ERROR_TYPE.LOAD_REMOTE){ + return
load remote failed
+ } + if(errorType === ERROR_TYPE.DATA_FETCH){ + return
data fetch failed, the dataFetchMapKey key is: {dataFetchMapKey}
+ } + return
error type is unknown
; + }, +}); + +const Index = (): JSX.Element => { + return ( +
+

Basic usage with data fetch

+ +
+ ); +}; + +export default Index; +``` + +### Loader Function + +#### Parameters + +By default, parameters are passed to the loader function. The type is `DataFetchParams`, which includes the following field: + +- `isDowngrade` (boolean): Indicates whether the current execution context is in downgrade mode. For example, if Server-Side Rendering (SSR) fails and falls back to Client-Side Rendering (CSR), a request will be re-initiated to the server to call the loader function, and this value will be `true`. + +In addition to the default parameters, you can also pass the [dataFetchParams](#datafetchparams) field in `createRemoteComponent`. This field will be passed through to the loader function. + +#### Return Value + +The return value of the loader function can only be a **serializable data object**. + +### Using Data Loader in Different Environments + +The loader function may execute on the server or in the browser. A loader function executed on the server is called a Server Loader, and one executed in the browser is called a Client Loader. + +In CSR applications, the loader function executes in the browser, meaning they are all Client Loaders by default. + +In SSR applications, the loader function only executes on the server, meaning they are all Server Loaders by default. In SSR, Module Federation directly calls the corresponding loader function on the server. When switching routes in the browser, Module Federation sends an HTTP request to the SSR service, which also triggers the loader function on the server. + +:::note NOTE +Having the loader function for SSR applications execute only on the server offers the following benefits: + +- Simplified usage: Ensures that data fetching in SSR applications is isomorphic, so developers don't need to differentiate loader function execution code based on the environment. +- Reduced browser bundle size: Moves logic code and its dependencies from the browser to the server. +- Improved maintainability: Moves logic code to the server, reducing the direct impact of data logic on the frontend UI. Additionally, it prevents accidental inclusion of server-side dependencies in the browser bundle or browser-side dependencies in the server bundle. ::: -There is no difference between using Module Federation in SSR scenarios and CSR scenarios. Developers can just keep following the original development behavior. +#### Using Client Loader in SSR Applications -But for a better user experience, we provide supporting functions/components to help developers better use Module Federation. +By default, in SSR applications, the loader function only executes on the server. However, in some scenarios, developers might want requests sent from the browser to bypass the SSR service and directly request the data source, for example: -### createRemoteSSRComponent +1. To reduce network consumption in the browser by directly requesting the data source. +2. If the application has data caching in the browser and doesn't want to request data from the SSR service. + +Module Federation supports adding an additional `.data.client` file in SSR applications, which also exports a named loader. In this case, if the Data Loader in the SSR application encounters an error and downgrades, or when switching routes in the browser, it will execute this loader function in the browser like a CSR application, instead of sending a data request to the SSR service. + +```ts title="List.data.client.ts" +import cache from 'my-cache'; + +export async function loader({ params }) { + if (cache.has(params.id)) { + return cache.get(params.id); + } + const res = await fetch('URL_ADDRESS?id={params.id}'); + return { + message: res.message, + } +} +``` +:::warning WARNING +To use a Client Loader, there must be a corresponding Server Loader, and the Server Loader must be defined using the `.data` file convention, not the `.loader` file convention. +::: + +### FAQ + +#### Application-Level Data Fetching? + +For application-level modules, we prefer to use RSC (React Server Components) to achieve more complete functionality. This feature is currently being explored, so please stay tuned. + +#### Support nested remote? + +Not supported yet. + +## API + +In addition to exporting [MF Runtime](../basic/runtime), `@module-federation/modern-js/runtime` also provides a series of APIs to help developers better use Module Federation. + +To prevent conflicts with Shared modules, you need to import them as follows: + +```ts +import { kit } from '@module-federation/modern-js/runtime'; +const { loadRemote ,createRemoteComponent, createRemoteSSRComponent, wrapNoSSR } = kit; +``` + +### createRemoteComponent import Collapse from '@components/Collapse' ```ts -declare function createRemoteSSRComponent( - props: CreateRemoteSSRComponentOptions +declare function createRemoteComponent( + props: CreateRemoteComponentOptions ): (props: ComponentType) => React.JSX.Element; -type CreateRemoteSSRComponentOptions = { +type CreateRemoteComponentOptions = { loader: () => Promise; loading: React.ReactNode; - fallback: ErrorBoundaryPropsWithComponent['FallbackComponent']; + fallback: ReactNode | ((errorInfo: ErrorInfo) => ReactNode); export?: E; + dataFetchParams?: DataFetchParams; }; type ComponentType = T[E] extends (...args: any) => any @@ -103,87 +328,162 @@ type ComponentType = T[E] extends (...args: any) => any ? Record : Parameters[0] : Record; + +type DataFetchParams = { + isDowngrade: boolean; +} & Record; + +type ErrorInfo = { + error: Error; + errorType: number; + dataFetchMapKey?: string; +}; ``` -This function will also help inject the corresponding style tag/script while loading the component. This behavior can help avoid the CSS flickering problem caused by streaming rendering and accelerate the PID (first screen interactive time). +This function supports loading components and also provides the following capabilities: + +1. In SSR mode, it injects the corresponding producer's style tags/script resources. This behavior helps avoid CSS flickering issues caused by stream rendering and accelerates PID (First Paint Interactive Time). +2. If the producer has a data fetching function, this function will be automatically called and the data injected. #### Example ```tsx import React, { FC, memo, useEffect } from 'react'; -import { registerRemotes, kit } from '@module-federation/modern-js/runtime'; -// The remote declared in the build plug-in can be imported directly at the top level -import RemoteComp from 'remote/Image'; +import { kit, ERROR_TYPE } from '@module-federation/modern-js/runtime'; -const { createRemoteSSRComponent } = kit; +const { createRemoteComponent } = kit; -const RemoteSSRComponent = createRemoteSSRComponent({ - // The remote declared in the build plug-in can also be loaded using this function: loader: () => import('remote/Image'), - loader: () => loadRemote('dynamic_remote'), +const RemoteComponent = createRemoteComponent({ + loader: () => import('remote/Image'), loading:
loading...
, - fallback: ({ error }) => { - if (error instanceof Error && error.message.includes('not exist')) { - return
fallback - not existed id
; + fallback: ({error,errorType,dataFetchMapKey}) => { + console.error(error) + if(errorType === ERROR_TYPE.LOAD_REMOTE){ + return
load remote failed
} - return
fallback
; + if(errorType === ERROR_TYPE.DATA_FETCH){ + return
data fetch failed, the dataFetchMapKey key is: {dataFetchMapKey}
+ } + return
error type is unknown
; }, }); -const Product: FC = () => { - registerRemotes([ - { - name: 'dynamic_remote', - entry: 'http://localhost:3008/mf-manifest.json', - }, - ]); - - const fallback = (err: Error) => { - if (err.message.includes('does not exist in container')) { - return
404
; - } - throw err; - }; - +const App: FC = () => { return <> - - + ; }; -export default Product; +export default App; ``` +#### loader + +- Type: `() => Promise` +- Required: Yes +- Default value: `undefined` + +A function to load the remote component, usually `()=>loadRemote(id)` or `()=>import(id)`. + #### loading -- Type:`React.ReactNode` +- Type: `React.ReactNode` - Required: Yes - Default value: `undefined` -Set module loading status. +Sets the module loading state. #### fallback -- Type:`((err: Error) => React.ReactElement)` +- Type: `(({ error }: { error: ErrorInfo}) => React.ReactElement)` - Required: Yes - Default value: `undefined` -A fault-tolerant component that is rendered when the component fails to **load** or **render**. +The fallback component rendered when the component fails to **load** or **render**. + +#### export + +- Type: `string` +- Required: No +- Default value: `'default'` -Note: This component only renders this fault-tolerant component on the client side when **rendering** fails. +If the remote component is a named export, you can use this parameter to specify the name of the component to export. By default, it loads the default export. + +#### dataFetchParams + +- Type: `DataFetchParams` +- Required: No +- Default value: `undefined` + +If the remote component has a data fetching function, setting this will pass it to the data fetching function. + +### createRemoteSSRComponent + +:::danger Note +This function will be deprecated. It is recommended to use [createRemoteComponent](#createremotecomponent). +::: + +### wrapNoSSR + + +```ts +declare function wrapNoSSR( + createComponentFn: typeof createRemoteComponent, +) : (options: CreateRemoteComponentOptions) => (props: ComponentType) => React.JSX.Element +``` + + +Wraps a component so that it does not render in SSR scenarios. + +Usage example: + +```tsx +import { kit } from '@module-federation/modern-js/runtime'; + +const { createRemoteComponent, wrapNoSSR } = kit; + +const RemoteComponent = wrapNoSSR(createRemoteComponent)({ + loader: () => { + return import('remote/Content'); + }, + loading: 'loading...', + export: 'default', + fallback: ({ error }) => { + if (error instanceof Error && error.message.includes('not exist')) { + return
fallback - not existed id
; + } + return
fallback
; + }, +}); + +const Index = (): JSX.Element => { + return ( +
+

+ The component will be render in csr. +

+ +
+ ); +}; + +export default Index; + +``` ## Configuration ### ssr - Type: `false` -- Is it required: No +- Required: No - Default value: `undefined` -`@module-federation/modern-js` will automatically add SSR related build presets based on `server.ssr` in modern.js config. +`@module-federation/modern-js` will automatically add SSR-related build presets based on `server.ssr` in the modern.js config. -If the current project only needs to load MF in the CSR, you can set `ssr: false` to help progressive migration. +If the current project only needs to load MF in CSR, you can set `ssr: false` to help with progressive migration. -```ts title='modern.config.ts' +```title='modern.config.ts' import { appTools, defineConfig } from '@modern-js/app-tools'; import { moduleFederationPlugin } from '@module-federation/modern-js'; @@ -206,3 +506,11 @@ export default defineConfig({ ], }); ``` + +### fetchServerQuery + +- Type: `Record` +- Required: No +- Default: `undefined` + +If a downgrade occurs, an HTTP request will be sent to the server. This configuration can be used to add query parameters to that request. diff --git a/apps/website-new/docs/zh/guide/framework/modernjs.mdx b/apps/website-new/docs/zh/guide/framework/modernjs.mdx index ee9de49da91..1271c0ed37c 100644 --- a/apps/website-new/docs/zh/guide/framework/modernjs.mdx +++ b/apps/website-new/docs/zh/guide/framework/modernjs.mdx @@ -1,14 +1,18 @@ # Modern.js -该插件为 Modern.js 提供 Module Federation 配套功能 +[Modern.js](https://modernjs.dev/zh/guides/get-started/introduction.html) 是一个基于 React 的渐进式 Web 开发框架。在字节跳动内部,Modern.js 支撑了数千个 Web 应用的研发。 + +Module Federation 团队与 Modern.js 团队紧密合作,并提供 `@module-federation/modern-js` 插件来帮助用户在 Modern.js 中更好的使用 Module Federation。 ## 支持 - modern.js ^2.56.1 - 包含服务器端渲染(SSR) -强烈推荐参考这个应用,它提供了 Modern.js 与 Module Federation 结合的最佳实践: -[module-federation 示例](https://github.com/module-federation/core/tree/main/apps/modernjs-ssr) +强烈推荐参考下列应用,它提供了 Modern.js 与 Module Federation 结合的最佳实践: + +* [服务端渲染(SSR)](https://github.com/module-federation/core/tree/main/apps/modernjs-ssr) +* [组件级别数据获取](https://github.com/module-federation/core/tree/main/apps/modern-component-data-fetch) ## 快速开始 @@ -63,45 +67,261 @@ export default createModuleFederationConfig({ }); ``` -### 引用类型 +## 服务端渲染(SSR) + +:::info 注意 +为更好的性能体验,Module Federation X Modern.js SSR 仅支持 stream SSR 。 +::: + +在 SSR 场景与 CSR 场景中使用 Module Federation 没有任何区别,开发者保持按照原有的开发行为即可。 + +## 组件级别数据获取 + +### 简介 + +SSR 场景中, `useEffect` 不会执行,这一行为导致常规情况下,无法先获取数据再渲染组件。 + +为了支持这一功能,主流框架一般会基于 React Router 提供的 `data loader` 预取数据,并注入给路由组件,路由组件通过 [useLoaderData](https://reactrouter.com/api/hooks/useLoaderData#useloaderdata) 获取数据并渲染。 + +这一行为强依赖路由功能,在 Module Federation 下就无法正常使用。 + +为了解决这一问题,Module Federation 提供了**组件**级别数据获取能力,以便开发者可以在 SSR 场景下获取数据并渲染组件。 + +:::tip 什么是组件级别? +Module Federation 的使用大体分为两种部分:组件(函数)、应用。两者的区别在于是否带有*路由*功能。 +::: + +### 如何使用 + +根据角色的不同,需要做不同的行为。 + +#### 生产者 +::: info 注意 +生产者可以使用 [Rslib](../basic/rsbuild#ssr) 来生成 SSR 组件。 + +不过需要注意的是,因为「数据获取」中的数据由消费者注入。因此如果在 Rslib 中使用了「数据获取」,那么其导出的非 MF 组件无法与 MF 组件保持同构。 +::: + +每个 expose 模块都可以有一个同名的 `.data` 文件。这些文件可以导出一个 loader 函数,我们称为 Data Loader,它会在对应的 `expose` 组件渲染之前执行,为组件提供数据。如下面示例: + +```bash +. +└── src + ├── List.tsx + └── List.data.ts +``` + +其中 `List.data.ts` 需要导出名为 `fetchData` 的函数,该函数将会在 `List` 组件渲染前执行,并将其数据注入,示例如下: + +```ts title="List.data.ts" +import type { DataFetchParams } from '@module-federation/modern-js/runtime'; +export type Data = { + data: string; +}; + +export const fetchData = async (params: DataFetchParams): Promise => { + console.log('params: ', params); + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + data: `data: ${new Date()}`, + }); + }, 1000); + }); +}; +``` + +loader 函数数据会被注入到生产者的 props 中,key 为 `mfData`,因此生产者需要改动代码,消费此数据,示例如下: + +```tsx title="List.tsx" +import React from 'react'; +import type { Data } from './index.data'; + +const List = (props: { + mfData?: Data; +}): JSX.Element => { + return ( +
+ {props.mfData?.data && props.mfData?.data.map((item,index)=>

{item}

)} +
+ ); +}; + +export default List; +``` + +##### 生产者消费自身数据 + +如果使用了 Modern.js 来开发生产者,并且该生产者页面也会单独访问。那么可以利用 Modern.js 提供的 [Data Loader](https://modernjs.dev/zh/guides/basic-features/data/data-fetch.html) 来注入数据。 + +其用法与 Module Federation 除了函数名称外,基本一致。因此你可以很方便的在生产者消费 Data Loader,示例如下: + +* 在生产者页面创建 `page.data.ts` 文件,导出名为 `loader` 的函数: + +```ts title="page.data.ts" +import { fetchData } from '../components/List.data'; +import type { Data } from '../components/List.data'; + +export const loader = fetchData + +export type {Data} +``` + +* 在生产者 `page` 页面消费此数据: + +```tsx title="page.tsx" +import { useLoaderData } from '@modern-js/runtime/router'; +import List from '../components/List'; +import './index.css'; + +import type { Data } from './page.data'; + +const Index = () => { + const data = useLoaderData() as Data; + console.log('page data', data); + + return ( +
+ +
+)}; + +export default Index; + +``` + +#### 消费者 + +在消费者中,我们需要通过 `createRemoteComponent` 来加载远程组件,并获取数据。 -在 `tsconfig.json` 添加 `paths` 以获取生产者的类型: +```tsx +import { kit, ERROR_TYPE } from '@module-federation/modern-js/runtime'; + +const { createRemoteComponent } = kit; -```json -{ - "compilerOptions": { - "paths": { - "*": ["./@mf-types/*"] +const List = createRemoteComponent({ + loader: () => { + return import('remote/List'); + }, + loading: 'loading...', + export: 'default', + fallback: ({error,errorType,dataFetchMapKey}) => { + console.error(error) + if(errorType === ERROR_TYPE.LOAD_REMOTE){ + return
load remote failed
} + if(errorType === ERROR_TYPE.DATA_FETCH){ + return
data fetch failed, the dataFetchMapKey key is: {dataFetchMapKey}
+ } + return
error type is unknown
; + }, +}); + +const Index = (): JSX.Element => { + return ( +
+

Basic usage with data fetch

+ +
+ ); +}; + +export default Index; +``` + +### loader 函数 + +#### 入参 + +默认会往 loader 函数传递参数,其类型为 `DataFetchParams`,包含以下字段: + +- `isDowngrade` (boolean): 表示当前执行上下文是否处于降级模式。例如,在服务端渲染 (SSR) 失败,在客户端渲染(CSR)中会重新往服务端发起请求,调用 loader 函数,此时该值为 `true`。 + +除了默认的参数以外,还可以在 `createRemoteComponent` 中传递 [dataFetchParams](#datafetchparams) 字段,该字段会被透传给 loader 函数。 + +#### 返回值 + +loader 函数的返回值只能是**可序列化的数据对象**。 + +### 在不同环境使用 Data Loader + +loader 函数可能会在服务端或浏览器端执行。在服务端执行的 loader 函数,我们称为 Server Loader,在浏览器端执行的称为 Client Loader。 + +在 CSR 应用中,loader 函数会在浏览器端执行,即默认都是 Client Loader。 + +在 SSR 应用中,loader 函数只会在服务端执行,即默认都是 Server Loader。在 SSR Module Federation 会直接在服务端调用对应的 loader 函数。在浏览器端切换路由时,Module Federation 会发送一个 http 请求到 SSR 服务,同样在服务端触发 loader 函数。 + +:::note NOTE +SSR 应用的 loader 函数只在服务端执行可以带来以下好处: + +简化使用方式:保证 SSR 应用获取数据的方式是同构的,开发者无需根据环境区分 loader 函数执行的代码。 +减少浏览器端 bundle 体积:将逻辑代码及其依赖,从浏览器端移动到了服务端。 +提高可维护性:将逻辑代码移动到服务端,减少了数据逻辑对前端 UI 的直接影响。此外,也避免了浏览器端 bundle 中误引入服务端依赖,或服务端 bundle 中误引入浏览器端依赖的问题。 +::: + +#### 在 SSR 应用中使用 Client Loader + +默认情况下,在 SSR 应用中,loader 函数只会在服务端执行。但有些场景下,开发者可能期望在浏览器端发送的请求不经过 SSR 服务,直接请求数据源,例如: + +1. 在浏览器端希望减少网络消耗,直接请求数据源。 +2. 应用在浏览器端有数据缓存,不希望请求 SSR 服务获取数据。 + +Module Federation 支持在 SSR 应用中额外添加 .data.client 文件,同样具名导出 loader。此时 SSR 应用在服务端执行 Data Loader 报错降级,或浏览器端切换路由时,会像 CSR 应用一样在浏览器端执行该 loader 函数,而不是再向 SSR 服务发送数据请求。 + +```ts title="List.data.client.ts" +import cache from 'my-cache'; + +export async function loader({ params }) { + if (cache.has(params.id)) { + return cache.get(params.id); + } + const res = await fetch('URL_ADDRESS?id={params.id}'); + return { + message: res.message, } } ``` +:::warning WARNING +要使用 Client Loader,必须有对应的 Server Loader,且 Server Loader 必须是 .data 文件约定,不能是 .loader 文件约定。 +::: -## 服务端渲染(SSR) +### FAQ -:::info 注意 -为更好的性能体验,Module Federation X Modern.js SSR 仅支持 stream SSR 。 -::: +#### 应用级别数据获取? -在 SSR 场景与 CSR 场景中使用 Module Federation 没有任何区别,开发者保持按照原有的开发行为即可。 +应用级别的模块,我们更希望使用 RSC 来实现,使其功能更加的完善。目前该功能正在探索中,敬请期待。 -但为了更好地使用体验,我们提供了配套的函数/组件来帮助开发者更好的使用 Module Federation。 +#### 是否支持嵌套生产者? -### createRemoteSSRComponent +不支持。 + +## API + +`@module-federation/modern-js/runtime` 除了导出了 [MF Runtime](../basic/runtime),还提供供了一系列的 API 来帮助开发者更好的使用 Module Federation。 + +为防止与 Shared 冲突,需要通过下列方式引用。 + +```ts +import { kit } from '@module-federation/modern-js/runtime'; +const { loadRemote ,createRemoteComponent, createRemoteSSRComponent, wrapNoSSR } = kit; +``` + +### createRemoteComponent import Collapse from '@components/Collapse' ```ts -declare function createRemoteSSRComponent( - props: CreateRemoteSSRComponentOptions +declare function createRemoteComponent( + props: CreateRemoteComponentOptions ): (props: ComponentType) => React.JSX.Element; -type CreateRemoteSSRComponentOptions = { +type CreateRemoteComponentOptions = { loader: () => Promise; loading: React.ReactNode; - fallback: ErrorBoundaryPropsWithComponent['FallbackComponent']; + fallback: ReactNode | ((errorInfo: ErrorInfo) => ReactNode); export?: E; + dataFetchParams?: DataFetchParams; }; type ComponentType = T[E] extends (...args: any) => any @@ -109,56 +329,63 @@ type ComponentType = T[E] extends (...args: any) => any ? Record : Parameters[0] : Record; + +type DataFetchParams = { + isDowngrade: boolean; +} & Record; + +type ErrorInfo = { + error: Error; + errorType: number; + dataFetchMapKey?: string; +}; ``` -该函数在加载组件同时,还会帮助注入相应的样式标签/脚本 ,此行为可以帮助避免流式渲染带来的 CSS 闪烁问题以及加速 PID (首屏可交互时间)。 +该函数除了支持加载组件之外,还支持下列能力: + +1. SSR 模式中会注入对应生产者的样式标签/脚本资源 ,此行为可以帮助避免流式渲染带来的 CSS 闪烁问题以及加速 PID (首屏可交互时间)。 +2. 如果生产者存在数据获取函数,那么会自动调用此函数并注入数据。 #### 示例 ```tsx import React, { FC, memo, useEffect } from 'react'; -import { registerRemotes, kit } from '@module-federation/modern-js/runtime'; -// 在构建插件声明过的 remote 可以直接在顶层 import -import RemoteComp from 'remote/Image'; +import { kit, ERROR_TYPE } from '@module-federation/modern-js/runtime'; -const { createRemoteSSRComponent } = kit; +const { createRemoteComponent } = kit; -const RemoteSSRComponent = createRemoteSSRComponent({ - // 在构建插件声明过的 remote 也可以使用此函数加载:loader: () => import('remote/Image'), - loader: () => loadRemote('dynamic_remote'), +const RemoteComponent = createRemoteComponent({ + loader: () => import('remote/Image'), loading:
loading...
, - fallback: ({ error }) => { - if (error instanceof Error && error.message.includes('not exist')) { - return
fallback - not existed id
; + fallback: ({error,errorType,dataFetchMapKey}) => { + console.error(error) + if(errorType === ERROR_TYPE.LOAD_REMOTE){ + return
load remote failed
} - return
fallback
; + if(errorType === ERROR_TYPE.DATA_FETCH){ + return
data fetch failed, the dataFetchMapKey key is: {dataFetchMapKey}
+ } + return
error type is unknown
; }, }); -const Product: FC = () => { - registerRemotes([ - { - name: 'dynamic_remote', - entry: 'http://localhost:3008/mf-manifest.json', - }, - ]); - - const fallback = (err: Error) => { - if (err.message.includes('does not exist in container')) { - return
404
; - } - throw err; - }; - +const App: FC = () => { return <> - - + ; }; -export default Product; +export default App; ``` +#### loader + +- 类型:`() => Promise` +- 是否必填:是 +- 默认值:`undefined` + +加载远程组件的函数,通常为 `()=>loadRemote(id)` 或者 `()=>import(id)`。 + #### loading - 类型:`React.ReactNode` @@ -169,13 +396,81 @@ export default Product; #### fallback -- 类型:`(({ error }: { error: Error}) => React.ReactElement)` +- 类型:`(({ error }: { error: ErrorInfo}) => React.ReactElement)` - 是否必填:是 - 默认值:`undefined` 当组件**加载**或**渲染**失败时,所渲染的容错组件。 -注意:当**渲染**失败的时候,该组件仅在客户端渲染此 容错组件。 +#### export + +- 类型:`string` +- 是否必填:否 +- 默认值:`'default'` + +如果远程组件是具名导出,那么可以通过此参数指定需要导出的组件名称,默认加载 default 导出。 + +#### dataFetchParams + +- 类型:`DataFetchParams` +- 是否必填:否 +- 默认值:`undefined` + +如果远程组件存在数据获取函数,设置后会传递给数据获取函数。 + +### createRemoteSSRComponent + +:::danger 注意 +此函数将被废弃。推荐使用 [createRemoteComponent](#createremotecomponent) +::: + +### wrapNoSSR + + +```ts +declare function wrapNoSSR( + createComponentFn: typeof createRemoteComponent, +) : (options: CreateRemoteComponentOptions) => (props: ComponentType) => React.JSX.Element +``` + + +包裹组件,使其在 SSR 场景下不渲染。 + +使用示例: + +```tsx +import { kit } from '@module-federation/modern-js/runtime'; + +const { createRemoteComponent, wrapNoSSR } = kit; + +const RemoteComponent = wrapNoSSR(createRemoteComponent)({ + loader: () => { + return import('remote/Content'); + }, + loading: 'loading...', + export: 'default', + fallback: ({ error }) => { + if (error instanceof Error && error.message.includes('not exist')) { + return
fallback - not existed id
; + } + return
fallback
; + }, +}); + +const Index = (): JSX.Element => { + return ( +
+

+ The component will be render in csr. +

+ +
+ ); +}; + +export default Index; + +``` ## 配置 @@ -212,3 +507,11 @@ export default defineConfig({ ], }); ``` + +### fetchServerQuery + +- 类型:`Record` +- 是否必填:否 +- 默认值:`undefined` + +如果发生降级,那么会向服务端发送一个 http 请求,此时可以通过此配置来添加请求的 query。 diff --git a/package.json b/package.json index 4e2f9b093c3..689c0d34719 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "app:manifest:dev": "NX_TUI=false nx run-many --target=serve --configuration=development --parallel=100 -p modernjs,manifest-webpack-host,3009-webpack-provider,3010-rspack-provider,3011-rspack-manifest-provider,3012-rspack-js-entry-provider", "app:manifest:prod": "NX_TUI=false nx run-many --target=serve --configuration=production --parallel=100 -p modernjs,manifest-webpack-host,3009-webpack-provider,3010-rspack-provider,3011-rspack-manifest-provider,3012-rspack-js-entry-provider", "app:ts:dev": "nx run-many --target=serve -p react_ts_host,react_ts_nested_remote,react_ts_remote", + "app:component-data-fetch:dev": "NX_TUI=false nx run-many --target=serve --parallel=3 --configuration=development -p modernjs-ssr-data-fetch-provider,modernjs-ssr-data-fetch-provider-csr,modernjs-ssr-data-fetch-host", "app:modern:dev": "NX_TUI=false nx run-many --target=serve --parallel=10 --configuration=development -p modernjs-ssr-dynamic-nested-remote,modernjs-ssr-dynamic-remote,modernjs-ssr-dynamic-remote-new-version,modernjs-ssr-host,modernjs-ssr-nested-remote,modernjs-ssr-remote,modernjs-ssr-remote-new-version", "commitlint": "commitlint --edit", "prepare": "husky install", diff --git a/packages/dts-plugin/src/plugins/DtsPlugin.ts b/packages/dts-plugin/src/plugins/DtsPlugin.ts index d5bda6e0101..908f5b2ee33 100644 --- a/packages/dts-plugin/src/plugins/DtsPlugin.ts +++ b/packages/dts-plugin/src/plugins/DtsPlugin.ts @@ -35,6 +35,16 @@ export const normalizeDtsOptions = ( )(options.dts); }; +const excludeDts = (filepath: unknown) => { + if (typeof filepath !== 'string') { + return false; + } + const [_p, query] = filepath.split('?'); + if (query && query.startsWith('exclude-mf-dts')) { + return true; + } + return false; +}; export class DtsPlugin implements WebpackPluginInstance { options: moduleFederationPlugin.ModuleFederationPluginOptions; clonedOptions: moduleFederationPlugin.ModuleFederationPluginOptions; @@ -52,8 +62,19 @@ export class DtsPlugin implements WebpackPluginInstance { const cleanedExposes: Record = {}; Object.entries(options.exposes).forEach(([key, value]) => { if (typeof value === 'string') { - cleanedExposes[key] = value.split('?')[0]; + const [filepath, _query] = value.split('?'); + if (excludeDts(value)) { + return; + } + cleanedExposes[key] = filepath; } else { + if ( + typeof value === 'object' && + Array.isArray(value.import) && + value.import.some((v) => excludeDts(v)) + ) { + return; + } cleanedExposes[key] = value; } }); diff --git a/packages/managers/src/ContainerManager.ts b/packages/managers/src/ContainerManager.ts index b97bc041299..7226f395ae7 100644 --- a/packages/managers/src/ContainerManager.ts +++ b/packages/managers/src/ContainerManager.ts @@ -67,6 +67,28 @@ class ContainerManager extends BasicPluginOptionsManager { './src/Button' : ['.','./backup'] } + get fileExposeKeyMap(): Record> { + const parsedOptions = this._parseOptions(); + + return parsedOptions.reduce( + (sum, item) => { + const [exposeKey, exposeObject] = item; + exposeObject.import.forEach((exposeFile) => { + const exposeFileWithoutExt = exposeFile.replace( + path.extname(exposeFile), + '', + ); + sum[exposeFileWithoutExt] ||= new Set(); + sum[exposeFileWithoutExt].add(exposeKey); + }); + + return sum; + }, + {} as Record>, + ); + } // { '.' : './src/Button.jsx' } => { '__federation_expose_Component' : ['src/Buttton'] } get exposeFileNameImportMap(): Record { const { exposes } = this.options; diff --git a/packages/manifest/src/ModuleHandler.ts b/packages/manifest/src/ModuleHandler.ts index 00c08742a49..405740fcf1f 100644 --- a/packages/manifest/src/ModuleHandler.ts +++ b/packages/manifest/src/ModuleHandler.ts @@ -3,6 +3,7 @@ import { StatsRemote, StatsRemoteVal, StatsShared, + composeKeyWithSeparator, moduleFederationPlugin, } from '@module-federation/sdk'; import type { StatsModule } from 'webpack'; @@ -14,6 +15,9 @@ type ShareMap = { [sharedKey: string]: StatsShared }; type ExposeMap = { [exposeImportValue: string]: StatsExpose }; type RemotesConsumerMap = { [remoteKey: string]: StatsRemote }; +export const getExposeName = (exposeKey: string) => { + return exposeKey.replace('./', ''); +}; export function getExposeItem({ exposeKey, name, @@ -23,11 +27,11 @@ export function getExposeItem({ name: string; file: { import: string[] }; }): StatsExpose { - const exposeModuleName = exposeKey.replace('./', ''); + const exposeModuleName = getExposeName(exposeKey); return { path: exposeKey, - id: `${name}:${exposeModuleName}`, + id: composeKeyWithSeparator(name, exposeModuleName), name: exposeModuleName, // @ts-ignore to deduplicate requires: new Set(), diff --git a/packages/manifest/src/StatsManager.ts b/packages/manifest/src/StatsManager.ts index 964eb869422..98fe5bfda11 100644 --- a/packages/manifest/src/StatsManager.ts +++ b/packages/manifest/src/StatsManager.ts @@ -14,14 +14,9 @@ import { RemoteEntryType, encodeName, MFPrefetchCommon, + composeKeyWithSeparator, } from '@module-federation/sdk'; -import { - Compilation, - Compiler, - StatsCompilation, - StatsModule, - Chunk, -} from 'webpack'; +import { Compilation, Compiler, StatsCompilation, StatsModule } from 'webpack'; import { isDev, getAssetsByChunk, @@ -42,7 +37,7 @@ import { utils, } from '@module-federation/managers'; import { HOT_UPDATE_SUFFIX } from './constants'; -import { ModuleHandler, getExposeItem } from './ModuleHandler'; +import { ModuleHandler, getExposeItem, getExposeName } from './ModuleHandler'; import { StatsInfo } from './types'; class StatsManager { @@ -425,7 +420,46 @@ class StatsManager { }); return sum; }, new Set()); - stats.exposes = Object.values(exposesMap).map((expose) => { + const { fileExposeKeyMap } = this._containerManager; + + stats.exposes = []; + Object.entries(fileExposeKeyMap).forEach( + ([exposeFileWithoutExt, exposeKeySet]) => { + const expose = exposesMap[exposeFileWithoutExt] || { + assets: { + js: { sync: [], async: [] }, + css: { sync: [], async: [] }, + }, + }; + exposeKeySet.forEach((exposeKey) => { + const { js, css } = expose.assets; + const exposeModuleName = getExposeName(exposeKey); + stats.exposes.push({ + ...expose, + path: exposeKey, + id: composeKeyWithSeparator( + this._options.name!, + exposeModuleName, + ), + name: exposeModuleName, + assets: { + js: { + sync: js.sync.filter((asset) => !sharedAssets.has(asset)), + async: js.async.filter((asset) => !sharedAssets.has(asset)), + }, + css: { + sync: css.sync.filter((asset) => !sharedAssets.has(asset)), + async: css.async.filter( + (asset) => !sharedAssets.has(asset), + ), + }, + }, + }); + }); + }, + ); + + Object.values(exposesMap).map((expose) => { const { js, css } = expose.assets; return { ...expose, diff --git a/packages/modernjs/package.json b/packages/modernjs/package.json index 288e1ba22df..88cf4bdc8f7 100644 --- a/packages/modernjs/package.json +++ b/packages/modernjs/package.json @@ -27,9 +27,13 @@ "types": "./dist/types/runtime/index.d.ts", "default": "./dist/esm/runtime/index.js" }, - "./ssr-runtime": { - "types": "./dist/types/ssr-runtime/index.d.ts", - "default": "./dist/esm/ssr-runtime/index.js" + "./ssr-dev-plugin": { + "types": "./dist/types/ssr-runtime/devPlugin.d.ts", + "default": "./dist/esm/ssr-runtime/devPlugin.js" + }, + "./ssr-inject-data-fetch-function-plugin": { + "types": "./dist/types/ssr-runtime/injectDataFetchFunctionPlugin.d.ts", + "default": "./dist/esm/ssr-runtime/injectDataFetchFunctionPlugin.js" }, "./config-plugin": { "types": "./dist/types/cli/configPlugin.d.ts", @@ -51,11 +55,20 @@ "import": "./dist/esm/cli/mfRuntimePlugins/resolve-entry-ipv4.js", "require": "./dist/esm/cli/mfRuntimePlugins/resolve-entry-ipv4.js" }, + "./auto-fetch-data": { + "types": "./dist/types/cli/mfRuntimePlugins/auto-fetch-data.d.ts", + "import": "./dist/esm/cli/mfRuntimePlugins/auto-fetch-data.js", + "require": "./dist/esm/cli/mfRuntimePlugins/auto-fetch-data.js" + }, "./inject-node-fetch": { "types": "./dist/types/cli/mfRuntimePlugins/inject-node-fetch.d.ts", "import": "./dist/esm/cli/mfRuntimePlugins/inject-node-fetch.js", "require": "./dist/esm/cli/mfRuntimePlugins/inject-node-fetch.js" }, + "./data-fetch-server-plugin": { + "types": "./dist/types/cli/server/data-fetch-server-plugin.d.ts", + "default": "./dist/cjs/cli/server/data-fetch-server-plugin.js" + }, "./server": { "types": "./dist/types/server/index.d.ts", "default": "./dist/cjs/server/index.js" @@ -81,9 +94,18 @@ "resolve-entry-ipv4": [ "./dist/types/cli/mfRuntimePlugins/resolve-entry-ipv4.d.ts" ], + "auto-fetch-data": [ + "./dist/types/cli/mfRuntimePlugins/auto-fetch-data.d.ts" + ], "inject-node-fetch": [ "./dist/types/cli/mfRuntimePlugins/inject-node-fetch.d.ts" ], + "data-fetch-server-plugin": [ + "./dist/types/cli/server/data-fetch-server-plugin.d.ts" + ], + "ssr-inject-data-fetch-function-plugin": [ + "./dist/types/ssr-runtime/injectDataFetchFunctionPlugin.d.ts" + ], "server": [ "./dist/types/server/index.d.ts" ] @@ -94,11 +116,13 @@ "author": "hanric ", "license": "MIT", "dependencies": { + "@modern-js/utils": "2.67.5", "@modern-js/node-bundle-require": "2.67.6", "@module-federation/rsbuild-plugin": "workspace:*", "fs-extra": "11.3.0", "lru-cache": "10.4.3", "@module-federation/enhanced": "workspace:*", + "@module-federation/runtime": "workspace:*", "@module-federation/node": "workspace:*", "@module-federation/sdk": "workspace:*", "@module-federation/cli": "workspace:*", @@ -107,13 +131,14 @@ "react-error-boundary": "4.1.2" }, "devDependencies": { + "@module-federation/manifest": "workspace:*", + "@modern-js/core": "2.67.5", "@rsbuild/core": "1.3.21", "@modern-js/app-tools": "2.67.6", "@modern-js/server-runtime": "2.67.6", "@modern-js/module-tools": "2.67.6", "@modern-js/runtime": "2.67.6", - "@modern-js/tsconfig": "2.67.6", - "@module-federation/manifest": "workspace:*" + "@modern-js/tsconfig": "2.67.6" }, "peerDependencies": { "react": ">=17", diff --git a/packages/modernjs/src/cli/configPlugin.spec.ts b/packages/modernjs/src/cli/configPlugin.spec.ts index 5eddc30c40a..732b608ea07 100644 --- a/packages/modernjs/src/cli/configPlugin.spec.ts +++ b/packages/modernjs/src/cli/configPlugin.spec.ts @@ -34,6 +34,7 @@ describe('patchMFConfig', async () => { remoteType: 'script', runtimePlugins: [ require.resolve('@module-federation/modern-js/shared-strategy'), + require.resolve('@module-federation/modern-js/auto-fetch-data'), require.resolve('@module-federation/node/runtimePlugin'), require.resolve('@module-federation/modern-js/inject-node-fetch'), ], @@ -64,6 +65,7 @@ describe('patchMFConfig', async () => { remoteType: 'script', runtimePlugins: [ require.resolve('@module-federation/modern-js/shared-strategy'), + require.resolve('@module-federation/modern-js/auto-fetch-data'), ], shared: { react: { diff --git a/packages/modernjs/src/cli/configPlugin.ts b/packages/modernjs/src/cli/configPlugin.ts index 18b7e1e93bc..f6ffb0bdec9 100644 --- a/packages/modernjs/src/cli/configPlugin.ts +++ b/packages/modernjs/src/cli/configPlugin.ts @@ -4,8 +4,12 @@ import { moduleFederationPlugin, encodeName } from '@module-federation/sdk'; import { bundle } from '@modern-js/node-bundle-require'; import { PluginOptions } from '../types'; import { LOCALHOST, PLUGIN_IDENTIFIER } from '../constant'; -import { autoDeleteSplitChunkCacheGroups } from '@module-federation/rsbuild-plugin/utils'; -import logger from './logger'; +import { + autoDeleteSplitChunkCacheGroups, + addDataFetchExposes, +} from '@module-federation/rsbuild-plugin/utils'; +import logger from '../logger'; +import { isDev } from './utils'; import type { InternalModernPluginOptions } from '../types'; import type { @@ -19,7 +23,6 @@ import type { import type { BundlerChainConfig } from '../interfaces/bundler'; const defaultPath = path.resolve(process.cwd(), 'module-federation.config.ts'); -const isDev = process.env.NODE_ENV === 'development'; export type ConfigType = T extends 'webpack' ? webpack.Configuration @@ -147,12 +150,16 @@ export const patchMFConfig = ( enableSSR?: boolean, ) => { replaceRemoteUrl(mfConfig, remoteIpStrategy); + addDataFetchExposes(mfConfig.exposes, isServer); + if (mfConfig.remoteType === undefined) { mfConfig.remoteType = 'script'; } + if (!mfConfig.name) { throw new Error(`${PLUGIN_IDENTIFIER} mfConfig.name can not be empty!`); } + const runtimePlugins = [...(mfConfig.runtimePlugins || [])]; patchDTSConfig(mfConfig, isServer); @@ -162,7 +169,12 @@ export const patchMFConfig = ( runtimePlugins, ); - if (enableSSR && isDev) { + injectRuntimePlugins( + require.resolve('@module-federation/modern-js/auto-fetch-data'), + runtimePlugins, + ); + + if (enableSSR && isDev()) { injectRuntimePlugins( require.resolve('@module-federation/modern-js/resolve-entry-ipv4'), runtimePlugins, @@ -174,7 +186,7 @@ export const patchMFConfig = ( require.resolve('@module-federation/node/runtimePlugin'), runtimePlugins, ); - if (isDev) { + if (isDev()) { injectRuntimePlugins( require.resolve( '@module-federation/node/record-dynamic-remote-entry-hash-plugin', @@ -325,7 +337,7 @@ export function patchBundlerConfig(options: { ); } - if (isDev && chain.output.get('publicPath') === 'auto') { + if (isDev() && chain.output.get('publicPath') === 'auto') { // TODO: only in dev temp const port = modernjsConfig.dev?.port || modernjsConfig.server?.port || 8080; @@ -346,7 +358,7 @@ export function patchBundlerConfig(options: { } } // modernjs project has the same entry for server/client, add polyfill:false to skip compile error in browser target - if (isDev && enableSSR && !isServer) { + if (isDev() && enableSSR && !isServer) { chain.resolve.fallback .set('crypto', false) .set('stream', false) @@ -454,7 +466,7 @@ export const moduleFederationConfigPlugin = ( const defineConfig = { REMOTE_IP_STRATEGY: JSON.stringify(userConfig.remoteIpStrategy), }; - if (enableSSR && isDev) { + if (enableSSR && isDev()) { defineConfig['FEDERATION_IPV4'] = JSON.stringify(ipv4); } return { diff --git a/packages/modernjs/src/cli/constant.ts b/packages/modernjs/src/cli/constant.ts deleted file mode 100644 index 0bd4ecf30c4..00000000000 --- a/packages/modernjs/src/cli/constant.ts +++ /dev/null @@ -1 +0,0 @@ -export const isDev = process.env.NODE_ENV === 'development'; diff --git a/packages/modernjs/src/cli/index.ts b/packages/modernjs/src/cli/index.ts index d26d82314c7..62de6e9cf28 100644 --- a/packages/modernjs/src/cli/index.ts +++ b/packages/modernjs/src/cli/index.ts @@ -22,6 +22,7 @@ export const moduleFederationPlugin = ( originPluginOptions: userConfig, remoteIpStrategy: userConfig?.remoteIpStrategy, userConfig: userConfig || {}, + fetchServerQuery: userConfig.fetchServerQuery ?? undefined, }; return { name: '@modern-js/plugin-module-federation', @@ -86,3 +87,5 @@ export const moduleFederationPlugin = ( export default moduleFederationPlugin; export { createModuleFederationConfig } from '@module-federation/enhanced'; + +export type { FederationRuntimePlugin } from '@module-federation/enhanced/runtime'; diff --git a/packages/modernjs/src/cli/mfRuntimePlugins/auto-fetch-data.ts b/packages/modernjs/src/cli/mfRuntimePlugins/auto-fetch-data.ts new file mode 100644 index 00000000000..8f28f58f0cb --- /dev/null +++ b/packages/modernjs/src/cli/mfRuntimePlugins/auto-fetch-data.ts @@ -0,0 +1,104 @@ +import { + getDataFetchInfo, + initDataFetchMap, + getDataFetchItem, + getDataFetchMap, + isCSROnly, +} from '../../utils'; +import logger from '../../logger'; +import { + getDataFetchMapKey, + isDataLoaderExpose, + loadDataFetchModule, +} from '../../utils/dataFetch'; +import { MF_DATA_FETCH_TYPE, MF_DATA_FETCH_STATUS } from '../../constant'; +import { DATA_FETCH_CLIENT_SUFFIX } from '@module-federation/rsbuild-plugin/constant'; + +import type { MF_DATA_FETCH_MAP_VALUE } from '../../interfaces/global'; +import type { FederationRuntimePlugin } from '@module-federation/enhanced/runtime'; + +const autoFetchData: () => FederationRuntimePlugin = () => ({ + name: 'auto-fetch-data-plugin', + beforeInit(args) { + initDataFetchMap(); + return args; + }, + afterLoadSnapshot(args) { + const { id, moduleInfo, remoteSnapshot, host } = args; + if (typeof id === 'string' && isDataLoaderExpose(id)) { + return args; + } + if (!remoteSnapshot || !id || !('modules' in remoteSnapshot)) { + return args; + } + + const { name, alias } = moduleInfo; + const dataFetchInfo = getDataFetchInfo({ + name, + alias, + id, + remoteSnapshot, + }); + if (!dataFetchInfo) { + return args; + } + const { dataFetchId, dataFetchName } = dataFetchInfo; + + const dataFetchMapKey = getDataFetchMapKey(dataFetchInfo, { + name: host.name, + version: host.options.version, + }); + logger.debug( + '======= auto fetch plugin dataFetchMapKey: ', + dataFetchMapKey, + ); + + if (!dataFetchMapKey) { + return args; + } + + const dataFetchItem = getDataFetchItem(dataFetchMapKey); + if (dataFetchItem) { + return args; + } + + const dataFetchMap = getDataFetchMap(); + const downgradeType = remoteSnapshot.modules.find( + (module) => + module.moduleName === `${dataFetchName}${DATA_FETCH_CLIENT_SUFFIX}`, + ) + ? MF_DATA_FETCH_TYPE.FETCH_CLIENT + : MF_DATA_FETCH_TYPE.FETCH_SERVER; + let finalDataFetchId = dataFetchId; + + if (typeof window !== 'undefined') { + finalDataFetchId = + downgradeType === MF_DATA_FETCH_TYPE.FETCH_CLIENT + ? `${dataFetchId}${DATA_FETCH_CLIENT_SUFFIX}` + : dataFetchId; + } + + const getDataFetchGetter = () => + loadDataFetchModule(host, finalDataFetchId); + + const dataFetchFnItem: MF_DATA_FETCH_MAP_VALUE[0] = [ + getDataFetchGetter, + downgradeType, + ]; + + // server client must execute + if (typeof window === 'undefined' || isCSROnly()) { + dataFetchFnItem.push(getDataFetchGetter()); + } + + dataFetchMap[dataFetchMapKey] = [ + dataFetchFnItem, + undefined, + MF_DATA_FETCH_STATUS.AWAIT, + ]; + + return args; + }, +}); + +export default autoFetchData; diff --git a/packages/modernjs/src/cli/server/data-fetch-server-plugin.ts b/packages/modernjs/src/cli/server/data-fetch-server-plugin.ts new file mode 100644 index 00000000000..138321e6168 --- /dev/null +++ b/packages/modernjs/src/cli/server/data-fetch-server-plugin.ts @@ -0,0 +1,207 @@ +import { DATA_FETCH_QUERY, MF_DATA_FETCH_STATUS } from '../../constant'; +import logger from '../../logger'; +import { getDataFetchMap } from '../../utils'; +import { + fetchData, + initDataFetchMap, + loadDataFetchModule, +} from '../../utils/dataFetch'; +import { SEPARATOR, MANIFEST_EXT } from '@module-federation/sdk'; +import type { + MiddlewareHandler, + ServerPlugin, +} from '@modern-js/server-runtime'; +import type { NoSSRRemoteInfo } from '../../interfaces/global'; + +function wrapSetTimeout( + targetPromise: Promise, + delay = 20000, + id: string, +) { + if (targetPromise && typeof targetPromise.then === 'function') { + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + logger.warn(`Data fetch for ID ${id} timed out after 20 seconds.`); + reject(new Error(`Data fetch for ID ${id} timed out after 20 seconds`)); + }, delay); + + targetPromise + .then((value: any) => { + clearTimeout(timeoutId); + resolve(value); + }) + .catch((err: any) => { + clearTimeout(timeoutId); + reject(err); + }); + }); + } +} + +function addProtocol(url: string) { + if (url.startsWith('//')) { + return 'https:' + url; + } + return url; +} + +const getDecodeQuery = (url: URL, name: string) => { + const res = url.searchParams.get(name); + if (!res) { + return null; + } + return decodeURIComponent(res); +}; + +const middleware: MiddlewareHandler = async (ctx, next) => { + let url: URL; + let dataFetchId: string | null; + let params: Record; + let remoteInfo: NoSSRRemoteInfo; + try { + url = new URL(ctx.req.url); + dataFetchId = getDecodeQuery(url, DATA_FETCH_QUERY); + params = JSON.parse(getDecodeQuery(url, 'params') || '{}'); + const remoteInfoQuery = getDecodeQuery(url, 'remoteInfo'); + remoteInfo = remoteInfoQuery ? JSON.parse(remoteInfoQuery) : null; + } catch (e) { + logger.error('fetch data from server, error: ', e); + return next(); + } + + if (!dataFetchId) { + return next(); + } + logger.log('fetch data from server, dataFetchId: ', dataFetchId); + logger.debug( + 'fetch data from server, moduleInfo: ', + globalThis.__FEDERATION__?.moduleInfo, + ); + try { + const dataFetchMap = getDataFetchMap(); + if (!dataFetchMap) { + initDataFetchMap(); + } + const fetchDataPromise = dataFetchMap[dataFetchId]?.[1]; + logger.debug( + 'fetch data from server, fetchDataPromise: ', + fetchDataPromise, + ); + if ( + fetchDataPromise && + dataFetchMap[dataFetchId]?.[2] !== MF_DATA_FETCH_STATUS.ERROR + ) { + const targetPromise = fetchDataPromise[0]; + // Ensure targetPromise is thenable + const wrappedPromise = wrapSetTimeout(targetPromise, 20000, dataFetchId); + if (wrappedPromise) { + const res = await wrappedPromise; + logger.log('fetch data from server, fetchDataPromise res: ', res); + return ctx.json(res); + } + logger.error( + `Expected a Promise from fetchDataPromise[0] for dataFetchId ${dataFetchId}, but received:`, + targetPromise, + 'Will try call new dataFetch again...', + ); + } + + if (remoteInfo) { + try { + const hostInstance = globalThis.__FEDERATION__.__INSTANCES__[0]; + const remoteEntry = `${addProtocol(remoteInfo.ssrPublicPath) + remoteInfo.ssrRemoteEntry}`; + if (!hostInstance) { + throw new Error('host instance not found!'); + } + const remote = hostInstance.options.remotes.find( + (remote) => remote.name === remoteInfo.name, + ); + logger.debug('find remote: ', JSON.stringify(remote)); + if (!remote) { + hostInstance.registerRemotes([ + { + name: remoteInfo.name, + entry: remoteEntry, + entryGlobalName: remoteInfo.globalName, + }, + ]); + } else if ( + !('entry' in remote) || + !remote.entry.includes(MANIFEST_EXT) + ) { + const { hostGlobalSnapshot, remoteSnapshot } = + hostInstance.snapshotHandler.getGlobalRemoteInfo(remoteInfo); + logger.debug( + 'find hostGlobalSnapshot: ', + JSON.stringify(hostGlobalSnapshot), + ); + logger.debug('find remoteSnapshot: ', JSON.stringify(remoteSnapshot)); + + if (!hostGlobalSnapshot || !remoteSnapshot) { + if ('version' in remote) { + // @ts-ignore + delete remote.version; + } + // @ts-ignore + remote.entry = remoteEntry; + remote.entryGlobalName = remoteInfo.globalName; + } + } + } catch (e) { + ctx.status(500); + return ctx.text( + `failed to fetch ${remoteInfo.name} data, error:\n ${e}`, + ); + } + } + + const dataFetchItem = dataFetchMap[dataFetchId]; + logger.debug('fetch data from server, dataFetchItem: ', dataFetchItem); + if (dataFetchItem) { + const callFetchDataPromise = fetchData(dataFetchId, { + ...params, + isDowngrade: !remoteInfo, + }); + const wrappedPromise = wrapSetTimeout( + callFetchDataPromise, + 20000, + dataFetchId, + ); + if (wrappedPromise) { + const res = await wrappedPromise; + logger.log('fetch data from server, dataFetchItem res: ', res); + return ctx.json(res); + } + } + + const remoteId = dataFetchId.split(SEPARATOR)[0]; + const hostInstance = globalThis.__FEDERATION__.__INSTANCES__[0]; + if (!hostInstance) { + throw new Error('host instance not found!'); + } + const dataFetchFn = await loadDataFetchModule(hostInstance, remoteId); + const data = await dataFetchFn({ ...params, isDowngrade: !remoteInfo }); + logger.log('fetch data from server, loadDataFetchModule res: ', data); + return ctx.json(data); + } catch (e) { + logger.error('server plugin data fetch error: ', e); + ctx.status(500); + return ctx.text(`failed to fetch ${remoteInfo.name} data, error:\n ${e}`); + } +}; + +const dataFetchServePlugin = (): ServerPlugin => ({ + name: 'mf-data-fetch-server-plugin', + setup: (api) => { + api.onPrepare(() => { + const { middlewares } = api.getServerContext(); + middlewares.push({ + name: 'module-federation-serve-manifest', + // @ts-ignore type error + handler: middleware, + }); + }); + }, +}); + +export default dataFetchServePlugin; diff --git a/packages/modernjs/src/cli/ssrPlugin.ts b/packages/modernjs/src/cli/ssrPlugin.ts index 482b6c105ad..7b65c6d4011 100644 --- a/packages/modernjs/src/cli/ssrPlugin.ts +++ b/packages/modernjs/src/cli/ssrPlugin.ts @@ -3,9 +3,9 @@ import fs from 'fs-extra'; import { ModuleFederationPlugin } from '@module-federation/enhanced/webpack'; import { ModuleFederationPlugin as RspackModuleFederationPlugin } from '@module-federation/enhanced/rspack'; import UniverseEntryChunkTrackerPlugin from '@module-federation/node/universe-entry-chunk-tracker-plugin'; +import logger from '../logger'; +import { isDev } from './utils'; import { updateStatsAndManifest } from '@module-federation/rsbuild-plugin/manifest'; -import { isDev } from './constant'; -import logger from './logger'; import { isWebTarget, skipByTarget } from './utils'; import type { @@ -108,16 +108,36 @@ export const moduleFederationSSRPlugin = ( setEnv(); api._internalRuntimePlugins(({ entrypoint, plugins }) => { - if (!isDev) { + const { fetchServerQuery } = pluginOptions; + plugins.push({ + name: 'injectDataFetchFunction', + path: '@module-federation/modern-js/ssr-inject-data-fetch-function-plugin', + config: { + fetchServerQuery, + }, + }); + if (!isDev()) { return { entrypoint, plugins }; } plugins.push({ - name: 'mfSSR', - path: '@module-federation/modern-js/ssr-runtime', + name: 'mfSSRDev', + path: '@module-federation/modern-js/ssr-dev-plugin', config: {}, }); return { entrypoint, plugins }; }); + + if (pluginOptions.ssrConfig.remotes) { + api._internalServerPlugins(({ plugins }) => { + plugins.push({ + name: '@module-federation/modern-js/data-fetch-server-plugin', + options: {}, + }); + + return { plugins }; + }); + } + api.modifyBundlerChain((chain) => { const target = chain.get('target'); if (skipByTarget(target)) { @@ -146,7 +166,7 @@ export const moduleFederationSSRPlugin = ( if (!isWeb) { chain.target('async-node'); - if (isDev) { + if (isDev()) { chain .plugin('UniverseEntryChunkTrackerPlugin') .use(UniverseEntryChunkTrackerPlugin); @@ -164,7 +184,7 @@ export const moduleFederationSSRPlugin = ( } } - if (isDev && isWeb) { + if (isDev() && isWeb) { chain.externals({ '@module-federation/node/utils': 'NOT_USED_IN_BROWSER', }); @@ -213,6 +233,7 @@ export const moduleFederationSSRPlugin = ( updateStatsAndManifest(nodePlugin, browserPlugin, distOutputDir); }); api.onDevCompileDone(() => { + // 热更后修改 manifest const { nodePlugin, browserPlugin, distOutputDir } = pluginOptions; updateStatsAndManifest(nodePlugin, browserPlugin, distOutputDir); }); diff --git a/packages/modernjs/src/cli/utils.ts b/packages/modernjs/src/cli/utils.ts index d8e79b81814..6a97f7fb4f3 100644 --- a/packages/modernjs/src/cli/utils.ts +++ b/packages/modernjs/src/cli/utils.ts @@ -55,3 +55,7 @@ export const skipByTarget = (target: string[] | string) => { } return false; }; + +export function isDev() { + return process.env.NODE_ENV === 'development'; +} diff --git a/packages/modernjs/src/constant.ts b/packages/modernjs/src/constant.ts index 8b547453196..149c3b4c80a 100644 --- a/packages/modernjs/src/constant.ts +++ b/packages/modernjs/src/constant.ts @@ -1,2 +1,28 @@ export const LOCALHOST = 'localhost'; export const PLUGIN_IDENTIFIER = '[ Modern.js Module Federation ]'; +export const DATA_FETCH_QUERY = 'x-mf-data-fetch'; +export const DATA_FETCH_ERROR_PREFIX = + 'caught the following error during dataFetch: '; +export const LOAD_REMOTE_ERROR_PREFIX = + 'caught the following error during loadRemote: '; +export const DOWNGRADE_KEY = '_mfSSRDowngrade'; +export const DATA_FETCH_MAP_KEY = '__MF_DATA_FETCH_MAP__'; +export const DATA_FETCH_FUNCTION = '_mfDataFetch'; +export const FS_HREF = '_mfFSHref'; +export const ERROR_TYPE = { + DATA_FETCH: 1, + LOAD_REMOTE: 2, + UNKNOWN: 3, +}; +export const WRAP_DATA_FETCH_ID_IDENTIFIER = 'wrap_dfip_identifier'; +export const enum MF_DATA_FETCH_TYPE { + FETCH_SERVER = 1, + FETCH_CLIENT = 2, +} + +export const enum MF_DATA_FETCH_STATUS { + LOADED = 1, + LOADING = 2, + AWAIT = 0, + ERROR = 3, +} diff --git a/packages/modernjs/src/interfaces/global.ts b/packages/modernjs/src/interfaces/global.ts new file mode 100644 index 00000000000..6459ce70df5 --- /dev/null +++ b/packages/modernjs/src/interfaces/global.ts @@ -0,0 +1,28 @@ +import { MF_DATA_FETCH_TYPE, MF_DATA_FETCH_STATUS } from '../constant'; + +export type DataFetchParams = { + isDowngrade: boolean; +} & Record; +export type DataFetch = (params: DataFetchParams) => Promise; +export type MF_DATA_FETCH_MAP_VALUE = [ + [ + // getDataFetchGetter + () => Promise>, + MF_DATA_FETCH_TYPE, + // getDataFetchPromise + Promise>?, + ], + // loading, resolve, reject + [Promise, ((data: unknown) => void)?, ((err: unknown) => void)?]?, + MF_DATA_FETCH_STATUS?, +]; +export type MF_DATA_FETCH_MAP = Record; +export type MF_SSR_DOWNGRADE = string[] | true | undefined; + +export type NoSSRRemoteInfo = { + name: string; + version: string; + ssrPublicPath: string; + ssrRemoteEntry: string; + globalName: string; +}; diff --git a/packages/modernjs/src/cli/logger.ts b/packages/modernjs/src/logger.ts similarity index 72% rename from packages/modernjs/src/cli/logger.ts rename to packages/modernjs/src/logger.ts index 00d9f8b0e2d..c1be3252163 100644 --- a/packages/modernjs/src/cli/logger.ts +++ b/packages/modernjs/src/logger.ts @@ -1,5 +1,5 @@ import { createLogger } from '@module-federation/sdk'; -import { PLUGIN_IDENTIFIER } from '../constant'; +import { PLUGIN_IDENTIFIER } from './constant'; const logger = createLogger(PLUGIN_IDENTIFIER); diff --git a/packages/modernjs/src/runtime/AwaitDataFetch.tsx b/packages/modernjs/src/runtime/AwaitDataFetch.tsx new file mode 100644 index 00000000000..821b05154c5 --- /dev/null +++ b/packages/modernjs/src/runtime/AwaitDataFetch.tsx @@ -0,0 +1,176 @@ +import React, { MutableRefObject, ReactNode, Suspense, useRef } from 'react'; +import logger from '../logger'; +import { + DATA_FETCH_ERROR_PREFIX, + LOAD_REMOTE_ERROR_PREFIX, + ERROR_TYPE, + DOWNGRADE_KEY, + DATA_FETCH_FUNCTION, +} from '../constant'; +import { getDataFetchIdWithErrorMsgs, wrapDataFetchId } from '../utils'; +import type { DataFetchParams } from '../interfaces/global'; + +function isPromise(obj: any): obj is PromiseLike { + return ( + !!obj && + (typeof obj === 'object' || typeof obj === 'function') && + typeof obj.then === 'function' + ); +} +const AWAIT_ERROR_PREFIX = + ' caught the following error during render: '; + +export type ErrorInfo = { + error: Error; + errorType: number; + dataFetchMapKey?: string; +}; + +export const transformError = (err: string | Error): ErrorInfo => { + const errMsg = err instanceof Error ? err.message : err; + const originalMsg = errMsg.replace(AWAIT_ERROR_PREFIX, ''); + const dataFetchMapKey = getDataFetchIdWithErrorMsgs(originalMsg); + if (originalMsg.indexOf(DATA_FETCH_ERROR_PREFIX) === 0) { + return { + error: new Error( + originalMsg + .replace(DATA_FETCH_ERROR_PREFIX, '') + .replace(wrapDataFetchId(dataFetchMapKey), ''), + ), + errorType: ERROR_TYPE.DATA_FETCH, + dataFetchMapKey, + }; + } + if (originalMsg.indexOf(LOAD_REMOTE_ERROR_PREFIX) === 0) { + return { + error: new Error( + originalMsg + .replace(LOAD_REMOTE_ERROR_PREFIX, '') + .replace(wrapDataFetchId(dataFetchMapKey), ''), + ), + errorType: ERROR_TYPE.LOAD_REMOTE, + dataFetchMapKey, + }; + } + + return { + error: new Error(originalMsg.replace(wrapDataFetchId(dataFetchMapKey), '')), + errorType: ERROR_TYPE.UNKNOWN, + dataFetchMapKey, + }; +}; + +export interface AwaitProps { + resolve: T | Promise; + loading?: ReactNode; + errorElement?: ReactNode | ((errorInfo: ErrorInfo) => ReactNode); + children: (data: T) => ReactNode; + params?: DataFetchParams; +} + +export interface AwaitErrorHandlerProps + extends Omit, 'resolve'> { + resolve: () => T | string; +} + +const DefaultLoading = <>; +const DefaultErrorElement = (_data: any) =>
Error
; + +export function AwaitDataFetch({ + resolve, + loading = DefaultLoading, + errorElement = DefaultErrorElement, + children, + params, +}: AwaitProps) { + const dataRef = useRef(); + const data = dataRef.current || resolve; + const getData = isPromise(data) ? fetchData(data, dataRef) : () => data; + + return ( + + {children} + + ); +} + +function AwaitSuspense({ + resolve, + children, + loading = DefaultLoading, + errorElement = DefaultErrorElement, +}: AwaitErrorHandlerProps) { + return ( + + + {children} + + + ); +} + +function ResolveAwait({ + children, + resolve, + errorElement, + params, +}: AwaitErrorHandlerProps) { + const data = resolve(); + logger.debug('resolve data: ', data); + if (typeof data === 'string' && data.indexOf(AWAIT_ERROR_PREFIX) === 0) { + const transformedError = transformError(data); + return ( + <> + {typeof errorElement === 'function' ? ( + <> + {globalThis.FEDERATION_SSR && ( + + )} + {errorElement(transformedError)} + + ) : ( + errorElement + )} + + ); + } + const toRender = + typeof children === 'function' ? children(data as T) : children; + return <>{toRender}; +} + +// return string when promise is rejected +const fetchData = (promise: Promise, ref: MutableRefObject) => { + let data: T | string; + let status: 'pending' | 'success' = 'pending'; + const suspender = promise + .then((res) => { + status = 'success'; + data = res; + ref.current = res; + }) + .catch((e) => { + status = 'success'; + console.warn(e); + data = AWAIT_ERROR_PREFIX + e; + }); + return () => { + if (status === 'pending') { + throw suspender; + } + return data; + }; +}; diff --git a/packages/modernjs/src/runtime/createRemoteComponent.tsx b/packages/modernjs/src/runtime/createRemoteComponent.tsx new file mode 100644 index 00000000000..a9075463748 --- /dev/null +++ b/packages/modernjs/src/runtime/createRemoteComponent.tsx @@ -0,0 +1,395 @@ +import React, { ReactNode, useEffect, useState } from 'react'; +import logger from '../logger'; +import { getInstance } from '@module-federation/enhanced/runtime'; +import { AwaitDataFetch, transformError } from './AwaitDataFetch'; +import { + fetchData, + getDataFetchItem, + getDataFetchMapKey, +} from '../utils/dataFetch'; +import { + getDataFetchInfo, + getLoadedRemoteInfos, + setDataFetchItemLoadedStatus, + wrapDataFetchId, +} from '../utils'; +import { + DATA_FETCH_ERROR_PREFIX, + DATA_FETCH_FUNCTION, + FS_HREF, + LOAD_REMOTE_ERROR_PREFIX, + MF_DATA_FETCH_TYPE, +} from '../constant'; +import type { ErrorInfo } from './AwaitDataFetch'; +import type { DataFetchParams, NoSSRRemoteInfo } from '../interfaces/global'; + +type IProps = { + id: string; + injectScript?: boolean; + injectLink?: boolean; +}; + +export type CreateRemoteComponentOptions = { + loader: () => Promise; + loading: React.ReactNode; + fallback: ReactNode | ((errorInfo: ErrorInfo) => ReactNode); + export?: E; + dataFetchParams?: DataFetchParams; + noSSR?: boolean; +}; + +type ReactKey = { key?: React.Key | null }; + +function getTargetModuleInfo(id: string) { + const instance = getInstance(); + if (!instance) { + return; + } + const loadedRemoteInfo = getLoadedRemoteInfos(id, instance); + if (!loadedRemoteInfo) { + return; + } + const snapshot = loadedRemoteInfo.snapshot; + if (!snapshot) { + return; + } + const publicPath = + 'publicPath' in snapshot + ? snapshot.publicPath + : 'getPublicPath' in snapshot + ? new Function(snapshot.getPublicPath)() + : ''; + if (!publicPath) { + return; + } + const modules = 'modules' in snapshot ? snapshot.modules : []; + const targetModule = modules.find( + (m) => m.modulePath === loadedRemoteInfo.expose, + ); + if (!targetModule) { + return; + } + + const remoteEntry = 'remoteEntry' in snapshot ? snapshot.remoteEntry : ''; + if (!remoteEntry) { + return; + } + return { + module: targetModule, + publicPath, + remoteEntry, + }; +} + +export function collectSSRAssets(options: IProps) { + const { + id, + injectLink = true, + injectScript = false, + } = typeof options === 'string' ? { id: options } : options; + const links: React.ReactNode[] = []; + const scripts: React.ReactNode[] = []; + const instance = getInstance(); + if (!instance || (!injectLink && !injectScript)) { + return [...scripts, ...links]; + } + + const moduleAndPublicPath = getTargetModuleInfo(id); + if (!moduleAndPublicPath) { + return [...scripts, ...links]; + } + const { module: targetModule, publicPath, remoteEntry } = moduleAndPublicPath; + if (injectLink) { + [...targetModule.assets.css.sync, ...targetModule.assets.css.async] + .sort() + .forEach((file, index) => { + links.push( + , + ); + }); + } + + if (injectScript) { + scripts.push( + + )} + {globalThis.FEDERATION_SSR && assets} + + + ), + }; + } else { + throw Error( + `Make sure that ${moduleId} has the correct export when export is ${String( + exportName, + )}`, + ); + } + }); + + return (props: ComponentType) => { + const { key, ...args } = props; + if (globalThis.FEDERATION_SSR && !options.noSSR) { + const { key, ...args } = props; + + return ( + + {/* @ts-ignore */} + {(data) => } + + ); + } else { + // Client-side rendering logic + const [data, setData] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + let isMounted = true; + const fetchDataAsync = async () => { + try { + setLoading(true); + const result = await getData(options.noSSR); + if (isMounted) { + setData(result); + } + } catch (e: any) { + if (isMounted) { + setError(transformError(e)); + } + } finally { + if (isMounted) { + setLoading(false); + } + } + }; + + fetchDataAsync(); + + return () => { + isMounted = false; + }; + }, []); + + if (loading) { + return <>{options.loading}; + } + + if (error) { + return ( + <> + {typeof options.fallback === 'function' + ? options.fallback(error) + : options.fallback} + + ); + } + // @ts-ignore + return ; + } + }; +} + +/** + * @deprecated createRemoteSSRComponent is deprecated, please use createRemoteComponent instead! + */ +export function createRemoteSSRComponent( + options: CreateRemoteComponentOptions, +) { + logger.warn( + 'createRemoteSSRComponent is deprecated, please use createRemoteComponent instead!', + ); + return createRemoteComponent(options); +} diff --git a/packages/modernjs/src/runtime/createRemoteSSRComponent.tsx b/packages/modernjs/src/runtime/createRemoteSSRComponent.tsx deleted file mode 100644 index fa85c1786d8..00000000000 --- a/packages/modernjs/src/runtime/createRemoteSSRComponent.tsx +++ /dev/null @@ -1,207 +0,0 @@ -import React from 'react'; -import { - getInstance, - type FederationHost, -} from '@module-federation/enhanced/runtime'; -import { - ErrorBoundary, - ErrorBoundaryPropsWithComponent, -} from 'react-error-boundary'; - -type IProps = { - id: string; - injectScript?: boolean; - injectLink?: boolean; -}; - -type ReactKey = { key?: React.Key | null }; - -function getLoadedRemoteInfos(instance: FederationHost, id: string) { - const { name, expose } = instance.remoteHandler.idToRemoteMap[id] || {}; - if (!name) { - return; - } - const module = instance.moduleCache.get(name); - if (!module) { - return; - } - const { remoteSnapshot } = instance.snapshotHandler.getGlobalRemoteInfo( - module.remoteInfo, - ); - return { - ...module.remoteInfo, - snapshot: remoteSnapshot, - expose, - }; -} - -function getTargetModuleInfo(id: string) { - const instance = getInstance(); - if (!instance) { - return; - } - const loadedRemoteInfo = getLoadedRemoteInfos(instance, id); - if (!loadedRemoteInfo) { - return; - } - const snapshot = loadedRemoteInfo.snapshot; - if (!snapshot) { - return; - } - const publicPath = - 'publicPath' in snapshot - ? snapshot.publicPath - : 'getPublicPath' in snapshot - ? new Function(snapshot.getPublicPath)() - : ''; - if (!publicPath) { - return; - } - const modules = 'modules' in snapshot ? snapshot.modules : []; - const targetModule = modules.find( - (m) => m.modulePath === loadedRemoteInfo.expose, - ); - if (!targetModule) { - return; - } - - const remoteEntry = 'remoteEntry' in snapshot ? snapshot.remoteEntry : ''; - if (!remoteEntry) { - return; - } - return { - module: targetModule, - publicPath, - remoteEntry, - }; -} - -export function collectSSRAssets(options: IProps) { - const { - id, - injectLink = true, - injectScript = true, - } = typeof options === 'string' ? { id: options } : options; - const links: React.ReactNode[] = []; - const scripts: React.ReactNode[] = []; - const instance = getInstance(); - if (!instance || (!injectLink && !injectScript)) { - return [...scripts, ...links]; - } - - const moduleAndPublicPath = getTargetModuleInfo(id); - if (!moduleAndPublicPath) { - return [...scripts, ...links]; - } - const { module: targetModule, publicPath, remoteEntry } = moduleAndPublicPath; - if (injectLink) { - [...targetModule.assets.css.sync, ...targetModule.assets.css.async].forEach( - (file, index) => { - links.push( - , - ); - }, - ); - } - if (injectScript) { - scripts.push( -