@module-federation/metro 0.0.0-next-20250827124348

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/babel-plugin/index.js +115 -0
  4. package/babel-plugin/patch-initialize-core.js +61 -0
  5. package/babel-plugin/patch-require.js +174 -0
  6. package/bootstrap/index.d.ts +1 -0
  7. package/bootstrap/index.js +1 -0
  8. package/dist/babel/transformer.d.ts +2 -0
  9. package/dist/babel/transformer.js +15 -0
  10. package/dist/commands/bundle-host/index.d.ts +13 -0
  11. package/dist/commands/bundle-host/index.js +95 -0
  12. package/dist/commands/bundle-host/index.mjs +69 -0
  13. package/dist/commands/bundle-host/options.d.ts +5 -0
  14. package/dist/commands/bundle-host/options.js +39 -0
  15. package/dist/commands/bundle-host/options.mjs +7 -0
  16. package/dist/commands/bundle-host/types.d.ts +22 -0
  17. package/dist/commands/bundle-host/types.js +18 -0
  18. package/dist/commands/bundle-host/types.mjs +2 -0
  19. package/dist/commands/bundle-remote/index.d.ts +12 -0
  20. package/dist/commands/bundle-remote/index.js +226 -0
  21. package/dist/commands/bundle-remote/index.mjs +200 -0
  22. package/dist/commands/bundle-remote/options.d.ts +32 -0
  23. package/dist/commands/bundle-remote/options.js +109 -0
  24. package/dist/commands/bundle-remote/options.mjs +67 -0
  25. package/dist/commands/bundle-remote/types.d.ts +16 -0
  26. package/dist/commands/bundle-remote/types.js +18 -0
  27. package/dist/commands/bundle-remote/types.mjs +2 -0
  28. package/dist/commands/index.d.ts +48 -0
  29. package/dist/commands/index.js +72 -0
  30. package/dist/commands/index.mjs +13 -0
  31. package/dist/commands/types.d.ts +14 -0
  32. package/dist/commands/types.js +18 -0
  33. package/dist/commands/types.mjs +2 -0
  34. package/dist/commands/utils/create-module-path-remapper.d.ts +7 -0
  35. package/dist/commands/utils/create-module-path-remapper.js +64 -0
  36. package/dist/commands/utils/create-module-path-remapper.mjs +32 -0
  37. package/dist/commands/utils/create-resolver.d.ts +20 -0
  38. package/dist/commands/utils/create-resolver.js +57 -0
  39. package/dist/commands/utils/create-resolver.mjs +25 -0
  40. package/dist/commands/utils/get-community-plugin.d.ts +29 -0
  41. package/dist/commands/utils/get-community-plugin.js +50 -0
  42. package/dist/commands/utils/get-community-plugin.mjs +18 -0
  43. package/dist/commands/utils/load-metro-config.d.ts +3 -0
  44. package/dist/commands/utils/load-metro-config.js +84 -0
  45. package/dist/commands/utils/load-metro-config.mjs +43 -0
  46. package/dist/commands/utils/save-bundle-and-map.d.ts +5 -0
  47. package/dist/commands/utils/save-bundle-and-map.js +77 -0
  48. package/dist/commands/utils/save-bundle-and-map.mjs +57 -0
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.js +40 -0
  51. package/dist/index.mjs +5 -0
  52. package/dist/modules/HMRClient.ts +31 -0
  53. package/dist/modules/HMRClientShim.ts +1 -0
  54. package/dist/modules/asyncRequire.ts +134 -0
  55. package/dist/modules/asyncStartup.tsx +38 -0
  56. package/dist/modules/getDevServer.ts +15 -0
  57. package/dist/modules/metroCorePlugin.ts +83 -0
  58. package/dist/plugin/babel-transformer.d.ts +11 -0
  59. package/dist/plugin/babel-transformer.js +68 -0
  60. package/dist/plugin/babel-transformer.mjs +25 -0
  61. package/dist/plugin/constants.d.ts +9 -0
  62. package/dist/plugin/constants.js +68 -0
  63. package/dist/plugin/constants.mjs +12 -0
  64. package/dist/plugin/generators.d.ts +13 -0
  65. package/dist/plugin/generators.js +157 -0
  66. package/dist/plugin/generators.mjs +99 -0
  67. package/dist/plugin/helpers.d.ts +7 -0
  68. package/dist/plugin/helpers.js +119 -0
  69. package/dist/plugin/helpers.mjs +58 -0
  70. package/dist/plugin/index.d.ts +9 -0
  71. package/dist/plugin/index.js +167 -0
  72. package/dist/plugin/index.mjs +124 -0
  73. package/dist/plugin/manifest.d.ts +3 -0
  74. package/dist/plugin/manifest.js +146 -0
  75. package/dist/plugin/manifest.mjs +100 -0
  76. package/dist/plugin/normalize-extra-options.d.ts +8 -0
  77. package/dist/plugin/normalize-extra-options.js +46 -0
  78. package/dist/plugin/normalize-extra-options.mjs +14 -0
  79. package/dist/plugin/normalize-options.d.ts +7 -0
  80. package/dist/plugin/normalize-options.js +89 -0
  81. package/dist/plugin/normalize-options.mjs +46 -0
  82. package/dist/plugin/resolver.d.ts +25 -0
  83. package/dist/plugin/resolver.js +199 -0
  84. package/dist/plugin/resolver.mjs +160 -0
  85. package/dist/plugin/rewrite-request.d.ts +10 -0
  86. package/dist/plugin/rewrite-request.js +76 -0
  87. package/dist/plugin/rewrite-request.mjs +34 -0
  88. package/dist/plugin/serializer.d.ts +5 -0
  89. package/dist/plugin/serializer.js +171 -0
  90. package/dist/plugin/serializer.mjs +151 -0
  91. package/dist/plugin/validate-options.d.ts +2 -0
  92. package/dist/plugin/validate-options.js +61 -0
  93. package/dist/plugin/validate-options.mjs +29 -0
  94. package/dist/runtime/host-entry.d.ts +1 -0
  95. package/dist/runtime/host-entry.js +3 -0
  96. package/dist/runtime/init-host.d.ts +1 -0
  97. package/dist/runtime/init-host.js +31 -0
  98. package/dist/runtime/remote-entry.d.ts +1 -0
  99. package/dist/runtime/remote-entry.js +57 -0
  100. package/dist/runtime/remote-hmr.d.ts +1 -0
  101. package/dist/runtime/remote-hmr.js +19 -0
  102. package/dist/runtime/remote-module-registry.d.ts +7 -0
  103. package/dist/runtime/remote-module-registry.js +57 -0
  104. package/dist/runtime/remote-module.d.ts +1 -0
  105. package/dist/runtime/remote-module.js +2 -0
  106. package/dist/types.d.ts +26 -0
  107. package/dist/types.js +18 -0
  108. package/dist/types.mjs +2 -0
  109. package/dist/utils/errors.d.ts +8 -0
  110. package/dist/utils/errors.js +50 -0
  111. package/dist/utils/errors.mjs +15 -0
  112. package/dist/utils/index.d.ts +2 -0
  113. package/dist/utils/index.js +43 -0
  114. package/dist/utils/index.mjs +5 -0
  115. package/dist/utils/vm-manager.d.ts +21 -0
  116. package/dist/utils/vm-manager.js +116 -0
  117. package/dist/utils/vm-manager.mjs +73 -0
  118. package/package.json +91 -0
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.r = (exports1)=>{
5
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
6
+ value: 'Module'
7
+ });
8
+ Object.defineProperty(exports1, '__esModule', {
9
+ value: true
10
+ });
11
+ };
12
+ })();
13
+ var __webpack_exports__ = {};
14
+ __webpack_require__.r(__webpack_exports__);
15
+ for(var __webpack_i__ in __webpack_exports__)exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
16
+ Object.defineProperty(exports, '__esModule', {
17
+ value: true
18
+ });
@@ -0,0 +1,2 @@
1
+ import 'module';
2
+ /*#__PURE__*/ import.meta.url;
@@ -0,0 +1,12 @@
1
+ import type { ModuleFederationConfigNormalized } from '../../types';
2
+ import type { Config } from '../types';
3
+ import type { BundleFederatedRemoteArgs } from './types';
4
+ declare global {
5
+ var __METRO_FEDERATION_CONFIG: ModuleFederationConfigNormalized;
6
+ var __METRO_FEDERATION_ORIGINAL_ENTRY_PATH: string | undefined;
7
+ var __METRO_FEDERATION_REMOTE_ENTRY_PATH: string | undefined;
8
+ var __METRO_FEDERATION_MANIFEST_PATH: string | undefined;
9
+ }
10
+ declare function bundleFederatedRemote(_argv: Array<string>, cfg: Config, args: BundleFederatedRemoteArgs): Promise<void>;
11
+ export default bundleFederatedRemote;
12
+ export { default as bundleFederatedRemoteOptions } from './options';
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, definition)=>{
14
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
+ enumerable: true,
16
+ get: definition[key]
17
+ });
18
+ };
19
+ })();
20
+ (()=>{
21
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
22
+ })();
23
+ (()=>{
24
+ __webpack_require__.r = (exports1)=>{
25
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
26
+ value: 'Module'
27
+ });
28
+ Object.defineProperty(exports1, '__esModule', {
29
+ value: true
30
+ });
31
+ };
32
+ })();
33
+ var __webpack_exports__ = {};
34
+ __webpack_require__.r(__webpack_exports__);
35
+ __webpack_require__.d(__webpack_exports__, {
36
+ bundleFederatedRemoteOptions: ()=>external_options_js_default(),
37
+ default: ()=>bundle_remote
38
+ });
39
+ const external_node_fs_namespaceObject = require("node:fs");
40
+ const external_node_path_namespaceObject = require("node:path");
41
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
42
+ const external_node_url_namespaceObject = require("node:url");
43
+ const external_node_util_namespaceObject = require("node:util");
44
+ var external_node_util_default = /*#__PURE__*/ __webpack_require__.n(external_node_util_namespaceObject);
45
+ const external_metro_namespaceObject = require("metro");
46
+ const Server_namespaceObject = require("metro/src/Server");
47
+ var Server_default = /*#__PURE__*/ __webpack_require__.n(Server_namespaceObject);
48
+ const errors_js_namespaceObject = require("../../utils/errors.js");
49
+ const create_module_path_remapper_js_namespaceObject = require("../utils/create-module-path-remapper.js");
50
+ const create_resolver_js_namespaceObject = require("../utils/create-resolver.js");
51
+ const load_metro_config_js_namespaceObject = require("../utils/load-metro-config.js");
52
+ var load_metro_config_js_default = /*#__PURE__*/ __webpack_require__.n(load_metro_config_js_namespaceObject);
53
+ const save_bundle_and_map_js_namespaceObject = require("../utils/save-bundle-and-map.js");
54
+ const external_options_js_namespaceObject = require("./options.js");
55
+ var external_options_js_default = /*#__PURE__*/ __webpack_require__.n(external_options_js_namespaceObject);
56
+ const DEFAULT_OUTPUT = 'dist';
57
+ async function buildBundle(server, requestOpts) {
58
+ const bundle = await server.build({
59
+ ...Server_default().DEFAULT_BUNDLE_OPTIONS,
60
+ ...requestOpts
61
+ });
62
+ return bundle;
63
+ }
64
+ function getRequestOpts(args, opts) {
65
+ return {
66
+ dev: args.dev,
67
+ minify: void 0 !== args.minify ? args.minify : !args.dev,
68
+ platform: args.platform,
69
+ entryFile: opts.entryFile,
70
+ sourceUrl: opts.sourceUrl,
71
+ sourceMapUrl: opts.sourceMapUrl,
72
+ lazy: opts.isContainerModule,
73
+ runModule: opts.isContainerModule,
74
+ modulesOnly: !opts.isContainerModule
75
+ };
76
+ }
77
+ function getSaveBundleOpts(args, opts) {
78
+ return {
79
+ indexedRamBundle: false,
80
+ bundleEncoding: args.bundleEncoding,
81
+ dev: args.dev,
82
+ platform: args.platform,
83
+ sourcemapSourcesRoot: args.sourcemapSourcesRoot,
84
+ sourcemapUseAbsolutePath: args.sourcemapUseAbsolutePath,
85
+ bundleOutput: opts.bundleOutput,
86
+ sourcemapOutput: opts.sourcemapOutput
87
+ };
88
+ }
89
+ async function bundleFederatedRemote(_argv, cfg, args) {
90
+ const rawConfig = await load_metro_config_js_default()(cfg, {
91
+ maxWorkers: args.maxWorkers,
92
+ resetCache: args.resetCache,
93
+ config: args.config
94
+ });
95
+ const logger = cfg.logger ?? console;
96
+ const federationConfig = global.__METRO_FEDERATION_CONFIG;
97
+ if (!federationConfig) {
98
+ logger.error(`${external_node_util_default().styleText('red', 'error')} Module Federation configuration is missing.`);
99
+ logger.info("Import the plugin 'withModuleFederation' from '@module-federation/metro' package and wrap your final Metro config with it.");
100
+ throw new errors_js_namespaceObject.CLIError('Bundling failed');
101
+ }
102
+ const containerEntryFilepath = global.__METRO_FEDERATION_REMOTE_ENTRY_PATH;
103
+ if (!containerEntryFilepath) {
104
+ logger.error(`${external_node_util_default().styleText('red', 'error')} Cannot determine the container entry file path.`);
105
+ logger.info("To bundle a container, you need to expose at least one module in your Module Federation configuration.");
106
+ throw new errors_js_namespaceObject.CLIError('Bundling failed');
107
+ }
108
+ const manifestFilepath = global.__METRO_FEDERATION_MANIFEST_PATH;
109
+ if (!manifestFilepath) {
110
+ logger.error(`${external_node_util_default().styleText('red', 'error')} Cannot determine the manifest file path.`);
111
+ throw new errors_js_namespaceObject.CLIError('Bundling failed');
112
+ }
113
+ if (-1 === rawConfig.resolver.platforms.indexOf(args.platform)) {
114
+ logger.error(`${external_node_util_default().styleText('red', 'error')}: Invalid platform ${args.platform ? `"${external_node_util_default().styleText('bold', args.platform)}" ` : ''}selected.`);
115
+ logger.info(`Available platforms are: ${rawConfig.resolver.platforms.map((x)=>`"${external_node_util_default().styleText('bold', x)}"`).join(', ')}. If you are trying to bundle for an out-of-tree platform, it may not be installed.`);
116
+ throw new errors_js_namespaceObject.CLIError('Bundling failed');
117
+ }
118
+ process.env.NODE_ENV = args.dev ? 'development' : 'production';
119
+ const modulePathRemapper = (0, create_module_path_remapper_js_namespaceObject.createModulePathRemapper)();
120
+ const config = (0, external_metro_namespaceObject.mergeConfig)(rawConfig, {
121
+ resolver: {
122
+ resolveRequest: (context, moduleName, platform)=>{
123
+ const originalResolveRequest = rawConfig.resolver.resolveRequest;
124
+ const res = originalResolveRequest(context, moduleName, platform);
125
+ return modulePathRemapper.remap(res);
126
+ }
127
+ },
128
+ serializer: {
129
+ createModuleIdFactory: ()=>{
130
+ const factory = rawConfig.serializer.createModuleIdFactory();
131
+ return (path)=>factory(modulePathRemapper.reverse(path));
132
+ }
133
+ }
134
+ });
135
+ const server = new (Server_default())(config);
136
+ config.server.enhanceMiddleware(server.processRequest, server);
137
+ const resolver = await (0, create_resolver_js_namespaceObject.createResolver)(server, args.platform);
138
+ const outputDir = args.output ? external_node_path_default().resolve(external_node_path_default().join(args.output, args.platform)) : external_node_path_default().resolve(config.projectRoot, external_node_path_default().join(DEFAULT_OUTPUT, args.platform));
139
+ const containerModule = {
140
+ [federationConfig.filename]: {
141
+ moduleInputFilepath: containerEntryFilepath,
142
+ moduleOutputDir: outputDir,
143
+ isContainerModule: true
144
+ }
145
+ };
146
+ resolver.resolve({
147
+ from: config.projectRoot,
148
+ to: `./${external_node_path_default().relative(config.projectRoot, containerEntryFilepath)}`
149
+ });
150
+ const exposedModules = Object.entries(federationConfig.exposes).map(([moduleName, moduleFilepath])=>[
151
+ moduleName.slice(2),
152
+ moduleFilepath
153
+ ]).reduce((acc, [moduleName, moduleInputFilepath])=>{
154
+ acc[moduleName] = {
155
+ moduleInputFilepath: external_node_path_default().resolve(config.projectRoot, moduleInputFilepath),
156
+ moduleOutputDir: external_node_path_default().resolve(outputDir, 'exposed'),
157
+ isContainerModule: false
158
+ };
159
+ return acc;
160
+ }, {});
161
+ const sharedModules = Object.entries(federationConfig.shared).filter(([, sharedConfig])=>!sharedConfig.eager && false !== sharedConfig.import).reduce((acc, [moduleName])=>{
162
+ const inputFilepath = resolver.resolve({
163
+ from: containerEntryFilepath,
164
+ to: moduleName
165
+ });
166
+ acc[moduleName] = {
167
+ moduleInputFilepath: inputFilepath,
168
+ moduleOutputDir: external_node_path_default().resolve(outputDir, 'shared'),
169
+ isContainerModule: false
170
+ };
171
+ return acc;
172
+ }, {});
173
+ const requests = Object.entries({
174
+ ...containerModule,
175
+ ...exposedModules,
176
+ ...sharedModules
177
+ }).map(([moduleName, { moduleInputFilepath, moduleOutputDir, isContainerModule = false }])=>{
178
+ const moduleBundleName = isContainerModule ? moduleName : `${moduleName}.bundle`;
179
+ const moduleBundleFilepath = external_node_path_default().resolve(moduleOutputDir, moduleBundleName);
180
+ const moduleBundleUrl = (0, external_node_url_namespaceObject.pathToFileURL)('/' + external_node_path_default().relative(outputDir, moduleBundleFilepath)).href;
181
+ const moduleSourceMapName = `${moduleBundleName}.map`;
182
+ const moduleSourceMapFilepath = external_node_path_default().resolve(moduleOutputDir, moduleSourceMapName);
183
+ const moduleSourceMapUrl = external_node_path_default().relative(outputDir, moduleSourceMapFilepath);
184
+ if (!isContainerModule) modulePathRemapper.addMapping(moduleInputFilepath, external_node_path_default().relative(outputDir, moduleBundleFilepath));
185
+ return {
186
+ targetDir: external_node_path_default().dirname(moduleBundleFilepath),
187
+ requestOpts: getRequestOpts(args, {
188
+ isContainerModule,
189
+ entryFile: moduleInputFilepath,
190
+ sourceUrl: moduleBundleUrl,
191
+ sourceMapUrl: moduleSourceMapUrl
192
+ }),
193
+ saveBundleOpts: getSaveBundleOpts(args, {
194
+ bundleOutput: moduleBundleFilepath,
195
+ sourcemapOutput: moduleSourceMapFilepath
196
+ })
197
+ };
198
+ });
199
+ try {
200
+ logger.info(`${external_node_util_default().styleText('blue', 'Processing remote container and exposed modules')}`);
201
+ for (const { requestOpts, saveBundleOpts, targetDir } of requests){
202
+ await external_node_fs_namespaceObject.promises.mkdir(targetDir, {
203
+ recursive: true,
204
+ mode: 493
205
+ });
206
+ const bundle = await buildBundle(server, requestOpts);
207
+ await (0, save_bundle_and_map_js_namespaceObject.saveBundleAndMap)(bundle, saveBundleOpts, logger.info);
208
+ }
209
+ logger.info(`${external_node_util_default().styleText('blue', 'Processing manifest')}`);
210
+ const manifestOutputFilepath = external_node_path_default().resolve(outputDir, 'mf-manifest.json');
211
+ await external_node_fs_namespaceObject.promises.copyFile(manifestFilepath, manifestOutputFilepath);
212
+ logger.info(`Done writing MF Manifest to:\n${external_node_util_default().styleText('dim', manifestOutputFilepath)}`);
213
+ } finally{
214
+ await server.end();
215
+ }
216
+ }
217
+ const bundle_remote = bundleFederatedRemote;
218
+ exports.bundleFederatedRemoteOptions = __webpack_exports__.bundleFederatedRemoteOptions;
219
+ exports["default"] = __webpack_exports__["default"];
220
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
221
+ "bundleFederatedRemoteOptions",
222
+ "default"
223
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
224
+ Object.defineProperty(exports, '__esModule', {
225
+ value: true
226
+ });
@@ -0,0 +1,200 @@
1
+ import 'module';
2
+ /*#__PURE__*/ import.meta.url;
3
+ import { promises } from "node:fs";
4
+ import node_path from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ import node_util from "node:util";
7
+ import { CLIError } from "../../utils/errors.mjs";
8
+ import { createModulePathRemapper } from "../utils/create-module-path-remapper.mjs";
9
+ import { createResolver } from "../utils/create-resolver.mjs";
10
+ import load_metro_config from "../utils/load-metro-config.mjs";
11
+ import { saveBundleAndMap } from "../utils/save-bundle-and-map.mjs";
12
+ import options from "./options.mjs";
13
+ import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "node:module";
14
+ var __webpack_require__ = {};
15
+ (()=>{
16
+ __webpack_require__.n = (module)=>{
17
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
18
+ __webpack_require__.d(getter, {
19
+ a: getter
20
+ });
21
+ return getter;
22
+ };
23
+ })();
24
+ (()=>{
25
+ __webpack_require__.d = (exports, definition)=>{
26
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, {
27
+ enumerable: true,
28
+ get: definition[key]
29
+ });
30
+ };
31
+ })();
32
+ (()=>{
33
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
34
+ })();
35
+ const external_metro_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("metro");
36
+ const Server_namespaceObject = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("metro/src/Server");
37
+ var Server_default = /*#__PURE__*/ __webpack_require__.n(Server_namespaceObject);
38
+ const DEFAULT_OUTPUT = 'dist';
39
+ async function buildBundle(server, requestOpts) {
40
+ const bundle = await server.build({
41
+ ...Server_default().DEFAULT_BUNDLE_OPTIONS,
42
+ ...requestOpts
43
+ });
44
+ return bundle;
45
+ }
46
+ function getRequestOpts(args, opts) {
47
+ return {
48
+ dev: args.dev,
49
+ minify: void 0 !== args.minify ? args.minify : !args.dev,
50
+ platform: args.platform,
51
+ entryFile: opts.entryFile,
52
+ sourceUrl: opts.sourceUrl,
53
+ sourceMapUrl: opts.sourceMapUrl,
54
+ lazy: opts.isContainerModule,
55
+ runModule: opts.isContainerModule,
56
+ modulesOnly: !opts.isContainerModule
57
+ };
58
+ }
59
+ function getSaveBundleOpts(args, opts) {
60
+ return {
61
+ indexedRamBundle: false,
62
+ bundleEncoding: args.bundleEncoding,
63
+ dev: args.dev,
64
+ platform: args.platform,
65
+ sourcemapSourcesRoot: args.sourcemapSourcesRoot,
66
+ sourcemapUseAbsolutePath: args.sourcemapUseAbsolutePath,
67
+ bundleOutput: opts.bundleOutput,
68
+ sourcemapOutput: opts.sourcemapOutput
69
+ };
70
+ }
71
+ async function bundleFederatedRemote(_argv, cfg, args) {
72
+ const rawConfig = await load_metro_config(cfg, {
73
+ maxWorkers: args.maxWorkers,
74
+ resetCache: args.resetCache,
75
+ config: args.config
76
+ });
77
+ const logger = cfg.logger ?? console;
78
+ const federationConfig = global.__METRO_FEDERATION_CONFIG;
79
+ if (!federationConfig) {
80
+ logger.error(`${node_util.styleText('red', 'error')} Module Federation configuration is missing.`);
81
+ logger.info("Import the plugin 'withModuleFederation' from '@module-federation/metro' package and wrap your final Metro config with it.");
82
+ throw new CLIError('Bundling failed');
83
+ }
84
+ const containerEntryFilepath = global.__METRO_FEDERATION_REMOTE_ENTRY_PATH;
85
+ if (!containerEntryFilepath) {
86
+ logger.error(`${node_util.styleText('red', 'error')} Cannot determine the container entry file path.`);
87
+ logger.info("To bundle a container, you need to expose at least one module in your Module Federation configuration.");
88
+ throw new CLIError('Bundling failed');
89
+ }
90
+ const manifestFilepath = global.__METRO_FEDERATION_MANIFEST_PATH;
91
+ if (!manifestFilepath) {
92
+ logger.error(`${node_util.styleText('red', 'error')} Cannot determine the manifest file path.`);
93
+ throw new CLIError('Bundling failed');
94
+ }
95
+ if (-1 === rawConfig.resolver.platforms.indexOf(args.platform)) {
96
+ logger.error(`${node_util.styleText('red', 'error')}: Invalid platform ${args.platform ? `"${node_util.styleText('bold', args.platform)}" ` : ''}selected.`);
97
+ logger.info(`Available platforms are: ${rawConfig.resolver.platforms.map((x)=>`"${node_util.styleText('bold', x)}"`).join(', ')}. If you are trying to bundle for an out-of-tree platform, it may not be installed.`);
98
+ throw new CLIError('Bundling failed');
99
+ }
100
+ process.env.NODE_ENV = args.dev ? 'development' : 'production';
101
+ const modulePathRemapper = createModulePathRemapper();
102
+ const config = (0, external_metro_namespaceObject.mergeConfig)(rawConfig, {
103
+ resolver: {
104
+ resolveRequest: (context, moduleName, platform)=>{
105
+ const originalResolveRequest = rawConfig.resolver.resolveRequest;
106
+ const res = originalResolveRequest(context, moduleName, platform);
107
+ return modulePathRemapper.remap(res);
108
+ }
109
+ },
110
+ serializer: {
111
+ createModuleIdFactory: ()=>{
112
+ const factory = rawConfig.serializer.createModuleIdFactory();
113
+ return (path)=>factory(modulePathRemapper.reverse(path));
114
+ }
115
+ }
116
+ });
117
+ const server = new (Server_default())(config);
118
+ config.server.enhanceMiddleware(server.processRequest, server);
119
+ const resolver = await createResolver(server, args.platform);
120
+ const outputDir = args.output ? node_path.resolve(node_path.join(args.output, args.platform)) : node_path.resolve(config.projectRoot, node_path.join(DEFAULT_OUTPUT, args.platform));
121
+ const containerModule = {
122
+ [federationConfig.filename]: {
123
+ moduleInputFilepath: containerEntryFilepath,
124
+ moduleOutputDir: outputDir,
125
+ isContainerModule: true
126
+ }
127
+ };
128
+ resolver.resolve({
129
+ from: config.projectRoot,
130
+ to: `./${node_path.relative(config.projectRoot, containerEntryFilepath)}`
131
+ });
132
+ const exposedModules = Object.entries(federationConfig.exposes).map(([moduleName, moduleFilepath])=>[
133
+ moduleName.slice(2),
134
+ moduleFilepath
135
+ ]).reduce((acc, [moduleName, moduleInputFilepath])=>{
136
+ acc[moduleName] = {
137
+ moduleInputFilepath: node_path.resolve(config.projectRoot, moduleInputFilepath),
138
+ moduleOutputDir: node_path.resolve(outputDir, 'exposed'),
139
+ isContainerModule: false
140
+ };
141
+ return acc;
142
+ }, {});
143
+ const sharedModules = Object.entries(federationConfig.shared).filter(([, sharedConfig])=>!sharedConfig.eager && false !== sharedConfig.import).reduce((acc, [moduleName])=>{
144
+ const inputFilepath = resolver.resolve({
145
+ from: containerEntryFilepath,
146
+ to: moduleName
147
+ });
148
+ acc[moduleName] = {
149
+ moduleInputFilepath: inputFilepath,
150
+ moduleOutputDir: node_path.resolve(outputDir, 'shared'),
151
+ isContainerModule: false
152
+ };
153
+ return acc;
154
+ }, {});
155
+ const requests = Object.entries({
156
+ ...containerModule,
157
+ ...exposedModules,
158
+ ...sharedModules
159
+ }).map(([moduleName, { moduleInputFilepath, moduleOutputDir, isContainerModule = false }])=>{
160
+ const moduleBundleName = isContainerModule ? moduleName : `${moduleName}.bundle`;
161
+ const moduleBundleFilepath = node_path.resolve(moduleOutputDir, moduleBundleName);
162
+ const moduleBundleUrl = pathToFileURL('/' + node_path.relative(outputDir, moduleBundleFilepath)).href;
163
+ const moduleSourceMapName = `${moduleBundleName}.map`;
164
+ const moduleSourceMapFilepath = node_path.resolve(moduleOutputDir, moduleSourceMapName);
165
+ const moduleSourceMapUrl = node_path.relative(outputDir, moduleSourceMapFilepath);
166
+ if (!isContainerModule) modulePathRemapper.addMapping(moduleInputFilepath, node_path.relative(outputDir, moduleBundleFilepath));
167
+ return {
168
+ targetDir: node_path.dirname(moduleBundleFilepath),
169
+ requestOpts: getRequestOpts(args, {
170
+ isContainerModule,
171
+ entryFile: moduleInputFilepath,
172
+ sourceUrl: moduleBundleUrl,
173
+ sourceMapUrl: moduleSourceMapUrl
174
+ }),
175
+ saveBundleOpts: getSaveBundleOpts(args, {
176
+ bundleOutput: moduleBundleFilepath,
177
+ sourcemapOutput: moduleSourceMapFilepath
178
+ })
179
+ };
180
+ });
181
+ try {
182
+ logger.info(`${node_util.styleText('blue', 'Processing remote container and exposed modules')}`);
183
+ for (const { requestOpts, saveBundleOpts, targetDir } of requests){
184
+ await promises.mkdir(targetDir, {
185
+ recursive: true,
186
+ mode: 493
187
+ });
188
+ const bundle = await buildBundle(server, requestOpts);
189
+ await saveBundleAndMap(bundle, saveBundleOpts, logger.info);
190
+ }
191
+ logger.info(`${node_util.styleText('blue', 'Processing manifest')}`);
192
+ const manifestOutputFilepath = node_path.resolve(outputDir, 'mf-manifest.json');
193
+ await promises.copyFile(manifestFilepath, manifestOutputFilepath);
194
+ logger.info(`Done writing MF Manifest to:\n${node_util.styleText('dim', manifestOutputFilepath)}`);
195
+ } finally{
196
+ await server.end();
197
+ }
198
+ }
199
+ const bundle_remote = bundleFederatedRemote;
200
+ export { options as bundleFederatedRemoteOptions, bundle_remote as default };
@@ -0,0 +1,32 @@
1
+ declare const options: ({
2
+ name: string;
3
+ description: string;
4
+ default: string;
5
+ parse?: undefined;
6
+ } | {
7
+ name: string;
8
+ description: string;
9
+ parse: (val: string) => boolean;
10
+ default: boolean;
11
+ } | {
12
+ name: string;
13
+ description: string;
14
+ parse: (val: string) => boolean;
15
+ default?: undefined;
16
+ } | {
17
+ name: string;
18
+ description: string;
19
+ default?: undefined;
20
+ parse?: undefined;
21
+ } | {
22
+ name: string;
23
+ description: string;
24
+ default: boolean;
25
+ parse?: undefined;
26
+ } | {
27
+ name: string;
28
+ description: string;
29
+ parse: (val: string) => string;
30
+ default?: undefined;
31
+ })[];
32
+ export default options;
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
12
+ (()=>{
13
+ __webpack_require__.d = (exports1, definition)=>{
14
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
15
+ enumerable: true,
16
+ get: definition[key]
17
+ });
18
+ };
19
+ })();
20
+ (()=>{
21
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
22
+ })();
23
+ (()=>{
24
+ __webpack_require__.r = (exports1)=>{
25
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
26
+ value: 'Module'
27
+ });
28
+ Object.defineProperty(exports1, '__esModule', {
29
+ value: true
30
+ });
31
+ };
32
+ })();
33
+ var __webpack_exports__ = {};
34
+ __webpack_require__.r(__webpack_exports__);
35
+ __webpack_require__.d(__webpack_exports__, {
36
+ default: ()=>options
37
+ });
38
+ const external_node_path_namespaceObject = require("node:path");
39
+ var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
40
+ const options_options = [
41
+ {
42
+ name: '--platform <string>',
43
+ description: 'Either "ios" or "android"',
44
+ default: 'ios'
45
+ },
46
+ {
47
+ name: '--dev [boolean]',
48
+ description: 'If false, warnings are disabled and the bundle is minified',
49
+ parse: (val)=>'false' !== val,
50
+ default: true
51
+ },
52
+ {
53
+ name: '--minify [boolean]',
54
+ description: "Allows overriding whether bundle is minified. This defaults to false if dev is true, and true if dev is false. Disabling minification can be useful for speeding up production builds for testing purposes.",
55
+ parse: (val)=>'false' !== val
56
+ },
57
+ {
58
+ name: '--bundle-encoding <string>',
59
+ description: 'Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer).',
60
+ default: 'utf8'
61
+ },
62
+ {
63
+ name: '--max-workers <number>',
64
+ description: "Specifies the maximum number of workers the worker-pool will spawn for transforming files. This defaults to the number of the cores available on your machine."
65
+ },
66
+ {
67
+ name: '--sourcemap-output <string>',
68
+ description: 'File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map'
69
+ },
70
+ {
71
+ name: '--sourcemap-sources-root <string>',
72
+ description: "Path to make sourcemap's sources entries relative to, ex. /root/dir"
73
+ },
74
+ {
75
+ name: '--sourcemap-use-absolute-path',
76
+ description: 'Report SourceMapURL using its full path',
77
+ default: false
78
+ },
79
+ {
80
+ name: '--assets-dest <string>',
81
+ description: 'Directory name where to store assets referenced in the bundle'
82
+ },
83
+ {
84
+ name: '--asset-catalog-dest [string]',
85
+ description: 'Path where to create an iOS Asset Catalog for images'
86
+ },
87
+ {
88
+ name: '--reset-cache',
89
+ description: 'Removes cached files',
90
+ default: false
91
+ },
92
+ {
93
+ name: '--config <string>',
94
+ description: 'Path to the CLI configuration file',
95
+ parse: (val)=>external_node_path_default().resolve(val)
96
+ },
97
+ {
98
+ name: '--output <string>',
99
+ description: 'Output directory for the bundle'
100
+ }
101
+ ];
102
+ const options = options_options;
103
+ exports["default"] = __webpack_exports__["default"];
104
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
105
+ "default"
106
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
107
+ Object.defineProperty(exports, '__esModule', {
108
+ value: true
109
+ });
@@ -0,0 +1,67 @@
1
+ import 'module';
2
+ /*#__PURE__*/ import.meta.url;
3
+ import node_path from "node:path";
4
+ const options_options = [
5
+ {
6
+ name: '--platform <string>',
7
+ description: 'Either "ios" or "android"',
8
+ default: 'ios'
9
+ },
10
+ {
11
+ name: '--dev [boolean]',
12
+ description: 'If false, warnings are disabled and the bundle is minified',
13
+ parse: (val)=>'false' !== val,
14
+ default: true
15
+ },
16
+ {
17
+ name: '--minify [boolean]',
18
+ description: "Allows overriding whether bundle is minified. This defaults to false if dev is true, and true if dev is false. Disabling minification can be useful for speeding up production builds for testing purposes.",
19
+ parse: (val)=>'false' !== val
20
+ },
21
+ {
22
+ name: '--bundle-encoding <string>',
23
+ description: 'Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer).',
24
+ default: 'utf8'
25
+ },
26
+ {
27
+ name: '--max-workers <number>',
28
+ description: "Specifies the maximum number of workers the worker-pool will spawn for transforming files. This defaults to the number of the cores available on your machine."
29
+ },
30
+ {
31
+ name: '--sourcemap-output <string>',
32
+ description: 'File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map'
33
+ },
34
+ {
35
+ name: '--sourcemap-sources-root <string>',
36
+ description: "Path to make sourcemap's sources entries relative to, ex. /root/dir"
37
+ },
38
+ {
39
+ name: '--sourcemap-use-absolute-path',
40
+ description: 'Report SourceMapURL using its full path',
41
+ default: false
42
+ },
43
+ {
44
+ name: '--assets-dest <string>',
45
+ description: 'Directory name where to store assets referenced in the bundle'
46
+ },
47
+ {
48
+ name: '--asset-catalog-dest [string]',
49
+ description: 'Path where to create an iOS Asset Catalog for images'
50
+ },
51
+ {
52
+ name: '--reset-cache',
53
+ description: 'Removes cached files',
54
+ default: false
55
+ },
56
+ {
57
+ name: '--config <string>',
58
+ description: 'Path to the CLI configuration file',
59
+ parse: (val)=>node_path.resolve(val)
60
+ },
61
+ {
62
+ name: '--output <string>',
63
+ description: 'Output directory for the bundle'
64
+ }
65
+ ];
66
+ const options = options_options;
67
+ export { options as default };