@@ -36,6 +36,14 @@ var maybeUnwrapSymlink = function maybeUnwrapSymlink(x, opts, cb) {
3636 }
3737} ;
3838
39+ var getPackageCandidates = function getPackageCandidates ( x , start , opts ) {
40+ var dirs = nodeModulesPaths ( start , opts , x ) ;
41+ for ( var i = 0 ; i < dirs . length ; i ++ ) {
42+ dirs [ i ] = path . join ( dirs [ i ] , x ) ;
43+ }
44+ return dirs ;
45+ } ;
46+
3947module . exports = function resolve ( x , options , callback ) {
4048 var cb = callback ;
4149 var opts = options ;
@@ -55,6 +63,7 @@ module.exports = function resolve(x, options, callback) {
5563 var isFile = opts . isFile || defaultIsFile ;
5664 var isDirectory = opts . isDirectory || defaultIsDir ;
5765 var readFile = opts . readFile || fs . readFile ;
66+ var packageIterator = opts . packageIterator ;
5867
5968 var extensions = opts . extensions || [ '.js' ] ;
6069 var basedir = opts . basedir || path . dirname ( caller ( ) ) ;
@@ -261,31 +270,35 @@ module.exports = function resolve(x, options, callback) {
261270 }
262271
263272 function processDirs ( cb , dirs ) {
264- if ( dirs . length === 0 ) return cb ( null , undefined ) ;
265- var dir = dirs [ 0 ] ;
273+ iterate ( 0 ) ;
266274
267- isDirectory ( dir , isdir ) ;
275+ function iterate ( i ) {
276+ if ( i === dirs . length ) return cb ( null , undefined ) ;
277+ var dir = dirs [ i ] ;
268278
269- function isdir ( err , isdir ) {
270- if ( err ) return cb ( err ) ;
271- if ( ! isdir ) return processDirs ( cb , dirs . slice ( 1 ) ) ;
272- var file = path . join ( dir , x ) ;
273- loadAsFile ( file , opts . package , onfile ) ;
274- }
279+ isDirectory ( path . dirname ( dir ) , function ( err , status ) {
280+ if ( err ) return cb ( err ) ;
281+ if ( ! status ) return iterate ( i + 1 ) ;
275282
276- function onfile ( err , m , pkg ) {
277- if ( err ) return cb ( err ) ;
278- if ( m ) return cb ( null , m , pkg ) ;
279- loadAsDirectory ( path . join ( dir , x ) , opts . package , ondir ) ;
280- }
283+ loadAsFile ( dir , opts . package , function ( err , m , pkg ) {
284+ if ( err ) return cb ( err ) ;
285+ if ( m ) return cb ( null , m , pkg ) ;
286+
287+ loadAsDirectory ( dir , opts . package , function ( err , n , pkg ) {
288+ if ( err ) return cb ( err ) ;
289+ if ( n ) return cb ( null , n , pkg ) ;
281290
282- function ondir ( err , n , pkg ) {
283- if ( err ) return cb ( err ) ;
284- if ( n ) return cb ( null , n , pkg ) ;
285- processDirs ( cb , dirs . slice ( 1 ) ) ;
291+ iterate ( i + 1 ) ;
292+ } ) ;
293+ } ) ;
294+ } ) ;
286295 }
287296 }
288297 function loadNodeModules ( x , start , cb ) {
289- processDirs ( cb , nodeModulesPaths ( start , opts , x ) ) ;
298+ var thunk = function ( ) { return getPackageCandidates ( x , start , opts ) ; } ;
299+ processDirs (
300+ cb ,
301+ packageIterator ? packageIterator ( x , start , thunk , opts ) : thunk ( )
302+ ) ;
290303 }
291304} ;
0 commit comments