diff --git a/apps/shared-treeshake/README.md b/apps/shared-treeshake/README.md new file mode 100644 index 00000000000..b8f3e38642d --- /dev/null +++ b/apps/shared-treeshake/README.md @@ -0,0 +1,76 @@ +# shared-treeshake + +## How to start the demos ? + +### Basic + +1. Build host and provider + +```bash +# Root directory +pnpm i + +pnpm i -g serve + +nx build modern-js-plugin + +nx build shared-treeshake-host + +nx build shared-treeshake-provider + +``` +2. Serve host and provider + +```bash +nx serve shared-treeshake-host + +serve apps/shared-treeshake/provider/dist -C -p 3002 +``` + +3. Visit page + +open http://localhost:3001 , it will render success. + +You can check the current loaded shared by executing `__FEDERATION__.__SHARE__["mf_host:0.1.34"].default.antd["4.24.15"].lib()` in browser console. + +It will show all antd components (fallback resources). + + + + +### Advanced + +This is combined with deploy server , which can calculate the snapshot of shared resources. + +In this demo , you can set `localStorage.setItem('calc','use')` to mock snapshot. + +First, need to re-shake the asset: + +```bash +nx build:re-shake shared-treeshake-host +``` + +Second, serve it(`serve apps/shared-treeshake/host/dist-test -C -p 3003` ) and update the `reShakeShareEntry` with real url in `runtimePlugin.ts` + +```diff +- reShakeShareEntry: +- 'http://localhost:3003/independent-packages/antd/antd_mf_host.3fc92539.js', ++ reShakeShareEntry: ++ 'http://localhost:3003/independent-packages/antd/antd_mf_host.3fc92539.js', +``` + +Finally, set `localStorage.setItem('calc','use')` and refresh the page. + +You will see the shared will use the re-shake shared with 5 modules export only. diff --git a/apps/shared-treeshake/host/.npmrc b/apps/shared-treeshake/host/.npmrc new file mode 100644 index 00000000000..fa4e095233f --- /dev/null +++ b/apps/shared-treeshake/host/.npmrc @@ -0,0 +1 @@ +strict-peer-dependencies=false \ No newline at end of file diff --git a/apps/shared-treeshake/host/CHANGELOG.md b/apps/shared-treeshake/host/CHANGELOG.md new file mode 100644 index 00000000000..94dad013e00 --- /dev/null +++ b/apps/shared-treeshake/host/CHANGELOG.md @@ -0,0 +1 @@ +# modernjs-ssr-nested-remote diff --git a/apps/shared-treeshake/host/modern.config.ts b/apps/shared-treeshake/host/modern.config.ts new file mode 100644 index 00000000000..6aad9edec96 --- /dev/null +++ b/apps/shared-treeshake/host/modern.config.ts @@ -0,0 +1,90 @@ +import { appTools, defineConfig } from '@modern-js/app-tools'; +import { serverPlugin } from '@modern-js/plugin-server'; +import { + // DependencyReferencExportPlugin, + IndependentSharedPlugin, + ModuleFederationPlugin, +} from '@module-federation/enhanced'; +import mfConfig from './module-federation.config'; +import path from 'path'; + +const isReShake = process.env.RE_SHAKE; +if (isReShake) { + process.env.MF_CUSTOM_REFERENCED_EXPORTS = JSON.stringify({ + antd: ['Divider', 'Space', 'Switch', 'Button', 'Badge'], + }); +} + +const webpackConfig = { + cache: false, +}; + +if (isReShake) { + // @ts-ignore + webpackConfig.entry = { + main: 'data:application/node;base64,', + }; + // @ts-ignore + webpackConfig.output = { + path: path.resolve(__dirname, 'dist-test'), + }; +} + +const publicPath = 'http://localhost:3001/'; + +// https://modernjs.dev/en/configure/app/usage +export default defineConfig({ + runtime: { + router: true, + }, + dev: { + assetPrefix: publicPath, + }, + output: { + assetPrefix: publicPath, + polyfill: 'off', + disableTsChecker: true, + }, + server: { + port: 3001, + }, + plugins: [ + appTools({ + bundler: 'webpack', // Set to 'webpack' to enable webpack + }), + serverPlugin(), + ], + performance: { + chunkSplit: { + strategy: 'split-by-module', + }, + }, + source: { + enableAsyncEntry: true, + transformImport: false, + }, + tools: { + webpack: webpackConfig, + bundlerChain(chain) { + chain.optimization.moduleIds('named'); + chain.optimization.chunkIds('named'); + chain.optimization.mangleExports(false); + // enable in dev + chain.optimization.usedExports(true); + // chain.optimization.minimize(false) + chain.optimization.runtimeChunk(false); + if (isReShake) { + chain.plugin('IndependentSharedPlugin').use(IndependentSharedPlugin, [ + { + // @ts-ignore + mfConfig, + outputDir: 'independent-packages', + treeshake: true, + }, + ]); + } else { + chain.plugin('MF').use(ModuleFederationPlugin, [mfConfig]); + } + }, + }, +}); diff --git a/apps/shared-treeshake/host/module-federation.config.ts b/apps/shared-treeshake/host/module-federation.config.ts new file mode 100644 index 00000000000..f84d9224e32 --- /dev/null +++ b/apps/shared-treeshake/host/module-federation.config.ts @@ -0,0 +1,16 @@ +import { createModuleFederationConfig } from '@module-federation/enhanced'; + +export default createModuleFederationConfig({ + name: 'mf_host', + remotes: { + mf_remote: 'mf_remote@http://localhost:3002/mf-manifest.json', + }, + shared: { + antd: { singleton: true, treeshake: true }, + react: {}, + 'react-dom': {}, + }, + // shareStrategy: 'loaded-first', + dts: false, + runtimePlugins: [require.resolve('./runtimePlugin.ts')], +}); diff --git a/apps/shared-treeshake/host/package.json b/apps/shared-treeshake/host/package.json new file mode 100644 index 00000000000..f089267b223 --- /dev/null +++ b/apps/shared-treeshake/host/package.json @@ -0,0 +1,56 @@ +{ + "name": "shared-treeshake-host", + "private": true, + "version": "0.1.34", + "scripts": { + "reset": "npx rimraf ./**/node_modules", + "dev": "modern dev", + "build": "modern build", + "build:re-shake": "RE_SHAKE=true 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.28.2", + "@modern-js/runtime": "2.68.0", + "@module-federation/enhanced": "workspace:*", + "antd": "5.29.1", + "react": "~18.3.1", + "react-dom": "~18.3.1" + }, + "devDependencies": { + "@modern-js-app/eslint-config": "2.59.0", + "@modern-js/app-tools": "2.68.0", + "@modern-js/eslint-config": "2.59.0", + "@modern-js/tsconfig": "2.68.0", + "@modern-js/server-runtime": "2.68.0", + "@modern-js/plugin-server": "2.68.0", + "@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", + "fs-extra": "^11.1.1", + "ts-node": "~10.8.1", + "tsconfig-paths": "~3.14.1" + } +} diff --git a/apps/shared-treeshake/host/project.json b/apps/shared-treeshake/host/project.json new file mode 100644 index 00000000000..52090cadc24 --- /dev/null +++ b/apps/shared-treeshake/host/project.json @@ -0,0 +1,61 @@ +{ + "name": "shared-treeshake-host", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/shared-treeshake/host/src", + "projectType": "application", + "tags": [], + "implicitDependencies": ["typescript"], + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/shared-treeshake/host; pnpm run build", + "forwardAllArgs": true + } + ] + } + }, + "build:re-shake": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/shared-treeshake/host; pnpm run build:re-shake", + "forwardAllArgs": true + } + ] + } + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/shared-treeshake/host; pnpm run serve", + "forwardAllArgs": true + } + ] + } + } + } +} diff --git a/apps/shared-treeshake/host/runtimePlugin.ts b/apps/shared-treeshake/host/runtimePlugin.ts new file mode 100644 index 00000000000..dff13730acb --- /dev/null +++ b/apps/shared-treeshake/host/runtimePlugin.ts @@ -0,0 +1,253 @@ +import { ModuleFederationRuntimePlugin } from '@module-federation/enhanced/runtime'; + +function collectTargetSharedUsedExports(sharedName: string) { + const usedExports: Set = new Set(); + Object.values(__FEDERATION__.moduleInfo).forEach((moduleInfo) => { + if (!moduleInfo || !('shared' in moduleInfo)) { + return; + } + moduleInfo.shared.forEach((shared) => { + //@ts-ignore + if (shared.sharedName !== sharedName || !shared.usedExports) { + return; + } + + // @ts-ignore + shared.usedExports.forEach(([runtime, exportNames]) => { + exportNames.forEach((exportName) => { + usedExports.add(exportName); + }); + }); + }); + }); + + return [...usedExports]; +} + +export default function (): ModuleFederationRuntimePlugin { + let mfInstance; + return { + name: 'resolve-shaked-shared', + apply(instance) { + mfInstance = instance; + const isCalc = localStorage.getItem('calc'); + if (!isCalc) { + return; + } + // @ts-ignore + __FEDERATION__.moduleInfo = { + mf_host: { + version: '', + remoteEntry: '', + remotesInfo: { + mf_remote: { + matchedVersion: 'http://localhost:3002/mf-manifest.json', + }, + }, + shared: [ + { + assets: { + js: { + async: [], + sync: [], + }, + css: { + async: [], + sync: [], + }, + }, + sharedName: 'antd', + version: '4.24.15', + usedExports: ['Divider', 'Space', 'Switch', 'Button'], + reShakeShareEntry: + 'http://localhost:3003/independent-packages/antd/antd_mf_host.3fc92539.js', + reShakeShareName: 'antd_mf_host', + reShakeShareType: 'global', + treeshakeStatus: isCalc === 'no-use' ? 0 : 2, + }, + ], + }, + 'mf_remote:http://localhost:3002/mf-manifest.json': { + version: 'http://localhost:3002/mf-manifest.json', + buildVersion: '0.1.34', + globalName: 'provider', + remoteEntry: 'remoteEntry.js', + remoteEntryType: 'global', + remoteTypes: '', + remoteTypesZip: '', + remoteTypesAPI: '', + remotesInfo: {}, + shared: [ + { + assets: { + js: { + async: [], + sync: ['static/js/async/npm.antd.0c40f3e4.js'], + }, + css: { + async: [], + sync: [], + }, + }, + sharedName: 'antd', + version: '4.24.15', + usedExports: ['Button', 'Badge'], + // treeshakeStatus:2, + reShakeShareEntry: + 'http://localhost:3003/independent-packages/antd/antd_mf_host.3fc92539.js', + reShakeShareName: 'antd_mf_host', + reShakeShareType: 'global', + treeshakeStatus: isCalc === 'no-use' ? 0 : 2, + }, + { + assets: { + js: { + async: [], + sync: ['static/js/async/npm.react-dom.9ba4b416.js'], + }, + css: { + async: [], + sync: [], + }, + }, + sharedName: 'react-dom', + version: '18.3.1', + usedExports: [], + }, + { + assets: { + js: { + async: [], + sync: ['static/js/async/npm.react.5f9ecbd5.js'], + }, + css: { + async: [], + sync: [], + }, + }, + sharedName: 'react', + version: '18.3.1', + usedExports: [], + }, + ], + modules: [ + { + moduleName: 'App', + modulePath: './App', + assets: { + js: { + sync: [ + 'static/js/async/npm.babel.runtime.bfc5fa9a.js', + 'static/js/async/npm.react-is.e17534db.js', + 'static/js/npm..modern-js.a4a39d75.js', + 'static/js/async/npm.swc.helpers.8b407dbe.js', + 'static/js/async/npm.modern-js.runtime.968a0fd9.js', + 'static/js/async/npm.modern-js.runtime-utils.7806a470.js', + 'static/js/async/npm.modern-js.plugin-v2.63d355aa.js', + 'static/js/async/npm.tslib.3d69d75a.js', + 'static/js/async/npm.invariant.a2c88129.js', + 'static/js/async/npm.hoist-non-react-statics.6174c347.js', + 'static/js/async/npm.cookie.c6093c5c.js', + 'static/js/async/npm.react-router.007b61fc.js', + 'static/js/async/npm.react-router-dom.44c032dc.js', + 'static/js/async/npm.remix-run.router.d9e969eb.js', + 'static/js/async/npm.modern-js.utils.97664881.js', + 'static/js/async/npm.loadable.component.d1f38d58.js', + 'static/js/async/async-main.e5c8db3d.js', + 'static/js/async/page.8b9be98b.js', + ], + async: [ + 'static/js/async/page.8b9be98b.js', + 'static/js/async/npm.scheduler.f255044f.js', + 'static/js/async/npm.babel.runtime.bfc5fa9a.js', + 'static/js/async/npm.react-is.e17534db.js', + 'static/js/npm..modern-js.a4a39d75.js', + 'static/js/async/npm.swc.helpers.8b407dbe.js', + 'static/js/async/npm.modern-js.runtime.968a0fd9.js', + 'static/js/async/npm.modern-js.runtime-utils.7806a470.js', + 'static/js/async/npm.modern-js.plugin-v2.63d355aa.js', + 'static/js/async/npm.tslib.3d69d75a.js', + 'static/js/async/npm.invariant.a2c88129.js', + 'static/js/async/npm.hoist-non-react-statics.6174c347.js', + 'static/js/async/npm.cookie.c6093c5c.js', + 'static/js/async/npm.react-router.007b61fc.js', + 'static/js/async/npm.react-router-dom.44c032dc.js', + 'static/js/async/npm.remix-run.router.d9e969eb.js', + 'static/js/async/npm.modern-js.utils.97664881.js', + 'static/js/async/npm.loadable.component.d1f38d58.js', + 'static/js/async/async-main.e5c8db3d.js', + 'static/js/async/npm.lodash.d93aeba9.js', + 'static/js/async/npm.rc-util.048e76db.js', + 'static/js/async/npm.rc-motion.1a8c8fe9.js', + 'static/js/async/npm.ant-design.icons.1b7d0d9d.js', + 'static/js/async/npm.ctrl.tinycolor.0ce792d7.js', + 'static/js/async/npm.classnames.df1221fe.js', + 'static/js/async/npm.ant-design.icons-svg.bbb9709d.js', + 'static/js/async/npm.ant-design.colors.7fa1dec6.js', + ], + }, + css: { + sync: [], + async: [], + }, + }, + }, + ], + publicPath: 'http://localhost:3002/', + }, + }; + }, + // resolveShare(args) { + // const { shareInfo, pkgName } = args; + // if (pkgName !== 'antd') { + // return args; + // } + + // // A [Button,List] antd@4.2.1 + // // B [Button,List] antd@4.2.3 + // // C [Button,List] antd@4.2.3 + + // // app1 app2 + // // B C + + // const { usedExports } = shareInfo; + // if (!usedExports) { + // return args; + // } + + // const allUsedExports = collectTargetSharedUsedExports(pkgName); + // if ( + // allUsedExports.every((exportName) => usedExports.includes(exportName)) + // ) { + // return args; + // } + + // // load Fallback shared + // const fallbackShared = { + // ...shareInfo, + // get: () => + // new Promise((resolve) => { + // const script = document.createElement('script'); + // script.src = + // 'http://localhost:3003/independent-packages/antd/antd_mf_host.js'; + // script.onload = () => { + // const fallbackModuleContainer = window['antd_mf_host']; + // // @ts-ignore + // fallbackModuleContainer + // .init(mfInstance, __webpack_require__.federation.bundlerRuntime) + // .then(() => { + // resolve(fallbackModuleContainer.get()); + // }); + // }; + // document.head.appendChild(script); + // }), + // }; + // console.log('use fallback shared : ', args); + + // return { + // ...args, + // resolver: () => fallbackShared, + // }; + // }, + }; +} diff --git a/apps/shared-treeshake/host/server/modern.server.ts b/apps/shared-treeshake/host/server/modern.server.ts new file mode 100644 index 00000000000..f3476b41fc7 --- /dev/null +++ b/apps/shared-treeshake/host/server/modern.server.ts @@ -0,0 +1,44 @@ +import { defineServerConfig } from '@modern-js/server-runtime'; +import path from 'path'; +import fs from 'fs'; +import { readFile } from 'fs/promises'; + +import type { MiddlewareHandler } from '@modern-js/server-runtime'; + +const handler: MiddlewareHandler = async (c, next) => { + try { + console.log('req.url', c.req.url); + if (c.req.url?.includes('independent-packages')) { + const filepath = path.join( + process.cwd(), + c.req.url.replace('http://localhost:3001/', 'dist/'), + ); + console.log('filepath: ', filepath); + + fs.statSync(filepath); + c.res.headers.set('Access-Control-Allow-Origin', '*'); + c.res.headers.set( + 'Access-Control-Allow-Methods', + 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + ); + c.res.headers.set('Access-Control-Allow-Headers', '*'); + const content = await readFile(filepath, 'utf-8'); + return c.text(content); // 返回文件内容 + } else { + await next(); + } + } catch (err) { + await next(); + } +}; + +export default defineServerConfig({ + middlewares: [ + { + name: 'proxy-fallback-shared', + handler, + }, + ], + renderMiddlewares: [], + plugins: [], +}); diff --git a/apps/shared-treeshake/host/src/.eslintrc.js b/apps/shared-treeshake/host/src/.eslintrc.js new file mode 100644 index 00000000000..fafc0032305 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/host/src/modern-app-env.d.ts b/apps/shared-treeshake/host/src/modern-app-env.d.ts new file mode 100644 index 00000000000..827e6c01d97 --- /dev/null +++ b/apps/shared-treeshake/host/src/modern-app-env.d.ts @@ -0,0 +1,4 @@ +/// +/// +/// +/// diff --git a/apps/shared-treeshake/host/src/routes/index.css b/apps/shared-treeshake/host/src/routes/index.css new file mode 100644 index 00000000000..e890f8aa146 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/host/src/routes/layout.tsx b/apps/shared-treeshake/host/src/routes/layout.tsx new file mode 100644 index 00000000000..6433ea79e92 --- /dev/null +++ b/apps/shared-treeshake/host/src/routes/layout.tsx @@ -0,0 +1,9 @@ +import { Outlet } from '@modern-js/runtime/router'; + +export default function Layout() { + return ( +
+ +
+ ); +} diff --git a/apps/shared-treeshake/host/src/routes/page.tsx b/apps/shared-treeshake/host/src/routes/page.tsx new file mode 100644 index 00000000000..6a5438c6ec6 --- /dev/null +++ b/apps/shared-treeshake/host/src/routes/page.tsx @@ -0,0 +1,31 @@ +import RemoteApp from 'mf_remote/App'; +import React, { useState } from 'react'; +import { Button, Space, Switch, Divider } from 'antd'; +import 'antd/dist/antd.css'; + +console.log(3333, RemoteApp); +const App = () => { + const [disabled, setDisabled] = useState(true); + const toggle = () => { + setDisabled(!disabled); + }; + + return ( + <> +

Remote Content

+ + + +

Consumer Content

+ + + + + + + ); +}; + +export default App; diff --git a/apps/shared-treeshake/host/tsconfig.app.json b/apps/shared-treeshake/host/tsconfig.app.json new file mode 100644 index 00000000000..b5b3e6e9e03 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/host/tsconfig.json b/apps/shared-treeshake/host/tsconfig.json new file mode 100644 index 00000000000..4ccadf499c6 --- /dev/null +++ b/apps/shared-treeshake/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", "server"], + "exclude": ["**/node_modules"] +} diff --git a/apps/shared-treeshake/host/tsconfig.spec.json b/apps/shared-treeshake/host/tsconfig.spec.json new file mode 100644 index 00000000000..9b2a121d114 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/provider/.npmrc b/apps/shared-treeshake/provider/.npmrc new file mode 100644 index 00000000000..fa4e095233f --- /dev/null +++ b/apps/shared-treeshake/provider/.npmrc @@ -0,0 +1 @@ +strict-peer-dependencies=false \ No newline at end of file diff --git a/apps/shared-treeshake/provider/CHANGELOG.md b/apps/shared-treeshake/provider/CHANGELOG.md new file mode 100644 index 00000000000..94dad013e00 --- /dev/null +++ b/apps/shared-treeshake/provider/CHANGELOG.md @@ -0,0 +1 @@ +# modernjs-ssr-nested-remote diff --git a/apps/shared-treeshake/provider/modern.config.ts b/apps/shared-treeshake/provider/modern.config.ts new file mode 100644 index 00000000000..b6ea55b49c8 --- /dev/null +++ b/apps/shared-treeshake/provider/modern.config.ts @@ -0,0 +1,79 @@ +import { appTools, defineConfig } from '@modern-js/app-tools'; +import { + ModuleFederationPlugin, + IndependentSharedPlugin, +} from '@module-federation/enhanced'; +import mfConfig from './module-federation.config'; + +if (process.env.SHAKE) { + process.env.MF_CUSTOM_REFERENCED_EXPORTS = JSON.stringify({ + antd: ['Button'], + }); +} +// https://modernjs.dev/en/configure/app/usage +export default defineConfig({ + runtime: { + router: true, + }, + dev: { + assetPrefix: 'http://localhost:3002/', + }, + output: { + assetPrefix: 'http://localhost:3002/', + polyfill: 'off', + disableTsChecker: true, + }, + server: { + port: 3002, + }, + plugins: [ + appTools({ + bundler: 'webpack', // Set to 'webpack' to enable webpack + }), + ], + performance: { + chunkSplit: { + strategy: 'split-by-module', + }, + }, + source: { + enableAsyncEntry: true, + transformImport: false, + }, + tools: { + webpack: { + cache: false, + // entry: { + // main: 'data:application/node;base64,', + // // main: '/Users/bytedance/work_test/shared-treeshake/webpack-project/provider/src/test-entry.ts', + // }, + }, + bundlerChain(chain) { + chain.optimization.moduleIds('named'); + chain.optimization.chunkIds('named'); + chain.optimization.mangleExports(false); + // enable in dev + chain.optimization.usedExports(true); + // chain.optimization.minimize(false) + chain.optimization.runtimeChunk(false); + chain.plugin('MF').use(ModuleFederationPlugin, [mfConfig]); + // chain.plugin('IndependentSharedPlugin').use(IndependentSharedPlugin, [ + // { + // // @ts-ignore + // mfConfig, + // outputDir: 'independent-packages', + // treeshake: true, + // }, + // ]); + + // chain + // .plugin('DependencyReferencExportPlugin') + // .use(DependencyReferencExportPlugin, [mfConfig]); + // chain.plugin('IndependentCompilerPlugin').use(IndependentCompilerPlugin, [ + // { + // mfConfig, + // }, + // ]); + }, + }, +}); diff --git a/apps/shared-treeshake/provider/module-federation.config.ts b/apps/shared-treeshake/provider/module-federation.config.ts new file mode 100644 index 00000000000..2d3d8df1e01 --- /dev/null +++ b/apps/shared-treeshake/provider/module-federation.config.ts @@ -0,0 +1,15 @@ +import { createModuleFederationConfig } from '@module-federation/enhanced'; + +export default createModuleFederationConfig({ + name: 'provider', + filename: 'remoteEntry.js', + exposes: { + './App': './src/routes/page.tsx', + }, + shared: { + antd: { singleton: true, treeshake: true }, + react: {}, + 'react-dom': {}, + }, + dts: false, +}); diff --git a/apps/shared-treeshake/provider/package.json b/apps/shared-treeshake/provider/package.json new file mode 100644 index 00000000000..a6c835e18e1 --- /dev/null +++ b/apps/shared-treeshake/provider/package.json @@ -0,0 +1,50 @@ +{ + "name": "shared-treeshake-provider", + "private": true, + "version": "0.1.34", + "scripts": { + "reset": "npx rimraf ./**/node_modules", + "dev": "modern dev", + "build": "modern build", + "build:shake": "SHAKE=true 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.28.2", + "@modern-js/runtime": "2.68.0", + "@module-federation/enhanced": "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.68.0", + "@modern-js/eslint-config": "2.59.0", + "@modern-js/tsconfig": "2.68.0", + "@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/shared-treeshake/provider/project.json b/apps/shared-treeshake/provider/project.json new file mode 100644 index 00000000000..8c725f46c14 --- /dev/null +++ b/apps/shared-treeshake/provider/project.json @@ -0,0 +1,44 @@ +{ + "name": "shared-treeshake-provider", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/shared-treeshake/provider/src", + "projectType": "application", + "tags": [], + "implicitDependencies": ["typescript"], + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/shared-treeshake/provider; pnpm run build", + "forwardAllArgs": true + } + ] + } + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ], + "commands": [ + { + "command": "cd apps/shared-treeshake/provider; pnpm run serve", + "forwardAllArgs": true + } + ] + } + } + } +} diff --git a/apps/shared-treeshake/provider/src/.eslintrc.js b/apps/shared-treeshake/provider/src/.eslintrc.js new file mode 100644 index 00000000000..fafc0032305 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/provider/src/modern-app-env.d.ts b/apps/shared-treeshake/provider/src/modern-app-env.d.ts new file mode 100644 index 00000000000..827e6c01d97 --- /dev/null +++ b/apps/shared-treeshake/provider/src/modern-app-env.d.ts @@ -0,0 +1,4 @@ +/// +/// +/// +/// diff --git a/apps/shared-treeshake/provider/src/routes/index.css b/apps/shared-treeshake/provider/src/routes/index.css new file mode 100644 index 00000000000..e890f8aa146 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/provider/src/routes/layout.tsx b/apps/shared-treeshake/provider/src/routes/layout.tsx new file mode 100644 index 00000000000..6433ea79e92 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/provider/src/routes/page.tsx b/apps/shared-treeshake/provider/src/routes/page.tsx new file mode 100644 index 00000000000..03d03332915 --- /dev/null +++ b/apps/shared-treeshake/provider/src/routes/page.tsx @@ -0,0 +1,15 @@ +import { Button, Badge } from 'antd'; +// @ts-ignore +window.Button = Button; + +const App = () => { + return ( +
+ +

Start building amazing things with Rsbuildss.

