@@ -61,11 +61,17 @@ module.exports = function resolve(x, options, callback) {
6161 var res ;
6262 function validBasedir ( ) {
6363 if ( / ^ (?: \. \. ? (?: \/ | $ ) | \/ | ( [ A - Z a - z ] : ) ? [ / \\ ] ) / . test ( x ) ) {
64- res = path . resolve ( basedir , x ) ;
64+ res = path . normalize ( path . join ( basedir , x ) ) ;
6565 if ( x === '..' || x . slice ( - 1 ) === '/' ) res += '/' ;
6666 if ( / \/ $ / . test ( x ) && res === basedir ) {
6767 loadAsDirectory ( res , opts . package , onfile ) ;
68- } else loadAsFile ( res , opts . package , onfile ) ;
68+ } else {
69+ isFileWithExtensions ( res , function ( err , resIsFile ) {
70+ if ( err ) { return onfile ( err ) ; }
71+ if ( resIsFile ) { return loadAsFile ( res , opts . package , onfile ) ; }
72+ return loadAsDirectory ( res , opts . package , onfile ) ;
73+ } ) ;
74+ }
6975 } else loadNodeModules ( x , basedir , function ( err , n , pkg ) {
7076 if ( err ) cb ( err ) ;
7177 else if ( core [ x ] ) return cb ( null , x ) ;
@@ -78,6 +84,27 @@ module.exports = function resolve(x, options, callback) {
7884 } ) ;
7985 }
8086
87+ function isFileWithExtensions ( file , cb , extensionIndex ) {
88+ var newExtensionIndex = 0 ;
89+ var filename = file ;
90+ if ( typeof extensionIndex === 'number' ) {
91+ if ( extensionIndex >= extensions . length ) {
92+ return cb ( null , false ) ;
93+ }
94+
95+ newExtensionIndex = extensionIndex + 1 ;
96+ filename = file + extensions [ extensionIndex ] ;
97+ }
98+
99+ isFile ( filename , function ( err , filenameIsFile ) {
100+ if ( err ) { return cb ( err ) ; }
101+ if ( filenameIsFile ) {
102+ return cb ( null , filenameIsFile ) ;
103+ }
104+ isFileWithExtensions ( file , cb , newExtensionIndex ) ;
105+ } ) ;
106+ }
107+
81108 function onfile ( err , m , pkg ) {
82109 if ( err ) cb ( err ) ;
83110 else if ( m ) cb ( null , m , pkg ) ;
0 commit comments