@ -97,27 +97,32 @@ function readPackage(requestPath) {
return pkg ;
}
function tryPackage ( requestPath , exts ) {
function tryPackage ( requestPath , exts , isMain ) {
var pkg = readPackage ( requestPath ) ;
if ( ! pkg ) return false ;
var filename = path . resolve ( requestPath , pkg ) ;
return tryFile ( filename ) ||
tryExtensions ( filename , exts ) ||
tryExtensions ( path . resolve ( filename , 'index' ) , exts ) ;
return tryFile ( filename , isMain ) ||
tryExtensions ( filename , exts , isMain ) ||
tryExtensions ( path . resolve ( filename , 'index' ) , exts , isMain ) ;
}
// check if the file exists and is not a directory
function tryFile ( requestPath ) {
// resolve to the absolute realpath if running main module,
// otherwise resolve to absolute while keeping symlinks intact.
function tryFile ( requestPath , isMain ) {
const rc = stat ( requestPath ) ;
return rc === 0 && fs . realpathSync ( requestPath ) ;
if ( isMain ) {
return rc === 0 && fs . realpathSync ( requestPath ) ;
}
return rc === 0 && path . resolve ( requestPath ) ;
}
// given a path check a the file exists with any of the set extensions
function tryExtensions ( p , exts ) {
function tryExtensions ( p , exts , isMain ) {
for ( var i = 0 ; i < exts . length ; i ++ ) {
const filename = tryFile ( p + exts [ i ] ) ;
const filename = tryFile ( p + exts [ i ] , isMain ) ;
if ( filename ) {
return filename ;
@ -127,7 +132,7 @@ function tryExtensions(p, exts) {
}
var warned = false ;
Module . _ findPath = function ( request , paths ) {
Module . _ findPath = function ( request , paths , isMain ) {
if ( path . isAbsolute ( request ) ) {
paths = [ '' ] ;
} else if ( ! paths || paths . length === 0 ) {
@ -154,32 +159,36 @@ Module._findPath = function(request, paths) {
if ( ! trailingSlash ) {
const rc = stat ( basePath ) ;
if ( rc === 0 ) { // File.
filename = fs . realpathSync ( basePath ) ;
if ( ! isMain ) {
filename = path . resolve ( basePath ) ;
} else {
filename = fs . realpathSync ( basePath ) ;
}
} else if ( rc === 1 ) { // Directory.
if ( exts === undefined )
exts = Object . keys ( Module . _ extensions ) ;
filename = tryPackage ( basePath , exts ) ;
filename = tryPackage ( basePath , exts , isMain ) ;
}
if ( ! filename ) {
// try it with each of the extensions
if ( exts === undefined )
exts = Object . keys ( Module . _ extensions ) ;
filename = tryExtensions ( basePath , exts ) ;
filename = tryExtensions ( basePath , exts , isMain ) ;
}
}
if ( ! filename ) {
if ( exts === undefined )
exts = Object . keys ( Module . _ extensions ) ;
filename = tryPackage ( basePath , exts ) ;
filename = tryPackage ( basePath , exts , isMain ) ;
}
if ( ! filename ) {
// try it with each of the extensions at "index"
if ( exts === undefined )
exts = Object . keys ( Module . _ extensions ) ;
filename = tryExtensions ( path . resolve ( basePath , 'index' ) , exts ) ;
filename = tryExtensions ( path . resolve ( basePath , 'index' ) , exts , isMain ) ;
}
if ( filename ) {
@ -374,7 +383,7 @@ Module._load = function(request, parent, isMain) {
debug ( 'Module._load REQUEST %s parent: %s' , request , parent . id ) ;
}
var filename = Module . _ resolveFilename ( request , parent ) ;
var filename = Module . _ resolveFilename ( request , parent , isMain ) ;
var cachedModule = Module . _ cache [ filename ] ;
if ( cachedModule ) {
@ -412,7 +421,7 @@ function tryModuleLoad(module, filename) {
}
}
Module . _ resolveFilename = function ( request , parent ) {
Module . _ resolveFilename = function ( request , parent , isMain ) {
if ( NativeModule . nonInternalExists ( request ) ) {
return request ;
}
@ -424,7 +433,7 @@ Module._resolveFilename = function(request, parent) {
// look up the filename first, since that's the cache key.
debug ( 'looking for %j in %j' , id , paths ) ;
var filename = Module . _ findPath ( request , paths ) ;
var filename = Module . _ findPath ( request , paths , isMain ) ;
if ( ! filename ) {
var err = new Error ( "Cannot find module '" + request + "'" ) ;
err . code = 'MODULE_NOT_FOUND' ;