verdaccio
Version:
A lightweight private npm proxy registry
107 lines (105 loc) • 15.7 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _debug = _interopRequireDefault(require("debug"));
var _fs = _interopRequireDefault(require("fs"));
var _lodash = _interopRequireDefault(require("lodash"));
var _mkdirp = _interopRequireDefault(require("mkdirp"));
var _path = _interopRequireDefault(require("path"));
var _utils = require("./utils");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const debug = (0, _debug.default)('verdaccio:config');
const CONFIG_FILE = 'config.yaml';
const XDG = 'xdg';
const WIN = 'win';
const WIN32 = 'win32';
// eslint-disable-next-line
const pkgJSON = require('../../package.json');
/**
* Find and get the first config file that match.
* @return {String} the config file path
*/
function findConfigFile(configPath) {
if (typeof configPath !== 'undefined') {
return _path.default.resolve(configPath);
}
const configPaths = getConfigPaths();
debug('%o posible locations found', configPaths.length);
if (_lodash.default.isEmpty(configPaths)) {
throw new Error('no configuration files can be processed');
}
const primaryConf = _lodash.default.find(configPaths, configLocation => (0, _utils.fileExists)(configLocation.path));
if (typeof primaryConf !== 'undefined') {
debug('previous location exist already %s', primaryConf === null || primaryConf === void 0 ? void 0 : primaryConf.path);
return primaryConf.path;
}
return createConfigFile(_lodash.default.head(configPaths)).path;
}
function createConfigFile(configLocation) {
createConfigFolder(configLocation);
const defaultConfig = updateStorageLinks(configLocation, readDefaultConfig());
_fs.default.writeFileSync(configLocation.path, defaultConfig);
return configLocation;
}
function readDefaultConfig() {
return _fs.default.readFileSync(require.resolve('../../conf/default.yaml'), 'utf-8');
}
function createConfigFolder(configLocation) {
_mkdirp.default.sync(_path.default.dirname(configLocation.path));
}
function updateStorageLinks(configLocation, defaultConfig) {
if (configLocation.type !== XDG) {
return defaultConfig;
}
// $XDG_DATA_HOME defines the base directory relative to which user specific data files should be stored,
// If $XDG_DATA_HOME is either not set or empty, a default equal to $HOME/.local/share should be used.
let dataDir = process.env.XDG_DATA_HOME || _path.default.join(process.env.HOME, '.local', 'share');
if ((0, _utils.folderExists)(dataDir)) {
dataDir = _path.default.resolve(_path.default.join(dataDir, pkgJSON.name, 'storage'));
return defaultConfig.replace(/^storage: .\/storage$/m, `storage: ${dataDir}`);
}
return defaultConfig;
}
function getConfigPaths() {
const listPaths = [getXDGDirectory(), getWindowsDirectory(), getRelativeDefaultDirectory(), getOldDirectory()].reduce(function (acc, currentValue) {
if (_lodash.default.isUndefined(currentValue) === false) {
acc.push(currentValue);
}
return acc;
}, []);
return listPaths;
}
const getXDGDirectory = () => {
const XDGConfig = getXDGHome() || process.env.HOME && _path.default.join(process.env.HOME, '.config');
if (XDGConfig && (0, _utils.folderExists)(XDGConfig)) {
return {
path: _path.default.join(XDGConfig, pkgJSON.name, CONFIG_FILE),
type: XDG
};
}
};
const getXDGHome = () => process.env.XDG_CONFIG_HOME;
const getWindowsDirectory = () => {
if (process.platform === WIN32 && process.env.APPDATA && (0, _utils.folderExists)(process.env.APPDATA)) {
return {
path: _path.default.resolve(_path.default.join(process.env.APPDATA, pkgJSON.name, CONFIG_FILE)),
type: WIN
};
}
};
const getRelativeDefaultDirectory = () => {
return {
path: _path.default.resolve(_path.default.join('.', pkgJSON.name, CONFIG_FILE)),
type: 'def'
};
};
const getOldDirectory = () => {
return {
path: _path.default.resolve(_path.default.join('.', CONFIG_FILE)),
type: 'old'
};
};
var _default = exports.default = findConfigFile;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9mcyIsIl9sb2Rhc2giLCJfbWtkaXJwIiwiX3BhdGgiLCJfdXRpbHMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJkZWJ1ZyIsImJ1aWxkRGVidWciLCJDT05GSUdfRklMRSIsIlhERyIsIldJTiIsIldJTjMyIiwicGtnSlNPTiIsImZpbmRDb25maWdGaWxlIiwiY29uZmlnUGF0aCIsIlBhdGgiLCJyZXNvbHZlIiwiY29uZmlnUGF0aHMiLCJnZXRDb25maWdQYXRocyIsImxlbmd0aCIsIl8iLCJpc0VtcHR5IiwiRXJyb3IiLCJwcmltYXJ5Q29uZiIsImZpbmQiLCJjb25maWdMb2NhdGlvbiIsImZpbGVFeGlzdHMiLCJwYXRoIiwiY3JlYXRlQ29uZmlnRmlsZSIsImhlYWQiLCJjcmVhdGVDb25maWdGb2xkZXIiLCJkZWZhdWx0Q29uZmlnIiwidXBkYXRlU3RvcmFnZUxpbmtzIiwicmVhZERlZmF1bHRDb25maWciLCJmcyIsIndyaXRlRmlsZVN5bmMiLCJyZWFkRmlsZVN5bmMiLCJta2RpcnAiLCJzeW5jIiwiZGlybmFtZSIsInR5cGUiLCJkYXRhRGlyIiwicHJvY2VzcyIsImVudiIsIlhER19EQVRBX0hPTUUiLCJqb2luIiwiSE9NRSIsImZvbGRlckV4aXN0cyIsIm5hbWUiLCJyZXBsYWNlIiwibGlzdFBhdGhzIiwiZ2V0WERHRGlyZWN0b3J5IiwiZ2V0V2luZG93c0RpcmVjdG9yeSIsImdldFJlbGF0aXZlRGVmYXVsdERpcmVjdG9yeSIsImdldE9sZERpcmVjdG9yeSIsInJlZHVjZSIsImFjYyIsImN1cnJlbnRWYWx1ZSIsImlzVW5kZWZpbmVkIiwicHVzaCIsIlhER0NvbmZpZyIsImdldFhER0hvbWUiLCJYREdfQ09ORklHX0hPTUUiLCJwbGF0Zm9ybSIsIkFQUERBVEEiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NvbmZpZy1wYXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBidWlsZERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1rZGlycCBmcm9tICdta2RpcnAnO1xuaW1wb3J0IFBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGZpbGVFeGlzdHMsIGZvbGRlckV4aXN0cyB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBkZWJ1ZyA9IGJ1aWxkRGVidWcoJ3ZlcmRhY2Npbzpjb25maWcnKTtcblxuY29uc3QgQ09ORklHX0ZJTEUgPSAnY29uZmlnLnlhbWwnO1xuY29uc3QgWERHID0gJ3hkZyc7XG5jb25zdCBXSU4gPSAnd2luJztcbmNvbnN0IFdJTjMyID0gJ3dpbjMyJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuY29uc3QgcGtnSlNPTiA9IHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpO1xuXG5leHBvcnQgdHlwZSBTZXR1cERpcmVjdG9yeSA9IHtcbiAgcGF0aDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEZpbmQgYW5kIGdldCB0aGUgZmlyc3QgY29uZmlnIGZpbGUgdGhhdCBtYXRjaC5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGNvbmZpZyBmaWxlIHBhdGhcbiAqL1xuZnVuY3Rpb24gZmluZENvbmZpZ0ZpbGUoY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY29uZmlnUGF0aCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gUGF0aC5yZXNvbHZlKGNvbmZpZ1BhdGgpO1xuICB9XG5cbiAgY29uc3QgY29uZmlnUGF0aHM6IFNldHVwRGlyZWN0b3J5W10gPSBnZXRDb25maWdQYXRocygpO1xuICBkZWJ1ZygnJW8gcG9zaWJsZSBsb2NhdGlvbnMgZm91bmQnLCBjb25maWdQYXRocy5sZW5ndGgpO1xuICBpZiAoXy5pc0VtcHR5KGNvbmZpZ1BhdGhzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm8gY29uZmlndXJhdGlvbiBmaWxlcyBjYW4gYmUgcHJvY2Vzc2VkJyk7XG4gIH1cblxuICBjb25zdCBwcmltYXJ5Q29uZjogYW55ID0gXy5maW5kKGNvbmZpZ1BhdGhzLCAoY29uZmlnTG9jYXRpb246IGFueSkgPT5cbiAgICBmaWxlRXhpc3RzKGNvbmZpZ0xvY2F0aW9uLnBhdGgpXG4gICk7XG4gIGlmICh0eXBlb2YgcHJpbWFyeUNvbmYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGVidWcoJ3ByZXZpb3VzIGxvY2F0aW9uIGV4aXN0IGFscmVhZHkgJXMnLCBwcmltYXJ5Q29uZj8ucGF0aCk7XG4gICAgcmV0dXJuIHByaW1hcnlDb25mLnBhdGg7XG4gIH1cblxuICByZXR1cm4gY3JlYXRlQ29uZmlnRmlsZShfLmhlYWQoY29uZmlnUGF0aHMpKS5wYXRoO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb25maWdGaWxlKGNvbmZpZ0xvY2F0aW9uOiBhbnkpOiBTZXR1cERpcmVjdG9yeSB7XG4gIGNyZWF0ZUNvbmZpZ0ZvbGRlcihjb25maWdMb2NhdGlvbik7XG5cbiAgY29uc3QgZGVmYXVsdENvbmZpZyA9IHVwZGF0ZVN0b3JhZ2VMaW5rcyhjb25maWdMb2NhdGlvbiwgcmVhZERlZmF1bHRDb25maWcoKSk7XG5cbiAgZnMud3JpdGVGaWxlU3luYyhjb25maWdMb2NhdGlvbi5wYXRoLCBkZWZhdWx0Q29uZmlnKTtcblxuICByZXR1cm4gY29uZmlnTG9jYXRpb247XG59XG5cbmZ1bmN0aW9uIHJlYWREZWZhdWx0Q29uZmlnKCk6IHN0cmluZyB7XG4gIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocmVxdWlyZS5yZXNvbHZlKCcuLi8uLi9jb25mL2RlZmF1bHQueWFtbCcpLCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29uZmlnRm9sZGVyKGNvbmZpZ0xvY2F0aW9uKTogdm9pZCB7XG4gIG1rZGlycC5zeW5jKFBhdGguZGlybmFtZShjb25maWdMb2NhdGlvbi5wYXRoKSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN0b3JhZ2VMaW5rcyhjb25maWdMb2NhdGlvbiwgZGVmYXVsdENvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWdMb2NhdGlvbi50eXBlICE9PSBYREcpIHtcbiAgICByZXR1cm4gZGVmYXVsdENvbmZpZztcbiAgfVxuXG4gIC8vICRYREdfREFUQV9IT01FIGRlZmluZXMgdGhlIGJhc2UgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHdoaWNoIHVzZXIgc3BlY2lmaWMgZGF0YSBmaWxlcyBzaG91bGQgYmUgc3RvcmVkLFxuICAvLyBJZiAkWERHX0RBVEFfSE9NRSBpcyBlaXRoZXIgbm90IHNldCBvciBlbXB0eSwgYSBkZWZhdWx0IGVxdWFsIHRvICRIT01FLy5sb2NhbC9zaGFyZSBzaG91bGQgYmUgdXNlZC5cbiAgbGV0IGRhdGFEaXIgPVxuICAgIHByb2Nlc3MuZW52LlhER19EQVRBX0hPTUUgfHwgUGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUgYXMgc3RyaW5nLCAnLmxvY2FsJywgJ3NoYXJlJyk7XG4gIGlmIChmb2xkZXJFeGlzdHMoZGF0YURpcikpIHtcbiAgICBkYXRhRGlyID0gUGF0aC5yZXNvbHZlKFBhdGguam9pbihkYXRhRGlyLCBwa2dKU09OLm5hbWUsICdzdG9yYWdlJykpO1xuICAgIHJldHVybiBkZWZhdWx0Q29uZmlnLnJlcGxhY2UoL15zdG9yYWdlOiAuXFwvc3RvcmFnZSQvbSwgYHN0b3JhZ2U6ICR7ZGF0YURpcn1gKTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdENvbmZpZztcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZmlnUGF0aHMoKTogU2V0dXBEaXJlY3RvcnlbXSB7XG4gIGNvbnN0IGxpc3RQYXRoczogU2V0dXBEaXJlY3RvcnlbXSA9IFtcbiAgICBnZXRYREdEaXJlY3RvcnkoKSxcbiAgICBnZXRXaW5kb3dzRGlyZWN0b3J5KCksXG4gICAgZ2V0UmVsYXRpdmVEZWZhdWx0RGlyZWN0b3J5KCksXG4gICAgZ2V0T2xkRGlyZWN0b3J5KCksXG4gIF0ucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cnJlbnRWYWx1ZTogYW55KTogU2V0dXBEaXJlY3RvcnlbXSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoY3VycmVudFZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdIGFzIFNldHVwRGlyZWN0b3J5W10pO1xuXG4gIHJldHVybiBsaXN0UGF0aHM7XG59XG5cbmNvbnN0IGdldFhER0RpcmVjdG9yeSA9ICgpOiBTZXR1cERpcmVjdG9yeSB8IHZvaWQgPT4ge1xuICBjb25zdCBYREdDb25maWcgPSBnZXRYREdIb21lKCkgfHwgKHByb2Nlc3MuZW52LkhPTUUgJiYgUGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsICcuY29uZmlnJykpO1xuXG4gIGlmIChYREdDb25maWcgJiYgZm9sZGVyRXhpc3RzKFhER0NvbmZpZykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogUGF0aC5qb2luKFhER0NvbmZpZywgcGtnSlNPTi5uYW1lLCBDT05GSUdfRklMRSksXG4gICAgICB0eXBlOiBYREcsXG4gICAgfTtcbiAgfVxufTtcblxuY29uc3QgZ2V0WERHSG9tZSA9ICgpOiBzdHJpbmcgfCB2b2lkID0+IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRTtcblxuY29uc3QgZ2V0V2luZG93c0RpcmVjdG9yeSA9ICgpOiBTZXR1cERpcmVjdG9yeSB8IHZvaWQgPT4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gV0lOMzIgJiYgcHJvY2Vzcy5lbnYuQVBQREFUQSAmJiBmb2xkZXJFeGlzdHMocHJvY2Vzcy5lbnYuQVBQREFUQSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogUGF0aC5yZXNvbHZlKFBhdGguam9pbihwcm9jZXNzLmVudi5BUFBEQVRBLCBwa2dKU09OLm5hbWUsIENPTkZJR19GSUxFKSksXG4gICAgICB0eXBlOiBXSU4sXG4gICAgfTtcbiAgfVxufTtcblxuY29uc3QgZ2V0UmVsYXRpdmVEZWZhdWx0RGlyZWN0b3J5ID0gKCk6IFNldHVwRGlyZWN0b3J5ID0+IHtcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBQYXRoLnJlc29sdmUoUGF0aC5qb2luKCcuJywgcGtnSlNPTi5uYW1lLCBDT05GSUdfRklMRSkpLFxuICAgIHR5cGU6ICdkZWYnLFxuICB9O1xufTtcblxuY29uc3QgZ2V0T2xkRGlyZWN0b3J5ID0gKCk6IFNldHVwRGlyZWN0b3J5ID0+IHtcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBQYXRoLnJlc29sdmUoUGF0aC5qb2luKCcuJywgQ09ORklHX0ZJTEUpKSxcbiAgICB0eXBlOiAnb2xkJyxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmRDb25maWdGaWxlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxHQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxLQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBSyxNQUFBLEdBQUFMLE9BQUE7QUFBbUQsU0FBQUQsdUJBQUFPLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFbkQsTUFBTUcsS0FBSyxHQUFHLElBQUFDLGNBQVUsRUFBQyxrQkFBa0IsQ0FBQztBQUU1QyxNQUFNQyxXQUFXLEdBQUcsYUFBYTtBQUNqQyxNQUFNQyxHQUFHLEdBQUcsS0FBSztBQUNqQixNQUFNQyxHQUFHLEdBQUcsS0FBSztBQUNqQixNQUFNQyxLQUFLLEdBQUcsT0FBTztBQUNyQjtBQUNBLE1BQU1DLE9BQU8s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
;