whistle
Version:
HTTP, HTTP2, HTTPS, Websocket debugging proxy
147 lines (130 loc) • 3.78 kB
JavaScript
var path = require('path');
var common = require('../util/common');
var config = require('../config');
var PLUGIN_DIR_RE = /[/\\]whistle\.[a-z\d_-]+[/\\]?$/;
var uniqueArr = function(list) {
var result = [];
list.forEach(function(item) {
if (result.indexOf(item) === -1) {
result.push(item);
}
});
return result;
};
var resolvePath = function (str) {
return path.resolve(str);
};
var prePlugins = (config.prePluginsPath || []).map(resolvePath);
var addon = (config.addon || []).map(resolvePath);
addon = addon.concat(addon.map(formatPath));
function addDebugPaths(plugins) {
if (config.debugMode) {
var cwd = process.cwd();
plugins.unshift(cwd);
config.projectPluginPaths = config.projectPluginPaths || [];
config.projectPluginPaths.push(cwd);
if (PLUGIN_DIR_RE.test(cwd)) {
plugins.unshift(cwd.replace(PLUGIN_DIR_RE, '/'));
}
}
}
var pluginPaths = config.pluginPaths;
if (pluginPaths) {
pluginPaths = pluginPaths.concat(pluginPaths.map(formatPath).concat(addon));
pluginPaths = prePlugins.concat(pluginPaths);
addDebugPaths(pluginPaths);
pluginPaths = uniqueArr(pluginPaths);
exports.getPaths = function () {
return pluginPaths;
};
return;
}
addon = prePlugins.concat(addon);
if (config.noGlobalPlugins) {
addDebugPaths(addon);
addon = uniqueArr(addon);
exports.getPaths = function () {
return addon;
};
return;
}
var env = process.env || {};
var execPath = process.execPath;
var isWin = process.platform === 'win32';
var paths = module.paths.map(formatPath);
var globalDir = formatPath(getGlobalDir());
var appDataDir = formatPath(env.APPDATA, 'npm');
var pluginsPath = formatPath(config.baseDir);
if (typeof execPath !== 'string') {
execPath = '';
}
paths = paths.filter(function (p) {
return p;
});
if (paths.indexOf(pluginsPath) == -1) {
paths.unshift(pluginsPath);
}
pluginsPath = formatPath(env.WHISTLE_PLUGINS_PATH);
if (pluginsPath && paths.indexOf(pluginsPath) == -1) {
paths.unshift(pluginsPath);
}
if (!config.customPluginPaths || !config.customPluginPaths.length) {
paths.unshift(config.CUSTOM_PLUGIN_PATH);
}
paths = addon.concat(paths);
addDebugPaths(paths);
var nvmBin = env.NVM_BIN;
if (nvmBin && typeof nvmBin === 'string') {
nvmBin = formatPath(path.join(nvmBin, '../lib'));
if (paths.indexOf(nvmBin) == -1) {
paths.push(nvmBin);
}
}
if (appDataDir && paths.indexOf(appDataDir) == -1) {
paths.push(appDataDir);
}
if (globalDir && paths.indexOf(globalDir) == -1) {
paths.push(globalDir);
}
if (env.PATH && typeof env.PATH === 'string') {
var list = env.PATH.trim().split(isWin ? ';' : ':');
['', '../', '../lib'].forEach(function (prefix) {
list.forEach(function (dir) {
dir = formatPath(dir, prefix);
addPluginPath(dir);
});
});
}
function addPluginPath(dir) {
dir && paths.indexOf(dir) == -1 && paths.push(dir);
}
function formatPath(dir, prefix) {
if (typeof dir !== 'string' || !(dir = dir.trim())) {
return null;
}
if (/(?:^|\/|\\)node_modules[\\\/]?$/.test(dir)) {
return common.formatPathSep(dir);
}
return common.formatPathSep(path.resolve(dir, typeof prefix === 'string' ? prefix : '', 'node_modules'));
}
function getGlobalDir() {
var globalPrefix;
if (env.PREFIX) {
globalPrefix = env.PREFIX;
} else if (isWin) {
globalPrefix = execPath && path.dirname(execPath);
} else {
globalPrefix = execPath && path.dirname(path.dirname(execPath));
if (env.DESTDIR && typeof env.DESTDIR === 'string') {
globalPrefix = path.join(env.DESTDIR, globalPrefix);
}
}
if (typeof globalPrefix !== 'string') {
return;
}
return formatPath(globalPrefix, isWin ? '' : 'lib');
}
paths = uniqueArr(paths);
exports.getPaths = function () {
return paths;
};