@verdaccio/middleware 9.0.0-next-9.3 → 9.0.0-next-9.4

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.
Files changed (127) hide show
  1. package/build/_virtual/_rolldown/runtime.js +23 -0
  2. package/build/index.js +60 -221
  3. package/build/index.mjs +22 -0
  4. package/build/middlewares/allow.js +42 -50
  5. package/build/middlewares/allow.js.map +1 -1
  6. package/build/middlewares/allow.mjs +44 -0
  7. package/build/middlewares/allow.mjs.map +1 -0
  8. package/build/middlewares/antiLoop.d.ts +2 -2
  9. package/build/middlewares/antiLoop.js +22 -40
  10. package/build/middlewares/antiLoop.js.map +1 -1
  11. package/build/middlewares/antiLoop.mjs +25 -0
  12. package/build/middlewares/antiLoop.mjs.map +1 -0
  13. package/build/middlewares/api_urls.js +66 -59
  14. package/build/middlewares/api_urls.js.map +1 -1
  15. package/build/middlewares/api_urls.mjs +59 -0
  16. package/build/middlewares/api_urls.mjs.map +1 -0
  17. package/build/middlewares/dotfiles.d.ts +1 -1
  18. package/build/middlewares/dotfiles.js +25 -28
  19. package/build/middlewares/dotfiles.js.map +1 -1
  20. package/build/middlewares/dotfiles.mjs +27 -0
  21. package/build/middlewares/dotfiles.mjs.map +1 -0
  22. package/build/middlewares/encode-pkg.d.ts +1 -1
  23. package/build/middlewares/encode-pkg.js +20 -36
  24. package/build/middlewares/encode-pkg.js.map +1 -1
  25. package/build/middlewares/encode-pkg.mjs +22 -0
  26. package/build/middlewares/encode-pkg.mjs.map +1 -0
  27. package/build/middlewares/error.d.ts +3 -3
  28. package/build/middlewares/error.js +53 -71
  29. package/build/middlewares/error.js.map +1 -1
  30. package/build/middlewares/error.mjs +53 -0
  31. package/build/middlewares/error.mjs.map +1 -0
  32. package/build/middlewares/final.d.ts +2 -2
  33. package/build/middlewares/final.js +46 -57
  34. package/build/middlewares/final.js.map +1 -1
  35. package/build/middlewares/final.mjs +46 -0
  36. package/build/middlewares/final.mjs.map +1 -0
  37. package/build/middlewares/json.d.ts +1 -1
  38. package/build/middlewares/json.js +8 -11
  39. package/build/middlewares/json.js.map +1 -1
  40. package/build/middlewares/json.mjs +10 -0
  41. package/build/middlewares/json.mjs.map +1 -0
  42. package/build/middlewares/log.d.ts +1 -1
  43. package/build/middlewares/log.js +97 -125
  44. package/build/middlewares/log.js.map +1 -1
  45. package/build/middlewares/log.mjs +96 -0
  46. package/build/middlewares/log.mjs.map +1 -0
  47. package/build/middlewares/make-url-relative.d.ts +1 -1
  48. package/build/middlewares/make-url-relative.js +26 -41
  49. package/build/middlewares/make-url-relative.js.map +1 -1
  50. package/build/middlewares/make-url-relative.mjs +28 -0
  51. package/build/middlewares/make-url-relative.mjs.map +1 -0
  52. package/build/middlewares/match.js +8 -13
  53. package/build/middlewares/match.js.map +1 -1
  54. package/build/middlewares/match.mjs +11 -0
  55. package/build/middlewares/match.mjs.map +1 -0
  56. package/build/middlewares/media.js +15 -19
  57. package/build/middlewares/media.js.map +1 -1
  58. package/build/middlewares/media.mjs +17 -0
  59. package/build/middlewares/media.mjs.map +1 -0
  60. package/build/middlewares/rate-limit.d.ts +2 -2
  61. package/build/middlewares/rate-limit.js +8 -10
  62. package/build/middlewares/rate-limit.js.map +1 -1
  63. package/build/middlewares/rate-limit.mjs +9 -0
  64. package/build/middlewares/rate-limit.mjs.map +1 -0
  65. package/build/middlewares/request-options.d.ts +2 -2
  66. package/build/middlewares/request-options.js +18 -27
  67. package/build/middlewares/request-options.js.map +1 -1
  68. package/build/middlewares/request-options.mjs +19 -0
  69. package/build/middlewares/request-options.mjs.map +1 -0
  70. package/build/middlewares/user-agent.d.ts +1 -1
  71. package/build/middlewares/user-agent.js +11 -12
  72. package/build/middlewares/user-agent.js.map +1 -1
  73. package/build/middlewares/user-agent.mjs +13 -0
  74. package/build/middlewares/user-agent.mjs.map +1 -0
  75. package/build/middlewares/validation.d.ts +1 -1
  76. package/build/middlewares/validation.js +11 -18
  77. package/build/middlewares/validation.js.map +1 -1
  78. package/build/middlewares/validation.mjs +14 -0
  79. package/build/middlewares/validation.mjs.map +1 -0
  80. package/build/middlewares/web/index.js +4 -35
  81. package/build/middlewares/web/index.mjs +4 -0
  82. package/build/middlewares/web/render-web.d.ts +1 -1
  83. package/build/middlewares/web/render-web.js +80 -109
  84. package/build/middlewares/web/render-web.js.map +1 -1
  85. package/build/middlewares/web/render-web.mjs +79 -0
  86. package/build/middlewares/web/render-web.mjs.map +1 -0
  87. package/build/middlewares/web/security.js +29 -41
  88. package/build/middlewares/web/security.js.map +1 -1
  89. package/build/middlewares/web/security.mjs +30 -0
  90. package/build/middlewares/web/security.mjs.map +1 -0
  91. package/build/middlewares/web/utils/manifest.js +17 -18
  92. package/build/middlewares/web/utils/manifest.js.map +1 -1
  93. package/build/middlewares/web/utils/manifest.mjs +21 -0
  94. package/build/middlewares/web/utils/manifest.mjs.map +1 -0
  95. package/build/middlewares/web/utils/renderHTML.d.ts +5 -5
  96. package/build/middlewares/web/utils/renderHTML.js +109 -136
  97. package/build/middlewares/web/utils/renderHTML.js.map +1 -1
  98. package/build/middlewares/web/utils/renderHTML.mjs +113 -0
  99. package/build/middlewares/web/utils/renderHTML.mjs.map +1 -0
  100. package/build/middlewares/web/utils/template.d.ts +2 -2
  101. package/build/middlewares/web/utils/template.js +19 -20
  102. package/build/middlewares/web/utils/template.js.map +1 -1
  103. package/build/middlewares/web/utils/template.mjs +35 -0
  104. package/build/middlewares/web/utils/template.mjs.map +1 -0
  105. package/build/middlewares/web/utils/web-utils.js +17 -18
  106. package/build/middlewares/web/utils/web-utils.js.map +1 -1
  107. package/build/middlewares/web/utils/web-utils.mjs +18 -0
  108. package/build/middlewares/web/utils/web-utils.mjs.map +1 -0
  109. package/build/middlewares/web/web-api.d.ts +1 -2
  110. package/build/middlewares/web/web-api.js +18 -27
  111. package/build/middlewares/web/web-api.js.map +1 -1
  112. package/build/middlewares/web/web-api.mjs +19 -0
  113. package/build/middlewares/web/web-api.mjs.map +1 -0
  114. package/build/middlewares/web/web-middleware.js +16 -23
  115. package/build/middlewares/web/web-middleware.js.map +1 -1
  116. package/build/middlewares/web/web-middleware.mjs +16 -0
  117. package/build/middlewares/web/web-middleware.mjs.map +1 -0
  118. package/build/middlewares/web/web-urls.js +28 -29
  119. package/build/middlewares/web/web-urls.js.map +1 -1
  120. package/build/middlewares/web/web-urls.mjs +32 -0
  121. package/build/middlewares/web/web-urls.mjs.map +1 -0
  122. package/build/types.d.ts +2 -2
  123. package/package.json +22 -11
  124. package/build/index.js.map +0 -1
  125. package/build/middlewares/web/index.js.map +0 -1
  126. package/build/types.js +0 -6
  127. package/build/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"user-agent.js","names":["_config","require","_core","userAgent","config","_req","res","next","setHeader","HEADERS","POWERED_BY","getUserAgent","user_agent"],"sources":["../../src/middlewares/user-agent.ts"],"sourcesContent":["import { getUserAgent } from '@verdaccio/config';\nimport { HEADERS } from '@verdaccio/core';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';\n\nexport function userAgent(config) {\n return function (_req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n res.setHeader(HEADERS.POWERED_BY, getUserAgent(config?.user_agent));\n next();\n };\n}\n"],"mappings":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAIO,SAASE,SAASA,CAACC,MAAM,EAAE;EAChC,OAAO,UAAUC,IAAoB,EAAEC,GAAoB,EAAEC,IAAsB,EAAQ;IACzFD,GAAG,CAACE,SAAS,CAACC,aAAO,CAACC,UAAU,EAAE,IAAAC,oBAAY,EAACP,MAAM,EAAEQ,UAAU,CAAC,CAAC;IACnEL,IAAI,CAAC,CAAC;EACR,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"user-agent.js","names":[],"sources":["../../src/middlewares/user-agent.ts"],"sourcesContent":["import { getUserAgent } from '@verdaccio/config';\nimport { HEADERS } from '@verdaccio/core';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';\n\nexport function userAgent(config) {\n return function (_req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n res.setHeader(HEADERS.POWERED_BY, getUserAgent(config?.user_agent));\n next();\n };\n}\n"],"mappings":";;;;AAKA,SAAgB,UAAU,QAAQ;AAChC,QAAO,SAAU,MAAsB,KAAsB,MAA8B;AACzF,MAAI,UAAU,gBAAA,QAAQ,aAAA,GAAA,kBAAA,cAAyB,QAAQ,WAAW,CAAC;AACnE,QAAM"}
