@verdaccio/web 8.1.0-next-8.7 → 8.1.0-next-8.9

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,40 @@
1
1
  # @verdaccio/web
2
2
 
3
+ ## 8.1.0-next-8.9
4
+
5
+ ### Patch Changes
6
+
7
+ - 96e0011: chore: export and constant on middleware
8
+ - Updated dependencies [96e0011]
9
+ - @verdaccio/middleware@8.0.0-next-8.9
10
+ - @verdaccio/auth@8.0.0-next-8.9
11
+ - @verdaccio/core@8.0.0-next-8.9
12
+ - @verdaccio/config@8.0.0-next-8.9
13
+ - @verdaccio/tarball@13.0.0-next-8.9
14
+ - @verdaccio/url@13.0.0-next-8.9
15
+ - @verdaccio/loaders@8.0.0-next-8.4
16
+ - @verdaccio/store@8.0.0-next-8.9
17
+ - @verdaccio/utils@8.1.0-next-8.9
18
+ - @verdaccio/logger@8.0.0-next-8.9
19
+
20
+ ## 8.1.0-next-8.8
21
+
22
+ ### Patch Changes
23
+
24
+ - a7afdc7: feat: show version-specific readmes in web ui
25
+ - Updated dependencies [0588605]
26
+ - Updated dependencies [ca91b9a]
27
+ - @verdaccio/config@8.0.0-next-8.8
28
+ - @verdaccio/auth@8.0.0-next-8.8
29
+ - @verdaccio/loaders@8.0.0-next-8.4
30
+ - @verdaccio/middleware@8.0.0-next-8.8
31
+ - @verdaccio/store@8.0.0-next-8.8
32
+ - @verdaccio/core@8.0.0-next-8.8
33
+ - @verdaccio/tarball@13.0.0-next-8.8
34
+ - @verdaccio/url@13.0.0-next-8.8
35
+ - @verdaccio/logger@8.0.0-next-8.8
36
+ - @verdaccio/utils@8.1.0-next-8.8
37
+
3
38
  ## 8.1.0-next-8.7
4
39
 
5
40
  ### Patch Changes
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Verdaccio contributors
3
+ Copyright (c) 2025 Verdaccio contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -27,6 +27,7 @@ var _express = require("express");
27
27
  var _core = require("@verdaccio/core");
28
28
  var _logger = require("@verdaccio/logger");
29
29
  var _middleware = require("@verdaccio/middleware");
30
+ var _utils = require("@verdaccio/utils");
30
31
  var _webUtils = require("../web-utils");
31
32
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
33
  // Was required by other packages
@@ -47,6 +48,24 @@ const getReadme = readme => {
47
48
  return readme;
48
49
  }
49
50
  };
