diff --git a/cli.js b/cli.js index c028be3d..34c61f2e 100644 --- a/cli.js +++ b/cli.js @@ -314,11 +314,17 @@ function resolvePluginPaths(paths) { paths.forEach(function(plugin) { var basename = path.basename(plugin); var dirname = path.dirname(plugin); - var pluginPath = path.getResourcePath(dirname); + // convoluted way to detect the correct path for the plugins; done this round-about way to cope + // with scenarios where JSDoc is executed in another project's working directory where that + // project has plugins of itself in a similar directory structure (plugins/*) + var pluginPath = path.getResourcePath(dirname, basename + ".js"); if (!pluginPath) { logger.error('Unable to find the plugin "%s"', plugin); return; + } else { + // correct the path to the plugin: + pluginPath = path.dirname(pluginPath); } pluginPaths.push( path.join(pluginPath, basename) ); @@ -410,7 +416,18 @@ cli.generateDocs = function() { env.opts.template = (function() { var publish = env.opts.template || 'templates/default'; - var templatePath = path.getResourcePath(publish); + // convoluted way to detect the correct path for the templates; done this round-about way to cope + // with scenarios where JSDoc is executed in another project's working directory where that + // project has templates of itself in a similar directory structure (templates//) + var templatePath = path.getResourcePath(publish, "publish.js"); + + if (!templatePath) { + logger.error('Unable to find the template "%s"', publish); + return publish; + } else { + // correct the path to the template: + templatePath = path.dirname(templatePath); + } // if we didn't find the template, keep the user-specified value so the error message is // useful diff --git a/lib/jsdoc/path.js b/lib/jsdoc/path.js index ebfffd6f..ebf7dcb6 100644 --- a/lib/jsdoc/path.js +++ b/lib/jsdoc/path.js @@ -111,11 +111,25 @@ exports.getResourcePath = function(filepath, filename) { return true; } + function fileExists(_path) { + // see also: + // - http://stackoverflow.com/questions/4482686/check-synchronously-if-file-directory-exists-in-node-js + // - https://nodejs.org/api/fs.html#fs_fs_existssync_path + try { + var stats = fs.lstatSync(_path); + + return stats.isFile(); + } + catch (e) { + return false; + } + } + // absolute paths are normalized by path.resolve on the first pass [path.dirname(env.opts.configure || ''), env.pwd, env.dirname].forEach(function(_path) { if (!result && _path) { _path = path.resolve(_path, filepath); - if ( pathExists(_path) ) { + if ( pathExists(_path) && (filename ? fileExists(path.join(_path, filename)) : true)) { result = _path; } }