UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

79 lines (78 loc) 13.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.PLUGIN_UI_PREFIX = exports.DEFAULT_PLUGIN_UI_THEME = void 0; exports.loadTheme = loadTheme; exports.localWebEndpointsApi = localWebEndpointsApi; var _debug = _interopRequireDefault(require("debug")); var _express = _interopRequireWildcard(require("express")); var _lodash = _interopRequireDefault(require("lodash")); var _core = require("@verdaccio/core"); var _loaders = require("@verdaccio/loaders"); var _logger = require("@verdaccio/logger"); var _middleware = require("@verdaccio/middleware"); var _api = _interopRequireDefault(require("./api")); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const debug = (0, _debug.default)('verdaccio:web'); const PLUGIN_UI_PREFIX = exports.PLUGIN_UI_PREFIX = 'verdaccio-theme'; const DEFAULT_PLUGIN_UI_THEME = exports.DEFAULT_PLUGIN_UI_THEME = '@verdaccio/ui-theme'; async function loadTheme(config) { if (_lodash.default.isNil(config.theme) === false) { var _config$serverSetting, _config$serverSetting2; const plugin = await (0, _loaders.asyncLoadPlugin)(config.theme, { config, logger: _logger.logger }, // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown } function (plugin) { /** * - `staticPath`: is the same data returned in Verdaccio 5. - `manifest`: A webpack manifest object. - `manifestFiles`: A object with one property `js` and the array (order matters) of the manifest id to be loaded in the template dynamically. */ return plugin.staticPath && plugin.manifest && plugin.manifestFiles; }, 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 : PLUGIN_UI_PREFIX, _core.PLUGIN_CATEGORY.THEME); if (plugin.length > 1) { _logger.logger.warn('multiple ui themes are not supported; only the first plugin is used'); } return _lodash.default.head(plugin); } } function localWebEndpointsApi(auth, storage, config) { // eslint-disable-next-line new-cap const route = (0, _express.Router)(); // validate all of these params as a package name // this might be too harsh, so ask if it causes trouble= route.param('package', _middleware.validatePackage); route.param('filename', _middleware.validateName); route.param('version', _middleware.validateName); route.use(_express.default.urlencoded({ extended: false })); route.use(_middleware.setSecurityWebHeaders); route.use(auth.apiJWTmiddleware()); route.use((0, _api.default)(auth, storage, config)); return route; } var _default = async (config, auth, storage, logger) => { let pluginOptions = await loadTheme(config); if (!pluginOptions) { pluginOptions = require(DEFAULT_PLUGIN_UI_THEME)(config.web); logger.info({ name: DEFAULT_PLUGIN_UI_THEME, pluginCategory: _core.PLUGIN_CATEGORY.THEME }, 'plugin @{name} successfully loaded (@{pluginCategory})'); } // eslint-disable-next-line new-cap const router = (0, _express.Router)(); // @ts-ignore router.use('/', (0, _middleware.renderWebMiddleware)(config, auth.apiJWTmiddleware(), pluginOptions)); // web endpoints, search, packages, etc router.use(localWebEndpointsApi(auth, storage, config)); return router; }; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9leHByZXNzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbG9kYXNoIiwiX2NvcmUiLCJfbG9hZGVycyIsIl9sb2dnZXIiLCJfbWlkZGxld2FyZSIsIl9hcGkiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJkZWJ1ZyIsImJ1aWxkRGVidWciLCJQTFVHSU5fVUlfUFJFRklYIiwiZXhwb3J0cyIsIkRFRkFVTFRfUExVR0lOX1VJX1RIRU1FIiwibG9hZFRoZW1lIiwiY29uZmlnIiwiXyIsImlzTmlsIiwidGhlbWUiLCJfY29uZmlnJHNlcnZlclNldHRpbmciLCJfY29uZmlnJHNlcnZlclNldHRpbmcyIiwicGx1Z2luIiwiYXN5bmNMb2FkUGx1Z2luIiwibG9nZ2VyIiwic3RhdGljUGF0aCIsIm1hbmlmZXN0IiwibWFuaWZlc3RGaWxlcyIsInNlcnZlclNldHRpbmdzIiwicGx1Z2luUHJlZml4IiwiUExVR0lOX0NBVEVHT1JZIiwiVEhFTUUiLCJsZW5ndGgiLCJ3YXJuIiwiaGVhZCIsImxvY2FsV2ViRW5kcG9pbnRzQXBpIiwiYXV0aCIsInN0b3JhZ2UiLCJyb3V0ZSIsIlJvdXRlciIsInBhcmFtIiwidmFsaWRhdGVQYWNrYWdlIiwidmFsaWRhdGVOYW1lIiwidXNlIiwiZXhwcmVzcyIsInVybGVuY29kZWQiLCJleHRlbmRlZCIsInNldFNlY3VyaXR5V2ViSGVhZGVycyIsImFwaUpXVG1pZGRsZXdhcmUiLCJ3ZWJFbmRwb2ludHNBcGkiLCJfZGVmYXVsdCIsInBsdWdpbk9wdGlvbnMiLCJ3ZWIiLCJpbmZvIiwibmFtZSIsInBsdWdpbkNhdGVnb3J5Iiwicm91dGVyIiwicmVuZGVyV2ViTWlkZGxld2FyZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvd2ViL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBidWlsZERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBleHByZXNzLCB7IFJvdXRlciB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgUExVR0lOX0NBVEVHT1JZIH0gZnJvbSAnQHZlcmRhY2Npby9jb3JlJztcbmltcG9ydCB7IGFzeW5jTG9hZFBsdWdpbiB9IGZyb20gJ0B2ZXJkYWNjaW8vbG9hZGVycyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAdmVyZGFjY2lvL2xvZ2dlcic7XG5pbXBvcnQge1xuICByZW5kZXJXZWJNaWRkbGV3YXJlLFxuICBzZXRTZWN1cml0eVdlYkhlYWRlcnMsXG4gIHZhbGlkYXRlTmFtZSxcbiAgdmFsaWRhdGVQYWNrYWdlLFxufSBmcm9tICdAdmVyZGFjY2lvL21pZGRsZXdhcmUnO1xuXG5pbXBvcnQgd2ViRW5kcG9pbnRzQXBpIGZyb20gJy4vYXBpJztcblxuY29uc3QgZGVidWcgPSBidWlsZERlYnVnKCd2ZXJkYWNjaW86d2ViJyk7XG5leHBvcnQgY29uc3QgUExVR0lOX1VJX1BSRUZJWCA9ICd2ZXJkYWNjaW8tdGhlbWUnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExVR0lOX1VJX1RIRU1FID0gJ0B2ZXJkYWNjaW8vdWktdGhlbWUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRoZW1lKGNvbmZpZzogYW55KSB7XG4gIGlmIChfLmlzTmlsKGNvbmZpZy50aGVtZSkgPT09IGZhbHNlKSB7XG4gICAgY29uc3QgcGx1Z2luID0gYXdhaXQgYXN5bmNMb2FkUGx1Z2luKFxuICAgICAgY29uZmlnLnRoZW1lLFxuICAgICAgeyBjb25maWcsIGxvZ2dlciB9LFxuICAgICAgLy8gVE9ETzogYWRkIHR5cGVzIHsgc3RhdGljUGF0aDogc3RyaW5nOyBtYW5pZmVzdDogdW5rbm93bjsgbWFuaWZlc3RGaWxlczogdW5rbm93biB9XG4gICAgICBmdW5jdGlvbiAocGx1Z2luOiBhbnkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgLSBgc3RhdGljUGF0aGA6IGlzIHRoZSBzYW1lIGRhdGEgcmV0dXJuZWQgaW4gVmVyZGFjY2lvIDUuXG4gICAgICAgICAgICAgICAgIC0gYG1hbmlmZXN0YDogQSB3ZWJwYWNrIG1hbmlmZXN0IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgLSBgbWFuaWZlc3RGaWxlc2A6IEEgb2JqZWN0IHdpdGggb25lIHByb3BlcnR5IGBqc2AgYW5kIHRoZSBhcnJheSAob3JkZXIgbWF0dGVycykgb2YgdGhlIG1hbmlmZXN0IGlkIHRvIGJlIGxvYWRlZCBpbiB0aGUgdGVtcGxhdGUgZHluYW1pY2FsbHkuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgIHJldHVybiBwbHVnaW4uc3RhdGljUGF0aCAmJiBwbHVnaW4ubWFuaWZlc3QgJiYgcGx1Z2luLm1hbmlmZXN0RmlsZXM7XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIGNvbmZpZz8uc2VydmVyU2V0dGluZ3M/LnBsdWdpblByZWZpeCA/PyBQTFVHSU5fVUlfUFJFRklYLFxuICAgICAgUExVR0lOX0NBVEVHT1JZLlRIRU1FXG4gICAgKTtcbiAgICBpZiAocGx1Z2luLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdtdWx0aXBsZSB1aSB0aGVtZXMgYXJlIG5vdCBzdXBwb3J0ZWQ7IG9ubHkgdGhlIGZpcnN0IHBsdWdpbiBpcyB1c2VkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF8uaGVhZChwbHVnaW4pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbFdlYkVuZHBvaW50c0FwaShhdXRoLCBzdG9yYWdlLCBjb25maWcpOiBSb3V0ZXIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICBjb25zdCByb3V0ZSA9IFJvdXRlcigpO1xuICAvLyB2YWxpZGF0ZSBhbGwgb2YgdGhlc2UgcGFyYW1zIGFzIGEgcGFja2FnZSBuYW1lXG4gIC8vIHRoaXMgbWlnaHQgYmUgdG9vIGhhcnNoLCBzbyBhc2sgaWYgaXQgY2F1c2VzIHRyb3VibGU9XG4gIHJvdXRlLnBhcmFtKCdwYWNrYWdlJywgdmFsaWRhdGVQYWNrYWdlKTtcbiAgcm91dGUucGFyYW0oJ2ZpbGVuYW1lJywgdmFsaWRhdGVOYW1lKTtcbiAgcm91dGUucGFyYW0oJ3ZlcnNpb24nLCB2YWxpZGF0ZU5hbWUpO1xuICByb3V0ZS51c2UoZXhwcmVzcy51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IGZhbHNlIH0pKTtcbiAgcm91dGUudXNlKHNldFNlY3VyaXR5V2ViSGVhZGVycyk7XG4gIHJvdXRlLnVzZShhdXRoLmFwaUpXVG1pZGRsZXdhcmUoKSk7XG4gIHJvdXRlLnVzZSh3ZWJFbmRwb2ludHNBcGkoYXV0aCwgc3RvcmFnZSwgY29uZmlnKSk7XG5cbiAgcmV0dXJuIHJvdXRlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyAoY29uZmlnLCBhdXRoLCBzdG9yYWdlLCBsb2dnZXIpID0+IHtcbiAgbGV0IHBsdWdpbk9wdGlvbnMgPSBhd2FpdCBsb2FkVGhlbWUoY29uZmlnKTtcbiAgaWYgKCFwbHVnaW5PcHRpb25zKSB7XG4gICAgcGx1Z2luT3B0aW9ucyA9IHJlcXVpcmUoREVGQVVMVF9QTFVHSU5fVUlfVEhFTUUpKGNvbmZpZy53ZWIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgeyBuYW1lOiBERUZBVUxUX1BMVUdJTl9VSV9USEVNRSwgcGx1Z2luQ2F0ZWdvcnk6IFBMVUdJTl9DQVRFR09SWS5USEVNRSB9LFxuICAgICAgJ3BsdWdpbiBAe25hbWV9IHN1Y2Nlc3NmdWxseSBsb2FkZWQgKEB7cGx1Z2luQ2F0ZWdvcnl9KSdcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gIGNvbnN0IHJvdXRlciA9IFJvdXRlcigpO1xuICAvLyBAdHMtaWdub3JlXG4gIHJvdXRlci51c2UoJy8nLCByZW5kZXJXZWJNaWRkbGV3YXJlKGNvbmZpZywgYXV0aC5hcGlKV1RtaWRkbGV3YXJlKCksIHBsdWdpbk9wdGlvbnMpKTtcbiAgLy8gd2ViIGVuZHBvaW50cywgc2VhcmNoLCBwYWNrYWdlcywgZXRjXG4gIHJvdXRlci51c2UobG9jYWxXZWJFbmRwb2ludHNBcGkoYXV0aCwgc3RvcmFnZSwgY29uZmlnKSk7XG4gIHJldHVybiByb3V0ZXI7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQVAsT0FBQTtBQU9BLElBQUFRLElBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUFvQyxTQUFBRSx3QkFBQU8sQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQVQsdUJBQUEsWUFBQUEsQ0FBQU8sQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxD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