Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
c4d3c04
feat(mf): support layered container exposes
ScriptedAlchemy Jul 22, 2026
b3a3fed
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Jul 27, 2026
c0f445d
Merge commit '2a348f967f' into codex/work-pr14912
ScriptedAlchemy Jul 27, 2026
f16f215
Merge commit 'e0a975ff10' into codex/work-pr14912
ScriptedAlchemy Jul 27, 2026
7ee5128
Merge commit '223f6e860f' into codex/work-pr14912
ScriptedAlchemy Jul 27, 2026
6c1af2c
Merge commit '3e4af0cb5f' into codex/work-pr14912
ScriptedAlchemy Jul 27, 2026
1c3eb05
perf(mf): use unstable sorts for deterministic strings
ScriptedAlchemy Jul 27, 2026
bce2884
perf(mf): patch shared exports without typed stats
ScriptedAlchemy Jul 27, 2026
53b1f7e
perf(mf): compact optional exposed layers
ScriptedAlchemy Jul 27, 2026
b21cf1d
Merge commit '9392c3bb75' into codex/work-pr14912
ScriptedAlchemy Jul 28, 2026
b1722dc
Merge commit 'ffd6b71541' into codex/work-pr14912
ScriptedAlchemy Jul 28, 2026
4f1eef5
Merge commit '72c9492ee4' into codex/work-pr14912
ScriptedAlchemy Jul 28, 2026
27771aa
Merge commit 'cbaca67ee4' into codex/work-pr14912
ScriptedAlchemy Jul 28, 2026
9c461fa
Merge commit 'fefd61d32e' into codex/work-pr14912
ScriptedAlchemy Jul 28, 2026
84a127a
Merge commit '2119bde04f' into codex/work-pr14912
ScriptedAlchemy Jul 29, 2026
2476c02
Merge commit '2c0d2b7210' into codex/work-pr14912
ScriptedAlchemy Jul 29, 2026
1a74f7d
fix(mf): preserve layered option compatibility
ScriptedAlchemy Jul 29, 2026
c20131b
Merge commit '982bd52e2c' into codex/work-pr14912
ScriptedAlchemy Jul 29, 2026
aa1d9ec
Merge commit '46a22cb771' into codex/work-pr14912
ScriptedAlchemy Jul 29, 2026
f592033
Merge commit 'd540607a38' into codex/work-pr14912
ScriptedAlchemy Jul 29, 2026
668cfee
fix(mf): preserve expose option compatibility
ScriptedAlchemy Jul 29, 2026
1326aca
fix(mf): preserve v1 option extensibility
ScriptedAlchemy Jul 29, 2026
bfa3a15
Merge commit '4aad05beae' into codex/work-pr14912
ScriptedAlchemy Jul 29, 2026
ef0f210
Merge commit '1656d1bec8' into codex/work-pr14912
ScriptedAlchemy Jul 29, 2026
3dee67e
fix(mf): preserve container option extensibility
ScriptedAlchemy Jul 29, 2026
a45c54d
fix(mf): retain exposed dependency constructor
ScriptedAlchemy Jul 29, 2026
11e4a2f
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Jul 29, 2026
aecfa8e
fix(mf): export enhanced container options
ScriptedAlchemy Jul 29, 2026
04c9206
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Jul 29, 2026
cabc390
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Sep 7, 2026
c7a248b
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Sep 8, 2026
bfe4fa5
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Sep 8, 2026
ace9d2e
test(mf): check the legacy expose constructor signature without const…
ScriptedAlchemy Sep 8, 2026
e07cb23
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Sep 8, 2026
22d1a17
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Sep 8, 2026
789d856
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Sep 8, 2026
b108343
fix(mf): carry expose layers inside the container identifier payload
ScriptedAlchemy Sep 8, 2026
7a95005
Merge remote-tracking branch 'origin/codex/mf-share-scope-runtime' in…
ScriptedAlchemy Sep 8, 2026
533028a
docs(mf): explain and exercise expose layers
ScriptedAlchemy Sep 8, 2026
089b02c
Merge refreshed shared runtime into layered exposes
ScriptedAlchemy Sep 8, 2026
e8b02d0
Merge branch 'codex/work-pr14911' into codex/work-pr14912
ScriptedAlchemy Sep 8, 2026
73c90ee
test(mf): cover layered exposes through config cases
ScriptedAlchemy Sep 8, 2026
5cee2d5
Merge branch 'codex/work-pr14911' into codex/work-pr14912
ScriptedAlchemy Sep 8, 2026
4b9a1e2
fix(mf): retain container hooks after test cleanup
ScriptedAlchemy Sep 8, 2026
d1d45c6
Merge branch 'codex/work-pr14911' into codex/work-pr14912
ScriptedAlchemy Sep 8, 2026
b3ca943
Merge branch 'codex/work-pr14911' into codex/work-pr14912
ScriptedAlchemy Sep 8, 2026
60e794b
refactor(mf): remove redundant expose layer truncation
ScriptedAlchemy Sep 9, 2026
0454b2f
chore: sync layered exposes with runtime base
ScriptedAlchemy Sep 9, 2026
f979f70
chore: sync layered exposes with runtime base
ScriptedAlchemy Sep 9, 2026
dc5faf4
chore: sync layered exposes with runtime base
ScriptedAlchemy Sep 9, 2026
960481d
chore: sync layered exposes with runtime review fixes
ScriptedAlchemy Sep 9, 2026
e30e940
fix(mf): export enhanced V1 federation options
ScriptedAlchemy Sep 8, 2026
4724c6b
Merge branch 'codex/mf-share-scope-runtime' into codex/mf-layered-con…
ScriptedAlchemy Sep 9, 2026
a00b374
Merge branch 'codex/mf-share-scope-runtime' into codex/mf-layered-con…
ScriptedAlchemy Sep 9, 2026
fca6e72
Merge branch 'codex/mf-share-scope-runtime' into codex/mf-layered-con…
ScriptedAlchemy Sep 10, 2026
1ae37ab
Merge branch 'codex/mf-share-scope-runtime' into codex/mf-layered-con…
ScriptedAlchemy Sep 10, 2026
e3dab88
Merge branch 'codex/mf-share-scope-runtime' into codex/mf-layered-con…
ScriptedAlchemy Sep 11, 2026
b55df4a
Merge branch 'stack-refresh/14911' into stack-refresh/14912
ScriptedAlchemy Sep 14, 2026
4605029
Merge branch 'stack-refresh2/14911' into stack-refresh2/14912
ScriptedAlchemy Sep 15, 2026
2e2ec31
Merge branch 'stack-refresh2/14911' into stack-refresh2/14912
ScriptedAlchemy Sep 15, 2026
12bd007
refactor(mf): carry the expose layer on ExposeOptions
ScriptedAlchemy Sep 16, 2026
5acd724
Merge branch 'stack-refresh2/14911' into stack-refresh2/14912
ScriptedAlchemy Sep 16, 2026
e4eb5ba
chore(mf): reject empty expose layer names and clean the layered fixt…
ScriptedAlchemy Sep 16, 2026
fc9224a
Merge branch 'stack-refresh2/14911' into stack-refresh2/14912
ScriptedAlchemy Sep 16, 2026
a47cc84
Merge branch 'stack-refresh2/14911' into stack-refresh2/14912
ScriptedAlchemy Sep 22, 2026
ef7c751
Merge branch 'stack-refresh2/14911' into stack-refresh2/14912
ScriptedAlchemy Sep 22, 2026
6fb8b6b
Merge ordered share scope runtime into layered container exposes
ScriptedAlchemy Sep 29, 2026
b0bf215
Merge corrected workspace lockfile into layered container exposes
ScriptedAlchemy Sep 29, 2026
3c0aed3
fix(mf): preserve unnamed consumers after base refresh
ScriptedAlchemy Sep 29, 2026
c9cb2be
fix(mf): enforce reusable expose map types and relocate Rust coverage
ScriptedAlchemy Sep 30, 2026
f65fa5e
Merge reviewed MF runtime fixes and format test dependency
ScriptedAlchemy Sep 30, 2026
046f3b2
fix(mf): preserve Rust container options source compatibility
ScriptedAlchemy Sep 30, 2026
baf20fb
Merge Rust sharing API compatibility into layered containers
ScriptedAlchemy Sep 30, 2026
1dbc84d
test(mf): retain enhanced expose serialization coverage
ScriptedAlchemy Sep 30, 2026
acf8939
Merge branch 'api-compat-runtime' into HEAD
ScriptedAlchemy Sep 30, 2026
d0d70ae
Merge branch 'api-compat-runtime' into HEAD
ScriptedAlchemy Sep 30, 2026
27c7890
Merge branch 'api-compat-runtime' into HEAD
ScriptedAlchemy Sep 30, 2026
1162106
chore: update layered exposes stack base
ScriptedAlchemy Oct 22, 2026
27998da
chore: propagate federation lockfile fix
ScriptedAlchemy Oct 22, 2026
728b7a9
chore: propagate combined preview build
ScriptedAlchemy Oct 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/node_binding/napi-binding.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2365,6 +2365,7 @@ export interface RawExperiments {
export interface RawExposeOptions {
key: string
name?: string
layer?: string
import: Array<string>
}

Expand Down
12 changes: 4 additions & 8 deletions crates/rspack_binding_api/src/raw_options/raw_builtins/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -524,14 +524,10 @@ impl<'a> BuiltinPlugin<'a> {
plugins.push(SharedUsedExportsOptimizerPlugin::new_enhanced(options).boxed());
}
BuiltinPluginName::ContainerPlugin => {
plugins.push(
ContainerPlugin::new(
downcast_into::<RawContainerPluginOptions>(self.options)
.map_err(|report| napi::Error::from_reason(report.to_string()))?
.into(),
)
.boxed(),
);
let options = downcast_into::<RawContainerPluginOptions>(self.options)
.map_err(|report| napi::Error::from_reason(report.to_string()))?
.into_options();
plugins.push(ContainerPlugin::new_enhanced(options).boxed());
}
BuiltinPluginName::ContainerReferencePlugin => {
plugins.push(
Expand Down
34 changes: 18 additions & 16 deletions crates/rspack_binding_api/src/raw_options/raw_builtins/raw_mf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ use std::sync::Arc;
use napi::Either;
use napi_derive::napi;
use rspack_plugin_mf::{
ConsumeVersion, ContainerPluginOptions, ContainerReferencePluginOptions,
EnhancedCollectSharedEntryPluginOptions, EnhancedConsumeOptions,
EnhancedConsumeSharedPluginOptions, EnhancedOptimizeSharedConfig, EnhancedProvideOptions,
ConsumeVersion, ContainerReferencePluginOptions, EnhancedCollectSharedEntryPluginOptions,
EnhancedConsumeOptions, EnhancedConsumeSharedPluginOptions, EnhancedContainerPluginOptions,
EnhancedExposeOptions, EnhancedOptimizeSharedConfig, EnhancedProvideOptions,
EnhancedSharedContainerPluginOptions, EnhancedSharedUsedExportsOptimizerPluginOptions,
ExposeOptions, ManifestExposeOption, ManifestSharedOption, ModuleFederationManifestPluginOptions,
ManifestExposeOption, ManifestSharedOption, ModuleFederationManifestPluginOptions,
ModuleFederationRuntimeExperimentsOptions, ModuleFederationRuntimePluginOptions, ProvideVersion,
RemoteAliasTarget, RemoteOptions, ShareScope, StatsBuildInfo,
};
Expand Down Expand Up @@ -38,17 +38,17 @@ pub struct RawContainerPluginOptions {
pub enhanced: bool,
}

impl From<RawContainerPluginOptions> for ContainerPluginOptions {
fn from(value: RawContainerPluginOptions) -> Self {
let share_scope = into_share_scope(value.share_scope);
Self {
name: value.name,
impl RawContainerPluginOptions {
pub fn into_options(self) -> EnhancedContainerPluginOptions {
let share_scope = into_share_scope(self.share_scope);
EnhancedContainerPluginOptions {
name: self.name,
share_scope,
library: value.library.into(),
runtime: value.runtime.map(|r| JsEntryRuntimeWrapper(r).into()),
filename: value.filename.map(|f| f.into()),
exposes: value.exposes.into_iter().map(|e| e.into()).collect(),
enhanced: value.enhanced,
library: self.library.into(),
runtime: self.runtime.map(|r| JsEntryRuntimeWrapper(r).into()),
filename: self.filename.map(|f| f.into()),
exposes: self.exposes.into_iter().map(|e| e.into()).collect(),
enhanced: self.enhanced,
}
}
}
Expand All @@ -58,16 +58,18 @@ impl From<RawContainerPluginOptions> for ContainerPluginOptions {
pub struct RawExposeOptions {
pub key: String,
pub name: Option<String>,
pub layer: Option<String>,
pub import: Vec<String>,
}

impl From<RawExposeOptions> for (String, ExposeOptions) {
impl From<RawExposeOptions> for (String, EnhancedExposeOptions) {
fn from(value: RawExposeOptions) -> Self {
(
value.key,
ExposeOptions {
EnhancedExposeOptions {
name: value.name,
import: value.import,
layer: value.layer,
},
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ use rspack_core::{
DependencyType, ModuleDependency, ResourceIdentifier,
};

use crate::{ExposeOptions, ShareScope, SharedIdentity};
use crate::{EnhancedExposeOptions, ShareScope, SharedIdentity};

#[cacheable]
#[derive(Debug)]
pub struct ContainerEntryDependency {
id: DependencyId,
pub name: String,
pub exposes: Vec<(String, ExposeOptions)>,
pub exposes: Vec<(String, EnhancedExposeOptions)>,
pub share_scope: ShareScope,
pub request: Option<String>,
pub version: Option<String>,
Expand All @@ -25,7 +25,7 @@ pub struct ContainerEntryDependency {
impl ContainerEntryDependency {
pub fn new(
name: String,
exposes: Vec<(String, ExposeOptions)>,
exposes: Vec<(String, EnhancedExposeOptions)>,
share_scope: ShareScope,
enhanced: bool,
) -> Self {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use rspack_hash::{RspackHashDigest, RspackHasher};
use rspack_util::{json_stringify_str, source_map::SourceMapKind};

use super::{
container_exposed_dependency::ContainerExposedDependency, container_plugin::ExposeOptions,
container_exposed_dependency::ContainerExposedDependency, container_plugin::EnhancedExposeOptions,
};
use crate::{
ShareScope, SharedIdentity, push_identifier_component,
Expand All @@ -34,7 +34,7 @@ pub struct ContainerEntryModule {
dependencies_block: DependenciesBlockData,
identifier: ModuleIdentifier,
lib_ident: String,
exposes: Vec<(String, ExposeOptions)>,
exposes: Vec<(String, EnhancedExposeOptions)>,
share_scope: ShareScope,
factory_meta: FactoryMetaStore,
build_info: FreezeLock<BuildInfo>,
Expand All @@ -51,7 +51,7 @@ pub struct ContainerEntryModule {
impl ContainerEntryModule {
pub fn new(
name: String,
exposes: Vec<(String, ExposeOptions)>,
exposes: Vec<(String, EnhancedExposeOptions)>,
share_scope: ShareScope,
enhanced: bool,
runtime_mode: RuntimeMode,
Expand All @@ -63,6 +63,9 @@ impl ContainerEntryModule {
identifier: ModuleIdentifier::from(format!(
"container entry {} {}",
share_scope.identifier_fragment(),
// Same `[[key, options]]` payload as webpack's ContainerEntryModule,
// which external manifest readers parse; `EnhancedExposeOptions::layer` is
// serialized only when present.
json_stringify(&exposes),
)),
lib_ident,
Expand Down Expand Up @@ -134,7 +137,7 @@ impl ContainerEntryModule {
}
}

pub fn exposes(&self) -> &[(String, ExposeOptions)] {
pub fn exposes(&self) -> &[(String, EnhancedExposeOptions)] {
&self.exposes
}

Expand Down Expand Up @@ -235,9 +238,10 @@ impl Module for ContainerEntryModule {
.import
.iter()
.map(|request| {
BoxDependency::new(ContainerExposedDependency::new(
BoxDependency::new(ContainerExposedDependency::new_with_layer(
name.clone(),
request.clone(),
options.layer.clone(),
))
})
.collect(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,48 @@
use rspack_cacheable::{cacheable, cacheable_dyn};
use rspack_core::{
AsContextDependency, AsDependencyCodeGeneration, Dependency, DependencyCategory, DependencyId,
DependencyType, ModuleDependency, ResourceIdentifier,
DependencyType, ModuleDependency, ModuleLayer, ResourceIdentifier,
};

use crate::push_identifier_component;

fn exposed_resource_identifier(exposed_name: &str, request: &str, layer: Option<&str>) -> String {
let mut resource_identifier = String::from("exposed dependency ");
push_identifier_component(&mut resource_identifier, exposed_name);
push_identifier_component(&mut resource_identifier, request);
if let Some(layer) = layer {
resource_identifier.push('1');
push_identifier_component(&mut resource_identifier, layer);
} else {
resource_identifier.push('0');
}
resource_identifier
}

#[cacheable]
#[derive(Debug)]
pub struct ContainerExposedDependency {
id: DependencyId,
request: String,
pub exposed_name: String,
layer: Option<Box<ModuleLayer>>,
resource_identifier: ResourceIdentifier,
dependency_type: DependencyType,
}

impl ContainerExposedDependency {
pub fn new(exposed_name: String, request: String) -> Self {
let resource_identifier = format!("exposed dependency {exposed_name}={request}").into();
Self::new_with_layer(exposed_name, request, None)
}

pub fn new_with_layer(exposed_name: String, request: String, layer: Option<ModuleLayer>) -> Self {
let resource_identifier =
exposed_resource_identifier(&exposed_name, &request, layer.as_deref()).into();
Self {
id: DependencyId::new(),
request,
exposed_name,
layer: layer.map(Box::new),
resource_identifier,
dependency_type: DependencyType::ContainerExposed,
}
Expand All @@ -32,6 +54,7 @@ impl ContainerExposedDependency {
id: DependencyId::new(),
request,
exposed_name: String::new(),
layer: None,
resource_identifier,
dependency_type: DependencyType::ShareContainerFallback,
}
Expand All @@ -52,6 +75,10 @@ impl Dependency for ContainerExposedDependency {
&self.dependency_type
}

fn get_layer(&self) -> Option<&ModuleLayer> {
self.layer.as_deref()
}

fn resource_identifier(&self) -> Option<&str> {
Some(&self.resource_identifier)
}
Expand Down
64 changes: 60 additions & 4 deletions crates/rspack_plugin_mf/src/container/container_plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ use std::sync::Arc;
use rspack_core::{
ChunkUkey, Compilation, CompilationAdditionalTreeRuntimeRequirements, CompilationParams,
CompilationRuntimeRequirementInTree, CompilerCompilation, CompilerMake, DependencyRef,
DependencyType, EntryOptions, EntryRuntime, Filename, LibraryOptions, Plugin, RuntimeGlobals,
RuntimeModule, SourceType,
DependencyType, EntryOptions, EntryRuntime, Filename, LibraryOptions, ModuleLayer, Plugin,
RuntimeGlobals, RuntimeModule, SourceType,
};
use rspack_error::Result;
use rspack_hook::{plugin, plugin_hook};
Expand All @@ -17,6 +17,13 @@ use super::{
};
use crate::ShareScope;

#[rspack_cacheable::cacheable]
#[derive(Debug, Clone, Serialize)]
pub struct ExposeOptions {
pub name: Option<String>,
pub import: Vec<String>,
}

#[derive(Debug)]
pub struct ContainerPluginOptions {
pub name: String,
Expand All @@ -28,21 +35,70 @@ pub struct ContainerPluginOptions {
pub enhanced: bool,
}

impl From<ExposeOptions> for EnhancedExposeOptions {
fn from(value: ExposeOptions) -> Self {
Self {
name: value.name,
import: value.import,
layer: None,
}
}
}

impl From<ContainerPluginOptions> for EnhancedContainerPluginOptions {
fn from(value: ContainerPluginOptions) -> Self {
Self {
name: value.name,
share_scope: value.share_scope,
library: value.library,
runtime: value.runtime,
filename: value.filename,
exposes: value
.exposes
.into_iter()
.map(|(key, options)| (key, options.into()))
.collect(),
enhanced: value.enhanced,
}
}
}

/// Container configuration with layer-aware exposed modules.
#[derive(Debug)]
pub struct EnhancedContainerPluginOptions {
pub name: String,
pub share_scope: ShareScope,
pub library: LibraryOptions,
pub runtime: Option<EntryRuntime>,
pub filename: Option<Filename>,
pub exposes: Vec<(String, EnhancedExposeOptions)>,
pub enhanced: bool,
}

#[rspack_cacheable::cacheable]
#[derive(Debug, Clone, Serialize)]
pub struct ExposeOptions {
pub struct EnhancedExposeOptions {
pub name: Option<String>,
pub import: Vec<String>,
/// Layer the exposed module is built in. Serialized into the container
/// identifier only when present so unlayered identifiers keep webpack's
/// `[[key, options]]` payload.
#[serde(skip_serializing_if = "Option::is_none")]
pub layer: Option<ModuleLayer>,
}

#[plugin]
#[derive(Debug)]
pub struct ContainerPlugin {
options: ContainerPluginOptions,
options: EnhancedContainerPluginOptions,
}

impl ContainerPlugin {
pub fn new(options: ContainerPluginOptions) -> Self {
Self::new_enhanced(options.into())
}

pub fn new_enhanced(options: EnhancedContainerPluginOptions) -> Self {
Self::new_inner(options)
}
}
Expand Down
5 changes: 4 additions & 1 deletion crates/rspack_plugin_mf/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,10 @@ impl RspackHash for ShareScope {
}

pub use container::{
container_plugin::{ContainerPlugin, ContainerPluginOptions, ExposeOptions},
container_plugin::{
ContainerPlugin, ContainerPluginOptions, EnhancedContainerPluginOptions, EnhancedExposeOptions,
ExposeOptions,
},
container_reference_plugin::{
ContainerReferencePlugin, ContainerReferencePluginOptions, RemoteOptions,
},
Expand Down
10 changes: 5 additions & 5 deletions crates/rspack_plugin_mf/src/manifest/asset.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,13 @@ pub fn empty_assets_group() -> StatsAssetsGroup {
}

pub fn normalize_assets_group(group: &mut StatsAssetsGroup) {
group.js.sync.sort();
group.js.sync.sort_unstable();
group.js.sync.dedup();
group.js.r#async.sort();
group.js.r#async.sort_unstable();
group.js.r#async.dedup();
group.css.sync.sort();
group.css.sync.sort_unstable();
group.css.sync.dedup();
group.css.r#async.sort();
group.css.r#async.sort_unstable();
group.css.r#async.dedup();
}

Expand Down Expand Up @@ -183,7 +183,7 @@ pub fn collect_usage_files_for_module(
}
}
let mut collected: Vec<String> = files.into_iter().collect();
collected.sort();
collected.sort_unstable();
collected
}

Expand Down
2 changes: 1 addition & 1 deletion crates/rspack_plugin_mf/src/manifest/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -721,7 +721,7 @@ async fn process_assets(&self, compilation: &mut Compilation) -> Result<()> {
if let Some(singleton) = consumed_singletons.get(&v.name) {
v.singleton = Some(*singleton);
}
v.usedIn.sort();
v.usedIn.sort_unstable();
v.usedIn.dedup();
v
})
Expand Down
Loading
Loading