Resolve module paths as relative to appRootDir - for middleware
This commit is contained in:
parent
61798455f8
commit
3a7b9739d9
|
@ -266,7 +266,7 @@ function findModelDefinitions(rootDir, sources) {
|
|||
var registry = {};
|
||||
|
||||
sources.forEach(function(src) {
|
||||
var srcDir = resolveAppPath(rootDir, src);
|
||||
var srcDir = tryResolveAppPath(rootDir, src);
|
||||
if (!srcDir) {
|
||||
debug('Skipping unknown module source dir %j', src);
|
||||
return;
|
||||
|
@ -295,6 +295,16 @@ function findModelDefinitions(rootDir, sources) {
|
|||
}
|
||||
|
||||
function resolveAppPath(rootDir, relativePath) {
|
||||
var resolvedPath = tryResolveAppPath(rootDir, relativePath);
|
||||
if (resolvedPath === undefined) {
|
||||
var err = new Error('Cannot resolve path "' + relativePath + '"');
|
||||
err.code = 'PATH_NOT_FOUND';
|
||||
throw err;
|
||||
}
|
||||
return resolvedPath;
|
||||
}
|
||||
|
||||
function tryResolveAppPath(rootDir, relativePath) {
|
||||
var fullPath = path.resolve(rootDir, relativePath);
|
||||
if (fs.existsSync(fullPath))
|
||||
return fullPath;
|
||||
|
@ -429,6 +439,7 @@ function resolveMiddlewarePath(rootDir, middleware) {
|
|||
var segments = middleware.split('#');
|
||||
var pathName = segments[0];
|
||||
var fragment = segments[1];
|
||||
var middlewarePath = pathName;
|
||||
|
||||
if (fragment) {
|
||||
resolved.fragment = fragment;
|
||||
|
@ -440,7 +451,7 @@ function resolveMiddlewarePath(rootDir, middleware) {
|
|||
}
|
||||
|
||||
if (!fragment) {
|
||||
resolved.sourceFile = require.resolve(pathName);
|
||||
resolved.sourceFile = resolveAppPath(rootDir, middlewarePath);
|
||||
return resolved;
|
||||
}
|
||||
|
||||
|
@ -450,7 +461,7 @@ function resolveMiddlewarePath(rootDir, middleware) {
|
|||
// function
|
||||
var m = require(pathName);
|
||||
if (typeof m[fragment] === 'function') {
|
||||
resolved.sourceFile = require.resolve(pathName);
|
||||
resolved.sourceFile = resolveAppPath(rootDir, middlewarePath);
|
||||
return resolved;
|
||||
}
|
||||
|
||||
|
@ -468,7 +479,7 @@ function resolveMiddlewarePath(rootDir, middleware) {
|
|||
|
||||
for (var ix in candidates) {
|
||||
try {
|
||||
resolved.sourceFile = require.resolve(candidates[ix]);
|
||||
resolved.sourceFile = resolveAppPath(rootDir, candidates[ix]);
|
||||
delete resolved.fragment;
|
||||
return resolved;
|
||||
}
|
||||
|
@ -514,7 +525,7 @@ function buildComponentInstructions(rootDir, componentConfig) {
|
|||
|
||||
function resolveRelativePaths(relativePaths, appRootDir) {
|
||||
relativePaths.forEach(function(relativePath, k) {
|
||||
var resolvedPath = resolveAppPath(appRootDir, relativePath);
|
||||
var resolvedPath = tryResolveAppPath(appRootDir, relativePath);
|
||||
if (resolvedPath !== undefined) {
|
||||
relativePaths[k] = resolvedPath;
|
||||
} else {
|
||||
|
|
|
@ -858,10 +858,11 @@ describe('compiler', function() {
|
|||
});
|
||||
|
||||
it('resolves paths relatively to appRootDir', function() {
|
||||
appdir.writeFileSync('my-middleware.js', '');
|
||||
appdir.writeConfigFileSync('./middleware.json', {
|
||||
routes: {
|
||||
// resolves to ./middleware.json
|
||||
'./middleware': { }
|
||||
// resolves to ./my-middleware.js
|
||||
'./my-middleware': { }
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -870,7 +871,7 @@ describe('compiler', function() {
|
|||
expect(instructions.middleware).to.eql({
|
||||
phases: ['routes'],
|
||||
middleware: [{
|
||||
sourceFile: path.resolve(appdir.PATH, 'middleware.json'),
|
||||
sourceFile: path.resolve(appdir.PATH, 'my-middleware.js'),
|
||||
config: { phase: 'routes' }
|
||||
}]
|
||||
});
|
||||
|
@ -959,10 +960,10 @@ describe('compiler', function() {
|
|||
});
|
||||
|
||||
it('supports multiple instances of the same middleware', function() {
|
||||
|
||||
appdir.writeFileSync('my-middleware.js', '');
|
||||
appdir.writeConfigFileSync('middleware.json', {
|
||||
'final': {
|
||||
'./middleware': [
|
||||
'./my-middleware': [
|
||||
{
|
||||
params: 'first'
|
||||
},
|
||||
|
@ -978,14 +979,14 @@ describe('compiler', function() {
|
|||
expect(instructions.middleware.middleware)
|
||||
.to.eql([
|
||||
{
|
||||
sourceFile: path.resolve(appdir.PATH, 'middleware.json'),
|
||||
sourceFile: path.resolve(appdir.PATH, 'my-middleware.js'),
|
||||
config: {
|
||||
phase: 'final',
|
||||
params: 'first'
|
||||
}
|
||||
},
|
||||
{
|
||||
sourceFile: path.resolve(appdir.PATH, 'middleware.json'),
|
||||
sourceFile: path.resolve(appdir.PATH, 'my-middleware.js'),
|
||||
config: {
|
||||
phase: 'final',
|
||||
params: 'second'
|
||||
|
@ -1043,27 +1044,58 @@ describe('compiler', function() {
|
|||
'errorHandler');
|
||||
});
|
||||
|
||||
// FIXME: [rfeng] The following test is disabled until
|
||||
// https://github.com/strongloop/loopback-boot/issues/73 is fixed
|
||||
it.skip('resolves modules relative to appRootDir', function() {
|
||||
var HANDLER_FILE = 'node_modules/handler/index.js';
|
||||
appdir.writeFileSync(
|
||||
HANDLER_FILE,
|
||||
'module.exports = function(req, res, next) { next(); }');
|
||||
it('resolves modules relative to appRootDir', function() {
|
||||
var HANDLER_FILE = 'node_modules/handler/index.js';
|
||||
appdir.writeFileSync(
|
||||
HANDLER_FILE,
|
||||
'module.exports = function(req, res, next) { next(); }');
|
||||
|
||||
appdir.writeConfigFileSync('middleware.json', {
|
||||
'initial': {
|
||||
'handler': {}
|
||||
}
|
||||
});
|
||||
|
||||
var instructions = boot.compile(appdir.PATH);
|
||||
|
||||
expect(instructions.middleware.middleware[0]).have.property(
|
||||
'sourceFile',
|
||||
appdir.resolve(HANDLER_FILE));
|
||||
appdir.writeConfigFileSync('middleware.json', {
|
||||
'initial': {
|
||||
'handler': {}
|
||||
}
|
||||
});
|
||||
|
||||
var instructions = boot.compile(appdir.PATH);
|
||||
|
||||
expect(instructions.middleware.middleware[0]).have.property(
|
||||
'sourceFile',
|
||||
appdir.resolve(HANDLER_FILE));
|
||||
});
|
||||
|
||||
it('prefers appRootDir over node_modules for middleware', function() {
|
||||
var appJS = appdir.writeFileSync('./my-middleware.js', '');
|
||||
appdir.writeFileSync('node_modules/my-middleware.js', '');
|
||||
appdir.writeConfigFileSync('middleware.json', {
|
||||
'routes': {
|
||||
'./my-middleware': {}
|
||||
}
|
||||
});
|
||||
|
||||
var instructions = boot.compile(appdir.PATH);
|
||||
|
||||
expect(instructions.middleware.middleware).to.have.length(1);
|
||||
expect(instructions.middleware.middleware[0]).have.property(
|
||||
'sourceFile', appJS);
|
||||
});
|
||||
|
||||
it('does not treat module relative path as `appRootDir` relative',
|
||||
function() {
|
||||
appdir.writeFileSync('./my-middleware.js', '');
|
||||
var moduleJS = appdir.writeFileSync('node_modules/my-middleware.js', '');
|
||||
appdir.writeConfigFileSync('middleware.json', {
|
||||
'routes': {
|
||||
'my-middleware': {}
|
||||
}
|
||||
});
|
||||
|
||||
var instructions = boot.compile(appdir.PATH);
|
||||
|
||||
expect(instructions.middleware.middleware).to.have.length(1);
|
||||
expect(instructions.middleware.middleware[0]).have.property(
|
||||
'sourceFile', moduleJS);
|
||||
});
|
||||
|
||||
describe('config with relative paths in params', function() {
|
||||
var RELATIVE_PATH_PARAMS = [
|
||||
'$!./here',
|
||||
|
|
Loading…
Reference in New Issue