@@ -22,6 +22,7 @@ use rspack_napi::napi::bindgen_prelude::*;
2222use rspack_napi:: NapiResultExt ;
2323use rspack_napi:: OneShotRef ;
2424use rspack_plugin_runtime:: RuntimeModuleFromJs ;
25+ use rustc_hash:: FxHashMap ;
2526
2627use super :: { JsFilename , PathWithInfo } ;
2728use crate :: entry:: JsEntryOptions ;
@@ -38,6 +39,7 @@ use crate::JsStatsOptimizationBailout;
3839use crate :: LocalJsFilename ;
3940use crate :: RawDependency ;
4041use crate :: ToJsCompatSource ;
42+ use crate :: COMPILER_REFERENCES ;
4143use crate :: { AssetInfo , JsAsset , JsPathData , JsStats } ;
4244use crate :: { JsRspackDiagnostic , JsRspackError } ;
4345
@@ -700,23 +702,52 @@ impl JsCompilation {
700702 ) -> napi:: Result < ( ) > {
701703 let compilation = self . as_mut ( ) ?;
702704
705+ let Some ( compiler_reference) = COMPILER_REFERENCES . with ( |ref_cell| {
706+ let references = ref_cell. borrow ( ) ;
707+ references. get ( & compilation. compiler_id ( ) ) . cloned ( )
708+ } ) else {
709+ return Err ( napi:: Error :: from_reason (
710+ "Unable to addInclude now. The Compiler has been garbage collected by JavaScript." ,
711+ ) ) ;
712+ } ;
713+ let Some ( js_compiler) = compiler_reference. get ( ) else {
714+ return Err ( napi:: Error :: from_reason (
715+ "Unable to addInclude now. The Compiler has been garbage collected by JavaScript." ,
716+ ) ) ;
717+ } ;
718+ let include_dependencies_map = & js_compiler. include_dependencies_map ;
719+
703720 let args = js_args
704721 . into_iter ( )
705722 . map ( |( js_context, js_dependency, js_options) | {
706723 let layer = match & js_options {
707724 Some ( options) => options. layer . clone ( ) ,
708725 None => None ,
709726 } ;
710- let dependency = Box :: new ( EntryDependency :: new (
711- js_dependency. request ,
712- js_context. into ( ) ,
713- layer,
714- false ,
715- ) ) as BoxDependency ;
716727 let options = match js_options {
717728 Some ( js_opts) => js_opts. into ( ) ,
718729 None => EntryOptions :: default ( ) ,
719730 } ;
731+ let dependency = if let Some ( map) = include_dependencies_map. get ( & js_dependency. request )
732+ && let Some ( dependency) = map. get ( & options)
733+ {
734+ dependency. clone ( )
735+ } else {
736+ let dependency: BoxDependency = Box :: new ( EntryDependency :: new (
737+ js_dependency. request . clone ( ) ,
738+ js_context. into ( ) ,
739+ layer,
740+ false ,
741+ ) ) ;
742+ if let Some ( mut map) = include_dependencies_map. get_mut ( & js_dependency. request ) {
743+ map. insert ( options. clone ( ) , dependency. clone ( ) ) ;
744+ } else {
745+ let mut map = FxHashMap :: default ( ) ;
746+ map. insert ( options. clone ( ) , dependency. clone ( ) ) ;
747+ include_dependencies_map. insert ( js_dependency. request , map) ;
748+ }
749+ dependency
750+ } ;
720751 ( dependency, options)
721752 } )
722753 . collect :: < Vec < ( BoxDependency , EntryOptions ) > > ( ) ;
0 commit comments