@@ -0,0 +1,13 @@
1
+ import { HEADERS } from "@verdaccio/core";
2
+ import { getUserAgent } from "@verdaccio/config";
3
+ //#region src/middlewares/user-agent.ts
4
+ function userAgent(config) {
5
+ return function(_req, res, next) {
6
+ res.setHeader(HEADERS.POWERED_BY, getUserAgent(config?.user_agent));
7
+ next();
8
+ };
9
+ }
10
+ //#endregion
11
+ export { userAgent };
12
+
13
+ //# sourceMappingURL=user-agent.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-agent.mjs","names":[],"sources":["../../src/middlewares/user-agent.ts"],"sourcesContent":["import { getUserAgent } from '@verdaccio/config';\nimport { HEADERS } from '@verdaccio/core';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';\n\nexport function userAgent(config) {\n return function (_req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n res.setHeader(HEADERS.POWERED_BY, getUserAgent(config?.user_agent));\n next();\n };\n}\n"],"mappings":";;;AAKA,SAAgB,UAAU,QAAQ;AAChC,QAAO,SAAU,MAAsB,KAAsB,MAA8B;AACzF,MAAI,UAAU,QAAQ,YAAY,aAAa,QAAQ,WAAW,CAAC;AACnE,QAAM"}
@@ -1,3 +1,3 @@
1
- import type { NextFunction, Request, Response } from 'express';
1
+ import { NextFunction, Request, Response } from 'express';
2
2
  export declare function validateName(_req: Request, _res: Response, next: NextFunction, value: string, name: string): void;
3
3
  export declare function validatePackage(_req: Request, _res: any, next: NextFunction, value: string, name: string): void;
@@ -1,23 +1,16 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.validateName = validateName;
7
- exports.validatePackage = validatePackage;
8
- var _core = require("@verdaccio/core");
1
+ require("../_virtual/_rolldown/runtime.js");
2
+ let _verdaccio_core = require("@verdaccio/core");
3
+ //#region src/middlewares/validation.ts
9
4
  function validateName(_req, _res, next, value, name) {
10
- if (_core.validationUtils.validateName(value)) {
11
- next();
12
- } else {
13
- next(_core.errorUtils.getBadRequest('invalid ' + name));
14
- }
5
+ if (_verdaccio_core.validationUtils.validateName(value)) next();
6
+ else next(_verdaccio_core.errorUtils.getBadRequest("invalid " + name));
15
7
  }
16
8
  function validatePackage(_req, _res, next, value, name) {
17
- if (_core.validationUtils.validatePackage(value)) {
18
- next();
19
- } else {
20
- next(_core.errorUtils.getBadRequest('invalid ' + name));
21
- }
9
+ if (_verdaccio_core.validationUtils.validatePackage(value)) next();
10
+ else next(_verdaccio_core.errorUtils.getBadRequest("invalid " + name));
22
11
  }
