@@ -77,108 +77,147 @@ function addModule(depTree, context, module, options, reason, callback) {
7777 reasons : [ reason ]
7878 } ;
7979 depTree . modulesById [ module . id ] = module ;
80- fs . readFile ( filename , "utf-8" , function ( err , source ) {
80+ var filenameWithLoaders = filename ;
81+ var loaders = filename . split ( / ! / g) ;
82+ filename = loaders . pop ( ) ;
83+ fs . readFile ( filename , "utf-8" , function ( err , content ) {
8184 if ( err ) {
8285 callback ( err ) ;
8386 return ;
8487 }
85- var deps ;
86- try {
87- deps = parse ( source , options . parse ) ;
88- } catch ( e ) {
89- callback ( "File \"" + filename + "\" parsing failed: " + e ) ;
90- return ;
88+ if ( loaders . length === 0 )
89+ processJs ( content ) ;
90+ else {
91+ var loaderFunctions = [ ] ;
92+ try {
93+ loaders . forEach ( function ( name ) {
94+ var loader = require ( name ) ;
95+ loaderFunctions . push ( loader ) ;
96+ } ) ;
97+ } catch ( e ) {
98+ callback ( e ) ;
99+ return ;
100+ }
101+ function nextLoader ( err , content ) {
102+ if ( err ) {
103+ callback ( err ) ;
104+ return ;
105+ }
106+ if ( loaderFunctions . length > 0 ) {
107+ try {
108+ loaderFunctions . pop ( ) ( [ content ] , {
109+ request : filenameWithLoaders ,
110+ filename : filename
111+ } , nextLoader ) ;
112+ } catch ( e ) {
113+ callback ( err ) ;
114+ return ;
115+ }
116+ } else {
117+ processJs ( content ) ;
118+ }
119+ }
120+ nextLoader ( null , content ) ;
91121 }
92- module . requires = deps . requires || [ ] ;
93- module . asyncs = deps . asyncs || [ ] ;
94- module . contexts = deps . contexts || [ ] ;
95- module . source = source ;
122+ function processJs ( source ) {
123+ var deps ;
124+ try {
125+ deps = parse ( source , options . parse ) ;
126+ } catch ( e ) {
127+ callback ( "File \"" + filenameWithLoaders + "\" parsing failed: " + e ) ;
128+ return ;
129+ }
130+ module . requires = deps . requires || [ ] ;
131+ module . asyncs = deps . asyncs || [ ] ;
132+ module . contexts = deps . contexts || [ ] ;
133+ module . source = source ;
96134
97- var requires = { } , directRequire = { } ;
98- var contexts = [ ] , directContexts = { } ;
99- function add ( r ) {
100- requires [ r . name ] = requires [ r . name ] || [ ] ;
101- requires [ r . name ] . push ( r ) ;
102- }
103- function addContext ( m ) {
104- return function ( c ) {
105- contexts . push ( { context : c , module : m } ) ;
135+ var requires = { } , directRequire = { } ;
136+ var contexts = [ ] , directContexts = { } ;
137+ function add ( r ) {
138+ requires [ r . name ] = requires [ r . name ] || [ ] ;
139+ requires [ r . name ] . push ( r ) ;
106140 }
107- }
108- if ( module . requires ) {
109- module . requires . forEach ( add ) ;
110- module . requires . forEach ( function ( r ) {
111- directRequire [ r . name ] = true ;
112- } ) ;
113- }
114- if ( module . contexts ) {
115- module . contexts . forEach ( addContext ( module ) ) ;
116- module . contexts . forEach ( function ( c ) {
117- directContexts [ c . name ] = true ;
118- } ) ;
119- }
120- if ( module . asyncs )
121- module . asyncs . forEach ( function addAsync ( c ) {
122- if ( c . requires )
123- c . requires . forEach ( add ) ;
124- if ( c . asyncs )
125- c . asyncs . forEach ( addAsync ) ;
126- if ( c . contexts )
127- c . contexts . forEach ( addContext ( c ) ) ;
128- } ) ;
129- requiresNames = Object . keys ( requires ) ;
130- var count = requiresNames . length + contexts . length + 1 ;
131- var errors = [ ] ;
132- if ( requiresNames . length )
133- requiresNames . forEach ( function ( moduleName ) {
134- var reason = {
135- type : directRequire [ moduleName ] ? "require" : "async require" ,
136- count : requires [ moduleName ] . length ,
137- filename : filename
138- } ;
139- addModule ( depTree , path . dirname ( filename ) , moduleName , options , reason , function ( err , moduleId ) {
140- if ( err ) {
141- depTree . warnings . push ( "Cannot find module '" + moduleName + "'\n " + err +
142- "\n @ " + filename + " (line " + requires [ moduleName ] [ 0 ] . line + ", column " + requires [ moduleName ] [ 0 ] . column + ")" ) ;
143- } else {
144- requires [ moduleName ] . forEach ( function ( requireItem ) {
145- requireItem . id = moduleId ;
146- } ) ;
141+ function addContext ( m ) {
142+ return function ( c ) {
143+ contexts . push ( { context : c , module : m } ) ;
144+ }
145+ }
146+ if ( module . requires ) {
147+ module . requires . forEach ( add ) ;
148+ module . requires . forEach ( function ( r ) {
149+ directRequire [ r . name ] = true ;
150+ } ) ;
151+ }
152+ if ( module . contexts ) {
153+ module . contexts . forEach ( addContext ( module ) ) ;
154+ module . contexts . forEach ( function ( c ) {
155+ directContexts [ c . name ] = true ;
156+ } ) ;
157+ }
158+ if ( module . asyncs )
159+ module . asyncs . forEach ( function addAsync ( c ) {
160+ if ( c . requires )
161+ c . requires . forEach ( add ) ;
162+ if ( c . asyncs )
163+ c . asyncs . forEach ( addAsync ) ;
164+ if ( c . contexts )
165+ c . contexts . forEach ( addContext ( c ) ) ;
166+ } ) ;
167+ requiresNames = Object . keys ( requires ) ;
168+ var count = requiresNames . length + contexts . length + 1 ;
169+ var errors = [ ] ;
170+ if ( requiresNames . length )
171+ requiresNames . forEach ( function ( moduleName ) {
172+ var reason = {
173+ type : directRequire [ moduleName ] ? "require" : "async require" ,
174+ count : requires [ moduleName ] . length ,
175+ filename : filename
176+ } ;
177+ addModule ( depTree , path . dirname ( filename ) , moduleName , options , reason , function ( err , moduleId ) {
178+ if ( err ) {
179+ depTree . warnings . push ( "Cannot find module '" + moduleName + "'\n " + err +
180+ "\n @ " + filename + " (line " + requires [ moduleName ] [ 0 ] . line + ", column " + requires [ moduleName ] [ 0 ] . column + ")" ) ;
181+ } else {
182+ requires [ moduleName ] . forEach ( function ( requireItem ) {
183+ requireItem . id = moduleId ;
184+ } ) ;
185+ }
186+ endOne ( ) ;
187+ } ) ;
188+ } ) ;
189+ if ( contexts ) {
190+ contexts . forEach ( function ( contextObj ) {
191+ var context = contextObj . context ;
192+ var module = contextObj . module ;
193+ var reason = {
194+ type : directContexts [ context . name ] ? "context" : "async context" ,
195+ filename : filename
196+ } ;
197+ addContextModule ( depTree , path . dirname ( filename ) , context . name , options , reason , function ( err , contextModuleId ) {
198+ if ( err ) {
199+ errors . push ( err + "\n @ " + filename + " (line " + context . line + ", column " + context . column + ")" ) ;
200+ } else {
201+ context . id = contextModuleId ;
202+ module . requires . push ( { id : context . id } ) ;
203+ }
204+ endOne ( ) ;
205+ } ) ;
206+ if ( context . warn ) {
207+ depTree . warnings . push ( filename + " (line " + context . line + ", column " + context . column + "): " +
208+ "implicit use of require.context(\".\") is not recommended." ) ;
147209 }
148- endOne ( ) ;
149210 } ) ;
150- } ) ;
151- if ( contexts ) {
152- contexts . forEach ( function ( contextObj ) {
153- var context = contextObj . context ;
154- var module = contextObj . module ;
155- var reason = {
156- type : directContexts [ context . name ] ? "context" : "async context" ,
157- filename : filename
158- } ;
159- addContextModule ( depTree , path . dirname ( filename ) , context . name , options , reason , function ( err , contextModuleId ) {
160- if ( err ) {
161- errors . push ( err + "\n @ " + filename + " (line " + context . line + ", column " + context . column + ")" ) ;
211+ }
212+ endOne ( ) ;
213+ function endOne ( ) {
214+ count -- ;
215+ if ( count === 0 ) {
216+ if ( errors . length ) {
217+ callback ( errors . join ( "\n" ) ) ;
162218 } else {
163- context . id = contextModuleId ;
164- module . requires . push ( { id : context . id } ) ;
219+ callback ( null , module . id ) ;
165220 }
166- endOne ( ) ;
167- } ) ;
168- if ( context . warn ) {
169- depTree . warnings . push ( filename + " (line " + context . line + ", column " + context . column + "): " +
170- "implicit use of require.context(\".\") is not recommended." ) ;
171- }
172- } ) ;
173- }
174- endOne ( ) ;
175- function endOne ( ) {
176- count -- ;
177- if ( count === 0 ) {
178- if ( errors . length ) {
179- callback ( errors . join ( "\n" ) ) ;
180- } else {
181- callback ( null , module . id ) ;
182221 }
183222 }
184223 }
0 commit comments