Skip to content

Commit a3cdca1

Browse files
authored
feat(mf): support manifest (#11846)
* feat(mf): support manifest * chore: fix lint * chore: add spaceholder * fix: rust lint * chore: update ut * chore: format code * chore: disable manifest in multiple mf plugins * chore: make manifest as false by default
1 parent 2c12f2a commit a3cdca1

File tree

35 files changed

+2008
-8
lines changed

35 files changed

+2008
-8
lines changed

crates/node_binding/napi-binding.d.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ export declare enum BuiltinPluginName {
545545
ProvideSharedPlugin = 'ProvideSharedPlugin',
546546
ConsumeSharedPlugin = 'ConsumeSharedPlugin',
547547
ModuleFederationRuntimePlugin = 'ModuleFederationRuntimePlugin',
548+
ModuleFederationManifestPlugin = 'ModuleFederationManifestPlugin',
548549
NamedModuleIdsPlugin = 'NamedModuleIdsPlugin',
549550
NaturalModuleIdsPlugin = 'NaturalModuleIdsPlugin',
550551
DeterministicModuleIdsPlugin = 'DeterministicModuleIdsPlugin',
@@ -2434,6 +2435,32 @@ export interface RawLimitChunkCountPluginOptions {
24342435
maxChunks: number
24352436
}
24362437

2438+
export interface RawManifestExposeOption {
2439+
path: string
2440+
name: string
2441+
}
2442+
2443+
export interface RawManifestSharedOption {
2444+
name: string
2445+
version?: string
2446+
requiredVersion?: string
2447+
singleton?: boolean
2448+
}
2449+
2450+
export interface RawModuleFederationManifestPluginOptions {
2451+
name?: string
2452+
globalName?: string
2453+
fileName?: string
2454+
filePath?: string
2455+
statsFileName?: string
2456+
manifestFileName?: string
2457+
disableAssetsAnalyze?: boolean
2458+
remoteAliasMap?: Record<string, RawRemoteAliasTarget>
2459+
exposes?: Array<RawManifestExposeOption>
2460+
shared?: Array<RawManifestSharedOption>
2461+
buildInfo?: RawStatsBuildInfo
2462+
}
2463+
24372464
export interface RawModuleFederationRuntimePluginOptions {
24382465
entryRuntime?: string | undefined
24392466
}
@@ -2656,6 +2683,11 @@ export interface RawRelated {
26562683
sourceMap?: string
26572684
}
26582685

2686+
export interface RawRemoteAliasTarget {
2687+
name: string
2688+
entry?: string
2689+
}
2690+
26592691
export interface RawRemoteOptions {
26602692
key: string
26612693
external: Array<string>
@@ -2815,6 +2847,11 @@ export interface RawSplitChunksOptions {
28152847
maxInitialSize?: number | RawSplitChunkSizes
28162848
}
28172849

2850+
export interface RawStatsBuildInfo {
2851+
buildVersion: string
2852+
buildName?: string
2853+
}
2854+
28182855
export interface RawStatsOptions {
28192856
colors: boolean
28202857
}

crates/rspack_binding_api/src/raw_options/raw_builtins/mod.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use napi_derive::napi;
3232
use raw_dll::{RawDllReferenceAgencyPluginOptions, RawFlagAllModulesAsUsedPluginOptions};
3333
use raw_ids::RawOccurrenceChunkIdsPluginOptions;
3434
use raw_lightning_css_minimizer::RawLightningCssMinimizerRspackPluginOptions;
35-
use raw_mf::RawModuleFederationRuntimePluginOptions;
35+
use raw_mf::{RawModuleFederationManifestPluginOptions, RawModuleFederationRuntimePluginOptions};
3636
use raw_sri::RawSubresourceIntegrityPluginOptions;
3737
use rspack_core::{BoxPlugin, Plugin, PluginExt};
3838
use rspack_error::{Result, ToStringResultToRspackResultExt};
@@ -75,8 +75,8 @@ use rspack_plugin_lightning_css_minimizer::LightningCssMinimizerRspackPlugin;
7575
use rspack_plugin_limit_chunk_count::LimitChunkCountPlugin;
7676
use rspack_plugin_merge_duplicate_chunks::MergeDuplicateChunksPlugin;
7777
use rspack_plugin_mf::{
78-
ConsumeSharedPlugin, ContainerPlugin, ContainerReferencePlugin, ModuleFederationRuntimePlugin,
79-
ProvideSharedPlugin, ShareRuntimePlugin,
78+
ConsumeSharedPlugin, ContainerPlugin, ContainerReferencePlugin, ModuleFederationManifestPlugin,
79+
ModuleFederationRuntimePlugin, ProvideSharedPlugin, ShareRuntimePlugin,
8080
};
8181
use rspack_plugin_module_info_header::ModuleInfoHeaderPlugin;
8282
use rspack_plugin_module_replacement::{ContextReplacementPlugin, NormalModuleReplacementPlugin};
@@ -172,6 +172,7 @@ pub enum BuiltinPluginName {
172172
ProvideSharedPlugin,
173173
ConsumeSharedPlugin,
174174
ModuleFederationRuntimePlugin,
175+
ModuleFederationManifestPlugin,
175176
NamedModuleIdsPlugin,
176177
NaturalModuleIdsPlugin,
177178
DeterministicModuleIdsPlugin,
@@ -504,6 +505,11 @@ impl<'a> BuiltinPlugin<'a> {
504505
.map_err(|report| napi::Error::from_reason(report.to_string()))?;
505506
plugins.push(ModuleFederationRuntimePlugin::new(options.into()).boxed())
506507
}
508+
BuiltinPluginName::ModuleFederationManifestPlugin => {
509+
let options = downcast_into::<RawModuleFederationManifestPluginOptions>(self.options)
510+
.map_err(|report| napi::Error::from_reason(report.to_string()))?;
511+
plugins.push(ModuleFederationManifestPlugin::new(options.into()).boxed())
512+
}
507513
BuiltinPluginName::NamedModuleIdsPlugin => {
508514
plugins.push(NamedModuleIdsPlugin::default().boxed())
509515
}

crates/rspack_binding_api/src/raw_options/raw_builtins/raw_mf.rs

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use std::sync::Arc;
1+
use std::{collections::HashMap, sync::Arc};
22

33
use napi::Either;
44
use napi_derive::napi;
55
use rspack_plugin_mf::{
66
ConsumeOptions, ConsumeSharedPluginOptions, ConsumeVersion, ContainerPluginOptions,
7-
ContainerReferencePluginOptions, ExposeOptions, ModuleFederationRuntimePluginOptions,
8-
ProvideOptions, ProvideVersion, RemoteOptions,
7+
ContainerReferencePluginOptions, ExposeOptions, ManifestExposeOption, ManifestSharedOption,
8+
ModuleFederationManifestPluginOptions, ModuleFederationRuntimePluginOptions, ProvideOptions,
9+
ProvideVersion, RemoteAliasTarget, RemoteOptions, StatsBuildInfo,
910
};
1011

1112
use crate::options::{
@@ -224,3 +225,99 @@ impl From<RawModuleFederationRuntimePluginOptions> for ModuleFederationRuntimePl
224225
}
225226
}
226227
}
228+
229+
#[derive(Debug)]
230+
#[napi(object)]
231+
pub struct RawRemoteAliasTarget {
232+
pub name: String,
233+
pub entry: Option<String>,
234+
}
235+
236+
#[derive(Debug)]
237+
#[napi(object)]
238+
pub struct RawManifestExposeOption {
239+
pub path: String,
240+
pub name: String,
241+
}
242+
243+
#[derive(Debug)]
244+
#[napi(object)]
245+
pub struct RawManifestSharedOption {
246+
pub name: String,
247+
pub version: Option<String>,
248+
pub required_version: Option<String>,
249+
pub singleton: Option<bool>,
250+
}
251+
252+
#[derive(Debug)]
253+
#[napi(object)]
254+
pub struct RawStatsBuildInfo {
255+
pub build_version: String,
256+
pub build_name: Option<String>,
257+
}
258+
259+
#[derive(Debug)]
260+
#[napi(object)]
261+
pub struct RawModuleFederationManifestPluginOptions {
262+
pub name: Option<String>,
263+
pub global_name: Option<String>,
264+
pub file_name: Option<String>,
265+
pub file_path: Option<String>,
266+
pub stats_file_name: Option<String>,
267+
pub manifest_file_name: Option<String>,
268+
pub disable_assets_analyze: Option<bool>,
269+
pub remote_alias_map: Option<HashMap<String, RawRemoteAliasTarget>>,
270+
pub exposes: Option<Vec<RawManifestExposeOption>>,
271+
pub shared: Option<Vec<RawManifestSharedOption>>,
272+
pub build_info: Option<RawStatsBuildInfo>,
273+
}
274+
275+
impl From<RawModuleFederationManifestPluginOptions> for ModuleFederationManifestPluginOptions {
276+
fn from(value: RawModuleFederationManifestPluginOptions) -> Self {
277+
ModuleFederationManifestPluginOptions {
278+
name: value.name,
279+
global_name: value.global_name,
280+
stats_file_name: value.stats_file_name.unwrap_or_default(),
281+
manifest_file_name: value.manifest_file_name.unwrap_or_default(),
282+
disable_assets_analyze: value.disable_assets_analyze.unwrap_or(false),
283+
remote_alias_map: value
284+
.remote_alias_map
285+
.unwrap_or_default()
286+
.into_iter()
287+
.map(|(k, v)| {
288+
(
289+
k,
290+
RemoteAliasTarget {
291+
name: v.name,
292+
entry: v.entry,
293+
},
294+
)
295+
})
296+
.collect::<HashMap<String, RemoteAliasTarget>>(),
297+
exposes: value
298+
.exposes
299+
.unwrap_or_default()
300+
.into_iter()
301+
.map(|expose| ManifestExposeOption {
302+
path: expose.path,
303+
name: expose.name,
304+
})
305+
.collect(),
306+
shared: value
307+
.shared
308+
.unwrap_or_default()
309+
.into_iter()
310+
.map(|shared| ManifestSharedOption {
311+
name: shared.name,
312+
version: shared.version,
313+
required_version: shared.required_version,
314+
singleton: shared.singleton,
315+
})
316+
.collect(),
317+
build_info: value.build_info.map(|info| StatsBuildInfo {
318+
build_version: info.build_version,
319+
build_name: info.build_name,
320+
}),
321+
}
322+
}
323+
}

crates/rspack_plugin_mf/src/container/container_entry_module.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ impl ContainerEntryModule {
7373
enhanced,
7474
}
7575
}
76+
77+
pub fn exposes(&self) -> &[(String, ExposeOptions)] {
78+
&self.exposes
79+
}
7680
}
7781

7882
impl Identifiable for ContainerEntryModule {

crates/rspack_plugin_mf/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod container;
2+
mod manifest;
23
mod sharing;
34

45
pub use container::{
@@ -10,6 +11,10 @@ pub use container::{
1011
ModuleFederationRuntimePlugin, ModuleFederationRuntimePluginOptions,
1112
},
1213
};
14+
pub use manifest::{
15+
ManifestExposeOption, ManifestSharedOption, ModuleFederationManifestPlugin,
16+
ModuleFederationManifestPluginOptions, RemoteAliasTarget, StatsBuildInfo,
17+
};
1318
pub use sharing::{
1419
consume_shared_module::ConsumeSharedModule,
1520
consume_shared_plugin::{

0 commit comments

Comments
 (0)