51
+ const getReadmeFromManifest = (manifest, v) => {
52
+ let id;
53
+ let readme;
54
+ if (typeof v === 'string' && (0, _utils.isVersionValid)(manifest, v)) {
55
+ id = 'version';
56
+ readme = manifest.versions[v].readme;
57
+ }
58
+ if (!readme && (0, _utils.isVersionValid)(manifest, manifest[_core.DIST_TAGS]?.latest)) {
59
+ id = 'latest';
60
+ readme = manifest.versions[manifest[_core.DIST_TAGS].latest].readme;
61
+ }
62
+ if (!readme && manifest.readme) {
63
+ id = 'root';
64
+ readme = manifest.readme;
65
+ }
66
+ debug('readme: %o %o', v, id);
67
+ return readme;
68
+ };
50
69
  function addReadmeWebApi(storage, auth) {
51
70
  debug('initialized readme web api');
52
71
  const can = (0, _middleware.allow)(auth, {
@@ -77,7 +96,11 @@ function addReadmeWebApi(storage, auth) {
77
96
  });
78
97
  debug('readme pkg %o', manifest?.name);
79
98
  res.set(_core.HEADER_TYPE.CONTENT_TYPE, _core.HEADERS.TEXT_PLAIN_UTF8);
80
- next(getReadme(manifest.readme));
99
+ const {
100
+ v
101
+ } = req.query;
102
+ const readme = getReadmeFromManifest(manifest, v);
103
+ next(getReadme(readme));
81
104
  } catch (err) {
82
105
  next(err);
83
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"readme.js","names":["_debug","_interopRequireDefault","require","_express","_core","_logger","_middleware","_webUtils","e","__esModule","default","NOT_README_FOUND","exports","debug","buildDebug","getReadme","readme","length","addReadmeWebApi","storage","auth","can","allow","beforeAll","a","b","logger","trace","afterAll","pkgRouter","Router","get","WebUrls","readme_package_scoped_version","readme_package_version","req","res","next","rawScope","params","scope","slice","name","addScope","package","requestOptions","protocol","headers","host","remoteAddress","socket","manifest","getPackageByOptions","uplinksLook","abbreviated","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","err","_default"],"sources":["../../src/api/readme.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { Auth } from '@verdaccio/auth';\nimport { HEADERS, HEADER_TYPE } from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';\n// Was required by other packages\nimport { WebUrls } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Manifest } from '@verdaccio/types';\n\nimport { AuthorAvatar, addScope } from '../web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\n// TODO: review this type, should be on @verdacid/types\nexport type PackageExt = Manifest & { author: AuthorAvatar; dist?: { tarball: string } };\nexport const NOT_README_FOUND = 'ERROR: No README data found!';\nconst debug = buildDebug('verdaccio:web:api:readme');\nconst getReadme = (readme) => {\n if (typeof readme === 'string' && readme.length === 0) {\n return NOT_README_FOUND;\n }\n if (typeof readme !== 'string') {\n return NOT_README_FOUND;\n } else {\n return readme;\n }\n};\n\nfunction addReadmeWebApi(storage: Storage, auth: Auth): Router {\n debug('initialized readme web api');\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n\n pkgRouter.get(\n [WebUrls.readme_package_scoped_version, WebUrls.readme_package_version],\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('readme hit');\n const rawScope = req.params.scope; // May include '@'\n const scope = rawScope ? rawScope.slice(1) : null; // Remove '@' if present\n const name = scope ? addScope(scope, req.params.package) : req.params.package;\n debug('readme name %o', name);\n const requestOptions = {\n protocol: req.protocol,\n headers: req.headers as any,\n // FIXME: if we migrate to req.hostname, the port is not longer included.\n host: req.host,\n remoteAddress: req.socket.remoteAddress,\n };\n try {\n const manifest = (await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n abbreviated: false,\n requestOptions,\n })) as Manifest;\n debug('readme pkg %o', manifest?.name);\n res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);\n next(getReadme(manifest.readme));\n } catch (err) {\n next(err);\n }\n }\n );\n return pkgRouter;\n}\n\nexport default addReadmeWebApi;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAGA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,WAAA,GAAAJ,OAAA;AAMA,IAAAK,SAAA,GAAAL,OAAA;AAAsD,SAAAD,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AALtD;;AAO8D;;AAE9D;;AAEO,MAAMG,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG,8BAA8B;AAC9D,MAAME,KAAK,GAAG,IAAAC,cAAU,EAAC,0BAA0B,CAAC;AACpD,MAAMC,SAAS,GAAIC,MAAM,IAAK;EAC5B,IAAI,OAAOA,MAAM,KAAK,QAAQ,IAAIA,MAAM,CAACC,MAAM,KAAK,CAAC,EAAE;IACrD,OAAON,gBAAgB;EACzB;EACA,IAAI,OAAOK,MAAM,KAAK,QAAQ,EAAE;IAC9B,OAAOL,gBAAgB;EACzB,CAAC,MAAM;IACL,OAAOK,MAAM;EACf;AACF,CAAC;AAED,SAASE,eAAeA,CAACC,OAAgB,EAAEC,IAAU,EAAU;EAC7DP,KAAK,CAAC,4BAA4B,CAAC;EACnC,MAAMQ,GAAG,GAAG,IAAAC,iBAAK,EAACF,IAAI,EAAE;IACtBG,SAAS,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKC,cAAM,CAACC,KAAK,CAACH,CAAC,EAAEC,CAAC,CAAC;IACvCG,QAAQ,EAAEA,CAACJ,CAAC,EAAEC,CAAC,KAAKC,cAAM,CAACC,KAAK,CAACH,CAAC,EAAEC,CAAC;EACvC,CAAC,CAAC;EACF,MAAMI,SAAS,GAAG,IAAAC,eAAM,EAAC,CAAC,CAAC,CAAC;;EAE5BD,SAAS,CAACE,GAAG,CACX,CAACC,mBAAO,CAACC,6BAA6B,EAAED,mBAAO,CAACE,sBAAsB,CAAC,EACvEb,GAAG,CAAC,QAAQ,CAAC,EACb,gBACEc,GAAmB,EACnBC,GAAoB,EACpBC,IAAsB,EACP;IACfxB,KAAK,CAAC,YAAY,CAAC;IACnB,MAAMyB,QAAQ,GAAGH,GAAG,CAACI,MAAM,CAACC,KAAK,CAAC,CAAC;IACnC,MAAMA,KAAK,GAAGF,QAAQ,GAAGA,QAAQ,CAACG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACnD,MAAMC,IAAI,GAAGF,KAAK,GAAG,IAAAG,kBAAQ,EAACH,KAAK,EAAEL,GAAG,CAACI,MAAM,CAACK,OAAO,CAAC,GAAGT,GAAG,CAACI,MAAM,CAACK,OAAO;IAC7E/B,KAAK,CAAC,gBAAgB,EAAE6B,IAAI,CAAC;IAC7B,MAAMG,cAAc,GAAG;MACrBC,QAAQ,EAAEX,GAAG,CAACW,QAAQ;MACtBC,OAAO,EAAEZ,GAAG,CAACY,OAAc;MAC3B;MACAC,IAAI,EAAEb,GAAG,CAACa,IAAI;MACdC,aAAa,EAAEd,GAAG,CAACe,MAAM,CAACD;IAC5B,CAAC;IACD,IAAI;MACF,MAAME,QAAQ,GAAI,MAAMhC,OAAO,CAACiC,mBAAmB,CAAC;QAClDV,IAAI;QACJW,WAAW,EAAE,IAAI;QACjBC,WAAW,EAAE,KAAK;QAClBT;MACF,CAAC,CAAc;MACfhC,KAAK,CAAC,eAAe,EAAEsC,QAAQ,EAAET,IAAI,CAAC;MACtCN,GAAG,CAACmB,GAAG,CAACC,iBAAW,CAACC,YAAY,EAAEC,aAAO,CAACC,eAAe,CAAC;MAC1DtB,IAAI,CAACtB,SAAS,CAACoC,QAAQ,CAACnC,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC,OAAO4C,GAAG,EAAE;MACZvB,IAAI,CAACuB,GAAG,CAAC;IACX;EACF,CACF,CAAC;EACD,OAAO/B,SAAS;AAClB;AAAC,IAAAgC,QAAA,GAAAjD,OAAA,CAAAF,OAAA,GAEcQ,eAAe","ignoreList":[]}
1
+ {"version":3,"file":"readme.js","names":["_debug","_interopRequireDefault","require","_express","_core","_logger","_middleware","_utils","_webUtils","e","__esModule","default","NOT_README_FOUND","exports","debug","buildDebug","getReadme","readme","length","getReadmeFromManifest","manifest","v","id","isVersionValid","versions","DIST_TAGS","latest","addReadmeWebApi","storage","auth","can","allow","beforeAll","a","b","logger","trace","afterAll","pkgRouter","Router","get","WebUrls","readme_package_scoped_version","readme_package_version","req","res","next","rawScope","params","scope","slice","name","addScope","package","requestOptions","protocol","headers","host","remoteAddress","socket","getPackageByOptions","uplinksLook","abbreviated","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","query","err","_default"],"sources":["../../src/api/readme.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { Auth } from '@verdaccio/auth';\nimport { DIST_TAGS, HEADERS, HEADER_TYPE } from '@verdaccio/core';\nimport { logger } from '@verdaccio/logger';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';\n// Was required by other packages\nimport { WebUrls } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Manifest } from '@verdaccio/types';\nimport { isVersionValid } from '@verdaccio/utils';\n\nimport { AuthorAvatar, addScope } from '../web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\n// TODO: review this type, should be on @verdacid/types\nexport type PackageExt = Manifest & { author: AuthorAvatar; dist?: { tarball: string } };\nexport const NOT_README_FOUND = 'ERROR: No README data found!';\nconst debug = buildDebug('verdaccio:web:api:readme');\n\nconst getReadme = (readme) => {\n if (typeof readme === 'string' && readme.length === 0) {\n return NOT_README_FOUND;\n }\n if (typeof readme !== 'string') {\n return NOT_README_FOUND;\n } else {\n return readme;\n }\n};\n\nconst getReadmeFromManifest = (manifest: Manifest, v?: any): string | undefined => {\n let id;\n let readme;\n if (typeof v === 'string' && isVersionValid(manifest, v)) {\n id = 'version';\n readme = manifest.versions[v].readme;\n }\n if (!readme && isVersionValid(manifest, manifest[DIST_TAGS]?.latest)) {\n id = 'latest';\n readme = manifest.versions[manifest[DIST_TAGS].latest].readme;\n }\n if (!readme && manifest.readme) {\n id = 'root';\n readme = manifest.readme;\n }\n debug('readme: %o %o', v, id);\n return readme;\n};\n\nfunction addReadmeWebApi(storage: Storage, auth: Auth): Router {\n debug('initialized readme web api');\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n\n pkgRouter.get(\n [WebUrls.readme_package_scoped_version, WebUrls.readme_package_version],\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('readme hit');\n const rawScope = req.params.scope; // May include '@'\n const scope = rawScope ? rawScope.slice(1) : null; // Remove '@' if present\n const name = scope ? addScope(scope, req.params.package) : req.params.package;\n debug('readme name %o', name);\n const requestOptions = {\n protocol: req.protocol,\n headers: req.headers as any,\n // FIXME: if we migrate to req.hostname, the port is not longer included.\n host: req.host,\n remoteAddress: req.socket.remoteAddress,\n };\n try {\n const manifest = (await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n abbreviated: false,\n requestOptions,\n })) as Manifest;\n debug('readme pkg %o', manifest?.name);\n res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);\n const { v } = req.query;\n const readme = getReadmeFromManifest(manifest, v);\n next(getReadme(readme));\n } catch (err) {\n next(err);\n }\n }\n );\n return pkgRouter;\n}\n\nexport default addReadmeWebApi;\n"],"mappings":"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","ignoreList":[]}
package/build/index.d.ts CHANGED
@@ -1 +1,2 @@
1
- export { default } from './middleware';
1
+ export { default, PLUGIN_UI_PREFIX, DEFAULT_PLUGIN_UI_THEME } from './middleware';
2
+ export * from './web-utils';
package/build/index.js CHANGED
@@ -3,12 +3,41 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ var _exportNames = {
7
+ PLUGIN_UI_PREFIX: true,
8
+ DEFAULT_PLUGIN_UI_THEME: true
9
+ };
10
+ Object.defineProperty(exports, "DEFAULT_PLUGIN_UI_THEME", {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _middleware.DEFAULT_PLUGIN_UI_THEME;
14
+ }
15
+ });
16
+ Object.defineProperty(exports, "PLUGIN_UI_PREFIX", {
17
+ enumerable: true,
18
+ get: function () {
19
+ return _middleware.PLUGIN_UI_PREFIX;
20
+ }
21
+ });
6
22
  Object.defineProperty(exports, "default", {
7
23
  enumerable: true,
8
24
  get: function () {
9
25
  return _middleware.default;
10
26
  }
11
27
  });
12
- var _middleware = _interopRequireDefault(require("./middleware"));
13
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
28
+ var _middleware = _interopRequireWildcard(require("./middleware"));
29
+ var _webUtils = require("./web-utils");
30
+ Object.keys(_webUtils).forEach(function (key) {
31
+ if (key === "default" || key === "__esModule") return;
32
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
33
+ if (key in exports && exports[key] === _webUtils[key]) return;
34
+ Object.defineProperty(exports, key, {
35
+ enumerable: true,
36
+ get: function () {
37
+ return _webUtils[key];
38
+ }
39
+ });
40
+ });
41
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
42
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
43
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_middleware","_interopRequireDefault","require","e","__esModule","default"],"sources":["../src/index.ts"],"sourcesContent":["export { default } from './middleware';\n"],"mappings":";;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAuC,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_middleware","_interopRequireWildcard","require","_webUtils","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set"],"sources":["../src/index.ts"],"sourcesContent":["export { default, PLUGIN_UI_PREFIX, DEFAULT_PLUGIN_UI_THEME } from './middleware';\nexport * from './web-utils';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,SAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,SAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,SAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAA4B,SAAAS,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAhB,wBAAAgB,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAL,GAAA,CAAAE,CAAA,OAAAO,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAtB,MAAA,CAAAS,cAAA,IAAAT,MAAA,CAAAuB,wBAAA,WAAAC,CAAA,IAAAX,CAAA,oBAAAW,CAAA,OAAAnB,cAAA,CAAAC,IAAA,CAAAO,CAAA,EAAAW,CAAA,SAAAC,CAAA,GAAAH,CAAA,GAAAtB,MAAA,CAAAuB,wBAAA,CAAAV,CAAA,EAAAW,CAAA,UAAAC,CAAA,KAAAA,CAAA,CAAAd,GAAA,IAAAc,CAAA,CAAAC,GAAA,IAAA1B,MAAA,CAAAS,cAAA,CAAAW,CAAA,EAAAI,CAAA,EAAAC,CAAA,IAAAL,CAAA,CAAAI,CAAA,IAAAX,CAAA,CAAAW,CAAA,YAAAJ,CAAA,CAAAF,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAU,GAAA,CAAAb,CAAA,EAAAO,CAAA,GAAAA,CAAA","ignoreList":[]}
@@ -1,3 +1,5 @@
1
+ export declare const PLUGIN_UI_PREFIX = "verdaccio-theme";
2
+ export declare const DEFAULT_PLUGIN_UI_THEME = "@verdaccio/ui-theme";
1
3
  export declare function loadTheme(config: any): Promise<any>;
2
4
  declare const _default: (config: any, auth: any, storage: any, logger: any) => Promise<import("express-serve-static-core").Router>;
3
5
  export default _default;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.default = exports.PLUGIN_UI_PREFIX = exports.DEFAULT_PLUGIN_UI_THEME = void 0;
7
7
  exports.loadTheme = loadTheme;
8
8
  var _express = _interopRequireDefault(require("express"));
9
9
  var _lodash = _interopRequireDefault(require("lodash"));
@@ -13,6 +13,8 @@ var _logger = require("@verdaccio/logger");
13
13
  var _middleware = require("@verdaccio/middleware");
14
14
  var _api = _interopRequireDefault(require("./api"));
15
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ const PLUGIN_UI_PREFIX = exports.PLUGIN_UI_PREFIX = 'verdaccio-theme';
17
+ const DEFAULT_PLUGIN_UI_THEME = exports.DEFAULT_PLUGIN_UI_THEME = '@verdaccio/ui-theme';
16
18
  async function loadTheme(config) {
17
19
  if (_lodash.default.isNil(config.theme) === false) {
18
20
  const plugin = await (0, _loaders.asyncLoadPlugin)(config.theme, {
@@ -22,13 +24,13 @@ async function loadTheme(config) {
22
24
  // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown }
23
25
  function (plugin) {
24
26
  /**
25
- *
27
+ *
26
28
  - `staticPath`: is the same data returned in Verdaccio 5.
27
29
  - `manifest`: A webpack manifest object.
28
30
  - `manifestFiles`: A object with one property `js` and the array (order matters) of the manifest id to be loaded in the template dynamically.
29
31
  */
30
32
  return plugin.staticPath && plugin.manifest && plugin.manifestFiles;
31
- }, config?.serverSettings?.pluginPrefix ?? 'verdaccio-theme', _core.PLUGIN_CATEGORY.THEME);
33
+ }, config?.serverSettings?.pluginPrefix ?? PLUGIN_UI_PREFIX, _core.PLUGIN_CATEGORY.THEME);
32
34
  if (plugin.length > 1) {
33
35
  _logger.logger.warn('multiple ui themes are not supported; only the first plugin is used');
34
36
  }
@@ -38,9 +40,9 @@ async function loadTheme(config) {
38
40
  var _default = async (config, auth, storage, logger) => {
39
41
  let pluginOptions = await loadTheme(config);
40
42
  if (!pluginOptions) {
41
- pluginOptions = require('@verdaccio/ui-theme')(config.web);
43
+ pluginOptions = require(DEFAULT_PLUGIN_UI_THEME)(config.web);
42
44
  logger.info({
43
- name: '@verdaccio/ui-theme',
45
+ name: DEFAULT_PLUGIN_UI_THEME,
44
46
  pluginCategory: _core.PLUGIN_CATEGORY.THEME
45
47
  }, 'plugin @{name} successfully loaded (@{pluginCategory})');
46
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","names":["_express","_interopRequireDefault","require","_lodash","_core","_loaders","_logger","_middleware","_api","e","__esModule","default","loadTheme","config","_","isNil","theme","plugin","asyncLoadPlugin","logger","staticPath","manifest","manifestFiles","serverSettings","pluginPrefix","PLUGIN_CATEGORY","THEME","length","warn","head","_default","auth","storage","pluginOptions","web","info","name","pluginCategory","router","express","Router","use","webMiddleware","tokenMiddleware","webUIJWTmiddleware","webEndpointsApi","exports"],"sources":["../src/middleware.ts"],"sourcesContent":["import express from 'express';\nimport _ from 'lodash';\n\nimport { PLUGIN_CATEGORY } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport { webMiddleware } from '@verdaccio/middleware';\n\nimport webEndpointsApi from './api';\n\nexport async function loadTheme(config: any) {\n if (_.isNil(config.theme) === false) {\n const plugin = await asyncLoadPlugin(\n config.theme,\n { config, logger },\n // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown }\n function (plugin: any) {\n /**\n * \n - `staticPath`: is the same data returned in Verdaccio 5.\n - `manifest`: A webpack manifest object.\n - `manifestFiles`: A object with one property `js` and the array (order matters) of the manifest id to be loaded in the template dynamically.\n */\n return plugin.staticPath && plugin.manifest && plugin.manifestFiles;\n },\n config?.serverSettings?.pluginPrefix ?? 'verdaccio-theme',\n PLUGIN_CATEGORY.THEME\n );\n if (plugin.length > 1) {\n logger.warn('multiple ui themes are not supported; only the first plugin is used');\n }\n\n return _.head(plugin);\n }\n}\n\nexport default async (config, auth, storage, logger) => {\n let pluginOptions = await loadTheme(config);\n if (!pluginOptions) {\n pluginOptions = require('@verdaccio/ui-theme')(config.web);\n logger.info(\n { name: '@verdaccio/ui-theme', pluginCategory: PLUGIN_CATEGORY.THEME },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n }\n\n // eslint-disable-next-line new-cap\n const router = express.Router();\n // load application\n router.use(\n webMiddleware(\n config,\n {\n tokenMiddleware: auth.webUIJWTmiddleware(),\n webEndpointsApi: webEndpointsApi(auth, storage, config),\n },\n pluginOptions\n )\n );\n return router;\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AAEA,IAAAM,IAAA,GAAAP,sBAAA,CAAAC,OAAA;AAAoC,SAAAD,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE7B,eAAeG,SAASA,CAACC,MAAW,EAAE;EAC3C,IAAIC,eAAC,CAACC,KAAK,CAACF,MAAM,CAACG,KAAK,CAAC,KAAK,KAAK,EAAE;IACnC,MAAMC,MAAM,GAAG,MAAM,IAAAC,wBAAe,EAClCL,MAAM,CAACG,KAAK,EACZ;MAAEH,MAAM;MAAEM,MAAM,EAANA;IAAO,CAAC;IAClB;IACA,UAAUF,MAAW,EAAE;MACrB;AACR;AACA;AACA;AACA;AACA;MACQ,OAAOA,MAAM,CAACG,UAAU,IAAIH,MAAM,CAACI,QAAQ,IAAIJ,MAAM,CAACK,aAAa;IACrE,CAAC,EACDT,MAAM,EAAEU,cAAc,EAAEC,YAAY,IAAI,iBAAiB,EACzDC,qBAAe,CAACC,KAClB,CAAC;IACD,IAAIT,MAAM,CAACU,MAAM,GAAG,CAAC,EAAE;MACrBR,cAAM,CAACS,IAAI,CAAC,qEAAqE,CAAC;IACpF;IAEA,OAAOd,eAAC,CAACe,IAAI,CAACZ,MAAM,CAAC;EACvB;AACF;AAAC,IAAAa,QAAA,GAEc,MAAAA,CAAOjB,MAAM,EAAEkB,IAAI,EAAEC,OAAO,EAAEb,MAAM,KAAK;EACtD,IAAIc,aAAa,GAAG,MAAMrB,SAAS,CAACC,MAAM,CAAC;EAC3C,IAAI,CAACoB,aAAa,EAAE;IAClBA,aAAa,GAAG/B,OAAO,CAAC,qBAAqB,CAAC,CAACW,MAAM,CAACqB,GAAG,CAAC;IAC1Df,MAAM,CAACgB,IAAI,CACT;MAAEC,IAAI,EAAE,qBAAqB;MAAEC,cAAc,EAAEZ,qBAAe,CAACC;IAAM,CAAC,EACtE,wDACF,CAAC;EACH;;EAEA;EACA,MAAMY,MAAM,GAAGC,gBAAO,CAACC,MAAM,CAAC,CAAC;EAC/B;EACAF,MAAM,CAACG,GAAG,CACR,IAAAC,yBAAa,EACX7B,MAAM,EACN;IACE8B,eAAe,EAAEZ,IAAI,CAACa,kBAAkB,CAAC,CAAC;IAC1CC,eAAe,EAAE,IAAAA,YAAe,EAACd,IAAI,EAAEC,OAAO,EAAEnB,MAAM;EACxD,CAAC,EACDoB,aACF,CACF,CAAC;EACD,OAAOK,MAAM;AACf,CAAC;AAAAQ,OAAA,CAAAnC,OAAA,GAAAmB,QAAA","ignoreList":[]}
1
+ {"version":3,"file":"middleware.js","names":["_express","_interopRequireDefault","require","_lodash","_core","_loaders","_logger","_middleware","_api","e","__esModule","default","PLUGIN_UI_PREFIX","exports","DEFAULT_PLUGIN_UI_THEME","loadTheme","config","_","isNil","theme","plugin","asyncLoadPlugin","logger","staticPath","manifest","manifestFiles","serverSettings","pluginPrefix","PLUGIN_CATEGORY","THEME","length","warn","head","_default","auth","storage","pluginOptions","web","info","name","pluginCategory","router","express","Router","use","webMiddleware","tokenMiddleware","webUIJWTmiddleware","webEndpointsApi"],"sources":["../src/middleware.ts"],"sourcesContent":["import express from 'express';\nimport _ from 'lodash';\n\nimport { PLUGIN_CATEGORY } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport { webMiddleware } from '@verdaccio/middleware';\n\nimport webEndpointsApi from './api';\n\nexport const PLUGIN_UI_PREFIX = 'verdaccio-theme';\nexport const DEFAULT_PLUGIN_UI_THEME = '@verdaccio/ui-theme';\n\nexport async function loadTheme(config: any) {\n if (_.isNil(config.theme) === false) {\n const plugin = await asyncLoadPlugin(\n config.theme,\n { config, logger },\n // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown }\n function (plugin: any) {\n /**\n *\n - `staticPath`: is the same data returned in Verdaccio 5.\n - `manifest`: A webpack manifest object.\n - `manifestFiles`: A object with one property `js` and the array (order matters) of the manifest id to be loaded in the template dynamically.\n */\n return plugin.staticPath && plugin.manifest && plugin.manifestFiles;\n },\n config?.serverSettings?.pluginPrefix ?? PLUGIN_UI_PREFIX,\n PLUGIN_CATEGORY.THEME\n );\n if (plugin.length > 1) {\n logger.warn('multiple ui themes are not supported; only the first plugin is used');\n }\n\n return _.head(plugin);\n }\n}\n\nexport default async (config, auth, storage, logger) => {\n let pluginOptions = await loadTheme(config);\n if (!pluginOptions) {\n pluginOptions = require(DEFAULT_PLUGIN_UI_THEME)(config.web);\n logger.info(\n { name: DEFAULT_PLUGIN_UI_THEME, pluginCategory: PLUGIN_CATEGORY.THEME },\n 'plugin @{name} successfully loaded (@{pluginCategory})'\n );\n }\n\n // eslint-disable-next-line new-cap\n const router = express.Router();\n // load application\n router.use(\n webMiddleware(\n config,\n {\n tokenMiddleware: auth.webUIJWTmiddleware(),\n webEndpointsApi: webEndpointsApi(auth, storage, config),\n },\n pluginOptions\n )\n );\n return router;\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,QAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AAEA,IAAAM,IAAA,GAAAP,sBAAA,CAAAC,OAAA;AAAoC,SAAAD,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE7B,MAAMG,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG,iBAAiB;AAC1C,MAAME,uBAAuB,GAAAD,OAAA,CAAAC,uBAAA,GAAG,qBAAqB;AAErD,eAAeC,SAASA,CAACC,MAAW,EAAE;EAC3C,IAAIC,eAAC,CAACC,KAAK,CAACF,MAAM,CAACG,KAAK,CAAC,KAAK,KAAK,EAAE;IACnC,MAAMC,MAAM,GAAG,MAAM,IAAAC,wBAAe,EAClCL,MAAM,CAACG,KAAK,EACZ;MAAEH,MAAM;MAAEM,MAAM,EAANA;IAAO,CAAC;IAClB;IACA,UAAUF,MAAW,EAAE;MACrB;AACR;AACA;AACA;AACA;AACA;MACQ,OAAOA,MAAM,CAACG,UAAU,IAAIH,MAAM,CAACI,QAAQ,IAAIJ,MAAM,CAACK,aAAa;IACrE,CAAC,EACDT,MAAM,EAAEU,cAAc,EAAEC,YAAY,IAAIf,gBAAgB,EACxDgB,qBAAe,CAACC,KAClB,CAAC;IACD,IAAIT,MAAM,CAACU,MAAM,GAAG,CAAC,EAAE;MACrBR,cAAM,CAACS,IAAI,CAAC,qEAAqE,CAAC;IACpF;IAEA,OAAOd,eAAC,CAACe,IAAI,CAACZ,MAAM,CAAC;EACvB;AACF;AAAC,IAAAa,QAAA,GAEc,MAAAA,CAAOjB,MAAM,EAAEkB,IAAI,EAAEC,OAAO,EAAEb,MAAM,KAAK;EACtD,IAAIc,aAAa,GAAG,MAAMrB,SAAS,CAACC,MAAM,CAAC;EAC3C,IAAI,CAACoB,aAAa,EAAE;IAClBA,aAAa,GAAGlC,OAAO,CAACY,uBAAuB,CAAC,CAACE,MAAM,CAACqB,GAAG,CAAC;IAC5Df,MAAM,CAACgB,IAAI,CACT;MAAEC,IAAI,EAAEzB,uBAAuB;MAAE0B,cAAc,EAAEZ,qBAAe,CAACC;IAAM,CAAC,EACxE,wDACF,CAAC;EACH;;EAEA;EACA,MAAMY,MAAM,GAAGC,gBAAO,CAACC,MAAM,CAAC,CAAC;EAC/B;EACAF,MAAM,CAACG,GAAG,CACR,IAAAC,yBAAa,EACX7B,MAAM,EACN;IACE8B,eAAe,EAAEZ,IAAI,CAACa,kBAAkB,CAAC,CAAC;IAC1CC,eAAe,EAAE,IAAAA,YAAe,EAACd,IAAI,EAAEC,OAAO,EAAEnB,MAAM;EACxD,CAAC,EACDoB,aACF,CACF,CAAC;EACD,OAAOK,MAAM;AACf,CAAC;AAAA5B,OAAA,CAAAF,OAAA,GAAAsB,QAAA","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/web",
3
- "version": "8.1.0-next-8.7",
3
+ "version": "8.1.0-next-8.9",
4
4
  "description": "web ui middleware",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -24,30 +24,29 @@
24
24
  },
25
25
  "license": "MIT",
26
26
  "dependencies": {
27
- "@verdaccio/auth": "8.0.0-next-8.7",
28
- "@verdaccio/config": "8.0.0-next-8.7",
29
- "@verdaccio/core": "8.0.0-next-8.7",
27
+ "@verdaccio/auth": "8.0.0-next-8.9",
28
+ "@verdaccio/config": "8.0.0-next-8.9",
29
+ "@verdaccio/core": "8.0.0-next-8.9",
30
30
  "@verdaccio/loaders": "8.0.0-next-8.4",
31
- "@verdaccio/logger": "8.0.0-next-8.7",
32
- "@verdaccio/middleware": "8.0.0-next-8.7",
33
- "@verdaccio/store": "8.0.0-next-8.7",
34
- "@verdaccio/tarball": "13.0.0-next-8.7",
35
- "@verdaccio/url": "13.0.0-next-8.7",
36
- "@verdaccio/utils": "8.1.0-next-8.7",
31
+ "@verdaccio/logger": "8.0.0-next-8.9",
32
+ "@verdaccio/middleware": "8.0.0-next-8.9",
33
+ "@verdaccio/store": "8.0.0-next-8.9",
34
+ "@verdaccio/tarball": "13.0.0-next-8.9",
35
+ "@verdaccio/url": "13.0.0-next-8.9",
36
+ "@verdaccio/utils": "8.1.0-next-8.9",
37
37
  "debug": "4.4.0",
38
38
  "express": "4.21.2",
39
39
  "lodash": "4.17.21"
40
40
  },
41
41
  "devDependencies": {
42
- "@verdaccio/api": "8.1.0-next-8.7",
42
+ "@verdaccio/api": "8.1.0-next-8.9",
43
43
  "@verdaccio/test-helper": "4.0.0-next-8.3",
44
- "@verdaccio/types": "13.0.0-next-8.2",
45
- "jsdom": "20.0.3",
46
- "nock": "13.5.1",
44
+ "@verdaccio/types": "13.0.0-next-8.3",
45
+ "jsdom": "25.0.1",
47
46
  "node-html-parser": "4.1.5",
48
47
  "supertest": "7.0.0",
49
- "verdaccio-auth-memory": "13.0.0-next-8.7",
50
- "verdaccio-memory": "13.0.0-next-8.7"
48
+ "verdaccio-auth-memory": "13.0.0-next-8.9",
49
+ "verdaccio-memory": "13.0.0-next-8.9"
51
50
  },
52
51
  "funding": {
53
52
  "type": "opencollective",
package/src/api/readme.ts CHANGED
@@ -2,13 +2,14 @@ import buildDebug from 'debug';
2
2
  import { Router } from 'express';
3
3
 
4
4
  import { Auth } from '@verdaccio/auth';
5
- import { HEADERS, HEADER_TYPE } from '@verdaccio/core';
5
+ import { DIST_TAGS, HEADERS, HEADER_TYPE } from '@verdaccio/core';
6
6
  import { logger } from '@verdaccio/logger';
7
7
  import { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';
8
8
  // Was required by other packages
9
9
  import { WebUrls } from '@verdaccio/middleware';
10
10
  import { Storage } from '@verdaccio/store';
11
11
  import { Manifest } from '@verdaccio/types';
12
+ import { isVersionValid } from '@verdaccio/utils';
12
13
 
13
14
  import { AuthorAvatar, addScope } from '../web-utils';
14
15
 
@@ -18,6 +19,7 @@ export { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by
18
19
  export type PackageExt = Manifest & { author: AuthorAvatar; dist?: { tarball: string } };
19
20
  export const NOT_README_FOUND = 'ERROR: No README data found!';
20
21
  const debug = buildDebug('verdaccio:web:api:readme');
22
+
21
23
  const getReadme = (readme) => {
22
24
  if (typeof readme === 'string' && readme.length === 0) {
23
25
  return NOT_README_FOUND;
@@ -29,6 +31,25 @@ const getReadme = (readme) => {
29
31
  }
30
32
  };
31
33
 
34
+ const getReadmeFromManifest = (manifest: Manifest, v?: any): string | undefined => {
35
+ let id;
36
+ let readme;
37
+ if (typeof v === 'string' && isVersionValid(manifest, v)) {
38
+ id = 'version';
39
+ readme = manifest.versions[v].readme;
40
+ }
41
+ if (!readme && isVersionValid(manifest, manifest[DIST_TAGS]?.latest)) {
42
+ id = 'latest';
43
+ readme = manifest.versions[manifest[DIST_TAGS].latest].readme;
44
+ }
45
+ if (!readme && manifest.readme) {
46
+ id = 'root';
47
+ readme = manifest.readme;
48
+ }
49
+ debug('readme: %o %o', v, id);
50
+ return readme;
51
+ };
52
+
32
53
  function addReadmeWebApi(storage: Storage, auth: Auth): Router {
33
54
  debug('initialized readme web api');
34
55
  const can = allow(auth, {
@@ -66,7 +87,9 @@ function addReadmeWebApi(storage: Storage, auth: Auth): Router {
66
87
  })) as Manifest;
67
88
  debug('readme pkg %o', manifest?.name);
68
89
  res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);
69
- next(getReadme(manifest.readme));
90
+ const { v } = req.query;
91
+ const readme = getReadmeFromManifest(manifest, v);
92
+ next(getReadme(readme));
70
93
  } catch (err) {
71
94
  next(err);
72
95
  }
package/src/index.ts CHANGED
@@ -1 +1,2 @@
1
- export { default } from './middleware';
1
+ export { default, PLUGIN_UI_PREFIX, DEFAULT_PLUGIN_UI_THEME } from './middleware';
2
+ export * from './web-utils';
package/src/middleware.ts CHANGED
@@ -8,6 +8,9 @@ import { webMiddleware } from '@verdaccio/middleware';
8
8
 
9
9
  import webEndpointsApi from './api';
10
10
 
11
+ export const PLUGIN_UI_PREFIX = 'verdaccio-theme';
12
+ export const DEFAULT_PLUGIN_UI_THEME = '@verdaccio/ui-theme';
13
+
11
14
  export async function loadTheme(config: any) {
12
15
  if (_.isNil(config.theme) === false) {
13
16
  const plugin = await asyncLoadPlugin(
@@ -16,14 +19,14 @@ export async function loadTheme(config: any) {
16
19
  // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown }
17
20
  function (plugin: any) {
18
21
  /**
19
- *
22
+ *
20
23
  - `staticPath`: is the same data returned in Verdaccio 5.
21
24
  - `manifest`: A webpack manifest object.
22
25
  - `manifestFiles`: A object with one property `js` and the array (order matters) of the manifest id to be loaded in the template dynamically.
23
26
  */
24
27
  return plugin.staticPath && plugin.manifest && plugin.manifestFiles;
25
28
  },
26
- config?.serverSettings?.pluginPrefix ?? 'verdaccio-theme',
29
+ config?.serverSettings?.pluginPrefix ?? PLUGIN_UI_PREFIX,
27
30
  PLUGIN_CATEGORY.THEME
28
31
  );
29
32
  if (plugin.length > 1) {
@@ -37,9 +40,9 @@ export async function loadTheme(config: any) {
37
40
  export default async (config, auth, storage, logger) => {
38
41
  let pluginOptions = await loadTheme(config);
39
42
  if (!pluginOptions) {
40
- pluginOptions = require('@verdaccio/ui-theme')(config.web);
43
+ pluginOptions = require(DEFAULT_PLUGIN_UI_THEME)(config.web);
41
44
  logger.info(
42
- { name: '@verdaccio/ui-theme', pluginCategory: PLUGIN_CATEGORY.THEME },
45
+ { name: DEFAULT_PLUGIN_UI_THEME, pluginCategory: PLUGIN_CATEGORY.THEME },
43
46
  'plugin @{name} successfully loaded (@{pluginCategory})'
44
47
  );
45
48
  }
@@ -73,4 +73,33 @@ describe('readme api', () => {
73
73
  .expect(HTTP_STATUS.OK);
74
74
  expect(response.text).toMatch(NOT_README_FOUND);
75
75
  });
76
+
77
+ test('should fetch readme with keeping all readmes (latest)', async () => {
78
+ const app = await initializeServer('keep-all-readmes.yaml');
79
+ await publishVersion(app, 'pk1-test', '1.0.0', { readme: 'my readme' });
80
+ const response = await supertest(app)
81
+ .get('/-/verdaccio/data/package/readme/pk1-test')
82
+ .set('Accept', HEADERS.TEXT_PLAIN)
83
+ .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8)
84
+ .expect(HTTP_STATUS.OK);
85
+ expect(response.text).toMatch('my readme');
86
+ });
87
+
88
+ test('should fetch readme with keeping all readmes (version)', async () => {
89
+ const app = await initializeServer('keep-all-readmes.yaml');
90
+ await publishVersion(app, 'pk1-test', '1.0.0', { readme: 'my readme' });
91
+ await publishVersion(app, 'pk1-test', '1.2.0', { readme: 'my new readme' });
92
+ const response = await supertest(app)
93
+ .get('/-/verdaccio/data/package/readme/pk1-test')
94
+ .set('Accept', HEADERS.TEXT_PLAIN)
95
+ .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8)
96
+ .expect(HTTP_STATUS.OK);
97
+ expect(response.text).toMatch('my new readme');
98
+ const response2 = await supertest(app)
99
+ .get('/-/verdaccio/data/package/readme/pk1-test?v=1.0.0')
100
+ .set('Accept', HEADERS.TEXT_PLAIN)
101
+ .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8)
102
+ .expect(HTTP_STATUS.OK);
103
+ expect(response2.text).toMatch('my readme');
104
+ });
76
105
  });
@@ -0,0 +1,29 @@
1
+ auth:
2
+ auth-memory:
3
+ users:
4
+ test:
5
+ name: test
6
+ password: test
7
+
8
+ web:
9
+ title: verdaccio
10
+
11
+ publish:
12
+ allow_offline: false
13
+ keep_readmes: all
14
+
15
+ uplinks:
16
+
17
+ log: { type: stdout, format: pretty, level: trace }
18
+
19
+ packages:
20
+ '@*/*':
21
+ access: $anonymous
22
+ publish: $anonymous
23
+ '**':
24
+ access: $anonymous
25
+ publish: $anonymous
26
+ _debug: true
27
+
28
+ flags:
29
+ changePassword: true