12
+ //#endregion
13
+ exports.validateName = validateName;
14
+ exports.validatePackage = validatePackage;
15
+
23
16
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","names":["_core","require","validateName","_req","_res","next","value","name","validationUtils","errorUtils","getBadRequest","validatePackage"],"sources":["../../src/middlewares/validation.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from 'express';\n\nimport { errorUtils, validationUtils } from '@verdaccio/core';\n\nexport function validateName(\n _req: Request,\n _res: Response,\n next: NextFunction,\n value: string,\n name: string\n) {\n if (validationUtils.validateName(value)) {\n next();\n } else {\n next(errorUtils.getBadRequest('invalid ' + name));\n }\n}\n\nexport function validatePackage(\n _req: Request,\n _res,\n next: NextFunction,\n value: string,\n name: string\n) {\n if (validationUtils.validatePackage(value)) {\n next();\n } else {\n next(errorUtils.getBadRequest('invalid ' + name));\n }\n}\n"],"mappings":";;;;;;;AAEA,IAAAA,KAAA,GAAAC,OAAA;AAEO,SAASC,YAAYA,CAC1BC,IAAa,EACbC,IAAc,EACdC,IAAkB,EAClBC,KAAa,EACbC,IAAY,EACZ;EACA,IAAIC,qBAAe,CAACN,YAAY,CAACI,KAAK,CAAC,EAAE;IACvCD,IAAI,CAAC,CAAC;EACR,CAAC,MAAM;IACLA,IAAI,CAACI,gBAAU,CAACC,aAAa,CAAC,UAAU,GAAGH,IAAI,CAAC,CAAC;EACnD;AACF;AAEO,SAASI,eAAeA,CAC7BR,IAAa,EACbC,IAAI,EACJC,IAAkB,EAClBC,KAAa,EACbC,IAAY,EACZ;EACA,IAAIC,qBAAe,CAACG,eAAe,CAACL,KAAK,CAAC,EAAE;IAC1CD,IAAI,CAAC,CAAC;EACR,CAAC,MAAM;IACLA,IAAI,CAACI,gBAAU,CAACC,aAAa,CAAC,UAAU,GAAGH,IAAI,CAAC,CAAC;EACnD;AACF","ignoreList":[]}
1
+ {"version":3,"file":"validation.js","names":[],"sources":["../../src/middlewares/validation.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from 'express';\n\nimport { errorUtils, validationUtils } from '@verdaccio/core';\n\nexport function validateName(\n _req: Request,\n _res: Response,\n next: NextFunction,\n value: string,\n name: string\n) {\n if (validationUtils.validateName(value)) {\n next();\n } else {\n next(errorUtils.getBadRequest('invalid ' + name));\n }\n}\n\nexport function validatePackage(\n _req: Request,\n _res,\n next: NextFunction,\n value: string,\n name: string\n) {\n if (validationUtils.validatePackage(value)) {\n next();\n } else {\n next(errorUtils.getBadRequest('invalid ' + name));\n }\n}\n"],"mappings":";;;AAIA,SAAgB,aACd,MACA,MACA,MACA,OACA,MACA;AACA,KAAI,gBAAA,gBAAgB,aAAa,MAAM,CACrC,OAAM;KAEN,MAAK,gBAAA,WAAW,cAAc,aAAa,KAAK,CAAC;;AAIrD,SAAgB,gBACd,MACA,MACA,MACA,OACA,MACA;AACA,KAAI,gBAAA,gBAAgB,gBAAgB,MAAM,CACxC,OAAM;KAEN,MAAK,gBAAA,WAAW,cAAc,aAAa,KAAK,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { errorUtils, validationUtils } from "@verdaccio/core";
2
+ //#region src/middlewares/validation.ts
3
+ function validateName(_req, _res, next, value, name) {
4
+ if (validationUtils.validateName(value)) next();
5
+ else next(errorUtils.getBadRequest("invalid " + name));
6
+ }
7
+ function validatePackage(_req, _res, next, value, name) {
8
+ if (validationUtils.validatePackage(value)) next();
9
+ else next(errorUtils.getBadRequest("invalid " + name));
10
+ }
11
+ //#endregion
12
+ export { validateName, validatePackage };
13
+
14
+ //# sourceMappingURL=validation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.mjs","names":[],"sources":["../../src/middlewares/validation.ts"],"sourcesContent":["import type { NextFunction, Request, Response } from 'express';\n\nimport { errorUtils, validationUtils } from '@verdaccio/core';\n\nexport function validateName(\n _req: Request,\n _res: Response,\n next: NextFunction,\n value: string,\n name: string\n) {\n if (validationUtils.validateName(value)) {\n next();\n } else {\n next(errorUtils.getBadRequest('invalid ' + name));\n }\n}\n\nexport function validatePackage(\n _req: Request,\n _res,\n next: NextFunction,\n value: string,\n name: string\n) {\n if (validationUtils.validatePackage(value)) {\n next();\n } else {\n next(errorUtils.getBadRequest('invalid ' + name));\n }\n}\n"],"mappings":";;AAIA,SAAgB,aACd,MACA,MACA,MACA,OACA,MACA;AACA,KAAI,gBAAgB,aAAa,MAAM,CACrC,OAAM;KAEN,MAAK,WAAW,cAAc,aAAa,KAAK,CAAC;;AAIrD,SAAgB,gBACd,MACA,MACA,MACA,OACA,MACA;AACA,KAAI,gBAAgB,gBAAgB,MAAM,CACxC,OAAM;KAEN,MAAK,WAAW,cAAc,aAAa,KAAK,CAAC"}
@@ -1,35 +1,4 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "renderWebMiddleware", {
7
- enumerable: true,
8
- get: function () {
9
- return _renderWeb.renderWebMiddleware;
10
- }
11
- });
12
- Object.defineProperty(exports, "setSecurityWebHeaders", {
13
- enumerable: true,
14
- get: function () {
15
- return _security.setSecurityWebHeaders;
16
- }
17
- });
18
- Object.defineProperty(exports, "webAPIMiddleware", {
19
- enumerable: true,
20
- get: function () {
21
- return _webApi.webAPIMiddleware;
22
- }
23
- });
24
- Object.defineProperty(exports, "webMiddleware", {
25
- enumerable: true,
26
- get: function () {
27
- return _webMiddleware.default;
28
- }
29
- });
30
- var _webMiddleware = _interopRequireDefault(require("./web-middleware"));
31
- var _webApi = require("./web-api");
32
- var _security = require("./security");
33
- var _renderWeb = require("./render-web");
34
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
35
- //# sourceMappingURL=index.js.map
1
+ require("./security.js");
2
+ require("./render-web.js");
3
+ require("./web-api.js");
4
+ require("./web-middleware.js");
@@ -0,0 +1,4 @@
1
+ import "./security.mjs";
2
+ import "./render-web.mjs";
3
+ import "./web-api.mjs";
4
+ import "./web-middleware.mjs";
@@ -1 +1 @@
1
- export declare function renderWebMiddleware(config: any, tokenMiddleware: any, pluginOptions: any): import("express-serve-static-core").Router;
1
+ export declare function renderWebMiddleware(config: any, tokenMiddleware: any, pluginOptions: any): import('express-serve-static-core').Router;
@@ -1,113 +1,84 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.renderWebMiddleware = renderWebMiddleware;
7
- var _debug = _interopRequireDefault(require("debug"));
8
- var _express = _interopRequireDefault(require("express"));
9
- var _nodeFs = _interopRequireDefault(require("node:fs"));
10
- var _nodePath = _interopRequireDefault(require("node:path"));
11
- var _core = require("@verdaccio/core");
12
- var _url = require("@verdaccio/url");
13
- var _security = require("./security");
14
- var _renderHTML = _interopRequireDefault(require("./utils/renderHTML"));
15
- var _webUrls = require("./web-urls");
16
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
- const debug = (0, _debug.default)('verdaccio:web:render');
18
- const sendFileCallback = next => err => {
19
- if (!err) {
20
- return;
21
- }
22
- if (err.status === _core.HTTP_STATUS.NOT_FOUND) {
23
- next();
24
- } else {
25
- next(err);
26
- }
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
+ const require_security = require("./security.js");
3
+ const require_renderHTML = require("./utils/renderHTML.js");
4
+ const require_web_urls = require("./web-urls.js");
5
+ let _verdaccio_core = require("@verdaccio/core");
6
+ let debug = require("debug");
7
+ debug = require_runtime.__toESM(debug);
8
+ let express = require("express");
9
+ express = require_runtime.__toESM(express);
10
+ let node_fs = require("node:fs");
11
+ node_fs = require_runtime.__toESM(node_fs);
12
+ let node_path = require("node:path");
13
+ node_path = require_runtime.__toESM(node_path);
14
+ let _verdaccio_url = require("@verdaccio/url");
15
+ //#region src/middlewares/web/render-web.ts
16
+ var debug$1 = (0, debug.default)("verdaccio:web:render");
17
+ var sendFileCallback = (next) => (err) => {
18
+ if (!err) return;
19
+ if (err.status === _verdaccio_core.HTTP_STATUS.NOT_FOUND) next();
20
+ else next(err);
27
21
  };
28
22
  function renderWebMiddleware(config, tokenMiddleware, pluginOptions) {
29
- const {
30
- staticPath,
31
- manifest,
32
- manifestFiles
33
- } = pluginOptions;
34
- debug('static path %o', staticPath);
35
-
36
- /* eslint new-cap:off */
37
- const router = _express.default.Router();
38
- if (typeof tokenMiddleware === 'function') {
39
- router.use(tokenMiddleware);
40
- }
41
- router.use(_security.setSecurityWebHeaders);
42
-
43
- // any match within the static is routed to the file system
44
- router.get(_webUrls.WebUrlsNamespace.static, function (req, res, next) {
45
- const filename = Array.isArray(req.params.all) ? req.params.all.join('/') : req.params.all;
46
- if (filename === 'favicon.ico' && config?.web?.favicon) {
47
- const file = config?.web?.favicon;
48
- if ((0, _url.isURLhasValidProtocol)(file)) {
49
- debug('redirect to favicon %s', file);
50
- req.url = file;
51
- return next();
52
- }
53
- debug('render custom favicon %o', file);
54
- res.sendFile(file, sendFileCallback(next));
55
- return;
56
- }
57
- debug('render static file %o', filename);
58
- res.sendFile(filename, {
59
- root: staticPath
60
- }, sendFileCallback(next));
61
- });
62
- function renderLogo(logo) {
63
- // check the origin of the logo
64
- if (logo && !(0, _url.isURLhasValidProtocol)(logo)) {
65
- // URI related to a local file
66
- const absoluteLocalFile = _nodePath.default.posix.resolve(logo);
67
- debug('serve local logo %s', absoluteLocalFile);
68
- try {
69
- // TODO: replace existsSync by async alternative
70
- if (_nodeFs.default.existsSync(absoluteLocalFile) && typeof _nodeFs.default.accessSync(absoluteLocalFile, _nodeFs.default.constants.R_OK) === 'undefined') {
71
- // Note: `path.join` will break on Windows, because it transforms `/` to `\`
72
- // Use POSIX version `path.posix.join` instead.
73
- logo = `/-/static/${_nodePath.default.basename(logo)}`;
74
- router.get(logo, function (_req, res, next) {
75
- // @ts-ignore
76
- debug('serve custom logo web:%s - local:%s', logo, absoluteLocalFile);
77
- res.sendFile(_nodePath.default.basename(absoluteLocalFile), {
78
- root: _nodePath.default.dirname(absoluteLocalFile)
79
- }, sendFileCallback(next));
80
- });
81
- debug('enabled custom logo %s', logo);
82
- } else {
83
- logo = undefined;
84
- debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
85
- }
86
- } catch {
87
- logo = undefined;
88
- debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
89
- }
90
- }
91
- return logo;
92
- }
93
- const logo = renderLogo(config?.web?.logo);
94
- if (config?.web?.logo) {
95
- config.web.logo = logo;
96
- }
97
- const logoDark = renderLogo(config?.web?.logoDark);
98
- if (config?.web?.logoDark) {
99
- config.web.logoDark = logoDark;
100
- }
101
-
102
- // Handle all web routes including security routes
103
- router.get(_webUrls.WebUrlsNamespace.web, function (req, res) {
104
- (0, _renderHTML.default)(config, manifest, manifestFiles, req, res);
105
- debug('render html section');
106
- });
107
- router.get(_webUrls.WebUrlsNamespace.root, function (req, res) {
108
- (0, _renderHTML.default)(config, manifest, manifestFiles, req, res);
109
- debug('render root');
110
- });
111
- return router;
23
+ const { staticPath, manifest, manifestFiles } = pluginOptions;
24
+ debug$1("static path %o", staticPath);
25
+ const router = express.default.Router();
26
+ if (typeof tokenMiddleware === "function") router.use(tokenMiddleware);
27
+ router.use(require_security.setSecurityWebHeaders);
28
+ router.get(require_web_urls.WebUrlsNamespace.static, function(req, res, next) {
29
+ const filename = Array.isArray(req.params.all) ? req.params.all.join("/") : req.params.all;
30
+ if (filename === "favicon.ico" && config?.web?.favicon) {
31
+ const file = config?.web?.favicon;
32
+ if ((0, _verdaccio_url.isURLhasValidProtocol)(file)) {
33
+ debug$1("redirect to favicon %s", file);
34
+ req.url = file;
35
+ return next();
36
+ }
37
+ debug$1("render custom favicon %o", file);
38
+ res.sendFile(file, sendFileCallback(next));
39
+ return;
40
+ }
41
+ debug$1("render static file %o", filename);
42
+ res.sendFile(filename, { root: staticPath }, sendFileCallback(next));
43
+ });
44
+ function renderLogo(logo) {
45
+ if (logo && !(0, _verdaccio_url.isURLhasValidProtocol)(logo)) {
46
+ const absoluteLocalFile = node_path.default.posix.resolve(logo);
47
+ debug$1("serve local logo %s", absoluteLocalFile);
48
+ try {
49
+ if (node_fs.default.existsSync(absoluteLocalFile) && typeof node_fs.default.accessSync(absoluteLocalFile, node_fs.default.constants.R_OK) === "undefined") {
50
+ logo = `/-/static/${node_path.default.basename(logo)}`;
51
+ router.get(logo, function(_req, res, next) {
52
+ debug$1("serve custom logo web:%s - local:%s", logo, absoluteLocalFile);
53
+ res.sendFile(node_path.default.basename(absoluteLocalFile), { root: node_path.default.dirname(absoluteLocalFile) }, sendFileCallback(next));
54
+ });
55
+ debug$1("enabled custom logo %s", logo);
56
+ } else {
57
+ logo = void 0;
58
+ debug$1(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
59
+ }
60
+ } catch {
61
+ logo = void 0;
62
+ debug$1(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
63
+ }
64
+ }
65
+ return logo;
66
+ }
67
+ const logo = renderLogo(config?.web?.logo);
68
+ if (config?.web?.logo) config.web.logo = logo;
69
+ const logoDark = renderLogo(config?.web?.logoDark);
70
+ if (config?.web?.logoDark) config.web.logoDark = logoDark;
71
+ router.get(require_web_urls.WebUrlsNamespace.web, function(req, res) {
72
+ require_renderHTML.default(config, manifest, manifestFiles, req, res);
73
+ debug$1("render html section");
74
+ });
75
+ router.get(require_web_urls.WebUrlsNamespace.root, function(req, res) {
76
+ require_renderHTML.default(config, manifest, manifestFiles, req, res);
77
+ debug$1("render root");
78
+ });
79
+ return router;
112
80
  }
81
+ //#endregion
82
+ exports.renderWebMiddleware = renderWebMiddleware;
83
+
113
84
  //# sourceMappingURL=render-web.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-web.js","names":["_debug","_interopRequireDefault","require","_express","_nodeFs","_nodePath","_core","_url","_security","_renderHTML","_webUrls","e","__esModule","default","debug","buildDebug","sendFileCallback","next","err","status","HTTP_STATUS","NOT_FOUND","renderWebMiddleware","config","tokenMiddleware","pluginOptions","staticPath","manifest","manifestFiles","router","express","Router","use","setSecurityWebHeaders","get","WebUrlsNamespace","static","req","res","filename","Array","isArray","params","all","join","web","favicon","file","isURLhasValidProtocol","url","sendFile","root","renderLogo","logo","absoluteLocalFile","path","posix","resolve","fs","existsSync","accessSync","constants","R_OK","basename","_req","dirname","undefined","logoDark","renderHTML"],"sources":["../../../src/middlewares/web/render-web.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport express from 'express';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { isURLhasValidProtocol } from '@verdaccio/url';\n\nimport { setSecurityWebHeaders } from './security';\nimport renderHTML from './utils/renderHTML';\nimport { WebUrlsNamespace } from './web-urls';\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(\n WebUrlsNamespace.static,\n function (req: express.Request<{ all: string | string[] }>, res, next) {\n const filename = Array.isArray(req.params.all) ? req.params.all.join('/') : req.params.all;\n if (filename === 'favicon.ico' && config?.web?.favicon) {\n const file = config?.web?.favicon;\n if (isURLhasValidProtocol(file)) {\n debug('redirect to favicon %s', file);\n req.url = file;\n return next();\n }\n debug('render custom favicon %o', file);\n res.sendFile(file, sendFileCallback(next));\n return;\n }\n debug('render static file %o', filename);\n res.sendFile(filename, { root: staticPath }, sendFileCallback(next));\n }\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 = `/-/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(\n path.basename(absoluteLocalFile),\n { root: path.dirname(absoluteLocalFile) },\n sendFileCallback(next)\n );\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 // Handle all web routes including security routes\n router.get(WebUrlsNamespace.web, function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render html section');\n });\n\n router.get(WebUrlsNamespace.root, 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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","ignoreList":[]}
1
+ {"version":3,"file":"render-web.js","names":[],"sources":["../../../src/middlewares/web/render-web.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport express from 'express';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { isURLhasValidProtocol } from '@verdaccio/url';\n\nimport { setSecurityWebHeaders } from './security';\nimport renderHTML from './utils/renderHTML';\nimport { WebUrlsNamespace } from './web-urls';\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(\n WebUrlsNamespace.static,\n function (req: express.Request<{ all: string | string[] }>, res, next) {\n const filename = Array.isArray(req.params.all) ? req.params.all.join('/') : req.params.all;\n if (filename === 'favicon.ico' && config?.web?.favicon) {\n const file = config?.web?.favicon;\n if (isURLhasValidProtocol(file)) {\n debug('redirect to favicon %s', file);\n req.url = file;\n return next();\n }\n debug('render custom favicon %o', file);\n res.sendFile(file, sendFileCallback(next));\n return;\n }\n debug('render static file %o', filename);\n res.sendFile(filename, { root: staticPath }, sendFileCallback(next));\n }\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 = `/-/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(\n path.basename(absoluteLocalFile),\n { root: path.dirname(absoluteLocalFile) },\n sendFileCallback(next)\n );\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 // Handle all web routes including security routes\n router.get(WebUrlsNamespace.web, function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render html section');\n });\n\n router.get(WebUrlsNamespace.root, function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render root');\n });\n\n return router;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAYA,IAAM,WAAA,GAAA,MAAA,SAAmB,uBAAuB;AAEhD,IAAM,oBAAoB,UAAU,QAAQ;AAC1C,KAAI,CAAC,IACH;AAEF,KAAI,IAAI,WAAW,gBAAA,YAAY,UAC7B,OAAM;KAEN,MAAK,IAAI;;AAIb,SAAgB,oBAAoB,QAAQ,iBAAiB,eAAe;CAC1E,MAAM,EAAE,YAAY,UAAU,kBAAkB;AAChD,SAAM,kBAAkB,WAAW;CAGnC,MAAM,SAAS,QAAA,QAAQ,QAAQ;AAC/B,KAAI,OAAO,oBAAoB,WAC7B,QAAO,IAAI,gBAAgB;AAG7B,QAAO,IAAI,iBAAA,sBAAsB;AAGjC,QAAO,IACL,iBAAA,iBAAiB,QACjB,SAAU,KAAkD,KAAK,MAAM;EACrE,MAAM,WAAW,MAAM,QAAQ,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,KAAK,IAAI,GAAG,IAAI,OAAO;AACvF,MAAI,aAAa,iBAAiB,QAAQ,KAAK,SAAS;GACtD,MAAM,OAAO,QAAQ,KAAK;AAC1B,QAAA,GAAA,eAAA,uBAA0B,KAAK,EAAE;AAC/B,YAAM,0BAA0B,KAAK;AACrC,QAAI,MAAM;AACV,WAAO,MAAM;;AAEf,WAAM,4BAA4B,KAAK;AACvC,OAAI,SAAS,MAAM,iBAAiB,KAAK,CAAC;AAC1C;;AAEF,UAAM,yBAAyB,SAAS;AACxC,MAAI,SAAS,UAAU,EAAE,MAAM,YAAY,EAAE,iBAAiB,KAAK,CAAC;GAEvE;CAED,SAAS,WAAW,MAA8C;AAEhE,MAAI,QAAQ,EAAA,GAAA,eAAA,uBAAuB,KAAK,EAAE;GAExC,MAAM,oBAAoB,UAAA,QAAK,MAAM,QAAQ,KAAK;AAClD,WAAM,uBAAuB,kBAAkB;AAC/C,OAAI;AAEF,QACE,QAAA,QAAG,WAAW,kBAAkB,IAChC,OAAO,QAAA,QAAG,WAAW,mBAAmB,QAAA,QAAG,UAAU,KAAK,KAAK,aAC/D;AAGA,YAAO,aAAa,UAAA,QAAK,SAAS,KAAK;AACvC,YAAO,IAAI,MAAM,SAAU,MAAM,KAAK,MAAM;AAE1C,cAAM,wCAAwC,MAAM,kBAAkB;AACtE,UAAI,SACF,UAAA,QAAK,SAAS,kBAAkB,EAChC,EAAE,MAAM,UAAA,QAAK,QAAQ,kBAAkB,EAAE,EACzC,iBAAiB,KAAK,CACvB;OACD;AACF,aAAM,0BAA0B,KAAK;WAChC;AACL,YAAO,KAAA;AACP,aAAM,2BAA2B,kBAAkB,oCAAoC;;WAEnF;AACN,WAAO,KAAA;AACP,YAAM,2BAA2B,kBAAkB,oCAAoC;;;AAG3F,SAAO;;CAGT,MAAM,OAAO,WAAW,QAAQ,KAAK,KAAK;AAC1C,KAAI,QAAQ,KAAK,KACf,QAAO,IAAI,OAAO;CAEpB,MAAM,WAAW,WAAW,QAAQ,KAAK,SAAS;AAClD,KAAI,QAAQ,KAAK,SACf,QAAO,IAAI,WAAW;AAIxB,QAAO,IAAI,iBAAA,iBAAiB,KAAK,SAAU,KAAK,KAAK;AACnD,qBAAA,QAAW,QAAQ,UAAU,eAAe,KAAK,IAAI;AACrD,UAAM,sBAAsB;GAC5B;AAEF,QAAO,IAAI,iBAAA,iBAAiB,MAAM,SAAU,KAAK,KAAK;AACpD,qBAAA,QAAW,QAAQ,UAAU,eAAe,KAAK,IAAI;AACrD,UAAM,cAAc;GACpB;AAEF,QAAO"}
@@ -0,0 +1,79 @@
1
+ import { setSecurityWebHeaders } from "./security.mjs";
2
+ import renderHTML from "./utils/renderHTML.mjs";
3
+ import { WebUrlsNamespace } from "./web-urls.mjs";
4
+ import { HTTP_STATUS } from "@verdaccio/core";
5
+ import buildDebug from "debug";
6
+ import express from "express";
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+ import { isURLhasValidProtocol } from "@verdaccio/url";
10
+ //#region src/middlewares/web/render-web.ts
11
+ var debug = buildDebug("verdaccio:web:render");
12
+ var sendFileCallback = (next) => (err) => {
13
+ if (!err) return;
14
+ if (err.status === HTTP_STATUS.NOT_FOUND) next();
15
+ else next(err);
16
+ };
17
+ function renderWebMiddleware(config, tokenMiddleware, pluginOptions) {
18
+ const { staticPath, manifest, manifestFiles } = pluginOptions;
19
+ debug("static path %o", staticPath);
20
+ const router = express.Router();
21
+ if (typeof tokenMiddleware === "function") router.use(tokenMiddleware);
22
+ router.use(setSecurityWebHeaders);
23
+ router.get(WebUrlsNamespace.static, function(req, res, next) {
24
+ const filename = Array.isArray(req.params.all) ? req.params.all.join("/") : req.params.all;
25
+ if (filename === "favicon.ico" && config?.web?.favicon) {
26
+ const file = config?.web?.favicon;
27
+ if (isURLhasValidProtocol(file)) {
28
+ debug("redirect to favicon %s", file);
29
+ req.url = file;
30
+ return next();
31
+ }
32
+ debug("render custom favicon %o", file);
33
+ res.sendFile(file, sendFileCallback(next));
34
+ return;
35
+ }
36
+ debug("render static file %o", filename);
37
+ res.sendFile(filename, { root: staticPath }, sendFileCallback(next));
38
+ });
39
+ function renderLogo(logo) {
40
+ if (logo && !isURLhasValidProtocol(logo)) {
41
+ const absoluteLocalFile = path.posix.resolve(logo);
42
+ debug("serve local logo %s", absoluteLocalFile);
43
+ try {
44
+ if (fs.existsSync(absoluteLocalFile) && typeof fs.accessSync(absoluteLocalFile, fs.constants.R_OK) === "undefined") {
45
+ logo = `/-/static/${path.basename(logo)}`;
46
+ router.get(logo, function(_req, res, next) {
47
+ debug("serve custom logo web:%s - local:%s", logo, absoluteLocalFile);
48
+ res.sendFile(path.basename(absoluteLocalFile), { root: path.dirname(absoluteLocalFile) }, sendFileCallback(next));
49
+ });
50
+ debug("enabled custom logo %s", logo);
51
+ } else {
52
+ logo = void 0;
53
+ debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
54
+ }
55
+ } catch {
56
+ logo = void 0;
57
+ debug(`web logo is wrong, path ${absoluteLocalFile} does not exist or is not readable`);
58
+ }
59
+ }
60
+ return logo;
61
+ }
62
+ const logo = renderLogo(config?.web?.logo);
63
+ if (config?.web?.logo) config.web.logo = logo;
64
+ const logoDark = renderLogo(config?.web?.logoDark);
65
+ if (config?.web?.logoDark) config.web.logoDark = logoDark;
66
+ router.get(WebUrlsNamespace.web, function(req, res) {
67
+ renderHTML(config, manifest, manifestFiles, req, res);
68
+ debug("render html section");
69
+ });
70
+ router.get(WebUrlsNamespace.root, function(req, res) {
71
+ renderHTML(config, manifest, manifestFiles, req, res);
72
+ debug("render root");
73
+ });
74
+ return router;
75
+ }
76
+ //#endregion
77
+ export { renderWebMiddleware };
78
+
79
+ //# sourceMappingURL=render-web.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-web.mjs","names":[],"sources":["../../../src/middlewares/web/render-web.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport express from 'express';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { isURLhasValidProtocol } from '@verdaccio/url';\n\nimport { setSecurityWebHeaders } from './security';\nimport renderHTML from './utils/renderHTML';\nimport { WebUrlsNamespace } from './web-urls';\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(\n WebUrlsNamespace.static,\n function (req: express.Request<{ all: string | string[] }>, res, next) {\n const filename = Array.isArray(req.params.all) ? req.params.all.join('/') : req.params.all;\n if (filename === 'favicon.ico' && config?.web?.favicon) {\n const file = config?.web?.favicon;\n if (isURLhasValidProtocol(file)) {\n debug('redirect to favicon %s', file);\n req.url = file;\n return next();\n }\n debug('render custom favicon %o', file);\n res.sendFile(file, sendFileCallback(next));\n return;\n }\n debug('render static file %o', filename);\n res.sendFile(filename, { root: staticPath }, sendFileCallback(next));\n }\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 = `/-/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(\n path.basename(absoluteLocalFile),\n { root: path.dirname(absoluteLocalFile) },\n sendFileCallback(next)\n );\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 // Handle all web routes including security routes\n router.get(WebUrlsNamespace.web, function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render html section');\n });\n\n router.get(WebUrlsNamespace.root, function (req, res) {\n renderHTML(config, manifest, manifestFiles, req, res);\n debug('render root');\n });\n\n return router;\n}\n"],"mappings":";;;;;;;;;;AAYA,IAAM,QAAQ,WAAW,uBAAuB;AAEhD,IAAM,oBAAoB,UAAU,QAAQ;AAC1C,KAAI,CAAC,IACH;AAEF,KAAI,IAAI,WAAW,YAAY,UAC7B,OAAM;KAEN,MAAK,IAAI;;AAIb,SAAgB,oBAAoB,QAAQ,iBAAiB,eAAe;CAC1E,MAAM,EAAE,YAAY,UAAU,kBAAkB;AAChD,OAAM,kBAAkB,WAAW;CAGnC,MAAM,SAAS,QAAQ,QAAQ;AAC/B,KAAI,OAAO,oBAAoB,WAC7B,QAAO,IAAI,gBAAgB;AAG7B,QAAO,IAAI,sBAAsB;AAGjC,QAAO,IACL,iBAAiB,QACjB,SAAU,KAAkD,KAAK,MAAM;EACrE,MAAM,WAAW,MAAM,QAAQ,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,KAAK,IAAI,GAAG,IAAI,OAAO;AACvF,MAAI,aAAa,iBAAiB,QAAQ,KAAK,SAAS;GACtD,MAAM,OAAO,QAAQ,KAAK;AAC1B,OAAI,sBAAsB,KAAK,EAAE;AAC/B,UAAM,0BAA0B,KAAK;AACrC,QAAI,MAAM;AACV,WAAO,MAAM;;AAEf,SAAM,4BAA4B,KAAK;AACvC,OAAI,SAAS,MAAM,iBAAiB,KAAK,CAAC;AAC1C;;AAEF,QAAM,yBAAyB,SAAS;AACxC,MAAI,SAAS,UAAU,EAAE,MAAM,YAAY,EAAE,iBAAiB,KAAK,CAAC;GAEvE;CAED,SAAS,WAAW,MAA8C;AAEhE,MAAI,QAAQ,CAAC,sBAAsB,KAAK,EAAE;GAExC,MAAM,oBAAoB,KAAK,MAAM,QAAQ,KAAK;AAClD,SAAM,uBAAuB,kBAAkB;AAC/C,OAAI;AAEF,QACE,GAAG,WAAW,kBAAkB,IAChC,OAAO,GAAG,WAAW,mBAAmB,GAAG,UAAU,KAAK,KAAK,aAC/D;AAGA,YAAO,aAAa,KAAK,SAAS,KAAK;AACvC,YAAO,IAAI,MAAM,SAAU,MAAM,KAAK,MAAM;AAE1C,YAAM,wCAAwC,MAAM,kBAAkB;AACtE,UAAI,SACF,KAAK,SAAS,kBAAkB,EAChC,EAAE,MAAM,KAAK,QAAQ,kBAAkB,EAAE,EACzC,iBAAiB,KAAK,CACvB;OACD;AACF,WAAM,0BAA0B,KAAK;WAChC;AACL,YAAO,KAAA;AACP,WAAM,2BAA2B,kBAAkB,oCAAoC;;WAEnF;AACN,WAAO,KAAA;AACP,UAAM,2BAA2B,kBAAkB,oCAAoC;;;AAG3F,SAAO;;CAGT,MAAM,OAAO,WAAW,QAAQ,KAAK,KAAK;AAC1C,KAAI,QAAQ,KAAK,KACf,QAAO,IAAI,OAAO;CAEpB,MAAM,WAAW,WAAW,QAAQ,KAAK,SAAS;AAClD,KAAI,QAAQ,KAAK,SACf,QAAO,IAAI,WAAW;AAIxB,QAAO,IAAI,iBAAiB,KAAK,SAAU,KAAK,KAAK;AACnD,aAAW,QAAQ,UAAU,eAAe,KAAK,IAAI;AACrD,QAAM,sBAAsB;GAC5B;AAEF,QAAO,IAAI,iBAAiB,MAAM,SAAU,KAAK,KAAK;AACpD,aAAW,QAAQ,UAAU,eAAe,KAAK,IAAI;AACrD,QAAM,cAAc;GACpB;AAEF,QAAO"}
@@ -1,44 +1,32 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.setSecurityWebHeaders = setSecurityWebHeaders;
7
- var _debug = _interopRequireDefault(require("debug"));
8
- var _core = require("@verdaccio/core");
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
- const debug = (0, _debug.default)('verdaccio:middleware:web:security');
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
+ let _verdaccio_core = require("@verdaccio/core");
3
+ let debug = require("debug");
4
+ debug = require_runtime.__toESM(debug);
5
+ //#region src/middlewares/web/security.ts
6
+ var debug$1 = (0, debug.default)("verdaccio:middleware:web:security");
11
7
  function setSecurityWebHeaders(_req, res, next) {
12
- // disable loading in frames (clickjacking, etc.)
13
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Frame-Options
14
- const framesOptions = res.getHeader(_core.HEADERS.FRAMES_OPTIONS);
15
- if (!framesOptions || !(framesOptions === 'deny' || framesOptions === 'sameorigin')) {
16
- debug('Missing or invalid X-Frame-Options header; setting to "deny"');
17
- res.header(_core.HEADERS.FRAMES_OPTIONS, 'deny');
18
- }
19
-
20
- // avoid establishing connections outside of domain
21
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy
22
- if (!res.getHeader(_core.HEADERS.CSP)) {
23
- debug('Missing Content-Security-Policy header; setting to "connect-src \'self\'"');
24
- res.header(_core.HEADERS.CSP, "connect-src 'self'");
25
- }
26
-
27
- // respect the content type of the response
28
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Content-Type-Options
29
- const cto = res.getHeader(_core.HEADERS.CTO);
30
- if (!cto || cto !== 'nosniff') {
31
- debug('Missing or invalid X-Content-Type-Options header; setting to "nosniff"');
32
- res.header(_core.HEADERS.CTO, 'nosniff');
33
- }
34
-
35
- // block rendering of the page in case of XSS attack
36
- // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-XSS-Protection
37
- const xss = res.getHeader(_core.HEADERS.XSS);
38
- if (!xss || !(xss === '0' || xss.startsWith('1'))) {
39
- debug('Missing or invalid X-XSS-Protection header; setting to "1; mode=block"');
40
- res.header(_core.HEADERS.XSS, '1; mode=block');
41
- }
42
- next();
8
+ const framesOptions = res.getHeader(_verdaccio_core.HEADERS.FRAMES_OPTIONS);
9
+ if (!framesOptions || !(framesOptions === "deny" || framesOptions === "sameorigin")) {
10
+ debug$1("Missing or invalid X-Frame-Options header; setting to \"deny\"");
11
+ res.header(_verdaccio_core.HEADERS.FRAMES_OPTIONS, "deny");
12
+ }
13
+ if (!res.getHeader(_verdaccio_core.HEADERS.CSP)) {
14
+ debug$1("Missing Content-Security-Policy header; setting to \"connect-src 'self'\"");
15
+ res.header(_verdaccio_core.HEADERS.CSP, "connect-src 'self'");
16
+ }
17
+ const cto = res.getHeader(_verdaccio_core.HEADERS.CTO);
18
+ if (!cto || cto !== "nosniff") {
19
+ debug$1("Missing or invalid X-Content-Type-Options header; setting to \"nosniff\"");
20
+ res.header(_verdaccio_core.HEADERS.CTO, "nosniff");
21
+ }
22
+ const xss = res.getHeader(_verdaccio_core.HEADERS.XSS);
23
+ if (!xss || !(xss === "0" || xss.startsWith("1"))) {
24
+ debug$1("Missing or invalid X-XSS-Protection header; setting to \"1; mode=block\"");
25
+ res.header(_verdaccio_core.HEADERS.XSS, "1; mode=block");
26
+ }
27
+ next();
43
28
  }
29
+ //#endregion
30
+ exports.setSecurityWebHeaders = setSecurityWebHeaders;
31
+
44
32
  //# sourceMappingURL=security.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"security.js","names":["_debug","_interopRequireDefault","require","_core","e","__esModule","default","debug","buildDebug","setSecurityWebHeaders","_req","res","next","framesOptions","getHeader","HEADERS","FRAMES_OPTIONS","header","CSP","cto","CTO","xss","XSS","startsWith"],"sources":["../../../src/middlewares/web/security.ts"],"sourcesContent":["import buildDebug from 'debug';\n\nimport { HEADERS } from '@verdaccio/core';\n\nconst debug = buildDebug('verdaccio:middleware:web:security');\n\nexport function setSecurityWebHeaders(_req, res, next): void {\n // disable loading in frames (clickjacking, etc.)\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Frame-Options\n const framesOptions = res.getHeader(HEADERS.FRAMES_OPTIONS);\n if (!framesOptions || !(framesOptions === 'deny' || framesOptions === 'sameorigin')) {\n debug('Missing or invalid X-Frame-Options header; setting to \"deny\"');\n res.header(HEADERS.FRAMES_OPTIONS, 'deny');\n }\n\n // avoid establishing connections outside of domain\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy\n if (!res.getHeader(HEADERS.CSP)) {\n debug('Missing Content-Security-Policy header; setting to \"connect-src \\'self\\'\"');\n res.header(HEADERS.CSP, \"connect-src 'self'\");\n }\n\n // respect the content type of the response\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Content-Type-Options\n const cto = res.getHeader(HEADERS.CTO);\n if (!cto || cto !== 'nosniff') {\n debug('Missing or invalid X-Content-Type-Options header; setting to \"nosniff\"');\n res.header(HEADERS.CTO, 'nosniff');\n }\n\n // block rendering of the page in case of XSS attack\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-XSS-Protection\n const xss = res.getHeader(HEADERS.XSS);\n if (!xss || !(xss === '0' || xss.startsWith('1'))) {\n debug('Missing or invalid X-XSS-Protection header; setting to \"1; mode=block\"');\n res.header(HEADERS.XSS, '1; mode=block');\n }\n next();\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,KAAA,GAAAD,OAAA;AAA0C,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE1C,MAAMG,KAAK,GAAG,IAAAC,cAAU,EAAC,mCAAmC,CAAC;AAEtD,SAASC,qBAAqBA,CAACC,IAAI,EAAEC,GAAG,EAAEC,IAAI,EAAQ;EAC3D;EACA;EACA,MAAMC,aAAa,GAAGF,GAAG,CAACG,SAAS,CAACC,aAAO,CAACC,cAAc,CAAC;EAC3D,IAAI,CAACH,aAAa,IAAI,EAAEA,aAAa,KAAK,MAAM,IAAIA,aAAa,KAAK,YAAY,CAAC,EAAE;IACnFN,KAAK,CAAC,8DAA8D,CAAC;IACrEI,GAAG,CAACM,MAAM,CAACF,aAAO,CAACC,cAAc,EAAE,MAAM,CAAC;EAC5C;;EAEA;EACA;EACA,IAAI,CAACL,GAAG,CAACG,SAAS,CAACC,aAAO,CAACG,GAAG,CAAC,EAAE;IAC/BX,KAAK,CAAC,2EAA2E,CAAC;IAClFI,GAAG,CAACM,MAAM,CAACF,aAAO,CAACG,GAAG,EAAE,oBAAoB,CAAC;EAC/C;;EAEA;EACA;EACA,MAAMC,GAAG,GAAGR,GAAG,CAACG,SAAS,CAACC,aAAO,CAACK,GAAG,CAAC;EACtC,IAAI,CAACD,GAAG,IAAIA,GAAG,KAAK,SAAS,EAAE;IAC7BZ,KAAK,CAAC,wEAAwE,CAAC;IAC/EI,GAAG,CAACM,MAAM,CAACF,aAAO,CAACK,GAAG,EAAE,SAAS,CAAC;EACpC;;EAEA;EACA;EACA,MAAMC,GAAG,GAAGV,GAAG,CAACG,SAAS,CAACC,aAAO,CAACO,GAAG,CAAC;EACtC,IAAI,CAACD,GAAG,IAAI,EAAEA,GAAG,KAAK,GAAG,IAAIA,GAAG,CAACE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;IACjDhB,KAAK,CAAC,wEAAwE,CAAC;IAC/EI,GAAG,CAACM,MAAM,CAACF,aAAO,CAACO,GAAG,EAAE,eAAe,CAAC;EAC1C;EACAV,IAAI,CAAC,CAAC;AACR","ignoreList":[]}
1
+ {"version":3,"file":"security.js","names":[],"sources":["../../../src/middlewares/web/security.ts"],"sourcesContent":["import buildDebug from 'debug';\n\nimport { HEADERS } from '@verdaccio/core';\n\nconst debug = buildDebug('verdaccio:middleware:web:security');\n\nexport function setSecurityWebHeaders(_req, res, next): void {\n // disable loading in frames (clickjacking, etc.)\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Frame-Options\n const framesOptions = res.getHeader(HEADERS.FRAMES_OPTIONS);\n if (!framesOptions || !(framesOptions === 'deny' || framesOptions === 'sameorigin')) {\n debug('Missing or invalid X-Frame-Options header; setting to \"deny\"');\n res.header(HEADERS.FRAMES_OPTIONS, 'deny');\n }\n\n // avoid establishing connections outside of domain\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Security-Policy\n if (!res.getHeader(HEADERS.CSP)) {\n debug('Missing Content-Security-Policy header; setting to \"connect-src \\'self\\'\"');\n res.header(HEADERS.CSP, \"connect-src 'self'\");\n }\n\n // respect the content type of the response\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Content-Type-Options\n const cto = res.getHeader(HEADERS.CTO);\n if (!cto || cto !== 'nosniff') {\n debug('Missing or invalid X-Content-Type-Options header; setting to \"nosniff\"');\n res.header(HEADERS.CTO, 'nosniff');\n }\n\n // block rendering of the page in case of XSS attack\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-XSS-Protection\n const xss = res.getHeader(HEADERS.XSS);\n if (!xss || !(xss === '0' || xss.startsWith('1'))) {\n debug('Missing or invalid X-XSS-Protection header; setting to \"1; mode=block\"');\n res.header(HEADERS.XSS, '1; mode=block');\n }\n next();\n}\n"],"mappings":";;;;;AAIA,IAAM,WAAA,GAAA,MAAA,SAAmB,oCAAoC;AAE7D,SAAgB,sBAAsB,MAAM,KAAK,MAAY;CAG3D,MAAM,gBAAgB,IAAI,UAAU,gBAAA,QAAQ,eAAe;AAC3D,KAAI,CAAC,iBAAiB,EAAE,kBAAkB,UAAU,kBAAkB,eAAe;AACnF,UAAM,iEAA+D;AACrE,MAAI,OAAO,gBAAA,QAAQ,gBAAgB,OAAO;;AAK5C,KAAI,CAAC,IAAI,UAAU,gBAAA,QAAQ,IAAI,EAAE;AAC/B,UAAM,4EAA4E;AAClF,MAAI,OAAO,gBAAA,QAAQ,KAAK,qBAAqB;;CAK/C,MAAM,MAAM,IAAI,UAAU,gBAAA,QAAQ,IAAI;AACtC,KAAI,CAAC,OAAO,QAAQ,WAAW;AAC7B,UAAM,2EAAyE;AAC/E,MAAI,OAAO,gBAAA,QAAQ,KAAK,UAAU;;CAKpC,MAAM,MAAM,IAAI,UAAU,gBAAA,QAAQ,IAAI;AACtC,KAAI,CAAC,OAAO,EAAE,QAAQ,OAAO,IAAI,WAAW,IAAI,GAAG;AACjD,UAAM,2EAAyE;AAC/E,MAAI,OAAO,gBAAA,QAAQ,KAAK,gBAAgB;;AAE1C,OAAM"}