verdaccio
Version:
A lightweight private npm proxy registry
143 lines (106 loc) • 14.9 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _lodash = _interopRequireDefault(require("lodash"));
var _mkdirp = _interopRequireDefault(require("mkdirp"));
var _logger = require("./logger");
var _utils = require("./utils");
var _constants = require("./constants");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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 (_lodash.default.isNil(configPath) === false) {
return _path.default.resolve(configPath);
}
const configPaths = getConfigPaths();
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 (_lodash.default.isNil(primaryConf) === false) {
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'), _constants.CHARACTER_ENCODING.UTF8);
}
function createConfigFolder(configLocation) {
_mkdirp.default.sync(_path.default.dirname(configLocation.path));
_logger.logger.info({
file: configLocation.path
}, 'Creating default config file in @{file}');
}
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.
// $FlowFixMe
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 = findConfigFile;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY29uZmlnLXBhdGgudHMiXSwibmFtZXMiOlsiQ09ORklHX0ZJTEUiLCJYREciLCJXSU4iLCJXSU4zMiIsInBrZ0pTT04iLCJyZXF1aXJlIiwiZmluZENvbmZpZ0ZpbGUiLCJjb25maWdQYXRoIiwiXyIsImlzTmlsIiwiUGF0aCIsInJlc29sdmUiLCJjb25maWdQYXRocyIsImdldENvbmZpZ1BhdGhzIiwiaXNFbXB0eSIsIkVycm9yIiwicHJpbWFyeUNvbmYiLCJmaW5kIiwiY29uZmlnTG9jYXRpb24iLCJwYXRoIiwiY3JlYXRlQ29uZmlnRmlsZSIsImhlYWQiLCJjcmVhdGVDb25maWdGb2xkZXIiLCJkZWZhdWx0Q29uZmlnIiwidXBkYXRlU3RvcmFnZUxpbmtzIiwicmVhZERlZmF1bHRDb25maWciLCJmcyIsIndyaXRlRmlsZVN5bmMiLCJyZWFkRmlsZVN5bmMiLCJDSEFSQUNURVJfRU5DT0RJTkciLCJVVEY4IiwibWtkaXJwIiwic3luYyIsImRpcm5hbWUiLCJsb2dnZXIiLCJpbmZvIiwiZmlsZSIsInR5cGUiLCJkYXRhRGlyIiwicHJvY2VzcyIsImVudiIsIlhER19EQVRBX0hPTUUiLCJqb2luIiwiSE9NRSIsIm5hbWUiLCJyZXBsYWNlIiwibGlzdFBhdGhzIiwiZ2V0WERHRGlyZWN0b3J5IiwiZ2V0V2luZG93c0RpcmVjdG9yeSIsImdldFJlbGF0aXZlRGVmYXVsdERpcmVjdG9yeSIsImdldE9sZERpcmVjdG9yeSIsInJlZHVjZSIsImFjYyIsImN1cnJlbnRWYWx1ZSIsImlzVW5kZWZpbmVkIiwicHVzaCIsIlhER0NvbmZpZyIsImdldFhER0hvbWUiLCJYREdfQ09ORklHX0hPTUUiLCJwbGF0Zm9ybSIsIkFQUERBVEEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7OztBQUVBLE1BQU1BLFdBQVcsR0FBRyxhQUFwQjtBQUNBLE1BQU1DLEdBQUcsR0FBRyxLQUFa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QyxHQUFSLENBQVlvQixPQUF0QixFQUErQnhELE9BQU8sQ0FBQ3dDLElBQXZDLEVBQTZDNUMsV0FBN0MsQ0FBYixDQUREO0FBRUxxQyxNQUFBQSxJQUFJLEVBQUVuQztBQUZELEtBQVA7QUFJRDtBQUNGLENBUEQ7O0FBU0EsTUFBTStDLDJCQUEyQixHQUFHLE1BQXNCO0FBQ3hELFNBQU87QUFDTDlCLElBQUFBLElBQUksRUFBRVQsY0FBS0MsT0FBTCxDQUFhRCxjQUFLZ0MsSUFBTCxDQUFVLEdBQVYsRUFBZXRDLE9BQU8sQ0FBQ3dDLElBQXZCLEVBQTZCNUMsV0FBN0IsQ0FBYixDQUREO0FBRUxxQyxJQUFBQSxJQUFJLEVBQUU7QUFGRCxHQUFQO0FBSUQsQ0FMRDs7QUFPQSxNQUFNYSxlQUFlLEdBQUcsTUFBc0I7QUFDNUMsU0FBTztBQUNML0IsSUFBQUEsSUFBSSxFQUFFVCxjQUFLQyxPQUFMLENBQWFELGNBQUtnQyxJQUFMLENBQVUsR0FBVixFQUFlMUMsV0FBZixDQUFiLENBREQ7QUFFTHFDLElBQUFBLElBQUksRUFBRTtBQUZELEdBQVA7QUFJRCxDQUxEOztlQU9lL0IsYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgUGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbWtkaXJwIGZyb20gJ21rZGlycCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbmltcG9ydCB7IGZvbGRlckV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQ0hBUkFDVEVSX0VOQ09ESU5HIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5jb25zdCBDT05GSUdfRklMRSA9ICdjb25maWcueWFtbCc7XG5jb25zdCBYREcgPSAneGRnJztcbmNvbnN0IFdJTiA9ICd3aW4nO1xuY29uc3QgV0lOMzIgPSAnd2luMzInO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5jb25zdCBwa2dKU09OID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJyk7XG5cbmV4cG9ydCB0eXBlIFNldHVwRGlyZWN0b3J5ID0ge1xuICBwYXRoOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbn07XG5cbi8qKlxuICogRmluZCBhbmQgZ2V0IHRoZSBmaXJzdCBjb25maWcgZmlsZSB0aGF0IG1hdGNoLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgY29uZmlnIGZpbGUgcGF0aFxuICovXG5mdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShjb25maWdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoXy5pc05pbChjb25maWdQYXRoKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gUGF0aC5yZXNvbHZlKGNvbmZpZ1BhdGgpO1xuICB9XG5cbiAgY29uc3QgY29uZmlnUGF0aHM6IFNldHVwRGlyZWN0b3J5W10gPSBnZXRDb25maWdQYXRocygpO1xuXG4gIGlmIChfLmlzRW1wdHkoY29uZmlnUGF0aHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdubyBjb25maWd1cmF0aW9uIGZpbGVzIGNhbiBiZSBwcm9jZXNzZWQnKTtcbiAgfVxuXG4gIGNvbnN0IHByaW1hcnlDb25mOiBhbnkgPSBfLmZpbmQoY29uZmlnUGF0aHMsIChjb25maWdMb2NhdGlvbjogYW55KSA9PlxuICAgIGZpbGVFeGlzdHMoY29uZmlnTG9jYXRpb24ucGF0aClcbiAgKTtcbiAgaWYgKF8uaXNOaWwocHJpbWFyeUNvbmYpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBwcmltYXJ5Q29uZi5wYXRoO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUNvbmZpZ0ZpbGUoXy5oZWFkKGNvbmZpZ1BhdGhzKSkucGF0aDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29uZmlnRmlsZShjb25maWdMb2NhdGlvbjogYW55KTogU2V0dXBEaXJlY3Rvcnkge1xuICBjcmVhdGVDb25maWdGb2xkZXIoY29uZmlnTG9jYXRpb24pO1xuXG4gIGNvbnN0IGRlZmF1bHRDb25maWcgPSB1cGRhdGVTdG9yYWdlTGlua3MoY29uZmlnTG9jYXRpb24sIHJlYWREZWZhdWx0Q29uZmlnKCkpO1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoY29uZmlnTG9jYXRpb24ucGF0aCwgZGVmYXVsdENvbmZpZyk7XG5cbiAgcmV0dXJuIGNvbmZpZ0xvY2F0aW9uO1xufVxuXG5mdW5jdGlvbiByZWFkRGVmYXVsdENvbmZpZygpOiBzdHJpbmcge1xuICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHJlcXVpcmUucmVzb2x2ZSgnLi4vLi4vY29uZi9kZWZhdWx0LnlhbWwnKSwgQ0hBUkFDVEVSX0VOQ09ESU5HLlVURjgpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb25maWdGb2xkZXIoY29uZmlnTG9jYXRpb24pOiB2b2lkIHtcbiAgbWtkaXJwLnN5bmMoUGF0aC5kaXJuYW1lKGNvbmZpZ0xvY2F0aW9uLnBhdGgpKTtcbiAgbG9nZ2VyLmluZm8oeyBmaWxlOiBjb25maWdMb2NhdGlvbi5wYXRoIH0sICdDcmVhdGluZyBkZWZhdWx0IGNvbmZpZyBmaWxlIGluIEB7ZmlsZX0nKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RvcmFnZUxpbmtzKGNvbmZpZ0xvY2F0aW9uLCBkZWZhdWx0Q29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZ0xvY2F0aW9uLnR5cGUgIT09IFhERykge1xuICAgIHJldHVybiBkZWZhdWx0Q29uZmlnO1xuICB9XG5cbiAgLy8gJFhER19EQVRBX0hPTUUgZGVmaW5lcyB0aGUgYmFzZSBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gd2hpY2ggdXNlciBzcGVjaWZpYyBkYXRhIGZpbGVzIHNob3VsZCBiZSBzdG9yZWQsXG4gIC8vIElmICRYREdfREFUQV9IT01FIGlzIGVpdGhlciBub3Qgc2V0IG9yIGVtcHR5LCBhIGRlZmF1bHQgZXF1YWwgdG8gJEhPTUUvLmxvY2FsL3NoYXJlIHNob3VsZCBiZSB1c2VkLlxuICAvLyAkRmxvd0ZpeE1lXG4gIGxldCBkYXRhRGlyID1cbiAgICBwcm9jZXNzLmVudi5YREdfREFUQV9IT01FIHx8IFBhdGguam9pbihwcm9jZXNzLmVudi5IT01FIGFzIHN0cmluZywgJy5sb2NhbCcsICdzaGFyZScpO1xuICBpZiAoZm9sZGVyRXhpc3RzKGRhdGFEaXIpKSB7XG4gICAgZGF0YURpciA9IFBhdGgucmVzb2x2ZShQYXRoLmpvaW4oZGF0YURpciwgcGtnSlNPTi5uYW1lLCAnc3RvcmFnZScpKTtcbiAgICByZXR1cm4gZGVmYXVsdENvbmZpZy5yZXBsYWNlKC9ec3RvcmFnZTogLlxcL3N0b3JhZ2UkL20sIGBzdG9yYWdlOiAke2RhdGFEaXJ9YCk7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRDb25maWc7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ1BhdGhzKCk6IFNldHVwRGlyZWN0b3J5W10ge1xuICBjb25zdCBsaXN0UGF0aHM6IFNldHVwRGlyZWN0b3J5W10gPSBbXG4gICAgZ2V0WERHRGlyZWN0b3J5KCksXG4gICAgZ2V0V2luZG93c0RpcmVjdG9yeSgpLFxuICAgIGdldFJlbGF0aXZlRGVmYXVsdERpcmVjdG9yeSgpLFxuICAgIGdldE9sZERpcmVjdG9yeSgpXG4gIF0ucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cnJlbnRWYWx1ZTogYW55KTogU2V0dXBEaXJlY3RvcnlbXSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoY3VycmVudFZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdIGFzIFNldHVwRGlyZWN0b3J5W10pO1xuXG4gIHJldHVybiBsaXN0UGF0aHM7XG59XG5cbmNvbnN0IGdldFhER0RpcmVjdG9yeSA9ICgpOiBTZXR1cERpcmVjdG9yeSB8IHZvaWQgPT4ge1xuICBjb25zdCBYREdDb25maWcgPSBnZXRYREdIb21lKCkgfHwgKHByb2Nlc3MuZW52LkhPTUUgJiYgUGF0aC5qb2luKHByb2Nlc3MuZW52LkhPTUUsICcuY29uZmlnJykpO1xuXG4gIGlmIChYREdDb25maWcgJiYgZm9sZGVyRXhpc3RzKFhER0NvbmZpZykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogUGF0aC5qb2luKFhER0NvbmZpZywgcGtnSlNPTi5uYW1lLCBDT05GSUdfRklMRSksXG4gICAgICB0eXBlOiBYREdcbiAgICB9O1xuICB9XG59O1xuXG5jb25zdCBnZXRYREdIb21lID0gKCk6IHN0cmluZyB8IHZvaWQgPT4gcHJvY2Vzcy5lbnYuWERHX0NPTkZJR19IT01FO1xuXG5jb25zdCBnZXRXaW5kb3dzRGlyZWN0b3J5ID0gKCk6IFNldHVwRGlyZWN0b3J5IHwgdm9pZCA9PiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBXSU4zMiAmJiBwcm9jZXNzLmVudi5BUFBEQVRBICYmIGZvbGRlckV4aXN0cyhwcm9jZXNzLmVudi5BUFBEQVRBKSkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBQYXRoLnJlc29sdmUoUGF0aC5qb2luKHByb2Nlc3MuZW52LkFQUERBVEEsIHBrZ0pTT04ubmFtZSwgQ09ORklHX0ZJTEUpKSxcbiAgICAgIHR5cGU6IFdJTlxuICAgIH07XG4gIH1cbn07XG5cbmNvbnN0IGdldFJlbGF0aXZlRGVmYXVsdERpcmVjdG9yeSA9ICgpOiBTZXR1cERpcmVjdG9yeSA9PiB7XG4gIHJldHVybiB7XG4gICAgcGF0aDogUGF0aC5yZXNvbHZlKFBhdGguam9pbignLicsIHBrZ0pTT04ubmFtZSwgQ09ORklHX0ZJTEUpKSxcbiAgICB0eXBlOiAnZGVmJ1xuICB9O1xufTtcblxuY29uc3QgZ2V0T2xkRGlyZWN0b3J5ID0gKCk6IFNldHVwRGlyZWN0b3J5ID0+IHtcbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBQYXRoLnJlc29sdmUoUGF0aC5qb2luKCcuJywgQ09ORklHX0ZJTEUpKSxcbiAgICB0eXBlOiAnb2xkJ1xuICB9O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZmluZENvbmZpZ0ZpbGU7XG4iXX0=
;