From b0e576da2bc4a99e6425ee76f95c70a583904e34 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 19 Aug 2025 10:39:55 +0000 Subject: [PATCH 1/4] Initial plan From 0d2b91f02ff4f03dad7fa89f9e0f04383a4558e9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 19 Aug 2025 10:56:35 +0000 Subject: [PATCH 2/4] Convert key packages to dual ESM+CJS format Co-authored-by: ScriptedAlchemy <25274700+ScriptedAlchemy@users.noreply.github.com> --- packages/cli/package.json | 19 ++++++- packages/cli/project.json | 2 +- packages/cli/rollup.config.js | 32 +++++++++++ packages/dts-plugin/package.json | 13 +++-- packages/enhanced/package.json | 46 ++++++++-------- packages/enhanced/project.json | 26 +++++---- packages/enhanced/rollup.config.cjs | 77 +++++++++++++++++++++++++++ packages/nextjs-mf/package.json | 21 +++++--- packages/nextjs-mf/project.json | 50 +++++------------ packages/nextjs-mf/rollup.config.cjs | 61 +++++++++++++++++++++ packages/node/package.json | 53 ++++++++++++------ packages/node/project.json | 25 ++++++--- packages/node/rollup.config.cjs | 66 +++++++++++++++++++++++ packages/typescript/package.json | 21 +++++--- packages/typescript/project.json | 13 +++-- packages/typescript/rollup.config.cjs | 57 ++++++++++++++++++++ 16 files changed, 466 insertions(+), 116 deletions(-) create mode 100644 packages/enhanced/rollup.config.cjs create mode 100644 packages/nextjs-mf/rollup.config.cjs create mode 100644 packages/node/rollup.config.cjs create mode 100644 packages/typescript/rollup.config.cjs diff --git a/packages/cli/package.json b/packages/cli/package.json index 46bddffed1c..1f9e9f2ee84 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@module-federation/cli", "version": "0.18.3", - "type": "commonjs", + "type": "module", "description": "Module Federation CLI", "homepage": "https://module-federation.io", "bugs": { @@ -15,13 +15,28 @@ "bin": { "mf": "./bin/mf.js" }, + "main": "./dist/index.cjs.cjs", + "module": "./dist/index.esm.js", "types": "./dist/index.d.ts", "license": "MIT", - "main": "./dist/index.cjs.js", "files": [ "dist", "bin" ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.esm.js", + "require": "./dist/index.cjs.cjs" + } + }, + "typesVersions": { + "*": { + ".": [ + "./dist/index.d.ts" + ] + } + }, "dependencies": { "@module-federation/sdk": "workspace:*", "@module-federation/dts-plugin": "workspace:*", diff --git a/packages/cli/project.json b/packages/cli/project.json index 75c8b2658ba..261a957b4ce 100644 --- a/packages/cli/project.json +++ b/packages/cli/project.json @@ -15,7 +15,7 @@ "project": "packages/cli/package.json", "rollupConfig": "packages/cli/rollup.config.js", "compiler": "swc", - "format": ["cjs"], + "format": ["cjs", "esm"], "generatePackageJson": false, "useLegacyTypescriptPlugin": false } diff --git a/packages/cli/rollup.config.js b/packages/cli/rollup.config.js index 56fc1d396bf..60dcb1586b6 100644 --- a/packages/cli/rollup.config.js +++ b/packages/cli/rollup.config.js @@ -17,5 +17,37 @@ module.exports = (rollupConfig, _projectOptions) => { }), ); + if (Array.isArray(rollupConfig.output)) { + rollupConfig.output = rollupConfig.output.map((c) => ({ + ...c, + hoistTransitiveImports: false, + entryFileNames: + c.format === 'cjs' + ? c.entryFileNames.replace('.js', '.cjs') + : c.entryFileNames, + chunkFileNames: + c.format === 'cjs' + ? c.chunkFileNames.replace('.js', '.cjs') + : c.chunkFileNames, + ...(c.format === 'cjs' ? { externalLiveBindings: false } : {}), + })); + } else { + rollupConfig.output = { + ...rollupConfig.output, + hoistTransitiveImports: false, + entryFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.entryFileNames.replace('.js', '.cjs') + : rollupConfig.output.entryFileNames, + chunkFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.chunkFileNames.replace('.js', '.cjs') + : rollupConfig.output.chunkFileNames, + ...(rollupConfig.output.format === 'cjs' + ? { externalLiveBindings: false } + : {}), + }; + } + return rollupConfig; }; diff --git a/packages/dts-plugin/package.json b/packages/dts-plugin/package.json index be80aa5d3fc..1892f85134e 100644 --- a/packages/dts-plugin/package.json +++ b/packages/dts-plugin/package.json @@ -1,8 +1,9 @@ { "name": "@module-federation/dts-plugin", "version": "0.18.3", + "type": "module", "author": "hanric ", - "main": "./dist/index.js", + "main": "./dist/index.cjs", "module": "./dist/index.js", "types": "./dist/index.d.ts", "license": "MIT", @@ -20,17 +21,19 @@ ], "exports": { ".": { + "types": "./dist/index.d.ts", "import": "./dist/index.js", - "require": "./dist/index.js" + "require": "./dist/index.cjs" }, "./core": { + "types": "./dist/core.d.ts", "import": "./dist/core.js", - "require": "./dist/core.js" + "require": "./dist/core.cjs" }, "./dynamic-remote-type-hints-plugin": { "types": "./dist/dynamic-remote-type-hints-plugin.d.ts", - "import": "./dist/esm/dynamic-remote-type-hints-plugin.js", - "require": "./dist/dynamic-remote-type-hints-plugin.js" + "import": "./dist/dynamic-remote-type-hints-plugin.js", + "require": "./dist/dynamic-remote-type-hints-plugin.cjs" }, "./*": "./*" }, diff --git a/packages/enhanced/package.json b/packages/enhanced/package.json index 08d4c6d410e..457b44db0b3 100644 --- a/packages/enhanced/package.json +++ b/packages/enhanced/package.json @@ -1,8 +1,10 @@ { "name": "@module-federation/enhanced", "version": "0.18.3", - "main": "./dist/src/index.js", - "types": "./dist/src/index.d.ts", + "type": "module", + "main": "./dist/index.cjs.cjs", + "module": "./dist/index.esm.js", + "types": "./dist/index.d.ts", "repository": { "type": "git", "url": "git+https://github.com/module-federation/core.git", @@ -38,47 +40,47 @@ }, "exports": { ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/src/index.js", - "require": "./dist/src/index.js" + "types": "./dist/index.d.ts", + "import": "./dist/index.esm.js", + "require": "./dist/index.cjs.cjs" }, "./webpack": { - "types": "./dist/src/webpack.d.ts", - "import": "./dist/src/webpack.js", - "require": "./dist/src/webpack.js" + "types": "./dist/webpack.d.ts", + "import": "./dist/webpack.esm.js", + "require": "./dist/webpack.cjs.cjs" }, "./rspack": { - "types": "./dist/src/rspack.d.ts", - "import": "./dist/src/rspack.js", - "require": "./dist/src/rspack.js" + "types": "./dist/rspack.d.ts", + "import": "./dist/rspack.esm.js", + "require": "./dist/rspack.cjs.cjs" }, "./runtime": { - "types": "./dist/src/runtime.d.ts", - "import": "./dist/src/runtime.js", - "require": "./dist/src/runtime.js" + "types": "./dist/runtime.d.ts", + "import": "./dist/runtime.esm.js", + "require": "./dist/runtime.cjs.cjs" }, "./prefetch": { - "types": "./dist/src/prefetch.d.ts", - "import": "./dist/src/prefetch.js", - "require": "./dist/src/prefetch.js" + "types": "./dist/prefetch.d.ts", + "import": "./dist/prefetch.esm.js", + "require": "./dist/prefetch.cjs.cjs" } }, "typesVersions": { "*": { ".": [ - "./dist/src/index.d.ts" + "./dist/index.d.ts" ], "webpack": [ - "./dist/src/webpack.d.ts" + "./dist/webpack.d.ts" ], "rspack": [ - "./dist/src/rspack.d.ts" + "./dist/rspack.d.ts" ], "runtime": [ - "./dist/src/runtime.d.ts" + "./dist/runtime.d.ts" ], "prefetch": [ - "./dist/src/prefetch.d.ts" + "./dist/prefetch.d.ts" ] } }, diff --git a/packages/enhanced/project.json b/packages/enhanced/project.json index 57375dba310..2c5a4e628fb 100644 --- a/packages/enhanced/project.json +++ b/packages/enhanced/project.json @@ -13,21 +13,27 @@ } }, "build": { - "executor": "@nx/js:tsc", + "executor": "@nx/rollup:rollup", "outputs": ["{workspaceRoot}/packages/enhanced/dist"], "options": { + "parallel": false, "outputPath": "packages/enhanced/dist", "main": "packages/enhanced/src/index.ts", + "additionalEntryPoints": [ + "packages/enhanced/src/webpack.ts", + "packages/enhanced/src/rspack.ts", + "packages/enhanced/src/runtime.ts", + "packages/enhanced/src/prefetch.ts" + ], "tsConfig": "packages/enhanced/tsconfig.lib.json", - "assets": [ - "packages/enhanced/*.md", - { - "glob": "src/**/*.d.ts", - "input": "packages/enhanced", - "ignore": [], - "output": "" - } - ] + "assets": [], + "external": ["@module-federation/*"], + "project": "packages/enhanced/package.json", + "compiler": "swc", + "rollupConfig": "packages/enhanced/rollup.config.cjs", + "format": ["cjs", "esm"], + "generatePackageJson": false, + "useLegacyTypescriptPlugin": false }, "dependsOn": [ { diff --git a/packages/enhanced/rollup.config.cjs b/packages/enhanced/rollup.config.cjs new file mode 100644 index 00000000000..69fa88a159c --- /dev/null +++ b/packages/enhanced/rollup.config.cjs @@ -0,0 +1,77 @@ +const copy = require('rollup-plugin-copy'); + +module.exports = (rollupConfig, _projectOptions) => { + rollupConfig.input = { + index: 'packages/enhanced/src/index.ts', + webpack: 'packages/enhanced/src/webpack.ts', + rspack: 'packages/enhanced/src/rspack.ts', + runtime: 'packages/enhanced/src/runtime.ts', + prefetch: 'packages/enhanced/src/prefetch.ts', + }; + + rollupConfig.plugins.push( + copy({ + targets: [ + { src: 'packages/enhanced/README.md', dest: 'packages/enhanced/dist' }, + { src: 'packages/enhanced/LICENSE', dest: 'packages/enhanced/dist' }, + ], + }), + ); + + rollupConfig.external = [ + /@module-federation/, + 'webpack', + 'schema-utils', + 'btoa', + 'upath', + 'ajv', + 'enhanced-resolve', + 'terser', + ]; + + if (Array.isArray(rollupConfig.output)) { + rollupConfig.output = rollupConfig.output.map((c) => ({ + ...c, + manualChunks: (id) => { + if (id.includes('@swc/helpers')) { + return 'polyfills'; + } + }, + hoistTransitiveImports: false, + minifyInternalExports: true, + entryFileNames: + c.format === 'cjs' + ? c.entryFileNames.replace('.js', '.cjs') + : c.entryFileNames, + chunkFileNames: + c.format === 'cjs' + ? c.chunkFileNames.replace('.js', '.cjs') + : c.chunkFileNames, + ...(c.format === 'cjs' ? { externalLiveBindings: false } : {}), + })); + } else { + rollupConfig.output = { + ...rollupConfig.output, + manualChunks: (id) => { + if (id.includes('@swc/helpers')) { + return 'polyfills'; + } + }, + hoistTransitiveImports: false, + minifyInternalExports: true, + entryFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.entryFileNames.replace('.js', '.cjs') + : rollupConfig.output.entryFileNames, + chunkFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.chunkFileNames.replace('.js', '.cjs') + : rollupConfig.output.chunkFileNames, + ...(rollupConfig.output.format === 'cjs' + ? { externalLiveBindings: false } + : {}), + }; + } + + return rollupConfig; +}; \ No newline at end of file diff --git a/packages/nextjs-mf/package.json b/packages/nextjs-mf/package.json index 7ef01bd1ec5..e783f292db7 100644 --- a/packages/nextjs-mf/package.json +++ b/packages/nextjs-mf/package.json @@ -2,9 +2,10 @@ "name": "@module-federation/nextjs-mf", "version": "8.8.38", "license": "MIT", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", - "type": "commonjs", + "type": "module", + "main": "./dist/index.cjs.cjs", + "module": "./dist/index.esm.js", + "types": "./dist/index.d.ts", "description": "Module Federation helper for NextJS", "repository": { "type": "git", @@ -23,14 +24,22 @@ "postinstall": "echo \"Deprecation Notice: We intend to deprecate 'nextjs-mf'. Please see https://github.com/module-federation/core/issues/3153 for more details.\"" }, "exports": { - ".": "./dist/src/index.js", - "./utils": "./dist/utils/index.js", + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.esm.js", + "require": "./dist/index.cjs.cjs" + }, + "./utils": { + "types": "./dist/utils/index.d.ts", + "import": "./dist/utils/index.esm.js", + "require": "./dist/utils/index.cjs.cjs" + }, "./*": "./*" }, "typesVersions": { "*": { ".": [ - "./dist/src/index.d.ts" + "./dist/index.d.ts" ], "utils": [ "./dist/utils/index.d.ts" diff --git a/packages/nextjs-mf/project.json b/packages/nextjs-mf/project.json index 1d6a85b97b8..ffd2612096d 100644 --- a/packages/nextjs-mf/project.json +++ b/packages/nextjs-mf/project.json @@ -5,14 +5,23 @@ "projectType": "library", "tags": ["type:pkg"], "targets": { - "build-tsc": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], + "build": { + "executor": "@nx/rollup:rollup", + "outputs": ["{workspaceRoot}/packages/nextjs-mf/dist"], "options": { + "parallel": false, "outputPath": "packages/nextjs-mf/dist", "main": "packages/nextjs-mf/src/index.ts", + "additionalEntryPoints": ["packages/nextjs-mf/utils/index.ts"], "tsConfig": "packages/nextjs-mf/tsconfig.lib.json", - "assets": ["packages/nextjs-mf/*.md"] + "assets": [], + "external": ["@module-federation/*"], + "project": "packages/nextjs-mf/package.json", + "compiler": "swc", + "rollupConfig": "packages/nextjs-mf/rollup.config.cjs", + "format": ["cjs", "esm"], + "generatePackageJson": false, + "useLegacyTypescriptPlugin": false }, "dependsOn": [ { @@ -21,35 +30,6 @@ } ] }, - "build": { - "executor": "nx:run-commands", - "options": { - "parallel": false, - "commands": [ - { - "command": "nx run nextjs-mf:build-tsc", - "forwardAllArgs": false - }, - { - "command": "nx run nextjs-mf:rename-dist-files", - "forwardAllArgs": false - } - ] - } - }, - "rename-dist-files": { - "executor": "nx:run-commands", - "options": { - "commands": [ - { - "command": "mv packages/nextjs-mf/dist/src/federation-noop.js packages/nextjs-mf/dist/src/federation-noop.cjs" - }, - { - "command": "mv packages/nextjs-mf/dist/src/plugins/container/runtimePlugin.js packages/nextjs-mf/dist/src/plugins/container/runtimePlugin.cjs" - } - ] - } - }, "lint": { "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], @@ -80,10 +60,6 @@ { "command": "nx run nextjs-mf:build", "forwardAllArgs": false - }, - { - "command": "rm ./packages/nextjs-mf/dist/package.json", - "forwardAllArgs": false } ] } diff --git a/packages/nextjs-mf/rollup.config.cjs b/packages/nextjs-mf/rollup.config.cjs new file mode 100644 index 00000000000..9efbdd050b4 --- /dev/null +++ b/packages/nextjs-mf/rollup.config.cjs @@ -0,0 +1,61 @@ +const copy = require('rollup-plugin-copy'); + +module.exports = (rollupConfig, _projectOptions) => { + rollupConfig.input = { + index: 'packages/nextjs-mf/src/index.ts', + 'utils/index': 'packages/nextjs-mf/utils/index.ts', + }; + + rollupConfig.plugins.push( + copy({ + targets: [ + { src: 'packages/nextjs-mf/README.md', dest: 'packages/nextjs-mf/dist' }, + { src: 'packages/nextjs-mf/LICENSE', dest: 'packages/nextjs-mf/dist' }, + ], + }), + ); + + rollupConfig.external = [ + /@module-federation/, + 'fast-glob', + 'webpack', + 'next', + 'react', + 'react-dom', + 'styled-jsx', + ]; + + if (Array.isArray(rollupConfig.output)) { + rollupConfig.output = rollupConfig.output.map((c) => ({ + ...c, + hoistTransitiveImports: false, + entryFileNames: + c.format === 'cjs' + ? c.entryFileNames.replace('.js', '.cjs') + : c.entryFileNames, + chunkFileNames: + c.format === 'cjs' + ? c.chunkFileNames.replace('.js', '.cjs') + : c.chunkFileNames, + ...(c.format === 'cjs' ? { externalLiveBindings: false } : {}), + })); + } else { + rollupConfig.output = { + ...rollupConfig.output, + hoistTransitiveImports: false, + entryFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.entryFileNames.replace('.js', '.cjs') + : rollupConfig.output.entryFileNames, + chunkFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.chunkFileNames.replace('.js', '.cjs') + : rollupConfig.output.chunkFileNames, + ...(rollupConfig.output.format === 'cjs' + ? { externalLiveBindings: false } + : {}), + }; + } + + return rollupConfig; +}; \ No newline at end of file diff --git a/packages/node/package.json b/packages/node/package.json index 73c905b0c09..4de948eb074 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -2,40 +2,59 @@ "public": true, "name": "@module-federation/node", "version": "2.7.14", - "type": "commonjs", - "main": "./dist/src/index.js", + "type": "module", + "main": "./dist/index.cjs.cjs", + "module": "./dist/index.esm.js", + "types": "./dist/index.d.ts", "exports": { ".": { - "import": "./dist/src/index.js", - "require": "./dist/src/index.js" + "types": "./dist/index.d.ts", + "import": "./dist/index.esm.js", + "require": "./dist/index.cjs.cjs" }, "./package.json": "./package.json", - "./runtimePlugin": "./dist/src/runtimePlugin.js", - "./record-dynamic-remote-entry-hash-plugin": "./dist/src/recordDynamicRemoteEntryHashPlugin.js", + "./runtimePlugin": { + "types": "./dist/runtimePlugin.d.ts", + "import": "./dist/runtimePlugin.esm.js", + "require": "./dist/runtimePlugin.cjs.cjs" + }, + "./record-dynamic-remote-entry-hash-plugin": { + "types": "./dist/record-dynamic-remote-entry-hash-plugin.d.ts", + "import": "./dist/record-dynamic-remote-entry-hash-plugin.esm.js", + "require": "./dist/record-dynamic-remote-entry-hash-plugin.cjs.cjs" + }, "./utils": { - "import": "./dist/src/utils/index.js", - "require": "./dist/src/utils/index.js" + "types": "./dist/utils/index.d.ts", + "import": "./dist/utils/index.esm.js", + "require": "./dist/utils/index.cjs.cjs" }, - "./src/plugins/NodeFederationPlugin.js": "./dist/src/plugins/NodeFederationPlugin.js", - "./universe-entry-chunk-tracker-plugin": "./dist/src/plugins/UniverseEntryChunkTrackerPlugin.js", - "./src/*": "./dist/src/*" + "./src/plugins/NodeFederationPlugin.js": { + "types": "./dist/plugins/NodeFederationPlugin.d.ts", + "import": "./dist/plugins/NodeFederationPlugin.esm.js", + "require": "./dist/plugins/NodeFederationPlugin.cjs.cjs" + }, + "./universe-entry-chunk-tracker-plugin": { + "types": "./dist/plugins/UniverseEntryChunkTrackerPlugin.d.ts", + "import": "./dist/plugins/UniverseEntryChunkTrackerPlugin.esm.js", + "require": "./dist/plugins/UniverseEntryChunkTrackerPlugin.cjs.cjs" + } }, "typesVersions": { "*": { ".": [ - "./dist/src/index.d.ts" + "./dist/index.d.ts" ], "runtimePlugin": [ - "./dist/src/runtimePlugin.d.ts" + "./dist/runtimePlugin.d.ts" ], "utils": [ - "./dist/src/utils/index.d.ts" + "./dist/utils/index.d.ts" ], "record-dynamic-remote-entry-hash-plugin": [ - "./dist/src/record-dynamic-remote-entry-hash-plugin.d.ts" + "./dist/record-dynamic-remote-entry-hash-plugin.d.ts" ], "universe-entry-chunk-tracker-plugin": [ - "./dist/src/plugins/UniverseEntryChunkTrackerPlugin.d.ts" + "./dist/plugins/UniverseEntryChunkTrackerPlugin.d.ts" ] } }, @@ -54,7 +73,7 @@ "node-module-federation", "ssr" ], - "types": "src/index.d.ts", + "types": "./dist/index.d.ts", "description": "Module Federation helper for Node", "repository": { "type": "git", diff --git a/packages/node/project.json b/packages/node/project.json index 406c09c9e25..af04582a7f8 100644 --- a/packages/node/project.json +++ b/packages/node/project.json @@ -6,13 +6,28 @@ "tags": ["type:pkg"], "targets": { "build": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], + "executor": "@nx/rollup:rollup", + "outputs": ["{workspaceRoot}/packages/node/dist"], "options": { + "parallel": false, "outputPath": "packages/node/dist", "main": "packages/node/src/index.js", + "additionalEntryPoints": [ + "packages/node/src/runtimePlugin.js", + "packages/node/src/recordDynamicRemoteEntryHashPlugin.js", + "packages/node/src/utils/index.js", + "packages/node/src/plugins/NodeFederationPlugin.js", + "packages/node/src/plugins/UniverseEntryChunkTrackerPlugin.js" + ], "tsConfig": "packages/node/tsconfig.lib.json", - "assets": ["packages/node/*.md"] + "assets": [], + "external": ["@module-federation/*"], + "project": "packages/node/package.json", + "compiler": "swc", + "rollupConfig": "packages/node/rollup.config.cjs", + "format": ["cjs", "esm"], + "generatePackageJson": false, + "useLegacyTypescriptPlugin": false }, "dependsOn": [ { @@ -48,10 +63,6 @@ { "command": "nx run node:build", "forwardAllArgs": false - }, - { - "command": "rm ./packages/node/dist/package.json", - "forwardAllArgs": false } ] } diff --git a/packages/node/rollup.config.cjs b/packages/node/rollup.config.cjs new file mode 100644 index 00000000000..4664778fa33 --- /dev/null +++ b/packages/node/rollup.config.cjs @@ -0,0 +1,66 @@ +const copy = require('rollup-plugin-copy'); + +module.exports = (rollupConfig, _projectOptions) => { + rollupConfig.input = { + index: 'packages/node/src/index.js', + runtimePlugin: 'packages/node/src/runtimePlugin.js', + 'record-dynamic-remote-entry-hash-plugin': 'packages/node/src/recordDynamicRemoteEntryHashPlugin.js', + 'utils/index': 'packages/node/src/utils/index.js', + 'plugins/NodeFederationPlugin': 'packages/node/src/plugins/NodeFederationPlugin.js', + 'plugins/UniverseEntryChunkTrackerPlugin': 'packages/node/src/plugins/UniverseEntryChunkTrackerPlugin.js', + }; + + rollupConfig.plugins.push( + copy({ + targets: [ + { src: 'packages/node/README.md', dest: 'packages/node/dist' }, + { src: 'packages/node/LICENSE', dest: 'packages/node/dist' }, + ], + }), + ); + + rollupConfig.external = [ + /@module-federation/, + 'btoa', + 'encoding', + 'node-fetch', + 'webpack', + 'react', + 'react-dom', + 'next', + ]; + + if (Array.isArray(rollupConfig.output)) { + rollupConfig.output = rollupConfig.output.map((c) => ({ + ...c, + hoistTransitiveImports: false, + entryFileNames: + c.format === 'cjs' + ? c.entryFileNames.replace('.js', '.cjs') + : c.entryFileNames, + chunkFileNames: + c.format === 'cjs' + ? c.chunkFileNames.replace('.js', '.cjs') + : c.chunkFileNames, + ...(c.format === 'cjs' ? { externalLiveBindings: false } : {}), + })); + } else { + rollupConfig.output = { + ...rollupConfig.output, + hoistTransitiveImports: false, + entryFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.entryFileNames.replace('.js', '.cjs') + : rollupConfig.output.entryFileNames, + chunkFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.chunkFileNames.replace('.js', '.cjs') + : rollupConfig.output.chunkFileNames, + ...(rollupConfig.output.format === 'cjs' + ? { externalLiveBindings: false } + : {}), + }; + } + + return rollupConfig; +}; \ No newline at end of file diff --git a/packages/typescript/package.json b/packages/typescript/package.json index e0b0501c2ac..d4a7e2d143d 100644 --- a/packages/typescript/package.json +++ b/packages/typescript/package.json @@ -3,7 +3,10 @@ "version": "3.1.4", "description": "Webpack plugin to stream typescript for module federation apps/components", "license": "MIT", - "type": "commonjs", + "type": "module", + "main": "./dist/index.cjs.cjs", + "module": "./dist/index.esm.js", + "types": "./dist/index.d.ts", "keywords": [ "module-federation", "typescript", @@ -27,9 +30,7 @@ "url": "https://github.com/module-federation/core/", "directory": "packages/typescript" }, - "scripts": { - "build": "tsc" - }, + "scripts": {}, "peerDependencies": { "typescript": "*", "vue-tsc": "^1.0.24", @@ -58,8 +59,16 @@ }, "exports": { ".": { - "types": "./dist/src/index.d.ts", - "require": "./dist/src/index.js" + "types": "./dist/index.d.ts", + "import": "./dist/index.esm.js", + "require": "./dist/index.cjs.cjs" + } + }, + "typesVersions": { + "*": { + ".": [ + "./dist/index.d.ts" + ] } } } diff --git a/packages/typescript/project.json b/packages/typescript/project.json index 44422372461..c6152fd5753 100644 --- a/packages/typescript/project.json +++ b/packages/typescript/project.json @@ -6,14 +6,21 @@ "tags": ["type:pkg"], "targets": { "build": { - "executor": "@nx/js:tsc", + "executor": "@nx/rollup:rollup", "outputs": ["{workspaceRoot}/packages/typescript/dist"], "options": { + "parallel": false, "outputPath": "packages/typescript/dist", "main": "packages/typescript/src/index.ts", "tsConfig": "packages/typescript/tsconfig.lib.json", - "assets": ["packages/typescript/*.md"], - "skipTypeCheck": true + "assets": [], + "external": ["node-fetch", "lodash.get"], + "project": "packages/typescript/package.json", + "compiler": "swc", + "rollupConfig": "packages/typescript/rollup.config.cjs", + "format": ["cjs", "esm"], + "generatePackageJson": false, + "useLegacyTypescriptPlugin": false }, "dependsOn": [ { diff --git a/packages/typescript/rollup.config.cjs b/packages/typescript/rollup.config.cjs new file mode 100644 index 00000000000..f4446785e43 --- /dev/null +++ b/packages/typescript/rollup.config.cjs @@ -0,0 +1,57 @@ +const copy = require('rollup-plugin-copy'); + +module.exports = (rollupConfig, _projectOptions) => { + rollupConfig.plugins.push( + copy({ + targets: [ + { src: 'packages/typescript/README.md', dest: 'packages/typescript/dist' }, + { src: 'packages/typescript/LICENSE', dest: 'packages/typescript/dist' }, + ], + }), + ); + + rollupConfig.external = [ + 'node-fetch', + 'lodash.get', + 'typescript', + 'vue-tsc', + 'webpack', + 'next', + 'react', + 'react-dom', + ]; + + if (Array.isArray(rollupConfig.output)) { + rollupConfig.output = rollupConfig.output.map((c) => ({ + ...c, + hoistTransitiveImports: false, + entryFileNames: + c.format === 'cjs' + ? c.entryFileNames.replace('.js', '.cjs') + : c.entryFileNames, + chunkFileNames: + c.format === 'cjs' + ? c.chunkFileNames.replace('.js', '.cjs') + : c.chunkFileNames, + ...(c.format === 'cjs' ? { externalLiveBindings: false } : {}), + })); + } else { + rollupConfig.output = { + ...rollupConfig.output, + hoistTransitiveImports: false, + entryFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.entryFileNames.replace('.js', '.cjs') + : rollupConfig.output.entryFileNames, + chunkFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.chunkFileNames.replace('.js', '.cjs') + : rollupConfig.output.chunkFileNames, + ...(rollupConfig.output.format === 'cjs' + ? { externalLiveBindings: false } + : {}), + }; + } + + return rollupConfig; +}; \ No newline at end of file From aac68b42e637e24a85ea24bedff6e19f40983bf5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 19 Aug 2025 10:59:58 +0000 Subject: [PATCH 3/4] Complete dual ESM+CJS setup for remaining packages Co-authored-by: ScriptedAlchemy <25274700+ScriptedAlchemy@users.noreply.github.com> --- packages/storybook-addon/package.json | 15 +++--- packages/storybook-addon/project.json | 15 ++++-- packages/storybook-addon/rollup.config.cjs | 60 ++++++++++++++++++++++ packages/utilities/package.json | 5 +- packages/utilities/project.json | 1 + packages/utilities/rollup.config.cjs | 48 +++++++++++++++++ 6 files changed, 133 insertions(+), 11 deletions(-) create mode 100644 packages/storybook-addon/rollup.config.cjs create mode 100644 packages/utilities/rollup.config.cjs diff --git a/packages/storybook-addon/package.json b/packages/storybook-addon/package.json index 8a48dd9c403..4d00c831daa 100644 --- a/packages/storybook-addon/package.json +++ b/packages/storybook-addon/package.json @@ -2,8 +2,11 @@ "name": "@module-federation/storybook-addon", "version": "4.0.27", "description": "Storybook addon to consume remote module federated apps/components", - "type": "commonjs", + "type": "module", "license": "MIT", + "main": "./dist/index.cjs.cjs", + "module": "./dist/index.esm.js", + "types": "./dist/index.d.ts", "repository": { "type": "git", "url": "https://github.com/module-federation/core/", @@ -25,16 +28,16 @@ "README.md" ], "author": "Fiodorov Andrei (https://github.com/fyodorovandrei)", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", "exports": { ".": { - "types": "./dist/src/index.d.ts", - "default": "./dist/src/index.js" + "types": "./dist/index.d.ts", + "import": "./dist/index.esm.js", + "require": "./dist/index.cjs.cjs" }, "./preset": { "types": "./dist/preset.d.ts", - "default": "./dist/preset.js" + "import": "./dist/preset.esm.js", + "require": "./dist/preset.cjs.cjs" }, "./*": "./*" }, diff --git a/packages/storybook-addon/project.json b/packages/storybook-addon/project.json index ecb67f83532..f6d04ceffda 100644 --- a/packages/storybook-addon/project.json +++ b/packages/storybook-addon/project.json @@ -7,13 +7,22 @@ "implicitDependencies": ["utils"], "targets": { "build": { - "executor": "@nx/js:tsc", - "outputs": ["{options.outputPath}"], + "executor": "@nx/rollup:rollup", + "outputs": ["{workspaceRoot}/packages/storybook-addon/dist"], "options": { + "parallel": false, "outputPath": "packages/storybook-addon/dist", "main": "packages/storybook-addon/src/index.ts", + "additionalEntryPoints": ["packages/storybook-addon/preset.ts"], "tsConfig": "packages/storybook-addon/tsconfig.lib.json", - "assets": ["packages/storybook-addon/*.md"] + "assets": [], + "external": ["@module-federation/*"], + "project": "packages/storybook-addon/package.json", + "compiler": "swc", + "rollupConfig": "packages/storybook-addon/rollup.config.cjs", + "format": ["cjs", "esm"], + "generatePackageJson": false, + "useLegacyTypescriptPlugin": false }, "dependsOn": [ { diff --git a/packages/storybook-addon/rollup.config.cjs b/packages/storybook-addon/rollup.config.cjs new file mode 100644 index 00000000000..eee1989ff28 --- /dev/null +++ b/packages/storybook-addon/rollup.config.cjs @@ -0,0 +1,60 @@ +const copy = require('rollup-plugin-copy'); + +module.exports = (rollupConfig, _projectOptions) => { + rollupConfig.input = { + index: 'packages/storybook-addon/src/index.ts', + preset: 'packages/storybook-addon/preset.ts', + }; + + rollupConfig.plugins.push( + copy({ + targets: [ + { src: 'packages/storybook-addon/README.md', dest: 'packages/storybook-addon/dist' }, + { src: 'packages/storybook-addon/LICENSE', dest: 'packages/storybook-addon/dist' }, + ], + }), + ); + + rollupConfig.external = [ + /@module-federation/, + /@storybook/, + /@rsbuild/, + /@nx/, + 'webpack', + 'webpack-virtual-modules', + ]; + + if (Array.isArray(rollupConfig.output)) { + rollupConfig.output = rollupConfig.output.map((c) => ({ + ...c, + hoistTransitiveImports: false, + entryFileNames: + c.format === 'cjs' + ? c.entryFileNames.replace('.js', '.cjs') + : c.entryFileNames, + chunkFileNames: + c.format === 'cjs' + ? c.chunkFileNames.replace('.js', '.cjs') + : c.chunkFileNames, + ...(c.format === 'cjs' ? { externalLiveBindings: false } : {}), + })); + } else { + rollupConfig.output = { + ...rollupConfig.output, + hoistTransitiveImports: false, + entryFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.entryFileNames.replace('.js', '.cjs') + : rollupConfig.output.entryFileNames, + chunkFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.chunkFileNames.replace('.js', '.cjs') + : rollupConfig.output.chunkFileNames, + ...(rollupConfig.output.format === 'cjs' + ? { externalLiveBindings: false } + : {}), + }; + } + + return rollupConfig; +}; \ No newline at end of file diff --git a/packages/utilities/package.json b/packages/utilities/package.json index b8c0eb3812d..af7bbad12b2 100644 --- a/packages/utilities/package.json +++ b/packages/utilities/package.json @@ -1,7 +1,8 @@ { "name": "@module-federation/utilities", "version": "3.1.66", - "main": "./dist/index.cjs.js", + "type": "module", + "main": "./dist/index.cjs.cjs", "module": "./dist/index.esm.js", "types": "./dist/index.d.ts", "license": "MIT", @@ -44,7 +45,7 @@ ".": { "types": "./dist/index.d.ts", "import": "./dist/index.esm.js", - "require": "./dist/index.cjs.js" + "require": "./dist/index.cjs.cjs" }, "./package.json": "./package.json" }, diff --git a/packages/utilities/project.json b/packages/utilities/project.json index 5d260f5b1ca..9cead1b55d7 100644 --- a/packages/utilities/project.json +++ b/packages/utilities/project.json @@ -30,6 +30,7 @@ "additionalEntryPoints": ["packages/utilities/src/types/types.ts"], "external": ["@module-federation/*"], "compiler": "swc", + "rollupConfig": "packages/utilities/rollup.config.cjs", "format": ["cjs", "esm"], "generatePackageJson": false, "useLegacyTypescriptPlugin": false diff --git a/packages/utilities/rollup.config.cjs b/packages/utilities/rollup.config.cjs new file mode 100644 index 00000000000..c106f3a43b6 --- /dev/null +++ b/packages/utilities/rollup.config.cjs @@ -0,0 +1,48 @@ +const copy = require('rollup-plugin-copy'); + +module.exports = (rollupConfig, _projectOptions) => { + rollupConfig.plugins.push( + copy({ + targets: [ + { src: 'packages/utilities/README.md', dest: 'packages/utilities/dist' }, + { src: 'packages/utilities/LICENSE', dest: 'packages/utilities/dist' }, + ], + }), + ); + + rollupConfig.external = [/@module-federation/]; + + if (Array.isArray(rollupConfig.output)) { + rollupConfig.output = rollupConfig.output.map((c) => ({ + ...c, + hoistTransitiveImports: false, + entryFileNames: + c.format === 'cjs' + ? c.entryFileNames.replace('.js', '.cjs') + : c.entryFileNames, + chunkFileNames: + c.format === 'cjs' + ? c.chunkFileNames.replace('.js', '.cjs') + : c.chunkFileNames, + ...(c.format === 'cjs' ? { externalLiveBindings: false } : {}), + })); + } else { + rollupConfig.output = { + ...rollupConfig.output, + hoistTransitiveImports: false, + entryFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.entryFileNames.replace('.js', '.cjs') + : rollupConfig.output.entryFileNames, + chunkFileNames: + rollupConfig.output.format === 'cjs' + ? rollupConfig.output.chunkFileNames.replace('.js', '.cjs') + : rollupConfig.output.chunkFileNames, + ...(rollupConfig.output.format === 'cjs' + ? { externalLiveBindings: false } + : {}), + }; + } + + return rollupConfig; +}; \ No newline at end of file From 0ff61365532c6fe78e817c8f8945b51b236d6f02 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 21 Aug 2025 21:12:24 +0000 Subject: [PATCH 4/4] Remove 'type': 'module' from packages for better TypeScript CJS compatibility Co-authored-by: ScriptedAlchemy <25274700+ScriptedAlchemy@users.noreply.github.com> --- packages/cli/package.json | 1 - packages/dts-plugin/package.json | 1 - packages/enhanced/package.json | 1 - packages/nextjs-mf/package.json | 1 - packages/node/package.json | 1 - packages/storybook-addon/package.json | 1 - packages/typescript/package.json | 1 - packages/utilities/package.json | 1 - 8 files changed, 8 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 1f9e9f2ee84..86c27d50008 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,6 @@ { "name": "@module-federation/cli", "version": "0.18.3", - "type": "module", "description": "Module Federation CLI", "homepage": "https://module-federation.io", "bugs": { diff --git a/packages/dts-plugin/package.json b/packages/dts-plugin/package.json index 1892f85134e..06d56c71e8e 100644 --- a/packages/dts-plugin/package.json +++ b/packages/dts-plugin/package.json @@ -1,7 +1,6 @@ { "name": "@module-federation/dts-plugin", "version": "0.18.3", - "type": "module", "author": "hanric ", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/packages/enhanced/package.json b/packages/enhanced/package.json index 457b44db0b3..ab36cdfd161 100644 --- a/packages/enhanced/package.json +++ b/packages/enhanced/package.json @@ -1,7 +1,6 @@ { "name": "@module-federation/enhanced", "version": "0.18.3", - "type": "module", "main": "./dist/index.cjs.cjs", "module": "./dist/index.esm.js", "types": "./dist/index.d.ts", diff --git a/packages/nextjs-mf/package.json b/packages/nextjs-mf/package.json index e783f292db7..97730b496c2 100644 --- a/packages/nextjs-mf/package.json +++ b/packages/nextjs-mf/package.json @@ -2,7 +2,6 @@ "name": "@module-federation/nextjs-mf", "version": "8.8.38", "license": "MIT", - "type": "module", "main": "./dist/index.cjs.cjs", "module": "./dist/index.esm.js", "types": "./dist/index.d.ts", diff --git a/packages/node/package.json b/packages/node/package.json index 4de948eb074..38471622900 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -2,7 +2,6 @@ "public": true, "name": "@module-federation/node", "version": "2.7.14", - "type": "module", "main": "./dist/index.cjs.cjs", "module": "./dist/index.esm.js", "types": "./dist/index.d.ts", diff --git a/packages/storybook-addon/package.json b/packages/storybook-addon/package.json index 4d00c831daa..0fb98c93bc0 100644 --- a/packages/storybook-addon/package.json +++ b/packages/storybook-addon/package.json @@ -2,7 +2,6 @@ "name": "@module-federation/storybook-addon", "version": "4.0.27", "description": "Storybook addon to consume remote module federated apps/components", - "type": "module", "license": "MIT", "main": "./dist/index.cjs.cjs", "module": "./dist/index.esm.js", diff --git a/packages/typescript/package.json b/packages/typescript/package.json index d4a7e2d143d..d610a456a48 100644 --- a/packages/typescript/package.json +++ b/packages/typescript/package.json @@ -3,7 +3,6 @@ "version": "3.1.4", "description": "Webpack plugin to stream typescript for module federation apps/components", "license": "MIT", - "type": "module", "main": "./dist/index.cjs.cjs", "module": "./dist/index.esm.js", "types": "./dist/index.d.ts", diff --git a/packages/utilities/package.json b/packages/utilities/package.json index af7bbad12b2..2eae727f791 100644 --- a/packages/utilities/package.json +++ b/packages/utilities/package.json @@ -1,7 +1,6 @@ { "name": "@module-federation/utilities", "version": "3.1.66", - "type": "module", "main": "./dist/index.cjs.cjs", "module": "./dist/index.esm.js", "types": "./dist/index.d.ts",