verdaccio
Version:
A lightweight private npm proxy registry
124 lines (95 loc) • 3.9 kB
JavaScript
;
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;
};