diff --git a/crates/rspack_binding_api/src/compilation/mod.rs b/crates/rspack_binding_api/src/compilation/mod.rs index c2dc79030043..cf4749e4d5d8 100644 --- a/crates/rspack_binding_api/src/compilation/mod.rs +++ b/crates/rspack_binding_api/src/compilation/mod.rs @@ -838,7 +838,7 @@ impl JsCompilation { .into_iter() .map(|dependency_id| { let dependency = module_graph.dependency_by_id(&dependency_id); - if let Some(factorize_info) = FactorizeInfo::get_from(dependency) + if let Some(factorize_info) = FactorizeInfo::get_from(dependency.as_ref()) && let Some(diagnostic) = factorize_info.diagnostics().first() { return Either::A(diagnostic.to_string()); @@ -942,7 +942,7 @@ impl JsCompilation { .into_iter() .map(|dependency_id| { let dependency = module_graph.dependency_by_id(&dependency_id); - if let Some(factorize_info) = FactorizeInfo::get_from(dependency) + if let Some(factorize_info) = FactorizeInfo::get_from(dependency.as_ref()) && let Some(diagnostic) = factorize_info.diagnostics().first() { return Either::A(diagnostic.to_string()); diff --git a/crates/rspack_core/src/artifacts/build_module_graph_artifact.rs b/crates/rspack_core/src/artifacts/build_module_graph_artifact.rs index 3764dd187bcf..05d21f14eace 100644 --- a/crates/rspack_core/src/artifacts/build_module_graph_artifact.rs +++ b/crates/rspack_core/src/artifacts/build_module_graph_artifact.rs @@ -208,7 +208,7 @@ impl BuildModuleGraphArtifact { let dep_diagnostics = self.make_failed_dependencies.iter().flat_map(|dep_id| { let dep = mg.dependency_by_id(dep_id); let origin_module_identifier = mg.get_parent_module(dep_id); - FactorizeInfo::get_from(dep) + FactorizeInfo::get_from(dep.as_ref()) .expect("should have factorize info") .diagnostics() .iter() diff --git a/crates/rspack_core/src/cache/persistent/occasion/make/mod.rs b/crates/rspack_core/src/cache/persistent/occasion/make/mod.rs index 7ff417d55e8b..99a0c5924dca 100644 --- a/crates/rspack_core/src/cache/persistent/occasion/make/mod.rs +++ b/crates/rspack_core/src/cache/persistent/occasion/make/mod.rs @@ -97,7 +97,7 @@ impl MakeOccasion { // recovery make_failed_dependencies let mut make_failed_dependencies = FxHashSet::default(); for (dep_id, dep) in mg.dependencies() { - if let Some(info) = FactorizeInfo::get_from(dep) { + if let Some(info) = FactorizeInfo::get_from(dep.as_ref()) { if !info.is_success() { make_failed_dependencies.insert(*dep_id); } diff --git a/crates/rspack_core/src/cache/persistent/occasion/make/module_graph.rs b/crates/rspack_core/src/cache/persistent/occasion/make/module_graph.rs index ae168a296173..108a11ad06e2 100644 --- a/crates/rspack_core/src/cache/persistent/occasion/make/module_graph.rs +++ b/crates/rspack_core/src/cache/persistent/occasion/make/module_graph.rs @@ -3,6 +3,7 @@ use std::sync::{ atomic::{AtomicUsize, Ordering}, }; +use dyn_clone::clone_box; use rayon::prelude::*; use rspack_cacheable::{cacheable, utils::OwnedOrRef}; use rspack_collections::IdentifierSet; @@ -71,7 +72,7 @@ pub fn save_module_graph( .par_iter() .map(|dep_id| { ( - mg.dependency_by_id(dep_id).into(), + clone_box(mg.dependency_by_id(dep_id).as_ref()).into(), mg.get_parent_block(dep_id).map(Into::into), ) }) diff --git a/crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/mod.rs b/crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/mod.rs index d08900c2771d..c7f3e5b9f94f 100644 --- a/crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/mod.rs +++ b/crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/mod.rs @@ -5,6 +5,7 @@ pub mod factorize; pub mod lazy; pub mod process_dependencies; +use dyn_clone::clone_box; use rspack_error::Result; use rustc_hash::{FxHashMap as HashMap, FxHashSet as HashSet}; @@ -47,13 +48,13 @@ pub async fn repair( Box::new(factorize::FactorizeTask { compiler_id: compilation.compiler_id(), compilation_id: compilation.id(), - module_factory: compilation.get_dependency_factory(dependency), + module_factory: compilation.get_dependency_factory(dependency.as_ref()), original_module_identifier: None, original_module_source: None, issuer: None, issuer_layer: None, original_module_context: None, - dependencies: vec![dependency.clone()], + dependencies: vec![clone_box(dependency.as_ref())], resolve_options: None, options: compilation.options.clone(), resolver_factory: compilation.resolver_factory.clone(), diff --git a/crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/process_dependencies.rs b/crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/process_dependencies.rs index bd9c2cf59321..d1026652c852 100644 --- a/crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/process_dependencies.rs +++ b/crates/rspack_core/src/compilation/build_module_graph/graph_updater/repair/process_dependencies.rs @@ -1,5 +1,6 @@ use std::borrow::Cow; +use dyn_clone::clone_box; use rustc_hash::FxHashMap as HashMap; use super::{TaskContext, factorize::FactorizeTask}; @@ -66,7 +67,7 @@ impl Task for ProcessDependenciesTask { sorted_dependencies .entry(resource_identifier) .or_insert(vec![]) - .push(dependency.clone()); + .push(clone_box(dependency.as_ref())); } } diff --git a/crates/rspack_core/src/compilation/build_module_graph/module_executor/execute.rs b/crates/rspack_core/src/compilation/build_module_graph/module_executor/execute.rs index c76e3cf6e789..94e8a1cc90d1 100644 --- a/crates/rspack_core/src/compilation/build_module_graph/module_executor/execute.rs +++ b/crates/rspack_core/src/compilation/build_module_graph/module_executor/execute.rs @@ -177,7 +177,7 @@ impl Task for ExecuteTask { for dep_id in module.get_dependencies() { if !has_error && make_failed_dependencies.contains(dep_id) { let dep = mg.dependency_by_id(dep_id); - let diagnostics = FactorizeInfo::get_from(dep) + let diagnostics = FactorizeInfo::get_from(dep.as_ref()) .expect("should have factorize info") .diagnostics(); let errors: Vec<_> = diagnostics diff --git a/crates/rspack_core/src/compilation/mod.rs b/crates/rspack_core/src/compilation/mod.rs index 9f48d5046493..3e044c8c4448 100644 --- a/crates/rspack_core/src/compilation/mod.rs +++ b/crates/rspack_core/src/compilation/mod.rs @@ -70,10 +70,10 @@ use crate::{ ChunkRenderCacheArtifact, ChunkRenderResult, ChunkUkey, CodeGenerateCacheArtifact, CodeGenerationJob, CodeGenerationResult, CodeGenerationResults, CompilationLogger, CompilationLogging, CompilerOptions, CompilerPlatform, ConcatenationScope, - DependenciesDiagnosticsArtifact, DependencyId, DependencyTemplate, DependencyTemplateType, - DependencyType, Entry, EntryData, EntryOptions, EntryRuntime, Entrypoint, ExecuteModuleId, - ExportsInfoArtifact, ExtendedReferencedExport, Filename, ImportPhase, ImportVarMap, - ImportedByDeferModulesArtifact, MemoryGCStorage, ModuleFactory, ModuleGraph, + DependenciesDiagnosticsArtifact, Dependency, DependencyId, DependencyTemplate, + DependencyTemplateType, DependencyType, Entry, EntryData, EntryOptions, EntryRuntime, Entrypoint, + ExecuteModuleId, ExportsInfoArtifact, ExtendedReferencedExport, Filename, ImportPhase, + ImportVarMap, ImportedByDeferModulesArtifact, MemoryGCStorage, ModuleFactory, ModuleGraph, ModuleGraphCacheArtifact, ModuleIdentifier, ModuleIdsArtifact, ModuleStaticCache, PathData, ProcessRuntimeRequirementsCacheArtifact, ResolverFactory, RuntimeGlobals, RuntimeKeyMap, RuntimeMode, RuntimeModule, RuntimeSpec, RuntimeSpecMap, RuntimeTemplate, SharedPluginDriver, @@ -1216,7 +1216,7 @@ impl Compilation { .insert(dependency_type, module_factory); } - pub fn get_dependency_factory(&self, dependency: &BoxDependency) -> Arc { + pub fn get_dependency_factory(&self, dependency: &dyn Dependency) -> Arc { let dependency_type = dependency.dependency_type(); self .dependency_factories diff --git a/crates/rspack_core/src/concatenated_module.rs b/crates/rspack_core/src/concatenated_module.rs index 0a0cf2ae7074..c58ed65a94fe 100644 --- a/crates/rspack_core/src/concatenated_module.rs +++ b/crates/rspack_core/src/concatenated_module.rs @@ -38,24 +38,24 @@ use swc_experimental_ecma_semantic::resolver::{Semantic, resolver}; use swc_node_comments::SwcComments; use crate::{ - AsyncDependenciesBlockIdentifier, BoxDependency, BoxDependencyTemplate, BoxModule, - BoxModuleDependency, BuildContext, BuildInfo, BuildMeta, BuildMetaDefaultObject, - BuildMetaExportsType, BuildResult, ChunkGraph, ChunkInitFragments, ChunkRenderContext, - CodeGenerationDataTopLevelDeclarations, CodeGenerationExportsFinalNames, - CodeGenerationPublicPathAutoReplace, CodeGenerationResult, Compilation, ConcatenatedModuleIdent, - ConcatenationScope, ConditionalInitFragment, ConnectionState, Context, DEFAULT_EXPORT, - DEFAULT_EXPORT_ATOM, DependenciesBlock, DependencyId, DependencyType, ExportInfoHashKey, - ExportProvided, ExportsArgument, ExportsInfoArtifact, ExportsInfoGetter, ExportsType, - FactoryMeta, GetUsedNameParam, ImportedByDeferModulesArtifact, InitFragment, InitFragmentStage, - LibIdentOptions, Module, ModuleArgument, ModuleCodeGenerationContext, ModuleGraph, - ModuleGraphCacheArtifact, ModuleGraphConnection, ModuleIdentifier, ModuleLayer, - ModuleStaticCache, ModuleType, NAMESPACE_OBJECT_EXPORT, ParserOptions, PrefetchExportsInfoMode, - Resolve, RuntimeCondition, RuntimeGlobals, RuntimeSpec, SourceType, URLStaticMode, UsageState, - UsedName, UsedNameItem, escape_identifier, filter_runtime, find_target, get_runtime_key, - impl_source_map_config, merge_runtime_condition, merge_runtime_condition_non_false, - module_update_hash, property_access, property_name, - render_make_deferred_namespace_mode_from_exports_type, reserved_names::RESERVED_NAMES, - subtract_runtime_condition, to_identifier_with_escaped, to_normal_comment, + AsyncDependenciesBlockIdentifier, BoxDependencyTemplate, BoxModule, BoxModuleDependency, + BuildContext, BuildInfo, BuildMeta, BuildMetaDefaultObject, BuildMetaExportsType, BuildResult, + ChunkGraph, ChunkInitFragments, ChunkRenderContext, CodeGenerationDataTopLevelDeclarations, + CodeGenerationExportsFinalNames, CodeGenerationPublicPathAutoReplace, CodeGenerationResult, + Compilation, ConcatenatedModuleIdent, ConcatenationScope, ConditionalInitFragment, + ConnectionState, Context, DEFAULT_EXPORT, DEFAULT_EXPORT_ATOM, DependenciesBlock, Dependency, + DependencyId, DependencyType, ExportInfoHashKey, ExportProvided, ExportsArgument, + ExportsInfoArtifact, ExportsInfoGetter, ExportsType, FactoryMeta, GetUsedNameParam, + ImportedByDeferModulesArtifact, InitFragment, InitFragmentStage, LibIdentOptions, Module, + ModuleArgument, ModuleCodeGenerationContext, ModuleGraph, ModuleGraphCacheArtifact, + ModuleGraphConnection, ModuleIdentifier, ModuleLayer, ModuleStaticCache, ModuleType, + NAMESPACE_OBJECT_EXPORT, ParserOptions, PrefetchExportsInfoMode, Resolve, RuntimeCondition, + RuntimeGlobals, RuntimeSpec, SourceType, URLStaticMode, UsageState, UsedName, UsedNameItem, + escape_identifier, filter_runtime, find_target, get_runtime_key, impl_source_map_config, + merge_runtime_condition, merge_runtime_condition_non_false, module_update_hash, property_access, + property_name, render_make_deferred_namespace_mode_from_exports_type, + reserved_names::RESERVED_NAMES, subtract_runtime_condition, to_identifier_with_escaped, + to_normal_comment, }; type ExportsDefinitionArgs = Vec<(String, String)>; @@ -799,7 +799,7 @@ impl Module for ConcatenatedModule { for dep_id in module.get_dependencies().iter() { let dep = module_graph.dependency_by_id(dep_id); let module_id_of_dep = module_graph.module_identifier_by_dependency_id(dep_id); - if !is_esm_dep_like(dep) || !modules.contains(&module_id_of_dep) { + if !is_esm_dep_like(dep.as_ref()) || !modules.contains(&module_id_of_dep) { self.dependencies.push(*dep_id); } } @@ -2221,7 +2221,7 @@ impl ConcatenatedModule { .into_iter() .filter_map(|connection| { let dep = mg.dependency_by_id(&connection.dependency_id); - if !is_esm_dep_like(dep) { + if !is_esm_dep_like(dep.as_ref()) { return None; } let ref_module = mg @@ -3117,7 +3117,7 @@ impl ConcatenatedModule { } } -pub fn is_esm_dep_like(dep: &BoxDependency) -> bool { +pub fn is_esm_dep_like(dep: &dyn Dependency) -> bool { matches!( dep.dependency_type(), DependencyType::EsmImportSpecifier diff --git a/crates/rspack_core/src/dependency/dependency_trait.rs b/crates/rspack_core/src/dependency/dependency_trait.rs index 17cbec24d443..6eb9a64c4da8 100644 --- a/crates/rspack_core/src/dependency/dependency_trait.rs +++ b/crates/rspack_core/src/dependency/dependency_trait.rs @@ -1,4 +1,4 @@ -use std::{any::Any, fmt::Debug}; +use std::{any::Any, fmt::Debug, sync::Arc}; use dyn_clone::{DynClone, clone_trait_object}; use rspack_cacheable::cacheable_dyn; @@ -149,3 +149,4 @@ impl dyn Dependency + '_ { clone_trait_object!(Dependency); pub type BoxDependency = Box; +pub type ArcDependency = Arc; diff --git a/crates/rspack_core/src/dependency/factorize_info.rs b/crates/rspack_core/src/dependency/factorize_info.rs index ef009bea04b3..01565e17f4d8 100644 --- a/crates/rspack_core/src/dependency/factorize_info.rs +++ b/crates/rspack_core/src/dependency/factorize_info.rs @@ -2,7 +2,7 @@ use rspack_cacheable::cacheable; use rspack_error::Diagnostic; use rspack_paths::ArcPathSet; -use super::{BoxDependency, DependencyId}; +use super::{Dependency, DependencyId}; #[cacheable] #[derive(Debug, Clone, Default)] @@ -31,7 +31,7 @@ impl FactorizeInfo { } } - pub fn get_from(dep: &BoxDependency) -> Option<&FactorizeInfo> { + pub fn get_from(dep: &dyn Dependency) -> Option<&FactorizeInfo> { if let Some(d) = dep.as_context_dependency() { Some(d.factorize_info()) } else if let Some(d) = dep.as_module_dependency() { @@ -41,7 +41,7 @@ impl FactorizeInfo { } } - pub fn revoke(dep: &mut BoxDependency) -> Option { + pub fn revoke(dep: &mut dyn Dependency) -> Option { if let Some(d) = dep.as_context_dependency_mut() { Some(std::mem::take(d.factorize_info_mut())) } else if let Some(d) = dep.as_module_dependency_mut() { diff --git a/crates/rspack_core/src/incremental/mutations.rs b/crates/rspack_core/src/incremental/mutations.rs index 714b82de39b6..0aeed3ecd856 100644 --- a/crates/rspack_core/src/incremental/mutations.rs +++ b/crates/rspack_core/src/incremental/mutations.rs @@ -6,7 +6,7 @@ use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use rspack_collections::{IdentifierSet, UkeySet}; use crate::{ - AffectType, BoxDependency, ChunkUkey, Compilation, DependencyId, ModuleGraph, ModuleIdentifier, + AffectType, ChunkUkey, Compilation, Dependency, DependencyId, ModuleGraph, ModuleIdentifier, }; #[derive(Debug, Default)] @@ -254,7 +254,7 @@ fn compute_affected_modules_with_module_graph( built_modules: IdentifierSet, built_dependencies: UkeySet, ) -> IdentifierSet { - fn reduce_affect_type<'a>(dependencies: impl Iterator) -> AffectType { + fn reduce_affect_type<'a>(dependencies: impl Iterator) -> AffectType { let mut affected = AffectType::False; for dependency in dependencies { match dependency.could_affect_referencing_module() { @@ -285,7 +285,7 @@ fn compute_affected_modules_with_module_graph( match reduce_affect_type( connections .iter() - .map(|c| module_graph.dependency_by_id(&c.dependency_id)), + .map(|c| module_graph.dependency_by_id(&c.dependency_id).as_ref()), ) { AffectType::False => None, AffectType::True => Some(AffectedModuleKind::Direct(referencing_module)), diff --git a/crates/rspack_core/src/module_graph/internal.rs b/crates/rspack_core/src/module_graph/internal.rs index 0b7fb8d5d97d..daa0d6ac6a62 100644 --- a/crates/rspack_core/src/module_graph/internal.rs +++ b/crates/rspack_core/src/module_graph/internal.rs @@ -4,7 +4,7 @@ /// /// This module provides restricted access to potentially unsafe ModuleGraph operations /// that should only be used in specific contexts where items may legitimately not exist. -use crate::{BoxDependency, DependencyId, ModuleGraph, ModuleGraphModule, ModuleIdentifier}; +use crate::{ArcDependency, DependencyId, ModuleGraph, ModuleGraphModule, ModuleIdentifier}; /// Try to get a dependency by ID, returning None if not found. /// @@ -30,7 +30,7 @@ use crate::{BoxDependency, DependencyId, ModuleGraph, ModuleGraphModule, ModuleI pub fn try_dependency_by_id<'a>( module_graph: &'a ModuleGraph, dependency_id: &DependencyId, -) -> Option<&'a BoxDependency> { +) -> Option<&'a ArcDependency> { module_graph.inner.dependencies.get(dependency_id) } diff --git a/crates/rspack_core/src/module_graph/mod.rs b/crates/rspack_core/src/module_graph/mod.rs index fa440fcf32c8..436f4a005231 100644 --- a/crates/rspack_core/src/module_graph/mod.rs +++ b/crates/rspack_core/src/module_graph/mod.rs @@ -1,6 +1,9 @@ pub mod internal; pub mod rollback; +use std::sync::Arc; + +use dyn_clone::clone_box; use internal::try_get_module_graph_module_mut_by_identifier; use rayon::prelude::*; use rspack_error::Result; @@ -9,9 +12,9 @@ use rustc_hash::FxHashMap as HashMap; use swc_core::ecma::atoms::Atom; use crate::{ - AsyncDependenciesBlock, AsyncDependenciesBlockIdentifier, AsyncModulesArtifact, Compilation, - DependenciesBlock, Dependency, ExportInfo, ExportName, ImportedByDeferModulesArtifact, - ModuleGraphCacheArtifact, RuntimeSpec, UsedNameItem, + ArcDependency, AsyncDependenciesBlock, AsyncDependenciesBlockIdentifier, AsyncModulesArtifact, + Compilation, DependenciesBlock, Dependency, ExportInfo, ExportName, + ImportedByDeferModulesArtifact, ModuleGraphCacheArtifact, RuntimeSpec, UsedNameItem, }; mod module; pub use module::*; @@ -59,7 +62,7 @@ pub(crate) struct ModuleGraphData { pub(crate) modules: rollback::RollbackMap, /// Dependencies indexed by `DependencyId`. - dependencies: HashMap, + dependencies: HashMap, /// AsyncDependenciesBlocks indexed by `AsyncDependenciesBlockIdentifier`. blocks: HashMap>, @@ -366,7 +369,7 @@ impl ModuleGraph { &mut self, old_module: &ModuleIdentifier, new_module: &ModuleIdentifier, - filter_connection: impl Fn(&ModuleGraphConnection, &Box) -> bool, + filter_connection: impl Fn(&ModuleGraphConnection, &dyn Dependency) -> bool, ) { if old_module == new_module { return; @@ -384,7 +387,7 @@ impl ModuleGraph { .connection_by_dependency_id(&dep_id) .expect("should have connection"); let dependency = self.dependency_by_id(&dep_id); - if filter_connection(connection, dependency) { + if filter_connection(connection, dependency.as_ref()) { let connection = self .connection_by_dependency_id_mut(&dep_id) .expect("should have connection"); @@ -415,7 +418,7 @@ impl ModuleGraph { .connection_by_dependency_id(&dep_id) .expect("should have connection"); let dependency = self.dependency_by_id(&dep_id); - if filter_connection(connection, dependency) { + if filter_connection(connection, dependency.as_ref()) { let connection = self .connection_by_dependency_id_mut(&dep_id) .expect("should have connection"); @@ -441,7 +444,7 @@ impl ModuleGraph { new_module: &ModuleIdentifier, filter_connection: F, ) where - F: Fn(&ModuleGraphConnection, &BoxDependency) -> bool, + F: Fn(&ModuleGraphConnection, &dyn Dependency) -> bool, { if old_module == new_module { return; @@ -460,7 +463,7 @@ impl ModuleGraph { .connection_by_dependency_id(&dep_id) .expect("should have connection"); let dep = self.dependency_by_id(&dep_id); - if filter_connection(connection, dep) { + if filter_connection(connection, dep.as_ref()) { let con = self .connection_by_dependency_id_mut(&dep_id) .expect("should have connection"); @@ -556,12 +559,15 @@ impl ModuleGraph { &self.inner.blocks } - pub fn dependencies(&self) -> impl Iterator { + pub fn dependencies(&self) -> impl Iterator { self.inner.dependencies.iter() } pub fn add_dependency(&mut self, dependency: BoxDependency) { - self.inner.dependencies.insert(*dependency.id(), dependency); + self + .inner + .dependencies + .insert(*dependency.id(), Arc::from(dependency)); } /// Get a dependency by ID, panicking if not found. @@ -579,7 +585,7 @@ impl ModuleGraph { /// /// **Only the binding layer (`rspack_binding_api`) should use `internal::try_dependency_by_id()`** /// for graceful handling of missing dependencies in external APIs. - pub fn dependency_by_id(&self, dependency_id: &DependencyId) -> &BoxDependency { + pub fn dependency_by_id(&self, dependency_id: &DependencyId) -> &ArcDependency { self .inner .dependencies @@ -592,12 +598,16 @@ impl ModuleGraph { /// **PREFERRED METHOD**: Use this for ALL internal Rust code when you need to /// modify dependencies. Dependencies should always be accessible in internal /// operations, so this method enforces that invariant with a clear panic message. - pub fn dependency_by_id_mut(&mut self, dependency_id: &DependencyId) -> &mut BoxDependency { - self + pub fn dependency_by_id_mut(&mut self, dependency_id: &DependencyId) -> &mut dyn Dependency { + let dep = self .inner .dependencies .get_mut(dependency_id) - .unwrap_or_else(|| panic!("Dependency with ID {dependency_id:?} not found")) + .unwrap_or_else(|| panic!("Dependency with ID {dependency_id:?} not found")); + if Arc::strong_count(dep) != 1 { + *dep = Arc::from(clone_box(dep.as_ref())); + } + Arc::get_mut(dep).unwrap_or_else(|| panic!("Dependency with ID {dependency_id:?} not found")) } /// Uniquely identify a module by its dependency diff --git a/crates/rspack_plugin_dynamic_entry/src/lib.rs b/crates/rspack_plugin_dynamic_entry/src/lib.rs index caa66fe97dfe..08416d745c15 100644 --- a/crates/rspack_plugin_dynamic_entry/src/lib.rs +++ b/crates/rspack_plugin_dynamic_entry/src/lib.rs @@ -78,7 +78,10 @@ async fn make(&self, compilation: &mut Compilation) -> Result<()> { .entry(entry.into()) .or_default() .insert(options.clone(), *dependency_id); - dependency.clone() + let dependency = dependency + .downcast_ref::() + .expect("dependency should be EntryDependency in DynamicEntryPlugin"); + Box::new(dependency.clone()) } else { let dependency: BoxDependency = Box::new(EntryDependency::new( entry.clone(), diff --git a/crates/rspack_plugin_esm_library/src/plugin.rs b/crates/rspack_plugin_esm_library/src/plugin.rs index 14a26c4f4aaa..d8fe937e8f92 100644 --- a/crates/rspack_plugin_esm_library/src/plugin.rs +++ b/crates/rspack_plugin_esm_library/src/plugin.rs @@ -120,7 +120,7 @@ impl EsmLibraryPlugin { .get_incoming_connections(module_identifier) .map(|conn| module_graph.dependency_by_id(&conn.dependency_id)) .any(|dep| { - !is_esm_dep_like(dep) + !is_esm_dep_like(dep.as_ref()) && !matches!( dep.dependency_type(), DependencyType::Entry | DependencyType::DynamicImport @@ -389,7 +389,7 @@ async fn finish_modules( .get_incoming_connections(module_identifier) .map(|conn| module_graph.dependency_by_id(&conn.dependency_id)) .any(|dep| { - !is_esm_dep_like(dep) + !is_esm_dep_like(dep.as_ref()) && !matches!( dep.dependency_type(), DependencyType::Entry | DependencyType::DynamicImport diff --git a/crates/rspack_plugin_javascript/src/plugin/module_concatenation_plugin.rs b/crates/rspack_plugin_javascript/src/plugin/module_concatenation_plugin.rs index a4ede538258e..4428c64cb5dd 100644 --- a/crates/rspack_plugin_javascript/src/plugin/module_concatenation_plugin.rs +++ b/crates/rspack_plugin_javascript/src/plugin/module_concatenation_plugin.rs @@ -6,7 +6,7 @@ use rspack_collections::{ Identifiable, IdentifierDashMap, IdentifierIndexSet, IdentifierMap, IdentifierSet, }; use rspack_core::{ - BoxDependency, BoxModule, Compilation, CompilationOptimizeChunkModules, DependencyId, + BoxModule, Compilation, CompilationOptimizeChunkModules, Dependency, DependencyId, DependencyType, ExportProvided, ExportsInfoArtifact, ExtendedReferencedExport, GetTargetResult, ImportedByDeferModulesArtifact, LibIdentOptions, Logger, ModuleGraph, ModuleGraphCacheArtifact, ModuleGraphConnection, ModuleGraphModule, ModuleIdentifier, Plugin, PrefetchExportsInfoMode, @@ -473,7 +473,7 @@ impl ModuleConcatenationPlugin { for (origin_module, connections) in incoming_connections_from_modules.iter() { let has_non_esm_connections = connections.iter().any(|connection| { let dep = module_graph.dependency_by_id(&connection.dependency_id); - !is_esm_dep_like(dep) + !is_esm_dep_like(dep.as_ref()) }); if has_non_esm_connections { @@ -1104,7 +1104,7 @@ impl ModuleConcatenationPlugin { .iter() .filter_map(|d| { let dep = module_graph.dependency_by_id(d); - if !is_esm_dep_like(dep) { + if !is_esm_dep_like(dep.as_ref()) { return None; } let con = module_graph.connection_by_dependency_id(d)?; @@ -1570,7 +1570,7 @@ fn prepare_concatenated_module_connections( filter_connection: F, ) -> Vec where - F: Fn(&ModuleIdentifier, &ModuleGraphConnection, &BoxDependency) -> bool, + F: Fn(&ModuleIdentifier, &ModuleGraphConnection, &dyn Dependency) -> bool, { let mg = compilation.get_module_graph(); let mut res = vec![]; @@ -1590,7 +1590,7 @@ where .connection_by_dependency_id(dep_id) .expect("should have connection"); let dep = mg.dependency_by_id(dep_id); - if filter_connection(m, connection, dep) { + if filter_connection(m, connection, dep.as_ref()) { res.push(*dep_id); } } @@ -1604,7 +1604,7 @@ fn prepare_concatenated_root_module_connections( filter_connection: F, ) -> (Vec, Vec) where - F: Fn(&ModuleIdentifier, &ModuleGraphConnection, &BoxDependency) -> bool, + F: Fn(&ModuleIdentifier, &ModuleGraphConnection, &dyn Dependency) -> bool, { let mg = compilation.get_module_graph(); let mut outgoings = vec![]; @@ -1619,7 +1619,7 @@ where .expect("should have connection"); let dep = mg.dependency_by_id(dep_id); - if filter_connection(root_module_id, connection, dep) { + if filter_connection(root_module_id, connection, dep.as_ref()) { outgoings.push(*dep_id); } } @@ -1635,7 +1635,7 @@ where .connection_by_dependency_id(dep_id) .expect("should have connection"); let dependency = mg.dependency_by_id(dep_id); - if filter_connection(root_module_id, connection, dependency) { + if filter_connection(root_module_id, connection, dependency.as_ref()) { incomings.push(*dep_id); } }