@verdaccio/web 6.0.0-6-next.36 → 6.0.0-6-next.38

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,51 @@
1
1
  # @verdaccio/web
2
2
 
3
+ ## 6.0.0-6-next.38
4
+
5
+ ### Minor Changes
6
+
7
+ - a23628be: feat: parse and sanitize on ui
8
+ - 4b29d715: chore: move improvements from v5 to v6
9
+
10
+ Migrate improvements form v5 to v6:
11
+
12
+ - https://github.com/verdaccio/verdaccio/pull/3158
13
+ - https://github.com/verdaccio/verdaccio/pull/3151
14
+ - https://github.com/verdaccio/verdaccio/pull/2271
15
+ - https://github.com/verdaccio/verdaccio/pull/2787
16
+ - https://github.com/verdaccio/verdaccio/pull/2791
17
+ - https://github.com/verdaccio/verdaccio/pull/2205
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies [4b29d715]
22
+ - @verdaccio/auth@6.0.0-6-next.30
23
+ - @verdaccio/config@6.0.0-6-next.51
24
+ - @verdaccio/core@6.0.0-6-next.51
25
+ - @verdaccio/url@11.0.0-6-next.17
26
+ - @verdaccio/middleware@6.0.0-6-next.30
27
+ - @verdaccio/loaders@6.0.0-6-next.20
28
+ - @verdaccio/store@6.0.0-6-next.31
29
+ - @verdaccio/tarball@11.0.0-6-next.20
30
+ - @verdaccio/logger@6.0.0-6-next.19
31
+ - @verdaccio/utils@6.0.0-6-next.19
32
+
33
+ ## 6.0.0-6-next.37
34
+
35
+ ### Patch Changes
36
+
37
+ - b4cc8001: fix: improve abort request search
38
+ - @verdaccio/core@6.0.0-6-next.50
39
+ - @verdaccio/config@6.0.0-6-next.50
40
+ - @verdaccio/auth@6.0.0-6-next.29
41
+ - @verdaccio/tarball@11.0.0-6-next.19
42
+ - @verdaccio/url@11.0.0-6-next.16
43
+ - @verdaccio/loaders@6.0.0-6-next.19
44
+ - @verdaccio/logger@6.0.0-6-next.18
45
+ - @verdaccio/middleware@6.0.0-6-next.29
46
+ - @verdaccio/store@6.0.0-6-next.30
47
+ - @verdaccio/utils@6.0.0-6-next.18
48
+
3
49
  ## 6.0.0-6-next.36
4
50
 
5
51
  ### Patch Changes
