@@ -9,6 +9,9 @@ const Tapable = require("tapable");
99const NormalModule = require ( "./NormalModule" ) ;
1010const RawModule = require ( "./RawModule" ) ;
1111const RuleSet = require ( "./RuleSet" ) ;
12+ const cachedMerge = require ( "./util/cachedMerge" ) ;
13+
14+ const EMPTY_RESOLVE_OPTIONS = { } ;
1215
1316const loaderToIdent = data => {
1417 if ( ! data . options )
@@ -42,10 +45,10 @@ const identToLoaderRequest = resultString => {
4245} ;
4346
4447class NormalModuleFactory extends Tapable {
45- constructor ( context , resolvers , options ) {
48+ constructor ( context , resolverFactory , options ) {
4649 super ( ) ;
47- this . resolvers = resolvers ;
48- this . ruleSet = new RuleSet ( options . rules ) ;
50+ this . resolverFactory = resolverFactory ;
51+ this . ruleSet = new RuleSet ( options . defaultRules . concat ( options . rules ) ) ;
4952 this . cachePredicate = typeof options . unsafeCache === "function" ? options . unsafeCache : Boolean . bind ( null , options . unsafeCache ) ;
5053 this . context = context || "" ;
5154 this . parserCache = { } ;
@@ -85,7 +88,8 @@ class NormalModuleFactory extends Tapable {
8588 result . rawRequest ,
8689 result . loaders ,
8790 result . resource ,
88- result . parser
91+ result . parser ,
92+ result . resolveOptions
8993 ) ;
9094 }
9195
@@ -107,15 +111,19 @@ class NormalModuleFactory extends Tapable {
107111 let resource = elements . pop ( ) ;
108112 elements = elements . map ( identToLoaderRequest ) ;
109113
114+ const loaderResolver = this . getResolver ( "loader" ) ;
115+ const normalResolver = this . getResolver ( "normal" , data . resolveOptions ) ;
116+
110117 asyncLib . parallel ( [
111- callback => this . resolveRequestArray ( contextInfo , context , elements , this . resolvers . loader , callback ) ,
118+ callback => this . resolveRequestArray ( contextInfo , context , elements , loaderResolver , callback ) ,
112119 callback => {
113- if ( resource === "" || resource [ 0 ] === "?" )
120+ if ( resource === "" || resource [ 0 ] === "?" ) {
114121 return callback ( null , {
115122 resource
116123 } ) ;
124+ }
117125
118- this . resolvers . normal . resolve ( contextInfo , context , resource , ( err , resource , resourceResolveData ) => {
126+ normalResolver . resolve ( contextInfo , context , resource , ( err , resource , resourceResolveData ) => {
119127 if ( err ) return callback ( err ) ;
120128 callback ( null , {
121129 resourceResolveData,
@@ -179,19 +187,22 @@ class NormalModuleFactory extends Tapable {
179187 useLoadersPre . push ( r . value ) ;
180188 else if ( ! r . enforce && ! noAutoLoaders && ! noPrePostAutoLoaders )
181189 useLoaders . push ( r . value ) ;
190+ } else if ( typeof r . value === "object" && r . value !== null && typeof settings [ r . type ] === "object" && settings [ r . type ] !== null ) {
191+ settings [ r . type ] = cachedMerge ( settings [ r . type ] , r . value ) ;
182192 } else {
183193 settings [ r . type ] = r . value ;
184194 }
185195 } ) ;
186196 asyncLib . parallel ( [
187- this . resolveRequestArray . bind ( this , contextInfo , this . context , useLoadersPost , this . resolvers . loader ) ,
188- this . resolveRequestArray . bind ( this , contextInfo , this . context , useLoaders , this . resolvers . loader ) ,
189- this . resolveRequestArray . bind ( this , contextInfo , this . context , useLoadersPre , this . resolvers . loader )
197+ this . resolveRequestArray . bind ( this , contextInfo , this . context , useLoadersPost , loaderResolver ) ,
198+ this . resolveRequestArray . bind ( this , contextInfo , this . context , useLoaders , loaderResolver ) ,
199+ this . resolveRequestArray . bind ( this , contextInfo , this . context , useLoadersPre , loaderResolver )
190200 ] , ( err , results ) => {
191201 if ( err ) return callback ( err ) ;
192202 loaders = results [ 0 ] . concat ( loaders , results [ 1 ] , results [ 2 ] ) ;
193203 process . nextTick ( ( ) => {
194- const type = settings . type || this . getDefaultType ( resourcePath ) ;
204+ const type = settings . type ;
205+ const resolveOptions = settings . resolve ;
195206 callback ( null , {
196207 context : context ,
197208 request : loaders . map ( loaderToIdent ) . concat ( [ resource ] ) . join ( "!" ) ,
@@ -202,33 +213,26 @@ class NormalModuleFactory extends Tapable {
202213 resource,
203214 resourceResolveData,
204215 type,
205- parser : this . getParser ( type , settings . parser )
216+ parser : this . getParser ( type , settings . parser ) ,
217+ resolveOptions
206218 } ) ;
207219 } ) ;
208220 } ) ;
209221 } ) ;
210222 } ) ;
211223 }
212224
213- getDefaultType ( resourcePath ) {
214- if ( / \. w a s m $ / . test ( resourcePath ) )
215- return "webassembly/experimental" ;
216- if ( / \. m j s $ / . test ( resourcePath ) )
217- return "javascript/esm" ;
218- if ( / \. j s o n $ / . test ( resourcePath ) )
219- return "json" ;
220- return "javascript/auto" ;
221- }
222-
223225 create ( data , callback ) {
224226 const dependencies = data . dependencies ;
225227 const cacheEntry = dependencies [ 0 ] . __NormalModuleFactoryCache ;
226228 if ( cacheEntry ) return callback ( null , cacheEntry ) ;
227229 const context = data . context || this . context ;
230+ const resolveOptions = data . resolveOptions || EMPTY_RESOLVE_OPTIONS ;
228231 const request = dependencies [ 0 ] . request ;
229232 const contextInfo = data . contextInfo || { } ;
230233 this . applyPluginsAsyncWaterfall ( "before-resolve" , {
231234 contextInfo,
235+ resolveOptions,
232236 context,
233237 request,
234238 dependencies
@@ -307,6 +311,10 @@ class NormalModuleFactory extends Tapable {
307311 this . applyPlugins2 ( `parser ${ type } ` , parser , parserOptions ) ;
308312 return parser ;
309313 }
314+
315+ getResolver ( type , resolveOptions ) {
316+ return this . resolverFactory . get ( type , resolveOptions || EMPTY_RESOLVE_OPTIONS ) ;
317+ }
310318}
311319
312320module . exports = NormalModuleFactory ;
0 commit comments