UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

105 lines (99 loc) 15.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _compression = _interopRequireDefault(require("compression")); var _cors = _interopRequireDefault(require("cors")); var _express = _interopRequireDefault(require("express")); var _lodash = _interopRequireDefault(require("lodash")); var _auth = require("@verdaccio/auth"); var _config = require("@verdaccio/config"); var _core = require("@verdaccio/core"); var _loaders = require("@verdaccio/loaders"); var _middleware = require("@verdaccio/middleware"); var _searchIndexer = require("@verdaccio/search-indexer"); var _config2 = _interopRequireDefault(require("../lib/config")); var _constants = require("../lib/constants"); var _logger = require("../lib/logger"); var _storage = _interopRequireDefault(require("../lib/storage")); var _utils = require("../lib/utils"); var _debug = _interopRequireDefault(require("./debug")); var _endpoint = _interopRequireDefault(require("./endpoint")); var _middleware2 = require("./middleware"); var _web = _interopRequireDefault(require("./web")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const version = "6.2.9" || 'dev'; const defineAPI = async function (config, storage) { const auth = new _auth.Auth(config, _logger.logger, { legacyMergeConfigs: true }); await auth.init(); const app = (0, _express.default)(); _searchIndexer.SearchMemoryIndexer.configureStorage(storage); await _searchIndexer.SearchMemoryIndexer.init(_logger.logger); // run in production mode by default, just in case // it shouldn't make any difference anyway app.set('env', process.env.NODE_ENV || 'production'); // Allow `req.ip` to resolve properly when Verdaccio is behind a proxy or load-balancer // See: https://expressjs.com/en/guide/behind-proxies.html if (config.server?.trustProxy) { app.set('trust proxy', config.server.trustProxy); } app.use((0, _cors.default)()); // // Router setup app.use((0, _middleware.log)(_logger.logger)); app.use((0, _middleware.errorReportingMiddleware)(_logger.logger)); if (config.user_agent) { app.use(function (_req, res, next) { res.setHeader('X-Powered-By', (0, _config.getUserAgent)(config.user_agent)); next(); }); } else { app.disable('x-powered-by'); } app.use((0, _compression.default)()); app.get('/-/static/favicon.ico', (0, _middleware2.serveFavicon)(config)); // Hook for tests only if (config._debug) { (0, _debug.default)(app, config.configPath); } const plugins = await (0, _loaders.asyncLoadPlugin)(config.middlewares, { config, logger: _logger.logger }, function (plugin) { return typeof plugin.register_middlewares !== 'undefined'; }, true, config?.serverSettings?.pluginPrefix ?? 'verdaccio', _core.PLUGIN_CATEGORY.MIDDLEWARE); plugins.forEach(plugin => { plugin.register_middlewares(app, auth, storage); }); // // For npm request app.use((0, _endpoint.default)(config, auth, storage)); // For WebUI & WebUI API if (_lodash.default.get(config, 'web.enable', true)) { app.use((_req, res, next) => { res.locals.app_version = version ?? ''; next(); }); const middleware = await (0, _web.default)(config, auth, storage, _logger.logger); app.use(middleware); } else { app.get('/', function (_, __, next) { next(_utils.ErrorCode.getNotFound(_constants.API_ERROR.WEB_DISABLED)); }); } app.get('/*', function (_, __, next) { next(_utils.ErrorCode.getNotFound(_constants.API_ERROR.FILE_NOT_FOUND)); }); app.use((0, _middleware.handleError)(_logger.logger)); app.use(_middleware.final); return app; }; var _default = exports.default = async function _default(configHash) { const config = new _config2.default(_lodash.default.cloneDeep(configHash)); const storage = new _storage.default(config); // waits until init calls have been initialized await storage.init(config); return await defineAPI(config, storage); }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tcHJlc3Npb24iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jb3JzIiwiX2V4cHJlc3MiLCJfbG9kYXNoIiwiX2F1dGgiLCJfY29uZmlnIiwiX2NvcmUiLCJfbG9hZGVycyIsIl9taWRkbGV3YXJlIiwiX3NlYXJjaEluZGV4ZXIiLCJfY29uZmlnMiIsIl9jb25zdGFudHMiLCJfbG9nZ2VyIiwiX3N0b3JhZ2UiLCJfdXRpbHMiLCJfZGVidWciLCJfZW5kcG9pbnQiLCJfbWlkZGxld2FyZTIiLCJfd2ViIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwidmVyc2lvbiIsImRlZmluZUFQSSIsImNvbmZpZyIsInN0b3JhZ2UiLCJhdXRoIiwiQXV0aCIsImxvZ2dlciIsImxlZ2FjeU1lcmdlQ29uZmlncyIsImluaXQiLCJhcHAiLCJleHByZXNzIiwiU2VhcmNoTWVtb3J5SW5kZXhlciIsImNvbmZpZ3VyZVN0b3JhZ2UiLCJzZXQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJzZXJ2ZXIiLCJ0cnVzdFByb3h5IiwidXNlIiwiY29ycyIsImxvZyIsImVycm9yUmVwb3J0aW5nTWlkZGxld2FyZSIsInVzZXJfYWdlbnQiLCJfcmVxIiwicmVzIiwibmV4dCIsInNldEhlYWRlciIsImdldFVzZXJBZ2VudCIsImRpc2FibGUiLCJjb21wcmVzc2lvbiIsImdldCIsInNlcnZlRmF2aWNvbiIsImhvb2tEZWJ1ZyIsImNvbmZpZ1BhdGgiLCJwbHVnaW5zIiwiYXN5bmNMb2FkUGx1Z2luIiwibWlkZGxld2FyZXMiLCJwbHVnaW4iLCJyZWdpc3Rlcl9taWRkbGV3YXJlcyIsInNlcnZlclNldHRpbmdzIiwicGx1Z2luUHJlZml4IiwiUExVR0lOX0NBVEVHT1JZIiwiTUlERExFV0FSRSIsImZvckVhY2giLCJhcGlFbmRwb2ludCIsIl8iLCJsb2NhbHMiLCJhcHBfdmVyc2lvbiIsIm1pZGRsZXdhcmUiLCJ3ZWJNaWRkbGV3YXJlIiwiX18iLCJFcnJvckNvZGUiLCJnZXROb3RGb3VuZCIsIkFQSV9FUlJPUiIsIldFQl9ESVNBQkxFRCIsIkZJTEVfTk9UX0ZPVU5EIiwiaGFuZGxlRXJyb3IiLCJmaW5hbCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImNvbmZpZ0hhc2giLCJBcHBDb25maWciLCJjbG9uZURlZXAiLCJTdG9yYWdlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tcHJlc3Npb24gZnJvbSAnY29tcHJlc3Npb24nO1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycyc7XG5pbXBvcnQgZXhwcmVzcywgeyBBcHBsaWNhdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQXV0aCB9IGZyb20gJ0B2ZXJkYWNjaW8vYXV0aCc7XG5pbXBvcnQgeyBnZXRVc2VyQWdlbnQgfSBmcm9tICdAdmVyZGFjY2lvL2NvbmZpZyc7XG5pbXBvcnQgeyBQTFVHSU5fQ0FURUdPUlksIHBsdWdpblV0aWxzIH0gZnJvbSAnQHZlcmRhY2Npby9jb3JlJztcbmltcG9ydCB7IGFzeW5jTG9hZFBsdWdpbiB9IGZyb20gJ0B2ZXJkYWNjaW8vbG9hZGVycyc7XG5pbXBvcnQgeyBlcnJvclJlcG9ydGluZ01pZGRsZXdhcmUsIGZpbmFsLCBoYW5kbGVFcnJvciB9IGZyb20gJ0B2ZXJkYWNjaW8vbWlkZGxld2FyZSc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICdAdmVyZGFjY2lvL21pZGRsZXdhcmUnO1xuaW1wb3J0IHsgU2VhcmNoTWVtb3J5SW5kZXhlciB9IGZyb20gJ0B2ZXJkYWNjaW8vc2VhcmNoLWluZGV4ZXInO1xuaW1wb3J0IHsgQ29uZmlnWWFtbCwgQ29uZmlnIGFzIElDb25maWcgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcblxuaW1wb3J0IEFwcENvbmZpZyBmcm9tICcuLi9saWIvY29uZmlnJztcbmltcG9ydCB7IEFQSV9FUlJPUiB9IGZyb20gJy4uL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbGliL2xvZ2dlcic7XG5pbXBvcnQgU3RvcmFnZSBmcm9tICcuLi9saWIvc3RvcmFnZSc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgJE5leHRGdW5jdGlvblZlciwgJFJlcXVlc3RFeHRlbmQsICRSZXNwb25zZUV4dGVuZCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCBob29rRGVidWcgZnJvbSAnLi9kZWJ1Zyc7XG5pbXBvcnQgYXBpRW5kcG9pbnQgZnJvbSAnLi9lbmRwb2ludCc7XG5pbXBvcnQgeyBzZXJ2ZUZhdmljb24gfSBmcm9tICcuL21pZGRsZXdhcmUnO1xuaW1wb3J0IHdlYk1pZGRsZXdhcmUgZnJvbSAnLi93ZWInO1xuXG5jb25zdCB2ZXJzaW9uID0gcHJvY2Vzcy5lbnYuUEFDS0FHRV9WRVJTSU9OIHx8ICdkZXYnO1xuXG5jb25zdCBkZWZpbmVBUEkgPSBhc3luYyBmdW5jdGlvbiAoY29uZmlnOiBJQ29uZmlnLCBzdG9yYWdlOiBTdG9yYWdlKTogUHJvbWlzZTxleHByZXNzLkFwcGxpY2F0aW9uPiB7XG4gIGNvbnN0IGF1dGggPSBuZXcgQXV0aChjb25maWcsIGxvZ2dlciwgeyBsZWdhY3lNZXJnZUNvbmZpZ3M6IHRydWUgfSk7XG4gIGF3YWl0IGF1dGguaW5pdCgpO1xuICBjb25zdCBhcHA6IEFwcGxpY2F0aW9uID0gZXhwcmVzcygpO1xuICBTZWFyY2hNZW1vcnlJbmRleGVyLmNvbmZpZ3VyZVN0b3JhZ2Uoc3RvcmFnZSk7XG4gIGF3YWl0IFNlYXJjaE1lbW9yeUluZGV4ZXIuaW5pdChsb2dnZXIpO1xuICAvLyBydW4gaW4gcHJvZHVjdGlvbiBtb2RlIGJ5IGRlZmF1bHQsIGp1c3QgaW4gY2FzZVxuICAvLyBpdCBzaG91bGRuJ3QgbWFrZSBhbnkgZGlmZmVyZW5jZSBhbnl3YXlcbiAgYXBwLnNldCgnZW52JywgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ3Byb2R1Y3Rpb24nKTtcblxuICAvLyBBbGxvdyBgcmVxLmlwYCB0byByZXNvbHZlIHByb3Blcmx5IHdoZW4gVmVyZGFjY2lvIGlzIGJlaGluZCBhIHByb3h5IG9yIGxvYWQtYmFsYW5jZXJcbiAgLy8gU2VlOiBodHRwczovL2V4cHJlc3Nqcy5jb20vZW4vZ3VpZGUvYmVoaW5kLXByb3hpZXMuaHRtbFxuICBpZiAoY29uZmlnLnNlcnZlcj8udHJ1c3RQcm94eSkge1xuICAgIGFwcC5zZXQoJ3RydXN0IHByb3h5JywgY29uZmlnLnNlcnZlci50cnVzdFByb3h5KTtcbiAgfVxuXG4gIGFwcC51c2UoY29ycygpKTtcblxuICAvLyAvLyBSb3V0ZXIgc2V0dXBcbiAgYXBwLnVzZShsb2cobG9nZ2VyKSk7XG4gIGFwcC51c2UoZXJyb3JSZXBvcnRpbmdNaWRkbGV3YXJlKGxvZ2dlcikpO1xuICBpZiAoY29uZmlnLnVzZXJfYWdlbnQpIHtcbiAgICBhcHAudXNlKGZ1bmN0aW9uIChfcmVxOiAkUmVxdWVzdEV4dGVuZCwgcmVzOiAkUmVzcG9uc2VFeHRlbmQsIG5leHQ6ICROZXh0RnVuY3Rpb25WZXIpOiB2b2lkIHtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ1gtUG93ZXJlZC1CeScsIGdldFVzZXJBZ2VudChjb25maWcudXNlcl9hZ2VudCkpO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGFwcC5kaXNhYmxlKCd4LXBvd2VyZWQtYnknKTtcbiAgfVxuXG4gIGFwcC51c2UoY29tcHJlc3Npb24oKSk7XG5cbiAgYXBwLmdldCgnLy0vc3RhdGljL2Zhdmljb24uaWNvJywgc2VydmVGYXZpY29uKGNvbmZpZykpO1xuXG4gIC8vIEhvb2sgZm9yIHRlc3RzIG9ubHlcbiAgaWYgKGNvbmZpZy5fZGVidWcpIHtcbiAgICBob29rRGVidWcoYXBwLCBjb25maWcuY29uZmlnUGF0aCk7XG4gIH1cblxuICBjb25zdCBwbHVnaW5zOiBwbHVnaW5VdGlscy5FeHByZXNzTWlkZGxld2FyZTxJQ29uZmlnLCAnJywgQXV0aD5bXSA9IGF3YWl0IGFzeW5jTG9hZFBsdWdpbihcbiAgICBjb25maWcubWlkZGxld2FyZXMsXG4gICAge1xuICAgICAgY29uZmlnLFxuICAgICAgbG9nZ2VyLFxuICAgIH0sXG4gICAgZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBwbHVnaW4ucmVnaXN0ZXJfbWlkZGxld2FyZXMgIT09ICd1bmRlZmluZWQnO1xuICAgIH0sXG4gICAgdHJ1ZSxcbiAgICBjb25maWc/LnNlcnZlclNldHRpbmdzPy5wbHVnaW5QcmVmaXggPz8gJ3ZlcmRhY2NpbycsXG4gICAgUExVR0lOX0NBVEVHT1JZLk1JRERMRVdBUkVcbiAgKTtcblxuICBwbHVnaW5zLmZvckVhY2goKHBsdWdpbjogYW55KSA9PiB7XG4gICAgcGx1Z2luLnJlZ2lzdGVyX21pZGRsZXdhcmVzKGFwcCwgYXV0aCwgc3RvcmFnZSk7XG4gIH0pO1xuXG4gIC8vIC8vIEZvciAgbnBtIHJlcXVlc3RcbiAgYXBwLnVzZShhcGlFbmRwb2ludChjb25maWcsIGF1dGgsIHN0b3JhZ2UpKTtcblxuICAvLyBGb3IgV2ViVUkgJiBXZWJVSSBBUElcbiAgaWYgKF8uZ2V0KGNvbmZpZywgJ3dlYi5lbmFibGUnLCB0cnVlKSkge1xuICAgIGFwcC51c2UoKF9yZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgcmVzLmxvY2Fscy5hcHBfdmVyc2lvbiA9IHZlcnNpb24gPz8gJyc7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gICAgY29uc3QgbWlkZGxld2FyZSA9IGF3YWl0IHdlYk1pZGRsZXdhcmUoY29uZmlnLCBhdXRoLCBzdG9yYWdlLCBsb2dnZXIpO1xuICAgIGFwcC51c2UobWlkZGxld2FyZSk7XG4gIH0gZWxzZSB7XG4gICAgYXBwLmdldCgnLycsIGZ1bmN0aW9uIChfLCBfXywgbmV4dDogJE5leHRGdW5jdGlvblZlcikge1xuICAgICAgbmV4dChFcnJvckNvZGUuZ2V0Tm90Rm91bmQoQVBJX0VSUk9SLldFQl9ESVNBQkxFRCkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXBwLmdldCgnLyonLCBmdW5jdGlvbiAoXywgX18sIG5leHQ6ICROZXh0RnVuY3Rpb25WZXIpIHtcbiAgICBuZXh0KEVycm9yQ29kZS5nZXROb3RGb3VuZChBUElfRVJST1IuRklMRV9OT1RfRk9VTkQpKTtcbiAgfSk7XG4gIGFwcC51c2UoaGFuZGxlRXJyb3IobG9nZ2VyKSk7XG4gIGFwcC51c2UoZmluYWwpO1xuXG4gIHJldHVybiBhcHA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoYXN5bmMgZnVuY3Rpb24gKGNvbmZpZ0hhc2g6IENvbmZpZ1lhbWwpOiBQcm9taXNlPGV4cHJlc3MuQXBwbGljYXRpb24+IHtcbiAgY29uc3QgY29uZmlnOiBJQ29uZmlnID0gbmV3IEFwcENvbmZpZyhfLmNsb25lRGVlcChjb25maWdIYXNoKSk7XG5cbiAgY29uc3Qgc3RvcmFnZSA9IG5ldyBTdG9yYWdlKGNvbmZpZyk7XG4gIC8vIHdhaXRzIHVudGlsIGluaXQgY2FsbHMgaGF2ZSBiZWVuIGluaXRpYWxpemVkXG4gIGF3YWl0IHN0b3JhZ2UuaW5pdChjb25maWcpO1xuICByZXR1cm4gYXdhaXQgZGVmaW5lQVBJKGNvbmZpZywgc3RvcmFnZSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsWUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsS0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUksS0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssT0FBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sS0FBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sUUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsV0FBQSxHQUFBUixPQUFBO0FBRUEsSUFBQVMsY0FBQSxHQUFBVCxPQUFB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