@@ -133,7 +133,7 @@ function addPackageWebApi(storage, auth, config) {
133
133
  try {
134
134
  var _config$web2;
135
135
 
136
- const localPackages = await storage.getLocalDatabaseNext();
136
+ const localPackages = await storage.getLocalDatabase();
137
137
  const order = getOrder(config === null || config === void 0 ? void 0 : (_config$web2 = config.web) === null || _config$web2 === void 0 ? void 0 : _config$web2.sort_packages);
138
138
  debug('order %o', order);
139
139
  const pkgs = await processPackages(localPackages, req);
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","names":["getOrder","order","debug","buildDebug","addPackageWebApi","storage","auth","config","isLoginEnabled","web","login","pkgRouter","Router","anonymousRemoteUser","name","undefined","real_groups","groups","checkAllow","remoteUser","Promise","resolve","reject","allow_access","packageName","err","allowed","processPackages","packages","req","permissions","packagesToProcess","slice","pkg","pkgCopy","author","formatAuthor","remote_user","avatar","generateGravatarUrl","email","gravatar","_","isNil","dist","isNull","tarball","getLocalRegistryTarballUri","protocol","headers","host","hostname","url_prefix","push","logger","error","get","res","next","localPackages","getLocalDatabaseNext","sort_packages","pkgs","sortByName"],"sources":["../../src/api/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\n\nimport { Auth } from '@verdaccio/auth';\nimport { logger } from '@verdaccio/logger';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { getLocalRegistryTarballUri } from '@verdaccio/tarball';\nimport { Config, RemoteUser, Version } from '@verdaccio/types';\nimport { formatAuthor, generateGravatarUrl } from '@verdaccio/utils';\n\nimport { sortByName } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nconst getOrder = (order = 'asc') => {\n return order === 'asc';\n};\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(storage: Storage, auth: Auth, config: Config): Router {\n const isLoginEnabled = config?.web?.login === true ?? true;\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const anonymousRemoteUser: RemoteUser = {\n name: undefined,\n real_groups: [],\n groups: [],\n };\n\n debug('initialized package web api');\n const checkAllow = (name: string, remoteUser: RemoteUser): Promise<boolean> =>\n new Promise((resolve, reject): void => {\n debug('is login disabled %o', isLoginEnabled);\n // FIXME: this logic does not work, review\n // const remoteUserAccess = !isLoginEnabled ? anonymousRemoteUser : remoteUser;\n try {\n auth.allow_access({ packageName: name }, remoteUser, (err, allowed): void => {\n if (err) {\n resolve(false);\n }\n return resolve(allowed as boolean);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n async function processPackages(packages: Version[] = [], req): Promise<Version[]> {\n const permissions: Version[] = [];\n const packagesToProcess = packages.slice();\n debug('process packages %o', packagesToProcess);\n for (const pkg of packagesToProcess) {\n const pkgCopy = { ...pkg };\n pkgCopy.author = formatAuthor(pkg.author);\n try {\n if (await checkAllow(pkg.name, req.remote_user)) {\n if (config.web) {\n // @ts-ignore\n pkgCopy.author.avatar = generateGravatarUrl(pkgCopy.author.email, config.web.gravatar);\n }\n // convert any remote dist to a local reference\n // eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz\n if (!_.isNil(pkgCopy.dist) && !_.isNull(pkgCopy.dist.tarball)) {\n pkgCopy.dist.tarball = getLocalRegistryTarballUri(\n pkgCopy.dist.tarball,\n pkg.name,\n { protocol: req.protocol, headers: req.headers as any, host: req.hostname },\n config?.url_prefix\n );\n }\n permissions.push(pkgCopy);\n }\n } catch (err: any) {\n debug('process packages error %o', err);\n logger.error(\n { name: pkg.name, error: err },\n 'permission process for @{name} has failed: @{error}'\n );\n throw err;\n }\n }\n\n return permissions;\n }\n\n // Get list of all visible package\n pkgRouter.get(\n '/packages',\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('hit package web api %o');\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabaseNext();\n\n const order = getOrder(config?.web?.sort_packages);\n debug('order %o', order);\n const pkgs = await processPackages(localPackages, req);\n next(sortByName(pkgs, order));\n } catch (error: any) {\n next(error);\n }\n }\n );\n\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"mappings":"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"}
1
+ {"version":3,"file":"package.js","names":["getOrder","order","debug","buildDebug","addPackageWebApi","storage","auth","config","isLoginEnabled","web","login","pkgRouter","Router","anonymousRemoteUser","name","undefined","real_groups","groups","checkAllow","remoteUser","Promise","resolve","reject","allow_access","packageName","err","allowed","processPackages","packages","req","permissions","packagesToProcess","slice","pkg","pkgCopy","author","formatAuthor","remote_user","avatar","generateGravatarUrl","email","gravatar","_","isNil","dist","isNull","tarball","getLocalRegistryTarballUri","protocol","headers","host","hostname","url_prefix","push","logger","error","get","res","next","localPackages","getLocalDatabase","sort_packages","pkgs","sortByName"],"sources":["../../src/api/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\n\nimport { Auth } from '@verdaccio/auth';\nimport { logger } from '@verdaccio/logger';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { getLocalRegistryTarballUri } from '@verdaccio/tarball';\nimport { Config, RemoteUser, Version } from '@verdaccio/types';\nimport { formatAuthor, generateGravatarUrl } from '@verdaccio/utils';\n\nimport { sortByName } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nconst getOrder = (order = 'asc') => {\n return order === 'asc';\n};\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(storage: Storage, auth: Auth, config: Config): Router {\n const isLoginEnabled = config?.web?.login === true ?? true;\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const anonymousRemoteUser: RemoteUser = {\n name: undefined,\n real_groups: [],\n groups: [],\n };\n\n debug('initialized package web api');\n const checkAllow = (name: string, remoteUser: RemoteUser): Promise<boolean> =>\n new Promise((resolve, reject): void => {\n debug('is login disabled %o', isLoginEnabled);\n // FIXME: this logic does not work, review\n // const remoteUserAccess = !isLoginEnabled ? anonymousRemoteUser : remoteUser;\n try {\n auth.allow_access({ packageName: name }, remoteUser, (err, allowed): void => {\n if (err) {\n resolve(false);\n }\n return resolve(allowed as boolean);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n async function processPackages(packages: Version[] = [], req): Promise<Version[]> {\n const permissions: Version[] = [];\n const packagesToProcess = packages.slice();\n debug('process packages %o', packagesToProcess);\n for (const pkg of packagesToProcess) {\n const pkgCopy = { ...pkg };\n pkgCopy.author = formatAuthor(pkg.author);\n try {\n if (await checkAllow(pkg.name, req.remote_user)) {\n if (config.web) {\n // @ts-ignore\n pkgCopy.author.avatar = generateGravatarUrl(pkgCopy.author.email, config.web.gravatar);\n }\n // convert any remote dist to a local reference\n // eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz\n if (!_.isNil(pkgCopy.dist) && !_.isNull(pkgCopy.dist.tarball)) {\n pkgCopy.dist.tarball = getLocalRegistryTarballUri(\n pkgCopy.dist.tarball,\n pkg.name,\n { protocol: req.protocol, headers: req.headers as any, host: req.hostname },\n config?.url_prefix\n );\n }\n permissions.push(pkgCopy);\n }\n } catch (err: any) {\n debug('process packages error %o', err);\n logger.error(\n { name: pkg.name, error: err },\n 'permission process for @{name} has failed: @{error}'\n );\n throw err;\n }\n }\n\n return permissions;\n }\n\n // Get list of all visible package\n pkgRouter.get(\n '/packages',\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('hit package web api %o');\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n\n const order = getOrder(config?.web?.sort_packages);\n debug('order %o', order);\n const pkgs = await processPackages(localPackages, req);\n next(sortByName(pkgs, order));\n } catch (error: any) {\n next(error);\n }\n }\n );\n\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"mappings":"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"}
@@ -31,15 +31,25 @@ var _core = require("@verdaccio/core");
31
31
 
32
32
  var _middleware = require("@verdaccio/middleware");
33
33
 
34
- var _readme = _interopRequireDefault(require("@verdaccio/readme"));
35
-
36
34
  var _webUtils = require("../utils/web-utils");
37
35
 
38
36
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
37
 
40
- const debug = (0, _debug.default)('verdaccio:web:api:readme');
41
38
  const NOT_README_FOUND = 'ERROR: No README data found!';
42
39
  exports.NOT_README_FOUND = NOT_README_FOUND;
40
+ const debug = (0, _debug.default)('verdaccio:web:api:readme');
41
+
42
+ const getReadme = readme => {
43
+ if (typeof readme === 'string' && readme.length === 0) {
44
+ return NOT_README_FOUND;
45
+ }
46
+
47
+ if (typeof readme !== 'string') {
48
+ return NOT_README_FOUND;
49
+ } else {
50
+ return readme;
51
+ }
52
+ };
43
53
 
44
54
  function addReadmeWebApi(storage, auth) {
45
55
  debug('initialized readme web api');
@@ -68,12 +78,7 @@ function addReadmeWebApi(storage, auth) {
68
78
  });
69
79
  debug('readme pkg %o', manifest === null || manifest === void 0 ? void 0 : manifest.name);
70
80
  res.set(_core.HEADER_TYPE.CONTENT_TYPE, _core.HEADERS.TEXT_PLAIN_UTF8);
71
-
72
- try {
73
- next((0, _webUtils.parseReadme)(manifest.name, manifest.readme));
74
- } catch {
75
- next((0, _readme.default)(NOT_README_FOUND));
76
- }
81
+ next(getReadme(manifest.readme));
77
82
  } catch (err) {
78
83
  next(err);
79
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"readme.js","names":["debug","buildDebug","NOT_README_FOUND","addReadmeWebApi","storage","auth","can","allow","pkgRouter","Router","get","req","res","next","name","params","scope","addScope","package","requestOptions","protocol","headers","host","remoteAddress","socket","manifest","getPackageByOptions","uplinksLook","abbreviated","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","parseReadme","readme","sanitizyReadme","err"],"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 { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';\nimport sanitizyReadme from '@verdaccio/readme';\nimport { Storage } from '@verdaccio/store';\nimport { Manifest } from '@verdaccio/types';\n\nimport { AuthorAvatar, addScope, parseReadme } from '../utils/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 } };\n\nconst debug = buildDebug('verdaccio:web:api:readme');\n\nexport const NOT_README_FOUND = 'ERROR: No README data found!';\n\nfunction addReadmeWebApi(storage: Storage, auth: Auth): Router {\n debug('initialized readme web api');\n const can = allow(auth);\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n\n pkgRouter.get(\n '/package/readme/(@:scope/)?: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 name = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : 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 try {\n next(parseReadme(manifest.name, manifest.readme as string));\n } catch {\n next(sanitizyReadme(NOT_README_FOUND));\n }\n } catch (err) {\n next(err);\n }\n }\n );\n return pkgRouter;\n}\n\nexport default addReadmeWebApi;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAGA;;AACA;;AACA;;AAIA;;;;AAOA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,0BAAX,CAAd;AAEO,MAAMC,gBAAgB,GAAG,8BAAzB;;;AAEP,SAASC,eAAT,CAAyBC,OAAzB,EAA2CC,IAA3C,EAA+D;EAC7DL,KAAK,CAAC,4BAAD,CAAL;EACA,MAAMM,GAAG,GAAG,IAAAC,iBAAA,EAAMF,IAAN,CAAZ;EACA,MAAMG,SAAS,GAAG,IAAAC,eAAA,GAAlB;EAA4B;;EAE5BD,SAAS,CAACE,GAAV,CACE,+CADF,EAEEJ,GAAG,CAAC,QAAD,CAFL,EAGE,gBACEK,GADF,EAEEC,GAFF,EAGEC,IAHF,EAIiB;IACfb,KAAK,CAAC,YAAD,CAAL;IACA,MAAMc,IAAI,GAAGH,GAAG,CAACI,MAAJ,CAAWC,KAAX,GACT,IAAAC,kBAAA,EAASN,GAAG,CAACI,MAAJ,CAAWC,KAApB,EAA2BL,GAAG,CAACI,MAAJ,CAAWG,OAAtC,CADS,GAETP,GAAG,CAACI,MAAJ,CAAWG,OAFf;IAGAlB,KAAK,CAAC,gBAAD,EAAmBc,IAAnB,CAAL;IACA,MAAMK,cAAc,GAAG;MACrBC,QAAQ,EAAET,GAAG,CAACS,QADO;MAErBC,OAAO,EAAEV,GAAG,CAACU,OAFQ;MAGrB;MACAC,IAAI,EAAEX,GAAG,CAACW,IAJW;MAKrBC,aAAa,EAAEZ,GAAG,CAACa,MAAJ,CAAWD;IALL,CAAvB;;IAOA,IAAI;MACF,MAAME,QAAQ,GAAI,MAAMrB,OAAO,CAACsB,mBAAR,CAA4B;QAClDZ,IADkD;QAElDa,WAAW,EAAE,IAFqC;QAGlDC,WAAW,EAAE,KAHqC;QAIlDT;MAJkD,CAA5B,CAAxB;MAMAnB,KAAK,CAAC,eAAD,EAAkByB,QAAlB,aAAkBA,QAAlB,uBAAkBA,QAAQ,CAAEX,IAA5B,CAAL;MACAF,GAAG,CAACiB,GAAJ,CAAQC,iBAAA,CAAYC,YAApB,EAAkCC,aAAA,CAAQC,eAA1C;;MACA,IAAI;QACFpB,IAAI,CAAC,IAAAqB,qBAAA,EAAYT,QAAQ,CAACX,IAArB,EAA2BW,QAAQ,CAACU,MAApC,CAAD,CAAJ;MACD,CAFD,CAEE,MAAM;QACNtB,IAAI,CAAC,IAAAuB,eAAA,EAAelC,gBAAf,CAAD,CAAJ;MACD;IACF,CAdD,CAcE,OAAOmC,GAAP,EAAY;MACZxB,IAAI,CAACwB,GAAD,CAAJ;IACD;EACF,CArCH;EAuCA,OAAO7B,SAAP;AACD;;eAEcL,e"}
1
+ {"version":3,"file":"readme.js","names":["NOT_README_FOUND","debug","buildDebug","getReadme","readme","length","addReadmeWebApi","storage","auth","can","allow","pkgRouter","Router","get","req","res","next","name","params","scope","addScope","package","requestOptions","protocol","headers","host","remoteAddress","socket","manifest","getPackageByOptions","uplinksLook","abbreviated","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","err"],"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 { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { Manifest } from '@verdaccio/types';\n\nimport { AuthorAvatar, addScope } from '../utils/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 const pkgRouter = Router(); /* eslint new-cap: 0 */\n\n pkgRouter.get(\n '/package/readme/(@:scope/)?: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 name = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : 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;;AACA;;AAGA;;AACA;;AAIA;;;;AAMO,MAAMA,gBAAgB,GAAG,8BAAzB;;AACP,MAAMC,KAAK,GAAG,IAAAC,cAAA,EAAW,0BAAX,CAAd;;AACA,MAAMC,SAAS,GAAIC,MAAD,IAAY;EAC5B,IAAI,OAAOA,MAAP,KAAkB,QAAlB,IAA8BA,MAAM,CAACC,MAAP,KAAkB,CAApD,EAAuD;IACrD,OAAOL,gBAAP;EACD;;EACD,IAAI,OAAOI,MAAP,KAAkB,QAAtB,EAAgC;IAC9B,OAAOJ,gBAAP;EACD,CAFD,MAEO;IACL,OAAOI,MAAP;EACD;AACF,CATD;;AAWA,SAASE,eAAT,CAAyBC,OAAzB,EAA2CC,IAA3C,EAA+D;EAC7DP,KAAK,CAAC,4BAAD,CAAL;EACA,MAAMQ,GAAG,GAAG,IAAAC,iBAAA,EAAMF,IAAN,CAAZ;EACA,MAAMG,SAAS,GAAG,IAAAC,eAAA,GAAlB;EAA4B;;EAE5BD,SAAS,CAACE,GAAV,CACE,+CADF,EAEEJ,GAAG,CAAC,QAAD,CAFL,EAGE,gBACEK,GADF,EAEEC,GAFF,EAGEC,IAHF,EAIiB;IACff,KAAK,CAAC,YAAD,CAAL;IACA,MAAMgB,IAAI,GAAGH,GAAG,CAACI,MAAJ,CAAWC,KAAX,GACT,IAAAC,kBAAA,EAASN,GAAG,CAACI,MAAJ,CAAWC,KAApB,EAA2BL,GAAG,CAACI,MAAJ,CAAWG,OAAtC,CADS,GAETP,GAAG,CAACI,MAAJ,CAAWG,OAFf;IAGApB,KAAK,CAAC,gBAAD,EAAmBgB,IAAnB,CAAL;IACA,MAAMK,cAAc,GAAG;MACrBC,QAAQ,EAAET,GAAG,CAACS,QADO;MAErBC,OAAO,EAAEV,GAAG,CAACU,OAFQ;MAGrB;MACAC,IAAI,EAAEX,GAAG,CAACW,IAJW;MAKrBC,aAAa,EAAEZ,GAAG,CAACa,MAAJ,CAAWD;IALL,CAAvB;;IAOA,IAAI;MACF,MAAME,QAAQ,GAAI,MAAMrB,OAAO,CAACsB,mBAAR,CAA4B;QAClDZ,IADkD;QAElDa,WAAW,EAAE,IAFqC;QAGlDC,WAAW,EAAE,KAHqC;QAIlDT;MAJkD,CAA5B,CAAxB;MAMArB,KAAK,CAAC,eAAD,EAAkB2B,QAAlB,aAAkBA,QAAlB,uBAAkBA,QAAQ,CAAEX,IAA5B,CAAL;MACAF,GAAG,CAACiB,GAAJ,CAAQC,iBAAA,CAAYC,YAApB,EAAkCC,aAAA,CAAQC,eAA1C;MACApB,IAAI,CAACb,SAAS,CAACyB,QAAQ,CAACxB,MAAV,CAAV,CAAJ;IACD,CAVD,CAUE,OAAOiC,GAAP,EAAY;MACZrB,IAAI,CAACqB,GAAD,CAAJ;IACD;EACF,CAjCH;EAmCA,OAAO1B,SAAP;AACD;;eAEcL,e"}
@@ -50,7 +50,7 @@ function addSearchWebApi(storage, auth) {
50
50
  try {
51
51
  let data;
52
52
  const abort = new AbortController();
53
- req.on('aborted', () => {
53
+ req.socket.on('close', function () {
54
54
  debug('search web aborted');
55
55
  abort.abort();
56
56
  });
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","names":["debug","buildDebug","checkAccess","pkg","auth","remoteUser","Promise","resolve","reject","allow_access","packageName","package","name","err","allowed","status","String","match","addSearchWebApi","storage","router","Router","get","req","res","next","data","abort","AbortController","on","text","params","anything","size","from","query","maintenance","popularity","quality","urlParams","URLSearchParams","search","url","toString","checkAccessPromises","all","map","pkgItem","remote_user","final","filter","i","_","isNull","slice","errorUtils","getInternalError","message"],"sources":["../../src/api/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\nimport { URLSearchParams } from 'url';\n\nimport { Auth } from '@verdaccio/auth';\nimport { errorUtils, searchUtils } from '@verdaccio/core';\nimport { SearchQuery } from '@verdaccio/core/src/search-utils';\nimport { Storage } from '@verdaccio/store';\nimport { Manifest } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction checkAccess(pkg: any, auth: any, remoteUser): Promise<Manifest | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n}\n\nfunction addSearchWebApi(storage: Storage, auth: Auth): Router {\n const router = Router(); /* eslint new-cap: 0 */\n router.get(\n '/search/:anything',\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n try {\n let data;\n const abort = new AbortController();\n req.on('aborted', () => {\n debug('search web aborted');\n abort.abort();\n });\n const text: string = (req.params.anything as string) ?? '';\n // These values are declared as optimal by npm cli\n // FUTURE: could be overwritten by ui settings.\n const size = 20;\n const from = 0;\n const query: SearchQuery = {\n from: 0,\n maintenance: 0.5,\n popularity: 0.98,\n quality: 0.65,\n size: 20,\n text,\n };\n // @ts-ignore\n const urlParams = new URLSearchParams(query);\n debug('search web init');\n data = await storage?.search({\n query,\n url: `/-/v1/search?${urlParams.toString()}`,\n abort,\n });\n const checkAccessPromises: searchUtils.SearchItemPkg[] = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final: searchUtils.SearchItemPkg[] = checkAccessPromises\n .filter((i) => !_.isNull(i))\n .slice(from, size);\n\n next(final);\n } catch (err: any) {\n next(errorUtils.getInternalError(err.message));\n }\n }\n );\n return router;\n}\n\nexport default addSearchWebApi;\n"],"mappings":"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"}
1
+ {"version":3,"file":"search.js","names":["debug","buildDebug","checkAccess","pkg","auth","remoteUser","Promise","resolve","reject","allow_access","packageName","package","name","err","allowed","status","String","match","addSearchWebApi","storage","router","Router","get","req","res","next","data","abort","AbortController","socket","on","text","params","anything","size","from","query","maintenance","popularity","quality","urlParams","URLSearchParams","search","url","toString","checkAccessPromises","all","map","pkgItem","remote_user","final","filter","i","_","isNull","slice","errorUtils","getInternalError","message"],"sources":["../../src/api/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\nimport { URLSearchParams } from 'url';\n\nimport { Auth } from '@verdaccio/auth';\nimport { errorUtils, searchUtils } from '@verdaccio/core';\nimport { SearchQuery } from '@verdaccio/core/src/search-utils';\nimport { Storage } from '@verdaccio/store';\nimport { Manifest } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction checkAccess(pkg: any, auth: any, remoteUser): Promise<Manifest | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n}\n\nfunction addSearchWebApi(storage: Storage, auth: Auth): Router {\n const router = Router(); /* eslint new-cap: 0 */\n router.get(\n '/search/:anything',\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n try {\n let data;\n const abort = new AbortController();\n req.socket.on('close', function () {\n debug('search web aborted');\n abort.abort();\n });\n const text: string = (req.params.anything as string) ?? '';\n // These values are declared as optimal by npm cli\n // FUTURE: could be overwritten by ui settings.\n const size = 20;\n const from = 0;\n const query: SearchQuery = {\n from: 0,\n maintenance: 0.5,\n popularity: 0.98,\n quality: 0.65,\n size: 20,\n text,\n };\n // @ts-ignore\n const urlParams = new URLSearchParams(query);\n debug('search web init');\n data = await storage?.search({\n query,\n url: `/-/v1/search?${urlParams.toString()}`,\n abort,\n });\n const checkAccessPromises: searchUtils.SearchItemPkg[] = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final: searchUtils.SearchItemPkg[] = checkAccessPromises\n .filter((i) => !_.isNull(i))\n .slice(from, size);\n\n next(final);\n } catch (err: any) {\n next(errorUtils.getInternalError(err.message));\n }\n }\n );\n return router;\n}\n\nexport default addSearchWebApi;\n"],"mappings":"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"}
package/build/api/user.js CHANGED
@@ -37,6 +37,7 @@ function addUserAuthApi(auth, config) {
37
37
  } else {
38
38
  req.remote_user = user;
39
39
  const jWTSignOptions = config.security.web.sign;
40
+ res.set(_core.HEADERS.CACHE_CONTROL, 'no-cache, no-store');
40
41
  next({
41
42
  token: await auth.jwtEncrypt(user, jWTSignOptions),
42
43
  username: req.remote_user.name
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","names":["debug","buildDebug","addUserAuthApi","auth","config","route","Router","post","req","res","next","username","password","body","authenticate","err","user","errorCode","message","HTTP_STATUS","UNAUTHORIZED","INTERNAL_ERROR","errorUtils","getCode","remote_user","jWTSignOptions","security","web","sign","token","jwtEncrypt","name","flags","changePassword","put","_","isNil","status","API_ERROR","MUST_BE_LOGGED","validatioUtils","validatePassword","new","serverSettings","passwordValidationRegex","old","isUpdated","ok","getInternalError","INTERNAL_SERVER_ERROR","BAD_REQUEST","APP_ERROR","PASSWORD_VALIDATION"],"sources":["../../src/api/user.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Request, Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { Auth } from '@verdaccio/auth';\nimport {\n API_ERROR,\n APP_ERROR,\n HTTP_STATUS,\n VerdaccioError,\n errorUtils,\n validatioUtils,\n} from '@verdaccio/core';\nimport { Config, JWTSignOptions, RemoteUser } from '@verdaccio/types';\n\nimport { $NextFunctionVer } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:user');\n\nfunction addUserAuthApi(auth: Auth, config: Config): Router {\n const route = Router(); /* eslint new-cap: 0 */\n route.post('/login', function (req: Request, res: Response, next: $NextFunctionVer): void {\n const { username, password } = req.body;\n debug('authenticate %o', username);\n auth.authenticate(\n username,\n password,\n async (err: VerdaccioError | null, user?: RemoteUser): Promise<void> => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n debug('error authenticate %o', errorCode);\n next(errorUtils.getCode(errorCode, err.message));\n } else {\n req.remote_user = user as RemoteUser;\n const jWTSignOptions: JWTSignOptions = config.security.web.sign;\n\n next({\n token: await auth.jwtEncrypt(user as RemoteUser, jWTSignOptions),\n username: req.remote_user.name,\n });\n }\n }\n );\n });\n\n if (config?.flags?.changePassword === true) {\n route.put(\n '/reset_password',\n function (req: Request, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name)) {\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n // FUTURE: update to a more meaningful message\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n\n const { password } = req.body;\n const { name } = req.remote_user;\n\n if (\n validatioUtils.validatePassword(\n password.new,\n config?.serverSettings?.passwordValidationRegex\n ) === false\n ) {\n auth.changePassword(\n name as string,\n password.old,\n password.new,\n (err, isUpdated): void => {\n if (_.isNil(err) && isUpdated) {\n next({\n ok: true,\n });\n } else {\n return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));\n }\n }\n );\n } else {\n return next(errorUtils.getCode(HTTP_STATUS.BAD_REQUEST, APP_ERROR.PASSWORD_VALIDATION));\n }\n }\n );\n }\n\n return route;\n}\n\nexport default addUserAuthApi;\n"],"mappings":"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"}
1
+ {"version":3,"file":"user.js","names":["debug","buildDebug","addUserAuthApi","auth","config","route","Router","post","req","res","next","username","password","body","authenticate","err","user","errorCode","message","HTTP_STATUS","UNAUTHORIZED","INTERNAL_ERROR","errorUtils","getCode","remote_user","jWTSignOptions","security","web","sign","set","HEADERS","CACHE_CONTROL","token","jwtEncrypt","name","flags","changePassword","put","_","isNil","status","API_ERROR","MUST_BE_LOGGED","validatioUtils","validatePassword","new","serverSettings","passwordValidationRegex","old","isUpdated","ok","getInternalError","INTERNAL_SERVER_ERROR","BAD_REQUEST","APP_ERROR","PASSWORD_VALIDATION"],"sources":["../../src/api/user.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Request, Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { Auth } from '@verdaccio/auth';\nimport {\n API_ERROR,\n APP_ERROR,\n HEADERS,\n HTTP_STATUS,\n VerdaccioError,\n errorUtils,\n validatioUtils,\n} from '@verdaccio/core';\nimport { Config, JWTSignOptions, RemoteUser } from '@verdaccio/types';\n\nimport { $NextFunctionVer } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:user');\n\nfunction addUserAuthApi(auth: Auth, config: Config): Router {\n const route = Router(); /* eslint new-cap: 0 */\n route.post('/login', function (req: Request, res: Response, next: $NextFunctionVer): void {\n const { username, password } = req.body;\n debug('authenticate %o', username);\n auth.authenticate(\n username,\n password,\n async (err: VerdaccioError | null, user?: RemoteUser): Promise<void> => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n debug('error authenticate %o', errorCode);\n next(errorUtils.getCode(errorCode, err.message));\n } else {\n req.remote_user = user as RemoteUser;\n const jWTSignOptions: JWTSignOptions = config.security.web.sign;\n res.set(HEADERS.CACHE_CONTROL, 'no-cache, no-store');\n next({\n token: await auth.jwtEncrypt(user as RemoteUser, jWTSignOptions),\n username: req.remote_user.name,\n });\n }\n }\n );\n });\n\n if (config?.flags?.changePassword === true) {\n route.put(\n '/reset_password',\n function (req: Request, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name)) {\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n // FUTURE: update to a more meaningful message\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n\n const { password } = req.body;\n const { name } = req.remote_user;\n\n if (\n validatioUtils.validatePassword(\n password.new,\n config?.serverSettings?.passwordValidationRegex\n ) === false\n ) {\n auth.changePassword(\n name as string,\n password.old,\n password.new,\n (err, isUpdated): void => {\n if (_.isNil(err) && isUpdated) {\n next({\n ok: true,\n });\n } else {\n return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));\n }\n }\n );\n } else {\n return next(errorUtils.getCode(HTTP_STATUS.BAD_REQUEST, APP_ERROR.PASSWORD_VALIDATION));\n }\n }\n );\n }\n\n return route;\n}\n\nexport default addUserAuthApi;\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare function loadTheme(config: any): Promise<import("@verdaccio/core/build/plugin-utils").Plugin<unknown> | undefined>;
1
+ export declare function loadTheme(config: any): Promise<any>;
2
2
  export declare function renderWebMiddleware(config: any, auth: any): Promise<any>;
@@ -37,8 +37,9 @@ async function loadTheme(config) {
37
37
  const plugin = await (0, _loaders.asyncLoadPlugin)(config.theme, {
38
38
  config,
39
39
  logger: _logger.logger
40
- }, function (plugin) {
41
- return typeof plugin === 'string';
40
+ }, // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown }
41
+ function (plugin) {
42
+ return plugin.staticPath && plugin.manifest && plugin.manifestFiles;
42
43
  }, (config === null || config === void 0 ? void 0 : (_config$serverSetting = config.serverSettings) === null || _config$serverSetting === void 0 ? void 0 : _config$serverSetting.pluginPrefix) ?? 'verdaccio-theme');
43
44
 
44
45
  if (plugin.length > 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"render-web.js","names":["debug","buildDebug","loadTheme","config","_","isNil","theme","plugin","asyncLoadPlugin","logger","serverSettings","pluginPrefix","length","warn","head","sendFileCallback","next","err","status","HTTP_STATUS","NOT_FOUND","renderWebMiddleware","auth","staticPath","manifest","manifestFiles","require","router","express","Router","use","webUIJWTmiddleware","setSecurityWebHeaders","logoURI","web","logo","isURLhasValidProtocol","path","posix","join","basename","get","req","res","sendFile","resolve","filename","params","file","renderHTML"],"sources":["../../src/middleware/render-web.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport express from 'express';\nimport _ from 'lodash';\nimport path from 'path';\n\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport { isURLhasValidProtocol } from '@verdaccio/url';\n\nimport renderHTML from '../renderHTML';\nimport { setSecurityWebHeaders } from './security';\n\nconst debug = buildDebug('verdaccio:web:render');\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 function (plugin) {\n return typeof plugin === 'string';\n },\n config?.serverSettings?.pluginPrefix ?? 'verdaccio-theme'\n );\n if (plugin.length > 1) {\n logger.warn(\n 'multiple ui themes has been detected and is not supported, only the first one will be used'\n );\n }\n\n return _.head(plugin);\n }\n}\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 async function renderWebMiddleware(config, auth): Promise<any> {\n const { staticPath, manifest, manifestFiles } =\n (await loadTheme(config)) || require('@verdaccio/ui-theme')();\n debug('static path %o', staticPath);\n\n /* eslint new-cap:off */\n const router = express.Router();\n router.use(auth.webUIJWTmiddleware());\n router.use(setSecurityWebHeaders);\n\n // Logo\n let logoURI = config?.web?.logo ?? '';\n if (logoURI && !isURLhasValidProtocol(logoURI)) {\n // URI related to a local file\n\n // Note: `path.join` will break on Windows, because it transforms `/` to `\\`\n // Use POSIX version `path.posix.join` instead.\n logoURI = path.posix.join('/-/static/', path.basename(logoURI));\n router.get(logoURI, function (req, res, next) {\n res.sendFile(path.resolve(config.web.logo), sendFileCallback(next));\n debug('render static');\n });\n }\n\n // Static\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 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","buildDebug","loadTheme","config","_","isNil","theme","plugin","asyncLoadPlugin","logger","staticPath","manifest","manifestFiles","serverSettings","pluginPrefix","length","warn","head","sendFileCallback","next","err","status","HTTP_STATUS","NOT_FOUND","renderWebMiddleware","auth","require","router","express","Router","use","webUIJWTmiddleware","setSecurityWebHeaders","logoURI","web","logo","isURLhasValidProtocol","path","posix","join","basename","get","req","res","sendFile","resolve","filename","params","file","renderHTML"],"sources":["../../src/middleware/render-web.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport express from 'express';\nimport _ from 'lodash';\nimport path from 'path';\n\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { logger } from '@verdaccio/logger';\nimport { isURLhasValidProtocol } from '@verdaccio/url';\n\nimport renderHTML from '../renderHTML';\nimport { setSecurityWebHeaders } from './security';\n\nconst debug = buildDebug('verdaccio:web:render');\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 return plugin.staticPath && plugin.manifest && plugin.manifestFiles;\n },\n config?.serverSettings?.pluginPrefix ?? 'verdaccio-theme'\n );\n if (plugin.length > 1) {\n logger.warn(\n 'multiple ui themes has been detected and is not supported, only the first one will be used'\n );\n }\n\n return _.head(plugin);\n }\n}\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 async function renderWebMiddleware(config, auth): Promise<any> {\n const { staticPath, manifest, manifestFiles } =\n (await loadTheme(config)) || require('@verdaccio/ui-theme')();\n debug('static path %o', staticPath);\n\n /* eslint new-cap:off */\n const router = express.Router();\n router.use(auth.webUIJWTmiddleware());\n router.use(setSecurityWebHeaders);\n\n // Logo\n let logoURI = config?.web?.logo ?? '';\n if (logoURI && !isURLhasValidProtocol(logoURI)) {\n // URI related to a local file\n\n // Note: `path.join` will break on Windows, because it transforms `/` to `\\`\n // Use POSIX version `path.posix.join` instead.\n logoURI = path.posix.join('/-/static/', path.basename(logoURI));\n router.get(logoURI, function (req, res, next) {\n res.sendFile(path.resolve(config.web.logo), sendFileCallback(next));\n debug('render static');\n });\n }\n\n // Static\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 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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"}
@@ -28,7 +28,7 @@ const pkgJSON = require('../package.json');
28
28
  const DEFAULT_LANGUAGE = 'es-US';
29
29
  const cache = new _lruCache.default({
30
30
  max: 500,
31
- maxAge: 1000 * 60 * 60
31
+ ttl: 1000 * 60 * 60
32
32
  });
33
33
  const debug = (0, _debug.default)('verdaccio:web:render');
34
34
  const defaultManifestFiles = {
@@ -1 +1 @@
1
- {"version":3,"file":"renderHTML.js","names":["pkgJSON","require","DEFAULT_LANGUAGE","cache","LRU","max","maxAge","debug","buildDebug","defaultManifestFiles","js","ico","renderHTML","config","manifest","manifestFiles","req","res","url_prefix","base","getPublicUrl","basename","URL","pathname","language","i18n","web","needHtmlCache","undefined","includes","html_cache","darkMode","title","WEB_TITLE","login","hasLogin","scope","logoURI","logo","pkgManagers","version","flags","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/renderHTML.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport LRU from 'lru-cache';\nimport { URL } from 'url';\n\nimport { WEB_TITLE } from '@verdaccio/config';\nimport { HEADERS } from '@verdaccio/core';\nimport { TemplateUIOptions } from '@verdaccio/types';\nimport { getPublicUrl } from '@verdaccio/url';\n\nimport renderTemplate from './template';\nimport { hasLogin, validatePrimaryColor } from './utils/web-utils';\n\nconst pkgJSON = require('../package.json');\nconst DEFAULT_LANGUAGE = 'es-US';\nconst cache = new LRU({ max: 500, maxAge: 1000 * 60 * 60 });\n\nconst debug = buildDebug('verdaccio:web:render');\n\nconst defaultManifestFiles = {\n js: ['runtime.js', 'vendors.js', 'main.js'],\n ico: 'favicon.ico',\n};\n\nexport default function renderHTML(config, manifest, manifestFiles, req, res) {\n const { url_prefix } = config;\n const base = getPublicUrl(config?.url_prefix, req);\n const basename = new URL(base).pathname;\n const language = config?.i18n?.web ?? DEFAULT_LANGUAGE;\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 logoURI = config?.web?.logo ?? '';\n const pkgManagers = config?.web?.pkgManagers ?? ['yarn', 'pnpm', 'npm'];\n const version = pkgJSON.version;\n const flags = {\n ...config.flags,\n };\n const primaryColor = validatePrimaryColor(config?.web?.primary_color) ?? '#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 logoURI,\n flags,\n login,\n pkgManagers,\n title,\n scope,\n language,\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 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":["pkgJSON","require","DEFAULT_LANGUAGE","cache","LRU","max","ttl","debug","buildDebug","defaultManifestFiles","js","ico","renderHTML","config","manifest","manifestFiles","req","res","url_prefix","base","getPublicUrl","basename","URL","pathname","language","i18n","web","needHtmlCache","undefined","includes","html_cache","darkMode","title","WEB_TITLE","login","hasLogin","scope","logoURI","logo","pkgManagers","version","flags","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/renderHTML.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport LRU from 'lru-cache';\nimport { URL } from 'url';\n\nimport { WEB_TITLE } from '@verdaccio/config';\nimport { HEADERS } from '@verdaccio/core';\nimport { TemplateUIOptions } from '@verdaccio/types';\nimport { getPublicUrl } from '@verdaccio/url';\n\nimport renderTemplate from './template';\nimport { hasLogin, validatePrimaryColor } from './utils/web-utils';\n\nconst pkgJSON = require('../package.json');\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 = {\n js: ['runtime.js', 'vendors.js', 'main.js'],\n ico: 'favicon.ico',\n};\n\nexport default function renderHTML(config, manifest, manifestFiles, req, res) {\n const { url_prefix } = config;\n const base = getPublicUrl(config?.url_prefix, req);\n const basename = new URL(base).pathname;\n const language = config?.i18n?.web ?? DEFAULT_LANGUAGE;\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 logoURI = config?.web?.logo ?? '';\n const pkgManagers = config?.web?.pkgManagers ?? ['yarn', 'pnpm', 'npm'];\n const version = pkgJSON.version;\n const flags = {\n ...config.flags,\n };\n const primaryColor = validatePrimaryColor(config?.web?.primary_color) ?? '#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 logoURI,\n flags,\n login,\n pkgManagers,\n title,\n scope,\n language,\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 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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"}
@@ -3,13 +3,6 @@ export declare type AuthorAvatar = Author & {
3
3
  avatar?: string;
4
4
  };
5
5
  export declare function validatePrimaryColor(primaryColor: any): any;
6
- /**
7
- * parse package readme - markdown/ascii
8
- * @param {String} packageName name of package
9
- * @param {String} readme package readme
10
- * @return {String} converted html template
11
- */
12
- export declare function parseReadme(packageName: string, readme: string): string | void;
13
6
  export declare function deleteProperties(propertiesToDelete: string[], objectItem: any): any;
14
7
  export declare function addScope(scope: string, packageName: string): string;
15
8
  export declare function sortByName(packages: any[], orderAscending?: boolean | void): string[];
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.addScope = addScope;
7
7
  exports.deleteProperties = deleteProperties;
8
8
  exports.hasLogin = hasLogin;
9
- exports.parseReadme = parseReadme;
10
9
  exports.sortByName = sortByName;
11
10
  exports.validatePrimaryColor = validatePrimaryColor;
12
11
 
@@ -14,8 +13,6 @@ var _debug = _interopRequireDefault(require("debug"));
14
13
 
15
14
  var _lodash = _interopRequireDefault(require("lodash"));
16
15
 
17
- var _readme = _interopRequireDefault(require("@verdaccio/readme"));
18
-
19
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
17
 
21
18
  const debug = (0, _debug.default)('verdaccio:web:utils');
@@ -30,24 +27,6 @@ function validatePrimaryColor(primaryColor) {
30
27
 
31
28
  return primaryColor;
32
29
  }
33
- /**
34
- * parse package readme - markdown/ascii
35
- * @param {String} packageName name of package
36
- * @param {String} readme package readme
37
- * @return {String} converted html template
38
- */
39
-
40
-
41
- function parseReadme(packageName, readme) {
42
- if (_lodash.default.isEmpty(readme) === false) {
43
- debug('sanizity readme');
44
- return (0, _readme.default)(readme);
45
- } // logs readme not found error
46
- // logger.error({ packageName }, '@{packageName}: No readme found');
47
-
48
-
49
- throw new Error('ERROR: No README data found!');
50
- }
51
30
 
52
31
  function deleteProperties(propertiesToDelete, objectItem) {
53
32
  debug('deleted unused version properties');
@@ -1 +1 @@
1
- {"version":3,"file":"web-utils.js","names":["debug","buildDebug","validatePrimaryColor","primaryColor","isHex","test","parseReadme","packageName","readme","_","isEmpty","sanitizyReadme","Error","deleteProperties","propertiesToDelete","objectItem","forEach","property","addScope","scope","sortByName","packages","orderAscending","slice","sort","a","b","comparatorNames","name","toLowerCase","hasLogin","config","isNil","web","login"],"sources":["../../src/utils/web-utils.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport sanitizyReadme from '@verdaccio/readme';\n// import { normalizeContributors } from '@verdaccio/store';\nimport { Author, ConfigYaml } from '@verdaccio/types';\n\nexport type AuthorAvatar = Author & { avatar?: string };\n\nconst debug = buildDebug('verdaccio:web:utils');\n\nexport function validatePrimaryColor(primaryColor) {\n const isHex = /^#([0-9A-F]{3}){1,2}$/i.test(primaryColor);\n if (!isHex) {\n debug('invalid primary color %o', primaryColor);\n return;\n }\n\n return primaryColor;\n}\n\n/**\n * parse package readme - markdown/ascii\n * @param {String} packageName name of package\n * @param {String} readme package readme\n * @return {String} converted html template\n */\nexport function parseReadme(packageName: string, readme: string): string | void {\n if (_.isEmpty(readme) === false) {\n debug('sanizity readme');\n return sanitizyReadme(readme);\n }\n\n // logs readme not found error\n // logger.error({ packageName }, '@{packageName}: No readme found');\n throw new Error('ERROR: No README data found!');\n}\n\nexport function deleteProperties(propertiesToDelete: string[], objectItem: any): any {\n debug('deleted unused version properties');\n _.forEach(propertiesToDelete, (property): any => {\n delete objectItem[property];\n });\n\n return objectItem;\n}\n\nexport function addScope(scope: string, packageName: string): string {\n return `@${scope}/${packageName}`;\n}\n\nexport function sortByName(packages: any[], orderAscending: boolean | void = true): string[] {\n return packages.slice().sort(function (a, b): number {\n const comparatorNames = a.name.toLowerCase() < b.name.toLowerCase();\n return orderAscending ? (comparatorNames ? -1 : 1) : comparatorNames ? 1 : -1;\n });\n}\n\nexport function hasLogin(config: ConfigYaml) {\n return _.isNil(config?.web?.login) || config?.web?.login === true;\n}\n"],"mappings":";;;;;;;;;;;;AAAA;;AACA;;AAEA;;;;AAMA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,qBAAX,CAAd;;AAEO,SAASC,oBAAT,CAA8BC,YAA9B,EAA4C;EACjD,MAAMC,KAAK,GAAG,yBAAyBC,IAAzB,CAA8BF,YAA9B,CAAd;;EACA,IAAI,CAACC,KAAL,EAAY;IACVJ,KAAK,CAAC,0BAAD,EAA6BG,YAA7B,CAAL;IACA;EACD;;EAED,OAAOA,YAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASG,WAAT,CAAqBC,WAArB,EAA0CC,MAA1C,EAAyE;EAC9E,IAAIC,eAAA,CAAEC,OAAF,CAAUF,MAAV,MAAsB,KAA1B,EAAiC;IAC/BR,KAAK,CAAC,iBAAD,CAAL;IACA,OAAO,IAAAW,eAAA,EAAeH,MAAf,CAAP;EACD,CAJ6E,CAM9E;EACA;;;EACA,MAAM,IAAII,KAAJ,CAAU,8BAAV,CAAN;AACD;;AAEM,SAASC,gBAAT,CAA0BC,kBAA1B,EAAwDC,UAAxD,EAA8E;EACnFf,KAAK,CAAC,mCAAD,CAAL;;EACAS,eAAA,CAAEO,OAAF,CAAUF,kBAAV,EAA+BG,QAAD,IAAmB;IAC/C,OAAOF,UAAU,CAACE,QAAD,CAAjB;EACD,CAFD;;EAIA,OAAOF,UAAP;AACD;;AAEM,SAASG,QAAT,CAAkBC,KAAlB,EAAiCZ,WAAjC,EAA8D;EACnE,OAAQ,IAAGY,KAAM,IAAGZ,WAAY,EAAhC;AACD;;AAEM,SAASa,UAAT,CAAoBC,QAApB,EAAqCC,cAA8B,GAAG,IAAtE,EAAsF;EAC3F,OAAOD,QAAQ,CAACE,KAAT,GAAiBC,IAAjB,CAAsB,UAAUC,CAAV,EAAaC,CAAb,EAAwB;IACnD,MAAMC,eAAe,GAAGF,CAAC,CAACG,IAAF,CAAOC,WAAP,KAAuBH,CAAC,CAACE,IAAF,CAAOC,WAAP,EAA/C;IACA,OAAOP,cAAc,GAAIK,eAAe,GAAG,CAAC,CAAJ,GAAQ,CAA3B,GAAgCA,eAAe,GAAG,CAAH,GAAO,CAAC,CAA5E;EACD,CAHM,CAAP;AAID;;AAEM,SAASG,QAAT,CAAkBC,MAAlB,EAAsC;EAAA;;EAC3C,OAAOtB,eAAA,CAAEuB,KAAF,CAAQD,MAAR,aAAQA,MAAR,sCAAQA,MAAM,CAAEE,GAAhB,gDAAQ,YAAaC,KAArB,KAA+B,CAAAH,MAAM,SAAN,IAAAA,MAAM,WAAN,4BAAAA,MAAM,CAAEE,GAAR,8DAAaC,KAAb,MAAuB,IAA7D;AACD"}
1
+ {"version":3,"file":"web-utils.js","names":["debug","buildDebug","validatePrimaryColor","primaryColor","isHex","test","deleteProperties","propertiesToDelete","objectItem","_","forEach","property","addScope","scope","packageName","sortByName","packages","orderAscending","slice","sort","a","b","comparatorNames","name","toLowerCase","hasLogin","config","isNil","web","login"],"sources":["../../src/utils/web-utils.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\n\n// import { normalizeContributors } from '@verdaccio/store';\nimport { Author, ConfigYaml } from '@verdaccio/types';\n\nexport type AuthorAvatar = Author & { avatar?: string };\n\nconst debug = buildDebug('verdaccio:web:utils');\n\nexport function validatePrimaryColor(primaryColor) {\n const isHex = /^#([0-9A-F]{3}){1,2}$/i.test(primaryColor);\n if (!isHex) {\n debug('invalid primary color %o', primaryColor);\n return;\n }\n\n return primaryColor;\n}\n\nexport function deleteProperties(propertiesToDelete: string[], objectItem: any): any {\n debug('deleted unused version properties');\n _.forEach(propertiesToDelete, (property): any => {\n delete objectItem[property];\n });\n\n return objectItem;\n}\n\nexport function addScope(scope: string, packageName: string): string {\n return `@${scope}/${packageName}`;\n}\n\nexport function sortByName(packages: any[], orderAscending: boolean | void = true): string[] {\n return packages.slice().sort(function (a, b): number {\n const comparatorNames = a.name.toLowerCase() < b.name.toLowerCase();\n return orderAscending ? (comparatorNames ? -1 : 1) : comparatorNames ? 1 : -1;\n });\n}\n\nexport function hasLogin(config: ConfigYaml) {\n return _.isNil(config?.web?.login) || config?.web?.login === true;\n}\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;;;AAOA,MAAMA,KAAK,GAAG,IAAAC,cAAA,EAAW,qBAAX,CAAd;;AAEO,SAASC,oBAAT,CAA8BC,YAA9B,EAA4C;EACjD,MAAMC,KAAK,GAAG,yBAAyBC,IAAzB,CAA8BF,YAA9B,CAAd;;EACA,IAAI,CAACC,KAAL,EAAY;IACVJ,KAAK,CAAC,0BAAD,EAA6BG,YAA7B,CAAL;IACA;EACD;;EAED,OAAOA,YAAP;AACD;;AAEM,SAASG,gBAAT,CAA0BC,kBAA1B,EAAwDC,UAAxD,EAA8E;EACnFR,KAAK,CAAC,mCAAD,CAAL;;EACAS,eAAA,CAAEC,OAAF,CAAUH,kBAAV,EAA+BI,QAAD,IAAmB;IAC/C,OAAOH,UAAU,CAACG,QAAD,CAAjB;EACD,CAFD;;EAIA,OAAOH,UAAP;AACD;;AAEM,SAASI,QAAT,CAAkBC,KAAlB,EAAiCC,WAAjC,EAA8D;EACnE,OAAQ,IAAGD,KAAM,IAAGC,WAAY,EAAhC;AACD;;AAEM,SAASC,UAAT,CAAoBC,QAApB,EAAqCC,cAA8B,GAAG,IAAtE,EAAsF;EAC3F,OAAOD,QAAQ,CAACE,KAAT,GAAiBC,IAAjB,CAAsB,UAAUC,CAAV,EAAaC,CAAb,EAAwB;IACnD,MAAMC,eAAe,GAAGF,CAAC,CAACG,IAAF,CAAOC,WAAP,KAAuBH,CAAC,CAACE,IAAF,CAAOC,WAAP,EAA/C;IACA,OAAOP,cAAc,GAAIK,eAAe,GAAG,CAAC,CAAJ,GAAQ,CAA3B,GAAgCA,eAAe,GAAG,CAAH,GAAO,CAAC,CAA5E;EACD,CAHM,CAAP;AAID;;AAEM,SAASG,QAAT,CAAkBC,MAAlB,EAAsC;EAAA;;EAC3C,OAAOjB,eAAA,CAAEkB,KAAF,CAAQD,MAAR,aAAQA,MAAR,sCAAQA,MAAM,CAAEE,GAAhB,gDAAQ,YAAaC,KAArB,KAA+B,CAAAH,MAAM,SAAN,IAAAA,MAAM,WAAN,4BAAAA,MAAM,CAAEE,GAAR,8DAAaC,KAAb,MAAuB,IAA7D;AACD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/web",
3
- "version": "6.0.0-6-next.36",
3
+ "version": "6.0.0-6-next.38",
4
4
  "description": "web ui middleware",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -25,35 +25,34 @@
25
25
  },
26
26
  "license": "MIT",
27
27
  "dependencies": {
28
- "@verdaccio/auth": "6.0.0-6-next.28",
29
- "@verdaccio/core": "6.0.0-6-next.49",
30
- "@verdaccio/config": "6.0.0-6-next.49",
31
- "@verdaccio/loaders": "6.0.0-6-next.18",
32
- "@verdaccio/logger": "6.0.0-6-next.17",
33
- "@verdaccio/middleware": "6.0.0-6-next.28",
34
- "@verdaccio/readme": "11.0.0-6-next.6",
35
- "@verdaccio/store": "6.0.0-6-next.29",
36
- "@verdaccio/tarball": "11.0.0-6-next.18",
37
- "@verdaccio/url": "11.0.0-6-next.15",
38
- "@verdaccio/utils": "6.0.0-6-next.17",
39
- "body-parser": "1.20.0",
28
+ "@verdaccio/auth": "6.0.0-6-next.30",
29
+ "@verdaccio/core": "6.0.0-6-next.51",
30
+ "@verdaccio/config": "6.0.0-6-next.51",
31
+ "@verdaccio/loaders": "6.0.0-6-next.20",
32
+ "@verdaccio/logger": "6.0.0-6-next.19",
33
+ "@verdaccio/middleware": "6.0.0-6-next.30",
34
+ "@verdaccio/store": "6.0.0-6-next.31",
35
+ "@verdaccio/tarball": "11.0.0-6-next.20",
36
+ "@verdaccio/url": "11.0.0-6-next.17",
37
+ "@verdaccio/utils": "6.0.0-6-next.19",
38
+ "body-parser": "1.20.1",
40
39
  "debug": "4.3.4",
41
- "express": "4.18.1",
40
+ "express": "4.18.2",
42
41
  "lodash": "4.17.21",
43
- "lru-cache": "6.0.0"
42
+ "lru-cache": "7.14.0"
44
43
  },
45
44
  "devDependencies": {
46
- "@types/node": "16.11.62",
45
+ "@types/node": "16.11.65",
47
46
  "@verdaccio/types": "11.0.0-6-next.17",
48
47
  "@verdaccio/test-helper": "2.0.0-6-next.6",
49
- "@verdaccio/api": "6.0.0-6-next.32",
48
+ "@verdaccio/api": "6.0.0-6-next.34",
50
49
  "node-html-parser": "4.1.5",
51
- "supertest": "6.2.4",
50
+ "supertest": "6.3.0",
52
51
  "nock": "13.2.9",
53
- "jsdom": "20.0.0",
52
+ "jsdom": "20.0.1",
54
53
  "undici": "4.16.0",
55
- "verdaccio-auth-memory": "11.0.0-6-next.14",
56
- "verdaccio-memory": "11.0.0-6-next.16"
54
+ "verdaccio-auth-memory": "11.0.0-6-next.16",
55
+ "verdaccio-memory": "11.0.0-6-next.18"
57
56
  },
58
57
  "funding": {
59
58
  "type": "opencollective",
@@ -97,7 +97,7 @@ function addPackageWebApi(storage: Storage, auth: Auth, config: Config): Router
97
97
  debug('hit package web api %o');
98
98
 
99
99
  try {
100
- const localPackages: Version[] = await storage.getLocalDatabaseNext();
100
+ const localPackages: Version[] = await storage.getLocalDatabase();
101
101
 
102
102
  const order = getOrder(config?.web?.sort_packages);
103
103
  debug('order %o', order);
package/src/api/readme.ts CHANGED
@@ -4,20 +4,27 @@ import { Router } from 'express';
4
4
  import { Auth } from '@verdaccio/auth';
5
5
  import { HEADERS, HEADER_TYPE } from '@verdaccio/core';
6
6
  import { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';
7
- import sanitizyReadme from '@verdaccio/readme';
8
7
  import { Storage } from '@verdaccio/store';
9
8
  import { Manifest } from '@verdaccio/types';
10
9
 
11
- import { AuthorAvatar, addScope, parseReadme } from '../utils/web-utils';
10
+ import { AuthorAvatar, addScope } from '../utils/web-utils';
12
11
 
13
12
  export { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages
14
13
 
15
14
  // TODO: review this type, should be on @verdacid/types
16
15
  export type PackageExt = Manifest & { author: AuthorAvatar; dist?: { tarball: string } };
17
-
18
- const debug = buildDebug('verdaccio:web:api:readme');
19
-
20
16
  export const NOT_README_FOUND = 'ERROR: No README data found!';
17
+ const debug = buildDebug('verdaccio:web:api:readme');
18
+ const getReadme = (readme) => {
19
+ if (typeof readme === 'string' && readme.length === 0) {
20
+ return NOT_README_FOUND;
21
+ }
22
+ if (typeof readme !== 'string') {
23
+ return NOT_README_FOUND;
24
+ } else {
25
+ return readme;
26
+ }
27
+ };
21
28
 
22
29
  function addReadmeWebApi(storage: Storage, auth: Auth): Router {
23
30
  debug('initialized readme web api');
@@ -53,11 +60,7 @@ function addReadmeWebApi(storage: Storage, auth: Auth): Router {
53
60
  })) as Manifest;
54
61
  debug('readme pkg %o', manifest?.name);
55
62
  res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);
56
- try {
57
- next(parseReadme(manifest.name, manifest.readme as string));
58
- } catch {
59
- next(sanitizyReadme(NOT_README_FOUND));
60
- }
63
+ next(getReadme(manifest.readme));
61
64
  } catch (err) {
62
65
  next(err);
63
66
  }
package/src/api/search.ts CHANGED
@@ -44,7 +44,7 @@ function addSearchWebApi(storage: Storage, auth: Auth): Router {
44
44
  try {
45
45
  let data;
46
46
  const abort = new AbortController();
47
- req.on('aborted', () => {
47
+ req.socket.on('close', function () {
48
48
  debug('search web aborted');
49
49
  abort.abort();
50
50
  });
package/src/api/user.ts CHANGED
@@ -6,6 +6,7 @@ import { Auth } from '@verdaccio/auth';
6
6
  import {
7
7
  API_ERROR,
8
8
  APP_ERROR,
9
+ HEADERS,
9
10
  HTTP_STATUS,
10
11
  VerdaccioError,
11
12
  errorUtils,
@@ -33,7 +34,7 @@ function addUserAuthApi(auth: Auth, config: Config): Router {
33
34
  } else {
34
35
  req.remote_user = user as RemoteUser;
35
36
  const jWTSignOptions: JWTSignOptions = config.security.web.sign;
36
-
37
+ res.set(HEADERS.CACHE_CONTROL, 'no-cache, no-store');
37
38
  next({
38
39
  token: await auth.jwtEncrypt(user as RemoteUser, jWTSignOptions),
39
40
  username: req.remote_user.name,
@@ -18,8 +18,9 @@ export async function loadTheme(config: any) {
18
18
  const plugin = await asyncLoadPlugin(
19
19
  config.theme,
20
20
  { config, logger },
21
- function (plugin) {
22
- return typeof plugin === 'string';
21
+ // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown }
22
+ function (plugin: any) {
23
+ return plugin.staticPath && plugin.manifest && plugin.manifestFiles;
23
24
  },
24
25
  config?.serverSettings?.pluginPrefix ?? 'verdaccio-theme'
25
26
  );
package/src/renderHTML.ts CHANGED
@@ -12,7 +12,7 @@ import { hasLogin, validatePrimaryColor } from './utils/web-utils';
12
12
 
13
13
  const pkgJSON = require('../package.json');
14
14
  const DEFAULT_LANGUAGE = 'es-US';
15
- const cache = new LRU({ max: 500, maxAge: 1000 * 60 * 60 });
15
+ const cache = new LRU({ max: 500, ttl: 1000 * 60 * 60 });
16
16
 
17
17
  const debug = buildDebug('verdaccio:web:render');
18
18
 
@@ -1,7 +1,6 @@
1
1
  import buildDebug from 'debug';
2
2
  import _ from 'lodash';
3
3
 
4
- import sanitizyReadme from '@verdaccio/readme';
5
4
  // import { normalizeContributors } from '@verdaccio/store';
6
5
  import { Author, ConfigYaml } from '@verdaccio/types';
7
6
 
@@ -19,23 +18,6 @@ export function validatePrimaryColor(primaryColor) {
19
18
  return primaryColor;
20
19
  }
21
20
 
22
- /**
23
- * parse package readme - markdown/ascii
24
- * @param {String} packageName name of package
25
- * @param {String} readme package readme
26
- * @return {String} converted html template
27
- */
28
- export function parseReadme(packageName: string, readme: string): string | void {
29
- if (_.isEmpty(readme) === false) {
30
- debug('sanizity readme');
31
- return sanitizyReadme(readme);
32
- }
33
-
34
- // logs readme not found error
35
- // logger.error({ packageName }, '@{packageName}: No readme found');
36
- throw new Error('ERROR: No README data found!');
37
- }
38
-
39
21
  export function deleteProperties(propertiesToDelete: string[], objectItem: any): any {
40
22
  debug('deleted unused version properties');
41
23
  _.forEach(propertiesToDelete, (property): any => {
@@ -8,7 +8,7 @@ import { publishVersion } from '@verdaccio/test-helper';
8
8
  import { NOT_README_FOUND } from '../src/api/readme';
9
9
  import { initializeServer } from './helper';
10
10
 
11
- setup([]);
11
+ setup({});
12
12
 
13
13
  const mockManifest = jest.fn();
14
14
  jest.mock('@verdaccio/ui-theme', () => mockManifest());
@@ -55,6 +55,7 @@ describe('test web server', () => {
55
55
  )
56
56
  .set(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON)
57
57
  .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
58
+ .expect(HEADERS.CACHE_CONTROL, 'no-cache, no-store')
58
59
  .expect(HTTP_STATUS.OK)
59
60
  .then((res) => {
60
61
  expect(res.body.error).toBeUndefined();
@@ -1,11 +1,4 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
-
4
- import { parseReadme, validatePrimaryColor } from '../src/utils/web-utils';
5
-
6
- const readmeFile = (fileName = 'markdown.md') => {
7
- return fs.readFileSync(path.join(__dirname, `./partials/readme/${fileName}`));
8
- };
1
+ import { validatePrimaryColor } from '../src/utils/web-utils';
9
2
 
10
3
  describe('Utilities', () => {
11
4
  describe('validatePrimaryColor', () => {
@@ -17,29 +10,4 @@ describe('Utilities', () => {
17
10
  expect(validatePrimaryColor('fff')).toBeUndefined();
18
11
  });
19
12
  });
20
- describe('parseReadme', () => {
21
- test('should parse makrdown text to html template', () => {
22
- const markdown = '# markdown';
23
- expect(parseReadme('testPackage', markdown)).toEqual('<h1 id="markdown">markdown</h1>');
24
- // @ts-ignore
25
- expect(parseReadme('testPackage', String(readmeFile('markdown.md')))).toMatchSnapshot();
26
- });
27
-
28
- test('should pass for conversion of non-ascii to markdown text', () => {
29
- const simpleText = 'simple text';
30
- const randomText = '%%%%%**##==';
31
- const randomTextMarkdown = 'simple text \n # markdown';
32
-
33
- expect(parseReadme('testPackage', randomText)).toEqual('<p>%%%%%**##==</p>');
34
- expect(parseReadme('testPackage', simpleText)).toEqual('<p>simple text</p>');
35
- expect(parseReadme('testPackage', randomTextMarkdown)).toEqual(
36
- '<p>simple text </p>\n<h1 id="markdown">markdown</h1>'
37
- );
38
- });
39
-
40
- test('should show error for no readme data', () => {
41
- const noData = '';
42
- expect(() => parseReadme('testPackage', noData)).toThrowError('ERROR: No README data found!');
43
- });
44
- });
45
13
  });
@@ -1,51 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`Utilities parseReadme should parse makrdown text to html template 1`] = `
4
- "<h1 id="project-title">Project Title</h1>
5
- <p>One Paragraph of project description goes here</p>
6
- <h2 id="getting-started">Getting Started</h2>
7
- <p>These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.</p>
8
- <h3 id="prerequisites">Prerequisites</h3>
9
- <p>What things you need to install the software and how to install them</p>
10
- <pre><code>Give examples
11
- </code></pre>
12
- <h3 id="installing">Installing</h3>
13
- <p>A step by step series of examples that tell you how to get a development env running</p>
14
- <p>Say what the step will be</p>
15
- <pre><code>Give the example
16
- </code></pre>
17
- <p>And repeat</p>
18
- <pre><code>until finished
19
- </code></pre>
20
- <p>End with an example of getting some data out of the system or using it for a little demo</p>
21
- <h2 id="running-the-tests">Running the tests</h2>
22
- <p>Explain how to run the automated tests for this system</p>
23
- <h3 id="break-down-into-end-to-end-tests">Break down into end to end tests</h3>
24
- <p>Explain what these tests test and why</p>
25
- <pre><code>Give an example
26
- </code></pre>
27
- <h3 id="and-coding-style-tests">And coding style tests</h3>
28
- <p>Explain what these tests test and why</p>
29
- <pre><code>Give an example
30
- </code></pre>
31
- <h2 id="deployment">Deployment</h2>
32
- <p>Add additional notes about how to deploy this on a live system</p>
33
- <h2 id="built-with">Built With</h2>
34
- <ul>
35
- <li>The web framework used</li>
36
- <li>Dependency Management</li>
37
- <li>Used to generate RSS Feeds</li>
38
- </ul>
39
- <h2 id="contributing">Contributing</h2>
40
- <p>Please read <a href="CONTRIBUTING.md">CONTRIBUTING.md</a> for details on our code of conduct, and the process for submitting pull requests to us.</p>
41
- <h2 id="versioning">Versioning</h2>
42
- <p>We use <a href="http://semver.org/">SemVer</a> for versioning. For the versions available, see the <a href="https://github.com/your/project/tags">tags on this repository</a>.</p>
43
- <h2 id="license">License</h2>
44
- <p>This project is licensed under the MIT License - see the <a href="LICENSE.md">LICENSE.md</a> file for details</p>
45
- <h2 id="acknowledgments">Acknowledgments</h2>
46
- <ul>
47
- <li>Hat tip to anyone whose code was used</li>
48
- <li>Inspiration</li>
49
- <li>etc</li>
50
- </ul>"
51
- `;
@@ -1,81 +0,0 @@
1
- # Project Title
2
-
3
- One Paragraph of project description goes here
4
-
5
- ## Getting Started
6
-
7
- These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system.
8
-
9
- ### Prerequisites
10
-
11
- What things you need to install the software and how to install them
12
-
13
- ```
14
- Give examples
15
- ```
16
-
17
- ### Installing
18
-
19
- A step by step series of examples that tell you how to get a development env running
20
-
21
- Say what the step will be
22
-
23
- ```
24
- Give the example
25
- ```
26
-
27
- And repeat
28
-
29
- ```
30
- until finished
31
- ```
32
-
33
- End with an example of getting some data out of the system or using it for a little demo
34
-
35
- ## Running the tests
36
-
37
- Explain how to run the automated tests for this system
38
-
39
- ### Break down into end to end tests
40
-
41
- Explain what these tests test and why
42
-
43
- ```
44
- Give an example
45
- ```
46
-
47
- ### And coding style tests
48
-
49
- Explain what these tests test and why
50
-
51
- ```
52
- Give an example
53
- ```
54
-
55
- ## Deployment
56
-
57
- Add additional notes about how to deploy this on a live system
58
-
59
- ## Built With
60
-
61
- - The web framework used
62
- - Dependency Management
63
- - Used to generate RSS Feeds
64
-
65
- ## Contributing
66
-
67
- Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.
68
-
69
- ## Versioning
70
-
71
- We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/your/project/tags).
72
-
73
- ## License
74
-
75
- This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
76
-
77
- ## Acknowledgments
78
-
79
- - Hat tip to anyone whose code was used
80
- - Inspiration
81
- - etc