@@ -14,6 +14,16 @@ var defaultIsFile = function isFile(file, cb) {
1414 } ) ;
1515} ;
1616
17+ var defaultIsDir = function isDirectory ( dir , cb ) {
18+ fs . stat ( dir , function ( err , stat ) {
19+ if ( ! err ) {
20+ return cb ( null , stat . isDirectory ( ) ) ;
21+ }
22+ if ( err . code === 'ENOENT' || err . code === 'ENOTDIR' ) return cb ( null , false ) ;
23+ return cb ( err ) ;
24+ } ) ;
25+ } ;
26+
1727module . exports = function resolve ( x , options , callback ) {
1828 var cb = callback ;
1929 var opts = options || { } ;
@@ -29,6 +39,7 @@ module.exports = function resolve(x, options, callback) {
2939 }
3040
3141 var isFile = opts . isFile || defaultIsFile ;
42+ var isDirectory = opts . isDirectory || defaultIsDir ;
3243 var readFile = opts . readFile || fs . readFile ;
3344
3445 var extensions = opts . extensions || [ '.js' ] ;
@@ -37,22 +48,35 @@ module.exports = function resolve(x, options, callback) {
3748
3849 opts . paths = opts . paths || [ ] ;
3950
40- if ( / ^ (?: \. \. ? (?: \/ | $ ) | \/ | ( [ A - Z a - z ] : ) ? [ / \\ ] ) / . test ( x ) ) {
41- var res = path . resolve ( parent , x ) ;
42- if ( x === '..' || x . slice ( - 1 ) === '/' ) res += '/' ;
43- if ( / \/ $ / . test ( x ) && res === parent ) {
44- loadAsDirectory ( res , opts . package , onfile ) ;
45- } else loadAsFile ( res , opts . package , onfile ) ;
46- } else loadNodeModules ( x , parent , function ( err , n , pkg ) {
47- if ( err ) cb ( err ) ;
48- else if ( core [ x ] ) return cb ( null , x ) ;
49- else if ( n ) return cb ( null , n , pkg ) ;
50- else {
51- var moduleError = new Error ( "Cannot find module '" + x + "' from '" + parent + "'" ) ;
52- moduleError . code = 'MODULE_NOT_FOUND' ;
53- cb ( moduleError ) ;
54- }
55- } ) ;
51+ if ( opts . basedir ) {
52+ var basedirError = new TypeError ( 'Provided basedir "' + opts . basedir + '" is not a directory' ) ;
53+ isDirectory ( opts . basedir , function ( err , result ) {
54+ if ( err ) return cb ( err ) ;
55+ if ( ! result ) { return cb ( basedirError ) ; }
56+ validBasedir ( ) ;
57+ } ) ;
58+ } else {
59+ validBasedir ( ) ;
60+ }
61+ var res ;
62+ function validBasedir ( ) {
63+ if ( / ^ (?: \. \. ? (?: \/ | $ ) | \/ | ( [ A - Z a - z ] : ) ? [ / \\ ] ) / . test ( x ) ) {
64+ res = path . resolve ( parent , x ) ;
65+ if ( x === '..' || x . slice ( - 1 ) === '/' ) res += '/' ;
66+ if ( / \/ $ / . test ( x ) && res === parent ) {
67+ loadAsDirectory ( res , opts . package , onfile ) ;
68+ } else loadAsFile ( res , opts . package , onfile ) ;
69+ } else loadNodeModules ( x , parent , function ( err , n , pkg ) {
70+ if ( err ) cb ( err ) ;
71+ else if ( core [ x ] ) return cb ( null , x ) ;
72+ else if ( n ) return cb ( null , n , pkg ) ;
73+ else {
74+ var moduleError = new Error ( "Cannot find module '" + x + "' from '" + parent + "'" ) ;
75+ moduleError . code = 'MODULE_NOT_FOUND' ;
76+ cb ( moduleError ) ;
77+ }
78+ } ) ;
79+ }
5680
5781 function onfile ( err , m , pkg ) {
5882 if ( err ) cb ( err ) ;
0 commit comments