UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

118 lines (90 loc) 13.5 kB
#!/usr/bin/env node /* eslint no-sync:0 */ /* eslint no-empty:0 */ "use strict"; 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