verdaccio
Version:
A lightweight private npm proxy registry
105 lines (99 loc) • 15.8 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.3.2" || '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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tcHJlc3Npb24iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jb3JzIiwiX2V4cHJlc3MiLCJfbG9kYXNoIiwiX2F1dGgiLCJfY29uZmlnIiwiX2NvcmUiLCJfbG9hZGVycyIsIl9taWRkbGV3YXJlIiwiX3NlYXJjaEluZGV4ZXIiLCJfY29uZmlnMiIsIl9jb25zdGFudHMiLCJfbG9nZ2VyIiwiX3N0b3JhZ2UiLCJfdXRpbHMiLCJfZGVidWciLCJfZW5kcG9pbnQiLCJfbWlkZGxld2FyZTIiLCJfd2ViIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwidmVyc2lvbiIsImRlZmluZUFQSSIsImNvbmZpZyIsInN0b3JhZ2UiLCJhdXRoIiwiQXV0aCIsImxvZ2dlciIsImxlZ2FjeU1lcmdlQ29uZmlncyIsImluaXQiLCJhcHAiLCJleHByZXNzIiwiU2VhcmNoTWVtb3J5SW5kZXhlciIsImNvbmZpZ3VyZVN0b3JhZ2UiLCJzZXQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJzZXJ2ZXIiLCJ0cnVzdFByb3h5IiwidXNlIiwiY29ycyIsImxvZyIsImVycm9yUmVwb3J0aW5nTWlkZGxld2FyZSIsInVzZXJfYWdlbnQiLCJfcmVxIiwicmVzIiwibmV4dCIsInNldEhlYWRlciIsImdldFVzZXJBZ2VudCIsImRpc2FibGUiLCJjb21wcmVzc2lvbiIsImdldCIsInNlcnZlRmF2aWNvbiIsImhvb2tEZWJ1ZyIsImNvbmZpZ1BhdGgiLCJwbHVnaW5zIiwiYXN5bmNMb2FkUGx1Z2luIiwibWlkZGxld2FyZXMiLCJwbHVnaW4iLCJyZWdpc3Rlcl9taWRkbGV3YXJlcyIsInNlcnZlclNldHRpbmdzIiwicGx1Z2luUHJlZml4IiwiUExVR0lOX0NBVEVHT1JZIiwiTUlERExFV0FSRSIsImZvckVhY2giLCJhcGlFbmRwb2ludCIsIl8iLCJsb2NhbHMiLCJhcHBfdmVyc2lvbiIsIm1pZGRsZXdhcmUiLCJ3ZWJNaWRkbGV3YXJlIiwiX18iLCJFcnJvckNvZGUiLCJnZXROb3RGb3VuZCIsIkFQSV9FUlJPUiIsIldFQl9ESVNBQkxFRCIsIkZJTEVfTk9UX0ZPVU5EIiwiaGFuZGxlRXJyb3IiLCJmaW5hbCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImNvbmZpZ0hhc2giLCJBcHBDb25maWciLCJjbG9uZURlZXAiLCJTdG9yYWdlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tcHJlc3Npb24gZnJvbSAnY29tcHJlc3Npb24nO1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycyc7XG5pbXBvcnQgdHlwZSB7IEFwcGxpY2F0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEF1dGggfSBmcm9tICdAdmVyZGFjY2lvL2F1dGgnO1xuaW1wb3J0IHsgZ2V0VXNlckFnZW50IH0gZnJvbSAnQHZlcmRhY2Npby9jb25maWcnO1xuaW1wb3J0IHR5cGUgeyBwbHVnaW5VdGlscyB9IGZyb20gJ0B2ZXJkYWNjaW8vY29yZSc7XG5pbXBvcnQgeyBQTFVHSU5fQ0FURUdPUlkgfSBmcm9tICdAdmVyZGFjY2lvL2NvcmUnO1xuaW1wb3J0IHsgYXN5bmNMb2FkUGx1Z2luIH0gZnJvbSAnQHZlcmRhY2Npby9sb2FkZXJzJztcbmltcG9ydCB7IGVycm9yUmVwb3J0aW5nTWlkZGxld2FyZSwgZmluYWwsIGhhbmRsZUVycm9yLCBsb2cgfSBmcm9tICdAdmVyZGFjY2lvL21pZGRsZXdhcmUnO1xuaW1wb3J0IHsgU2VhcmNoTWVtb3J5SW5kZXhlciB9IGZyb20gJ0B2ZXJkYWNjaW8vc2VhcmNoLWluZGV4ZXInO1xuaW1wb3J0IHR5cGUgeyBDb25maWdZYW1sLCBDb25maWcgYXMgSUNvbmZpZyB9IGZyb20gJ0B2ZXJkYWNjaW8vdHlwZXMnO1xuXG5pbXBvcnQgQXBwQ29uZmlnIGZyb20gJy4uL2xpYi9jb25maWcnO1xuaW1wb3J0IHsgQVBJX0VSUk9SIH0gZnJvbSAnLi4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9saWIvbG9nZ2VyJztcbmltcG9ydCBTdG9yYWdlIGZyb20gJy4uL2xpYi9zdG9yYWdlJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL2xpYi91dGlscyc7XG5pbXBvcnQgdHlwZSB7ICROZXh0RnVuY3Rpb25WZXIsICRSZXF1ZXN0RXh0ZW5kLCAkUmVzcG9uc2VFeHRlbmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgaG9va0RlYnVnIGZyb20gJy4vZGVidWcnO1xuaW1wb3J0IGFwaUVuZHBvaW50IGZyb20gJy4vZW5kcG9pbnQnO1xuaW1wb3J0IHsgc2VydmVGYXZpY29uIH0gZnJvbSAnLi9taWRkbGV3YXJlJztcbmltcG9ydCB3ZWJNaWRkbGV3YXJlIGZyb20gJy4vd2ViJztcblxuY29uc3QgdmVyc2lvbiA9IHByb2Nlc3MuZW52LlBBQ0tBR0VfVkVSU0lPTiB8fCAnZGV2JztcblxuY29uc3QgZGVmaW5lQVBJID0gYXN5bmMgZnVuY3Rpb24gKGNvbmZpZzogSUNvbmZpZywgc3RvcmFnZTogU3RvcmFnZSk6IFByb21pc2U8ZXhwcmVzcy5BcHBsaWNhdGlvbj4ge1xuICBjb25zdCBhdXRoID0gbmV3IEF1dGgoY29uZmlnLCBsb2dnZXIsIHsgbGVnYWN5TWVyZ2VDb25maWdzOiB0cnVlIH0pO1xuICBhd2FpdCBhdXRoLmluaXQoKTtcbiAgY29uc3QgYXBwOiBBcHBsaWNhdGlvbiA9IGV4cHJlc3MoKTtcbiAgU2VhcmNoTWVtb3J5SW5kZXhlci5jb25maWd1cmVTdG9yYWdlKHN0b3JhZ2UpO1xuICBhd2FpdCBTZWFyY2hNZW1vcnlJbmRleGVyLmluaXQobG9nZ2VyKTtcbiAgLy8gcnVuIGluIHByb2R1Y3Rpb24gbW9kZSBieSBkZWZhdWx0LCBqdXN0IGluIGNhc2VcbiAgLy8gaXQgc2hvdWxkbid0IG1ha2UgYW55IGRpZmZlcmVuY2UgYW55d2F5XG4gIGFwcC5zZXQoJ2VudicsIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdwcm9kdWN0aW9uJyk7XG5cbiAgLy8gQWxsb3cgYHJlcS5pcGAgdG8gcmVzb2x2ZSBwcm9wZXJseSB3aGVuIFZlcmRhY2NpbyBpcyBiZWhpbmQgYSBwcm94eSBvciBsb2FkLWJhbGFuY2VyXG4gIC8vIFNlZTogaHR0cHM6Ly9leHByZXNzanMuY29tL2VuL2d1aWRlL2JlaGluZC1wcm94aWVzLmh0bWxcbiAgaWYgKGNvbmZpZy5zZXJ2ZXI/LnRydXN0UHJveHkpIHtcbiAgICBhcHAuc2V0KCd0cnVzdCBwcm94eScsIGNvbmZpZy5zZXJ2ZXIudHJ1c3RQcm94eSk7XG4gIH1cblxuICBhcHAudXNlKGNvcnMoKSk7XG5cbiAgLy8gLy8gUm91dGVyIHNldHVwXG4gIGFwcC51c2UobG9nKGxvZ2dlcikpO1xuICBhcHAudXNlKGVycm9yUmVwb3J0aW5nTWlkZGxld2FyZShsb2dnZXIpKTtcbiAgaWYgKGNvbmZpZy51c2VyX2FnZW50KSB7XG4gICAgYXBwLnVzZShmdW5jdGlvbiAoX3JlcTogJFJlcXVlc3RFeHRlbmQsIHJlczogJFJlc3BvbnNlRXh0ZW5kLCBuZXh0OiAkTmV4dEZ1bmN0aW9uVmVyKTogdm9pZCB7XG4gICAgICByZXMuc2V0SGVhZGVyKCdYLVBvd2VyZWQtQnknLCBnZXRVc2VyQWdlbnQoY29uZmlnLnVzZXJfYWdlbnQpKTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBhcHAuZGlzYWJsZSgneC1wb3dlcmVkLWJ5Jyk7XG4gIH1cblxuICBhcHAudXNlKGNvbXByZXNzaW9uKCkpO1xuXG4gIGFwcC5nZXQoJy8tL3N0YXRpYy9mYXZpY29uLmljbycsIHNlcnZlRmF2aWNvbihjb25maWcpKTtcblxuICAvLyBIb29rIGZvciB0ZXN0cyBvbmx5XG4gIGlmIChjb25maWcuX2RlYnVnKSB7XG4gICAgaG9va0RlYnVnKGFwcCwgY29uZmlnLmNvbmZpZ1BhdGgpO1xuICB9XG5cbiAgY29uc3QgcGx1Z2luczogcGx1Z2luVXRpbHMuRXhwcmVzc01pZGRsZXdhcmU8SUNvbmZpZywgJycsIEF1dGg+W10gPSBhd2FpdCBhc3luY0xvYWRQbHVnaW4oXG4gICAgY29uZmlnLm1pZGRsZXdhcmVzLFxuICAgIHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGxvZ2dlcixcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHJldHVybiB0eXBlb2YgcGx1Z2luLnJlZ2lzdGVyX21pZGRsZXdhcmVzICE9PSAndW5kZWZpbmVkJztcbiAgICB9LFxuICAgIHRydWUsXG4gICAgY29uZmlnPy5zZXJ2ZXJTZXR0aW5ncz8ucGx1Z2luUHJlZml4ID8/ICd2ZXJkYWNjaW8nLFxuICAgIFBMVUdJTl9DQVRFR09SWS5NSURETEVXQVJFXG4gICk7XG5cbiAgcGx1Z2lucy5mb3JFYWNoKChwbHVnaW46IGFueSkgPT4ge1xuICAgIHBsdWdpbi5yZWdpc3Rlcl9taWRkbGV3YXJlcyhhcHAsIGF1dGgsIHN0b3JhZ2UpO1xuICB9KTtcblxuICAvLyAvLyBGb3IgIG5wbSByZXF1ZXN0XG4gIGFwcC51c2UoYXBpRW5kcG9pbnQoY29uZmlnLCBhdXRoLCBzdG9yYWdlKSk7XG5cbiAgLy8gRm9yIFdlYlVJICYgV2ViVUkgQVBJXG4gIGlmIChfLmdldChjb25maWcsICd3ZWIuZW5hYmxlJywgdHJ1ZSkpIHtcbiAgICBhcHAudXNlKChfcmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIHJlcy5sb2NhbHMuYXBwX3ZlcnNpb24gPSB2ZXJzaW9uID8/ICcnO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICAgIGNvbnN0IG1pZGRsZXdhcmUgPSBhd2FpdCB3ZWJNaWRkbGV3YXJlKGNvbmZpZywgYXV0aCwgc3RvcmFnZSwgbG9nZ2VyKTtcbiAgICBhcHAudXNlKG1pZGRsZXdhcmUpO1xuICB9IGVsc2Uge1xuICAgIGFwcC5nZXQoJy8nLCBmdW5jdGlvbiAoXywgX18sIG5leHQ6ICROZXh0RnVuY3Rpb25WZXIpIHtcbiAgICAgIG5leHQoRXJyb3JDb2RlLmdldE5vdEZvdW5kKEFQSV9FUlJPUi5XRUJfRElTQUJMRUQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcC5nZXQoJy8qJywgZnVuY3Rpb24gKF8sIF9fLCBuZXh0OiAkTmV4dEZ1bmN0aW9uVmVyKSB7XG4gICAgbmV4dChFcnJvckNvZGUuZ2V0Tm90Rm91bmQoQVBJX0VSUk9SLkZJTEVfTk9UX0ZPVU5EKSk7XG4gIH0pO1xuICBhcHAudXNlKGhhbmRsZUVycm9yKGxvZ2dlcikpO1xuICBhcHAudXNlKGZpbmFsKTtcblxuICByZXR1cm4gYXBwO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKGFzeW5jIGZ1bmN0aW9uIChjb25maWdIYXNoOiBDb25maWdZYW1sKTogUHJvbWlzZTxleHByZXNzLkFwcGxpY2F0aW9uPiB7XG4gIGNvbnN0IGNvbmZpZzogSUNvbmZpZyA9IG5ldyBBcHBDb25maWcoXy5jbG9uZURlZXAoY29uZmlnSGFzaCkpO1xuXG4gIGNvbnN0IHN0b3JhZ2UgPSBuZXcgU3RvcmFnZShjb25maWcpO1xuICAvLyB3YWl0cyB1bnRpbCBpbml0IGNhbGxzIGhhdmUgYmVlbiBpbml0aWFsaXplZFxuICBhd2FpdCBzdG9yYWdlLmluaXQoY29uZmlnKTtcbiAgcmV0dXJuIGF3YWl0IGRlZmluZUFQSShjb25maWcsIHN0b3JhZ2UpO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLFlBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLFFBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE9BQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLEtBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFdBQUEs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