UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

109 lines (103 loc) 16.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 } = require('../../package.json'); const defineAPI = async function (config, storage) { var _config$server, _config$serverSetting, _config$serverSetting2; 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 = config.server) !== null && _config$server !== void 0 && _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$serverSetting = config === null || config === void 0 ? void 0 : (_config$serverSetting2 = config.serverSettings) === null || _config$serverSetting2 === void 0 ? void 0 : _config$serverSetting2.pluginPrefix) !== null && _config$serverSetting !== void 0 ? _config$serverSetting : '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 !== null && version !== void 0 ? 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) { (0, _logger.setup)(configHash.logs); 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tcHJlc3Npb24iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jb3JzIiwiX2V4cHJlc3MiLCJfbG9kYXNoIiwiX2F1dGgiLCJfY29uZmlnIiwiX2NvcmUiLCJfbG9hZGVycyIsIl9taWRkbGV3YXJlIiwiX3NlYXJjaEluZGV4ZXIiLCJfY29uZmlnMiIsIl9jb25zdGFudHMiLCJfbG9nZ2VyIiwiX3N0b3JhZ2UiLCJfdXRpbHMiLCJfZGVidWciLCJfZW5kcG9pbnQiLCJfbWlkZGxld2FyZTIiLCJfd2ViIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwidmVyc2lvbiIsImRlZmluZUFQSSIsImNvbmZpZyIsInN0b3JhZ2UiLCJfY29uZmlnJHNlcnZlciIsIl9jb25maWckc2VydmVyU2V0dGluZyIsIl9jb25maWckc2VydmVyU2V0dGluZzIiLCJhdXRoIiwiQXV0aCIsImxvZ2dlciIsImxlZ2FjeU1lcmdlQ29uZmlncyIsImluaXQiLCJhcHAiLCJleHByZXNzIiwiU2VhcmNoTWVtb3J5SW5kZXhlciIsImNvbmZpZ3VyZVN0b3JhZ2UiLCJzZXQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJzZXJ2ZXIiLCJ0cnVzdFByb3h5IiwidXNlIiwiY29ycyIsImxvZyIsImVycm9yUmVwb3J0aW5nTWlkZGxld2FyZSIsInVzZXJfYWdlbnQiLCJfcmVxIiwicmVzIiwibmV4dCIsInNldEhlYWRlciIsImdldFVzZXJBZ2VudCIsImRpc2FibGUiLCJjb21wcmVzc2lvbiIsImdldCIsInNlcnZlRmF2aWNvbiIsImhvb2tEZWJ1ZyIsImNvbmZpZ1BhdGgiLCJwbHVnaW5zIiwiYXN5bmNMb2FkUGx1Z2luIiwibWlkZGxld2FyZXMiLCJwbHVnaW4iLCJyZWdpc3Rlcl9taWRkbGV3YXJlcyIsInNlcnZlclNldHRpbmdzIiwicGx1Z2luUHJlZml4IiwiUExVR0lOX0NBVEVHT1JZIiwiTUlERExFV0FSRSIsImZvckVhY2giLCJhcGlFbmRwb2ludCIsIl8iLCJsb2NhbHMiLCJhcHBfdmVyc2lvbiIsIm1pZGRsZXdhcmUiLCJ3ZWJNaWRkbGV3YXJlIiwiX18iLCJFcnJvckNvZGUiLCJnZXROb3RGb3VuZCIsIkFQSV9FUlJPUiIsIldFQl9ESVNBQkxFRCIsIkZJTEVfTk9UX0ZPVU5EIiwiaGFuZGxlRXJyb3IiLCJmaW5hbCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImNvbmZpZ0hhc2giLCJzZXR1cCIsImxvZ3MiLCJBcHBDb25maWciLCJjbG9uZURlZXAiLCJTdG9yYWdlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tcHJlc3Npb24gZnJvbSAnY29tcHJlc3Npb24nO1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycyc7XG5pbXBvcnQgZXhwcmVzcywgeyBBcHBsaWNhdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQXV0aCB9IGZyb20gJ0B2ZXJkYWNjaW8vYXV0aCc7XG5pbXBvcnQgeyBnZXRVc2VyQWdlbnQgfSBmcm9tICdAdmVyZGFjY2lvL2NvbmZpZyc7XG5pbXBvcnQgeyBQTFVHSU5fQ0FURUdPUlksIHBsdWdpblV0aWxzIH0gZnJvbSAnQHZlcmRhY2Npby9jb3JlJztcbmltcG9ydCB7IGFzeW5jTG9hZFBsdWdpbiB9IGZyb20gJ0B2ZXJkYWNjaW8vbG9hZGVycyc7XG5pbXBvcnQgeyBlcnJvclJlcG9ydGluZ01pZGRsZXdhcmUsIGZpbmFsLCBoYW5kbGVFcnJvciB9IGZyb20gJ0B2ZXJkYWNjaW8vbWlkZGxld2FyZSc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICdAdmVyZGFjY2lvL21pZGRsZXdhcmUnO1xuaW1wb3J0IHsgU2VhcmNoTWVtb3J5SW5kZXhlciB9IGZyb20gJ0B2ZXJkYWNjaW8vc2VhcmNoLWluZGV4ZXInO1xuaW1wb3J0IHsgQ29uZmlnIGFzIElDb25maWcgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcblxuaW1wb3J0IEFwcENvbmZpZyBmcm9tICcuLi9saWIvY29uZmlnJztcbmltcG9ydCB7IEFQSV9FUlJPUiB9IGZyb20gJy4uL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgbG9nZ2VyLCBzZXR1cCB9IGZyb20gJy4uL2xpYi9sb2dnZXInO1xuaW1wb3J0IFN0b3JhZ2UgZnJvbSAnLi4vbGliL3N0b3JhZ2UnO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vbGliL3V0aWxzJztcbmltcG9ydCB7ICROZXh0RnVuY3Rpb25WZXIsICRSZXF1ZXN0RXh0ZW5kLCAkUmVzcG9uc2VFeHRlbmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgaG9va0RlYnVnIGZyb20gJy4vZGVidWcnO1xuaW1wb3J0IGFwaUVuZHBvaW50IGZyb20gJy4vZW5kcG9pbnQnO1xuaW1wb3J0IHsgc2VydmVGYXZpY29uIH0gZnJvbSAnLi9taWRkbGV3YXJlJztcbmltcG9ydCB3ZWJNaWRkbGV3YXJlIGZyb20gJy4vd2ViJztcblxuY29uc3QgeyB2ZXJzaW9uIH0gPSByZXF1aXJlKCcuLi8uLi9wYWNrYWdlLmpzb24nKTtcblxuY29uc3QgZGVmaW5lQVBJID0gYXN5bmMgZnVuY3Rpb24gKGNvbmZpZzogSUNvbmZpZywgc3RvcmFnZTogU3RvcmFnZSk6IFByb21pc2U8ZXhwcmVzcy5BcHBsaWNhdGlvbj4ge1xuICBjb25zdCBhdXRoID0gbmV3IEF1dGgoY29uZmlnLCBsb2dnZXIsIHsgbGVnYWN5TWVyZ2VDb25maWdzOiB0cnVlIH0pO1xuICBhd2FpdCBhdXRoLmluaXQoKTtcbiAgY29uc3QgYXBwOiBBcHBsaWNhdGlvbiA9IGV4cHJlc3MoKTtcbiAgU2VhcmNoTWVtb3J5SW5kZXhlci5jb25maWd1cmVTdG9yYWdlKHN0b3JhZ2UpO1xuICBhd2FpdCBTZWFyY2hNZW1vcnlJbmRleGVyLmluaXQobG9nZ2VyKTtcbiAgLy8gcnVuIGluIHByb2R1Y3Rpb24gbW9kZSBieSBkZWZhdWx0LCBqdXN0IGluIGNhc2VcbiAgLy8gaXQgc2hvdWxkbid0IG1ha2UgYW55IGRpZmZlcmVuY2UgYW55d2F5XG4gIGFwcC5zZXQoJ2VudicsIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdwcm9kdWN0aW9uJyk7XG5cbiAgLy8gQWxsb3cgYHJlcS5pcGAgdG8gcmVzb2x2ZSBwcm9wZXJseSB3aGVuIFZlcmRhY2NpbyBpcyBiZWhpbmQgYSBwcm94eSBvciBsb2FkLWJhbGFuY2VyXG4gIC8vIFNlZTogaHR0cHM6Ly9leHByZXNzanMuY29tL2VuL2d1aWRlL2JlaGluZC1wcm94aWVzLmh0bWxcbiAgaWYgKGNvbmZpZy5zZXJ2ZXI/LnRydXN0UHJveHkpIHtcbiAgICBhcHAuc2V0KCd0cnVzdCBwcm94eScsIGNvbmZpZy5zZXJ2ZXIudHJ1c3RQcm94eSk7XG4gIH1cblxuICBhcHAudXNlKGNvcnMoKSk7XG5cbiAgLy8gLy8gUm91dGVyIHNldHVwXG4gIGFwcC51c2UobG9nKGxvZ2dlcikpO1xuICBhcHAudXNlKGVycm9yUmVwb3J0aW5nTWlkZGxld2FyZShsb2dnZXIpKTtcbiAgaWYgKGNvbmZpZy51c2VyX2FnZW50KSB7XG4gICAgYXBwLnVzZShmdW5jdGlvbiAoX3JlcTogJFJlcXVlc3RFeHRlbmQsIHJlczogJFJlc3BvbnNlRXh0ZW5kLCBuZXh0OiAkTmV4dEZ1bmN0aW9uVmVyKTogdm9pZCB7XG4gICAgICByZXMuc2V0SGVhZGVyKCdYLVBvd2VyZWQtQnknLCBnZXRVc2VyQWdlbnQoY29uZmlnLnVzZXJfYWdlbnQpKTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBhcHAuZGlzYWJsZSgneC1wb3dlcmVkLWJ5Jyk7XG4gIH1cblxuICBhcHAudXNlKGNvbXByZXNzaW9uKCkpO1xuXG4gIGFwcC5nZXQoJy8tL3N0YXRpYy9mYXZpY29uLmljbycsIHNlcnZlRmF2aWNvbihjb25maWcpKTtcblxuICAvLyBIb29rIGZvciB0ZXN0cyBvbmx5XG4gIGlmIChjb25maWcuX2RlYnVnKSB7XG4gICAgaG9va0RlYnVnKGFwcCwgY29uZmlnLmNvbmZpZ1BhdGgpO1xuICB9XG5cbiAgY29uc3QgcGx1Z2luczogcGx1Z2luVXRpbHMuRXhwcmVzc01pZGRsZXdhcmU8SUNvbmZpZywge30sIEF1dGg+W10gPSBhd2FpdCBhc3luY0xvYWRQbHVnaW4oXG4gICAgY29uZmlnLm1pZGRsZXdhcmVzLFxuICAgIHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGxvZ2dlcixcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgcGx1Z2luLnJlZ2lzdGVyX21pZGRsZXdhcmVzICE9PSAndW5kZWZpbmVkJztcbiAgICB9LFxuICAgIHRydWUsXG4gICAgY29uZmlnPy5zZXJ2ZXJTZXR0aW5ncz8ucGx1Z2luUHJlZml4ID8/ICd2ZXJkYWNjaW8nLFxuICAgIFBMVUdJTl9DQVRFR09SWS5NSURETEVXQVJFXG4gICk7XG5cbiAgcGx1Z2lucy5mb3JFYWNoKChwbHVnaW46IGFueSkgPT4ge1xuICAgIHBsdWdpbi5yZWdpc3Rlcl9taWRkbGV3YXJlcyhhcHAsIGF1dGgsIHN0b3JhZ2UpO1xuICB9KTtcblxuICAvLyAvLyBGb3IgIG5wbSByZXF1ZXN0XG4gIGFwcC51c2UoYXBpRW5kcG9pbnQoY29uZmlnLCBhdXRoLCBzdG9yYWdlKSk7XG5cbiAgLy8gRm9yIFdlYlVJICYgV2ViVUkgQVBJXG4gIGlmIChfLmdldChjb25maWcsICd3ZWIuZW5hYmxlJywgdHJ1ZSkpIHtcbiAgICBhcHAudXNlKChfcmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIHJlcy5sb2NhbHMuYXBwX3ZlcnNpb24gPSB2ZXJzaW9uID8/ICcnO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICAgIGNvbnN0IG1pZGRsZXdhcmUgPSBhd2FpdCB3ZWJNaWRkbGV3YXJlKGNvbmZpZywgYXV0aCwgc3RvcmFnZSwgbG9nZ2VyKTtcbiAgICBhcHAudXNlKG1pZGRsZXdhcmUpO1xuICB9IGVsc2Uge1xuICAgIGFwcC5nZXQoJy8nLCBmdW5jdGlvbiAoXywgX18sIG5leHQ6ICROZXh0RnVuY3Rpb25WZXIpIHtcbiAgICAgIG5leHQoRXJyb3JDb2RlLmdldE5vdEZvdW5kKEFQSV9FUlJPUi5XRUJfRElTQUJMRUQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcC5nZXQoJy8qJywgZnVuY3Rpb24gKF8sIF9fLCBuZXh0OiAkTmV4dEZ1bmN0aW9uVmVyKSB7XG4gICAgbmV4dChFcnJvckNvZGUuZ2V0Tm90Rm91bmQoQVBJX0VSUk9SLkZJTEVfTk9UX0ZPVU5EKSk7XG4gIH0pO1xuICBhcHAudXNlKGhhbmRsZUVycm9yKGxvZ2dlcikpO1xuICBhcHAudXNlKGZpbmFsKTtcblxuICByZXR1cm4gYXBwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKGFzeW5jIGZ1bmN0aW9uIChjb25maWdIYXNoOiBhbnkpIHtcbiAgc2V0dXAoY29uZmlnSGFzaC5sb2dzKTtcbiAgY29uc3QgY29uZmlnOiBJQ29uZmlnID0gbmV3IEFwcENvbmZpZyhfLmNsb25lRGVlcChjb25maWdIYXNoKSk7XG5cbiAgY29uc3Qgc3RvcmFnZSA9IG5ldyBTdG9yYWdlKGNvbmZpZyk7XG4gIC8vIHdhaXRzIHVudGlsIGluaXQgY2FsbHMgaGF2ZSBiZWVuIGluaXRpYWxpemVkXG4gIGF3YWl0IHN0b3JhZ2UuaW5pdChjb25maWcsIFtdKTtcbiAgcmV0dXJuIGF3YWl0IGRlZmluZUFQSShjb25maWcsIHN0b3JhZ2UpO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLFlBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLEtBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFFB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