@@ -14,6 +14,16 @@ var defaultIsFile = function isFile(file, cb) {
14
14
} ) ;
15
15
} ;
16
16
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
+
17
27
module . exports = function resolve ( x , options , callback ) {
18
28
var cb = callback ;
19
29
var opts = options || { } ;
@@ -29,6 +39,7 @@ module.exports = function resolve(x, options, callback) {
29
39
}
30
40
31
41
var isFile = opts . isFile || defaultIsFile ;
42
+ var isDirectory = opts . isDirectory || defaultIsDir ;
32
43
var readFile = opts . readFile || fs . readFile ;
33
44
34
45
var extensions = opts . extensions || [ '.js' ] ;
@@ -37,22 +48,35 @@ module.exports = function resolve(x, options, callback) {
37
48
38
49
opts . paths = opts . paths || [ ] ;
39
50
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
+ }
56
80
57
81
function onfile ( err , m , pkg ) {
58
82
if ( err ) cb ( err ) ;
0 commit comments