verdaccio
Version:
A lightweight private npm proxy registry
118 lines (90 loc) • 13.5 kB
JavaScript
/* eslint no-sync:0 */
/* eslint no-empty:0 */
;
var _path = _interopRequireDefault(require("path"));
var _semver = _interopRequireDefault(require("semver"));
var _kleur = require("kleur");
var _bootstrap = require("./bootstrap");
var _configPath = _interopRequireDefault(require("./config-path"));
var _utils = require("./utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
require('pkginfo')(module);
if (process.getuid && process.getuid() === 0) {
global.console.warn((0, _kleur.bgYellow)().red("*** WARNING: Verdaccio doesn't need superuser privileges. Don't run it under root! ***"));
}
const MIN_NODE_VERSION = '6.9.0';
if (_semver.default.satisfies(process.version, `>=${MIN_NODE_VERSION}`) === false) {
global.console.error((0, _kleur.bgRed)(`Verdaccio requires at least Node.js ${MIN_NODE_VERSION} or higher, please upgrade your Node.js distribution`));
process.exit(1);
}
process.title = 'verdaccio'; // eslint-disable-next-line import/order
const logger = require('./logger');
logger.setup(null, {
logStart: false
}); // default setup
const envinfo = require('envinfo');
const commander = require('commander');
const pkgVersion = module.exports.version;
const pkgName = module.exports.name;
commander.option('-i, --info', 'prints debugging information about the local environment').option('-l, --listen <[host:]port>', 'host:port number to listen on (default: localhost:4873)').option('-c, --config <config.yaml>', 'use this configuration file (default: ./config.yaml)').version(pkgVersion).parse(process.argv);
function init() {
let verdaccioConfiguration;
let configPathLocation;
const cliListener = commander.listen;
try {
configPathLocation = (0, _configPath.default)(commander.config);
verdaccioConfiguration = (0, _utils.parseConfigFile)(configPathLocation);
process.title = verdaccioConfiguration.web && verdaccioConfiguration.web.title || 'verdaccio';
if (!verdaccioConfiguration.self_path) {
verdaccioConfiguration.self_path = _path.default.resolve(configPathLocation);
}
if (!verdaccioConfiguration.https) {
verdaccioConfiguration.https = {
enable: false
};
}
logger.logger.warn({
file: configPathLocation
}, 'config file - @{file}');
process.emitWarning(`verdaccio 4.x is deprecated and won't longer receive security support, please
update to 5.x or higher`);
(0, _bootstrap.startVerdaccio)(verdaccioConfiguration, cliListener, configPathLocation, pkgVersion, pkgName, _bootstrap.listenDefaultCallback);
} catch (err) {
logger.logger.fatal({
file: configPathLocation,
err: err
}, 'cannot open config file @{file}: @{!err.message}');
process.exit(1);
}
}
if (commander.info) {
// eslint-disable-next-line no-console
console.log('\nEnvironment Info:');
(async () => {
const data = await envinfo.run({
System: ['OS', 'CPU'],
Binaries: ['Node', 'Yarn', 'npm'],
Virtualization: ['Docker'],
Browsers: ['Chrome', 'Edge', 'Firefox', 'Safari'],
npmGlobalPackages: ['verdaccio']
}); // eslint-disable-next-line no-console
console.log(data);
process.exit(0);
})();
} else if (commander.args.length == 1 && !commander.config) {
// handling "verdaccio [config]" case if "-c" is missing in command line
commander.config = commander.args.pop();
init();
} else if (commander.args.length !== 0) {
commander.help();
} else {
init();
}
process.on('uncaughtException', function (err) {
logger.logger.fatal({
err: err
}, 'uncaught exception, please report this\n@{err.stack}');
process.exit(255);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY2xpLnRzIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJtb2R1bGUiLCJwcm9jZXNzIiwiZ2V0dWlkIiwiZ2xvYmFsIiwiY29uc29sZSIsIndhcm4iLCJyZWQiLCJNSU5fTk9ERV9WRVJTSU9OIiwic2VtdmVyIiwic2F0aXNmaWVzIiwidmVyc2lvbiIsImVycm9yIiwiZXhpdCIsInRpdGxlIiwibG9nZ2VyIiwic2V0dXAiLCJsb2dTdGFydCIsImVudmluZm8iLCJjb21tYW5kZXIiLCJwa2dWZXJzaW9uIiwiZXhwb3J0cyIsInBrZ05hbWUiLCJuYW1lIiwib3B0aW9uIiwicGFyc2UiLCJhcmd2IiwiaW5pdCIsInZlcmRhY2Npb0NvbmZpZ3VyYXRpb24iLCJjb25maWdQYXRoTG9jYXRpb24iLCJjbGlMaXN0ZW5lciIsImxpc3RlbiIsImNvbmZpZyIsIndlYiIsInNlbGZfcGF0aCIsInBhdGgiLCJyZXNvbHZlIiwiaHR0cHMiLCJlbmFibGUiLCJmaWxlIiwiZW1pdFdhcm5pbmciLCJsaXN0ZW5EZWZhdWx0Q2FsbGJhY2siLCJlcnIiLCJmYXRhbCIsImluZm8iLCJsb2ciLCJkYXRhIiwicnVuIiwiU3lzdGVtIiwiQmluYXJpZXMiLCJWaXJ0dWFsaXphdGlvbiIsIkJyb3dzZXJzIiwibnBtR2xvYmFsUGFja2FnZXMiLCJhcmdzIiwibGVuZ3RoIiwicG9wIiwiaGVscCIsIm9uIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTs7QUFDQTs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQUEsT0FBTyxDQUFDLFNBQUQsQ0FBUCxDQUFtQkMsTUFBbkI7O0FBRUEsSUFBSUMsT0FBTyxDQUFDQyxNQUFSLElBQWtCRCxPQUFPLENBQUNDLE1BQVIsT0FBcUIsQ0FBM0MsRUFBOEM7QUFDNUNDLEVBQUFBLE1BQU0sQ0FBQ0MsT0FBUCxDQUFlQyxJQUFmLENBQW9CLHVCQUFXQyxHQUFYLENBQWUsd0ZBQWYsQ0FBcEI7QUFDRDs7QUFF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LEtBQWQsQ0FDRTtBQUNFRCxJQUFBQSxHQUFHLEVBQUVBO0FBRFAsR0FERixFQUlFLHNEQUpGO0FBTUF4QyxFQUFBQSxPQUFPLENBQUNXLElBQVIsQ0FBYSxHQUFiO0FBQ0QsQ0FSRCIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuLyogZXNsaW50IG5vLXN5bmM6MCAqL1xuLyogZXNsaW50IG5vLWVtcHR5OjAgKi9cblxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBiZ1llbGxvdywgYmdSZWQgfSBmcm9tICdrbGV1cic7XG5pbXBvcnQgeyBzdGFydFZlcmRhY2NpbywgbGlzdGVuRGVmYXVsdENhbGxiYWNrIH0gZnJvbSAnLi9ib290c3RyYXAnO1xuaW1wb3J0IGZpbmRDb25maWdGaWxlIGZyb20gJy4vY29uZmlnLXBhdGgnO1xuaW1wb3J0IHsgcGFyc2VDb25maWdGaWxlIH0gZnJvbSAnLi91dGlscyc7XG5cbnJlcXVpcmUoJ3BrZ2luZm8nKShtb2R1bGUpO1xuXG5pZiAocHJvY2Vzcy5nZXR1aWQgJiYgcHJvY2Vzcy5nZXR1aWQoKSA9PT0gMCkge1xuICBnbG9iYWwuY29uc29sZS53YXJuKGJnWWVsbG93KCkucmVkKFwiKioqIFdBUk5JTkc6IFZlcmRhY2NpbyBkb2Vzbid0IG5lZWQgc3VwZXJ1c2VyIHByaXZpbGVnZXMuIERvbid0IHJ1biBpdCB1bmRlciByb290ISAqKipcIikpO1xufVxuXG5jb25zdCBNSU5fTk9ERV9WRVJTSU9OID0gJzYuOS4wJztcblxuaWYgKHNlbXZlci5zYXRpc2ZpZXMocHJvY2Vzcy52ZXJzaW9uLCBgPj0ke01JTl9OT0RFX1ZFUlNJT059YCkgPT09IGZhbHNlKSB7XG4gIGdsb2JhbC5jb25zb2xlLmVycm9yKGJnUmVkKGBWZXJkYWNjaW8gcmVxdWlyZXMgYXQgbGVhc3QgTm9kZS5qcyAke01JTl9OT0RFX1ZFUlNJT059IG9yIGhpZ2hlciwgcGxlYXNlIHVwZ3JhZGUgeW91ciBOb2RlLmpzIGRpc3RyaWJ1dGlvbmApKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5wcm9jZXNzLnRpdGxlID0gJ3ZlcmRhY2Npbyc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvb3JkZXJcbmNvbnN0IGxvZ2dlciA9IHJlcXVpcmUoJy4vbG9nZ2VyJyk7XG5sb2dnZXIuc2V0dXAobnVsbCwgeyBsb2dTdGFydDogZmFsc2UgfSk7IC8vIGRlZmF1bHQgc2V0dXBcblxuY29uc3QgZW52aW5mbyA9IHJlcXVpcmUoJ2VudmluZm8nKTtcbmNvbnN0IGNvbW1hbmRlciA9IHJlcXVpcmUoJ2NvbW1hbmRlcicpO1xuY29uc3QgcGtnVmVyc2lvbiA9IG1vZHVsZS5leHBvcnRzLnZlcnNpb247XG5jb25zdCBwa2dOYW1lID0gbW9kdWxlLmV4cG9ydHMubmFtZTtcblxuY29tbWFuZGVyXG4gIC5vcHRpb24oJy1pLCAtLWluZm8nLCAncHJpbnRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYWwgZW52aXJvbm1lbnQnKVxuICAub3B0aW9uKCctbCwgLS1saXN0ZW4gPFtob3N0Ol1wb3J0PicsICdob3N0OnBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbiAoZGVmYXVsdDogbG9jYWxob3N0OjQ4NzMpJylcbiAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxjb25maWcueWFtbD4nLCAndXNlIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0OiAuL2NvbmZpZy55YW1sKScpXG4gIC52ZXJzaW9uKHBrZ1ZlcnNpb24pXG4gIC5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuXG5mdW5jdGlvbiBpbml0KCkge1xuICBsZXQgdmVyZGFjY2lvQ29uZmlndXJhdGlvbjtcbiAgbGV0IGNvbmZpZ1BhdGhMb2NhdGlvbjtcbiAgY29uc3QgY2xpTGlzdGVuZXIgPSBjb21tYW5kZXIubGlzdGVuO1xuXG4gIHRyeSB7XG4gICAgY29uZmlnUGF0aExvY2F0aW9uID0gZmluZENvbmZpZ0ZpbGUoY29tbWFuZGVyLmNvbmZpZyk7XG4gICAgdmVyZGFjY2lvQ29uZmlndXJhdGlvbiA9IHBhcnNlQ29uZmlnRmlsZShjb25maWdQYXRoTG9jYXRpb24pO1xuICAgIHByb2Nlc3MudGl0bGUgPSAodmVyZGFjY2lvQ29uZmlndXJhdGlvbi53ZWIgJiYgdmVyZGFjY2lvQ29uZmlndXJhdGlvbi53ZWIudGl0bGUpIHx8ICd2ZXJkYWNjaW8nO1xuXG4gICAgaWYgKCF2ZXJkYWNjaW9Db25maWd1cmF0aW9uLnNlbGZfcGF0aCkge1xuICAgICAgdmVyZGFjY2lvQ29uZmlndXJhdGlvbi5zZWxmX3BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnUGF0aExvY2F0aW9uKTtcbiAgICB9XG4gICAgaWYgKCF2ZXJkYWNjaW9Db25maWd1cmF0aW9uLmh0dHBzKSB7XG4gICAgICB2ZXJkYWNjaW9Db25maWd1cmF0aW9uLmh0dHBzID0geyBlbmFibGU6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgbG9nZ2VyLmxvZ2dlci53YXJuKHsgZmlsZTogY29uZmlnUGF0aExvY2F0aW9uIH0sICdjb25maWcgZmlsZSAgLSBAe2ZpbGV9Jyk7XG4gICAgcHJvY2Vzcy5lbWl0V2FybmluZyhgdmVyZGFjY2lvIDQueCBpcyBkZXByZWNhdGVkIGFuZCB3b24ndCBsb25nZXIgcmVjZWl2ZSBzZWN1cml0eSBzdXBwb3J0LCBwbGVhc2VcbiAgICB1cGRhdGUgdG8gNS54IG9yIGhpZ2hlcmApO1xuICAgIHN0YXJ0VmVyZGFjY2lvKHZlcmRhY2Npb0NvbmZpZ3VyYXRpb24sIGNsaUxpc3RlbmVyLCBjb25maWdQYXRoTG9jYXRpb24sIHBrZ1ZlcnNpb24sIHBrZ05hbWUsIGxpc3RlbkRlZmF1bHRDYWxsYmFjayk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5sb2dnZXIuZmF0YWwoeyBmaWxlOiBjb25maWdQYXRoTG9jYXRpb24sIGVycjogZXJyIH0sICdjYW5ub3Qgb3BlbiBjb25maWcgZmlsZSBAe2ZpbGV9OiBAeyFlcnIubWVzc2FnZX0nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuaWYgKGNvbW1hbmRlci5pbmZvKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKCdcXG5FbnZpcm9ubWVudCBJbmZvOicpO1xuICAoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBlbnZpbmZvLnJ1bih7XG4gICAgICBTeXN0ZW06IFsnT1MnLCAnQ1BVJ10sXG4gICAgICBCaW5hcmllczogWydOb2RlJywgJ1lhcm4nLCAnbnBtJ10sXG4gICAgICBWaXJ0dWFsaXphdGlvbjogWydEb2NrZXInXSxcbiAgICAgIEJyb3dzZXJzOiBbJ0Nocm9tZScsICdFZGdlJywgJ0ZpcmVmb3gnLCAnU2FmYXJpJ10sXG4gICAgICBucG1HbG9iYWxQYWNrYWdlczogWyd2ZXJkYWNjaW8nXSxcbiAgICB9KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSkoKTtcbn0gZWxzZSBpZiAoY29tbWFuZGVyLmFyZ3MubGVuZ3RoID09IDEgJiYgIWNvbW1hbmRlci5jb25maWcpIHtcbiAgLy8gaGFuZGxpbmcgXCJ2ZXJkYWNjaW8gW2NvbmZpZ11cIiBjYXNlIGlmIFwiLWNcIiBpcyBtaXNzaW5nIGluIGNvbW1hbmQgbGluZVxuICBjb21tYW5kZXIuY29uZmlnID0gY29tbWFuZGVyLmFyZ3MucG9wKCk7XG4gIGluaXQoKTtcbn0gZWxzZSBpZiAoY29tbWFuZGVyLmFyZ3MubGVuZ3RoICE9PSAwKSB7XG4gIGNvbW1hbmRlci5oZWxwKCk7XG59IGVsc2Uge1xuICBpbml0KCk7XG59XG5cbnByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgZnVuY3Rpb24gKGVycikge1xuICBsb2dnZXIubG9nZ2VyLmZhdGFsKFxuICAgIHtcbiAgICAgIGVycjogZXJyLFxuICAgIH0sXG4gICAgJ3VuY2F1Z2h0IGV4Y2VwdGlvbiwgcGxlYXNlIHJlcG9ydCB0aGlzXFxuQHtlcnIuc3RhY2t9J1xuICApO1xuICBwcm9jZXNzLmV4aXQoMjU1KTtcbn0pO1xuIl19