@verdaccio/middleware 7.0.0-next-7.17 → 7.0.0-next-7.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @verdaccio/middleware
2
2
 
3
+ ## 7.0.0-next-7.18
4
+
5
+ ### Patch Changes
6
+
7
+ - 10dd81f: feat: complete overhaul of web user interface
8
+ - Updated dependencies [10dd81f]
9
+ - @verdaccio/config@7.0.0-next-7.18
10
+ - @verdaccio/core@7.0.0-next-7.18
11
+ - @verdaccio/url@12.0.0-next-7.18
12
+ - @verdaccio/utils@7.0.0-next-7.18
13
+
3
14
  ## 7.0.0-next-7.17
4
15
 
5
16
  ### Patch Changes
@@ -25,7 +25,7 @@ const sendFileCallback = next => err => {
25
25
  }
26
26
  };
27
27
  function renderWebMiddleware(config, tokenMiddleware, pluginOptions) {
28
- var _config$web, _config$web2;
28
+ var _config$web, _config$web2, _config$web3, _config$web4;
29
29
  const {
30
30
  staticPath,
31
31
  manifest,
@@ -47,32 +47,42 @@ function renderWebMiddleware(config, tokenMiddleware, pluginOptions) {
47
47
  debug('render static file %o', file);
48
48
  res.sendFile(file, sendFileCallback(next));
49
49
  });
50
-
51
- // check the origin of the logo
52
- if (config !== null && config !== void 0 && (_config$web = config.web) !== null && _config$web !== void 0 && _config$web.logo && !(0, _url.isURLhasValidProtocol)(config === null || config === void 0 ? void 0 : (_config$web2 = config.web) === null || _config$web2 === void 0 ? void 0 : _config$web2.logo)) {
53
- // URI related to a local file
54
- const absoluteLocalFile = _path.default.posix.resolve(config.web.logo);
55
- debug('serve local logo %s', absoluteLocalFile);
56
- try {
57
- // TODO: replace existsSync by async alternative
58
- if (_fs.default.existsSync(absoluteLocalFile) && typeof _fs.default.accessSync(absoluteLocalFile, _fs.default.constants.R_OK) === 'undefined') {
59
- // Note: `path.join` will break on Windows, because it transforms `/` to `\`
60
- // Use POSIX version `path.posix.join` instead.
61
- config.web.logo = _path.default.posix.join('/-/static/', _path.default.basename(config.web.logo));
62
- router.get(config.web.logo, function (_req, res, next) {
63
- // @ts-ignore
64
- debug('serve custom logo web:%s - local:%s', config.web.logo, absoluteLocalFile);
65
- res.sendFile(absoluteLocalFile, sendFileCallback(next));
66
- });
67
- debug('enabled custom logo %s', config.web.logo);
68
- } else {
69
- config.web.logo = undefined;
50
+ function renderLogo(logo) {
51
+ // check the origin of the logo
52
+ if (logo && !(0, _url.isURLhasValidProtocol)(logo)) {
53
+ // URI related to a local file
54
+ const absoluteLocalFile = _path.default.posix.resolve(logo);
55
+ debug('serve local logo %s', absoluteLocalFile);
56
+ try {
57
+ // TODO: replace existsSync by async alternative
58
+ if (_fs.default.existsSync(absoluteLocalFile) && typeof _fs.default.accessSync(absoluteLocalFile, _fs.default.constants.R_OK) === 'undefined') {
59
+ // Note: `path.join` will break on Windows, because it transforms `/` to `\`
60
+ // Use POSIX version `path.posix.join` instead.
61
+ logo = _path.default.posix.join('/-/static/', _path.default.basename(logo));
62
+ router.get(logo, function (_req, res, next) {
63
+ // @ts-ignore
64
+ debug('serve custom logo web:%s - local:%s', logo, absoluteLocalFile);
65
+ res.sendFile(absoluteLocalFile, sendFileCallback(next));
66
+ });
67
+ debug('enabled custom logo %s', logo);
68
+ } else {
69
+ logo = undefined;
70
+ debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
71
+ }
72
+ } catch {
73
+ logo = undefined;
70
74
  debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
71
75
  }
72
- } catch {
73
- config.web.logo = undefined;
74
- debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
75
76
  }
77
+ return logo;
78
+ }
79
+ const logo = renderLogo(config === null || config === void 0 ? void 0 : (_config$web = config.web) === null || _config$web === void 0 ? void 0 : _config$web.logo);
80
+ if (config !== null && config !== void 0 && (_config$web2 = config.web) !== null && _config$web2 !== void 0 && _config$web2.logo) {
81
+ config.web.logo = logo;
82
+ }
83
+ const logoDark = renderLogo(config === null || config === void 0 ? void 0 : (_config$web3 = config.web) === null || _config$web3 === void 0 ? void 0 : _config$web3.logoDark);
84
+ if (config !== null && config !== void 0 && (_config$web4 = config.web) !== null && _config$web4 !== void 0 && _config$web4.logoDark) {
85
+ config.web.logoDark = logoDark;
76
86
  }
77
87
  router.get('/-/web/:section/*', function (req, res) {
78
88
  (0, _renderHTML.default)(config, manifest, manifestFiles, req, res);
@@ -1 +1 @@
1
- {"version":3,"file":"render-web.js","names":["_debug","_interopRequireDefault","require","_express","_fs","_path","_core","_url","_security","_renderHTML","obj","__esModule","default","debug","buildDebug","sendFileCallback","next","err","status","HTTP_STATUS","NOT_FOUND","renderWebMiddleware","config","tokenMiddleware","pluginOptions","_config$web","_config$web2","staticPath","manifest","manifestFiles","router","express","Router","use","setSecurityWebHeaders","get","req","res","filename","params","file","sendFile","web","logo","isURLhasValidProtocol","absoluteLocalFile","path","posix","resolve","fs","existsSync","accessSync","constants","R_OK","join","basename","_req","undefined","renderHTML"],"sources":["../../../src/middlewares/web/render-web.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport express from 'express';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { isURLhasValidProtocol } from '@verdaccio/url';\n\nimport { setSecurityWebHeaders } from './security';\nimport renderHTML from './utils/renderHTML';\n\nconst debug = buildDebug('verdaccio:web:render');\n\nconst sendFileCallback = (next) => (err) => {\n if (!err) {\n return;\n }\n if (err.status === HTTP_STATUS.NOT_FOUND) {\n next();\n } else {\n next(err);\n }\n};\n\nexport function renderWebMiddleware(config, tokenMiddleware, pluginOptions) {\n const { staticPath, manifest, manifestFiles } = pluginOptions;\n debug('static path %o', staticPath);\n\n /* eslint new-cap:off */\n const router = express.Router();\n if (typeof tokenMiddleware === 'function') {\n router.use(tokenMiddleware);\n }\n\n router.use(setSecurityWebHeaders);\n\n // any match within the static is routed to the file system\n router.get('/-/static/*', function (req, res, next) {\n const filename = req.params[0];\n const file = `${staticPath}/${filename}`;\n debug('render static file %o', file);\n res.sendFile(file, sendFileCallback(next));\n });\n\n // check the origin of the logo\n if (config?.web?.logo && !isURLhasValidProtocol(config?.web?.logo)) {\n // URI related to a local file\n const absoluteLocalFile = path.posix.resolve(config.web.logo);\n debug('serve local logo %s', absoluteLocalFile);\n try {\n // TODO: replace existsSync by async alternative\n if (\n fs.existsSync(absoluteLocalFile) &&\n typeof fs.accessSync(absoluteLocalFile, fs.constants.R_OK) === 'undefined'\n ) {\n // Note: `path.join` will break on Windows, because it transforms `/` to `\\`\n // Use POSIX version `path.posix.join` instead.\n config.web.logo = path.posix.join('/-/static/', path.basename(config.web.logo));\n router.get(config.web.logo, function (_req, res, next) {\n // @ts-ignore\n debug('serve custom logo web:%s - local:%s', config.web.logo, absoluteLocalFile);\n res.sendFile(absoluteLocalFile, sendFileCallback(next));\n });\n debug('enabled custom logo %s', config.web.logo);\n } else {\n config.web.logo = undefined;\n debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);\n }\n } catch {\n config.web.logo = undefined;\n debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);\n }\n }\n\n router.get('/-/web/:section/*', function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render html section');\n });\n\n router.get('/', function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render root');\n });\n\n return router;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"render-web.js","names":["_debug","_interopRequireDefault","require","_express","_fs","_path","_core","_url","_security","_renderHTML","obj","__esModule","default","debug","buildDebug","sendFileCallback","next","err","status","HTTP_STATUS","NOT_FOUND","renderWebMiddleware","config","tokenMiddleware","pluginOptions","_config$web","_config$web2","_config$web3","_config$web4","staticPath","manifest","manifestFiles","router","express","Router","use","setSecurityWebHeaders","get","req","res","filename","params","file","sendFile","renderLogo","logo","isURLhasValidProtocol","absoluteLocalFile","path","posix","resolve","fs","existsSync","accessSync","constants","R_OK","join","basename","_req","undefined","web","logoDark","renderHTML"],"sources":["../../../src/middlewares/web/render-web.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport express from 'express';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { isURLhasValidProtocol } from '@verdaccio/url';\n\nimport { setSecurityWebHeaders } from './security';\nimport renderHTML from './utils/renderHTML';\n\nconst debug = buildDebug('verdaccio:web:render');\n\nconst sendFileCallback = (next) => (err) => {\n if (!err) {\n return;\n }\n if (err.status === HTTP_STATUS.NOT_FOUND) {\n next();\n } else {\n next(err);\n }\n};\n\nexport function renderWebMiddleware(config, tokenMiddleware, pluginOptions) {\n const { staticPath, manifest, manifestFiles } = pluginOptions;\n debug('static path %o', staticPath);\n\n /* eslint new-cap:off */\n const router = express.Router();\n if (typeof tokenMiddleware === 'function') {\n router.use(tokenMiddleware);\n }\n\n router.use(setSecurityWebHeaders);\n\n // any match within the static is routed to the file system\n router.get('/-/static/*', function (req, res, next) {\n const filename = req.params[0];\n const file = `${staticPath}/${filename}`;\n debug('render static file %o', file);\n res.sendFile(file, sendFileCallback(next));\n });\n\n function renderLogo(logo: string | undefined): string | undefined {\n // check the origin of the logo\n if (logo && !isURLhasValidProtocol(logo)) {\n // URI related to a local file\n const absoluteLocalFile = path.posix.resolve(logo);\n debug('serve local logo %s', absoluteLocalFile);\n try {\n // TODO: replace existsSync by async alternative\n if (\n fs.existsSync(absoluteLocalFile) &&\n typeof fs.accessSync(absoluteLocalFile, fs.constants.R_OK) === 'undefined'\n ) {\n // Note: `path.join` will break on Windows, because it transforms `/` to `\\`\n // Use POSIX version `path.posix.join` instead.\n logo = path.posix.join('/-/static/', path.basename(logo));\n router.get(logo, function (_req, res, next) {\n // @ts-ignore\n debug('serve custom logo web:%s - local:%s', logo, absoluteLocalFile);\n res.sendFile(absoluteLocalFile, sendFileCallback(next));\n });\n debug('enabled custom logo %s', logo);\n } else {\n logo = undefined;\n debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);\n }\n } catch {\n logo = undefined;\n debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);\n }\n }\n return logo;\n }\n\n const logo = renderLogo(config?.web?.logo);\n if (config?.web?.logo) {\n config.web.logo = logo;\n }\n const logoDark = renderLogo(config?.web?.logoDark);\n if (config?.web?.logoDark) {\n config.web.logoDark = logoDark;\n }\n\n router.get('/-/web/:section/*', function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render html section');\n });\n\n router.get('/', function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render root');\n });\n\n return router;\n}\n"],"mappings":"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"}
@@ -3,5 +3,5 @@ import { ConfigYaml } from '@verdaccio/types';
3
3
  import type { RequestOptions } from '@verdaccio/url';
4
4
  import type { Manifest } from './manifest';
5
5
  import type { WebpackManifest } from './template';
6
- export declare function resolveLogo(config: ConfigYaml, requestOptions: RequestOptions): string;
6
+ export declare function resolveLogo(logo: string | undefined, url_prefix: string | undefined, requestOptions: RequestOptions): string;
7
7
  export default function renderHTML(config: ConfigYaml, manifest: WebpackManifest, manifestFiles: Manifest | null | undefined, requestOptions: RequestOptions, res: Response): void;
@@ -26,46 +26,44 @@ const defaultManifestFiles = {
26
26
  ico: 'favicon.ico',
27
27
  css: []
28
28
  };
29
- function resolveLogo(config, requestOptions) {
30
- var _config$web, _config$web2, _config$web3, _config$web5;
31
- if (typeof (config === null || config === void 0 ? void 0 : (_config$web = config.web) === null || _config$web === void 0 ? void 0 : _config$web.logo) !== 'string') {
29
+ function resolveLogo(logo, url_prefix, requestOptions) {
30
+ if (typeof logo !== 'string') {
32
31
  return '';
33
32
  }
34
- const isLocalFile = (config === null || config === void 0 ? void 0 : (_config$web2 = config.web) === null || _config$web2 === void 0 ? void 0 : _config$web2.logo) && !(0, _url2.isURLhasValidProtocol)(config === null || config === void 0 ? void 0 : (_config$web3 = config.web) === null || _config$web3 === void 0 ? void 0 : _config$web3.logo);
33
+ const isLocalFile = logo && !(0, _url2.isURLhasValidProtocol)(logo);
35
34
  if (isLocalFile) {
36
- var _config$web4;
37
- return `${(0, _url2.getPublicUrl)(config === null || config === void 0 ? void 0 : config.url_prefix, requestOptions)}-/static/${_path.default.basename(config === null || config === void 0 ? void 0 : (_config$web4 = config.web) === null || _config$web4 === void 0 ? void 0 : _config$web4.logo)}`;
38
- } else if ((0, _url2.isURLhasValidProtocol)(config === null || config === void 0 ? void 0 : (_config$web5 = config.web) === null || _config$web5 === void 0 ? void 0 : _config$web5.logo)) {
39
- var _config$web6;
40
- return config === null || config === void 0 ? void 0 : (_config$web6 = config.web) === null || _config$web6 === void 0 ? void 0 : _config$web6.logo;
35
+ return `${(0, _url2.getPublicUrl)(url_prefix, requestOptions)}-/static/${_path.default.basename(logo)}`;
36
+ } else if ((0, _url2.isURLhasValidProtocol)(logo)) {
37
+ return logo;
41
38
  } else {
42
39
  return '';
43
40
  }
44
41
  }
45
42
  function renderHTML(config, manifest, manifestFiles, requestOptions, res) {
46
- var _config$i18n$web, _config$i18n, _config$web$hideDepre, _config$web7, _config$web8, _config$web9, _config$web$darkMode, _config$web10, _config$web$title, _config$web11, _config$web$scope, _config$web12, _config$web$pkgManage, _config$web13, _res$locals$app_versi, _validatePrimaryColor, _config$web$primary_c, _config$web14, _config$web15;
43
+ var _config$i18n$web, _config$i18n, _config$web$hideDepre, _config$web, _config$web2, _config$web3, _config$web$darkMode, _config$web4, _config$web$title, _config$web5, _config$web$scope, _config$web6, _config$web7, _config$web8, _config$web$pkgManage, _config$web9, _res$locals$app_versi, _validatePrimaryColor, _config$web$primary_c, _config$web10, _config$web11;
47
44
  const {
48
45
  url_prefix
49
46
  } = config;
50
47
  const base = (0, _url2.getPublicUrl)(config === null || config === void 0 ? void 0 : config.url_prefix, requestOptions);
51
48
  const basename = new _url.URL(base).pathname;
52
49
  const language = (_config$i18n$web = config === null || config === void 0 ? void 0 : (_config$i18n = config.i18n) === null || _config$i18n === void 0 ? void 0 : _config$i18n.web) !== null && _config$i18n$web !== void 0 ? _config$i18n$web : DEFAULT_LANGUAGE;
53
- const hideDeprecatedVersions = (_config$web$hideDepre = config === null || config === void 0 ? void 0 : (_config$web7 = config.web) === null || _config$web7 === void 0 ? void 0 : _config$web7.hideDeprecatedVersions) !== null && _config$web$hideDepre !== void 0 ? _config$web$hideDepre : false;
50
+ const hideDeprecatedVersions = (_config$web$hideDepre = config === null || config === void 0 ? void 0 : (_config$web = config.web) === null || _config$web === void 0 ? void 0 : _config$web.hideDeprecatedVersions) !== null && _config$web$hideDepre !== void 0 ? _config$web$hideDepre : false;
54
51
  // @ts-ignore
55
- const needHtmlCache = [undefined, null].includes(config === null || config === void 0 ? void 0 : (_config$web8 = config.web) === null || _config$web8 === void 0 ? void 0 : _config$web8.html_cache) ? true : config === null || config === void 0 ? void 0 : (_config$web9 = config.web) === null || _config$web9 === void 0 ? void 0 : _config$web9.html_cache;
56
- const darkMode = (_config$web$darkMode = config === null || config === void 0 ? void 0 : (_config$web10 = config.web) === null || _config$web10 === void 0 ? void 0 : _config$web10.darkMode) !== null && _config$web$darkMode !== void 0 ? _config$web$darkMode : false;
57
- const title = (_config$web$title = config === null || config === void 0 ? void 0 : (_config$web11 = config.web) === null || _config$web11 === void 0 ? void 0 : _config$web11.title) !== null && _config$web$title !== void 0 ? _config$web$title : _config.WEB_TITLE;
52
+ const needHtmlCache = [undefined, null].includes(config === null || config === void 0 ? void 0 : (_config$web2 = config.web) === null || _config$web2 === void 0 ? void 0 : _config$web2.html_cache) ? true : config === null || config === void 0 ? void 0 : (_config$web3 = config.web) === null || _config$web3 === void 0 ? void 0 : _config$web3.html_cache;
53
+ const darkMode = (_config$web$darkMode = config === null || config === void 0 ? void 0 : (_config$web4 = config.web) === null || _config$web4 === void 0 ? void 0 : _config$web4.darkMode) !== null && _config$web$darkMode !== void 0 ? _config$web$darkMode : false;
54
+ const title = (_config$web$title = config === null || config === void 0 ? void 0 : (_config$web5 = config.web) === null || _config$web5 === void 0 ? void 0 : _config$web5.title) !== null && _config$web$title !== void 0 ? _config$web$title : _config.WEB_TITLE;
58
55
  const login = (0, _webUtils.hasLogin)(config);
59
- const scope = (_config$web$scope = config === null || config === void 0 ? void 0 : (_config$web12 = config.web) === null || _config$web12 === void 0 ? void 0 : _config$web12.scope) !== null && _config$web$scope !== void 0 ? _config$web$scope : '';
60
- const logo = resolveLogo(config, requestOptions);
61
- const pkgManagers = (_config$web$pkgManage = config === null || config === void 0 ? void 0 : (_config$web13 = config.web) === null || _config$web13 === void 0 ? void 0 : _config$web13.pkgManagers) !== null && _config$web$pkgManage !== void 0 ? _config$web$pkgManage : ['yarn', 'pnpm', 'npm'];
56
+ const scope = (_config$web$scope = config === null || config === void 0 ? void 0 : (_config$web6 = config.web) === null || _config$web6 === void 0 ? void 0 : _config$web6.scope) !== null && _config$web$scope !== void 0 ? _config$web$scope : '';
57
+ const logo = resolveLogo(config === null || config === void 0 ? void 0 : (_config$web7 = config.web) === null || _config$web7 === void 0 ? void 0 : _config$web7.logo, config === null || config === void 0 ? void 0 : config.url_prefix, requestOptions);
58
+ const logoDark = resolveLogo(config === null || config === void 0 ? void 0 : (_config$web8 = config.web) === null || _config$web8 === void 0 ? void 0 : _config$web8.logoDark, config === null || config === void 0 ? void 0 : config.url_prefix, requestOptions);
59
+ const pkgManagers = (_config$web$pkgManage = config === null || config === void 0 ? void 0 : (_config$web9 = config.web) === null || _config$web9 === void 0 ? void 0 : _config$web9.pkgManagers) !== null && _config$web$pkgManage !== void 0 ? _config$web$pkgManage : ['yarn', 'pnpm', 'npm'];
62
60
  const version = (_res$locals$app_versi = res.locals.app_version) !== null && _res$locals$app_versi !== void 0 ? _res$locals$app_versi : '';
63
61
  const flags = {
64
62
  ...config.flags,
65
63
  // legacy from 5.x
66
64
  ...config.experiments
67
65
  };
68
- const primaryColor = (_validatePrimaryColor = (0, _webUtils.validatePrimaryColor)((_config$web$primary_c = config === null || config === void 0 ? void 0 : (_config$web14 = config.web) === null || _config$web14 === void 0 ? void 0 : _config$web14.primary_color) !== null && _config$web$primary_c !== void 0 ? _config$web$primary_c : config === null || config === void 0 ? void 0 : (_config$web15 = config.web) === null || _config$web15 === void 0 ? void 0 : _config$web15.primaryColor)) !== null && _validatePrimaryColor !== void 0 ? _validatePrimaryColor : '#4b5e40';
66
+ const primaryColor = (_validatePrimaryColor = (0, _webUtils.validatePrimaryColor)((_config$web$primary_c = config === null || config === void 0 ? void 0 : (_config$web10 = config.web) === null || _config$web10 === void 0 ? void 0 : _config$web10.primary_color) !== null && _config$web$primary_c !== void 0 ? _config$web$primary_c : config === null || config === void 0 ? void 0 : (_config$web11 = config.web) === null || _config$web11 === void 0 ? void 0 : _config$web11.primaryColor)) !== null && _validatePrimaryColor !== void 0 ? _validatePrimaryColor : '#4b5e40';
69
67
  const {
70
68
  scriptsBodyAfter,
71
69
  metaScripts,
@@ -75,7 +73,9 @@ function renderHTML(config, manifest, manifestFiles, requestOptions, res) {
75
73
  showThemeSwitch,
76
74
  showFooter,
77
75
  showSearch,
78
- showDownloadTarball
76
+ showDownloadTarball,
77
+ showRaw,
78
+ showUplinks
79
79
  } = Object.assign({}, {
80
80
  scriptsBodyAfter: [],
81
81
  bodyBefore: [],
@@ -88,6 +88,8 @@ function renderHTML(config, manifest, manifestFiles, requestOptions, res) {
88
88
  showFooter,
89
89
  showSearch,
90
90
  showDownloadTarball,
91
+ showRaw,
92
+ showUplinks,
91
93
  darkMode,
92
94
  url_prefix,
93
95
  basename,
@@ -95,6 +97,7 @@ function renderHTML(config, manifest, manifestFiles, requestOptions, res) {
95
97
  primaryColor,
96
98
  version,
97
99
  logo,
100
+ logoDark,
98
101
  flags,
99
102
  login,
100
103
  pkgManagers,
@@ -1 +1 @@
1
- {"version":3,"file":"renderHTML.js","names":["_debug","_interopRequireDefault","require","_lruCache","_path","_url","_config","_core","_url2","_template","_webUtils","obj","__esModule","default","DEFAULT_LANGUAGE","cache","LRU","max","ttl","debug","buildDebug","defaultManifestFiles","js","ico","css","resolveLogo","config","requestOptions","_config$web","_config$web2","_config$web3","_config$web5","web","logo","isLocalFile","isURLhasValidProtocol","_config$web4","getPublicUrl","url_prefix","path","basename","_config$web6","renderHTML","manifest","manifestFiles","res","_config$i18n$web","_config$i18n","_config$web$hideDepre","_config$web7","_config$web8","_config$web9","_config$web$darkMode","_config$web10","_config$web$title","_config$web11","_config$web$scope","_config$web12","_config$web$pkgManage","_config$web13","_res$locals$app_versi","_validatePrimaryColor","_config$web$primary_c","_config$web14","_config$web15","base","URL","pathname","language","i18n","hideDeprecatedVersions","needHtmlCache","undefined","includes","html_cache","darkMode","title","WEB_TITLE","login","hasLogin","scope","pkgManagers","version","locals","app_version","flags","experiments","primaryColor","validatePrimaryColor","primary_color","scriptsBodyAfter","metaScripts","scriptsbodyBefore","showInfo","showSettings","showThemeSwitch","showFooter","showSearch","showDownloadTarball","Object","assign","bodyBefore","options","webPage","get","renderTemplate","set","error","Error","stack","setHeader","HEADERS","TEXT_HTML","send"],"sources":["../../../../src/middlewares/web/utils/renderHTML.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport type { Response } from 'express';\nimport LRU from 'lru-cache';\nimport path from 'path';\nimport { URL } from 'url';\n\nimport { WEB_TITLE } from '@verdaccio/config';\nimport { HEADERS } from '@verdaccio/core';\nimport { ConfigYaml, TemplateUIOptions } from '@verdaccio/types';\nimport type { RequestOptions } from '@verdaccio/url';\nimport { getPublicUrl, isURLhasValidProtocol } from '@verdaccio/url';\n\nimport type { Manifest } from './manifest';\nimport renderTemplate from './template';\nimport type { WebpackManifest } from './template';\nimport { hasLogin, validatePrimaryColor } from './web-utils';\n\nconst DEFAULT_LANGUAGE = 'es-US';\nconst cache = new LRU({ max: 500, ttl: 1000 * 60 * 60 });\n\nconst debug = buildDebug('verdaccio:web:render');\n\nconst defaultManifestFiles: Manifest = {\n js: ['runtime.js', 'vendors.js', 'main.js'],\n ico: 'favicon.ico',\n css: [],\n};\n\nexport function resolveLogo(config: ConfigYaml, requestOptions: RequestOptions) {\n if (typeof config?.web?.logo !== 'string') {\n return '';\n }\n const isLocalFile = config?.web?.logo && !isURLhasValidProtocol(config?.web?.logo);\n\n if (isLocalFile) {\n return `${getPublicUrl(config?.url_prefix, requestOptions)}-/static/${path.basename(config?.web?.logo)}`;\n } else if (isURLhasValidProtocol(config?.web?.logo)) {\n return config?.web?.logo;\n } else {\n return '';\n }\n}\n\nexport default function renderHTML(\n config: ConfigYaml,\n manifest: WebpackManifest,\n manifestFiles: Manifest | null | undefined,\n requestOptions: RequestOptions,\n res: Response\n) {\n const { url_prefix } = config;\n const base = getPublicUrl(config?.url_prefix, requestOptions);\n const basename = new URL(base).pathname;\n const language = config?.i18n?.web ?? DEFAULT_LANGUAGE;\n const hideDeprecatedVersions = config?.web?.hideDeprecatedVersions ?? false;\n // @ts-ignore\n const needHtmlCache = [undefined, null].includes(config?.web?.html_cache)\n ? true\n : config?.web?.html_cache;\n const darkMode = config?.web?.darkMode ?? false;\n const title = config?.web?.title ?? WEB_TITLE;\n const login = hasLogin(config);\n const scope = config?.web?.scope ?? '';\n const logo = resolveLogo(config, requestOptions);\n const pkgManagers = config?.web?.pkgManagers ?? ['yarn', 'pnpm', 'npm'];\n const version = res.locals.app_version ?? '';\n const flags = {\n ...config.flags,\n // legacy from 5.x\n ...config.experiments,\n };\n const primaryColor =\n validatePrimaryColor(config?.web?.primary_color ?? config?.web?.primaryColor) ?? '#4b5e40';\n const {\n scriptsBodyAfter,\n metaScripts,\n scriptsbodyBefore,\n showInfo,\n showSettings,\n showThemeSwitch,\n showFooter,\n showSearch,\n showDownloadTarball,\n } = Object.assign(\n {},\n {\n scriptsBodyAfter: [],\n bodyBefore: [],\n metaScripts: [],\n },\n config?.web\n );\n const options: TemplateUIOptions = {\n showInfo,\n showSettings,\n showThemeSwitch,\n showFooter,\n showSearch,\n showDownloadTarball,\n darkMode,\n url_prefix,\n basename,\n base,\n primaryColor,\n version,\n logo,\n flags,\n login,\n pkgManagers,\n title,\n scope,\n language,\n hideDeprecatedVersions,\n };\n\n let webPage;\n\n try {\n webPage = cache.get('template');\n if (!webPage) {\n webPage = renderTemplate(\n {\n manifest: manifestFiles ?? defaultManifestFiles,\n options,\n scriptsBodyAfter,\n metaScripts,\n scriptsbodyBefore,\n },\n manifest\n );\n\n if (needHtmlCache) {\n cache.set('template', webPage);\n debug('set template cache');\n }\n } else {\n debug('reuse template cache');\n }\n } catch (error: any) {\n throw new Error(`theme could not be load, stack ${error.stack}`);\n }\n res.setHeader('Content-Type', HEADERS.TEXT_HTML);\n res.send(webPage);\n debug('web rendered');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"renderHTML.js","names":["_debug","_interopRequireDefault","require","_lruCache","_path","_url","_config","_core","_url2","_template","_webUtils","obj","__esModule","default","DEFAULT_LANGUAGE","cache","LRU","max","ttl","debug","buildDebug","defaultManifestFiles","js","ico","css","resolveLogo","logo","url_prefix","requestOptions","isLocalFile","isURLhasValidProtocol","getPublicUrl","path","basename","renderHTML","config","manifest","manifestFiles","res","_config$i18n$web","_config$i18n","_config$web$hideDepre","_config$web","_config$web2","_config$web3","_config$web$darkMode","_config$web4","_config$web$title","_config$web5","_config$web$scope","_config$web6","_config$web7","_config$web8","_config$web$pkgManage","_config$web9","_res$locals$app_versi","_validatePrimaryColor","_config$web$primary_c","_config$web10","_config$web11","base","URL","pathname","language","i18n","web","hideDeprecatedVersions","needHtmlCache","undefined","includes","html_cache","darkMode","title","WEB_TITLE","login","hasLogin","scope","logoDark","pkgManagers","version","locals","app_version","flags","experiments","primaryColor","validatePrimaryColor","primary_color","scriptsBodyAfter","metaScripts","scriptsbodyBefore","showInfo","showSettings","showThemeSwitch","showFooter","showSearch","showDownloadTarball","showRaw","showUplinks","Object","assign","bodyBefore","options","webPage","get","renderTemplate","set","error","Error","stack","setHeader","HEADERS","TEXT_HTML","send"],"sources":["../../../../src/middlewares/web/utils/renderHTML.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport type { Response } from 'express';\nimport LRU from 'lru-cache';\nimport path from 'path';\nimport { URL } from 'url';\n\nimport { WEB_TITLE } from '@verdaccio/config';\nimport { HEADERS } from '@verdaccio/core';\nimport { ConfigYaml, TemplateUIOptions } from '@verdaccio/types';\nimport type { RequestOptions } from '@verdaccio/url';\nimport { getPublicUrl, isURLhasValidProtocol } from '@verdaccio/url';\n\nimport type { Manifest } from './manifest';\nimport renderTemplate from './template';\nimport type { WebpackManifest } from './template';\nimport { hasLogin, validatePrimaryColor } from './web-utils';\n\nconst DEFAULT_LANGUAGE = 'es-US';\nconst cache = new LRU({ max: 500, ttl: 1000 * 60 * 60 });\n\nconst debug = buildDebug('verdaccio:web:render');\n\nconst defaultManifestFiles: Manifest = {\n js: ['runtime.js', 'vendors.js', 'main.js'],\n ico: 'favicon.ico',\n css: [],\n};\n\nexport function resolveLogo(\n logo: string | undefined,\n url_prefix: string | undefined,\n requestOptions: RequestOptions\n) {\n if (typeof logo !== 'string') {\n return '';\n }\n const isLocalFile = logo && !isURLhasValidProtocol(logo);\n\n if (isLocalFile) {\n return `${getPublicUrl(url_prefix, requestOptions)}-/static/${path.basename(logo)}`;\n } else if (isURLhasValidProtocol(logo)) {\n return logo;\n } else {\n return '';\n }\n}\n\nexport default function renderHTML(\n config: ConfigYaml,\n manifest: WebpackManifest,\n manifestFiles: Manifest | null | undefined,\n requestOptions: RequestOptions,\n res: Response\n) {\n const { url_prefix } = config;\n const base = getPublicUrl(config?.url_prefix, requestOptions);\n const basename = new URL(base).pathname;\n const language = config?.i18n?.web ?? DEFAULT_LANGUAGE;\n const hideDeprecatedVersions = config?.web?.hideDeprecatedVersions ?? false;\n // @ts-ignore\n const needHtmlCache = [undefined, null].includes(config?.web?.html_cache)\n ? true\n : config?.web?.html_cache;\n const darkMode = config?.web?.darkMode ?? false;\n const title = config?.web?.title ?? WEB_TITLE;\n const login = hasLogin(config);\n const scope = config?.web?.scope ?? '';\n const logo = resolveLogo(config?.web?.logo, config?.url_prefix, requestOptions);\n const logoDark = resolveLogo(config?.web?.logoDark, config?.url_prefix, requestOptions);\n const pkgManagers = config?.web?.pkgManagers ?? ['yarn', 'pnpm', 'npm'];\n const version = res.locals.app_version ?? '';\n const flags = {\n ...config.flags,\n // legacy from 5.x\n ...config.experiments,\n };\n const primaryColor =\n validatePrimaryColor(config?.web?.primary_color ?? config?.web?.primaryColor) ?? '#4b5e40';\n const {\n scriptsBodyAfter,\n metaScripts,\n scriptsbodyBefore,\n showInfo,\n showSettings,\n showThemeSwitch,\n showFooter,\n showSearch,\n showDownloadTarball,\n showRaw,\n showUplinks,\n } = Object.assign(\n {},\n {\n scriptsBodyAfter: [],\n bodyBefore: [],\n metaScripts: [],\n },\n config?.web\n );\n const options: TemplateUIOptions = {\n showInfo,\n showSettings,\n showThemeSwitch,\n showFooter,\n showSearch,\n showDownloadTarball,\n showRaw,\n showUplinks,\n darkMode,\n url_prefix,\n basename,\n base,\n primaryColor,\n version,\n logo,\n logoDark,\n flags,\n login,\n pkgManagers,\n title,\n scope,\n language,\n hideDeprecatedVersions,\n };\n\n let webPage;\n\n try {\n webPage = cache.get('template');\n if (!webPage) {\n webPage = renderTemplate(\n {\n manifest: manifestFiles ?? defaultManifestFiles,\n options,\n scriptsBodyAfter,\n metaScripts,\n scriptsbodyBefore,\n },\n manifest\n );\n\n if (needHtmlCache) {\n cache.set('template', webPage);\n debug('set template cache');\n }\n } else {\n debug('reuse template cache');\n }\n } catch (error: any) {\n throw new Error(`theme could not be load, stack ${error.stack}`);\n }\n res.setHeader('Content-Type', HEADERS.TEXT_HTML);\n res.send(webPage);\n debug('web rendered');\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/middleware",
3
- "version": "7.0.0-next-7.17",
3
+ "version": "7.0.0-next-7.18",
4
4
  "description": "express middleware utils",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -29,10 +29,10 @@
29
29
  "node": ">=12"
30
30
  },
31
31
  "dependencies": {
32
- "@verdaccio/core": "7.0.0-next-7.17",
33
- "@verdaccio/utils": "7.0.0-next-7.17",
34
- "@verdaccio/config": "7.0.0-next-7.17",
35
- "@verdaccio/url": "12.0.0-next-7.17",
32
+ "@verdaccio/core": "7.0.0-next-7.18",
33
+ "@verdaccio/utils": "7.0.0-next-7.18",
34
+ "@verdaccio/config": "7.0.0-next-7.18",
35
+ "@verdaccio/url": "12.0.0-next-7.18",
36
36
  "debug": "4.3.4",
37
37
  "lru-cache": "7.18.3",
38
38
  "express": "4.19.2",
@@ -45,7 +45,7 @@
45
45
  "url": "https://opencollective.com/verdaccio"
46
46
  },
47
47
  "devDependencies": {
48
- "@verdaccio/logger": "7.0.0-next-7.17",
48
+ "@verdaccio/logger": "7.0.0-next-7.18",
49
49
  "body-parser": "1.20.2",
50
50
  "supertest": "6.3.4"
51
51
  },
@@ -42,34 +42,46 @@ export function renderWebMiddleware(config, tokenMiddleware, pluginOptions) {
42
42
  res.sendFile(file, sendFileCallback(next));
43
43
  });
44
44
 
45
- // check the origin of the logo
46
- if (config?.web?.logo && !isURLhasValidProtocol(config?.web?.logo)) {
47
- // URI related to a local file
48
- const absoluteLocalFile = path.posix.resolve(config.web.logo);
49
- debug('serve local logo %s', absoluteLocalFile);
50
- try {
51
- // TODO: replace existsSync by async alternative
52
- if (
53
- fs.existsSync(absoluteLocalFile) &&
54
- typeof fs.accessSync(absoluteLocalFile, fs.constants.R_OK) === 'undefined'
55
- ) {
56
- // Note: `path.join` will break on Windows, because it transforms `/` to `\`
57
- // Use POSIX version `path.posix.join` instead.
58
- config.web.logo = path.posix.join('/-/static/', path.basename(config.web.logo));
59
- router.get(config.web.logo, function (_req, res, next) {
60
- // @ts-ignore
61
- debug('serve custom logo web:%s - local:%s', config.web.logo, absoluteLocalFile);
62
- res.sendFile(absoluteLocalFile, sendFileCallback(next));
63
- });
64
- debug('enabled custom logo %s', config.web.logo);
65
- } else {
66
- config.web.logo = undefined;
45
+ function renderLogo(logo: string | undefined): string | undefined {
46
+ // check the origin of the logo
47
+ if (logo && !isURLhasValidProtocol(logo)) {
48
+ // URI related to a local file
49
+ const absoluteLocalFile = path.posix.resolve(logo);
50
+ debug('serve local logo %s', absoluteLocalFile);
51
+ try {
52
+ // TODO: replace existsSync by async alternative
53
+ if (
54
+ fs.existsSync(absoluteLocalFile) &&
55
+ typeof fs.accessSync(absoluteLocalFile, fs.constants.R_OK) === 'undefined'
56
+ ) {
57
+ // Note: `path.join` will break on Windows, because it transforms `/` to `\`
58
+ // Use POSIX version `path.posix.join` instead.
59
+ logo = path.posix.join('/-/static/', path.basename(logo));
60
+ router.get(logo, function (_req, res, next) {
61
+ // @ts-ignore
62
+ debug('serve custom logo web:%s - local:%s', logo, absoluteLocalFile);
63
+ res.sendFile(absoluteLocalFile, sendFileCallback(next));
64
+ });
65
+ debug('enabled custom logo %s', logo);
66
+ } else {
67
+ logo = undefined;
68
+ debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
69
+ }
70
+ } catch {
71
+ logo = undefined;
67
72
  debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
68
73
  }
69
- } catch {
70
- config.web.logo = undefined;
71
- debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
72
74
  }
75
+ return logo;
76
+ }
77
+
78
+ const logo = renderLogo(config?.web?.logo);
79
+ if (config?.web?.logo) {
80
+ config.web.logo = logo;
81
+ }
82
+ const logoDark = renderLogo(config?.web?.logoDark);
83
+ if (config?.web?.logoDark) {
84
+ config.web.logoDark = logoDark;
73
85
  }
74
86
 
75
87
  router.get('/-/web/:section/*', function (req, res) {
@@ -26,16 +26,20 @@ const defaultManifestFiles: Manifest = {
26
26
  css: [],
27
27
  };
28
28
 
29
- export function resolveLogo(config: ConfigYaml, requestOptions: RequestOptions) {
30
- if (typeof config?.web?.logo !== 'string') {
29
+ export function resolveLogo(
30
+ logo: string | undefined,
31
+ url_prefix: string | undefined,
32
+ requestOptions: RequestOptions
33
+ ) {
34
+ if (typeof logo !== 'string') {
31
35
  return '';
32
36
  }
33
- const isLocalFile = config?.web?.logo && !isURLhasValidProtocol(config?.web?.logo);
37
+ const isLocalFile = logo && !isURLhasValidProtocol(logo);
34
38
 
35
39
  if (isLocalFile) {
36
- return `${getPublicUrl(config?.url_prefix, requestOptions)}-/static/${path.basename(config?.web?.logo)}`;
37
- } else if (isURLhasValidProtocol(config?.web?.logo)) {
38
- return config?.web?.logo;
40
+ return `${getPublicUrl(url_prefix, requestOptions)}-/static/${path.basename(logo)}`;
41
+ } else if (isURLhasValidProtocol(logo)) {
42
+ return logo;
39
43
  } else {
40
44
  return '';
41
45
  }
@@ -61,7 +65,8 @@ export default function renderHTML(
61
65
  const title = config?.web?.title ?? WEB_TITLE;
62
66
  const login = hasLogin(config);
63
67
  const scope = config?.web?.scope ?? '';
64
- const logo = resolveLogo(config, requestOptions);
68
+ const logo = resolveLogo(config?.web?.logo, config?.url_prefix, requestOptions);
69
+ const logoDark = resolveLogo(config?.web?.logoDark, config?.url_prefix, requestOptions);
65
70
  const pkgManagers = config?.web?.pkgManagers ?? ['yarn', 'pnpm', 'npm'];
66
71
  const version = res.locals.app_version ?? '';
67
72
  const flags = {
@@ -81,6 +86,8 @@ export default function renderHTML(
81
86
  showFooter,
82
87
  showSearch,
83
88
  showDownloadTarball,
89
+ showRaw,
90
+ showUplinks,
84
91
  } = Object.assign(
85
92
  {},
86
93
  {
@@ -97,6 +104,8 @@ export default function renderHTML(
97
104
  showFooter,
98
105
  showSearch,
99
106
  showDownloadTarball,
107
+ showRaw,
108
+ showUplinks,
100
109
  darkMode,
101
110
  url_prefix,
102
111
  basename,
@@ -104,6 +113,7 @@ export default function renderHTML(
104
113
  primaryColor,
105
114
  version,
106
115
  logo,
116
+ logoDark,
107
117
  flags,
108
118
  login,
109
119
  pkgManagers,
@@ -14,6 +14,7 @@ web:
14
14
  showRaw: true
15
15
  primary_color: '#ffffff'
16
16
  logo: './test/config/dark-logo.png'
17
+ logoDark: './test/config/dark-logo.png'
17
18
  html_cache: false
18
19
 
19
20
  url_prefix: /prefix
@@ -79,6 +79,13 @@ describe('test web server', () => {
79
79
  return loadLogo('file-logo.yaml', '/-/static/dark-logo.png');
80
80
  });
81
81
 
82
+ test('should render dark logo as file', async () => {
83
+ const {
84
+ window: { __VERDACCIO_BASENAME_UI_OPTIONS },
85
+ } = await render('file-logo.yaml');
86
+ expect(__VERDACCIO_BASENAME_UI_OPTIONS.logoDark).toMatch('/prefix/-/static/dark-logo.png');
87
+ });
88
+
82
89
  test('should not render logo as absolute file is wrong', async () => {
83
90
  const {
84
91
  window: { __VERDACCIO_BASENAME_UI_OPTIONS },