@@ -6,16 +6,16 @@ use rspack_error::{
66 internal_error, Diagnostic , IntoTWithDiagnosticArray , Result , TWithDiagnosticArray ,
77} ;
88use rspack_identifier:: Identifiable ;
9- use rspack_loader_runner:: { get_scheme, DescriptionData , Scheme } ;
9+ use rspack_loader_runner:: { get_scheme, DescriptionData , Loader , Scheme } ;
1010use sugar_path:: { AsPath , SugarPath } ;
1111use swc_core:: common:: Span ;
1212
1313use crate :: {
1414 cache:: Cache ,
1515 module_rules_matcher, parse_resource, resolve, stringify_loaders_and_resource,
1616 tree_shaking:: visitor:: { get_side_effects_from_package_json, SideEffects } ,
17- BoxLoader , CompilerOptions , DependencyCategory , DependencyType , FactorizeArgs , FactoryMeta ,
18- FuncUseCtx , GeneratorOptions , MissingModule , ModuleArgs , ModuleExt , ModuleFactory ,
17+ BoxLoader , CompilerContext , CompilerOptions , DependencyCategory , DependencyType , FactorizeArgs ,
18+ FactoryMeta , FuncUseCtx , GeneratorOptions , MissingModule , ModuleArgs , ModuleExt , ModuleFactory ,
1919 ModuleFactoryCreateData , ModuleFactoryResult , ModuleIdentifier , ModuleRule , ModuleRuleEnforce ,
2020 ModuleRuleUse , ModuleRuleUseLoader , ModuleType , NormalModule , NormalModuleAfterResolveArgs ,
2121 NormalModuleBeforeResolveArgs , ParserOptions , RawModule , Resolve , ResolveArgs , ResolveError ,
@@ -26,7 +26,7 @@ use crate::{
2626#[ derive( Debug ) ]
2727pub struct NormalModuleFactory {
2828 context : NormalModuleFactoryContext ,
29- resolver_factory : Arc < ResolverFactory > ,
29+ loader_resolver_factory : Arc < ResolverFactory > ,
3030 plugin_driver : SharedPluginDriver ,
3131 cache : Arc < Cache > ,
3232}
@@ -55,13 +55,13 @@ static MATCH_RESOURCE_REGEX: Lazy<Regex> =
5555impl NormalModuleFactory {
5656 pub fn new (
5757 context : NormalModuleFactoryContext ,
58- resolver_factory : Arc < ResolverFactory > ,
58+ loader_resolver_factory : Arc < ResolverFactory > ,
5959 plugin_driver : SharedPluginDriver ,
6060 cache : Arc < Cache > ,
6161 ) -> Self {
6262 Self {
6363 context,
64- resolver_factory ,
64+ loader_resolver_factory ,
6565 plugin_driver,
6666 cache,
6767 }
@@ -145,13 +145,15 @@ impl NormalModuleFactory {
145145 Ok ( None )
146146 }
147147
148- fn get_loader_resolver ( & self , loader_resolve_options : Option < Resolve > ) -> Arc < Resolver > {
149- self . resolver_factory . get ( ResolveOptionsWithDependencyType {
150- resolve_options : loader_resolve_options,
151- resolve_to_context : false ,
152- dependency_type : DependencyType :: CjsRequire ,
153- dependency_category : DependencyCategory :: CommonJS ,
154- } )
148+ fn get_loader_resolver ( & self ) -> Arc < Resolver > {
149+ self
150+ . loader_resolver_factory
151+ . get ( ResolveOptionsWithDependencyType {
152+ resolve_options : None ,
153+ resolve_to_context : false ,
154+ dependency_type : DependencyType :: CjsRequire ,
155+ dependency_category : DependencyCategory :: CommonJS ,
156+ } )
155157 }
156158
157159 pub async fn factorize_normal_module (
@@ -172,7 +174,7 @@ impl NormalModuleFactory {
172174 let context_scheme = get_scheme ( data. context . as_ref ( ) ) ;
173175 let context = data. context . as_path ( ) ;
174176 let plugin_driver = & self . plugin_driver ;
175- let loader_resolver = self . get_loader_resolver ( data . resolve_options . clone ( ) ) ;
177+ let loader_resolver = self . get_loader_resolver ( ) ;
176178
177179 let mut match_resource_data: Option < ResourceData > = None ;
178180 let mut inline_loaders: Vec < ModuleRuleUseLoader > = vec ! [ ] ;
@@ -476,32 +478,94 @@ impl NormalModuleFactory {
476478 pre_loaders. len ( ) + post_loaders. len ( ) + normal_loaders. len ( ) + inline_loaders. len ( ) ,
477479 ) ;
478480
479- all_loaders. extend ( post_loaders) ;
481+ for l in post_loaders {
482+ all_loaders. push (
483+ resolve_each (
484+ plugin_driver,
485+ & self . context . options ,
486+ self . context . options . context . as_ref ( ) ,
487+ & loader_resolver,
488+ & l. loader ,
489+ l. options . as_deref ( ) ,
490+ )
491+ . await ?,
492+ )
493+ }
494+
495+ let mut resolved_inline_loaders = vec ! [ ] ;
496+ let mut resolved_normal_loaders = vec ! [ ] ;
497+
498+ for l in inline_loaders {
499+ resolved_inline_loaders. push (
500+ resolve_each (
501+ plugin_driver,
502+ & self . context . options ,
503+ context,
504+ & loader_resolver,
505+ & l. loader ,
506+ l. options . as_deref ( ) ,
507+ )
508+ . await ?,
509+ )
510+ }
511+
512+ for l in normal_loaders {
513+ resolved_normal_loaders. push (
514+ resolve_each (
515+ plugin_driver,
516+ & self . context . options ,
517+ self . context . options . context . as_ref ( ) ,
518+ & loader_resolver,
519+ & l. loader ,
520+ l. options . as_deref ( ) ,
521+ )
522+ . await ?,
523+ )
524+ }
525+
480526 if match_resource_data. is_some ( ) {
481- all_loaders. extend ( normal_loaders ) ;
482- all_loaders. extend ( inline_loaders ) ;
527+ all_loaders. extend ( resolved_normal_loaders ) ;
528+ all_loaders. extend ( resolved_inline_loaders ) ;
483529 } else {
484- all_loaders. extend ( inline_loaders) ;
485- all_loaders. extend ( normal_loaders) ;
530+ all_loaders. extend ( resolved_inline_loaders) ;
531+ all_loaders. extend ( resolved_normal_loaders) ;
532+ }
533+
534+ for l in pre_loaders {
535+ all_loaders. push (
536+ resolve_each (
537+ plugin_driver,
538+ & self . context . options ,
539+ self . context . options . context . as_ref ( ) ,
540+ & loader_resolver,
541+ & l. loader ,
542+ l. options . as_deref ( ) ,
543+ )
544+ . await ?,
545+ )
486546 }
487- all_loaders. extend ( pre_loaders) ;
488-
489- let mut loader = Vec :: with_capacity ( all_loaders. len ( ) ) ;
490- for l in all_loaders {
491- loader. push (
492- plugin_driver
493- . resolve_loader (
494- & self . context . options ,
495- context,
496- & loader_resolver,
497- & l. loader ,
498- l. options . as_deref ( ) ,
499- )
500- . await ?
501- . ok_or_else ( || internal_error ! ( "Unable to resolve loader {}" , & l. loader) ) ?,
502- ) ;
547+
548+ async fn resolve_each (
549+ plugin_driver : & SharedPluginDriver ,
550+ compiler_options : & CompilerOptions ,
551+ context : & Path ,
552+ loader_resolver : & Resolver ,
553+ loader_request : & str ,
554+ loader_options : Option < & str > ,
555+ ) -> Result < Arc < dyn Loader < CompilerContext > > > {
556+ plugin_driver
557+ . resolve_loader (
558+ compiler_options,
559+ context,
560+ loader_resolver,
561+ loader_request,
562+ loader_options,
563+ )
564+ . await ?
565+ . ok_or_else ( || internal_error ! ( "Unable to resolve loader {}" , loader_request) )
503566 }
504- loader
567+
568+ all_loaders
505569 } ;
506570
507571 let request = if !loaders. is_empty ( ) {
0 commit comments