UNPKG

verdaccio

Version:

A lightweight private npm proxy registry

124 lines (95 loc) 3.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.loadTheme = loadTheme; var _lodash = _interopRequireDefault(require("lodash")); var _fs = _interopRequireDefault(require("fs")); var _path = _interopRequireDefault(require("path")); var _express = _interopRequireDefault(require("express")); var _utils = require("../../lib/utils"); var _search = _interopRequireDefault(require("../../lib/search")); var _constants = require("../../lib/constants"); var _pluginLoader = _interopRequireDefault(require("../../lib/plugin-loader")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @prettier */ const { setSecurityWebHeaders } = require('../middleware'); const pkgJSON = require('../../../package.json'); function loadTheme(config) { if (_lodash.default.isNil(config.theme) === false) { return _lodash.default.head((0, _pluginLoader.default)(config, config.theme, {}, function (plugin) { return _lodash.default.isString(plugin); }, 'verdaccio-theme')); } } const sendFileCallback = next => err => { if (!err) { return; } if (err.status === _constants.HTTP_STATUS.NOT_FOUND) { next(); } else { next(err); } }; module.exports = function (config, auth, storage) { _search.default.configureStorage(storage); /* eslint new-cap:off */ const router = _express.default.Router(); router.use(auth.webUIJWTmiddleware()); router.use(setSecurityWebHeaders); const themePath = loadTheme(config) || require('@verdaccio/ui-theme')(); const indexTemplate = _path.default.join(themePath, 'index.html'); const template = _fs.default.readFileSync(indexTemplate).toString(); // Logo let logoURI = _lodash.default.get(config, 'web.logo') ? config.web.logo : ''; if (logoURI && !(0, _utils.isHTTPProtocol)(logoURI)) { // URI related to a local file // Note: `path.join` will break on Windows, because it transforms `/` to `\` // Use POSIX version `path.posix.join` instead. logoURI = _path.default.posix.join('/-/static/', _path.default.basename(logoURI)); router.get(logoURI, function (req, res, next) { res.sendFile(_path.default.resolve(config.web.logo), sendFileCallback(next)); }); } // Static router.get('/-/static/*', function (req, res, next) { const filename = req.params[0]; const file = `${themePath}/${filename}`; res.sendFile(file, sendFileCallback(next)); }); function renderHTML(req, res) { const protocol = (0, _utils.getWebProtocol)(req.get(_constants.HEADERS.FORWARDED_PROTO), req.protocol); const host = req.get('host'); const { url_prefix } = config; const uri = `${protocol}://${host}`; const base = (0, _utils.combineBaseUrl)(protocol, host, url_prefix); const primaryColor = _lodash.default.get(config, 'web.primary_color') ? config.web.primary_color : ''; const title = _lodash.default.get(config, 'web.title') ? config.web.title : _constants.WEB_TITLE; const scope = _lodash.default.get(config, 'web.scope') ? config.web.scope : ''; const options = { uri, protocol, host, url_prefix, base, primaryColor, title, scope }; const webPage = template.replace(/ToReplaceByVerdaccioUI/g, JSON.stringify(options)).replace(/ToReplaceByVerdaccio/g, base).replace(/ToReplaceByPrefix/g, url_prefix).replace(/ToReplaceByVersion/g, pkgJSON.version).replace(/ToReplaceByTitle/g, title).replace(/ToReplaceByLogo/g, logoURI).replace(/ToReplaceByPrimaryColor/g, primaryColor).replace(/ToReplaceByScope/g, scope); res.setHeader('Content-Type', _constants.HEADERS.TEXT_HTML); res.send(webPage); } router.get('/-/web/:section/*', function (req, res) { renderHTML(req, res); }); router.get('/', function (req, res) { renderHTML(req, res); }); return router; };