@@ -7,15 +7,25 @@ var async = require("async");
77var Tapable = require ( "tapable" ) ;
88var NormalModule = require ( "./NormalModule" ) ;
99var RawModule = require ( "./RawModule" ) ;
10- var LoadersList = require ( "./LoadersList" ) ;
1110var Parser = require ( "./Parser" ) ;
11+ var RuleSet = require ( "./RuleSet" ) ;
12+
13+ function loaderToIdent ( data ) {
14+ if ( ! data . options )
15+ return data . loader ;
16+ if ( typeof data . options === "string" )
17+ return data . loader + "?" + data . options ;
18+ if ( typeof data . options !== "object" )
19+ throw new Error ( "loader options must be string or object" ) ;
20+ if ( data . options . ident )
21+ return data . loader + "??" + data . options . ident ;
22+ return data . loader + "?" + JSON . stringify ( data . options ) ;
23+ }
1224
1325function NormalModuleFactory ( context , resolvers , options ) {
1426 Tapable . call ( this ) ;
1527 this . resolvers = resolvers ;
16- this . loaders = new LoadersList ( options . loaders ) ;
17- this . preLoaders = new LoadersList ( options . preLoaders ) ;
18- this . postLoaders = new LoadersList ( options . postLoaders ) ;
28+ this . ruleSet = new RuleSet ( options . rules || options . loaders ) ;
1929 this . context = context || "" ;
2030 this . parserCache = { } ;
2131 this . plugin ( "factory" , function ( ) {
@@ -78,6 +88,18 @@ function NormalModuleFactory(context, resolvers, options) {
7888 var noPostAutoLoaders = / ^ - ! / . test ( request ) ;
7989 var elements = request . replace ( / ^ - ? ! + / , "" ) . replace ( / ! ! + / g, "!" ) . split ( "!" ) ;
8090 var resource = elements . pop ( ) ;
91+ elements = elements . map ( function ( element ) {
92+ var idx = element . indexOf ( "?" ) ;
93+ var options ;
94+ if ( idx >= 0 ) {
95+ options = element . substr ( idx + 1 ) ;
96+ element = element . substr ( 0 , idx ) ;
97+ }
98+ return {
99+ loader : element ,
100+ options : options
101+ } ;
102+ } ) ;
81103
82104 async . parallel ( [
83105 function ( callback ) {
@@ -102,46 +124,53 @@ function NormalModuleFactory(context, resolvers, options) {
102124 "ignored " + context + " " + request ,
103125 request + " (ignored)" ) ) ; // ignored
104126
105- var userRequest = loaders . concat ( [ resource ] ) . join ( "!" ) ;
127+ var userRequest = loaders . map ( loaderToIdent ) . concat ( [ resource ] ) . join ( "!" ) ;
106128
107129 var resourcePath = resource ;
108130 var queryIndex = resourcePath . indexOf ( "?" ) ;
109131 if ( queryIndex >= 0 )
110132 resourcePath = resourcePath . substr ( 0 , queryIndex ) ;
111133
112- if ( noPrePostAutoLoaders )
113- return onDoneResolving ( ) ;
114- if ( noAutoLoaders ) {
115- async . parallel ( [
116- _this . resolveRequestArray . bind ( _this , contextInfo , _this . context , noPostAutoLoaders ? [ ] : _this . postLoaders . match ( resourcePath ) , _this . resolvers . loader ) ,
117- _this . resolveRequestArray . bind ( _this , contextInfo , _this . context , _this . preLoaders . match ( resourcePath ) , _this . resolvers . loader )
118- ] , function ( err , results ) {
119- if ( err ) return callback ( err ) ;
120- loaders = results [ 0 ] . concat ( loaders ) . concat ( results [ 1 ] ) ;
121- onDoneResolving ( ) ;
122- } ) ;
123- } else {
124- async . parallel ( [
125- _this . resolveRequestArray . bind ( _this , contextInfo , _this . context , noPostAutoLoaders ? [ ] : _this . postLoaders . match ( resourcePath ) , _this . resolvers . loader ) ,
126- _this . resolveRequestArray . bind ( _this , contextInfo , _this . context , _this . loaders . match ( resourcePath ) , _this . resolvers . loader ) ,
127- _this . resolveRequestArray . bind ( _this , contextInfo , _this . context , _this . preLoaders . match ( resourcePath ) , _this . resolvers . loader )
128- ] , function ( err , results ) {
129- if ( err ) return callback ( err ) ;
130- loaders = results [ 0 ] . concat ( loaders ) . concat ( results [ 1 ] ) . concat ( results [ 2 ] ) ;
131- onDoneResolving ( ) ;
132- } ) ;
133- }
134+ var result = _this . ruleSet . exec ( {
135+ resource : resourcePath ,
136+ issuer : contextInfo . issuer
137+ } ) ;
138+ var settings = { } ;
139+ var useLoadersRight = [ ] ; // ex post loaders
140+ var useLoaders = [ ] ; // ex loaders
141+ var useLoadersLeft = [ ] ; // ex pre loaders
142+ result . forEach ( function ( r ) {
143+ if ( r . type === "use" ) {
144+ if ( r . enforce === "right" && ! noPostAutoLoaders && ! noPrePostAutoLoaders )
145+ useLoadersRight . push ( r . value ) ;
146+ else if ( r . enforce === "left" && ! noPrePostAutoLoaders )
147+ useLoadersLeft . push ( r . value ) ;
148+ else if ( ! r . enforce && ! noAutoLoaders && ! noPrePostAutoLoaders )
149+ useLoaders . push ( r . value ) ;
150+ } else {
151+ settings [ r . type ] = r . value ;
152+ }
153+ } ) ;
154+ async . parallel ( [
155+ _this . resolveRequestArray . bind ( _this , contextInfo , _this . context , useLoadersLeft , _this . resolvers . loader ) ,
156+ _this . resolveRequestArray . bind ( _this , contextInfo , _this . context , useLoaders , _this . resolvers . loader ) ,
157+ _this . resolveRequestArray . bind ( _this , contextInfo , _this . context , useLoadersRight , _this . resolvers . loader )
158+ ] , function ( err , results ) {
159+ if ( err ) return callback ( err ) ;
160+ loaders = results [ 0 ] . concat ( loaders ) . concat ( results [ 1 ] ) . concat ( results [ 2 ] ) ;
161+ onDoneResolving ( ) ;
162+ } ) ;
134163
135164 function onDoneResolving ( ) {
136165 callback ( null , {
137166 context : context ,
138- request : loaders . concat ( [ resource ] ) . join ( "!" ) ,
167+ request : loaders . map ( loaderToIdent ) . concat ( [ resource ] ) . join ( "!" ) ,
139168 dependencies : data . dependencies ,
140169 userRequest : userRequest ,
141170 rawRequest : request ,
142171 loaders : loaders ,
143172 resource : resource ,
144- parser : _this . getParser ( null )
173+ parser : _this . getParser ( settings . parser )
145174 } ) ;
146175 }
147176 } ) ;
@@ -183,9 +212,12 @@ NormalModuleFactory.prototype.create = function(data, callback) {
183212NormalModuleFactory . prototype . resolveRequestArray = function resolveRequestArray ( contextInfo , context , array , resolver , callback ) {
184213 if ( array . length === 0 ) return callback ( null , [ ] ) ;
185214 async . map ( array , function ( item , callback ) {
186- if ( item === "" || item [ 0 ] === "?" )
187- return callback ( null , item ) ;
188- resolver . resolve ( contextInfo , context , item , callback ) ;
215+ resolver . resolve ( contextInfo , context , item . loader , function ( err , result ) {
216+ if ( err ) return callback ( err ) ;
217+ return callback ( null , Object . assign ( { } , item , {
218+ loader : result
219+ } ) ) ;
220+ } ) ;
189221 } , callback ) ;
190222} ;
191223
0 commit comments