UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

100 lines (98 loc) 15.9 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.webAPIMiddleware = webAPIMiddleware; exports.webMiddleware = webMiddleware; 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 _uiTheme = _interopRequireDefault(require("@verdaccio/ui-theme")); 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) { 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?.serverSettings?.pluginPrefix ?? 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 webAPIMiddleware(tokenMiddleware, webEndpointsApi) { // 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); if (typeof tokenMiddleware === 'function') { route.use(tokenMiddleware); } if (typeof webEndpointsApi === 'function') { route.use(webEndpointsApi); } return route; } function webMiddleware(config, middlewares, pluginOptions) { // eslint-disable-next-line new-cap const router = _express.default.Router(); const { tokenMiddleware, webEndpointsApi } = middlewares; // render web router.use(_middleware.WebUrlsNamespace.root, (0, _middleware.renderWebMiddleware)(config, tokenMiddleware, pluginOptions)); // web endpoints: search, packages, readme, sidebar, etc router.use(_middleware.WebUrlsNamespace.endpoints, webAPIMiddleware(tokenMiddleware, webEndpointsApi)); return router; } var _default = async (config, auth, storage, logger) => { let pluginOptions = await loadTheme(config); if (!pluginOptions) { debug('no theme plugin found, using default theme'); pluginOptions = (0, _uiTheme.default)(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)(); // web endpoints, search, packages, etc router.use(webMiddleware(config, { tokenMiddleware: auth.webUIJWTmiddleware(), webEndpointsApi: (0, _api.default)(auth, storage, config) }, pluginOptions)); return router; }; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9leHByZXNzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbG9kYXNoIiwiX2NvcmUiLCJfbG9hZGVycyIsIl9sb2dnZXIiLCJfbWlkZGxld2FyZSIsIl91aVRoZW1lIiwiX2FwaSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlYnVnIiwiYnVpbGREZWJ1ZyIsIlBMVUdJTl9VSV9QUkVGSVgiLCJleHBvcnRzIiwiREVGQVVMVF9QTFVHSU5fVUlfVEhFTUUiLCJsb2FkVGhlbWUiLCJjb25maWciLCJfIiwiaXNOaWwiLCJ0aGVtZSIsInBsdWdpbiIsImFzeW5jTG9hZFBsdWdpbiIsImxvZ2dlciIsInN0YXRpY1BhdGgiLCJtYW5pZmVzdCIsIm1hbmlmZXN0RmlsZXMiLCJzZXJ2ZXJTZXR0aW5ncyIsInBsdWdpblByZWZpeCIsIlBMVUdJTl9DQVRFR09SWSIsIlRIRU1FIiwibGVuZ3RoIiwid2FybiIsImhlYWQiLCJ3ZWJBUElNaWRkbGV3YXJlIiwidG9rZW5NaWRkbGV3YXJlIiwid2ViRW5kcG9pbnRzQXBpIiwicm91dGUiLCJSb3V0ZXIiLCJwYXJhbSIsInZhbGlkYXRlUGFja2FnZSIsInZhbGlkYXRlTmFtZSIsInVzZSIsImV4cHJlc3MiLCJ1cmxlbmNvZGVkIiwiZXh0ZW5kZWQiLCJzZXRTZWN1cml0eVdlYkhlYWRlcnMiLCJ3ZWJNaWRkbGV3YXJlIiwibWlkZGxld2FyZXMiLCJwbHVnaW5PcHRpb25zIiwicm91dGVyIiwiV2ViVXJsc05hbWVzcGFjZSIsInJvb3QiLCJyZW5kZXJXZWJNaWRkbGV3YXJlIiwiZW5kcG9pbnRzIiwiX2RlZmF1bHQiLCJhdXRoIiwic3RvcmFnZSIsImRlZmF1bHRUaGVtZSIsIndlYiIsImluZm8iLCJuYW1lIiwicGx1Z2luQ2F0ZWdvcnkiLCJ3ZWJVSUpXVG1pZGRsZXdhcmUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3dlYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYnVpbGREZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgZXhwcmVzcywgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBQTFVHSU5fQ0FURUdPUlkgfSBmcm9tICdAdmVyZGFjY2lvL2NvcmUnO1xuaW1wb3J0IHsgYXN5bmNMb2FkUGx1Z2luIH0gZnJvbSAnQHZlcmRhY2Npby9sb2FkZXJzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0B2ZXJkYWNjaW8vbG9nZ2VyJztcbmltcG9ydCB7XG4gIFdlYlVybHNOYW1lc3BhY2UsXG4gIHJlbmRlcldlYk1pZGRsZXdhcmUsXG4gIHNldFNlY3VyaXR5V2ViSGVhZGVycyxcbiAgdmFsaWRhdGVOYW1lLFxuICB2YWxpZGF0ZVBhY2thZ2UsXG59IGZyb20gJ0B2ZXJkYWNjaW8vbWlkZGxld2FyZSc7XG5pbXBvcnQgZGVmYXVsdFRoZW1lIGZyb20gJ0B2ZXJkYWNjaW8vdWktdGhlbWUnO1xuXG5pbXBvcnQgd2ViRW5kcG9pbnRzQXBpIGZyb20gJy4vYXBpJztcblxuY29uc3QgZGVidWcgPSBidWlsZERlYnVnKCd2ZXJkYWNjaW86d2ViJyk7XG5leHBvcnQgY29uc3QgUExVR0lOX1VJX1BSRUZJWCA9ICd2ZXJkYWNjaW8tdGhlbWUnO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExVR0lOX1VJX1RIRU1FID0gJ0B2ZXJkYWNjaW8vdWktdGhlbWUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFRoZW1lKGNvbmZpZzogYW55KSB7XG4gIGlmIChfLmlzTmlsKGNvbmZpZy50aGVtZSkgPT09IGZhbHNlKSB7XG4gICAgY29uc3QgcGx1Z2luID0gYXdhaXQgYXN5bmNMb2FkUGx1Z2luKFxuICAgICAgY29uZmlnLnRoZW1lLFxuICAgICAgeyBjb25maWcsIGxvZ2dlciB9LFxuICAgICAgLy8gVE9ETzogYWRkIHR5cGVzIHsgc3RhdGljUGF0aDogc3RyaW5nOyBtYW5pZmVzdDogdW5rbm93bjsgbWFuaWZlc3RGaWxlczogdW5rbm93biB9XG4gICAgICBmdW5jdGlvbiAocGx1Z2luOiBhbnkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgLSBgc3RhdGljUGF0aGA6IGlzIHRoZSBzYW1lIGRhdGEgcmV0dXJuZWQgaW4gVmVyZGFjY2lvIDUuXG4gICAgICAgICAgICAgICAgIC0gYG1hbmlmZXN0YDogQSB3ZWJwYWNrIG1hbmlmZXN0IG9iamVjdC5cbiAgICAgICAgICAgICAgICAgLSBgbWFuaWZlc3RGaWxlc2A6IEEgb2JqZWN0IHdpdGggb25lIHByb3BlcnR5IGBqc2AgYW5kIHRoZSBhcnJheSAob3JkZXIgbWF0dGVycykgb2YgdGhlIG1hbmlmZXN0IGlkIHRvIGJlIGxvYWRlZCBpbiB0aGUgdGVtcGxhdGUgZHluYW1pY2FsbHkuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgIHJldHVybiBwbHVnaW4uc3RhdGljUGF0aCAmJiBwbHVnaW4ubWFuaWZlc3QgJiYgcGx1Z2luLm1hbmlmZXN0RmlsZXM7XG4gICAgICB9LFxuICAgICAgdHJ1ZSxcbiAgICAgIGNvbmZpZz8uc2VydmVyU2V0dGluZ3M/LnBsdWdpblByZWZpeCA/PyBQTFVHSU5fVUlfUFJFRklYLFxuICAgICAgUExVR0lOX0NBVEVHT1JZLlRIRU1FXG4gICAgKTtcbiAgICBpZiAocGx1Z2luLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdtdWx0aXBsZSB1aSB0aGVtZXMgYXJlIG5vdCBzdXBwb3J0ZWQ7IG9ubHkgdGhlIGZpcnN0IHBsdWdpbiBpcyB1c2VkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF8uaGVhZChwbHVnaW4pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3ZWJBUElNaWRkbGV3YXJlKFxuICB0b2tlbk1pZGRsZXdhcmU6IFJlcXVlc3RIYW5kbGVyLFxuICB3ZWJFbmRwb2ludHNBcGk6IFJlcXVlc3RIYW5kbGVyXG4pOiBSb3V0ZXIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICBjb25zdCByb3V0ZSA9IFJvdXRlcigpO1xuICAvLyB2YWxpZGF0ZSBhbGwgb2YgdGhlc2UgcGFyYW1zIGFzIGEgcGFja2FnZSBuYW1lXG4gIC8vIHRoaXMgbWlnaHQgYmUgdG9vIGhhcnNoLCBzbyBhc2sgaWYgaXQgY2F1c2VzIHRyb3VibGU9XG4gIHJvdXRlLnBhcmFtKCdwYWNrYWdlJywgdmFsaWRhdGVQYWNrYWdlKTtcbiAgcm91dGUucGFyYW0oJ2ZpbGVuYW1lJywgdmFsaWRhdGVOYW1lKTtcbiAgcm91dGUucGFyYW0oJ3ZlcnNpb24nLCB2YWxpZGF0ZU5hbWUpO1xuICByb3V0ZS51c2UoZXhwcmVzcy51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IGZhbHNlIH0pKTtcbiAgcm91dGUudXNlKHNldFNlY3VyaXR5V2ViSGVhZGVycyk7XG5cbiAgaWYgKHR5cGVvZiB0b2tlbk1pZGRsZXdhcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByb3V0ZS51c2UodG9rZW5NaWRkbGV3YXJlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygd2ViRW5kcG9pbnRzQXBpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcm91dGUudXNlKHdlYkVuZHBvaW50c0FwaSk7XG4gIH1cblxuICByZXR1cm4gcm91dGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3ZWJNaWRkbGV3YXJlKGNvbmZpZywgbWlkZGxld2FyZXMsIHBsdWdpbk9wdGlvbnMpOiBhbnkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuICBjb25zdCByb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuICBjb25zdCB7IHRva2VuTWlkZGxld2FyZSwgd2ViRW5kcG9pbnRzQXBpIH0gPSBtaWRkbGV3YXJlcztcbiAgLy8gcmVuZGVyIHdlYlxuICByb3V0ZXIudXNlKFdlYlVybHNOYW1lc3BhY2Uucm9vdCwgcmVuZGVyV2ViTWlkZGxld2FyZShjb25maWcsIHRva2VuTWlkZGxld2FyZSwgcGx1Z2luT3B0aW9ucykpO1xuICAvLyB3ZWIgZW5kcG9pbnRzOiBzZWFyY2gsIHBhY2thZ2VzLCByZWFkbWUsIHNpZGViYXIsIGV0Y1xuICByb3V0ZXIudXNlKFdlYlVybHNOYW1lc3BhY2UuZW5kcG9pbnRzLCB3ZWJBUElNaWRkbGV3YXJlKHRva2VuTWlkZGxld2FyZSwgd2ViRW5kcG9pbnRzQXBpKSk7XG4gIHJldHVybiByb3V0ZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIChjb25maWcsIGF1dGgsIHN0b3JhZ2UsIGxvZ2dlcikgPT4ge1xuICBsZXQgcGx1Z2luT3B0aW9ucyA9IGF3YWl0IGxvYWRUaGVtZShjb25maWcpO1xuICBpZiAoIXBsdWdpbk9wdGlvbnMpIHtcbiAgICBkZWJ1Zygnbm8gdGhlbWUgcGx1Z2luIGZvdW5kLCB1c2luZyBkZWZhdWx0IHRoZW1lJyk7XG4gICAgcGx1Z2luT3B0aW9ucyA9IGRlZmF1bHRUaGVtZShjb25maWcud2ViKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIHsgbmFtZTogREVGQVVMVF9QTFVHSU5fVUlfVEhFTUUsIHBsdWdpbkNhdGVnb3J5OiBQTFVHSU5fQ0FURUdPUlkuVEhFTUUgfSxcbiAgICAgICdwbHVnaW4gQHtuYW1lfSBzdWNjZXNzZnVsbHkgbG9hZGVkIChAe3BsdWdpbkNhdGVnb3J5fSknXG4gICAgKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gIGNvbnN0IHJvdXRlciA9IFJvdXRlcigpO1xuICAvLyB3ZWIgZW5kcG9pbnRzLCBzZWFyY2gsIHBhY2thZ2VzLCBldGNcbiAgcm91dGVyLnVzZShcbiAgICB3ZWJNaWRkbGV3YXJlKFxuICAgICAgY29uZmlnLFxuICAgICAge1xuICAgICAgICB0b2tlbk1pZGRsZXdhcmU6IGF1dGgud2ViVUlKV1RtaWRkbGV3YXJlKCksXG4gICAgICAgIHdlYkVuZHBvaW50c0FwaTogd2ViRW5kcG9pbnRzQXBpKGF1dGgsIHN0b3JhZ2UsIGNvbmZpZyksXG4gICAgICB9LFxuICAgICAgcGx1Z2luT3B0aW9uc1xuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJvdXRlcjtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFHLE9BQUEsR0FBQUosc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFJLEtBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFFBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQVAsT0FBQTtBQU9BLElBQUFRLFFBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFTLElBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUFvQyxTQUFBRSx3QkFBQVEsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQVYsdUJBQUEsWUFBQUEsQ0FBQVEsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEs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