compiler: code cleanup

Refactor and simplify the internal method tryResolveAppPath.

Fix a bug in the resolver of middleware paths which was discovered
by the refactoring.
This commit is contained in:
Miroslav Bajtoš 2015-04-07 10:42:49 +02:00
parent 626200a098
commit 6526ffeb3d
1 changed files with 51 additions and 41 deletions

View File

@ -322,52 +322,61 @@ function tryResolveAppPath(rootDir, relativePath, resolveOptions) {
* does not enforce any such restriction when resolving the path */
resolveOptions = resolveOptions || { strict: false };
var isModuleRelative = false;
if (relativePath[0] === '/') {
fullPath = relativePath;
} else if (start === './' || start === '..' || !resolveOptions.strict) {
} else if (start === './' || start === '..') {
fullPath = path.resolve(rootDir, relativePath);
} else if (!resolveOptions.strict) {
isModuleRelative = true;
fullPath = path.resolve(rootDir, relativePath);
}
if (fullPath && fs.existsSync(fullPath))
return fullPath;
if (start !== './' && start !== '..') {
// Handle module-relative path, e.g. `loopback/common/models`
// Module.globalPaths is a list of globally configured paths like
// [ env.NODE_PATH values, $HOME/.node_modules, etc. ]
// Module._nodeModulePaths(rootDir) returns a list of paths like
// [ rootDir/node_modules, rootDir/../node_modules, etc. ]
var modulePaths = Module.globalPaths
.concat(Module._nodeModulePaths(rootDir));
fullPath = modulePaths
.map(function(candidateDir) {
try {
var filePath = path.join(candidateDir, relativePath);
filePath = require.resolve(filePath);
return filePath;
} catch (err) {
return filePath;
}
})
.filter(function(candidate) {
return fs.existsSync(candidate);
})
[0];
if (fullPath)
if (fullPath) {
// This check is needed to support paths pointing to a directory
if (fs.existsSync(fullPath)) {
return fullPath;
} else {
// Handle relative path, e.g. `./common/models`
}
try {
fullPath = require.resolve(fullPath);
return fullPath;
} catch (err) {
debug ('Skipping %s - %s', fullPath, err);
if (!isModuleRelative) {
debug ('Skipping %s - %s', fullPath, err);
return undefined;
}
}
}
// Handle module-relative path, e.g. `loopback/common/models`
// Module.globalPaths is a list of globally configured paths like
// [ env.NODE_PATH values, $HOME/.node_modules, etc. ]
// Module._nodeModulePaths(rootDir) returns a list of paths like
// [ rootDir/node_modules, rootDir/../node_modules, etc. ]
var modulePaths = Module.globalPaths
.concat(Module._nodeModulePaths(rootDir));
fullPath = modulePaths
.map(function(candidateDir) {
try {
var filePath = path.join(candidateDir, relativePath);
filePath = require.resolve(filePath);
return filePath;
} catch (err) {
return filePath;
}
})
.filter(function(candidate) {
return fs.existsSync(candidate);
})
[0];
if (fullPath)
return fullPath;
debug ('Skipping %s - module not found', fullPath);
return undefined;
}
@ -447,6 +456,7 @@ function resolveMiddlewarePath(rootDir, middleware) {
var pathName = segments[0];
var fragment = segments[1];
var middlewarePath = pathName;
var opts = { strict: true };
if (fragment) {
resolved.fragment = fragment;
@ -458,7 +468,7 @@ function resolveMiddlewarePath(rootDir, middleware) {
}
if (!fragment) {
resolved.sourceFile = resolveAppScriptPath(rootDir, middlewarePath);
resolved.sourceFile = resolveAppScriptPath(rootDir, middlewarePath, opts);
return resolved;
}
@ -468,7 +478,7 @@ function resolveMiddlewarePath(rootDir, middleware) {
// function
var m = require(pathName);
if (typeof m[fragment] === 'function') {
resolved.sourceFile = resolveAppScriptPath(rootDir, middlewarePath);
resolved.sourceFile = resolveAppScriptPath(rootDir, middlewarePath, opts);
return resolved;
}
@ -486,7 +496,7 @@ function resolveMiddlewarePath(rootDir, middleware) {
for (var ix in candidates) {
try {
resolved.sourceFile = resolveAppScriptPath(rootDir, candidates[ix]);
resolved.sourceFile = resolveAppScriptPath(rootDir, candidates[ix], opts);
delete resolved.fragment;
return resolved;
}
@ -516,7 +526,7 @@ function buildComponentInstructions(rootDir, componentConfig) {
.filter(function(name) { return !!componentConfig[name]; })
.map(function(name) {
return {
sourceFile: resolveAppScriptPath(rootDir, name, {'strict': true}),
sourceFile: resolveAppScriptPath(rootDir, name, { strict: true }),
config: componentConfig[name]
};
});
@ -547,7 +557,7 @@ function isPreferredExtension (filename) {
return (ext in includeExtensions) && !(ext in getExcludedExtensions());
}
function fixFileExtension (filepath, files, onlyScriptsExportingFunction) {
function fixFileExtension(filepath, files, onlyScriptsExportingFunction) {
var results = [];
var otherFile;
@ -578,10 +588,10 @@ function fixFileExtension (filepath, files, onlyScriptsExportingFunction) {
return (results.length > 0 ? results[0] : undefined);
}
function resolveAppScriptPath (rootDir, relativePath, resolveOptions) {
var resolvedPath = resolveAppPath (rootDir, relativePath, resolveOptions);
function resolveAppScriptPath(rootDir, relativePath, resolveOptions) {
var resolvedPath = resolveAppPath(rootDir, relativePath, resolveOptions);
var sourceDir = path.dirname(resolvedPath);
var files = tryReadDir(sourceDir);
var fixedFile = fixFileExtension (resolvedPath, files, false);
var fixedFile = fixFileExtension(resolvedPath, files, false);
return (fixedFile === undefined ? resolvedPath : fixedFile);
}