UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

92 lines (86 loc) 13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.InitCommand = exports.DEFAULT_PROCESS_NAME = void 0; var _clipanion = require("clipanion"); var _path = _interopRequireDefault(require("path")); var _config = require("@verdaccio/config"); var _bootstrap = require("../../bootstrap"); var _logger = require("../../logger"); var _runServer = require("../../run-server"); var _utils = require("../../utils"); var _utils2 = require("../utils"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const pkgVersion = "6.7.1" || 'dev'; const pkgName = 'verdaccio'; const DEFAULT_PROCESS_NAME = exports.DEFAULT_PROCESS_NAME = 'verdaccio'; class InitCommand extends _clipanion.Command { static paths = [_clipanion.Command.Default]; listen = _clipanion.Option.String('-l,--listen', { description: 'host:port number to listen on (default: localhost:4873)' }); static usage = _clipanion.Command.Usage({ description: `launch the server`, details: ` This start the registry in the default port. When used without arguments, it: - bootstrap the server at the port \`4873\` The optional arguments are: - \`--listen\` to switch the default server port, - \`--config\` to define a different configuration path location, `, examples: [[`Runs the server with the default configuration`, `verdaccio`], [`Runs the server in the port 5000`, `verdaccio --listen 5000`], [`Runs the server by using a different absolute location of the configuration file`, `verdaccio --config /home/user/verdaccio/config.yaml`]] }); config = _clipanion.Option.String('-c,--config', { description: 'use this configuration file (default: ./config.yaml)' }); async execute() { let configPathLocation; try { configPathLocation = (0, _config.findConfigFile)(this.config); const configParsed = (0, _utils.parseConfigFile)(configPathLocation); if (!configParsed.self_path) { configParsed.self_path = _path.default.resolve(configPathLocation); // compatibility with 6.x plugins configParsed.configPath = configParsed.self_path; } if (!configParsed.https) { configParsed.https = { enable: false }; } process.title = configParsed.web && configParsed.web.title || 'verdaccio'; (0, _utils.initLogger)(configParsed); if (!(0, _utils2.isVersionRecommended)(process.version)) { _logger.logger.warn({ current: process.version, recommended: _utils2.RECOMMENDED_NODE_VERSION }, 'you are using Node.js @{current}, Verdaccio recommends Node.js v@{recommended} or higher, please consider upgrading your Node.js distribution'); } _logger.logger.info({ file: configPathLocation }, 'config file - @{file}'); const webServer = await (0, _runServer.runServer)(configParsed, { listenArg: this.listen }); const listen = this.listen ?? configParsed.listen; const addr = (0, _config.getListenAddress)(listen, _logger.logger); (0, _bootstrap.listenDefaultCallback)(webServer, addr, pkgName, pkgVersion); } catch (err) { console.error(`cannot open config file ${configPathLocation}: ${err.stack}`); // @ts-expect-error if (typeof _logger.logger?.logger?.fatal === 'function') { _logger.logger.fatal({ file: configPathLocation, err: err }, 'cannot open config file @{file}: @{!err.message}'); } else { console.error(`cannot open config file ${configPathLocation}: ${!err.message}`); } process.exit(1); } } } exports.InitCommand = InitCommand; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY2xpcGFuaW9uIiwicmVxdWlyZSIsIl9wYXRoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25maWciLCJfYm9vdHN0cmFwIiwiX2xvZ2dlciIsIl9ydW5TZXJ2ZXIiLCJfdXRpbHMiLCJfdXRpbHMyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwicGtnVmVyc2lvbiIsInBrZ05hbWUiLCJERUZBVUxUX1BST0NFU1NfTkFNRSIsImV4cG9ydHMiLCJJbml0Q29tbWFuZCIsIkNvbW1hbmQiLCJwYXRocyIsIkRlZmF1bHQiLCJsaXN0ZW4iLCJPcHRpb24iLCJTdHJpbmciLCJkZXNjcmlwdGlvbiIsInVzYWdlIiwiVXNhZ2UiLCJkZXRhaWxzIiwiZXhhbXBsZXMiLCJjb25maWciLCJleGVjdXRlIiwiY29uZmlnUGF0aExvY2F0aW9uIiwiZmluZENvbmZpZ0ZpbGUiLCJjb25maWdQYXJzZWQiLCJwYXJzZUNvbmZpZ0ZpbGUiLCJzZWxmX3BhdGgiLCJwYXRoIiwicmVzb2x2ZSIsImNvbmZpZ1BhdGgiLCJodHRwcyIsImVuYWJsZSIsInByb2Nlc3MiLCJ0aXRsZSIsIndlYiIsImluaXRMb2dnZXIiLCJpc1ZlcnNpb25SZWNvbW1lbmRlZCIsInZlcnNpb24iLCJsb2dnZXIiLCJ3YXJuIiwiY3VycmVudCIsInJlY29tbWVuZGVkIiwiUkVDT01NRU5ERURfTk9ERV9WRVJTSU9OIiwiaW5mbyIsImZpbGUiLCJ3ZWJTZXJ2ZXIiLCJydW5TZXJ2ZXIiLCJsaXN0ZW5BcmciLCJhZGRyIiwiZ2V0TGlzdGVuQWRkcmVzcyIsImxpc3RlbkRlZmF1bHRDYWxsYmFjayIsImVyciIsImNvbnNvbGUiLCJlcnJvciIsInN0YWNrIiwiZmF0YWwiLCJtZXNzYWdlIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2xpL2NvbW1hbmRzL2luaXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY2xpcGFuaW9uJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBmaW5kQ29uZmlnRmlsZSwgZ2V0TGlzdGVuQWRkcmVzcyB9IGZyb20gJ0B2ZXJkYWNjaW8vY29uZmlnJztcblxuaW1wb3J0IHsgbGlzdGVuRGVmYXVsdENhbGxiYWNrIH0gZnJvbSAnLi4vLi4vYm9vdHN0cmFwJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBydW5TZXJ2ZXIgfSBmcm9tICcuLi8uLi9ydW4tc2VydmVyJztcbmltcG9ydCB7IGluaXRMb2dnZXIsIHBhcnNlQ29uZmlnRmlsZSB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IFJFQ09NTUVOREVEX05PREVfVkVSU0lPTiwgaXNWZXJzaW9uUmVjb21tZW5kZWQgfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IHBrZ1ZlcnNpb24gPSBwcm9jZXNzLmVudi5QQUNLQUdFX1ZFUlNJT04gfHwgJ2Rldic7XG5jb25zdCBwa2dOYW1lID0gJ3ZlcmRhY2Npbyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BST0NFU1NfTkFNRTogc3RyaW5nID0gJ3ZlcmRhY2Npbyc7XG5cbmV4cG9ydCBjbGFzcyBJbml0Q29tbWFuZCBleHRlbmRzIENvbW1hbmQge1xuICBzdGF0aWMgcGF0aHMgPSBbQ29tbWFuZC5EZWZhdWx0XTtcblxuICBsaXN0ZW4gPSBPcHRpb24uU3RyaW5nKCctbCwtLWxpc3RlbicsIHtcbiAgICBkZXNjcmlwdGlvbjogJ2hvc3Q6cG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uIChkZWZhdWx0OiBsb2NhbGhvc3Q6NDg3MyknLFxuICB9KTtcblxuICBzdGF0aWMgdXNhZ2UgPSBDb21tYW5kLlVzYWdlKHtcbiAgICBkZXNjcmlwdGlvbjogYGxhdW5jaCB0aGUgc2VydmVyYCxcbiAgICBkZXRhaWxzOiBgXG4gICAgICBUaGlzIHN0YXJ0IHRoZSByZWdpc3RyeSBpbiB0aGUgZGVmYXVsdCBwb3J0LlxuXG4gICAgICBXaGVuIHVzZWQgd2l0aG91dCBhcmd1bWVudHMsIGl0OlxuXG4gICAgICAtIGJvb3RzdHJhcCB0aGUgc2VydmVyIGF0IHRoZSBwb3J0ICBcXGA0ODczXFxgXG5cbiAgICAgIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgYXJlOlxuXG4gICAgICAtIFxcYC0tbGlzdGVuXFxgIHRvIHN3aXRjaCB0aGUgZGVmYXVsdCBzZXJ2ZXIgcG9ydCxcbiAgICAgIC0gXFxgLS1jb25maWdcXGAgdG8gZGVmaW5lIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gcGF0aCBsb2NhdGlvbixcblxuICAgIGAsXG4gICAgZXhhbXBsZXM6IFtcbiAgICAgIFtgUnVucyB0aGUgc2VydmVyIHdpdGggdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbmAsIGB2ZXJkYWNjaW9gXSxcbiAgICAgIFtgUnVucyB0aGUgc2VydmVyIGluIHRoZSBwb3J0IDUwMDBgLCBgdmVyZGFjY2lvIC0tbGlzdGVuIDUwMDBgXSxcbiAgICAgIFtcbiAgICAgICAgYFJ1bnMgdGhlIHNlcnZlciBieSB1c2luZyBhIGRpZmZlcmVudCBhYnNvbHV0ZSBsb2NhdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlYCxcbiAgICAgICAgYHZlcmRhY2NpbyAtLWNvbmZpZyAvaG9tZS91c2VyL3ZlcmRhY2Npby9jb25maWcueWFtbGAsXG4gICAgICBdLFxuICAgIF0sXG4gIH0pO1xuXG4gIGNvbmZpZyA9IE9wdGlvbi5TdHJpbmcoJy1jLC0tY29uZmlnJywge1xuICAgIGRlc2NyaXB0aW9uOiAndXNlIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0OiAuL2NvbmZpZy55YW1sKScsXG4gIH0pO1xuXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgbGV0IGNvbmZpZ1BhdGhMb2NhdGlvbjtcbiAgICB0cnkge1xuICAgICAgY29uZmlnUGF0aExvY2F0aW9uID0gZmluZENvbmZpZ0ZpbGUodGhpcy5jb25maWcgYXMgc3RyaW5nKTtcbiAgICAgIGNvbnN0IGNvbmZpZ1BhcnNlZDogUmV0dXJuVHlwZTxhbnk+ID0gcGFyc2VDb25maWdGaWxlKGNvbmZpZ1BhdGhMb2NhdGlvbik7XG4gICAgICBpZiAoIWNvbmZpZ1BhcnNlZC5zZWxmX3BhdGgpIHtcbiAgICAgICAgY29uZmlnUGFyc2VkLnNlbGZfcGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWdQYXRoTG9jYXRpb24pO1xuICAgICAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggNi54IHBsdWdpbnNcbiAgICAgICAgY29uZmlnUGFyc2VkLmNvbmZpZ1BhdGggPSBjb25maWdQYXJzZWQuc2VsZl9wYXRoO1xuICAgICAgfVxuICAgICAgaWYgKCFjb25maWdQYXJzZWQuaHR0cHMpIHtcbiAgICAgICAgY29uZmlnUGFyc2VkLmh0dHBzID0geyBlbmFibGU6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MudGl0bGUgPSAoY29uZmlnUGFyc2VkLndlYiAmJiBjb25maWdQYXJzZWQud2ViLnRpdGxlKSB8fCAndmVyZGFjY2lvJztcblxuICAgICAgaW5pdExvZ2dlcihjb25maWdQYXJzZWQpO1xuICAgICAgaWYgKCFpc1ZlcnNpb25SZWNvbW1lbmRlZChwcm9jZXNzLnZlcnNpb24pKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIHsgY3VycmVudDogcHJvY2Vzcy52ZXJzaW9uLCByZWNvbW1lbmRlZDogUkVDT01NRU5ERURfTk9ERV9WRVJTSU9OIH0sXG4gICAgICAgICAgJ3lvdSBhcmUgdXNpbmcgTm9kZS5qcyBAe2N1cnJlbnR9LCBWZXJkYWNjaW8gcmVjb21tZW5kcyBOb2RlLmpzIHZAe3JlY29tbWVuZGVkfSBvciBoaWdoZXIsIHBsZWFzZSBjb25zaWRlciB1cGdyYWRpbmcgeW91ciBOb2RlLmpzIGRpc3RyaWJ1dGlvbidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKHsgZmlsZTogY29uZmlnUGF0aExvY2F0aW9uIH0sICdjb25maWcgZmlsZSAgLSBAe2ZpbGV9Jyk7XG4gICAgICBjb25zdCB3ZWJTZXJ2ZXIgPSBhd2FpdCBydW5TZXJ2ZXIoY29uZmlnUGFyc2VkLCB7IGxpc3RlbkFyZzogdGhpcy5saXN0ZW4gYXMgc3RyaW5nIH0pO1xuICAgICAgY29uc3QgbGlzdGVuID0gKHRoaXMubGlzdGVuIGFzIHN0cmluZykgPz8gY29uZmlnUGFyc2VkLmxpc3RlbjtcbiAgICAgIGNvbnN0IGFkZHIgPSBnZXRMaXN0ZW5BZGRyZXNzKGxpc3RlbiwgbG9nZ2VyKTtcbiAgICAgIGxpc3RlbkRlZmF1bHRDYWxsYmFjayh3ZWJTZXJ2ZXIsIGFkZHIsIHBrZ05hbWUsIHBrZ1ZlcnNpb24pO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBjYW5ub3Qgb3BlbiBjb25maWcgZmlsZSAke2NvbmZpZ1BhdGhMb2NhdGlvbn06ICR7ZXJyLnN0YWNrfWApO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgaWYgKHR5cGVvZiBsb2dnZXI/LmxvZ2dlcj8uZmF0YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbG9nZ2VyLmZhdGFsKFxuICAgICAgICAgIHsgZmlsZTogY29uZmlnUGF0aExvY2F0aW9uLCBlcnI6IGVyciB9LFxuICAgICAgICAgICdjYW5ub3Qgb3BlbiBjb25maWcgZmlsZSBAe2ZpbGV9OiBAeyFlcnIubWVzc2FnZX0nXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBjYW5ub3Qgb3BlbiBjb25maWcgZmlsZSAke2NvbmZpZ1BhdGhMb2NhdGlvbn06ICR7IWVyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxPQUFBLEdBQUFILE9B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