verdaccio
Version:
A lightweight private npm proxy registry
105 lines (99 loc) • 15.7 kB
JavaScript
;
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.7" || '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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