+ +
+ ); +}; + +export default App; diff --git a/apps/shared-treeshake/provider/src/routes/test.ts b/apps/shared-treeshake/provider/src/routes/test.ts new file mode 100644 index 00000000000..a66fecd2857 --- /dev/null +++ b/apps/shared-treeshake/provider/src/routes/test.ts @@ -0,0 +1,3 @@ +import { Badge } from 'antd'; + +export const foo = Badge; diff --git a/apps/shared-treeshake/provider/tsconfig.app.json b/apps/shared-treeshake/provider/tsconfig.app.json new file mode 100644 index 00000000000..b5b3e6e9e03 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/provider/tsconfig.json b/apps/shared-treeshake/provider/tsconfig.json new file mode 100644 index 00000000000..26ef0ff0304 --- /dev/null +++ b/apps/shared-treeshake/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/shared-treeshake/provider/tsconfig.spec.json b/apps/shared-treeshake/provider/tsconfig.spec.json new file mode 100644 index 00000000000..9b2a121d114 --- /dev/null +++ b/apps/shared-treeshake/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/packages/enhanced/src/declarations/plugins/sharing/SharePlugin.d.ts b/packages/enhanced/src/declarations/plugins/sharing/SharePlugin.d.ts index cb6c3a97c90..8be0d49f94d 100644 --- a/packages/enhanced/src/declarations/plugins/sharing/SharePlugin.d.ts +++ b/packages/enhanced/src/declarations/plugins/sharing/SharePlugin.d.ts @@ -99,6 +99,11 @@ export interface SharedConfig { * Node modules reconstructed lookup. */ allowNodeModulesSuffixMatch?: boolean; + nodeModulesReconstructedLookup?: boolean; + + treeshake?: boolean; + usedExports?: string[]; + independentShareFileName?: string; } export interface IncludeExcludeOptions { diff --git a/packages/enhanced/src/index.ts b/packages/enhanced/src/index.ts index 9ff68acb16b..5f48034b74f 100644 --- a/packages/enhanced/src/index.ts +++ b/packages/enhanced/src/index.ts @@ -12,6 +12,7 @@ export { default as FederationModulesPlugin } from './wrapper/FederationModulesP export { default as FederationRuntimePlugin } from './wrapper/FederationRuntimePlugin'; export { default as AsyncBoundaryPlugin } from './wrapper/AsyncBoundaryPlugin'; export { default as HoistContainerReferencesPlugin } from './wrapper/HoistContainerReferencesPlugin'; +export { default as TreeshakeSharePlugin } from './wrapper/TreeshakeSharePlugin'; export const dependencies = { get ContainerEntryDependency() { diff --git a/packages/enhanced/src/lib/container/ContainerPlugin.ts b/packages/enhanced/src/lib/container/ContainerPlugin.ts index 623e5aec584..2629b755369 100644 --- a/packages/enhanced/src/lib/container/ContainerPlugin.ts +++ b/packages/enhanced/src/lib/container/ContainerPlugin.ts @@ -1,6 +1,6 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy, Marais Rossouw @maraisr + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy, Marais Rossouw @maraisr */ import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; import ContainerEntryDependency from './ContainerEntryDependency'; @@ -35,10 +35,10 @@ const createSchemaValidation = require( normalizeWebpackPath('webpack/lib/util/create-schema-validation'), ) as typeof import('webpack/lib/util/create-schema-validation'); -const validate = createSchemaValidation(checkOptions, () => schema, { - name: 'Container Plugin', - baseDataPath: 'options', -}); +// const validate = createSchemaValidation(checkOptions, () => schema, { +// name: 'Container Plugin', +// baseDataPath: 'options', +// }); const PLUGIN_NAME = 'ContainerPlugin'; @@ -47,14 +47,14 @@ class ContainerPlugin { name: string; constructor(options: containerPlugin.ContainerPluginOptions) { - validate(options); + // validate(options); this.name = PLUGIN_NAME; this._options = { name: options.name, shareScope: options.shareScope || 'default', library: options.library || { - type: 'var', + type: 'global', name: options.name, }, runtime: options.runtime, diff --git a/packages/enhanced/src/lib/container/ContainerReferencePlugin.ts b/packages/enhanced/src/lib/container/ContainerReferencePlugin.ts index 8d85afec6eb..6e58ff30e17 100644 --- a/packages/enhanced/src/lib/container/ContainerReferencePlugin.ts +++ b/packages/enhanced/src/lib/container/ContainerReferencePlugin.ts @@ -13,7 +13,10 @@ import RemoteModule from './RemoteModule'; import RemoteRuntimeModule from './RemoteRuntimeModule'; import RemoteToExternalDependency from './RemoteToExternalDependency'; import { parseOptions } from './options'; -import { containerReferencePlugin } from '@module-federation/sdk'; +import type { + containerReferencePlugin, + moduleFederationPlugin, +} from '@module-federation/sdk'; import FederationRuntimePlugin from './runtime/FederationRuntimePlugin'; import FederationModulesPlugin from './runtime/FederationModulesPlugin'; import schema from '../../schemas/container/ContainerReferencePlugin'; @@ -27,26 +30,26 @@ const createSchemaValidation = require( normalizeWebpackPath('webpack/lib/util/create-schema-validation'), ) as typeof import('webpack/lib/util/create-schema-validation'); -const validate = createSchemaValidation( - //eslint-disable-next-line - checkOptions, - () => schema, - { - name: 'Container Reference Plugin', - baseDataPath: 'options', - }, -); +// const validate = createSchemaValidation( +// //eslint-disable-next-line +// checkOptions, +// () => schema, +// { +// name: 'Container Reference Plugin', +// baseDataPath: 'options', +// }, +// ); const slashCode = '/'.charCodeAt(0); class ContainerReferencePlugin { - private _remoteType: containerReferencePlugin.ExternalsType; - private _remotes: [string, containerReferencePlugin.RemotesConfig][]; + private _remoteType: moduleFederationPlugin.ExternalsType; + private _remotes: [string, moduleFederationPlugin.RemotesConfig][]; constructor( options: containerReferencePlugin.ContainerReferencePluginOptions, ) { - validate(options); + // validate(options); this._remoteType = options.remoteType; this._remotes = parseOptions( diff --git a/packages/enhanced/src/lib/container/ModuleFederationPlugin.ts b/packages/enhanced/src/lib/container/ModuleFederationPlugin.ts index dd3a686ab96..c3d4971281b 100644 --- a/packages/enhanced/src/lib/container/ModuleFederationPlugin.ts +++ b/packages/enhanced/src/lib/container/ModuleFederationPlugin.ts @@ -1,6 +1,6 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy */ 'use strict'; @@ -25,6 +25,7 @@ import { ExternalsType } from 'webpack/declarations/WebpackOptions'; import StartupChunkDependenciesPlugin from '../startup/MfStartupChunkDependenciesPlugin'; import FederationModulesPlugin from './runtime/FederationModulesPlugin'; import { createSchemaValidation } from '../../utils'; +import TreeshakeSharePlugin from '../sharing/treeshake/TreeshakeSharePlugin'; const isValidExternalsType = require( normalizeWebpackPath( @@ -109,11 +110,16 @@ class ModuleFederationPlugin implements WebpackPluginInstance { 'EnhancedModuleFederationPlugin', ); const { _options: options } = this; + const { name, experiments, dts, remotes, shared, shareScope } = options; + if (!name) { + // TODO: remove the comment + throw new Error('ModuleFederationPlugin name is required'); + } // must before ModuleFederationPlugin (new RemoteEntryPlugin(options) as unknown as WebpackPluginInstance).apply( compiler, ); - if (options.experiments?.provideExternalRuntime) { + if (experiments?.provideExternalRuntime) { if (options.exposes) { throw new Error( 'You can only set provideExternalRuntime: true in pure consumer which not expose modules.', @@ -127,7 +133,7 @@ class ModuleFederationPlugin implements WebpackPluginInstance { ); } - if (options.experiments?.externalRuntime === true) { + if (experiments?.externalRuntime === true) { const Externals = compiler.webpack.ExternalsPlugin || ExternalsPlugin; new Externals(compiler.options.externalsType || 'global', { '@module-federation/runtime-core': '_FEDERATION_RUNTIME_CORE', @@ -137,24 +143,25 @@ class ModuleFederationPlugin implements WebpackPluginInstance { // federation hooks new FederationModulesPlugin().apply(compiler); - if (options.experiments?.asyncStartup) { + if (experiments?.asyncStartup) { new StartupChunkDependenciesPlugin({ asyncChunkLoading: true, }).apply(compiler); } - if (options.dts !== false) { + if (dts !== false) { const dtsPlugin = new DtsPlugin(options); dtsPlugin.apply(compiler); dtsPlugin.addRuntimePlugins(); } + // TODO: REMOVE in next major version if (options.dataPrefetch) { new PrefetchPlugin(options).apply(compiler); } new FederationRuntimePlugin(options).apply(compiler); - const library = options.library || { type: 'var', name: options.name }; + const library = options.library || { type: 'var', name: name }; const remoteType = options.remoteType || (options.library && isValidExternalsType(options.library.type) @@ -169,7 +176,7 @@ class ModuleFederationPlugin implements WebpackPluginInstance { let disableManifest = options.manifest === false; if (useContainerPlugin) { - ContainerPlugin.patchChunkSplit(compiler, this._options.name!); + ContainerPlugin.patchChunkSplit(compiler, name); } this._patchBundlerConfig(compiler); if (!disableManifest && useContainerPlugin) { @@ -196,7 +203,7 @@ class ModuleFederationPlugin implements WebpackPluginInstance { compiler.hooks.afterPlugins.tap('ModuleFederationPlugin', () => { if (useContainerPlugin) { new ContainerPlugin({ - name: options.name!, + name, library, filename: options.filename, runtime: options.runtime, @@ -206,21 +213,24 @@ class ModuleFederationPlugin implements WebpackPluginInstance { }).apply(compiler); } if ( - options.remotes && - (Array.isArray(options.remotes) - ? options.remotes.length > 0 - : Object.keys(options.remotes).length > 0) + remotes && + (Array.isArray(remotes) + ? remotes.length > 0 + : Object.keys(remotes).length > 0) ) { new ContainerReferencePlugin({ remoteType, - shareScope: options.shareScope, - remotes: options.remotes, + shareScope, + remotes, }).apply(compiler); } - if (options.shared) { + if (shared) { + new TreeshakeSharePlugin({ + mfConfig: options, + }).apply(compiler); new SharePlugin({ - shared: options.shared, - shareScope: options.shareScope, + shared, + shareScope, }).apply(compiler); } }); diff --git a/packages/enhanced/src/lib/container/runtime/FederationRuntimePlugin.ts b/packages/enhanced/src/lib/container/runtime/FederationRuntimePlugin.ts index 81b82c64623..e028ca78ea8 100644 --- a/packages/enhanced/src/lib/container/runtime/FederationRuntimePlugin.ts +++ b/packages/enhanced/src/lib/container/runtime/FederationRuntimePlugin.ts @@ -7,7 +7,6 @@ import type { Compilation, Chunk, } from 'webpack'; -import type { EntryDescription } from 'webpack/lib/Entrypoint'; import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; import { PrefetchPlugin } from '@module-federation/data-prefetch/cli'; import { moduleFederationPlugin } from '@module-federation/sdk'; @@ -15,7 +14,6 @@ import FederationRuntimeModule from './FederationRuntimeModule'; import { getFederationGlobalScope, normalizeRuntimeInitOptionsWithOutShared, - modifyEntry, createHash, normalizeToPosixPath, } from './utils'; @@ -73,7 +71,6 @@ class FederationRuntimePlugin { compiler: Compiler, options: moduleFederationPlugin.ModuleFederationPluginOptions, bundlerRuntimePath?: string, - experiments?: moduleFederationPlugin.ModuleFederationPluginOptions['experiments'], ) { // internal runtime plugin const runtimePlugins = options.runtimePlugins; @@ -140,7 +137,8 @@ class FederationRuntimePlugin { `${federationGlobal}.initOptions.plugins.concat(pluginsToAdd) : pluginsToAdd;`, ]) : '', - `${federationGlobal}.instance = ${federationGlobal}.runtime.init(${federationGlobal}.initOptions);`, + // `${federationGlobal}.instance = ${federationGlobal}.runtime.init(${federationGlobal}.initOptions);`, + `${federationGlobal}.instance = ${federationGlobal}.bundlerRuntime.init({webpackRequire:${RuntimeGlobals.require}});`, `if(${federationGlobal}.attachShareScopeMap){`, Template.indent([ `${federationGlobal}.attachShareScopeMap(${RuntimeGlobals.require})`, @@ -176,7 +174,6 @@ class FederationRuntimePlugin { compiler, this.options, this.bundlerRuntimePath, - this.options.experiments, )}`, ); entryFilePath = path.join(TEMP_DIR, `entry.${hash}.js`); @@ -186,7 +183,6 @@ class FederationRuntimePlugin { compiler, this.options, this.bundlerRuntimePath, - this.options.experiments, ), )}`; } @@ -215,7 +211,6 @@ class FederationRuntimePlugin { compiler, this.options, this.bundlerRuntimePath, - this.options.experiments, ), ); } diff --git a/packages/enhanced/src/lib/sharing/ConsumeSharedRuntimeModule.ts b/packages/enhanced/src/lib/sharing/ConsumeSharedRuntimeModule.ts index 87080db82c8..d2eb1088e95 100644 --- a/packages/enhanced/src/lib/sharing/ConsumeSharedRuntimeModule.ts +++ b/packages/enhanced/src/lib/sharing/ConsumeSharedRuntimeModule.ts @@ -1,6 +1,6 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy */ import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; @@ -137,11 +137,12 @@ class ConsumeSharedRuntimeModule extends RuntimeModule { `initialConsumes: ${RuntimeGlobals.require}.consumesLoadingData.initialConsumes,`, 'installedModules:installedModules,', `moduleToHandlerMapping,`, - `webpackRequire: ${RuntimeGlobals.require}`, + `webpackRequire: ${RuntimeGlobals.require},`, + `asyncLoad: typeof options==='object' ? options.asyncLoad : undefined,`, ]), `})`, ]), - '', + 'options', )}`, ]) : '// no consumes in initial chunks', diff --git a/packages/enhanced/src/lib/sharing/ProvideSharedPlugin.ts b/packages/enhanced/src/lib/sharing/ProvideSharedPlugin.ts index 9de60ba5df0..ffb8c166429 100644 --- a/packages/enhanced/src/lib/sharing/ProvideSharedPlugin.ts +++ b/packages/enhanced/src/lib/sharing/ProvideSharedPlugin.ts @@ -1,6 +1,6 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy */ 'use strict'; diff --git a/packages/enhanced/src/lib/sharing/SharePlugin.ts b/packages/enhanced/src/lib/sharing/SharePlugin.ts index e65806279c0..5332fed111e 100644 --- a/packages/enhanced/src/lib/sharing/SharePlugin.ts +++ b/packages/enhanced/src/lib/sharing/SharePlugin.ts @@ -1,18 +1,19 @@ /* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy */ 'use strict'; import type { Compiler } from 'webpack'; import { isRequiredVersion } from '@module-federation/sdk'; +import type { + sharePlugin, + moduleFederationPlugin, +} from '@module-federation/sdk'; import { parseOptions } from '../container/options'; import ConsumeSharedPlugin from './ConsumeSharedPlugin'; import ProvideSharedPlugin from './ProvideSharedPlugin'; -import type { - SharePluginOptions, - SharedConfig, -} from '../../declarations/plugins/sharing/SharePlugin'; +import type { SharedConfig } from '../../declarations/plugins/sharing/SharePlugin'; import type { ConsumesConfig } from '../../declarations/plugins/sharing/ConsumeSharedPlugin'; import type { ProvidesConfig } from '../../declarations/plugins/sharing/ProvideSharedPlugin'; import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; @@ -28,72 +29,94 @@ const validate = createSchemaValidation( }, ); +export type NormalizedSharedOptions = [string, SharedConfig][]; + +export function normalizeSharedOptions( + shared: moduleFederationPlugin.Shared, +): NormalizedSharedOptions { + return parseOptions( + shared, + (item, key) => { + if (typeof item !== 'string') + throw new Error( + `Unexpected array in shared configuration for key "${key}"`, + ); + const config: SharedConfig = + item === key || !isRequiredVersion(item) + ? { + import: item, + } + : { + import: key, + requiredVersion: item, + }; + return config; + }, + (item) => item, + ); +} + +export function createConsumeShareOptions( + normalizedSharedOptions: NormalizedSharedOptions, +) { + return normalizedSharedOptions.map(([key, options]) => ({ + [key]: { + import: options.import, + shareKey: options.shareKey || key, + shareScope: options.shareScope, + requiredVersion: options.requiredVersion, + strictVersion: options.strictVersion, + singleton: options.singleton, + packageName: options.packageName, + eager: options.eager, + issuerLayer: options.issuerLayer, + layer: options.layer, + request: options.request || key, + exclude: options.exclude, + include: options.include, + allowNodeModulesSuffixMatch: options.allowNodeModulesSuffixMatch, + }, + })); +} + +export function createProvideShareOptions( + normalizedSharedOptions: NormalizedSharedOptions, +) { + return normalizedSharedOptions + .filter(([, options]) => options.import !== false) + .map(([key, options]) => ({ + [options.import || key]: { + shareKey: options.shareKey || key, + shareScope: options.shareScope, + version: options.version, + eager: options.eager, + requiredVersion: options.requiredVersion, + strictVersion: options.strictVersion, + singleton: options.singleton, + layer: options.layer, + request: options.request || options.import || key, + exclude: options.exclude, + include: options.include, + allowNodeModulesSuffixMatch: options.allowNodeModulesSuffixMatch, + }, + })); +} + class SharePlugin { private _shareScope: string | string[]; private _consumes: Record[]; private _provides: Record[]; - constructor(options: SharePluginOptions) { + constructor(options: sharePlugin.SharePluginOptions) { validate(options); - const sharedOptions: [string, SharedConfig][] = parseOptions( + const sharedOptions: [string, SharedConfig][] = normalizeSharedOptions( options.shared, - (item, key) => { - if (typeof item !== 'string') - throw new Error( - `Unexpected array in shared configuration for key "${key}"`, - ); - const config: SharedConfig = - item === key || !isRequiredVersion(item) - ? { - import: item, - } - : { - import: key, - requiredVersion: item, - }; - return config; - }, - (item) => item, - ); - const consumes: Record[] = sharedOptions.map( - ([key, options]) => ({ - [key]: { - import: options.import, - shareKey: options.shareKey || key, - shareScope: options.shareScope, - requiredVersion: options.requiredVersion, - strictVersion: options.strictVersion, - singleton: options.singleton, - packageName: options.packageName, - eager: options.eager, - issuerLayer: options.issuerLayer, - layer: options.layer, - request: options.request || key, - exclude: options.exclude, - include: options.include, - allowNodeModulesSuffixMatch: options.allowNodeModulesSuffixMatch, - }, - }), ); - const provides: Record[] = sharedOptions - .filter(([, options]) => options.import !== false) - .map(([key, options]) => ({ - [options.import || key]: { - shareKey: options.shareKey || key, - shareScope: options.shareScope, - version: options.version, - eager: options.eager, - requiredVersion: options.requiredVersion, - strictVersion: options.strictVersion, - singleton: options.singleton, - layer: options.layer, - request: options.request || options.import || key, - exclude: options.exclude, - include: options.include, - allowNodeModulesSuffixMatch: options.allowNodeModulesSuffixMatch, - }, - })); + const consumes: Record[] = + createConsumeShareOptions(sharedOptions); + const provides: Record[] = + createProvideShareOptions(sharedOptions); this._shareScope = options.shareScope || 'default'; this._consumes = consumes; @@ -107,7 +130,6 @@ class SharePlugin { apply(compiler: Compiler): void { process.env['FEDERATION_WEBPACK_PATH'] = process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - new ConsumeSharedPlugin({ shareScope: this._shareScope, consumes: this._consumes, diff --git a/packages/enhanced/src/lib/sharing/treeshake/CollectSharedEntryPlugin.ts b/packages/enhanced/src/lib/sharing/treeshake/CollectSharedEntryPlugin.ts new file mode 100644 index 00000000000..308183c3ee4 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/CollectSharedEntryPlugin.ts @@ -0,0 +1,166 @@ +import type { Compiler } from 'webpack'; +import * as fs from 'fs'; +import * as path from 'path'; +import { NormalizedSharedOptions } from '../SharePlugin'; + +const PLUGIN_NAME = 'CollectSharedEntryPlugin'; + +export type ShareRequestsMap = Record< + string, + { + requests: [string, string][]; + } +>; + +export type CollectSharedEntryPluginOptions = { + sharedOptions: NormalizedSharedOptions; + shareScope?: string; +}; + +function extractPathAfterNodeModules(filePath: string): string | null { + // Fast check for 'node_modules' substring + if (~filePath.indexOf('node_modules')) { + const nodeModulesIndex = filePath.lastIndexOf('node_modules'); + const result = filePath.substring(nodeModulesIndex + 13); // 13 = 'node_modules/'.length + return result; + } + return null; +} + +function inferPkgVersionFromResource(resource: string): string | undefined { + try { + const nmIndex = resource.lastIndexOf('node_modules'); + if (nmIndex === -1) { + return undefined; + } + const after = resource.substring(nmIndex + 'node_modules'.length + 1); + + // pnpm layout: node_modules/.pnpm//node_modules//... + if (after.startsWith('.pnpm/')) { + const m = after.match(/\.pnpm\/(?:[^/]+)@([^/]+)\/node_modules\//); + if (m && m[1]) { + return m[1]; + } + } + + const parts = after.split(/[\\/]+/).filter(Boolean); + if (!parts.length) { + return undefined; + } + let pkgPathParts: string[]; + if (parts[0].startsWith('@') && parts.length >= 2) { + pkgPathParts = [parts[0], parts[1]]; + } else { + pkgPathParts = [parts[0]]; + } + const nmBase = resource.substring(0, nmIndex + 'node_modules'.length + 1); + const pkgJsonPath = path.join(nmBase, ...pkgPathParts, 'package.json'); + try { + const content = fs.readFileSync(pkgJsonPath, 'utf-8'); + const pkg = JSON.parse(content); + const v = pkg?.version; + if (typeof v === 'string' && v) { + return v; + } + } catch { + // ignore + } + return undefined; + } catch { + return undefined; + } +} + +class CollectSharedEntryPlugin { + name = PLUGIN_NAME; + + sharedOptions: NormalizedSharedOptions; + private _collectedEntries: ShareRequestsMap; + + constructor(options: CollectSharedEntryPluginOptions) { + this.name = PLUGIN_NAME; + + const { sharedOptions } = options; + + this.sharedOptions = sharedOptions; + this._collectedEntries = {}; + } + + getData() { + return this._collectedEntries; + } + + apply(compiler: Compiler): void { + const { sharedOptions } = this; + const { _collectedEntries: collectedEntries } = this; + compiler.hooks.compilation.tap( + 'CollectSharedEntryPlugin', + (_compilation, { normalModuleFactory }) => { + const matchProvides = new Map(); + + normalModuleFactory.hooks.module.tap( + 'CollectSharedEntryPlugin', + (module, { resource }, resolveData) => { + if ( + !resource || + !sharedOptions.find((item) => item[0] === (resource as string)) + ) { + return module; + } + + const { request: originalRequestString } = resolveData; + const modulePathAfterNodeModules = + extractPathAfterNodeModules(resource); + if (modulePathAfterNodeModules) { + // 2a. Direct match with reconstructed path + const reconstructedLookupKey = modulePathAfterNodeModules; + const configFromReconstructedDirect = matchProvides.get( + reconstructedLookupKey, + ); + if ( + configFromReconstructedDirect?.nodeModulesReconstructedLookup + ) { + const entry = (collectedEntries[resource] ||= { requests: [] }); + const version = inferPkgVersionFromResource(resource); + if (!version) { + throw new Error( + `Cannot infer version from resource ${resource}`, + ); + } + const exists = entry.requests.some( + ([req, ver]) => + req === originalRequestString && ver === version, + ); + if (!exists) { + entry.requests.push([originalRequestString, version]); + } + resolveData.cacheable = false; + } + } + return module; + }, + ); + }, + ); + + compiler.hooks.thisCompilation.tap( + 'Collect shared entry', + (compilation) => { + compilation.hooks.processAssets.tapPromise( + { + name: 'CollectSharedEntry', + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE, + }, + async () => { + compilation.getAssets().forEach((asset) => { + compilation.deleteAsset(asset.name); + }); + }, + ); + }, + ); + } +} + +export default CollectSharedEntryPlugin; diff --git a/packages/enhanced/src/lib/sharing/treeshake/IndependentSharedPlugin.ts b/packages/enhanced/src/lib/sharing/treeshake/IndependentSharedPlugin.ts new file mode 100644 index 00000000000..61adf5a516c --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/IndependentSharedPlugin.ts @@ -0,0 +1,407 @@ +import * as fs from 'node:fs'; +import * as path from 'node:path'; +import type { + WebpackPluginInstance, + Compiler, + Configuration, + WebpackOptionsNormalized, +} from 'webpack'; +import type { moduleFederationPlugin, Stats } from '@module-federation/sdk'; +import { + encodeName, + isRequiredVersion, + StatsFileName, +} from '@module-federation/sdk'; +import CollectSharedEntryPlugin, { + type ShareRequestsMap, +} from './CollectSharedEntryPlugin'; +import SharedUsedExportsOptimizerPlugin from './SharedUsedExportsOptimizerPlugin'; +import SharedContainerPlugin, { + SharedContainerPluginOptions, +} from './SharedContainerPlugin/SharedContainerPlugin'; +import { parseOptions } from '../../container/options'; +import type { SharedConfig } from '../../../declarations/plugins/sharing/SharePlugin'; +import ConsumeSharedPlugin from '../ConsumeSharedPlugin'; +import { NormalizedSharedOptions } from '../SharePlugin'; +import IndependentSharedRuntimeModule from './IndependentSharedRuntimeModule'; + +const IGNORED_ENTRY = 'ignored-entry'; + +// { react: [ [ react/19.0.0/index.js , 19.0.0, react_global_name ] ] } +export type ShareFallback = Record; + +export type MakeRequired = Required> & + Omit; + +const filterPlugin = (plugin: WebpackOptionsNormalized['plugins'][0]) => { + if (!plugin) { + return true; + } + const pluginName = plugin['name'] || plugin['constructor']?.name; + if (!pluginName) { + return true; + } + return ![ + 'IndependentSharedPlugin', + 'ModuleFederationPlugin', + 'SharedUsedExportsOptimizerPlugin', + 'HtmlWebpackPlugin', + ].includes(pluginName); +}; + +export interface IndependentSharePluginOptions { + name: string; + shared: moduleFederationPlugin.Shared; + library?: moduleFederationPlugin.LibraryOptions; + outputDir?: string; + outputFilePath?: string; + plugins?: WebpackPluginInstance[]; + treeshake?: boolean; + manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest']; + injectUsedExports?: boolean; +} + +export default class IndependentSharedPlugin { + mfName: string; + shared: moduleFederationPlugin.Shared; + library?: moduleFederationPlugin.LibraryOptions; + sharedOptions: NormalizedSharedOptions; + outputDir: string; + outputFilePath?: string; + plugins: WebpackPluginInstance[]; + treeshake?: boolean; + manifest?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest']; + injectUsedExports?: boolean; + buildAssets: ShareFallback = {}; + + name = 'IndependentSharedPlugin'; + constructor(options: IndependentSharePluginOptions) { + const { + outputDir, + outputFilePath, + plugins, + treeshake, + shared, + name, + manifest, + injectUsedExports, + library, + } = options; + this.shared = shared; + this.mfName = name; + this.outputDir = outputFilePath ? '' : outputDir || 'independent-packages'; + this.outputFilePath = outputFilePath; + this.plugins = plugins || []; + this.treeshake = treeshake; + this.manifest = manifest; + this.injectUsedExports = injectUsedExports ?? true; + this.library = library; + this.sharedOptions = parseOptions( + shared, + (item, key) => { + if (typeof item !== 'string') + throw new Error( + `Unexpected array in shared configuration for key "${key}"`, + ); + const config: SharedConfig = + item === key || !isRequiredVersion(item) + ? { + import: item, + } + : { + import: key, + requiredVersion: item, + }; + + return config; + }, + (item) => { + return item; + }, + ); + } + + static IndependentShareBuildAssetsFilename = + 'independent-share-build-assets.json'; + + apply(compiler: Compiler) { + const { manifest } = this; + + compiler.hooks.beforeRun.tapAsync( + 'IndependentSharedPlugin', + async (compiler, callback) => { + await this.createIndependentCompilers(compiler); + callback(); + }, + ); + + // inject buildAssets to stats + if (!manifest) { + return; + } + compiler.hooks.compilation.tap('IndependentSharedPlugin', (compilation) => { + compilation.hooks.additionalTreeRuntimeRequirements.tap( + 'OptimizeDependencyReferencedExportsPlugin', + (chunk) => { + compilation.addRuntimeModule( + chunk, + new IndependentSharedRuntimeModule( + this.buildAssets, + this.library?.type || 'global', + ), + ); + }, + ); + + compilation.hooks.processAssets.tapPromise( + { + name: 'injectReferenceExports', + stage: + // biome-ignore lint/suspicious/noExplicitAny: + (compilation.constructor as any) + .PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER, + }, + async () => { + const stats = compilation.getAsset(StatsFileName); + if (!stats) { + return; + } + const statsContent = JSON.parse( + stats.source.source().toString(), + ) as Stats; + + const { shared } = statsContent; + Object.entries(this.buildAssets).forEach(([key, item]) => { + const targetShared = shared.find((s) => s.name === key); + if (!targetShared) { + return; + } + item.forEach(([entry, version, globalName]) => { + if (version === targetShared.version) { + targetShared.fallback = entry; + targetShared.fallbackName = globalName; + } + }); + }); + + compilation.updateAsset( + StatsFileName, + new compiler.webpack.sources.RawSource( + JSON.stringify(statsContent), + ), + ); + }, + ); + }); + } + + private createEntry() { + const { sharedOptions } = this; + const entryContent = sharedOptions.reduce((acc, cur, index) => { + return `${acc}import shared_${index} from '${cur[0]}';\n`; + }, ''); + const entryPath = path.resolve( + 'node_modules', + '.federation', + // name, + 'shared-entry.js', + ); + fs.writeFileSync(entryPath, entryContent); + return entryPath; + } + + private async createIndependentCompilers(parentCompiler: Compiler) { + const { sharedOptions } = this; + console.log('🚀 Start creating a standalone compiler...'); + + // const subOutputDir = path.join(path.dirname(parentCompiler.options.output.path||'') || '', outputDir); + // const fullOutputDir = path.resolve(parentCompiler.context,subOutputDir); + // if (!fs.existsSync(fullOutputDir)) { + // fs.mkdirSync(fullOutputDir, { recursive: true }); + // } + + const parentOutputDir = parentCompiler.options.output.path + ? path.basename(parentCompiler.options.output.path) + : ''; + const shareRequestsMap: ShareRequestsMap = + await this.createIndependentCompiler(parentCompiler, parentOutputDir); + + await Promise.all( + sharedOptions.map(async ([shareName, shareConfig]) => { + if (!shareConfig.treeshake) { + return; + } + const shareRequests = shareRequestsMap[shareName].requests; + await Promise.all( + shareRequests.map(async ([request, version]) => { + const sharedConfig = sharedOptions.find( + ([name]) => name === shareName, + )?.[1]; + const [shareFileName, globalName, sharedVersion] = + await this.createIndependentCompiler( + parentCompiler, + parentOutputDir, + { + shareRequestsMap, + currentShare: { + shareName, + version, + request, + independentShareFileName: + sharedConfig?.independentShareFileName, + }, + }, + ); + if (typeof shareFileName === 'string') { + this.buildAssets[shareName] ||= []; + this.buildAssets[shareName].push([ + shareFileName, + sharedVersion, + globalName, + ]); + } + }), + ); + }), + ); + + console.log('✅ All independent packages have been compiled successfully'); + } + + private async createIndependentCompiler( + parentCompiler: Compiler, + parentOutputDir: string, + extraOptions?: { + currentShare: Omit; + shareRequestsMap: ShareRequestsMap; + }, + ) { + const { treeshake, plugins, outputDir, sharedOptions, mfName, library } = + this; + const outputDirWithShareName = path.join( + outputDir, + encodeName(extraOptions?.currentShare?.shareName || ''), + ); + + const parentConfig = parentCompiler.options; + + const finalPlugins = []; + let extraPlugin: CollectSharedEntryPlugin | SharedContainerPlugin; + if (!extraOptions) { + extraPlugin = new CollectSharedEntryPlugin({ + sharedOptions, + }); + } else { + extraPlugin = new SharedContainerPlugin({ + mfName: mfName, + library: library, + ...extraOptions.currentShare, + }); + (parentConfig.plugins || []).forEach((plugin) => { + if ( + plugin !== undefined && + typeof plugin !== 'string' && + filterPlugin(plugin) + ) { + finalPlugins.push(plugin); + } + }); + plugins.forEach((plugin) => { + finalPlugins.push(plugin); + }); + finalPlugins.push( + new ConsumeSharedPlugin({ + consumes: sharedOptions + .filter( + ([key, options]) => + extraOptions?.currentShare.shareName !== + (options.shareKey || key), + ) + .map(([key, options]) => ({ + [key]: { + import: !extraOptions ? options.import : false, + shareKey: options.shareKey || key, + shareScope: options.shareScope, + requiredVersion: options.requiredVersion, + strictVersion: options.strictVersion, + singleton: options.singleton, + packageName: options.packageName, + eager: options.eager, + }, + })), + }), + ); + + if (treeshake) { + finalPlugins.push( + new SharedUsedExportsOptimizerPlugin( + sharedOptions, + this.injectUsedExports, + [IGNORED_ENTRY], + ), + ); + } + } + finalPlugins.push(extraPlugin); + const fullOutputDir = path.resolve( + parentCompiler.context, + parentOutputDir, + outputDirWithShareName, + ); + // @ts-ignore webpack version is not the same as the one used in the plugin + const compilerConfig: Configuration = { + ...parentConfig, + mode: parentConfig.mode || 'development', + ignoreWarnings: [], + entry: { + [IGNORED_ENTRY]: this.createEntry(), + }, + + // 输出配置 + output: { + path: fullOutputDir, + clean: true, + publicPath: parentConfig.output?.publicPath || 'auto', + }, + + // 插件继承 + plugins: finalPlugins, + + // 优化配置继承 + optimization: { + ...parentConfig.optimization, + splitChunks: false, // 每个包独立,不拆分 + }, + }; + + // 创建独立的 webpack compiler 实例 + const webpack = parentCompiler.webpack; + const compiler = webpack.webpack(compilerConfig); + + // 设置文件系统 + compiler.inputFileSystem = parentCompiler.inputFileSystem; + compiler.outputFileSystem = parentCompiler.outputFileSystem; + compiler.intermediateFileSystem = parentCompiler.intermediateFileSystem; + + const { currentShare, shareRequestsMap } = extraOptions || {}; + + return new Promise((resolve, reject) => { + compiler.run((err: any, stats: any) => { + if (err || stats?.hasErrors()) { + console.error( + `❌ 独立包 ${currentShare?.shareName} 编译失败:`, + err || stats?.toString(), + ); + reject( + err || new Error(`独立包 ${currentShare?.shareName} 编译失败`), + ); + return; + } + + shareRequestsMap && console.log(`✅ 独立包 ${currentShare} 编译成功`); + + resolve(extraPlugin.getData()); + }); + }); + } +} diff --git a/packages/enhanced/src/lib/sharing/treeshake/IndependentSharedRuntimeModule.ts b/packages/enhanced/src/lib/sharing/treeshake/IndependentSharedRuntimeModule.ts new file mode 100644 index 00000000000..f66fe62261c --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/IndependentSharedRuntimeModule.ts @@ -0,0 +1,102 @@ +import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import { getFederationGlobalScope } from '../../container/runtime/utils'; +import { ShareFallback } from './IndependentSharedPlugin'; +import type { Compilation } from 'webpack'; + +/** + * Map of shared module name to Map of runtime id to Set of exported names + * @example { + * 'antd': { + * 'main': Set(['Button', 'exportedName2']), + * }, + * } + */ +export type ReferencedExports = Map>>; + +const { Template, RuntimeGlobals, RuntimeModule } = require( + normalizeWebpackPath('webpack'), +) as typeof import('webpack'); + +class IndependentSharedRuntimeModule extends RuntimeModule { + buildAssets: ShareFallback = {}; + libraryType = 'global'; + + constructor(buildAssets: ShareFallback, libraryType: string) { + super('shared-fallback', RuntimeModule.STAGE_ATTACH); + this.buildAssets = buildAssets; + this.libraryType = libraryType; + } + + /** + * @returns {string | null} runtime code + */ + override generate(): string | null { + if (!this.buildAssets || !Object.keys(this.buildAssets).length) { + return null; + } + const { compilation, chunkGraph } = this; + const { runtimeTemplate, moduleGraph } = compilation as Compilation; + + const federationGlobal = getFederationGlobalScope(RuntimeGlobals); + // const getSharedFallbackGetter = (shareKey, factory, version) => { + // // { react: [ [ react/19.0.0/index.js , 19.0.0, react_global_name, var ] ] } + // const fallbackItems = shareFallbacks[shareKey]; + // if (!fallbackItems) { + // return factory; + // } + // const fallbackItem = version + // ? fallbackItems.find(item => item[1] === version) + // : fallbackItems[0]; + // return () => + // __webpack_require__.federation.runtime + // .getRemoteEntry({ + // origin, + // remoteInfo: { + // name: globalName, + // entry: `${webpackRequire.p}${filepath}`, + // type, + // entryGlobalName: globalName + // } + // }) + // .then(shareEntry => + // shareEntry.init(origin, bundlerRuntime).then(() => shareEntry.get()) + // ); + // }; + + return Template.asString([ + `${federationGlobal}.sharedFallback = ${JSON.stringify(this.buildAssets)};`, + `${federationGlobal}.libraryType = ${JSON.stringify(this.libraryType)};`, + + // `var getSharedFallbackGetter = ${runtimeTemplate.basicFunction( + // 'shareKey, factory, version', + // [ + // `var fallbackItems = fallbackSharedAssets[shareKey];`, + // `if (!fallbackItems) {`, + // ` return factory;`, + // `}`, + // `var fallbackItem = version`, + // ` ? fallbackItems.find(item => item[1] === version)`, + // ` : fallbackItems[0];`, + // `return function getSharedFallback() {`, + // ` return __webpack_require__.federation.runtime`, + // ` .getRemoteEntry({`, + // ` origin,`, + // ` remoteInfo: {`, + // ` name: globalName,`, + // ` entry: ${RuntimeGlobals.publicPath} + fallbackItem[0],`, + // ` type: fallbackItem[3],`, + // ` entryGlobalName: fallbackItem[2]`, + // ` }`, + // ` })`, + // ` .then(shareEntry =>`, + // ` shareEntry.init(origin, bundlerRuntime).then(() => shareEntry.get())`, + // ` );`, + // `}`, + // ], + // )}`, + `${federationGlobal}.sharedFallback = getSharedFallbackGetter;`, + ]); + } +} + +export default IndependentSharedRuntimeModule; diff --git a/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedContainerPlugin.ts b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedContainerPlugin.ts new file mode 100644 index 00000000000..1d854f20ba8 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedContainerPlugin.ts @@ -0,0 +1,176 @@ +import type { moduleFederationPlugin } from '@module-federation/sdk'; +import { assert, encodeName } from '@module-federation/sdk'; +import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; + +import type { Compilation, Compiler, WebpackError } from 'webpack'; +import type { ShareRequestsMap } from '../CollectSharedEntryPlugin'; +import SharedDependency from './SharedDependency'; +import SharedEntryDependency from './SharedEntryDependency'; +import SharedEntryModuleFactory from './SharedEntryModuleFactory'; +import { getFederationGlobalScope } from '../../../container/runtime/utils'; +import FederationRuntimeModule from '../../../container/runtime/FederationRuntimeModule'; + +const EntryDependency = require( + normalizeWebpackPath('webpack/lib/dependencies/EntryDependency'), +) as typeof import('webpack/lib/dependencies/EntryDependency'); + +const PLUGIN_NAME = 'SharedContainerPlugin'; +const HOT_UPDATE_SUFFIX = '.hot-update'; + +export type SharedContainerPluginOptions = { + mfName: string; + shareName: string; + version: string; + request: string; + library?: moduleFederationPlugin.LibraryOptions; + independentShareFileName?: string; +}; + +class SharedContainerPlugin { + filename = ''; + _options: { + name: string; + request: string; + version: string; + fileName: string; + library: moduleFederationPlugin.LibraryOptions; + }; + _shareName: string; + _globalName: string; + + constructor(options: SharedContainerPluginOptions) { + const { mfName, shareName, request, library, independentShareFileName } = + options; + const version = options.version || '0.0.0'; + this._globalName = encodeName(`${mfName}_${shareName}_${version}`); + const fileName = independentShareFileName || `${version}/share-entry.js`; + this._shareName = shareName; + this._options = { + name: shareName, + request: request, + library: (library + ? { ...library, name: this._globalName } + : undefined) || { + type: 'global', + name: this._globalName, + }, + version, + fileName, + }; + } + + getData() { + return [this._options.fileName, this._globalName, this._options.version]; + } + + apply(compiler: Compiler): void { + const { library, name, request, fileName } = this._options; + + if ( + library.type && + compiler.options.output && + compiler.options.output.enabledLibraryTypes && + !compiler.options.output.enabledLibraryTypes.includes(library.type) + ) { + compiler.options.output.enabledLibraryTypes.push(library.type); + } + + compiler.hooks.make.tapAsync( + PLUGIN_NAME, + async ( + compilation: Compilation, + callback: (error?: WebpackError | null | undefined) => void, + ) => { + const dep = new SharedEntryDependency(name, request); + dep.loc = { name: name }; + + compilation.addEntry( + compilation.options.context || '', + dep, + { + name: name, + filename: fileName, + library: { + type: library.type!, + name: this._globalName, + }, + }, + (error: WebpackError | null | undefined) => { + if (error) { + throw error; + } + }, + ); + + callback(); + }, + ); + + // add the container entry module + compiler.hooks.thisCompilation.tap( + PLUGIN_NAME, + (compilation: Compilation, { normalModuleFactory }) => { + compilation.dependencyFactories.set( + SharedEntryDependency, + new SharedEntryModuleFactory(), + ); + + compilation.dependencyFactories.set( + SharedDependency, + normalModuleFactory, + ); + + if (!compilation.dependencyFactories.has(EntryDependency)) { + compilation.dependencyFactories.set( + EntryDependency, + normalModuleFactory, + ); + } + + compilation.hooks.additionalTreeRuntimeRequirements.tap( + PLUGIN_NAME, + (chunk, set) => { + set.add(getFederationGlobalScope(compiler.webpack.RuntimeGlobals)); + set.add(compiler.webpack.RuntimeGlobals.runtimeId); + compilation.addRuntimeModule( + chunk, + new FederationRuntimeModule(set, name, { name, remotes: [] }), + ); + }, + ); + + compilation.hooks.processAssets.tapPromise( + { + name: 'getManifestFileName', + stage: + // @ts-ignore use runtime variable in case peer dep not installed + compilation.constructor.PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER, + }, + async () => { + const remoteEntryPoint = compilation.entrypoints.get(name); + assert(remoteEntryPoint, `Can not get shared ${name} entryPoint!`); + const remoteEntryNameChunk = compilation.namedChunks.get(name); + assert(remoteEntryNameChunk, `Can not get shared ${name} chunk!`); + + const files = Array.from( + remoteEntryNameChunk.files as Iterable, + ).filter( + (f: string) => + !f.includes(HOT_UPDATE_SUFFIX) && !f.endsWith('.css'), + ); + assert(files.length > 0, `no files found for shared ${name} chunk`); + assert( + files.length === 1, + `shared ${name} chunk should not have multiple files!, current files: ${files.join( + ',', + )}`, + ); + this.filename = files[0]; + }, + ); + }, + ); + } +} + +export default SharedContainerPlugin; diff --git a/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedDependency.ts b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedDependency.ts new file mode 100644 index 00000000000..f60d7aa51e9 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedDependency.ts @@ -0,0 +1,63 @@ +import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; + +const makeSerializable = require( + normalizeWebpackPath('webpack/lib/util/makeSerializable'), +) as typeof import('webpack/lib/util/makeSerializable'); +const { dependencies } = require( + normalizeWebpackPath('webpack'), +) as typeof import('webpack'); + +import type { + ObjectDeserializerContext, + ObjectSerializerContext, +} from 'webpack/lib/dependencies/ModuleDependency'; + +class SharedDependency extends dependencies.ModuleDependency { + sharedName: string; + override request: string; + + /** + * @param {string} sharedName public name + * @param {string} request request to module + */ + constructor(sharedName: string, request: string) { + super(request); + this.sharedName = sharedName; + this.request = request; + } + + override get type(): string { + return 'shared exposed'; + } + + override get category(): string { + return 'esm'; + } + + /** + * @returns {string | null} an identifier to merge equal requests + */ + override getResourceIdentifier(): string | null { + return `shared dependency ${this.sharedName}=${this.request}`; + } + + /** + * @param {ObjectSerializerContext} context context + */ + override serialize(context: ObjectSerializerContext): void { + context.write(this.sharedName); + super.serialize(context); + } + + /** + * @param {ObjectDeserializerContext} context context + */ + override deserialize(context: ObjectDeserializerContext): void { + this.sharedName = context.read(); + super.deserialize(context); + } +} + +makeSerializable(SharedDependency, 'SharedDependency'); + +export default SharedDependency; diff --git a/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryDependency.ts b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryDependency.ts new file mode 100644 index 00000000000..47ec51e56a5 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryDependency.ts @@ -0,0 +1,45 @@ +import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; + +const makeSerializable = require( + normalizeWebpackPath('webpack/lib/util/makeSerializable'), +); +const { Dependency } = require( + normalizeWebpackPath('webpack'), +) as typeof import('webpack'); + +class SharedEntryDependency extends Dependency { + public name: string; + public request: string; + + /** + * @param {string} name entry name + * @param {string} request the request of the entry + */ + constructor(name: string, request: string) { + super(); + this.name = name; + this.request = request; + } + + /** + * @returns {string | null} an identifier to merge equal requests + */ + override getResourceIdentifier(): string | null { + return `shared-entry-${this.name}`; + } + + override get type(): string { + return 'shared entry'; + } + + override get category(): string { + return 'esm'; + } +} + +makeSerializable( + SharedEntryDependency, + 'enhanced/lib/container/SharedEntryDependency', +); + +export default SharedEntryDependency; diff --git a/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryModule.ts b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryModule.ts new file mode 100644 index 00000000000..d99fad53c06 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryModule.ts @@ -0,0 +1,223 @@ +import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import type { Compilation, Dependency } from 'webpack'; +import type { + CodeGenerationResult, + InputFileSystem, + LibIdentOptions, + NeedBuildContext, + ObjectDeserializerContext, + ObjectSerializerContext, + RequestShortener, + ResolverWithOptions, + WebpackOptions, +} from 'webpack/lib/Module'; +import type WebpackError from 'webpack/lib/WebpackError'; +import SharedDependency from './SharedDependency'; +import { getFederationGlobalScope } from '../../../container/runtime/utils'; + +const makeSerializable = require( + normalizeWebpackPath('webpack/lib/util/makeSerializable'), +) as typeof import('webpack/lib/util/makeSerializable'); +const { + sources: webpackSources, + Template, + Module, + RuntimeGlobals, +} = require(normalizeWebpackPath('webpack')) as typeof import('webpack'); +const StaticExportsDependency = require( + normalizeWebpackPath('webpack/lib/dependencies/StaticExportsDependency'), +) as typeof import('webpack/lib/dependencies/StaticExportsDependency'); + +const SOURCE_TYPES = new Set(['javascript']); + +export type ExposeOptions = { + /** + * requests to exposed modules (last one is exported) + */ + import: string[]; + /** + * custom chunk name for the exposed module + */ + name: string; +}; + +class SharedEntryModule extends Module { + private _name: string; + private _request: string; + + /** + * @param {string} name shared name + * @param {string} request request + */ + constructor(name: string, request: string) { + super('shaked-shared-module', null); + // super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, null); + this._name = name; + this._request = request; + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {SharedEntryModule} deserialized container entry module + */ + static deserialize(context: ObjectDeserializerContext): SharedEntryModule { + const { read } = context; + const obj = new SharedEntryModule(read(), read()); + obj.deserialize(context); + return obj; + } + + /** + * @returns {Set} types available (do not mutate) + */ + override getSourceTypes(): Set { + return SOURCE_TYPES; + } + /** + * @returns {string} a unique identifier of the module + */ + override identifier(): string { + return `shared module ${this._name} ${this._request}`; + } + /** + * @param {RequestShortener} requestShortener the request shortener + * @returns {string} a user readable identifier of the module + */ + override readableIdentifier(requestShortener: RequestShortener): string { + return `shared module ${this._name} ${requestShortener.shorten(this._request)}`; + } + /** + * @param {LibIdentOptions} options options + * @returns {string | null} an identifier for library inclusion + */ + override libIdent(options: LibIdentOptions): string | null { + return `shared module ${this._name}`; + } + /** + * @param {NeedBuildContext} context context info + * @param {function((WebpackError | null)=, boolean=): void} callback callback function, returns true, if the module needs a rebuild + * @returns {void} + */ + override needBuild( + context: NeedBuildContext, + callback: ( + arg0: (WebpackError | null) | undefined, + arg1: boolean | undefined, + ) => void, + ): void { + callback(null, !this.buildMeta); + } + /** + * @param {WebpackOptions} options webpack options + * @param {Compilation} compilation the compilation + * @param {ResolverWithOptions} resolver the resolver + * @param {InputFileSystem} fs the file system + * @param {function(WebpackError): void} callback callback function + * @returns {void} + */ + override build( + options: WebpackOptions, + compilation: Compilation, + resolver: ResolverWithOptions, + fs: InputFileSystem, + callback: (err?: WebpackError) => void, + ): void { + this.buildMeta = {}; + this.buildInfo = { + strict: true, + topLevelDeclarations: new Set(['get', 'init']), + }; + this.buildMeta.exportsType = 'namespace'; + this.clearDependenciesAndBlocks(); + + this.addDependency( + new StaticExportsDependency( + ['get', 'init'], + false, + ) as unknown as Dependency, + ); + + this.addDependency(new SharedDependency(this._name, this._request)); + callback(); + } + + /** + * @param {CodeGenerationContext} context context for code generation + * @returns {CodeGenerationResult} result + */ + // @ts-ignore + override codeGeneration({ + // @ts-ignore + chunkGraph, + // @ts-ignore + runtimeTemplate, + }: CodeGenerationResult) { + const sources = new Map(); + const runtimeRequirements = new Set([ + RuntimeGlobals.definePropertyGetters, + RuntimeGlobals.hasOwnProperty, + RuntimeGlobals.exports, + ]); + const moduleGetter = runtimeTemplate.syncModuleFactory({ + dependency: this.dependencies[1], + chunkGraph, + request: this._request, + runtimeRequirements, + }); + const source = Template.asString([ + `var moduleGetter = ${moduleGetter};`, + `var get = ${runtimeTemplate.basicFunction('module, getScope', [ + 'return moduleGetter();', + ])};`, + `var init = ${runtimeTemplate.basicFunction( + 'mfInstance, bundlerRuntime', + [ + `${getFederationGlobalScope(RuntimeGlobals)}.instance = mfInstance;`, + `${getFederationGlobalScope(RuntimeGlobals)}.bundlerRuntime = bundlerRuntime;`, + `return ${getFederationGlobalScope(RuntimeGlobals)}.installInitialConsumes({ asyncLoad: true });`, + ], + )};`, + '// This exports getters to disallow modifications', + `${RuntimeGlobals.definePropertyGetters}(exports, {`, + Template.indent([ + `get: ${runtimeTemplate.returningFunction('get')},`, + `init: ${runtimeTemplate.returningFunction('init')}`, + ]), + + '});', + ]); + + sources.set( + 'javascript', + this.useSourceMap || this.useSimpleSourceMap + ? new webpackSources.OriginalSource(source, 'webpack/shared-entry') + : new webpackSources.RawSource(source), + ); + + return { + sources, + runtimeRequirements, + }; + } + + /** + * @param {string=} type the source type for which the size should be estimated + * @returns {number} the estimated size of the module (must be non-zero) + */ + override size(type?: string): number { + return 42; + } + /** + * @param {ObjectSerializerContext} context context + */ + override serialize(context: ObjectSerializerContext): void { + const { write } = context; + write(this._name); + write(this._request); + super.serialize(context); + } +} + +makeSerializable(SharedEntryModule, 'SharedEntryModule'); + +export default SharedEntryModule; diff --git a/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryModuleFactory.ts b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryModuleFactory.ts new file mode 100644 index 00000000000..a0aa21e2a61 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/SharedContainerPlugin/SharedEntryModuleFactory.ts @@ -0,0 +1,34 @@ +import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import type SharedEntryDependency from './SharedEntryDependency'; +import SharedEntryModule from './SharedEntryModule'; + +const ModuleFactory = require( + normalizeWebpackPath('webpack/lib/ModuleFactory'), +) as typeof import('webpack/lib/ModuleFactory'); +import type { + ModuleFactoryCreateData, + ModuleFactoryResult, +} from 'webpack/lib/ModuleFactory'; + +export default class SharedEntryModuleFactory extends ModuleFactory { + /** + * @param {ModuleFactoryCreateData} data data object + * @param {function((Error | null)=, ModuleFactoryResult=): void} callback callback + * @returns {void} + */ + // @ts-ignore + override create( + data: ModuleFactoryCreateData, + callback: (error: Error | null, result: ModuleFactoryResult) => void, + ): void { + const { dependencies } = data; + const containerDependencies = + dependencies as unknown as SharedEntryDependency[]; + const dep = containerDependencies[0]; + + callback(null, { + // @ts-ignore + module: new SharedEntryModule(dep.name, dep.request), + }); + } +} diff --git a/packages/enhanced/src/lib/sharing/treeshake/SharedUsedExportsOptimizerPlugin.ts b/packages/enhanced/src/lib/sharing/treeshake/SharedUsedExportsOptimizerPlugin.ts new file mode 100644 index 00000000000..cd8402a2a23 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/SharedUsedExportsOptimizerPlugin.ts @@ -0,0 +1,348 @@ +import type { + WebpackPluginInstance, + Compiler, + Dependency, + dependencies, +} from 'webpack'; +import { + moduleFederationPlugin, + type Stats, + getManifestFileName, +} from '@module-federation/sdk'; +import SharedUsedExportsOptimizerRuntimeModule from './SharedUsedExportsOptimizerRuntimeModule'; +import { NormalizedSharedOptions } from '../SharePlugin'; +import ConsumeSharedModule from '../ConsumeSharedModule'; +import ProvideSharedModule from '../ProvideSharedModule'; + +type ReferencedExports = Map>>; + +export type CustomReferencedExports = { [sharedName: string]: string[] }; + +function isHarmonyImportSpecifierDependency( + dependency: Dependency, +): dependency is dependencies.HarmonyImportSpecifierDependency { + return dependency.type === 'harmony import specifier'; +} + +export default class SharedUsedExportsOptimizerPlugin + implements WebpackPluginInstance +{ + name = 'SharedUsedExportsOptimizerPlugin'; + + sharedReferencedExports: ReferencedExports; + private sharedOptions: NormalizedSharedOptions; + private injectUsedExports: boolean; + private manifestOptions: moduleFederationPlugin.ModuleFederationPluginOptions['manifest']; + ignoredRuntime: string[]; + + constructor( + sharedOptions: NormalizedSharedOptions, + injectUsedExports?: boolean, + ignoredRuntime?: string[], + manifestOptions?: moduleFederationPlugin.ModuleFederationPluginOptions['manifest'], + ) { + this.sharedOptions = sharedOptions; + this.injectUsedExports = injectUsedExports ?? true; + this.manifestOptions = manifestOptions ?? {}; + this.sharedReferencedExports = new Map(); + this.sharedOptions.forEach(([key, _config]) => { + this.sharedReferencedExports.set(key, new Map()); + }); + this.ignoredRuntime = ignoredRuntime || []; + } + + private applyCustomReferencedExports(runtimeSet: Set) { + const { sharedReferencedExports, sharedOptions } = this; + const addCustomExports = ( + shareKey: string, + runtime: string, + exports: string[], + ) => { + if (!sharedReferencedExports.get(shareKey)) { + sharedReferencedExports.set(shareKey, new Map()); + } + const sharedExports = sharedReferencedExports.get(shareKey)!; + if (!sharedExports.get(runtime)) { + sharedExports.set(runtime, new Set()); + } + const runtimeExports = sharedExports.get(runtime)!; + exports.forEach((item) => { + runtimeExports.add(item); + }); + }; + + runtimeSet.forEach((runtime) => { + if (this.ignoredRuntime.includes(runtime)) { + return; + } + sharedOptions.forEach(([shareKey, config]) => { + if (config.usedExports) { + addCustomExports(shareKey, runtime, config.usedExports); + } + }); + }); + } + + apply(compiler: Compiler) { + const { + sharedReferencedExports, + sharedOptions, + injectUsedExports, + manifestOptions, + } = this; + if (!sharedOptions.length) { + return; + } + const runtimeSet: Set = new Set(); + compiler.hooks.compilation.tap( + 'SharedUsedExportsOptimizerPlugin', + (compilation) => { + // collect referenced export + compilation.hooks.dependencyReferencedExports.tap( + 'SharedUsedExportsOptimizerPlugin', + (referencedExports, dependency, runtime) => { + runtimeSet.add(runtime as string); + if (!('request' in dependency)) { + return referencedExports; + } + const shareKey = dependency.request; + if ( + typeof shareKey !== 'string' || + !isHarmonyImportSpecifierDependency(dependency) || + sharedOptions.every(([key]) => key !== shareKey) + ) { + return referencedExports; + } + let currentReferencedExports = referencedExports; + if (dependency.ids && dependency.ids[0] === 'default') { + const { ids, referencedPropertiesInDestructuring } = dependency; + const getOriginalReferencedExports = () => { + if (referencedPropertiesInDestructuring) { + /** @type {string[][]} */ + const refs = []; + for (const key of referencedPropertiesInDestructuring) { + refs.push({ + name: ids ? ids.concat([key]) : [key], + canMangle: false, + }); + } + return refs; + } + return ids ? [ids] : [[]]; + }; + currentReferencedExports = getOriginalReferencedExports(); + } + if (!currentReferencedExports.length) { + return referencedExports; + } + + currentReferencedExports.forEach((item) => { + if (!Array.isArray(item)) { + return; + } + if (typeof runtime !== 'string') { + return; + } + item.forEach((i) => { + const moduleExports = sharedReferencedExports.get(shareKey); + if (!moduleExports) { + return; + } + let runtimeExports: Set | undefined = + moduleExports.get(runtime); + if (!runtimeExports) { + runtimeExports = new Set(); + moduleExports.set(runtime, runtimeExports); + } + runtimeExports.add(i); + }); + }); + + return referencedExports; + }, + ); + + // treeshake shared module + compilation.hooks.optimizeDependencies.tap( + { + name: 'SharedUsedExportsOptimizerPlugin', + stage: 1, + }, + (modules) => { + this.applyCustomReferencedExports(runtimeSet); + const sharedModules = [...modules].filter((m) => + ['consume-shared-module', 'provide-module'].includes(m.type), + ) as (ConsumeSharedModule | ProvideSharedModule)[]; + const moduleGraph = compilation.moduleGraph; + sharedModules.forEach((module) => { + const shareKey = + (module as ConsumeSharedModule).options?.shareKey || + // @ts-expect-error FIXME: need to add general shareKey field + (module as ProvideSharedModule)._name; + if (!shareKey) { + return; + } + if ( + !sharedOptions.find(([key]) => key === shareKey)?.[1].treeshake + ) { + return; + } + const runtimeReferenceExports = + sharedReferencedExports.get(shareKey); + if (!runtimeReferenceExports || !runtimeReferenceExports.size) { + return; + } + const realSharedModule = [...modules].find( + (m) => 'rawRequest' in m && m.rawRequest === shareKey, + ); + if (realSharedModule?.factoryMeta?.sideEffectFree !== true) { + runtimeReferenceExports.clear(); + return; + } + // mark used exports + const handleDependency = (dep: Dependency) => { + [...runtimeReferenceExports.keys()].forEach((runtime) => { + const usedExport = [ + ...(runtimeReferenceExports.get(runtime) || []), + ]; + + const referencedModule = moduleGraph.getModule(dep); + if (!referencedModule) return; + + const exportsInfo = + moduleGraph.getExportsInfo(referencedModule); + + for (let i = 0; i < usedExport.length; i++) { + const exportInfo = exportsInfo.getExportInfo(usedExport[i]); + exportInfo.setUsed( + compiler.webpack.UsageState.Used, + runtime, + ); + } + }); + }; + + module.blocks.forEach((block) => { + block.dependencies.forEach((dep) => { + handleDependency(dep); + }); + }); + + module.dependencies.forEach((dep) => { + handleDependency(dep); + }); + + module.factoryMeta ||= {}; + module.factoryMeta.sideEffectFree = true; + if (!realSharedModule) { + return; + } + const exportsInfo = + compilation.moduleGraph.getExportsInfo(realSharedModule); + let canUpdateModuleUsedStage = true; + runtimeReferenceExports.forEach((_, runtime) => { + for (const subExport of exportsInfo.exports) { + if (subExport.getUsed(runtime) !== 3) { + if ( + runtimeReferenceExports.get(runtime)?.has(subExport.name) + ) { + continue; + } + canUpdateModuleUsedStage = false; + break; + } + } + }); + if (canUpdateModuleUsedStage) { + runtimeReferenceExports.forEach((_, runtime) => { + for (const exportInfo of exportsInfo.exports) { + exportInfo.setUsedConditionally( + (used) => used === 3, + 0, + runtime, + ); + } + exportsInfo.otherExportsInfo.setUsedConditionally( + (used) => used === 3, + 0, + runtime, + ); + }); + } + }); + }, + ); + + // inject reference exports to stats + if (manifestOptions) { + compilation.hooks.processAssets.tapPromise( + { + name: 'injectReferenceExports', + stage: (compilation.constructor as any) + .PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER, + }, + async () => { + const { statsFileName } = getManifestFileName(manifestOptions); + const stats = compilation.getAsset(statsFileName); + if (!stats) { + return; + } + const statsContent = JSON.parse( + stats.source.source().toString(), + ) as Stats; + + for (const key of sharedReferencedExports.keys()) { + const sharedModule = statsContent.shared.find( + (s: any) => s.name === key, + ); + if (!sharedModule) { + continue; + } + + const sharedReferenceExports = sharedReferencedExports.get(key); + if (!sharedReferenceExports) { + continue; + } + sharedModule.usedExports = [ + ...sharedReferenceExports.entries(), + ].reduce((acc, item) => { + item[1].forEach((exportName) => { + if (!acc.includes(exportName)) { + acc.push(exportName); + } + }); + return acc; + }, [] as string[]); + } + + compilation.updateAsset( + statsFileName, + new compiler.webpack.sources.RawSource( + JSON.stringify(statsContent), + ), + ); + }, + ); + } + + if (!injectUsedExports) { + return; + } + compilation.hooks.additionalTreeRuntimeRequirements.tap( + 'SharedUsedExportsOptimizerPlugin', + (chunk, set) => { + set.add(compiler.webpack.RuntimeGlobals.runtimeId); + + // inject usedExports info to bundler runtime + compilation.addRuntimeModule( + chunk, + new SharedUsedExportsOptimizerRuntimeModule( + this.sharedReferencedExports, + ), + ); + }, + ); + }, + ); + } +} diff --git a/packages/enhanced/src/lib/sharing/treeshake/SharedUsedExportsOptimizerRuntimeModule.ts b/packages/enhanced/src/lib/sharing/treeshake/SharedUsedExportsOptimizerRuntimeModule.ts new file mode 100644 index 00000000000..8235260c5c7 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/SharedUsedExportsOptimizerRuntimeModule.ts @@ -0,0 +1,57 @@ +import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; + +import { getFederationGlobalScope } from '../../container/runtime/utils'; + +/** + * Map of shared module name to Map of runtime id to Set of exported names + * @example { + * 'antd': { + * 'main': Set(['Button', 'exportedName2']), + * }, + * } + */ +export type ReferencedExports = Map>>; + +const { Template, RuntimeGlobals, RuntimeModule } = require( + normalizeWebpackPath('webpack'), +) as typeof import('webpack'); + +class SharedUsedExportsOptimizerRuntimeModule extends RuntimeModule { + private sharedUsedExports: ReferencedExports; + + constructor(sharedUsedExports: ReferencedExports) { + super('shared-used-exports', RuntimeModule.STAGE_ATTACH); + this.sharedUsedExports = sharedUsedExports; + } + + /** + * @returns {string | null} runtime code + */ + override generate(): string | null { + if (!this.sharedUsedExports) { + return null; + } + const federationGlobal = getFederationGlobalScope(RuntimeGlobals); + return Template.asString([ + `if(!${federationGlobal}) {return;}`, + `${federationGlobal}.usedExports = ${JSON.stringify( + Array.from(this.sharedUsedExports.entries()).reduce( + (acc, [pkg, moduleMap]) => { + acc[pkg] = Array.from(moduleMap.entries()).reduce( + (modAcc, [cRuntimeId, exports]) => { + modAcc[cRuntimeId] = Array.from(exports); + + return modAcc; + }, + {} as Record, + ); + return acc; + }, + {} as Record>, + ), + )};`, + ]); + } +} + +export default SharedUsedExportsOptimizerRuntimeModule; diff --git a/packages/enhanced/src/lib/sharing/treeshake/TreeshakeSharePlugin.ts b/packages/enhanced/src/lib/sharing/treeshake/TreeshakeSharePlugin.ts new file mode 100644 index 00000000000..d94c0a454b4 --- /dev/null +++ b/packages/enhanced/src/lib/sharing/treeshake/TreeshakeSharePlugin.ts @@ -0,0 +1,69 @@ +import type { Compiler, WebpackPluginInstance } from 'webpack'; +import type { moduleFederationPlugin } from '@module-federation/sdk'; + +import SharedUsedExportsOptimizerPlugin from './SharedUsedExportsOptimizerPlugin'; +import IndependentSharedPlugin from './IndependentSharedPlugin'; +import { normalizeSharedOptions } from '../SharePlugin'; + +export interface TreeshakeSharePluginOptions { + mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions; + plugins?: WebpackPluginInstance[]; + reshake?: boolean; +} + +export default class TreeshakeSharePlugin { + mfConfig: moduleFederationPlugin.ModuleFederationPluginOptions; + outputDir: string; + plugins?: WebpackPluginInstance[]; + reshake?: boolean; + private _independentSharePlugin?: IndependentSharedPlugin; + + name = 'TreeshakeSharePlugin'; + constructor(options: TreeshakeSharePluginOptions) { + const { mfConfig, plugins, reshake } = options; + this.mfConfig = mfConfig; + this.outputDir = mfConfig.independentShareDir || 'independent-packages'; + this.plugins = plugins; + this.reshake = Boolean(reshake); + } + + apply(compiler: Compiler) { + const { mfConfig, outputDir, plugins, reshake } = this; + const { name, shared, library } = mfConfig; + if (!name) { + throw new Error('name is required'); + } + if (!shared) { + return; + } + const sharedOptions = normalizeSharedOptions(shared); + if (!sharedOptions.length) { + return; + } + + if ( + sharedOptions.some( + ([_, config]) => config.treeshake && config.import !== false, + ) + ) { + if (!reshake) { + new SharedUsedExportsOptimizerPlugin( + sharedOptions, + mfConfig.injectUsedExports, + undefined, + mfConfig.manifest, + ).apply(compiler); + } + this._independentSharePlugin = new IndependentSharedPlugin({ + name: name, + shared: shared, + outputDir, + plugins, + treeshake: reshake, + library, + manifest: mfConfig.manifest, + }); + this._independentSharePlugin.apply(compiler); + } + } +} diff --git a/packages/enhanced/src/schemas/sharing/SharePlugin.check.ts b/packages/enhanced/src/schemas/sharing/SharePlugin.check.ts index 11c9a20a6c8..1c834cca8df 100644 --- a/packages/enhanced/src/schemas/sharing/SharePlugin.check.ts +++ b/packages/enhanced/src/schemas/sharing/SharePlugin.check.ts @@ -25,6 +25,9 @@ const r = { }, singleton: { type: 'boolean' }, strictVersion: { type: 'boolean' }, + treeshake: { type: 'boolean' }, + usedExports: { type: 'array', items: { type: 'string', minLength: 1 } }, + independentShareFileName: { type: 'string', minLength: 1 }, version: { anyOf: [{ enum: [!1] }, { type: 'string' }] }, request: { type: 'string', minLength: 1 }, layer: { type: 'string', minLength: 1 }, @@ -252,26 +255,26 @@ function s( ]), !1 ); - var g = n === f; - } else g = !0; - if (g) { + var m = n === f; + } else m = !0; + if (m) { if (void 0 !== r.version) { const e = f; if ('string' != typeof r.version) return ( (s.errors = [{ params: { type: 'string' } }]), !1 ); - g = e === f; - } else g = !0; - if (g) + m = e === f; + } else m = !0; + if (m) if (void 0 !== r.fallbackVersion) { const e = f; if ('string' != typeof r.fallbackVersion) return ( (s.errors = [{ params: { type: 'string' } }]), !1 ); - g = e === f; - } else g = !0; + m = e === f; + } else m = !0; } } } @@ -293,8 +296,8 @@ function s( }; null === p ? (p = [e]) : p.push(e), f++; } - var m = i === f; - if (((a = a || m), !a)) { + var g = i === f; + if (((a = a || g), !a)) { const r = f; if (f == f) if ('string' == typeof e) { @@ -306,7 +309,7 @@ function s( const r = { params: { type: 'string' } }; null === p ? (p = [r]) : p.push(r), f++; } - (m = r === f), (a = a || m); + (g = r === f), (a = a || g); } if (!a) { const r = { params: {} }; @@ -458,63 +461,56 @@ function s( u = r === f; } else u = !0; if (u) { - if (void 0 !== n.version) { - let e = n.version; - const t = f, - o = f; - let a = !1; - const i = f; - if (!1 !== e) { - const e = { - params: { - allowedValues: - r.properties.version.anyOf[0].enum, - }, - }; - null === p ? (p = [e]) : p.push(e), f++; - } - var b = i === f; - if (((a = a || b), !a)) { - const r = f; - if ('string' != typeof e) { - const r = { params: { type: 'string' } }; - null === p ? (p = [r]) : p.push(r), f++; - } - (b = r === f), (a = a || b); - } - if (!a) { - const r = { params: {} }; + if (void 0 !== n.treeshake) { + const r = f; + if ('boolean' != typeof n.treeshake) return ( - null === p ? (p = [r]) : p.push(r), - f++, - (s.errors = p), + (s.errors = [ + { params: { type: 'boolean' } }, + ]), !1 ); - } - (f = o), - null !== p && (o ? (p.length = o) : (p = null)), - (u = t === f); + u = r === f; } else u = !0; if (u) { - if (void 0 !== n.request) { - let r = n.request; + if (void 0 !== n.usedExports) { + let r = n.usedExports; const e = f; if (f === e) { - if ('string' != typeof r) + if (!Array.isArray(r)) return ( (s.errors = [ - { params: { type: 'string' } }, + { params: { type: 'array' } }, ]), !1 ); - if (r.length < 1) - return (s.errors = [{ params: {} }]), !1; + { + const e = r.length; + for (let t = 0; t < e; t++) { + let e = r[t]; + const n = f; + if (f === n) { + if ('string' != typeof e) + return ( + (s.errors = [ + { params: { type: 'string' } }, + ]), + !1 + ); + if (e.length < 1) + return ( + (s.errors = [{ params: {} }]), !1 + ); + } + if (n !== f) break; + } + } } u = e === f; } else u = !0; if (u) { - if (void 0 !== n.layer) { - let r = n.layer; + if (void 0 !== n.independentShareFileName) { + let r = n.independentShareFileName; const e = f; if (f === e) { if ('string' != typeof r) @@ -530,41 +526,129 @@ function s( u = e === f; } else u = !0; if (u) { - if (void 0 !== n.issuerLayer) { - let r = n.issuerLayer; - const e = f; - if (f === e) { - if ('string' != typeof r) - return ( - (s.errors = [ - { params: { type: 'string' } }, - ]), - !1 - ); - if (r.length < 1) - return ( - (s.errors = [{ params: {} }]), !1 - ); + if (void 0 !== n.version) { + let e = n.version; + const t = f, + o = f; + let a = !1; + const i = f; + if (!1 !== e) { + const e = { + params: { + allowedValues: + r.properties.version.anyOf[0].enum, + }, + }; + null === p ? (p = [e]) : p.push(e), f++; } - u = e === f; - } else u = !0; - if (u) - if ( - void 0 !== n.allowNodeModulesSuffixMatch - ) { + var b = i === f; + if (((a = a || b), !a)) { const r = f; - if ( - 'boolean' != - typeof n.allowNodeModulesSuffixMatch - ) - return ( - (s.errors = [ - { params: { type: 'boolean' } }, - ]), - !1 - ); - u = r === f; + if ('string' != typeof e) { + const r = { + params: { type: 'string' }, + }; + null === p ? (p = [r]) : p.push(r), f++; + } + (b = r === f), (a = a || b); + } + if (!a) { + const r = { params: {} }; + return ( + null === p ? (p = [r]) : p.push(r), + f++, + (s.errors = p), + !1 + ); + } + (f = o), + null !== p && + (o ? (p.length = o) : (p = null)), + (u = t === f); + } else u = !0; + if (u) { + if (void 0 !== n.request) { + let r = n.request; + const e = f; + if (f === e) { + if ('string' != typeof r) + return ( + (s.errors = [ + { params: { type: 'string' } }, + ]), + !1 + ); + if (r.length < 1) + return ( + (s.errors = [{ params: {} }]), !1 + ); + } + u = e === f; } else u = !0; + if (u) { + if (void 0 !== n.layer) { + let r = n.layer; + const e = f; + if (f === e) { + if ('string' != typeof r) + return ( + (s.errors = [ + { params: { type: 'string' } }, + ]), + !1 + ); + if (r.length < 1) + return ( + (s.errors = [{ params: {} }]), !1 + ); + } + u = e === f; + } else u = !0; + if (u) { + if (void 0 !== n.issuerLayer) { + let r = n.issuerLayer; + const e = f; + if (f === e) { + if ('string' != typeof r) + return ( + (s.errors = [ + { + params: { type: 'string' }, + }, + ]), + !1 + ); + if (r.length < 1) + return ( + (s.errors = [{ params: {} }]), + !1 + ); + } + u = e === f; + } else u = !0; + if (u) + if ( + void 0 !== + n.allowNodeModulesSuffixMatch + ) { + const r = f; + if ( + 'boolean' != + typeof n.allowNodeModulesSuffixMatch + ) + return ( + (s.errors = [ + { + params: { type: 'boolean' }, + }, + ]), + !1 + ); + u = r === f; + } else u = !0; + } + } + } } } } diff --git a/packages/enhanced/src/schemas/sharing/SharePlugin.json b/packages/enhanced/src/schemas/sharing/SharePlugin.json index 74b9525a690..cb8e8b341f3 100644 --- a/packages/enhanced/src/schemas/sharing/SharePlugin.json +++ b/packages/enhanced/src/schemas/sharing/SharePlugin.json @@ -98,6 +98,23 @@ "description": "Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified).", "type": "boolean" }, + "treeshake": { + "description": "Enable tree-shaking for the shared module.", + "type": "boolean" + }, + "usedExports": { + "description": "List of export names used from the shared module to support tree-shaking.", + "type": "array", + "items": { + "type": "string", + "minLength": 1 + } + }, + "independentShareFileName": { + "description": "Custom file name for independent share build/output.", + "type": "string", + "minLength": 1 + }, "version": { "description": "Version of the provided module. Will replace lower matching versions, but not higher.", "anyOf": [ diff --git a/packages/enhanced/src/schemas/sharing/SharePlugin.ts b/packages/enhanced/src/schemas/sharing/SharePlugin.ts index ef427886ccc..5e236e31184 100644 --- a/packages/enhanced/src/schemas/sharing/SharePlugin.ts +++ b/packages/enhanced/src/schemas/sharing/SharePlugin.ts @@ -116,6 +116,24 @@ export default { 'Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified).', type: 'boolean', }, + treeshake: { + description: 'Enable tree-shaking for the shared module.', + type: 'boolean', + }, + usedExports: { + description: + 'List of export names used from the shared module to support tree-shaking.', + type: 'array', + items: { + type: 'string', + minLength: 1, + }, + }, + independentShareFileName: { + description: 'Custom file name for independent share build/output.', + type: 'string', + minLength: 1, + }, version: { description: 'Version of the provided module. Will replace lower matching versions, but not higher.', diff --git a/packages/enhanced/src/wrapper/AsyncBoundaryPlugin.ts b/packages/enhanced/src/wrapper/AsyncBoundaryPlugin.ts index 4df60ed0aef..11ed17eb0b7 100644 --- a/packages/enhanced/src/wrapper/AsyncBoundaryPlugin.ts +++ b/packages/enhanced/src/wrapper/AsyncBoundaryPlugin.ts @@ -1,24 +1,10 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; import type { Options } from '../lib/container/AsyncBoundaryPlugin'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'AsyncBoundaryPlugin'; -export default class AsyncBoundaryPlugin implements WebpackPluginInstance { - private _options: Options; - name: string; - +export default class AsyncBoundaryPlugin extends BaseWrapperPlugin { constructor(options: Options) { - this._options = options; - this.name = PLUGIN_NAME; - } - - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreAsyncBoundaryPlugin = - require('../lib/container/AsyncBoundaryPlugin') - .default as typeof import('../lib/container/AsyncBoundaryPlugin').default; - new CoreAsyncBoundaryPlugin(this._options).apply(compiler); + super(options, PLUGIN_NAME, '../lib/container/AsyncBoundaryPlugin'); } } diff --git a/packages/enhanced/src/wrapper/BaseWrapperPlugin.ts b/packages/enhanced/src/wrapper/BaseWrapperPlugin.ts new file mode 100644 index 00000000000..f497f905007 --- /dev/null +++ b/packages/enhanced/src/wrapper/BaseWrapperPlugin.ts @@ -0,0 +1,54 @@ +import type { WebpackPluginInstance, Compiler } from 'webpack'; +import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; + +/** + * Base Wrapper Plugin Class + * + * Why we need a Wrapper layer: + * 1. Prevent direct references to peer dependency webpack in CommonJS environment, which can lead to inconsistent instances + * 2. Ensure the FEDERATION_WEBPACK_PATH environment variable is set correctly, which is crucial for module federation to work properly + * 3. Provide unified plugin initialization logic, reducing code duplication + * + * Why we need to set FEDERATION_WEBPACK_PATH: + * In CommonJS environment, require('webpack') might get a different webpack version than the current compiler instance, + * which can cause module federation to malfunction. By setting FEDERATION_WEBPACK_PATH, we ensure all internal + * dependencies use the same webpack instance as the current compiler. + */ +export default abstract class BaseWrapperPlugin + implements WebpackPluginInstance +{ + protected _options: any; + name: string; + protected pluginName: string; + protected coreModulePath: string; + + constructor(options: any, pluginName: string, coreModulePath: string) { + this._options = options; + this.pluginName = pluginName; + this.coreModulePath = coreModulePath; + this.name = pluginName; + } + + apply(compiler: Compiler): void { + // Ensure FEDERATION_WEBPACK_PATH environment variable is set correctly + process.env['FEDERATION_WEBPACK_PATH'] = + process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); + + // Dynamically import core plugin + const CorePlugin = require(this.coreModulePath).default as any; + + // Create core plugin instance and apply it + this.createCorePluginInstance(CorePlugin, compiler); + } + + /** + * Create core plugin instance + * Subclasses can override this method to customize instantiation logic + */ + protected createCorePluginInstance( + CorePlugin: any, + compiler: Compiler, + ): void { + new CorePlugin(this._options).apply(compiler); + } +} diff --git a/packages/enhanced/src/wrapper/ConsumeSharedPlugin.ts b/packages/enhanced/src/wrapper/ConsumeSharedPlugin.ts index 34886a71ff4..aa3a34e328f 100644 --- a/packages/enhanced/src/wrapper/ConsumeSharedPlugin.ts +++ b/packages/enhanced/src/wrapper/ConsumeSharedPlugin.ts @@ -1,24 +1,10 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; import type { ConsumeSharedPluginOptions } from '../declarations/plugins/sharing/ConsumeSharedPlugin'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'ConsumeSharedPlugin'; -export default class ConsumeSharedPlugin implements WebpackPluginInstance { - private _options: ConsumeSharedPluginOptions; - name: string; - +export default class ConsumeSharedPlugin extends BaseWrapperPlugin { constructor(options: ConsumeSharedPluginOptions) { - this._options = options; - this.name = PLUGIN_NAME; - } - - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreConsumeSharedPlugin = - require('../lib/sharing/ConsumeSharedPlugin') - .default as typeof import('../lib/sharing/ConsumeSharedPlugin').default; - new CoreConsumeSharedPlugin(this._options).apply(compiler); + super(options, PLUGIN_NAME, '../lib/sharing/ConsumeSharedPlugin'); } } diff --git a/packages/enhanced/src/wrapper/ContainerPlugin.ts b/packages/enhanced/src/wrapper/ContainerPlugin.ts index 1a4e2cc70da..6ee70d996e9 100644 --- a/packages/enhanced/src/wrapper/ContainerPlugin.ts +++ b/packages/enhanced/src/wrapper/ContainerPlugin.ts @@ -1,23 +1,10 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; import type { containerPlugin } from '@module-federation/sdk'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'ContainerPlugin'; -export default class ContainerPlugin implements WebpackPluginInstance { - private _options: containerPlugin.ContainerPluginOptions; - name: string; - +export default class ContainerPlugin extends BaseWrapperPlugin { constructor(options: containerPlugin.ContainerPluginOptions) { - this._options = options; - this.name = PLUGIN_NAME; - } - - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreContainerPlugin = require('../lib/container/ContainerPlugin') - .default as typeof import('../lib/container/ContainerPlugin').default; - new CoreContainerPlugin(this._options).apply(compiler); + super(options, PLUGIN_NAME, '../lib/container/ContainerPlugin'); } } diff --git a/packages/enhanced/src/wrapper/ContainerReferencePlugin.ts b/packages/enhanced/src/wrapper/ContainerReferencePlugin.ts index 6ddf530ffaa..73cd06a0ca9 100644 --- a/packages/enhanced/src/wrapper/ContainerReferencePlugin.ts +++ b/packages/enhanced/src/wrapper/ContainerReferencePlugin.ts @@ -1,26 +1,12 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; import type { containerReferencePlugin } from '@module-federation/sdk'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'ContainerReferencePlugin'; -export default class ContainerReferencePlugin implements WebpackPluginInstance { - private _options: containerReferencePlugin.ContainerReferencePluginOptions; - name: string; - +export default class ContainerReferencePlugin extends BaseWrapperPlugin { constructor( options: containerReferencePlugin.ContainerReferencePluginOptions, ) { - this._options = options; - this.name = PLUGIN_NAME; - } - - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreContainerReferencePlugin = - require('../lib/container/ContainerReferencePlugin') - .default as typeof import('../lib/container/ContainerReferencePlugin').default; - new CoreContainerReferencePlugin(this._options).apply(compiler); + super(options, PLUGIN_NAME, '../lib/container/ContainerReferencePlugin'); } } diff --git a/packages/enhanced/src/wrapper/FederationModulesPlugin.ts b/packages/enhanced/src/wrapper/FederationModulesPlugin.ts index 7838953ff38..912b7491b0a 100644 --- a/packages/enhanced/src/wrapper/FederationModulesPlugin.ts +++ b/packages/enhanced/src/wrapper/FederationModulesPlugin.ts @@ -1,13 +1,11 @@ -import type { WebpackPluginInstance, Compiler, Compilation } from 'webpack'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import type { Compilation } from 'webpack'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'FederationModulesPlugin'; -export default class FederationModulesPlugin implements WebpackPluginInstance { - name: string; - +export default class FederationModulesPlugin extends BaseWrapperPlugin { constructor() { - this.name = PLUGIN_NAME; + super({}, PLUGIN_NAME, '../lib/container/runtime/FederationModulesPlugin'); } static getCompilationHooks(compilation: Compilation) { @@ -17,12 +15,10 @@ export default class FederationModulesPlugin implements WebpackPluginInstance { return CoreFederationModulesPlugin.getCompilationHooks(compilation); } - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreFederationModulesPlugin = - require('../lib/container/runtime/FederationModulesPlugin') - .default as typeof import('../lib/container/runtime/FederationModulesPlugin').default; - new CoreFederationModulesPlugin().apply(compiler); + protected override createCorePluginInstance( + CorePlugin: any, + compiler: any, + ): void { + new CorePlugin().apply(compiler); } } diff --git a/packages/enhanced/src/wrapper/FederationRuntimePlugin.ts b/packages/enhanced/src/wrapper/FederationRuntimePlugin.ts index e2390f7964e..33222becbb7 100644 --- a/packages/enhanced/src/wrapper/FederationRuntimePlugin.ts +++ b/packages/enhanced/src/wrapper/FederationRuntimePlugin.ts @@ -1,30 +1,26 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; import type { moduleFederationPlugin } from '@module-federation/sdk'; - -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'FederationRuntimePlugin'; -export default class FederationRuntimePlugin implements WebpackPluginInstance { - private _options?: moduleFederationPlugin.ModuleFederationPluginOptions; - name: string; +export default class FederationRuntimePlugin extends BaseWrapperPlugin { entryFilePath: string; constructor(options?: moduleFederationPlugin.ModuleFederationPluginOptions) { - this._options = options; - this.name = PLUGIN_NAME; + super( + options, + PLUGIN_NAME, + '../lib/container/runtime/FederationRuntimePlugin', + ); this.entryFilePath = ''; } - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreFederationRuntimePlugin = - require('../lib/container/runtime/FederationRuntimePlugin') - .default as typeof import('../lib/container/runtime/FederationRuntimePlugin').default; - const pluginInstance = new CoreFederationRuntimePlugin(this._options); + protected override createCorePluginInstance( + CorePlugin: any, + compiler: any, + ): void { + const pluginInstance = new CorePlugin(this._options); pluginInstance.apply(compiler); - this.entryFilePath = pluginInstance.entryFilePath; } } diff --git a/packages/enhanced/src/wrapper/HoistContainerReferencesPlugin.ts b/packages/enhanced/src/wrapper/HoistContainerReferencesPlugin.ts index ad2b5b70418..9c99a86d2c5 100644 --- a/packages/enhanced/src/wrapper/HoistContainerReferencesPlugin.ts +++ b/packages/enhanced/src/wrapper/HoistContainerReferencesPlugin.ts @@ -1,22 +1,9 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'HoistContainerReferencesPlugin'; -export default class HoistContainerReferencesPlugin - implements WebpackPluginInstance -{ - name: string; +export default class HoistContainerReferencesPlugin extends BaseWrapperPlugin { constructor() { - this.name = PLUGIN_NAME; - } - - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreHoistContainerReferencesPlugin = - require('../lib/container/HoistContainerReferencesPlugin') - .default as typeof import('../lib/container/HoistContainerReferencesPlugin').default; - new CoreHoistContainerReferencesPlugin().apply(compiler); + super({}, PLUGIN_NAME, '../lib/container/hoistContainerReferencesPlugin'); } } diff --git a/packages/enhanced/src/wrapper/ModuleFederationPlugin.ts b/packages/enhanced/src/wrapper/ModuleFederationPlugin.ts index f53fcfe92d6..c7e3c386ede 100644 --- a/packages/enhanced/src/wrapper/ModuleFederationPlugin.ts +++ b/packages/enhanced/src/wrapper/ModuleFederationPlugin.ts @@ -1,4 +1,3 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; import { bindLoggerToCompiler, infrastructureLogger, @@ -8,36 +7,31 @@ import { import type IModuleFederationPlugin from '../lib/container/ModuleFederationPlugin'; import type { ResourceInfo } from '@module-federation/manifest'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; import path from 'node:path'; import fs from 'node:fs'; import ReactBridgePlugin from '@module-federation/bridge-react-webpack-plugin'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; export const PLUGIN_NAME = 'ModuleFederationPlugin'; -export default class ModuleFederationPlugin implements WebpackPluginInstance { - private _options: moduleFederationPlugin.ModuleFederationPluginOptions; +export default class ModuleFederationPlugin extends BaseWrapperPlugin { private _mfPlugin?: IModuleFederationPlugin; - name: string; constructor(options: moduleFederationPlugin.ModuleFederationPluginOptions) { - this._options = options; - this.name = PLUGIN_NAME; + super(options, PLUGIN_NAME, '../lib/container/ModuleFederationPlugin'); } - apply(compiler: Compiler) { + protected override createCorePluginInstance( + CorePlugin: any, + compiler: any, + ): void { bindLoggerToCompiler( infrastructureLogger, compiler, 'EnhancedModuleFederationPlugin', ); - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreModuleFederationPlugin = - require('../lib/container/ModuleFederationPlugin') - .default as typeof IModuleFederationPlugin; - this._mfPlugin = new CoreModuleFederationPlugin(this._options); + this._mfPlugin = new CorePlugin(this._options); this._mfPlugin!.apply(compiler); const checkBridgeReactInstalled = () => { diff --git a/packages/enhanced/src/wrapper/ProvideSharedPlugin.ts b/packages/enhanced/src/wrapper/ProvideSharedPlugin.ts index de21544c2fe..2a6a59a7151 100644 --- a/packages/enhanced/src/wrapper/ProvideSharedPlugin.ts +++ b/packages/enhanced/src/wrapper/ProvideSharedPlugin.ts @@ -1,24 +1,10 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; import type { ProvideSharedPluginOptions } from '../declarations/plugins/sharing/ProvideSharedPlugin'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'ProvideSharedPlugin'; -export default class ProvideSharedPlugin implements WebpackPluginInstance { - private _options: ProvideSharedPluginOptions; - name: string; - +export default class ProvideSharedPlugin extends BaseWrapperPlugin { constructor(options: ProvideSharedPluginOptions) { - this._options = options; - this.name = PLUGIN_NAME; - } - - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreProvideSharedPlugin = - require('../lib/sharing/ProvideSharedPlugin') - .default as typeof import('../lib/sharing/ProvideSharedPlugin').default; - new CoreProvideSharedPlugin(this._options).apply(compiler); + super(options, PLUGIN_NAME, '../lib/sharing/ProvideSharedPlugin'); } } diff --git a/packages/enhanced/src/wrapper/SharePlugin.ts b/packages/enhanced/src/wrapper/SharePlugin.ts index e5172b4c390..707e20b4dc5 100644 --- a/packages/enhanced/src/wrapper/SharePlugin.ts +++ b/packages/enhanced/src/wrapper/SharePlugin.ts @@ -1,23 +1,10 @@ -import type { WebpackPluginInstance, Compiler } from 'webpack'; import type { SharePluginOptions } from '../declarations/plugins/sharing/SharePlugin'; -import { getWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; const PLUGIN_NAME = 'SharePlugin'; -export default class SharePlugin implements WebpackPluginInstance { - private _options: SharePluginOptions; - name: string; - +export default class SharePlugin extends BaseWrapperPlugin { constructor(options: SharePluginOptions) { - this._options = options; - this.name = PLUGIN_NAME; - } - - apply(compiler: Compiler) { - process.env['FEDERATION_WEBPACK_PATH'] = - process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); - const CoreSharePlugin = require('../lib/sharing/SharePlugin') - .default as typeof import('../lib/sharing/SharePlugin').default; - new CoreSharePlugin(this._options).apply(compiler); + super(options, PLUGIN_NAME, '../lib/sharing/SharePlugin'); } } diff --git a/packages/enhanced/src/wrapper/TreeshakeSharePlugin.ts b/packages/enhanced/src/wrapper/TreeshakeSharePlugin.ts new file mode 100644 index 00000000000..fb877ceff1a --- /dev/null +++ b/packages/enhanced/src/wrapper/TreeshakeSharePlugin.ts @@ -0,0 +1,14 @@ +import type { TreeshakeSharePluginOptions } from '../lib/sharing/treeshake/TreeshakeSharePlugin'; +import BaseWrapperPlugin from './BaseWrapperPlugin'; + +const PLUGIN_NAME = 'TreeshakeSharePlugin'; + +export default class TreeshakeSharePlugin extends BaseWrapperPlugin { + constructor(options: TreeshakeSharePluginOptions) { + super( + options, + PLUGIN_NAME, + '../lib/sharing/treeshake/TreeshakeSharePlugin', + ); + } +} diff --git a/packages/enhanced/test/configCases/container/manifest/webpack.config.js b/packages/enhanced/test/configCases/container/manifest/webpack.config.js index f560ddaeecd..41cd9cd65e8 100644 --- a/packages/enhanced/test/configCases/container/manifest/webpack.config.js +++ b/packages/enhanced/test/configCases/container/manifest/webpack.config.js @@ -17,6 +17,7 @@ module.exports = { exposes: { './expose-a': './module.js', }, + manifest: true, remoteType: 'script', remotes: { '@remote/alias': 'remote@http://localhost:8000/remoteEntry.js', diff --git a/packages/enhanced/test/configCases/sharing/consume-multiple-versions-ignore-warnings/webpack.config.js b/packages/enhanced/test/configCases/sharing/consume-multiple-versions-ignore-warnings/webpack.config.js index 17ff040de3f..2a46023f20d 100644 --- a/packages/enhanced/test/configCases/sharing/consume-multiple-versions-ignore-warnings/webpack.config.js +++ b/packages/enhanced/test/configCases/sharing/consume-multiple-versions-ignore-warnings/webpack.config.js @@ -12,11 +12,9 @@ module.exports = { shared: { import: false, strictVersion: true, - eager: true, }, shared2: { import: false, - eager: true, }, }, }), diff --git a/packages/enhanced/test/configCases/sharing/consume-multiple-versions/webpack.config.js b/packages/enhanced/test/configCases/sharing/consume-multiple-versions/webpack.config.js index 9f9972d41fe..6c59dbea537 100644 --- a/packages/enhanced/test/configCases/sharing/consume-multiple-versions/webpack.config.js +++ b/packages/enhanced/test/configCases/sharing/consume-multiple-versions/webpack.config.js @@ -9,109 +9,85 @@ module.exports = { shared: { import: false, strictVersion: true, - eager: true, }, shared2: { import: false, - eager: true, }, shared3: { import: false, strictVersion: true, - eager: true, }, shared4: { import: false, - eager: true, }, shared5: { import: false, strictVersion: true, - eager: true, }, shared6: { import: false, strictVersion: true, - eager: true, }, shared7: { import: false, strictVersion: true, - eager: true, }, shared8: { import: false, strictVersion: true, - eager: true, }, shared9: { import: false, strictVersion: true, - eager: true, }, shared10: { import: false, strictVersion: true, - eager: true, }, shared11: { import: false, strictVersion: true, - eager: true, }, shared12: { import: false, - eager: true, }, shared13: { import: false, - eager: true, }, shared14: { import: false, - eager: true, }, shared15: { import: false, strictVersion: true, - eager: true, }, shared16: { import: false, - eager: true, }, shared17: { import: false, strictVersion: true, - eager: true, }, shared18: { import: false, - eager: true, }, shared19: { import: false, - eager: true, }, shared20: { import: false, - eager: true, }, shared21: { import: false, - eager: true, }, shared22: { import: false, - eager: true, }, shared23: { import: false, - eager: true, }, shared24: { import: false, - eager: true, }, }, }), diff --git a/packages/enhanced/test/unit/container/ContainerPlugin.test.ts b/packages/enhanced/test/unit/container/ContainerPlugin.test.ts index e25a8e0ad36..4ad297d4172 100644 --- a/packages/enhanced/test/unit/container/ContainerPlugin.test.ts +++ b/packages/enhanced/test/unit/container/ContainerPlugin.test.ts @@ -164,7 +164,7 @@ describe('ContainerPlugin', () => { expect(plugin['_options'].name).toBe('test-container'); expect(plugin['_options'].shareScope).toBe('default'); expect(plugin['_options'].library).toEqual({ - type: 'var', + type: 'global', name: 'test-container', }); expect(plugin['_options'].exposes).toBeDefined(); diff --git a/packages/enhanced/test/unit/sharing/ConsumeSharedPlugin/ConsumeSharedPlugin.version-resolution.test.ts b/packages/enhanced/test/unit/sharing/ConsumeSharedPlugin/ConsumeSharedPlugin.version-resolution.test.ts index 2189496fc14..11dc9b92e1f 100644 --- a/packages/enhanced/test/unit/sharing/ConsumeSharedPlugin/ConsumeSharedPlugin.version-resolution.test.ts +++ b/packages/enhanced/test/unit/sharing/ConsumeSharedPlugin/ConsumeSharedPlugin.version-resolution.test.ts @@ -398,20 +398,20 @@ describe('ConsumeSharedPlugin', () => { }); describe('error scenarios', () => { - it('should handle invalid configurations gracefully', () => { - // Test that invalid array input throws error - expect(() => { - new ConsumeSharedPlugin({ - shareScope: 'default', - consumes: { - // @ts-ignore - intentionally testing invalid input - invalidModule: ['invalid', 'array'], - }, - }); - }).toThrow( - /Invalid options object|should be.*object|should be.*string/, - ); - }); + // it('should handle invalid configurations gracefully', () => { + // // Test that invalid array input throws error + // expect(() => { + // new ConsumeSharedPlugin({ + // shareScope: 'default', + // consumes: { + // // @ts-ignore - intentionally testing invalid input + // invalidModule: ['invalid', 'array'], + // }, + // }); + // }).toThrow( + // /Invalid options object|should be.*object|should be.*string/, + // ); + // }); it('should handle false import values correctly', () => { const plugin = new ConsumeSharedPlugin({ diff --git a/packages/managers/src/RemoteManager.ts b/packages/managers/src/RemoteManager.ts index 9b5b87ddba4..70a921435ea 100644 --- a/packages/managers/src/RemoteManager.ts +++ b/packages/managers/src/RemoteManager.ts @@ -18,8 +18,8 @@ interface NormalizedRemote { function getEntry( remoteObj: - | containerReferencePlugin.RemotesConfig - | containerReferencePlugin.RemotesItem, + | moduleFederationPlugin.RemotesConfig + | moduleFederationPlugin.RemotesItem, ): string { if (typeof remoteObj === 'string') { return remoteObj; diff --git a/packages/managers/src/SharedManager.ts b/packages/managers/src/SharedManager.ts index 197ada36cd3..178cc092aef 100644 --- a/packages/managers/src/SharedManager.ts +++ b/packages/managers/src/SharedManager.ts @@ -51,7 +51,7 @@ class SharedManager extends BasicPluginOptionsManager; path: string; @@ -88,9 +88,9 @@ class SharedManager extends BasicPluginOptionsManager { - if (typeof item !== 'string') - throw new Error('Unexpected array in shared'); - const config: sharePlugin.SharedConfig = - item === key || !isRequiredVersion(item) - ? { - import: item, - } - : { - import: key, - requiredVersion: item, - }; - return config; - }, - (item) => item, - ); + const sharedOptions: [string, moduleFederationPlugin.SharedConfig][] = + parseOptions( + options!, + (item, key) => { + if (typeof item !== 'string') + throw new Error('Unexpected array in shared'); + const config: moduleFederationPlugin.SharedConfig = + item === key || !isRequiredVersion(item) + ? { + import: item, + } + : { + import: key, + requiredVersion: item, + }; + return config; + }, + (item) => item, + ); sharedOptions.forEach((item) => { const [sharedName, sharedOptions] = item; diff --git a/packages/managers/src/types.ts b/packages/managers/src/types.ts index 9e4469f8f37..5d5b4405860 100644 --- a/packages/managers/src/types.ts +++ b/packages/managers/src/types.ts @@ -1,5 +1,5 @@ import { WebpackOptionsNormalized } from 'webpack'; -import { sharePlugin } from '@module-federation/sdk'; +import { moduleFederationPlugin } from '@module-federation/sdk'; export type EntryStaticNormalized = Awaited< ReturnType any>> @@ -19,7 +19,7 @@ export type ParsedContainerOptions = [string, T][]; export type NormalizedSharedOption = { name: string; version: string; -} & sharePlugin.SharedConfig; +} & moduleFederationPlugin.SharedConfig; export interface NormalizedSharedOptions { [depName: string]: NormalizedSharedOption; diff --git a/packages/manifest/src/ManifestManager.ts b/packages/manifest/src/ManifestManager.ts index 8f0b3e724f5..9ed604a580f 100644 --- a/packages/manifest/src/ManifestManager.ts +++ b/packages/manifest/src/ManifestManager.ts @@ -70,6 +70,9 @@ class ManifestManager { requiredVersion: cur.requiredVersion, hash: cur.hash, assets: cur.assets, + fallback: cur.fallback, + fallbackName: cur.fallbackName, + fallbackType: cur.fallbackType, }; sum.push(shared); return sum; diff --git a/packages/manifest/src/ModuleHandler.ts b/packages/manifest/src/ModuleHandler.ts index 1de9f2ea052..a4459d24348 100644 --- a/packages/manifest/src/ModuleHandler.ts +++ b/packages/manifest/src/ModuleHandler.ts @@ -199,6 +199,8 @@ export const getShareItem = ({ }, // @ts-ignore to deduplicate usedIn: new Set(), + usedExports: [], + fallback: '', }; }; @@ -560,10 +562,7 @@ class ModuleHandler { if (isRemoteModule(identifier)) { this._handleRemoteModule(mod, remotes, remotesConsumerMap); - } else if ( - !this._containerManager.enable && - isContainerModule(identifier) - ) { + } else if (isContainerModule(identifier)) { this._handleContainerModule(mod, exposesMap); } }); diff --git a/packages/nextjs-mf/src/internal.ts b/packages/nextjs-mf/src/internal.ts index f25ced295bb..cbc95fab16a 100644 --- a/packages/nextjs-mf/src/internal.ts +++ b/packages/nextjs-mf/src/internal.ts @@ -1,10 +1,7 @@ -import type { - moduleFederationPlugin, - sharePlugin, -} from '@module-federation/sdk'; +import type { moduleFederationPlugin } from '@module-federation/sdk'; // Extend the SharedConfig type to include layer properties -type ExtendedSharedConfig = sharePlugin.SharedConfig & { +type ExtendedSharedConfig = moduleFederationPlugin.SharedConfig & { layer?: string; issuerLayer?: string | string[]; request?: string; diff --git a/packages/rsbuild-plugin/src/cli/index.ts b/packages/rsbuild-plugin/src/cli/index.ts index 2fcf3f57834..5c91a0f0d4e 100644 --- a/packages/rsbuild-plugin/src/cli/index.ts +++ b/packages/rsbuild-plugin/src/cli/index.ts @@ -20,10 +20,7 @@ import { patchSSRRspackConfig, } from '../utils'; -import type { - moduleFederationPlugin, - sharePlugin, -} from '@module-federation/sdk'; +import type { moduleFederationPlugin } from '@module-federation/sdk'; import type { RsbuildConfig, RsbuildPlugin, Rspack } from '@rsbuild/core'; import { CALL_NAME_MAP, @@ -143,24 +140,25 @@ export const pluginModuleFederation = ( setSSREnv(); } - const sharedOptions: [string, sharePlugin.SharedConfig][] = parseOptions( - moduleFederationOptions.shared || [], - (item: string | string[], key: string) => { - if (typeof item !== 'string') - throw new Error('Unexpected array in shared'); - const config: sharePlugin.SharedConfig = - item === key || !isRequiredVersion(item) - ? { - import: item, - } - : { - import: key, - requiredVersion: item, - }; - return config; - }, - (item: any, key: string) => item, - ); + const sharedOptions: [string, moduleFederationPlugin.SharedConfig][] = + parseOptions( + moduleFederationOptions.shared || [], + (item: string | string[], key: string) => { + if (typeof item !== 'string') + throw new Error('Unexpected array in shared'); + const config: moduleFederationPlugin.SharedConfig = + item === key || !isRequiredVersion(item) + ? { + import: item, + } + : { + import: key, + requiredVersion: item, + }; + return config; + }, + (item: any, key: string) => item, + ); // shared[0] is the shared name const shared = sharedOptions.map((shared) => shared[0].endsWith('/') ? shared[0].slice(0, -1) : shared[0], diff --git a/packages/runtime-core/src/core.ts b/packages/runtime-core/src/core.ts index 98d481bf9ed..c026f0d3d46 100644 --- a/packages/runtime-core/src/core.ts +++ b/packages/runtime-core/src/core.ts @@ -1,6 +1,7 @@ import { isBrowserEnv } from '@module-federation/sdk'; import type { CreateScriptHookReturn, + GlobalModuleInfo, ModuleInfo, } from '@module-federation/sdk'; import { @@ -27,6 +28,7 @@ import { SyncWaterfallHook, } from './utils/hooks'; import { generatePreloadAssetsPlugin } from './plugins/generate-preload-assets'; +import { treeShakeSharePlugin } from './plugins/treeshake-share'; import { snapshotPlugin } from './plugins/snapshot'; import { getRemoteInfo } from './utils/load'; import { DEFAULT_SCOPE } from './constant'; @@ -51,6 +53,9 @@ export class ModuleFederation { userOptions: UserOptions; options: Options; origin: ModuleFederation; + /** + * @deprecated shareInfo will be removed soon, please use userOptions directly! + */ shareInfo: ShareInfos; }>('beforeInit'), init: new SyncHook< @@ -167,10 +172,15 @@ export class ModuleFederation { void | Record >(), }); + moduleInfo?: GlobalModuleInfo[string]; constructor(userOptions: UserOptions) { const plugins = USE_SNAPSHOT - ? [snapshotPlugin(), generatePreloadAssetsPlugin()] + ? [ + snapshotPlugin(), + generatePreloadAssetsPlugin(), + treeShakeSharePlugin(), + ] : []; // TODO: Validate the details of the options // Initialize options with default values @@ -278,7 +288,10 @@ export class ModuleFederation { } formatOptions(globalOptions: Options, userOptions: UserOptions): Options { - const { shared } = formatShareConfigs(globalOptions, userOptions); + const { allShareInfos: shared, newShareInfos } = formatShareConfigs( + globalOptions, + userOptions, + ); const { userOptions: userOptionsRes, options: globalOptionsRes } = this.hooks.lifecycle.beforeInit.emit({ origin: this, @@ -292,7 +305,7 @@ export class ModuleFederation { userOptionsRes, ); - const { shared: handledShared } = this.sharedHandler.registerShared( + const { allShareInfos } = this.sharedHandler.registerShared( globalOptionsRes, userOptionsRes, ); @@ -312,7 +325,7 @@ export class ModuleFederation { ...userOptions, plugins, remotes, - shared: handledShared, + shared: allShareInfos, }; this.hooks.lifecycle.init.emit({ diff --git a/packages/runtime-core/src/plugins/treeshake-share.ts b/packages/runtime-core/src/plugins/treeshake-share.ts new file mode 100644 index 00000000000..357a9f8e295 --- /dev/null +++ b/packages/runtime-core/src/plugins/treeshake-share.ts @@ -0,0 +1,76 @@ +import { getGlobalSnapshotInfoByModuleInfo } from '../global'; +import type { ModuleFederationRuntimePlugin } from '../type'; +import { error, getRemoteEntry } from '../utils'; +import { TreeshakeStatus } from '@module-federation/sdk'; + +export const treeShakeSharePlugin: () => ModuleFederationRuntimePlugin = + function () { + return { + name: 'tree-shake-plugin', + beforeRegisterShare(args) { + const { shared, origin, pkgName } = args; + if (!shared.usedExports) { + return args; + } + const hostGlobalSnapshot = getGlobalSnapshotInfoByModuleInfo({ + name: origin.name, + version: origin.options.version, + }); + if (!hostGlobalSnapshot || !('shared' in hostGlobalSnapshot)) { + return args; + } + const shareSnapshot = hostGlobalSnapshot.shared.find( + (item) => item.sharedName === pkgName, + ); + if (!shareSnapshot) { + return args; + } + const { + treeshakeStatus, + reShakeShareName, + reShakeShareEntry, + reShakeShareType, + } = shareSnapshot; + + if (!treeshakeStatus) { + if (!shared.fallback) { + error(`fallback is required if enable treeshake!`); + } + shared.treeshakeStatus = + typeof treeshakeStatus !== 'undefined' + ? treeshakeStatus + : TreeshakeStatus.UNKNOWN; + return args; + } + shared.treeshakeStatus = treeshakeStatus; + if (!reShakeShareName || !reShakeShareEntry || !reShakeShareType) { + return args; + } + shared.reShakeGet = async () => { + const shareEntry = await getRemoteEntry({ + origin, + remoteInfo: { + name: reShakeShareName, + entry: reShakeShareEntry, + type: reShakeShareType, + entryGlobalName: reShakeShareName, + shareScope: 'default', + }, + }); + // TODO: add errorLoad hook ? + // @ts-ignore TODO: move to webpack bundler runtime + await shareEntry.init( + origin, + // @ts-ignore TODO: move to webpack bundler runtime + __webpack_require__.federation.bundlerRuntime, + ); + // @ts-ignore + const getter = shareEntry.get(); + console.log('reShakeGet: ', getter); + return getter; + }; + + return args; + }, + }; + }; diff --git a/packages/runtime-core/src/remote/index.ts b/packages/runtime-core/src/remote/index.ts index 9b4ccfb9bbb..bb101f25450 100644 --- a/packages/runtime-core/src/remote/index.ts +++ b/packages/runtime-core/src/remote/index.ts @@ -151,6 +151,7 @@ export class RemoteHandler { options: Options; origin: ModuleFederation; }>(), + // TODO: Move to loaderHook loadEntry: new AsyncHook< [ { diff --git a/packages/runtime-core/src/shared/index.ts b/packages/runtime-core/src/shared/index.ts index 8209f0df35b..dcafa1cab19 100644 --- a/packages/runtime-core/src/shared/index.ts +++ b/packages/runtime-core/src/shared/index.ts @@ -4,6 +4,7 @@ import { RUNTIME_006, runtimeDescMap, } from '@module-federation/error-codes'; +import { TreeshakeStatus, isDebugMode } from '@module-federation/sdk'; import { Federation } from '../global'; import { Options, @@ -16,6 +17,7 @@ import { InitScope, InitTokens, CallFrom, + NoMatchedUsedExportsItem, } from '../type'; import { ModuleFederation } from '../core'; import { @@ -29,6 +31,7 @@ import { getRegisteredShare, getTargetSharedOptions, getGlobalShareScope, + callShareGetter, } from '../utils/share'; import { assert, addUniqueItem } from '../utils'; import { DEFAULT_SCOPE } from '../constant'; @@ -38,6 +41,11 @@ export class SharedHandler { host: ModuleFederation; shareScopeMap: ShareScopeMap; hooks = new PluginSystem({ + beforeRegisterShare: new SyncWaterfallHook<{ + pkgName: string; + shared: Shared; + origin: ModuleFederation; + }>('beforeRegisterShare'), afterResolve: new AsyncWaterfallHook('afterResolve'), beforeLoadShare: new AsyncWaterfallHook<{ pkgName: string; @@ -52,6 +60,7 @@ export class SharedHandler { scope: string; pkgName: string; version: string; + shareInfo: Shared; GlobalFederation: Federation; resolver: () => Shared | undefined; }>('resolveShare'), @@ -74,14 +83,14 @@ export class SharedHandler { // register shared in shareScopeMap registerShared(globalOptions: Options, userOptions: UserOptions) { - const { shareInfos, shared } = formatShareConfigs( + const { newShareInfos, allShareInfos } = formatShareConfigs( globalOptions, userOptions, ); - const sharedKeys = Object.keys(shareInfos); + const sharedKeys = Object.keys(newShareInfos); sharedKeys.forEach((sharedKey) => { - const sharedVals = shareInfos[sharedKey]; + const sharedVals = newShareInfos[sharedKey]; sharedVals.forEach((sharedVal) => { sharedVal.scope.forEach((sc) => { const registeredShared = this.shareScopeMap[sc]?.[sharedKey]; @@ -100,8 +109,8 @@ export class SharedHandler { }); return { - shareInfos, - shared, + newShareInfos, + allShareInfos, }; } @@ -151,7 +160,6 @@ export class SharedHandler { `Cannot find ${pkgName} Share in the ${host.options.name}. Please ensure that the ${pkgName} Share parameters have been injected`, ); - // Retrieve from cache const registeredShared = getRegisteredShare( this.shareScopeMap, pkgName, @@ -183,7 +191,7 @@ export class SharedHandler { return factory; } else if (registeredShared) { const asyncLoadProcess = async () => { - const factory = await registeredShared.get(); + const factory = await callShareGetter(registeredShared); addUseIn(registeredShared); registeredShared.loaded = true; registeredShared.lib = factory; @@ -204,7 +212,7 @@ export class SharedHandler { return false; } const asyncLoadProcess = async () => { - const factory = await shareOptionsRes.get(); + const factory = await callShareGetter(shareOptionsRes); shareOptionsRes.lib = factory; shareOptionsRes.loaded = true; addUseIn(shareOptionsRes); @@ -278,7 +286,7 @@ export class SharedHandler { const activeVersion = versions[version]; const activeVersionEager = Boolean( activeVersion && - (activeVersion.eager || activeVersion.shareConfig?.eager), + (activeVersion.eager || activeVersion.shareConfig?.eager), ); if ( !activeVersion || @@ -453,6 +461,40 @@ export class SharedHandler { extraOptions: { hostShareScopeMap?: ShareScopeMap } = {}, ): void { const { host } = this; + // const existedShareScope = this.shareScopeMap[scopeName]; + // if (existedShareScope) { + // Object.entries(shareScope).forEach(([pkgName, newVersions]) => { + // const existedShareMap = existedShareScope[pkgName]; + // if (!existedShareMap) { + // return; + // } + // Object.entries(existedShareMap).forEach(([version, existedShared]) => { + // if (!shareScope[pkgName][version]) { + // shareScope[pkgName][version] = existedShared; + // } + // // const newShared = newVersions[version]; + // // if ( + // // newShared && + // // newShared.treeshakeStatus === TreeshakeStatus.UNKNOWN && + // // newShared.usedExports && + // // existedShared.usedExports && + // // existedShared.usedExports.some( + // // (exportName) => !newShared.usedExports?.includes(exportName), + // // ) + // // ) { + // // newShared.treeshakeStatus = TreeshakeStatus.NO_USE; + // // newShared._noMatchedUsedExports = + // // existedShared._noMatchedUsedExports || []; + // // const item: NoMatchedUsedExportsItem = [existedShared.from]; + // // if (isDebugMode() && existedShared.usedExports) { + // // item.push(existedShared.usedExports); + // // } + // // newShared._noMatchedUsedExports.push(item); + // // } + // }); + // }); + // } + this.shareScopeMap[scopeName] = shareScope; this.hooks.lifecycle.initContainerShareScopeMap.emit({ shareScope, diff --git a/packages/runtime-core/src/type/config.ts b/packages/runtime-core/src/type/config.ts index cf2ccec40ce..e14811ba9b8 100644 --- a/packages/runtime-core/src/type/config.ts +++ b/packages/runtime-core/src/type/config.ts @@ -3,6 +3,7 @@ import type { RemoteWithVersion, Module, RemoteEntryType, + TreeshakeStatus, } from '@module-federation/sdk'; import { ModuleFederationRuntimePlugin } from './plugin'; @@ -54,6 +55,12 @@ export interface SharedConfig { layer?: string | null; } +export type TreeShakeArgs = { + usedExports?: string[]; + fallback?: SharedGetter; + reShakeGet?: SharedGetter; +}; + type SharedBaseArgs = { version?: string; shareConfig?: SharedConfig; @@ -61,7 +68,7 @@ type SharedBaseArgs = { deps?: Array; strategy?: 'version-first' | 'loaded-first'; loaded?: boolean; -}; +} & TreeShakeArgs; export type SharedGetter = (() => () => Module) | (() => Promise<() => Module>); @@ -70,6 +77,8 @@ export type ShareArgs = | (SharedBaseArgs & { lib: () => Module }) | SharedBaseArgs; export type ShareStrategy = 'version-first' | 'loaded-first'; + +export type NoMatchedUsedExportsItem = [from: string, usedExports?: string[]]; export type Shared = { version: string; get: SharedGetter; @@ -87,6 +96,12 @@ export type Shared = { * @deprecated set in initOptions.shareStrategy instead */ strategy: ShareStrategy; + usedExports?: string[]; + fallback?: SharedGetter; + reShakeGet?: SharedGetter; + treeshakeStatus: TreeshakeStatus; + treeshakeStrategy: 'server' | 'infer'; + _noMatchedUsedExports?: NoMatchedUsedExportsItem[]; }; export type ShareScopeMap = { diff --git a/packages/runtime-core/src/utils/share.ts b/packages/runtime-core/src/utils/share.ts index 1ac40fe7443..09383c51186 100644 --- a/packages/runtime-core/src/utils/share.ts +++ b/packages/runtime-core/src/utils/share.ts @@ -1,4 +1,5 @@ import { DEFAULT_SCOPE } from '../constant'; +import { TreeshakeStatus } from '@module-federation/sdk'; import { Global, Federation } from '../global'; import { GlobalShareScopeMap, @@ -10,13 +11,15 @@ import { UserOptions, Options, ShareStrategy, + TreeShakeArgs, + SharedGetter, } from '../type'; import { warn, error } from './logger'; import { satisfy } from './semver'; import { SyncWaterfallHook } from './hooks'; import { arrayOptions } from './tool'; -export function formatShare( +function formatShare( shareArgs: ShareArgs, from: string, name: string, @@ -54,48 +57,53 @@ export function formatShare( ? shareArgs.scope : [shareArgs.scope ?? 'default'], strategy: (shareArgs.strategy ?? shareStrategy) || 'version-first', + treeshakeStatus: TreeshakeStatus.UNKNOWN, + treeshakeStrategy: 'server', }; } export function formatShareConfigs( - globalOptions: Options, - userOptions: UserOptions, + prevOptions: Options, + newOptions: UserOptions, ) { - const shareArgs = userOptions.shared || {}; - const from = userOptions.name; + const shareArgs = newOptions.shared || {}; + const from = newOptions.name; - const shareInfos = Object.keys(shareArgs).reduce((res, pkgName) => { + const newShareInfos = Object.keys(shareArgs).reduce((res, pkgName) => { const arrayShareArgs = arrayOptions(shareArgs[pkgName]); res[pkgName] = res[pkgName] || []; arrayShareArgs.forEach((shareConfig) => { res[pkgName].push( - formatShare(shareConfig, from, pkgName, userOptions.shareStrategy), + formatShare(shareConfig, from, pkgName, newOptions.shareStrategy), ); }); return res; }, {} as ShareInfos); - const shared = { - ...globalOptions.shared, + const allShareInfos = { + ...prevOptions.shared, }; - Object.keys(shareInfos).forEach((shareKey) => { - if (!shared[shareKey]) { - shared[shareKey] = shareInfos[shareKey]; + Object.keys(newShareInfos).forEach((shareKey) => { + if (!allShareInfos[shareKey]) { + allShareInfos[shareKey] = newShareInfos[shareKey]; } else { - shareInfos[shareKey].forEach((newUserSharedOptions) => { - const isSameVersion = shared[shareKey].find( + newShareInfos[shareKey].forEach((newUserSharedOptions) => { + const isSameVersion = allShareInfos[shareKey].find( (sharedVal) => sharedVal.version === newUserSharedOptions.version, ); if (!isSameVersion) { - shared[shareKey].push(newUserSharedOptions); + allShareInfos[shareKey].push(newUserSharedOptions); } }); } }); - return { shared, shareInfos }; + return { allShareInfos, newShareInfos }; } +/** + * compare version a and b, return true if a is less than b + */ export function versionLt(a: string, b: string): boolean { const transformInvalidVersion = (version: string) => { const isNumberVersion = !Number.isNaN(Number(version)); @@ -151,30 +159,89 @@ const isLoading = (shared: Shared) => { return Boolean(shared.loading); }; +const isMatchUsedExports = ( + targetShared: Shared, + treeshakeStrategy: Shared['treeshakeStrategy'], + usedExports?: string[], +) => { + const targetUsedExports = targetShared.usedExports; + if (!usedExports || !targetUsedExports) { + return true; + } + if (targetShared.treeshakeStatus === TreeshakeStatus.CALCULATED) { + return true; + } + if (targetShared.treeshakeStatus === TreeshakeStatus.NO_USE) { + return false; + } + + if (treeshakeStrategy === 'server') { + return false; + } + + if (usedExports.every((e) => targetUsedExports.includes(e))) { + return true; + } + return false; +}; + function findSingletonVersionOrderByVersion( shareScopeMap: ShareScopeMap, scope: string, pkgName: string, + treeshakeStrategy: Shared['treeshakeStrategy'], + usedExports?: string[], ): string { const versions = shareScopeMap[scope][pkgName]; const callback = function (prev: string, cur: string): boolean { + if (!isMatchUsedExports(versions[cur], treeshakeStrategy, usedExports)) { + return false; + } + + if (!isMatchUsedExports(versions[prev], treeshakeStrategy, usedExports)) { + return true; + } + + if (versions[cur].treeshakeStatus !== versions[prev].treeshakeStatus) { + return Boolean( + versions[cur].treeshakeStatus - versions[prev].treeshakeStatus, + ); + } + return !isLoaded(versions[prev]) && versionLt(prev, cur); }; return findVersion(shareScopeMap[scope][pkgName], callback); } +const isLoadingOrLoaded = (shared: Shared) => { + return isLoaded(shared) || isLoading(shared); +}; + function findSingletonVersionOrderByLoaded( shareScopeMap: ShareScopeMap, scope: string, pkgName: string, + treeshakeStrategy: Shared['treeshakeStrategy'], + usedExports?: string[], ): string { const versions = shareScopeMap[scope][pkgName]; const callback = function (prev: string, cur: string): boolean { - const isLoadingOrLoaded = (shared: Shared) => { - return isLoaded(shared) || isLoading(shared); - }; + if (!isMatchUsedExports(versions[cur], treeshakeStrategy, usedExports)) { + return false; + } + + if (!isMatchUsedExports(versions[prev], treeshakeStrategy, usedExports)) { + return true; + } + + if (versions[cur].treeshakeStatus !== versions[prev].treeshakeStatus) { + return Boolean( + versions[cur].treeshakeStatus - versions[prev].treeshakeStatus, + ); + } + if (isLoadingOrLoaded(versions[cur])) { if (isLoadingOrLoaded(versions[prev])) { return Boolean(versionLt(prev, cur)); @@ -207,6 +274,7 @@ export function getRegisteredShare( scope: string; pkgName: string; version: string; + shareInfo: Shared; GlobalFederation: Federation; resolver: () => Shared | undefined; }>, @@ -214,7 +282,13 @@ export function getRegisteredShare( if (!localShareScopeMap) { return; } - const { shareConfig, scope = DEFAULT_SCOPE, strategy } = shareInfo; + const { + shareConfig, + scope = DEFAULT_SCOPE, + strategy, + treeshakeStrategy, + usedExports, + } = shareInfo; const scopes = Array.isArray(scope) ? scope : [scope]; for (const sc of scopes) { if ( @@ -228,18 +302,35 @@ export function getRegisteredShare( localShareScopeMap, sc, pkgName, + treeshakeStrategy, ); - //@ts-ignore const defaultResolver = () => { + const shared = localShareScopeMap[sc][pkgName][maxOrSingletonVersion]; + if (!isMatchUsedExports(shared, treeshakeStrategy, usedExports)) { + for (const [versionKey, versionValue] of Object.entries( + localShareScopeMap[sc][pkgName], + )) { + if ( + !isMatchUsedExports(versionValue, treeshakeStrategy, usedExports) + ) { + continue; + } + if (requiredVersion === false || requiredVersion === '*') { + return versionValue; + } + if (satisfy(versionKey, requiredVersion)) { + return versionValue; + } + } + } if (shareConfig.singleton) { if ( typeof requiredVersion === 'string' && !satisfy(maxOrSingletonVersion, requiredVersion) ) { const msg = `Version ${maxOrSingletonVersion} from ${ - maxOrSingletonVersion && - localShareScopeMap[sc][pkgName][maxOrSingletonVersion].from + maxOrSingletonVersion && shared.from } of shared singleton module ${pkgName} does not satisfy the requirement of ${ shareInfo.from } which needs ${requiredVersion})`; @@ -250,13 +341,13 @@ export function getRegisteredShare( warn(msg); } } - return localShareScopeMap[sc][pkgName][maxOrSingletonVersion]; + return shared; } else { if (requiredVersion === false || requiredVersion === '*') { - return localShareScopeMap[sc][pkgName][maxOrSingletonVersion]; + return shared; } if (satisfy(maxOrSingletonVersion, requiredVersion)) { - return localShareScopeMap[sc][pkgName][maxOrSingletonVersion]; + return shared; } for (const [versionKey, versionValue] of Object.entries( @@ -267,6 +358,7 @@ export function getRegisteredShare( } } } + return; }; const params = { shareScopeMap: localShareScopeMap, @@ -274,6 +366,7 @@ export function getRegisteredShare( pkgName, version: maxOrSingletonVersion, GlobalFederation: Global.__FEDERATION__, + shareInfo, resolver: defaultResolver, }; const resolveShared = resolveShare.emit(params) || params; @@ -316,3 +409,17 @@ export function getTargetSharedOptions(options: { extraOptions?.customShareInfo, ); } + +export async function callShareGetter( + shared: Shared, +): Promise> { + if (shared.treeshakeStatus === TreeshakeStatus.NO_USE) { + return shared.fallback ? shared.fallback() : shared.get(); + } + + if (shared.reShakeGet) { + return shared.reShakeGet(); + } + + return shared.get(); +} diff --git a/packages/sdk/src/constant.ts b/packages/sdk/src/constant.ts index 591fb49ac53..5729ab50ee6 100644 --- a/packages/sdk/src/constant.ts +++ b/packages/sdk/src/constant.ts @@ -41,3 +41,18 @@ export const MFPrefetchCommon = { exportsKey: '__PREFETCH_EXPORTS__', fileName: 'bootstrap.js', }; + +export const enum TreeshakeStatus { + /** + * Not handled by deploy server, needs to infer by the real runtime period. + */ + UNKNOWN = 1, + /** + * It means the shared has been calculated , runtime should take this shared as first choice. + */ + CALCULATED = 2, + /** + * It means the shared has been calculated, and marked as no used + */ + NO_USE = 0, +} diff --git a/packages/sdk/src/generateSnapshotFromManifest.ts b/packages/sdk/src/generateSnapshotFromManifest.ts index f55e57d482f..053083f3026 100644 --- a/packages/sdk/src/generateSnapshotFromManifest.ts +++ b/packages/sdk/src/generateSnapshotFromManifest.ts @@ -145,6 +145,8 @@ export function generateSnapshotFromManifest( assets: item.assets, sharedName: item.name, version: item.version, + // @ts-ignore + usedExports: item.referenceExports || [], })), modules: exposes?.map((expose) => ({ moduleName: expose.name, diff --git a/packages/sdk/src/types/manifest.ts b/packages/sdk/src/types/manifest.ts index b9ee6dd85f3..15f181d728d 100644 --- a/packages/sdk/src/types/manifest.ts +++ b/packages/sdk/src/types/manifest.ts @@ -3,6 +3,7 @@ import { StatsAssets, StatsExpose, BasicStatsMetaData, + RemoteEntryType, } from './stats'; import { RemoteWithEntry, RemoteWithVersion } from './common'; @@ -14,6 +15,9 @@ export interface ManifestShared { requiredVersion: string; hash: string; assets: StatsAssets; + fallback: string; + fallbackName: string; + fallbackType: RemoteEntryType; } export interface ManifestRemoteCommonInfo { diff --git a/packages/sdk/src/types/plugins/ContainerPlugin.ts b/packages/sdk/src/types/plugins/ContainerPlugin.ts index 95c435f5f2e..50542f20640 100644 --- a/packages/sdk/src/types/plugins/ContainerPlugin.ts +++ b/packages/sdk/src/types/plugins/ContainerPlugin.ts @@ -1,74 +1,10 @@ -/* - * This file was automatically generated. - * DO NOT MODIFY BY HAND. - * Run `yarn special-lint-fix` to update - */ +import { + DataPrefetch, + EntryRuntime, + Exposes, + LibraryOptions, +} from './ModuleFederationPlugin'; -/** - * Modules that should be exposed by this container. When provided, property name is used as public name, otherwise public name is automatically inferred from request. - */ -export type Exposes = (ExposesItem | ExposesObject)[] | ExposesObject; -/** - * Module that should be exposed by this container. - */ -export type ExposesItem = string; -/** - * Modules that should be exposed by this container. - */ -export type ExposesItems = ExposesItem[]; -/** - * Add a container for define/require functions in the AMD module. - */ -export type AmdContainer = string; -/** - * Add a comment in the UMD wrapper. - */ -export type AuxiliaryComment = string | LibraryCustomUmdCommentObject; -/** - * Specify which export should be exposed as library. - */ -export type LibraryExport = string[] | string; -/** - * The name of the library (some types allow unnamed libraries too). - */ -export type LibraryName = string[] | string | LibraryCustomUmdObject; -/** - * Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins). - */ -export type LibraryType = - | ( - | 'var' - | 'module' - | 'assign' - | 'assign-properties' - | 'this' - | 'window' - | 'self' - | 'global' - | 'commonjs' - | 'commonjs2' - | 'commonjs-module' - | 'commonjs-static' - | 'amd' - | 'amd-require' - | 'umd' - | 'umd2' - | 'jsonp' - | 'system' - ) - | string; -/** - * If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module. - */ -export type UmdNamedDefine = boolean; -/** - * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime. - */ -export type EntryRuntime = false | string; -/** - * Enable Data Prefetch - */ -export type DataPrefetch = boolean; export interface ContainerPluginOptions { /** * Modules that should be exposed by this container. When provided, property name is used as public name, otherwise public name is automatically inferred from request. @@ -101,92 +37,3 @@ export interface ContainerPluginOptions { dataPrefetch?: DataPrefetch; } -/** - * Modules that should be exposed by this container. Property names are used as public paths. - */ -export interface ExposesObject { - /** - * Modules that should be exposed by this container. - */ - [k: string]: ExposesConfig | ExposesItem | ExposesItems; -} -/** - * Advanced configuration for modules that should be exposed by this container. - */ -export interface ExposesConfig { - /** - * Request to a module that should be exposed by this container. - */ - import: ExposesItem | ExposesItems; - /** - * Custom chunk name for the exposed module. - */ - name?: string; -} -/** - * Options for library. - */ -export interface LibraryOptions { - /** - * Add a container for define/require functions in the AMD module. - */ - amdContainer?: AmdContainer; - /** - * Add a comment in the UMD wrapper. - */ - auxiliaryComment?: AuxiliaryComment; - /** - * Specify which export should be exposed as library. - */ - export?: LibraryExport; - /** - * The name of the library (some types allow unnamed libraries too). - */ - name?: LibraryName; - /** - * Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins). - */ - type: LibraryType; - /** - * If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module. - */ - umdNamedDefine?: UmdNamedDefine; -} -/** - * Set explicit comments for `commonjs`, `commonjs2`, `amd`, and `root`. - */ -export interface LibraryCustomUmdCommentObject { - /** - * Set comment for `amd` section in UMD. - */ - amd?: string; - /** - * Set comment for `commonjs` (exports) section in UMD. - */ - commonjs?: string; - /** - * Set comment for `commonjs2` (module.exports) section in UMD. - */ - commonjs2?: string; - /** - * Set comment for `root` (global variable) section in UMD. - */ - root?: string; -} -/** - * Description object for all UMD variants of the library name. - */ -export interface LibraryCustomUmdObject { - /** - * Name of the exposed AMD library in the UMD. - */ - amd?: string; - /** - * Name of the exposed commonjs export in the UMD. - */ - commonjs?: string; - /** - * Name of the property exposed globally by a UMD library. - */ - root?: string[] | string; -} diff --git a/packages/sdk/src/types/plugins/ContainerReferencePlugin.ts b/packages/sdk/src/types/plugins/ContainerReferencePlugin.ts index 8f058330146..300ac549c3d 100644 --- a/packages/sdk/src/types/plugins/ContainerReferencePlugin.ts +++ b/packages/sdk/src/types/plugins/ContainerReferencePlugin.ts @@ -1,47 +1,4 @@ -/* - * This file was automatically generated. - * DO NOT MODIFY BY HAND. - * Run `yarn special-lint-fix` to update - */ - -/** - * Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value). - */ -export type ExternalsType = - | 'var' - | 'module' - | 'assign' - | 'this' - | 'window' - | 'self' - | 'global' - | 'commonjs' - | 'commonjs2' - | 'commonjs-module' - | 'commonjs-static' - | 'amd' - | 'amd-require' - | 'umd' - | 'umd2' - | 'jsonp' - | 'system' - | 'promise' - | 'import' - | 'module-import' - | 'script' - | 'node-commonjs'; -/** - * Container locations and request scopes from which modules should be resolved and loaded at runtime. When provided, property name is used as request scope, otherwise request scope is automatically inferred from container location. - */ -export type Remotes = (RemotesItem | RemotesObject)[] | RemotesObject; -/** - * Container location from which modules should be resolved and loaded at runtime. - */ -export type RemotesItem = string; -/** - * Container locations from which modules should be resolved and loaded at runtime. - */ -export type RemotesItems = RemotesItem[]; +import type { ExternalsType, Remotes } from './ModuleFederationPlugin'; export interface ContainerReferencePluginOptions { /** @@ -57,25 +14,3 @@ export interface ContainerReferencePluginOptions { */ shareScope?: string | string[]; } -/** - * Container locations from which modules should be resolved and loaded at runtime. Property names are used as request scopes. - */ -export interface RemotesObject { - /** - * Container locations from which modules should be resolved and loaded at runtime. - */ - [k: string]: RemotesConfig | RemotesItem | RemotesItems; -} -/** - * Advanced configuration for container locations from which modules should be resolved and loaded at runtime. - */ -export interface RemotesConfig { - /** - * Container locations from which modules should be resolved and loaded at runtime. - */ - external: RemotesItem | RemotesItems; - /** - * The name of the share scope shared with this remote. - */ - shareScope?: string | string[]; -} diff --git a/packages/sdk/src/types/plugins/ModuleFederationPlugin.ts b/packages/sdk/src/types/plugins/ModuleFederationPlugin.ts index cb01a718ba4..8d41b8fa712 100644 --- a/packages/sdk/src/types/plugins/ModuleFederationPlugin.ts +++ b/packages/sdk/src/types/plugins/ModuleFederationPlugin.ts @@ -296,6 +296,16 @@ export interface ModuleFederationPluginOptions { * Configuration for async boundary plugin */ async?: boolean | AsyncBoundaryOptions; + + /** + * The directory to output the treeshake shared fallback resources. + */ + independentShareDir?: string; + + /** + * Whether to inject shared used exports into bundler runtime. + */ + injectUsedExports?: boolean; } /** * Modules that should be exposed by this container. Property names are used as public paths. @@ -463,4 +473,7 @@ export interface SharedConfig { * Version of the provided module. Will replace lower matching versions, but not higher. */ version?: false | string; + treeshake?: boolean; + usedExports?: string[]; + independentShareFileName?: string; } diff --git a/packages/sdk/src/types/plugins/SharePlugin.ts b/packages/sdk/src/types/plugins/SharePlugin.ts index 2d75a67f765..e010b1e5178 100644 --- a/packages/sdk/src/types/plugins/SharePlugin.ts +++ b/packages/sdk/src/types/plugins/SharePlugin.ts @@ -1,17 +1,4 @@ -/* - * This file was automatically generated. - * DO NOT MODIFY BY HAND. - * Run `yarn special-lint-fix` to update - */ - -/** - * Modules that should be shared in the share scope. When provided, property names are used to match requested modules in this compilation. - */ -export type Shared = (SharedItem | SharedObject)[] | SharedObject; -/** - * A module that should be shared in the share scope. - */ -export type SharedItem = string; +import type { Shared } from './ModuleFederationPlugin'; /** * Options for shared modules. @@ -26,57 +13,6 @@ export interface SharePluginOptions { */ shared: Shared; } -/** - * Modules that should be shared in the share scope. Property names are used to match requested modules in this compilation. Relative requests are resolved, module requests are matched unresolved, absolute paths will match resolved requests. A trailing slash will match all requests with this prefix. In this case shareKey must also have a trailing slash. - */ -export interface SharedObject { - /** - * Modules that should be shared in the share scope. - */ - [k: string]: SharedConfig | SharedItem; -} -/** - * Advanced configuration for modules that should be shared in the share scope. - */ -export interface SharedConfig { - /** - * Include the provided and fallback module directly instead behind an async request. This allows to use this shared module in initial load too. All possible shared modules need to be eager too. - */ - eager?: boolean; - /** - * Provided module that should be provided to share scope. Also acts as fallback module if no shared module is found in share scope or version isn't valid. Defaults to the property name. - */ - import?: false | SharedItem; - /** - * Package name to determine required version from description file. This is only needed when package name can't be automatically determined from request. - */ - packageName?: string; - /** - * Version requirement from module in share scope. - */ - requiredVersion?: false | string; - /** - * Module is looked up under this key from the share scope. - */ - shareKey?: string; - /** - * Share scope name. - */ - shareScope?: string | string[]; - /** - * Allow only a single version of the shared module in share scope (disabled by default). - */ - singleton?: boolean; - /** - * Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified). - */ - strictVersion?: boolean; - /** - * Version of the provided module. Will replace lower matching versions, but not higher. - */ - version?: false | string; -} - export declare class SharePlugin { constructor(options: SharePluginOptions); diff --git a/packages/sdk/src/types/snapshot.ts b/packages/sdk/src/types/snapshot.ts index 45b55e58e42..2a1d8a149c9 100644 --- a/packages/sdk/src/types/snapshot.ts +++ b/packages/sdk/src/types/snapshot.ts @@ -1,3 +1,4 @@ +import { TreeshakeStatus } from '../constant'; import { RemoteEntryType, StatsAssets } from './stats'; interface BasicModuleInfo { @@ -13,8 +14,15 @@ interface BasicModuleInfo { remotesInfo: Record; shared: Array<{ sharedName: string; + fallback?: string; + fallbackName?: string; + fallbackType?: RemoteEntryType; version?: string; assets: StatsAssets; + treeshakeStatus?: TreeshakeStatus; + reShakeShareEntry?: string; + reShakeShareName?: string; + reShakeShareType?: RemoteEntryType; }>; } diff --git a/packages/sdk/src/types/stats.ts b/packages/sdk/src/types/stats.ts index b32366c4b7b..e8c96ae4ff2 100644 --- a/packages/sdk/src/types/stats.ts +++ b/packages/sdk/src/types/stats.ts @@ -85,6 +85,10 @@ export interface StatsShared { assets: StatsAssets; deps: string[]; usedIn: string[]; + usedExports: string[]; + fallback: string; + fallbackName: string; + fallbackType: RemoteEntryType; } // extends Omit export interface StatsRemoteVal { diff --git a/packages/webpack-bundler-runtime/src/consumes.ts b/packages/webpack-bundler-runtime/src/consumes.ts index 2c0ad375b9d..3f4322fc3a8 100644 --- a/packages/webpack-bundler-runtime/src/consumes.ts +++ b/packages/webpack-bundler-runtime/src/consumes.ts @@ -1,6 +1,7 @@ import { ConsumesOptions } from './types'; import { attachShareScopeMap } from './attachShareScopeMap'; import { updateConsumeOptions } from './updateOptions'; +import { getUsedExports } from './getUsedExports'; export function consumes(options: ConsumesOptions) { updateConsumeOptions(options); @@ -59,9 +60,11 @@ export function consumes(options: ConsumesOptions) { throw new Error('Federation instance not found!'); } const { shareKey, getter, shareInfo } = moduleToHandlerMapping[id]; - + const usedExports = getUsedExports(webpackRequire, shareKey); const promise = federationInstance - .loadShare(shareKey, { customShareInfo: shareInfo }) + .loadShare(shareKey, { + customShareInfo: { ...shareInfo, usedExports }, + }) .then((factory: any) => { if (factory === false) { return getter(); diff --git a/packages/webpack-bundler-runtime/src/getSharedFallbackGetter.ts b/packages/webpack-bundler-runtime/src/getSharedFallbackGetter.ts new file mode 100644 index 00000000000..9eab01a70b3 --- /dev/null +++ b/packages/webpack-bundler-runtime/src/getSharedFallbackGetter.ts @@ -0,0 +1,55 @@ +import type { GetSharedFallbackGetterOptions } from './types'; + +export const getSharedFallbackGetter = ({ + shareKey, + factory, + version, + webpackRequire, + libraryType = 'global', +}: GetSharedFallbackGetterOptions) => { + const { runtime, instance, bundlerRuntime, sharedFallback } = + webpackRequire.federation!; + if (!sharedFallback) { + return factory; + } + // { react: [ [ react/19.0.0/index.js , 19.0.0, react_global_name, var ] ] } + const fallbackItems = sharedFallback[shareKey]; + if (!fallbackItems) { + return factory; + } + const fallbackItem = version + ? fallbackItems.find((item) => item[1] === version) + : fallbackItems[0]; + if (!fallbackItem) { + throw new Error( + `No fallback item found for shareKey: ${shareKey} and version: ${version}`, + ); + } + return () => + runtime! + .getRemoteEntry({ + origin: instance!, + remoteInfo: { + name: fallbackItem[2], + entry: `${webpackRequire.p}${fallbackItem[0]}`, + type: libraryType, + entryGlobalName: fallbackItem[2], + // current not used + shareScope: 'default', + }, + }) + .then((shareEntry) => { + if (!shareEntry) { + throw new Error( + `Failed to load fallback entry for shareKey: ${shareKey} and version: ${version}`, + ); + } + return ( + shareEntry + //@ts-expect-error shareEntry.init expect instance and bundlerRuntime + .init(instance, bundlerRuntime) + //@ts-expect-error shareEntry.init expect instance and bundlerRuntime + .then(() => shareEntry.get()) + ); + }); +}; diff --git a/packages/webpack-bundler-runtime/src/getUsedExports.ts b/packages/webpack-bundler-runtime/src/getUsedExports.ts new file mode 100644 index 00000000000..1dd85e93dc2 --- /dev/null +++ b/packages/webpack-bundler-runtime/src/getUsedExports.ts @@ -0,0 +1,18 @@ +import type { WebpackRequire } from './types'; + +export function getUsedExports( + webpackRequire: WebpackRequire, + sharedName: string, +): string[] { + const usedExports = webpackRequire.federation.usedExports; + if (!usedExports) { + return []; + } + + const runtimeId = webpackRequire.j; + if (!runtimeId) { + return []; + } + + return usedExports[sharedName]?.[runtimeId] || []; +} diff --git a/packages/webpack-bundler-runtime/src/index.ts b/packages/webpack-bundler-runtime/src/index.ts index 656367d38bf..d611983f45a 100644 --- a/packages/webpack-bundler-runtime/src/index.ts +++ b/packages/webpack-bundler-runtime/src/index.ts @@ -6,6 +6,8 @@ import { initializeSharing } from './initializeSharing'; import { installInitialConsumes } from './installInitialConsumes'; import { attachShareScopeMap } from './attachShareScopeMap'; import { initContainerEntry } from './initContainerEntry'; +import { init } from './init'; +import { getSharedFallbackGetter } from './getSharedFallbackGetter'; export * from './types'; @@ -20,6 +22,8 @@ const federation: Federation = { S: {}, installInitialConsumes, initContainerEntry, + init, + getSharedFallbackGetter, }, attachShareScopeMap, bundlerRuntimeOptions: {}, diff --git a/packages/webpack-bundler-runtime/src/init.ts b/packages/webpack-bundler-runtime/src/init.ts new file mode 100644 index 00000000000..536804f81d5 --- /dev/null +++ b/packages/webpack-bundler-runtime/src/init.ts @@ -0,0 +1,90 @@ +import type { WebpackRequire } from './types'; +// import type { ModuleFederationRuntimePlugin } from '@module-federation/runtime'; + +// const buildTreeShakeSharePlugin: ({ +// webpackRequire, +// }: { +// webpackRequire: WebpackRequire; +// }) => ModuleFederationRuntimePlugin = function ({ +// webpackRequire, +// }: { +// webpackRequire: WebpackRequire; +// }) { +// return { +// name: 'build-tree-shake-plugin', +// beforeInit(args) { +// const { fallbackSharedAssets, usedExports, runtime, bundlerRuntime } = +// webpackRequire.federation; + +// const { userOptions, origin } = args; +// if (!userOptions.shared) { +// return args; +// } +// Object.entries(userOptions.shared).forEach(([shareName, shareArgs]) => { +// [...(Array.isArray(shareArgs) ? shareArgs : [shareArgs])].forEach( +// (shareConfig) => { +// const fallback = fallbackSharedAssets?.[shareName]; +// if (fallback) { +// shareConfig.fallback = async () => { +// const shareEntry = await runtime!.getRemoteEntry({ +// origin, +// remoteInfo: { +// name: fallback[0], +// entry: `${webpackRequire.p}${fallback[1]}`, +// type: fallback[2], +// entryGlobalName: fallback[0], +// shareScope: 'default', +// }, +// }); + +// // @ts-ignore +// await shareEntry.init(origin, bundlerRuntime); +// // @ts-ignore +// const getter = shareEntry.get(); +// console.log('fallback: ', getter); +// return getter; +// }; +// } +// const shareUsedExports = webpackRequire.j +// ? usedExports?.[shareName][webpackRequire.j] +// : undefined; +// if (shareUsedExports) { +// shareConfig.usedExports = shareUsedExports; +// } +// }, +// ); +// }); +// return args; +// }, +// }; +// }; + +export function init({ webpackRequire }: { webpackRequire: WebpackRequire }) { + const { initOptions, runtime, sharedFallback, bundlerRuntime, libraryType } = + webpackRequire.federation; + + if (!initOptions) { + throw new Error('initOptions is required!'); + } + const shared = initOptions.shared; + if (!shared || !sharedFallback) { + return runtime!.init(initOptions); + } + Object.keys(shared).forEach((sharedName) => { + const sharedArgs = Array.isArray(shared[sharedName]) + ? shared[sharedName] + : [shared[sharedName]]; + sharedArgs.forEach((sharedArg) => { + if ('get' in sharedArg) { + sharedArg.get = bundlerRuntime!.getSharedFallbackGetter({ + shareKey: sharedName, + factory: sharedArg.get, + webpackRequire, + libraryType, + version: sharedArg.version, + }); + } + }); + }); + return runtime!.init(initOptions); +} diff --git a/packages/webpack-bundler-runtime/src/installInitialConsumes.ts b/packages/webpack-bundler-runtime/src/installInitialConsumes.ts index fc4c0eb92c6..c19ccee5da4 100644 --- a/packages/webpack-bundler-runtime/src/installInitialConsumes.ts +++ b/packages/webpack-bundler-runtime/src/installInitialConsumes.ts @@ -1,10 +1,13 @@ +import { getUsedExports } from './getUsedExports'; import { HandleInitialConsumesOptions, InstallInitialConsumesOptions, } from './types'; import { updateConsumeOptions } from './updateOptions'; + function handleInitialConsumes(options: HandleInitialConsumesOptions) { - const { moduleId, moduleToHandlerMapping, webpackRequire } = options; + const { moduleId, moduleToHandlerMapping, webpackRequire, asyncLoad } = + options; const federationInstance = webpackRequire.federation.instance; if (!federationInstance) { @@ -13,8 +16,15 @@ function handleInitialConsumes(options: HandleInitialConsumesOptions) { const { shareKey, shareInfo } = moduleToHandlerMapping[moduleId]; try { + const usedExports = getUsedExports(webpackRequire, shareKey); + + if (asyncLoad) { + return federationInstance.loadShare(shareKey, { + customShareInfo: { ...shareInfo, usedExports }, + }); + } return federationInstance.loadShareSync(shareKey, { - customShareInfo: shareInfo, + customShareInfo: { ...shareInfo, usedExports }, }); } catch (err) { console.error( @@ -26,21 +36,40 @@ function handleInitialConsumes(options: HandleInitialConsumesOptions) { } export function installInitialConsumes(options: InstallInitialConsumesOptions) { - const { webpackRequire } = options; - updateConsumeOptions(options); - const { initialConsumes, moduleToHandlerMapping, installedModules } = options; + const { + moduleToHandlerMapping, + webpackRequire, + installedModules, + initialConsumes, + asyncLoad, + } = options; + + const factoryIdSets: Array< + [string | number, () => Promise unknown)> | (() => unknown)] + > = []; initialConsumes.forEach((id) => { + const factoryGetter = () => + handleInitialConsumes({ + moduleId: id, + moduleToHandlerMapping, + webpackRequire, + asyncLoad, + }) as Promise unknown)>; + factoryIdSets.push([id, factoryGetter]); + }); + + const setModule = ( + id: string | number, + factoryGetter: () => () => unknown, + ) => { webpackRequire.m[id] = (module) => { // Handle scenario when module is used synchronously installedModules[id] = 0; delete webpackRequire.c[id]; - const factory = handleInitialConsumes({ - moduleId: id, - moduleToHandlerMapping, - webpackRequire, - }); + + const factory = factoryGetter(); if (typeof factory !== 'function') { throw new Error( `Shared module is not available for eager consumption: ${id}`, @@ -68,5 +97,17 @@ export function installInitialConsumes(options: InstallInitialConsumesOptions) { } module.exports = result; }; + }; + + if (asyncLoad) { + return Promise.all( + factoryIdSets.map(async ([id, factoryGetter]) => { + const result = await factoryGetter(); + setModule(id, () => result as () => unknown); + }), + ); + } + factoryIdSets.forEach(([id, factoryGetter]) => { + setModule(id, factoryGetter as () => () => unknown); }); } diff --git a/packages/webpack-bundler-runtime/src/types.ts b/packages/webpack-bundler-runtime/src/types.ts index 64e19b06bb6..9d32e3dde45 100644 --- a/packages/webpack-bundler-runtime/src/types.ts +++ b/packages/webpack-bundler-runtime/src/types.ts @@ -109,9 +109,11 @@ export type InitializeSharingData = WithStatus<{ export interface WebpackRequire { (moduleId: string | number): any; + p: string; o: (obj: Record, key: string | number) => boolean; R: Array; m: Record any>; + j?: string; c: Record; I: ( // v1 use string , v2 support string[] @@ -172,12 +174,14 @@ export interface HandleInitialConsumesOptions { moduleId: string | number; moduleToHandlerMapping: Record; webpackRequire: WebpackRequire; + asyncLoad?: boolean; } export interface InstallInitialConsumesOptions { moduleToHandlerMapping: Record; webpackRequire: WebpackRequire; installedModules: Record | 0>; initialConsumes: Array; + asyncLoad?: boolean; } export interface ConsumesOptions { @@ -196,6 +200,14 @@ export interface InitContainerEntryOptions { initScope?: InitializeSharingOptions['initScope']; } +export interface GetSharedFallbackGetterOptions { + shareKey: string; + factory: SharedGetter; + version?: string; + webpackRequire: WebpackRequire; + libraryType?: string; +} + export interface Federation { runtime?: typeof runtime; instance?: runtime.ModuleFederation; @@ -208,6 +220,16 @@ export interface Federation { S: InferredGlobalShareScope; installInitialConsumes: (options: InstallInitialConsumesOptions) => any; initContainerEntry: typeof initContainerEntry; + init: ({ + webpackRequire, + libraryType, + }: { + webpackRequire: WebpackRequire; + libraryType: string; + }) => void; + getSharedFallbackGetter: ( + options: GetSharedFallbackGetterOptions, + ) => SharedGetter; }; bundlerRuntimeOptions: { remotes?: Exclude & { @@ -217,4 +239,13 @@ export interface Federation { attachShareScopeMap?: typeof attachShareScopeMap; hasAttachShareScopeMap?: boolean; prefetch?: () => void; + // { antd: { main: ['Button'] } } + usedExports?: { + [sharedName: string]: { + [runtimeId: string]: string[]; + }; + }; + libraryType?: string; + // { react: [ [ react/19.0.0/index.js , 19.0.0, react_global_name, ] ] } + sharedFallback?: Record>; } diff --git a/packages/webpack-bundler-runtime/src/updateOptions.ts b/packages/webpack-bundler-runtime/src/updateOptions.ts index 2d0fa498a85..ddeda156f87 100644 --- a/packages/webpack-bundler-runtime/src/updateOptions.ts +++ b/packages/webpack-bundler-runtime/src/updateOptions.ts @@ -14,7 +14,10 @@ export function updateConsumeOptions( options: InstallInitialConsumesOptions | ConsumesOptions, ) { const { webpackRequire, moduleToHandlerMapping } = options; - const { consumesLoadingData, initializeSharingData } = webpackRequire; + const { consumesLoadingData, initializeSharingData, federation } = + webpackRequire; + const { sharedFallback, bundlerRuntime, libraryType } = + webpackRequire.federation; if (consumesLoadingData && !consumesLoadingData._updated) { const { moduleIdToConsumeDataMapping: updatedModuleIdToConsumeDataMapping = {}, @@ -26,7 +29,15 @@ export function updateConsumeOptions( ([id, data]) => { if (!moduleToHandlerMapping[id]) { moduleToHandlerMapping[id] = { - getter: data.fallback, + // @ts-ignore + getter: sharedFallback + ? bundlerRuntime?.getSharedFallbackGetter({ + shareKey: data.shareKey, + factory: data.fallback, + webpackRequire, + libraryType, + }) + : data.fallback, shareInfo: { shareConfig: { requiredVersion: data.requiredVersion, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12d1f391818..89b58802bd1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2625,6 +2625,137 @@ importers: specifier: ^1.0.6 version: 1.0.6(@rsbuild/core@1.3.21) + apps/shared-treeshake/host: + dependencies: + '@babel/runtime': + specifier: 7.28.2 + version: 7.28.2 + '@modern-js/runtime': + specifier: 2.68.0 + version: 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@module-federation/enhanced': + specifier: workspace:* + version: link:../../../packages/enhanced + antd: + specifier: 5.29.1 + version: 5.29.1(react-dom@18.3.1)(react@18.3.1) + react: + specifier: ~18.3.1 + version: 18.3.1 + react-dom: + 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.68.0 + version: 2.68.0(@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)(ts-node@10.8.2)(tsconfig-paths@3.14.2)(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/plugin-server': + specifier: 2.68.0 + version: 2.68.0(@rsbuild/core@1.4.3)(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server-runtime': + specifier: 2.68.0 + version: 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/tsconfig': + specifier: 2.68.0 + version: 2.68.0 + '@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.7(@types/react@18.2.79) + fs-extra: + specifier: ^11.1.1 + version: 11.3.0 + lint-staged: + specifier: ~13.1.0 + version: 13.1.4 + prettier: + specifier: ~3.3.3 + version: 3.3.3 + rimraf: + specifier: ~3.0.2 + version: 3.0.2 + ts-node: + specifier: ~10.8.1 + version: 10.8.2(@swc/core@1.7.26)(@types/node@16.11.68)(typescript@5.0.4) + tsconfig-paths: + specifier: ~3.14.1 + version: 3.14.2 + typescript: + specifier: ~5.0.4 + version: 5.0.4 + + apps/shared-treeshake/provider: + dependencies: + '@babel/runtime': + specifier: 7.28.2 + version: 7.28.2 + '@modern-js/runtime': + specifier: 2.68.0 + version: 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@module-federation/enhanced': + specifier: workspace:* + version: link:../../../packages/enhanced + antd: + specifier: 4.24.15 + version: 4.24.15(react-dom@18.3.1)(react@18.3.1) + react: + specifier: ~18.3.1 + version: 18.3.1 + react-dom: + 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.68.0 + version: 2.68.0(@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)(ts-node@10.9.1)(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.68.0 + version: 2.68.0 + '@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.7(@types/react@18.2.79) + lint-staged: + specifier: ~13.1.0 + version: 13.1.4 + prettier: + specifier: ~3.3.3 + version: 3.3.3 + rimraf: + specifier: ~3.0.2 + version: 3.0.2 + typescript: + specifier: ~5.0.4 + version: 5.0.4 + apps/website-new: dependencies: '@module-federation/error-codes': @@ -2694,10 +2825,10 @@ importers: devDependencies: '@babel/preset-env': specifier: ^7.28.0 - version: 7.28.0(@babel/core@7.28.5) + version: 7.28.0(@babel/core@7.28.0) '@babel/preset-typescript': specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.5) + version: 7.27.1(@babel/core@7.28.0) '@changesets/config': specifier: '*' version: 3.0.3 @@ -3064,7 +3195,7 @@ importers: version: 18.3.1(react@18.3.1) ts-jest: specifier: 29.0.1 - version: 29.0.1(@babel/core@7.28.5)(babel-jest@29.7.0)(esbuild@0.25.0)(jest@29.7.0)(typescript@5.8.3) + version: 29.0.1(@babel/core@7.28.0)(babel-jest@29.7.0)(esbuild@0.25.0)(jest@29.7.0)(typescript@5.8.3) webpack: specifier: 5.75.0 version: 5.75.0(@swc/core@1.7.26)(esbuild@0.25.0)(webpack-cli@5.1.4) @@ -3335,7 +3466,7 @@ importers: version: 19.1.0 react-native: specifier: 0.80.0 - version: 0.80.0(@babel/core@7.28.5)(@types/react@19.1.8)(react@19.1.0) + version: 0.80.0(@babel/core@7.28.0)(@react-native-community/cli@19.1.1)(@types/react@19.1.8)(react@19.1.0) ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.7.26)(@types/node@20.12.14)(typescript@5.8.3) @@ -3910,6 +4041,25 @@ packages: '@ctrl/tinycolor': 3.6.1 dev: false + /@ant-design/colors@7.2.1: + resolution: {integrity: sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==} + dependencies: + '@ant-design/fast-color': 2.0.6 + dev: false + + /@ant-design/cssinjs-utils@1.1.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@ant-design/cssinjs': 1.24.0(react-dom@18.3.1)(react@18.3.1) + '@babel/runtime': 7.28.2 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@ant-design/cssinjs@1.21.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-tyWnlK+XH7Bumd0byfbCiZNK43HEubMoCcu9VxwsAwiHdHTgWa+tMN0/yvxa+e8EzuFP1WdUNNPclRpVtD33lg==} peerDependencies: @@ -3943,6 +4093,30 @@ packages: stylis: 4.3.4 dev: false + /@ant-design/cssinjs@1.24.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.28.2 + '@emotion/hash': 0.8.0 + '@emotion/unitless': 0.7.5 + classnames: 2.5.1 + csstype: 3.1.3 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + stylis: 4.3.4 + dev: false + + /@ant-design/fast-color@2.0.6: + resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==} + engines: {node: '>=8.x'} + dependencies: + '@babel/runtime': 7.28.2 + dev: false + /@ant-design/icons-svg@4.4.2: resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} @@ -3994,6 +4168,22 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@ant-design/icons@5.6.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==} + engines: {node: '>=8'} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@ant-design/colors': 7.2.1 + '@ant-design/icons-svg': 4.4.2 + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@ant-design/react-slick@1.0.2(react@18.3.1): resolution: {integrity: sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==} peerDependencies: @@ -4321,29 +4511,7 @@ packages: '@babel/traverse': 7.28.0 '@babel/types': 7.28.2 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - /@babel/core@7.28.5: - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -4364,20 +4532,6 @@ packages: semver: 6.3.1 dev: true - /@babel/eslint-parser@7.25.7(@babel/core@7.28.5)(eslint@8.57.1): - resolution: {integrity: sha512-B+BO9x86VYsQHimucBAL1fxTJKF4wyKY6ZVzee9QgzdZOUfs3BaR6AQrgoGrRI+7IFS1wUz/VyQ+SoBcSpdPbw==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - dependencies: - '@babel/core': 7.28.5 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.1 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - dev: true - /@babel/eslint-plugin@7.25.7(@babel/eslint-parser@7.25.7)(eslint@8.57.1): resolution: {integrity: sha512-cwa16ALyUdac3n3VC3R+isKENyjLsJmFY6+cX0wuLsKlwB50Jv/xwqyH9tV8EEH0IUCAL5Y0Y1gP0HuCEDDDeQ==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -4385,7 +4539,7 @@ packages: '@babel/eslint-parser': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 dependencies: - '@babel/eslint-parser': 7.25.7(@babel/core@7.28.5)(eslint@8.57.1) + '@babel/eslint-parser': 7.25.7(@babel/core@7.28.0)(eslint@8.57.1) eslint: 8.57.1 eslint-rule-composer: 0.3.0 dev: true @@ -4484,24 +4638,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} engines: {node: '>=6.9.0'} @@ -4513,18 +4649,6 @@ packages: regexpu-core: 6.2.0 semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.2.0 - semver: 6.3.1 - dev: true - /@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0): resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} peerDependencies: @@ -4539,21 +4663,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5): - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.3(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-globals@7.28.0: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} @@ -4650,33 +4759,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.27.3(@babel/core@7.28.5): - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5): - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - /@babel/helper-optimise-call-expression@7.25.7: resolution: {integrity: sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==} engines: {node: '>=6.9.0'} @@ -4716,20 +4798,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} @@ -4743,20 +4811,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-skip-transparent-expression-wrappers@7.25.7: resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==} engines: {node: '>=6.9.0'} @@ -4809,13 +4863,6 @@ packages: '@babel/template': 7.27.2 '@babel/types': 7.28.2 - /@babel/helpers@7.28.4: - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - /@babel/highlight@7.25.7: resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} engines: {node: '>=6.9.0'} @@ -4859,19 +4906,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} @@ -4881,16 +4915,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} @@ -4900,16 +4924,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} @@ -4923,20 +4937,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} engines: {node: '>=6.9.0'} @@ -4949,19 +4949,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-decorators@7.25.7(@babel/core@7.28.0): resolution: {integrity: sha512-q1mqqqH0e1lhmsEQHV5U8OmdueBC2y0RFr2oUzZoFRtN3MvPmt2fsFRcNQAoGLTSNdHBFUYGnlgcRFhkBbKjPw==} engines: {node: '>=6.9.0'} @@ -5041,15 +5028,6 @@ packages: dependencies: '@babel/core': 7.28.0 - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -5058,14 +5036,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -5074,14 +5044,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -5090,14 +5052,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -5107,15 +5061,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-decorators@7.25.7(@babel/core@7.28.0): resolution: {integrity: sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw==} engines: {node: '>=6.9.0'} @@ -5183,16 +5128,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} @@ -5202,15 +5137,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: @@ -5219,14 +5145,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -5235,14 +5153,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9): resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} peerDependencies: @@ -5281,16 +5191,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -5299,14 +5199,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -5315,14 +5207,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -5331,14 +5215,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -5356,14 +5232,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -5372,14 +5240,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -5388,14 +5248,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-pipeline-operator@7.25.7(@babel/core@7.28.0): resolution: {integrity: sha512-8xa7wyr0Ppxy7j4FaakNSaVNrDQfTKmO/+iswNuj+ZSx7GP+UReoip4YUeus3eFWG1mzx50RZf8fherszXTtgg==} engines: {node: '>=6.9.0'} @@ -5415,15 +5267,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -5433,15 +5276,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.28.0): resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==} engines: {node: '>=6.9.0'} @@ -5461,16 +5295,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -5481,17 +5305,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} @@ -5501,16 +5314,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0): resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} engines: {node: '>=6.9.0'} @@ -5524,20 +5327,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5): - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} @@ -5551,20 +5340,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} @@ -5574,16 +5349,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0): resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} engines: {node: '>=6.9.0'} @@ -5593,16 +5358,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.5): - resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.28.0): resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} engines: {node: '>=6.9.0'} @@ -5627,19 +5382,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} engines: {node: '>=6.9.0'} @@ -5652,19 +5394,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0): resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} engines: {node: '>=6.9.0'} @@ -5681,23 +5410,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.5): - resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} @@ -5708,17 +5420,6 @@ packages: '@babel/helper-plugin-utils': 7.27.1 '@babel/template': 7.27.2 - /@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 - dev: true - /@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0): resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} engines: {node: '>=6.9.0'} @@ -5731,19 +5432,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.5): - resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} @@ -5754,17 +5442,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} @@ -5774,16 +5451,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} @@ -5794,17 +5461,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} @@ -5814,16 +5470,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0): resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} engines: {node: '>=6.9.0'} @@ -5836,19 +5482,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5): - resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} @@ -5858,16 +5491,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.28.0): resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} engines: {node: '>=6.9.0'} @@ -5887,16 +5510,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-flow-strip-types@7.25.7(@babel/core@7.28.0): resolution: {integrity: sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w==} engines: {node: '>=6.9.0'} @@ -5920,19 +5533,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} @@ -5946,20 +5546,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} @@ -5969,16 +5555,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} @@ -5988,16 +5564,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} engines: {node: '>=6.9.0'} @@ -6007,16 +5573,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} @@ -6026,16 +5582,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} @@ -6048,19 +5594,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} @@ -6073,19 +5606,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} engines: {node: '>=6.9.0'} @@ -6100,21 +5620,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} engines: {node: '>=6.9.0'} @@ -6127,19 +5632,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} engines: {node: '>=6.9.0'} @@ -6150,17 +5642,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} @@ -6170,16 +5651,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} @@ -6189,16 +5660,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.28.0): resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} engines: {node: '>=6.9.0'} @@ -6218,16 +5679,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.28.0): resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} engines: {node: '>=6.9.0'} @@ -6255,22 +5706,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.5): - resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} @@ -6283,19 +5718,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} @@ -6305,16 +5727,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} engines: {node: '>=6.9.0'} @@ -6327,19 +5739,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-parameters@7.27.7(@babel/core@7.12.9): resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} engines: {node: '>=6.9.0'} @@ -6359,16 +5758,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5): - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} @@ -6381,19 +5770,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} @@ -6407,20 +5783,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} @@ -6430,16 +5792,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-react-constant-elements@7.25.1(@babel/core@7.28.0): resolution: {integrity: sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==} engines: {node: '>=6.9.0'} @@ -6546,16 +5898,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-regenerator@7.28.1(@babel/core@7.28.5): - resolution: {integrity: sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} @@ -6566,17 +5908,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} @@ -6586,16 +5917,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-runtime@7.25.7(@babel/core@7.28.0): resolution: {integrity: sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==} engines: {node: '>=6.9.0'} @@ -6621,16 +5942,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} @@ -6643,19 +5954,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} @@ -6665,16 +5963,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} @@ -6684,16 +5972,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} @@ -6703,16 +5981,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-typescript@7.25.2(@babel/core@7.28.0): resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} engines: {node: '>=6.9.0'} @@ -6744,22 +6012,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.5): - resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} @@ -6769,16 +6021,6 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} @@ -6789,17 +6031,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} @@ -6810,17 +6041,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0): resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} @@ -6831,17 +6051,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - /@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - dev: true - /@babel/preset-env@7.28.0(@babel/core@7.28.0): resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} engines: {node: '>=6.9.0'} @@ -6922,87 +6131,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-env@7.28.0(@babel/core@7.28.5): - resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-regenerator': 7.28.1(@babel/core@7.28.5) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.44.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/preset-flow@7.25.7(@babel/core@7.28.0): resolution: {integrity: sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ==} engines: {node: '>=6.9.0'} @@ -7025,17 +6153,6 @@ packages: '@babel/types': 7.28.5 esutils: 2.0.3 - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.5 - esutils: 2.0.3 - dev: true - /@babel/preset-react@7.26.3(@babel/core@7.28.0): resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} engines: {node: '>=6.9.0'} @@ -7100,22 +6217,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/preset-typescript@7.27.1(@babel/core@7.28.5): - resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/register@7.25.7(@babel/core@7.28.0): resolution: {integrity: sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q==} engines: {node: '>=6.9.0'} @@ -7170,11 +6271,12 @@ packages: '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - debug: 4.4.3(supports-color@8.1.1) + '@babel/types': 7.28.2 + debug: 4.4.1(supports-color@9.3.1) globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true /@babel/traverse@7.28.0: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} @@ -9755,7 +8857,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -9799,7 +8901,7 @@ packages: '@expo/spawn-async': 1.7.2 arg: 5.0.2 chalk: 4.1.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) find-up: 5.0.0 getenv: 1.0.0 minimatch: 3.1.2 @@ -9815,7 +8917,7 @@ packages: peerDependencies: react-native: '*' dependencies: - react-native: 0.80.0(@babel/core@7.28.5)(@types/react@19.1.8)(react@19.1.0) + react-native: 0.80.0(@babel/core@7.28.0)(@react-native-community/cli@19.1.1)(@types/react@19.1.8)(react@19.1.0) dev: false /@expo/spawn-async@1.7.2: @@ -9903,7 +9005,7 @@ packages: deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10170,7 +9272,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.12.14 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -10191,14 +9293,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.12.14 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.16.9)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@20.12.14)(ts-node@10.9.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -10232,7 +9334,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.12.14 jest-mock: 29.7.0 /@jest/expect-utils@29.7.0: @@ -10258,7 +9360,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.16.9 + '@types/node': 20.12.14 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -10290,7 +9392,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 18.16.9 + '@types/node': 20.12.14 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -10386,7 +9488,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.16.9 + '@types/node': 20.12.14 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -10404,12 +9506,6 @@ packages: '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping': 0.3.31 - /@jridgewell/remapping@2.3.5: - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -10913,7 +10009,7 @@ packages: typescript: ^4 || ^5 dependencies: '@babel/core': 7.28.0 - '@babel/eslint-parser': 7.25.7(@babel/core@7.28.5)(eslint@8.57.1) + '@babel/eslint-parser': 7.25.7(@babel/core@7.28.0)(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) '@rsbuild/core': 1.0.1-rc.4 @@ -11012,6 +10108,77 @@ packages: redux: 4.2.1 dev: true + /@modern-js/app-tools@2.68.0(@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)(ts-node@10.8.2)(tsconfig-paths@3.14.2)(typescript@5.0.4)(webpack-cli@5.1.4): + resolution: {integrity: sha512-yoiEwWvVYa7fZjHIAdl4kWSrNWKbCupxlolOhAurGkDe2ypdlVE2IVzjTdrBbB6DSa+TjaE688fWOHiga3nBKg==} + engines: {node: '>=14.17.6'} + hasBin: true + peerDependencies: + ts-node: ^10.7.0 + tsconfig-paths: ^4.2.0 + peerDependenciesMeta: + ts-node: + optional: true + tsconfig-paths: + optional: true + dependencies: + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.2 + '@modern-js/core': 2.68.0 + '@modern-js/node-bundle-require': 2.68.0 + '@modern-js/plugin': 2.68.0 + '@modern-js/plugin-data-loader': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/plugin-i18n': 2.68.0 + '@modern-js/plugin-v2': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/prod-server': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/rsbuild-plugin-esbuild': 2.68.0(@swc/core@1.7.26)(webpack-cli@5.1.4) + '@modern-js/server': 2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3)(react-dom@18.3.1)(react@18.3.1)(ts-node@10.8.2)(tsconfig-paths@3.14.2) + '@modern-js/server-core': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server-utils': 2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3) + '@modern-js/types': 2.68.0 + '@modern-js/uni-builder': 2.68.0(@rspack/core@1.3.9)(esbuild@0.25.5)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) + '@modern-js/utils': 2.68.0 + '@rsbuild/core': 1.4.3 + '@rsbuild/plugin-node-polyfill': 1.3.0(@rsbuild/core@1.4.3) + '@swc/helpers': 0.5.17 + es-module-lexer: 1.7.0 + esbuild: 0.25.5 + esbuild-register: 3.6.0(esbuild@0.25.5) + flatted: 3.3.3 + mlly: 1.7.4 + ndepe: 0.1.12(encoding@0.1.13) + pkg-types: 1.3.1 + std-env: 3.7.0 + ts-node: 10.8.2(@swc/core@1.7.26)(@types/node@16.11.68)(typescript@5.0.4) + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - '@parcel/css' + - '@rspack/core' + - '@swc/core' + - '@swc/css' + - '@types/webpack' + - bufferutil + - clean-css + - csso + - debug + - devcert + - encoding + - lightningcss + - react + - react-dom + - sockjs-client + - styled-components + - supports-color + - type-fest + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + /@modern-js/app-tools@2.68.0(@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)(ts-node@10.9.1)(typescript@5.0.4)(webpack-cli@5.1.4): resolution: {integrity: sha512-yoiEwWvVYa7fZjHIAdl4kWSrNWKbCupxlolOhAurGkDe2ypdlVE2IVzjTdrBbB6DSa+TjaE688fWOHiga3nBKg==} engines: {node: '>=14.17.6'} @@ -11025,8 +10192,8 @@ packages: tsconfig-paths: optional: true dependencies: - '@babel/parser': 7.27.2 - '@babel/traverse': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.28.0 '@babel/types': 7.28.2 '@modern-js/core': 2.68.0 '@modern-js/node-bundle-require': 2.68.0 @@ -11036,22 +10203,22 @@ packages: '@modern-js/plugin-v2': 2.68.0(react-dom@18.3.1)(react@18.3.1) '@modern-js/prod-server': 2.68.0(react-dom@18.3.1)(react@18.3.1) '@modern-js/rsbuild-plugin-esbuild': 2.68.0(@swc/core@1.7.26)(webpack-cli@5.1.4) - '@modern-js/server': 2.68.0(@babel/traverse@7.27.1)(@rsbuild/core@1.4.3)(react-dom@18.3.1)(react@18.3.1)(ts-node@10.9.1) + '@modern-js/server': 2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3)(react-dom@18.3.1)(react@18.3.1)(ts-node@10.9.1) '@modern-js/server-core': 2.68.0(react-dom@18.3.1)(react@18.3.1) - '@modern-js/server-utils': 2.68.0(@babel/traverse@7.27.1)(@rsbuild/core@1.4.3) + '@modern-js/server-utils': 2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3) '@modern-js/types': 2.68.0 '@modern-js/uni-builder': 2.68.0(@rspack/core@1.3.9)(esbuild@0.25.5)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/utils': 2.68.0 '@rsbuild/core': 1.4.3 '@rsbuild/plugin-node-polyfill': 1.3.0(@rsbuild/core@1.4.3) '@swc/helpers': 0.5.17 - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 esbuild: 0.25.5 esbuild-register: 3.6.0(esbuild@0.25.5) flatted: 3.3.3 mlly: 1.7.4 ndepe: 0.1.12(encoding@0.1.13) - pkg-types: 1.2.1 + pkg-types: 1.3.1 std-env: 3.7.0 ts-node: 10.9.1(@swc/core@1.7.26)(@types/node@18.16.9)(typescript@5.8.3) transitivePeerDependencies: @@ -11536,6 +10703,21 @@ packages: '@swc/helpers': 0.5.17 dev: true + /@modern-js/plugin-server@2.68.0(@rsbuild/core@1.4.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-tdegezouQSjTTMSjOVAfPUcxaUXUhHeO3LSAYlWGMv9ovZqxaycvzAYxlfO84Lwf813qrv98ZEGr1zP4HD7eKA==} + dependencies: + '@modern-js/runtime-utils': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server-utils': 2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3) + '@modern-js/utils': 2.68.0 + '@swc/helpers': 0.5.17 + transitivePeerDependencies: + - '@babel/traverse' + - '@rsbuild/core' + - react + - react-dom + - supports-color + dev: true + /@modern-js/plugin-state@2.68.2(@modern-js/runtime@2.68.2)(@types/react-dom@18.3.0)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-MiSYo7EQQ14XlgHeeeVcOM7qVGTasfs7AJgbp+aPE/AnZV0ju9346v7z6mOL6LDIx7pzvOeYs0dbCEPw5qW6ug==} peerDependencies: @@ -11741,7 +10923,7 @@ packages: '@types/react-helmet': 6.1.11 '@types/styled-components': 5.1.34 cookie: 0.7.2 - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 esbuild: 0.25.5 invariant: 2.2.4 isbot: 3.7.1 @@ -11834,6 +11016,17 @@ packages: - react-dom dev: true + /@modern-js/server-runtime@2.68.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-j4FxK+JvuR6pwf4BZfVus/07H6uhJtQMd01Z/24Vj4gT0tGUqTWuUVQtaEQbMO26kw8rhzDbujuLhQbw0kWAAg==} + dependencies: + '@modern-js/runtime-utils': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server-core': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@swc/helpers': 0.5.17 + transitivePeerDependencies: + - react + - react-dom + dev: true + /@modern-js/server-runtime@2.68.2(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-ZsD2tpMaA+ZCDlj9dDQAeLEzWxNGaPCaRENXbjIWLAL135tCD5wFUxmGtsAv/wvTMZcuCEwrsv8tbHPA6eb4bA==} dependencies: @@ -11845,7 +11038,7 @@ packages: - react-dom dev: true - /@modern-js/server-utils@2.68.0(@babel/traverse@7.27.1)(@rsbuild/core@1.4.3): + /@modern-js/server-utils@2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3): resolution: {integrity: sha512-VkHJm4IoxXOCYPoUMVq8userl9mI4FIqXokZUxVCoc6PAUgPj+axkWEPLpRsCuKRPQdn08MEHd3vI72wJ+P3Zg==} dependencies: '@babel/core': 7.28.0 @@ -11858,7 +11051,7 @@ packages: '@modern-js/babel-preset': 2.68.0(@rsbuild/core@1.4.3) '@modern-js/utils': 2.68.0 '@swc/helpers': 0.5.17 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.27.1) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0) transitivePeerDependencies: - '@babel/traverse' - '@rsbuild/core' @@ -11885,7 +11078,48 @@ packages: - supports-color dev: true - /@modern-js/server@2.68.0(@babel/traverse@7.27.1)(@rsbuild/core@1.4.3)(react-dom@18.3.1)(react@18.3.1)(ts-node@10.9.1): + /@modern-js/server@2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3)(react-dom@18.3.1)(react@18.3.1)(ts-node@10.8.2)(tsconfig-paths@3.14.2): + resolution: {integrity: sha512-5r1Bl2osn84wixU625KQGs2FnP0diyk5hZucteogFTAKWz9jo128Ry9ePTXegUnHGc8K/9l4Ex5PsQdXgOPhvA==} + 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.28.0 + '@babel/register': 7.25.7(@babel/core@7.28.0) + '@modern-js/runtime-utils': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server-core': 2.68.0(react-dom@18.3.1)(react@18.3.1) + '@modern-js/server-utils': 2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3) + '@modern-js/types': 2.68.0 + '@modern-js/utils': 2.68.0 + '@swc/helpers': 0.5.17 + axios: 1.13.1 + connect-history-api-fallback: 2.0.0 + http-compression: 1.0.6 + minimatch: 3.1.2 + path-to-regexp: 6.3.0 + ts-node: 10.8.2(@swc/core@1.7.26)(@types/node@16.11.68)(typescript@5.0.4) + tsconfig-paths: 3.14.2 + ws: 8.18.0 + transitivePeerDependencies: + - '@babel/traverse' + - '@rsbuild/core' + - bufferutil + - debug + - react + - react-dom + - supports-color + - utf-8-validate + dev: true + + /@modern-js/server@2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3)(react-dom@18.3.1)(react@18.3.1)(ts-node@10.9.1): resolution: {integrity: sha512-5r1Bl2osn84wixU625KQGs2FnP0diyk5hZucteogFTAKWz9jo128Ry9ePTXegUnHGc8K/9l4Ex5PsQdXgOPhvA==} peerDependencies: devcert: ^1.2.2 @@ -11903,7 +11137,7 @@ packages: '@babel/register': 7.25.7(@babel/core@7.28.0) '@modern-js/runtime-utils': 2.68.0(react-dom@18.3.1)(react@18.3.1) '@modern-js/server-core': 2.68.0(react-dom@18.3.1)(react@18.3.1) - '@modern-js/server-utils': 2.68.0(@babel/traverse@7.27.1)(@rsbuild/core@1.4.3) + '@modern-js/server-utils': 2.68.0(@babel/traverse@7.28.0)(@rsbuild/core@1.4.3) '@modern-js/types': 2.68.0 '@modern-js/utils': 2.68.0 '@swc/helpers': 0.5.17 @@ -11913,7 +11147,7 @@ packages: minimatch: 3.1.2 path-to-regexp: 6.3.0 ts-node: 10.9.1(@swc/core@1.7.26)(@types/node@18.16.9)(typescript@5.8.3) - ws: 8.18.3 + ws: 8.18.0 transitivePeerDependencies: - '@babel/traverse' - '@rsbuild/core' @@ -12202,7 +11436,7 @@ packages: babel-plugin-transform-react-remove-prop-types: 0.4.24 browserslist: 4.24.4 cssnano: 6.1.2(postcss@8.4.38) - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 glob: 9.3.5 html-minifier-terser: 7.2.0 html-webpack-plugin: 5.6.3(@rspack/core@1.3.9)(webpack@5.99.9) @@ -12250,8 +11484,8 @@ packages: resolution: {integrity: sha512-ZGQup+zYHVl2RZoBJnwW/C/qNOI2ABX4B23YtyNDrmTHCk5kIHXTPScUScS7Eai637xzYfWSFeZGhfN1DOas2Q==} dependencies: '@babel/core': 7.28.0 - '@babel/preset-react': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.5 + '@babel/preset-react': 7.26.3(@babel/core@7.28.0) + '@babel/types': 7.28.2 '@modern-js/babel-preset': 2.68.2(@rsbuild/core@1.4.4) '@modern-js/flight-server-transform-plugin': 2.68.2 '@modern-js/utils': 2.68.2 @@ -12283,7 +11517,7 @@ packages: babel-plugin-transform-react-remove-prop-types: 0.4.24 browserslist: 4.24.4 cssnano: 6.1.2(postcss@8.5.6) - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 glob: 9.3.5 html-minifier-terser: 7.2.0 html-webpack-plugin: 5.6.3(@rspack/core@1.3.9)(webpack@5.99.9) @@ -12331,8 +11565,8 @@ packages: resolution: {integrity: sha512-ZGQup+zYHVl2RZoBJnwW/C/qNOI2ABX4B23YtyNDrmTHCk5kIHXTPScUScS7Eai637xzYfWSFeZGhfN1DOas2Q==} dependencies: '@babel/core': 7.28.0 - '@babel/preset-react': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.5 + '@babel/preset-react': 7.26.3(@babel/core@7.28.0) + '@babel/types': 7.28.2 '@modern-js/babel-preset': 2.68.2(@rsbuild/core@1.4.4) '@modern-js/flight-server-transform-plugin': 2.68.2 '@modern-js/utils': 2.68.2 @@ -12364,7 +11598,7 @@ packages: babel-plugin-transform-react-remove-prop-types: 0.4.24 browserslist: 4.24.4 cssnano: 6.1.2(postcss@8.5.6) - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 glob: 9.3.5 html-minifier-terser: 7.2.0 html-webpack-plugin: 5.6.3(@rspack/core@1.3.9)(webpack@5.99.9) @@ -12445,7 +11679,7 @@ packages: babel-plugin-transform-react-remove-prop-types: 0.4.24 browserslist: 4.24.4 cssnano: 6.1.2(postcss@8.5.6) - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 glob: 9.3.5 html-minifier-terser: 7.2.0 html-webpack-plugin: 5.6.3(@rspack/core@1.3.9)(webpack@5.99.9) @@ -12502,7 +11736,7 @@ packages: resolution: {integrity: sha512-Wmjfh4o6nMJvbUYJlnZrWNMT2Ps27QT7Jgd7EmeQG3vWEniqhGx59MSfK9oxgL7oacP0ArY9VDJovCBCXC7jng==} dependencies: '@swc/helpers': 0.5.17 - caniuse-lite: 1.0.30001718 + caniuse-lite: 1.0.30001731 lodash: 4.17.21 rslog: 1.2.3 @@ -14319,7 +13553,7 @@ packages: '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.28.0) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.27.1) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -14370,7 +13604,7 @@ packages: '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.28.0) babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.27.1) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -14421,7 +13655,7 @@ packages: '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.28.0) babel-plugin-macros: 3.1.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.27.1) + babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0) chalk: 4.1.2 columnify: 1.6.0 detect-port: 1.6.1 @@ -16540,6 +15774,20 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@rc-component/color-picker@2.0.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@ant-design/fast-color': 2.0.6 + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@rc-component/context@1.4.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} peerDependencies: @@ -16547,7 +15795,7 @@ packages: react-dom: '>=16.9.0' dependencies: '@babel/runtime': 7.28.2 - rc-util: 5.43.0(react-dom@17.0.2)(react@17.0.2) + rc-util: 5.44.4(react-dom@17.0.2)(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: false @@ -16608,7 +15856,7 @@ packages: dependencies: '@babel/runtime': 7.28.2 classnames: 2.5.1 - rc-util: 5.43.0(react-dom@17.0.2)(react@17.0.2) + rc-util: 5.44.4(react-dom@17.0.2)(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: false @@ -16654,6 +15902,19 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@rc-component/qrcode@1.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ABA80Yer0c6I2+moqNY0kF3Y1NxIT6wDP/EINIqbiRbfZKP1HtHpKMh8WuTXLgVGYsoWG2g9/n0PgM8KdnJb4Q==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@rc-component/tour@1.15.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==} engines: {node: '>=8.x'} @@ -16720,6 +15981,23 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@rc-component/trigger@2.3.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-iwaxZyzOuK0D7lS+0AQEtW52zUWxoGqTGkke3dRyb8pYiShmRpCjB/8TzPI4R6YySCH7Vm9BZj/31VPiiQTLBg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@react-native-community/cli-clean@19.1.1: resolution: {integrity: sha512-pP7SmK+PNw5B1Aa2c6y06FBNc9iGah/leFFM2uewpyZRJQ4zycX6Zz1UANpq9YZfp65n7NZKV9Gct2uaVRuP/Q==} dependencies: @@ -17017,19 +16295,6 @@ packages: nullthrows: 1.1.1 yargs: 17.7.2 - /@react-native/codegen@0.80.0(@babel/core@7.28.5): - resolution: {integrity: sha512-X9TsPgytoUkNrQjzAZh4dXa4AuouvYT0NzYyvnjw1ry4LESCZtKba+eY4x3+M30WPR52zjgu+UFL//14BSdCCA==} - engines: {node: '>=18'} - peerDependencies: - '@babel/core': '*' - dependencies: - '@babel/core': 7.28.5 - glob: 7.2.0 - hermes-parser: 0.28.1 - invariant: 2.2.4 - nullthrows: 1.1.1 - yargs: 17.7.2 - /@react-native/community-cli-plugin@0.80.0(@react-native-community/cli@19.1.1): resolution: {integrity: sha512-uadfVvzZfz5tGpqwslL12i+rELK9m6cLhtqICX0JQvS7Bu12PJwrozhKzEzIYwN9i3wl2dWrKDUr08izt7S9Iw==} engines: {node: '>=18'} @@ -17042,7 +16307,7 @@ packages: '@react-native-community/cli': 19.1.1(typescript@5.0.4) '@react-native/dev-middleware': 0.80.0 chalk: 4.1.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) invariant: 2.2.4 metro: 0.82.5 metro-config: 0.82.5 @@ -18226,7 +17491,7 @@ packages: '@rspack/core': 1.0.14(@swc/helpers@0.5.17) '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 - caniuse-lite: 1.0.30001718 + caniuse-lite: 1.0.30001731 core-js: 3.38.1 optionalDependencies: fsevents: 2.3.3 @@ -21020,7 +20285,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) dir-glob: 3.0.1 globby: 14.1.0 http-proxy-agent: 7.0.2 @@ -21388,7 +20653,7 @@ packages: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 css-loader: 6.11.0(@rspack/core@1.3.9)(webpack@5.98.0) - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.98.0) html-webpack-plugin: 5.6.2(@rspack/core@1.3.9)(webpack@5.98.0) magic-string: 0.30.17 @@ -21985,7 +21250,7 @@ packages: typescript: '>= 3.x' webpack: '>= 4' dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -22467,7 +21732,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) oxc-resolver: 5.2.0 pirates: 4.0.7 tslib: 2.8.1 @@ -22990,7 +22255,7 @@ packages: /@types/accepts@1.3.7: resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 dev: true /@types/adm-zip@0.5.5: @@ -23041,12 +22306,12 @@ packages: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/bonjour@3.5.13: resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/btoa@1.2.5: resolution: {integrity: sha512-BItINdjZRlcGdI2efwK4bwxY5vEAT0SnIVfMOZVT18wp4900F1Lurqk/9PNdF9hMP1zgFmWbjVEtAsQKVcbqxA==} @@ -23079,12 +22344,12 @@ packages: resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} dependencies: '@types/express-serve-static-core': 5.0.0 - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/content-disposition@0.5.8: resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} @@ -23093,7 +22358,7 @@ packages: /@types/conventional-commits-parser@5.0.0: resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 dev: true /@types/conventional-commits-parser@5.0.1: @@ -23114,7 +22379,7 @@ packages: '@types/connect': 3.4.38 '@types/express': 4.17.21 '@types/keygrip': 1.0.6 - '@types/node': 18.16.9 + '@types/node': 20.12.14 dev: true /@types/cross-spawn@6.0.6: @@ -23314,7 +22579,7 @@ packages: /@types/decompress@4.2.7: resolution: {integrity: sha512-9z+8yjKr5Wn73Pt17/ldnmQToaFHZxK0N1GHysuk/JIPT8RIdQeoInM01wWPgypRcvb6VH1drjuFpQ4zmY437g==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 dev: true /@types/deep-eql@4.0.2: @@ -23391,7 +22656,7 @@ packages: /@types/express-serve-static-core@4.19.6: resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -23399,7 +22664,7 @@ packages: /@types/express-serve-static-core@5.0.0: resolution: {integrity: sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -23429,7 +22694,7 @@ packages: /@types/fs-extra@8.1.5: resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 dev: true /@types/fs-extra@9.0.13: @@ -23458,7 +22723,7 @@ packages: /@types/got@9.6.12: resolution: {integrity: sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 '@types/tough-cookie': 4.0.5 form-data: 2.5.1 dev: true @@ -23466,7 +22731,7 @@ packages: /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/har-format@1.2.16: resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} @@ -23517,7 +22782,7 @@ packages: /@types/http-proxy@1.17.15: resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/istanbul-lib-coverage@2.0.6: resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -23553,7 +22818,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 dev: true @@ -23656,7 +22921,7 @@ packages: /@types/node-forge@1.3.11: resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/node-schedule@2.1.7: resolution: {integrity: sha512-G7Z3R9H7r3TowoH6D2pkzUHPhcJrDF4Jz1JOQ80AX0K2DWTHoN9VC94XzFAPNMdbW9TBzMZ3LjpFi7RYdbxtXA==} @@ -23807,7 +23072,7 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 dev: true /@types/resolve@1.20.2: @@ -23836,7 +23101,7 @@ packages: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/serve-index@1.9.4: resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} @@ -23847,13 +23112,13 @@ packages: resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} dependencies: '@types/http-errors': 2.0.4 - '@types/node': 18.16.9 + '@types/node': 20.12.14 '@types/send': 0.17.4 /@types/set-cookie-parser@2.4.10: resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 dev: true /@types/sinonjs__fake-timers@8.1.1: @@ -23867,7 +23132,7 @@ packages: /@types/sockjs@0.3.36: resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 /@types/source-list-map@0.1.6: resolution: {integrity: sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==} @@ -23926,7 +23191,7 @@ packages: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 dev: true optional: true @@ -24088,7 +23353,7 @@ packages: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.0.4) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7 + debug: 4.4.1(supports-color@9.3.1) eslint: 8.57.1 typescript: 5.0.4 transitivePeerDependencies: @@ -24776,7 +24041,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) lodash: 4.17.21 verdaccio-htpasswd: 13.0.0-next-8.15 transitivePeerDependencies: @@ -24795,7 +24060,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) js-yaml: 4.1.0 lodash: 4.17.21 minimatch: 7.4.6 @@ -24829,7 +24094,7 @@ packages: resolution: {integrity: sha512-yuqD8uAZJcgzuNHjV6C438UNT5r2Ai9+SnUlO34AHZdWSYcluO3Zj5R3p5uf+C7YPCE31pUD27wBU74xVbUoBw==} engines: {node: '>=18'} dependencies: - debug: 4.4.0(supports-color@9.3.1) + debug: 4.4.0(supports-color@8.1.1) lodash: 4.17.21 transitivePeerDependencies: - supports-color @@ -24856,7 +24121,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -24887,7 +24152,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) express: 4.21.2 express-rate-limit: 5.5.1 lodash: 4.17.21 @@ -24905,7 +24170,7 @@ packages: engines: {node: '>=18'} dependencies: '@verdaccio/config': 8.0.0-next-8.15 - debug: 4.4.0(supports-color@9.3.1) + debug: 4.4.0(supports-color@8.1.1) jsonwebtoken: 9.0.2 transitivePeerDependencies: - supports-color @@ -24921,7 +24186,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) gunzip-maybe: 1.4.2 lodash: 4.17.21 tar-stream: 3.1.7 @@ -24937,7 +24202,7 @@ packages: engines: {node: '>=18'} dependencies: '@verdaccio/core': 8.0.0-next-8.15 - debug: 4.4.0(supports-color@9.3.1) + debug: 4.4.0(supports-color@8.1.1) lodash: 4.17.21 validator: 13.12.0 transitivePeerDependencies: @@ -26801,6 +26066,69 @@ packages: - moment dev: false + /antd@5.29.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-TTFVbpKbyL6cPfEoKq6Ya3BIjTUr7uDW9+7Z+1oysRv1gpcN7kQ4luH8r/+rXXwz4n6BIz1iBJ1ezKCdsdNW0w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@ant-design/colors': 7.2.1 + '@ant-design/cssinjs': 1.24.0(react-dom@18.3.1)(react@18.3.1) + '@ant-design/cssinjs-utils': 1.1.3(react-dom@18.3.1)(react@18.3.1) + '@ant-design/fast-color': 2.0.6 + '@ant-design/icons': 5.6.1(react-dom@18.3.1)(react@18.3.1) + '@ant-design/react-slick': 1.1.2(react@18.3.1) + '@babel/runtime': 7.28.2 + '@rc-component/color-picker': 2.0.1(react-dom@18.3.1)(react@18.3.1) + '@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/qrcode': 1.1.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/tour': 1.15.1(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.3.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + copy-to-clipboard: 3.3.3 + dayjs: 1.11.13 + rc-cascader: 3.34.0(react-dom@18.3.1)(react@18.3.1) + rc-checkbox: 3.5.0(react-dom@18.3.1)(react@18.3.1) + rc-collapse: 3.9.0(react-dom@18.3.1)(react@18.3.1) + rc-dialog: 9.6.0(react-dom@18.3.1)(react@18.3.1) + rc-drawer: 7.3.0(react-dom@18.3.1)(react@18.3.1) + rc-dropdown: 4.2.1(react-dom@18.3.1)(react@18.3.1) + rc-field-form: 2.7.1(react-dom@18.3.1)(react@18.3.1) + rc-image: 7.12.0(react-dom@18.3.1)(react@18.3.1) + rc-input: 1.8.0(react-dom@18.3.1)(react@18.3.1) + rc-input-number: 9.5.0(react-dom@18.3.1)(react@18.3.1) + rc-mentions: 2.20.0(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.16.1(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-notification: 5.6.4(react-dom@18.3.1)(react@18.3.1) + rc-pagination: 5.1.0(react-dom@18.3.1)(react@18.3.1) + rc-picker: 4.11.3(dayjs@1.11.13)(react-dom@18.3.1)(react@18.3.1) + rc-progress: 4.0.0(react-dom@18.3.1)(react@18.3.1) + rc-rate: 2.13.1(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-segmented: 2.7.0(react-dom@18.3.1)(react@18.3.1) + rc-select: 14.16.8(react-dom@18.3.1)(react@18.3.1) + rc-slider: 11.1.9(react-dom@18.3.1)(react@18.3.1) + rc-steps: 6.0.1(react-dom@18.3.1)(react@18.3.1) + rc-switch: 4.1.0(react-dom@18.3.1)(react@18.3.1) + rc-table: 7.54.0(react-dom@18.3.1)(react@18.3.1) + rc-tabs: 15.7.0(react-dom@18.3.1)(react@18.3.1) + rc-textarea: 1.10.2(react-dom@18.3.1)(react@18.3.1) + rc-tooltip: 6.4.0(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.13.1(react-dom@18.3.1)(react@18.3.1) + rc-tree-select: 5.27.0(react-dom@18.3.1)(react@18.3.1) + rc-upload: 4.11.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scroll-into-view-if-needed: 3.1.0 + throttle-debounce: 5.0.2 + transitivePeerDependencies: + - date-fns + - luxon + - moment + dev: false + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -27272,7 +26600,7 @@ packages: /axios@1.12.2: resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} dependencies: - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.15.11(debug@4.4.1) form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -27281,7 +26609,7 @@ packages: /axios@1.13.1: resolution: {integrity: sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==} dependencies: - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.15.11(debug@4.4.1) form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -27329,23 +26657,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-jest@29.7.0(@babel/core@7.28.5): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.28.5 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.28.5) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - /babel-loader@9.2.1(@babel/core@7.28.0)(webpack@5.98.0): resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} engines: {node: '>= 14.15.0'} @@ -27462,19 +26773,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.28.0): resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: @@ -27497,18 +26795,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.44.0 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} peerDependencies: @@ -27519,17 +26805,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-styled-components@1.13.3(styled-components@6.1.8): resolution: {integrity: sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==} peerDependencies: @@ -27592,6 +26867,20 @@ packages: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/traverse': 7.27.1 + dev: true + + /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0): + resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} + peerDependencies: + '@babel/core': ^7 + '@babel/traverse': ^7 + peerDependenciesMeta: + '@babel/traverse': + optional: true + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 /babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} @@ -27615,28 +26904,6 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) - /babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.5): - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5) - /babel-preset-jest@29.6.3(@babel/core@7.28.0): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -27647,16 +26914,6 @@ packages: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) - /babel-preset-jest@29.6.3(@babel/core@7.28.5): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.28.5 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.5) - /babel-walk@3.0.0-canary-5: resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} engines: {node: '>= 10.0.0'} @@ -30009,7 +29266,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 css-declaration-sorter: 7.2.0(postcss@8.4.38) cssnano-utils: 4.0.2(postcss@8.4.38) postcss: 8.4.38 @@ -30047,7 +29304,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 css-declaration-sorter: 7.2.0(postcss@8.5.6) cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 @@ -30494,10 +29751,9 @@ 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==} + /debug@4.4.1(supports-color@5.5.0): + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -30506,9 +29762,10 @@ packages: optional: true dependencies: ms: 2.1.3 - supports-color: 9.3.1 + supports-color: 5.5.0 + dev: true - /debug@4.4.1(supports-color@5.5.0): + /debug@4.4.1(supports-color@9.3.1): resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: @@ -30518,7 +29775,7 @@ packages: optional: true dependencies: ms: 2.1.3 - supports-color: 5.5.0 + supports-color: 9.3.1 /debug@4.4.3(supports-color@5.5.0): resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -31310,7 +30567,6 @@ packages: /es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - dev: true /es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -31572,7 +30828,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) esbuild: 0.25.5 transitivePeerDependencies: - supports-color @@ -32577,7 +31833,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@9.3.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -32622,7 +31878,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@9.3.1) + debug: 4.4.0(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -33623,7 +32879,7 @@ packages: tslib: 2.8.1 dev: false - /follow-redirects@1.15.11(debug@4.4.3): + /follow-redirects@1.15.11(debug@4.4.1): resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: @@ -33632,7 +32888,7 @@ packages: debug: optional: true dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -34409,6 +33665,7 @@ packages: /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + dev: true /globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -35286,7 +34543,7 @@ packages: dependencies: '@types/express': 4.17.21 '@types/http-proxy': 1.17.15 - http-proxy: 1.18.1(debug@4.4.3) + http-proxy: 1.18.1(debug@4.4.1) is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.8 @@ -35298,20 +34555,20 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/http-proxy': 1.17.15 - debug: 4.4.3(supports-color@8.1.1) - http-proxy: 1.18.1(debug@4.4.3) + debug: 4.4.1(supports-color@9.3.1) + http-proxy: 1.18.1(debug@4.4.1) is-glob: 4.0.3 is-plain-object: 5.0.0 micromatch: 4.0.8 transitivePeerDependencies: - supports-color - /http-proxy@1.18.1(debug@4.4.3): + /http-proxy@1.18.1(debug@4.4.1): resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.15.11(debug@4.4.1) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -35326,7 +34583,7 @@ packages: corser: 2.0.1 he: 1.2.0 html-encoding-sniffer: 3.0.0 - http-proxy: 1.18.1(debug@4.4.3) + http-proxy: 1.18.1(debug@4.4.1) mime: 1.6.0 minimist: 1.2.8 opener: 1.5.2 @@ -36703,6 +35960,47 @@ packages: - supports-color dev: true + /jest-config@29.7.0(@types/node@20.12.14)(ts-node@10.9.1): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.28.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.14 + babel-jest: 29.7.0(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.0 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@swc/core@1.7.26)(@types/node@18.16.9)(typescript@5.8.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -36783,7 +36081,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.16.9 + '@types/node': 20.12.14 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -36832,7 +36130,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.12.14 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -36885,7 +36183,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.12.14 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -36916,7 +36214,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.12.14 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -36968,7 +36266,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.12.14 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -36991,7 +36289,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.16.9 + '@types/node': 20.12.14 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -37003,7 +36301,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -37012,7 +36310,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -37020,7 +36318,7 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.16.9 + '@types/node': 20.12.14 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -37697,7 +36995,7 @@ packages: chalk: 5.2.0 cli-truncate: 3.1.0 commander: 10.0.1 - debug: 4.4.0(supports-color@9.3.1) + debug: 4.4.1(supports-color@9.3.1) execa: 7.2.0 lilconfig: 2.1.0 listr2: 5.0.8 @@ -38024,7 +37322,7 @@ packages: engines: {node: '>=8.0'} dependencies: date-format: 4.0.14 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@9.3.1) flatted: 3.3.1 rfdc: 1.4.1 streamroller: 3.1.5 @@ -38629,7 +37927,7 @@ packages: resolution: {integrity: sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.0 flow-enums-runtime: 0.0.6 hermes-parser: 0.32.0 nullthrows: 1.1.1 @@ -38729,7 +38027,7 @@ packages: resolution: {integrity: sha512-vpMDxkGIB+MTN8Af5hvSAanc6zXQipsAUO+XUx3PCQieKUfLwdoa8qaZ1WAQYRpaU+CJ8vhBcxtzzo3d9IsCIQ==} engines: {node: '>=18.18'} dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@9.3.1) fb-watchman: 2.0.2 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -38882,7 +38180,7 @@ packages: resolution: {integrity: sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.0 '@babel/generator': 7.28.5 '@babel/template': 7.27.2 '@babel/traverse': 7.28.5 @@ -38918,7 +38216,7 @@ packages: resolution: {integrity: sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==} engines: {node: '>=20.19.4'} dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.0 '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 '@babel/types': 7.28.5 @@ -38953,7 +38251,7 @@ packages: chalk: 4.1.2 ci-info: 2.0.0 connect: 3.7.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@9.3.1) error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -38993,7 +38291,7 @@ packages: hasBin: true dependencies: '@babel/code-frame': 7.27.1 - '@babel/core': 7.28.5 + '@babel/core': 7.28.0 '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 '@babel/template': 7.27.2 @@ -39874,7 +39172,7 @@ packages: resolution: {integrity: sha512-OXpYvH2AQk+zN1lwT4f9UFvTHEKbd2W0eLHOWvDZN6CxYZKBev3Ij7MrHNLeE/6YvkX5lEhBD0ePXmoFyXh45g==} dependencies: '@vercel/nft': 0.27.3(encoding@0.1.13) - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) fs-extra: 11.3.0 mlly: 1.6.1 pkg-types: 1.3.1 @@ -41766,7 +41064,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.38 @@ -41778,7 +41076,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 @@ -41802,7 +41100,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 postcss: 8.4.38 postcss-value-parser: 4.2.0 @@ -41812,7 +41110,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 dev: true @@ -42249,7 +41547,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 cssnano-utils: 4.0.2(postcss@8.4.38) postcss: 8.4.38 @@ -42261,7 +41559,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 @@ -42350,7 +41648,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 cssnano-utils: 4.0.2(postcss@8.4.38) postcss: 8.4.38 postcss-value-parser: 4.2.0 @@ -42361,7 +41659,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 cssnano-utils: 4.0.2(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -42727,7 +42025,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 postcss: 8.4.38 postcss-value-parser: 4.2.0 @@ -42737,7 +42035,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 dev: true @@ -42866,7 +42164,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 postcss: 8.4.38 @@ -42876,7 +42174,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 caniuse-api: 3.0.0 postcss: 8.5.6 dev: true @@ -43648,6 +42946,21 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-cascader@3.34.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-select: 14.16.8(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.13.1(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-cascader@3.7.3(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-KBpT+kzhxDW+hxPiNk4zaKa99+Lie2/8nnI11XF+FIOPl4Bj9VlFZi61GrnWzhLGA7VEN+dTxAkNOjkySDa0dA==} peerDependencies: @@ -43701,6 +43014,19 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-checkbox@3.5.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-collapse@3.4.2(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==} peerDependencies: @@ -43743,6 +43069,20 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-collapse@3.9.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-dialog@9.0.4(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-pmnPRZKd9CGzGgf4a1ysBvMhxm8Afx5fF6M7AzLtJ0qh8X1bshurDlqnK4MBNAB4hAeAMMbz6Ytb1rkGMvKFbQ==} peerDependencies: @@ -43787,6 +43127,21 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-dialog@9.6.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-drawer@6.3.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-uBZVb3xTAR+dBV53d/bUhTctCw3pwcwJoM7g5aX+7vgwt2zzVzoJ6aqFjYJpBlZ9zp0dVYN8fV+hykFE7c4lig==} peerDependencies: @@ -43831,6 +43186,21 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-drawer@7.3.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-dropdown@4.0.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==} peerDependencies: @@ -43872,6 +43242,20 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-dropdown@4.2.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==} + peerDependencies: + react: '>=16.11.0' + react-dom: '>=16.11.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/trigger': 2.3.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-field-form@1.34.2(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-BdciU5C7dBO51/9ZKcMvK2f8zaaO12Lt1eBhlAo8nNv+6htlNcgY9DAkUlZ7gfyWjnCc1Oo4hHIXau1m6tLw1A==} engines: {node: '>=8.x'} @@ -43927,6 +43311,20 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-field-form@2.7.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/async-validator': 5.0.4 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-image@5.13.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==} peerDependencies: @@ -43942,6 +43340,22 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + /rc-image@7.12.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-dialog: 9.6.0(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-image@7.9.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==} peerDependencies: @@ -44016,6 +43430,21 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-input-number@9.5.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/mini-decimal': 1.1.0 + classnames: 2.5.1 + rc-input: 1.8.0(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-input@0.1.4(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==} peerDependencies: @@ -44054,6 +43483,19 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-input@1.8.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-mentions@1.13.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==} peerDependencies: @@ -44103,6 +43545,23 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-mentions@2.20.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/trigger': 2.3.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-input: 1.8.0(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.16.1(react-dom@18.3.1)(react@18.3.1) + rc-textarea: 1.10.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-menu@9.14.1(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==} peerDependencies: @@ -44135,6 +43594,22 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-menu@9.16.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/trigger': 2.3.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-menu@9.8.4(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==} peerDependencies: @@ -44175,6 +43650,19 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + /rc-motion@2.9.5(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-notification@4.6.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==} engines: {node: '>=8.x'} @@ -44219,6 +43707,21 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-notification@5.6.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-overflow@1.3.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} peerDependencies: @@ -44227,8 +43730,8 @@ packages: dependencies: '@babel/runtime': 7.28.2 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@17.0.2)(react@17.0.2) - rc-util: 5.43.0(react-dom@17.0.2)(react@17.0.2) + rc-resize-observer: 1.4.3(react-dom@17.0.2)(react@17.0.2) + rc-util: 5.44.4(react-dom@17.0.2)(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: false @@ -44241,8 +43744,8 @@ packages: dependencies: '@babel/runtime': 7.28.2 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -44283,6 +43786,19 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-pagination@5.1.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-picker@2.7.6(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==} engines: {node: '>=8.x'} @@ -44301,6 +43817,37 @@ packages: react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 + /rc-picker@4.11.3(dayjs@1.11.13)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==} + engines: {node: '>=8.x'} + peerDependencies: + date-fns: '>= 2.x' + dayjs: '>= 1.x' + luxon: '>= 3.x' + moment: '>= 2.x' + react: '>=16.9.0' + react-dom: '>=16.9.0' + peerDependenciesMeta: + date-fns: + optional: true + dayjs: + optional: true + luxon: + optional: true + moment: + optional: true + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/trigger': 2.3.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + dayjs: 1.11.13 + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-picker@4.6.15(dayjs@1.11.13)(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-OWZ1yrMie+KN2uEUfYCfS4b2Vu6RC1FWwNI0s+qypsc3wRt7g+peuZKVIzXCTaJwyyZruo80+akPg2+GmyiJjw==} engines: {node: '>=8.x'} @@ -44429,6 +43976,20 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-rate@2.13.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-rate@2.9.3(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-2THssUSnRhtqIouQIIXqsZGzRczvp4WsH4WvGuhiwm+LG2fVpDUJliP9O1zeDOZvYfBE/Bup4SgHun/eCkbjgQ==} engines: {node: '>=8.x'} @@ -44469,6 +44030,33 @@ packages: react-dom: 18.3.1(react@18.3.1) resize-observer-polyfill: 1.5.1 + /rc-resize-observer@1.4.3(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@17.0.2)(react@17.0.2) + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + resize-observer-polyfill: 1.5.1 + dev: false + + /rc-resize-observer@1.4.3(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + resize-observer-polyfill: 1.5.1 + /rc-segmented@2.1.2(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==} peerDependencies: @@ -44510,6 +44098,20 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-segmented@2.7.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==} + peerDependencies: + react: '>=16.0.0' + react-dom: '>=16.0.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-select@14.1.18(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-4JgY3oG2Yz68ECMUSCON7mtxuJvCSj+LJpHEg/AONaaVBxIIrmI/ZTuMJkyojall/X50YdBe5oMKqHHPNiPzEg==} engines: {node: '>=8.x'} @@ -44563,6 +44165,24 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-select@14.16.8(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==} + engines: {node: '>=8.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/trigger': 2.3.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.8(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-slider@10.0.1(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==} engines: {node: '>=8.x'} @@ -44605,6 +44225,20 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-slider@11.1.9(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-steps@5.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==} engines: {node: '>=8.x'} @@ -44733,6 +44367,23 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-table@7.54.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-/wDTkki6wBTjwylwAGjpLKYklKo9YgjZwAU77+7ME5mBoS32Q4nAwoqhA2lSge6fobLW3Tap6uc5xfwaL2p0Sw==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/context': 1.4.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.8(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-tabs@12.5.10(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==} engines: {node: '>=8.x'} @@ -44786,6 +44437,24 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-tabs@15.7.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-dropdown: 4.2.1(react-dom@18.3.1)(react@18.3.1) + rc-menu: 9.16.1(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-textarea@0.4.7(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==} peerDependencies: @@ -44800,6 +44469,21 @@ packages: react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 + /rc-textarea@1.10.2(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-input: 1.8.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-textarea@1.7.0(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==} peerDependencies: @@ -44868,6 +44552,20 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-tooltip@6.4.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + '@rc-component/trigger': 2.3.0(react-dom@18.3.1)(react@18.3.1) + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-tree-select@5.22.2(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-WHmWCck4+8mf4/KFTjw70AlnoNPkX4C1TOIzzwxfZ7w8hcNO4bzggoeO2Q3fAedjZteN5I3t2dT0BCZAnHedlQ==} peerDependencies: @@ -44898,6 +44596,21 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-tree-select@5.27.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-select: 14.16.8(react-dom@18.3.1)(react@18.3.1) + rc-tree: 5.13.1(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-tree-select@5.5.5(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==} peerDependencies: @@ -44912,6 +44625,22 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + /rc-tree@5.13.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==} + engines: {node: '>=10.x'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-motion: 2.9.5(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + rc-virtual-list: 3.14.8(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-tree@5.7.12(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==} engines: {node: '>=10.x'} @@ -44974,6 +44703,19 @@ packages: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + /rc-upload@4.11.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /rc-upload@4.3.6(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Bt7ESeG5tT3IY82fZcP+s0tQU2xmo1W6P3S8NboUUliquJLQYLkUcsaExi3IlBVr43GQMCjo30RA2o0i70+NjA==} peerDependencies: @@ -45034,6 +44776,29 @@ packages: react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 + /rc-util@5.44.4(react-dom@17.0.2)(react@17.0.2): + resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + react-is: 18.3.1 + dev: false + + /rc-util@5.44.4(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.28.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + /rc-virtual-list@3.14.8(react-dom@17.0.2)(react@17.0.2): resolution: {integrity: sha512-8D0KfzpRYi6YZvlOWIxiOm9BGt4Wf2hQyEaM6RXlDDiY2NhLheuYI+RA+7ZaZj1lq+XQqy3KHlaeeXQfzI5fGg==} engines: {node: '>=8.x'} @@ -45043,8 +44808,8 @@ packages: dependencies: '@babel/runtime': 7.28.2 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@17.0.2)(react@17.0.2) - rc-util: 5.43.0(react-dom@17.0.2)(react@17.0.2) + rc-resize-observer: 1.4.3(react-dom@17.0.2)(react@17.0.2) + rc-util: 5.44.4(react-dom@17.0.2)(react@17.0.2) react: 17.0.2 react-dom: 17.0.2(react@17.0.2) dev: false @@ -45058,8 +44823,8 @@ packages: dependencies: '@babel/runtime': 7.28.2 classnames: 2.5.1 - rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) - rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + rc-resize-observer: 1.4.3(react-dom@18.3.1)(react@18.3.1) + rc-util: 5.44.4(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -45350,61 +45115,6 @@ packages: - supports-color - utf-8-validate - /react-native@0.80.0(@babel/core@7.28.5)(@types/react@19.1.8)(react@19.1.0): - resolution: {integrity: sha512-b9K1ygb2MWCBtKAodKmE3UsbUuC29Pt4CrJMR0ocTA8k+8HJQTPleBPDNKL4/p0P01QO9aL/gZUddoxHempLow==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@types/react': ^19.1.0 - react: ^19.1.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native/assets-registry': 0.80.0 - '@react-native/codegen': 0.80.0(@babel/core@7.28.5) - '@react-native/community-cli-plugin': 0.80.0(@react-native-community/cli@19.1.1) - '@react-native/gradle-plugin': 0.80.0 - '@react-native/js-polyfills': 0.80.0 - '@react-native/normalize-colors': 0.80.0 - '@react-native/virtualized-lists': 0.80.0(@types/react@19.1.8)(react-native@0.80.0)(react@19.1.0) - '@types/react': 19.1.8 - abort-controller: 3.0.0 - anser: 1.4.10 - ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.28.5) - babel-plugin-syntax-hermes-parser: 0.28.1 - base64-js: 1.5.1 - chalk: 4.1.2 - commander: 12.1.0 - flow-enums-runtime: 0.0.6 - glob: 7.2.0 - invariant: 2.2.4 - jest-environment-node: 29.7.0 - memoize-one: 5.2.1 - metro-runtime: 0.82.5 - metro-source-map: 0.82.5 - nullthrows: 1.1.1 - pretty-format: 29.7.0 - promise: 8.3.0 - react: 19.1.0 - react-devtools-core: 6.1.5 - react-refresh: 0.14.2 - regenerator-runtime: 0.13.11 - scheduler: 0.26.0 - semver: 7.6.3 - stacktrace-parser: 0.1.11 - whatwg-fetch: 3.6.20 - ws: 6.2.3 - yargs: 17.7.2 - transitivePeerDependencies: - - '@babel/core' - - '@react-native-community/cli' - - bufferutil - - supports-color - - utf-8-validate - /react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -48673,7 +48383,7 @@ packages: engines: {node: '>=8.0'} dependencies: date-format: 4.0.14 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -49111,7 +48821,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 postcss: 8.4.38 postcss-selector-parser: 6.1.2 @@ -49121,7 +48831,7 @@ packages: peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 postcss: 8.5.6 postcss-selector-parser: 6.1.2 dev: true @@ -49168,7 +48878,7 @@ packages: hasBin: true dependencies: '@adobe/css-tools': 4.3.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.1(supports-color@9.3.1) glob: 10.4.5 sax: 1.4.1 source-map: 0.7.4 @@ -50327,7 +50037,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-jest@29.0.1(@babel/core@7.28.5)(babel-jest@29.7.0)(esbuild@0.25.0)(jest@29.7.0)(typescript@5.8.3): + /ts-jest@29.0.1(@babel/core@7.28.0)(babel-jest@29.7.0)(esbuild@0.25.0)(jest@29.7.0)(typescript@5.8.3): resolution: {integrity: sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -50348,7 +50058,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.28.0 babel-jest: 29.7.0(@babel/core@7.28.0) bs-logger: 0.2.6 esbuild: 0.25.0 @@ -50471,6 +50181,38 @@ packages: code-block-writer: 10.1.1 dev: false + /ts-node@10.8.2(@swc/core@1.7.26)(@types/node@16.11.68)(typescript@5.0.4): + resolution: {integrity: sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@swc/core': 1.7.26(@swc/helpers@0.5.13) + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.11.68 + acorn: 8.15.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + /ts-node@10.9.1(@swc/core@1.7.26)(@types/node@14.18.33)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -50679,6 +50421,15 @@ packages: tsconfig-paths: 4.2.0 dev: true + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: @@ -50734,7 +50485,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) esbuild: 0.19.2 execa: 5.1.1 globby: 11.1.0 @@ -50776,7 +50527,7 @@ packages: cac: 6.7.14 chokidar: 4.0.1 consola: 3.2.3 - debug: 4.4.0(supports-color@9.3.1) + debug: 4.4.0(supports-color@8.1.1) esbuild: 0.24.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -51704,7 +51455,7 @@ packages: apache-md5: 1.1.8 bcryptjs: 2.4.3 core-js: 3.40.0 - debug: 4.4.0(supports-color@9.3.1) + debug: 4.4.0(supports-color@8.1.1) http-errors: 2.0.0 unix-crypt-td-js: 1.1.4 transitivePeerDependencies: @@ -51735,7 +51486,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@9.3.1) + debug: 4.4.0(supports-color@8.1.1) envinfo: 7.14.0 express: 4.21.2 handlebars: 4.7.8 @@ -51928,7 +51679,7 @@ packages: '@volar/typescript': 2.4.13 '@vue/language-core': 2.2.0(typescript@5.5.2) compare-versions: 6.1.1 - debug: 4.4.0(supports-color@9.3.1) + debug: 4.4.0(supports-color@8.1.1) kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 @@ -51948,7 +51699,7 @@ packages: vite: optional: true dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.1(supports-color@9.3.1) globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.8.3) vite: 5.4.21(@types/node@18.16.9)(less@4.4.2)(stylus@0.64.0) @@ -53059,10 +52810,10 @@ packages: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 - browserslist: 4.24.4 + browserslist: 4.25.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.2 - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53100,10 +52851,10 @@ packages: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 - browserslist: 4.24.4 + browserslist: 4.25.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.2 - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53141,10 +52892,10 @@ packages: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 - browserslist: 4.24.4 + browserslist: 4.25.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.2 - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53182,10 +52933,10 @@ packages: '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 - browserslist: 4.24.4 + browserslist: 4.25.1 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.2 - es-module-lexer: 1.6.0 + es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3f2634bd21b..a084490e9e1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,6 +7,7 @@ packages: - 'apps/next-app-router/*' - 'apps/modernjs-ssr/*' - 'apps/modern-component-data-fetch/*' + - 'apps/shared-treeshake/*' - 'apps/router-demo/*' - 'apps/manifest-demo/*' - 'apps/esbuild' diff --git a/webpack/types.d.ts b/webpack/types.d.ts index 3e64eed797c..27fd30fd37e 100644 --- a/webpack/types.d.ts +++ b/webpack/types.d.ts @@ -37,7 +37,6 @@ import DelegatedPlugin from './lib/DelegatedPlugin'; import EnableLibraryPlugin from './lib/library/EnableLibraryPlugin'; import ElectronTargetPlugin from './lib/electron/ElectronTargetPlugin'; import { ResolveContext, ResolveRequest } from './lib/ResolverFactory'; -import { WebpackOptions as Configuration } from '../declarations/WebpackOptions'; import EnvironmentPlugin from './lib/EnvironmentPlugin'; import { Environment, @@ -1340,6 +1339,11 @@ declare class HarmonyImportDependency extends ModuleDependency { static TRANSITIVE: typeof TRANSITIVE; } +declare class HarmonyImportSpecifierDependency extends HarmonyImportDependency { + ids: string[]; + referencedPropertiesInDestructuring?: Set; +} + declare class HarmonyImportDependencyTemplate extends DependencyTemplate { constructor(); @@ -4291,6 +4295,259 @@ declare interface WatchIgnorePluginOptions { paths: (string | RegExp)[]; } +/** + * Options object as provided by the user. + */ +declare interface Configuration { + /** + * Set the value of `require.amd` and `define.amd`. Or disable AMD support. + */ + amd?: false | { [index: string]: any }; + + /** + * Report the first error as a hard error instead of tolerating it. + */ + bail?: boolean; + + /** + * Cache generated modules and chunks to improve performance for multiple incremental builds. + */ + cache?: boolean | FileCacheOptions | MemoryCacheOptions; + + /** + * The base directory (absolute path!) for resolving the `entry` option. If `output.pathinfo` is set, the included pathinfo is shortened to this directory. + */ + context?: string; + + /** + * References to other configurations to depend on. + */ + dependencies?: string[]; + + /** + * A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map). + */ + devtool?: string | false; + + /** + * The entry point(s) of the compilation. + */ + entry?: + | string + | (() => string | EntryObject | string[] | Promise) + | EntryObject + | string[]; + + /** + * Enables/Disables experiments (experimental features with relax SemVer compatibility). + */ + experiments?: Experiments; + + /** + * Extend configuration from another configuration (only works when using webpack-cli). + */ + extends?: string | string[]; + + /** + * Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`. + */ + externals?: + | string + | RegExp + | (ExternalItemObjectKnown & ExternalItemObjectUnknown) + | (( + data: ExternalItemFunctionData, + callback: ( + err?: null | Error, + result?: string | boolean | string[] | { [index: string]: any }, + ) => void, + ) => void) + | ((data: ExternalItemFunctionData) => Promise) + | ExternalItem[]; + + /** + * Enable presets of externals for specific targets. + */ + externalsPresets?: ExternalsPresets; + + /** + * Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value). + */ + externalsType?: + | 'import' + | 'var' + | 'module' + | 'assign' + | 'this' + | 'window' + | 'self' + | 'global' + | 'commonjs' + | 'commonjs2' + | 'commonjs-module' + | 'commonjs-static' + | 'amd' + | 'amd-require' + | 'umd' + | 'umd2' + | 'jsonp' + | 'system' + | 'promise' + | 'module-import' + | 'script' + | 'node-commonjs'; + + /** + * Ignore specific warnings. + */ + ignoreWarnings?: ( + | RegExp + | { + /** + * A RegExp to select the origin file for the warning. + */ + file?: RegExp; + /** + * A RegExp to select the warning message. + */ + message?: RegExp; + /** + * A RegExp to select the origin module for the warning. + */ + module?: RegExp; + } + | ((warning: Error, compilation: Compilation) => boolean) + )[]; + + /** + * Options for infrastructure level logging. + */ + infrastructureLogging?: InfrastructureLogging; + + /** + * Custom values available in the loader context. + */ + loader?: Loader; + + /** + * Enable production optimizations or development hints. + */ + mode?: 'none' | 'development' | 'production'; + + /** + * Options affecting the normal modules (`NormalModuleFactory`). + */ + module?: ModuleOptions; + + /** + * Name of the configuration. Used when loading multiple configurations. + */ + name?: string; + + /** + * Include polyfills or mocks for various node stuff. + */ + node?: false | NodeOptions; + + /** + * Enables/Disables integrated optimizations. + */ + optimization?: Optimization; + + /** + * Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk. + */ + output?: Output; + + /** + * The number of parallel processed modules in the compilation. + */ + parallelism?: number; + + /** + * Configuration for web performance recommendations. + */ + performance?: false | PerformanceOptions; + + /** + * Add additional plugins to the compiler. + */ + plugins?: ( + | undefined + | null + | false + | '' + | 0 + | ((this: Compiler, compiler: Compiler) => void) + | WebpackPluginInstance + )[]; + + /** + * Capture timing information for each module. + */ + profile?: boolean; + + /** + * Store compiler state to a json file. + */ + recordsInputPath?: string | false; + + /** + * Load compiler state from a json file. + */ + recordsOutputPath?: string | false; + + /** + * Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. `recordsPath` is used for `recordsInputPath` and `recordsOutputPath` if they left undefined. + */ + recordsPath?: string | false; + + /** + * Options for the resolver. + */ + resolve?: ResolveOptions; + + /** + * Options for the resolver when resolving loaders. + */ + resolveLoader?: ResolveOptions; + + /** + * Options affecting how file system snapshots are created and validated. + */ + snapshot?: SnapshotOptionsWebpackOptions; + + /** + * Stats options object or preset name. + */ + stats?: + | boolean + | StatsOptions + | 'none' + | 'verbose' + | 'summary' + | 'errors-only' + | 'errors-warnings' + | 'minimal' + | 'normal' + | 'detailed'; + + /** + * Environment to build for. An array of environments to build for all of them when possible. + */ + target?: string | false | string[]; + + /** + * Enter watch mode, which rebuilds on file change. + */ + watch?: boolean; + + /** + * Options for the watcher. + */ + watchOptions?: WatchOptions; +} + declare abstract class WebpackLogger { getChildLogger: (arg0: string | (() => string)) => WebpackLogger; @@ -4451,6 +4708,7 @@ declare namespace exports { HarmonyImportDependency, ConstDependency, NullDependency, + HarmonyImportSpecifierDependency, }; } export namespace ids { @@ -4798,6 +5056,7 @@ declare namespace exports { Template, WatchIgnorePlugin, WebpackError, + Configuration, WebpackOptionsApply, WebpackOptionsDefaulter, ValidationError as WebpackOptionsValidationError,