@verdaccio/web 6.0.0-6-next.22 → 6.0.0-6-next.23

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,20 @@
1
1
  # @verdaccio/web
2
2
 
3
+ ## 6.0.0-6-next.23
4
+
5
+ ### Minor Changes
6
+
7
+ - 048ac95e: feat: align with v5 ui endpoints and ui small bugfix
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [730b5d8c]
12
+ - @verdaccio/logger@6.0.0-6-next.9
13
+ - @verdaccio/auth@6.0.0-6-next.17
14
+ - @verdaccio/loaders@6.0.0-6-next.9
15
+ - @verdaccio/middleware@6.0.0-6-next.17
16
+ - @verdaccio/store@6.0.0-6-next.18
17
+
3
18
  ## 6.0.0-6-next.22
4
19
 
5
20
  ### Major Changes
@@ -0,0 +1,2 @@
1
+ declare const _default: (auth: any, storage: any, config: any) => import("express-serve-static-core").Router;
2
+ export default _default;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _express = require("express");
9
+
10
+ var _webUtils = require("../utils/web-utils");
11
+
12
+ var _package = _interopRequireDefault(require("./package"));
13
+
14
+ var _readme = _interopRequireDefault(require("./readme"));
15
+
16
+ var _search = _interopRequireDefault(require("./search"));
17
+
18
+ var _sidebar = _interopRequireDefault(require("./sidebar"));
19
+
20
+ var _user = _interopRequireDefault(require("./user"));
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ var _default = (auth, storage, config) => {
25
+ const route = (0, _express.Router)();
26
+ /* eslint new-cap: 0 */
27
+
28
+ route.use('/data/', (0, _package.default)(storage, auth, config));
29
+ route.use('/data/', (0, _search.default)(storage, auth));
30
+ route.use('/data/', (0, _sidebar.default)(config, storage, auth));
31
+ route.use('/data/', (0, _readme.default)(storage, auth));
32
+
33
+ if ((0, _webUtils.hasLogin)(config)) {
34
+ route.use('/sec/', (0, _user.default)(auth, config));
35
+ }
36
+
37
+ return route;
38
+ };
39
+
40
+ exports.default = _default;
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/api/index.ts"],"names":["auth","storage","config","route","use"],"mappings":";;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;eAEe,CAACA,IAAD,EAAOC,OAAP,EAAgBC,MAAhB,KAA2B;AACxC,QAAMC,KAAK,GAAG,sBAAd;AAAwB;;AACxBA,EAAAA,KAAK,CAACC,GAAN,CAAU,QAAV,EAAoB,sBAAWH,OAAX,EAAoBD,IAApB,EAA0BE,MAA1B,CAApB;AACAC,EAAAA,KAAK,CAACC,GAAN,CAAU,QAAV,EAAoB,qBAAOH,OAAP,EAAgBD,IAAhB,CAApB;AACAG,EAAAA,KAAK,CAACC,GAAN,CAAU,QAAV,EAAoB,sBAAQF,MAAR,EAAgBD,OAAhB,EAAyBD,IAAzB,CAApB;AACAG,EAAAA,KAAK,CAACC,GAAN,CAAU,QAAV,EAAoB,qBAAOH,OAAP,EAAgBD,IAAhB,CAApB;;AACA,MAAI,wBAASE,MAAT,CAAJ,EAAsB;AACpBC,IAAAA,KAAK,CAACC,GAAN,CAAU,OAAV,EAAmB,mBAAKJ,IAAL,EAAWE,MAAX,CAAnB;AACD;;AACD,SAAOC,KAAP;AACD,C","sourcesContent":["import { Router } from 'express';\n\nimport { hasLogin } from '../utils/web-utils';\nimport packageApi from './package';\nimport readme from './readme';\nimport search from './search';\nimport sidebar from './sidebar';\nimport user from './user';\n\nexport default (auth, storage, config) => {\n const route = Router(); /* eslint new-cap: 0 */\n route.use('/data/', packageApi(storage, auth, config));\n route.use('/data/', search(storage, auth));\n route.use('/data/', sidebar(config, storage, auth));\n route.use('/data/', readme(storage, auth));\n if (hasLogin(config)) {\n route.use('/sec/', user(auth, config));\n }\n return route;\n};\n"],"file":"index.js"}
@@ -11,5 +11,5 @@ export declare type PackageExt = Package & {
11
11
  tarball: string;
12
12
  };
13
13
  };
14
- declare function addPackageWebApi(route: Router, storage: Storage, auth: IAuth, config: Config): void;
14
+ declare function addPackageWebApi(storage: Storage, auth: IAuth, config: Config): Router;
15
15
  export default addPackageWebApi;
@@ -25,6 +25,8 @@ exports.default = void 0;
25
25
 
26
26
  var _debug = _interopRequireDefault(require("debug"));
27
27
 
28
+ var _express = require("express");
29
+
28
30
  var _lodash = _interopRequireDefault(require("lodash"));
29
31
 
30
32
  var _logger = require("@verdaccio/logger");
@@ -46,10 +48,13 @@ const getOrder = (order = 'asc') => {
46
48
 
47
49
  const debug = (0, _debug.default)('verdaccio:web:api:package');
48
50
 
49
- function addPackageWebApi(route, storage, auth, config) {
51
+ function addPackageWebApi(storage, auth, config) {
50
52
  var _config$web;
51
53
 
52
- const isLoginEnabled = (config === null || config === void 0 ? void 0 : (_config$web = config.web) === null || _config$web === void 0 ? void 0 : _config$web.login) === true ?? true; // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
+ const isLoginEnabled = (config === null || config === void 0 ? void 0 : (_config$web = config.web) === null || _config$web === void 0 ? void 0 : _config$web.login) === true ?? true;
55
+ const pkgRouter = (0, _express.Router)();
56
+ /* eslint new-cap: 0 */
57
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
53
58
 
54
59
  const anonymousRemoteUser = {
55
60
  name: undefined,
@@ -78,7 +83,7 @@ function addPackageWebApi(route, storage, auth, config) {
78
83
  }); // Get list of all visible package
79
84
 
80
85
 
81
- route.get('/packages', function (req, res, next) {
86
+ pkgRouter.get('/packages', function (req, res, next) {
82
87
  debug('hit package web api %o');
83
88
  storage.getLocalDatabase(async function (err, packages) {
84
89
  var _config$web2;
@@ -140,6 +145,7 @@ function addPackageWebApi(route, storage, auth, config) {
140
145
  }
141
146
  });
142
147
  });
148
+ return pkgRouter;
143
149
  }
144
150
 
145
151
  var _default = addPackageWebApi;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/package.ts"],"names":["getOrder","order","debug","addPackageWebApi","route","storage","auth","config","isLoginEnabled","web","login","anonymousRemoteUser","name","undefined","real_groups","groups","checkAllow","remoteUser","Promise","resolve","reject","allow_access","packageName","err","allowed","get","req","res","next","getLocalDatabase","packages","processPackages","permissions","packagesToProcess","slice","pkg","pkgCopy","author","remote_user","avatar","email","gravatar","_","isNil","dist","isNull","tarball","protocol","headers","host","hostname","url_prefix","push","logger","error","sort_packages"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } 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, Package, RemoteUser } from '@verdaccio/types';\nimport { formatAuthor, generateGravatarUrl } from '@verdaccio/utils';\n\nimport { AuthorAvatar, 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\nexport type PackageExt = Package & { author: AuthorAvatar; dist?: { tarball: string } };\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(route: Router, storage: Storage, auth: IAuth, config: Config): void {\n const isLoginEnabled = config?.web?.login === true ?? true;\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 resolve(allowed);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n // Get list of all visible package\n route.get(\n '/packages',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n debug('hit package web api %o');\n storage.getLocalDatabase(async function (err, packages): Promise<void> {\n if (err) {\n throw err;\n }\n async function processPackages(packages: PackageExt[] = []): Promise<PackageExt[]> {\n const permissions: PackageExt[] = [];\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 pkgCopy.author.avatar = generateGravatarUrl(\n pkgCopy.author.email,\n config.web.gravatar\n );\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.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 const order = getOrder(config?.web?.sort_packages);\n debug('order %o', order);\n\n try {\n next(sortByName(await processPackages(packages), order));\n } catch (error: any) {\n next(error);\n }\n });\n }\n );\n}\n\nexport default addPackageWebApi;\n"],"file":"package.js"}
1
+ {"version":3,"sources":["../../src/api/package.ts"],"names":["getOrder","order","debug","addPackageWebApi","storage","auth","config","isLoginEnabled","web","login","pkgRouter","anonymousRemoteUser","name","undefined","real_groups","groups","checkAllow","remoteUser","Promise","resolve","reject","allow_access","packageName","err","allowed","get","req","res","next","getLocalDatabase","packages","processPackages","permissions","packagesToProcess","slice","pkg","pkgCopy","author","remote_user","avatar","email","gravatar","_","isNil","dist","isNull","tarball","protocol","headers","host","hostname","url_prefix","push","logger","error","sort_packages"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } 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, Package, RemoteUser } from '@verdaccio/types';\nimport { formatAuthor, generateGravatarUrl } from '@verdaccio/utils';\n\nimport { AuthorAvatar, 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\nexport type PackageExt = Package & { author: AuthorAvatar; dist?: { tarball: string } };\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(storage: Storage, auth: IAuth, 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 resolve(allowed);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n // Get list of all visible package\n pkgRouter.get(\n '/packages',\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n debug('hit package web api %o');\n storage.getLocalDatabase(async function (err, packages): Promise<void> {\n if (err) {\n throw err;\n }\n async function processPackages(packages: PackageExt[] = []): Promise<PackageExt[]> {\n const permissions: PackageExt[] = [];\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 pkgCopy.author.avatar = generateGravatarUrl(\n pkgCopy.author.email,\n config.web.gravatar\n );\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.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 const order = getOrder(config?.web?.sort_packages);\n debug('order %o', order);\n\n try {\n next(sortByName(await processPackages(packages), order));\n } catch (error: any) {\n next(error);\n }\n });\n }\n );\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"file":"package.js"}
@@ -12,5 +12,5 @@ export declare type PackageExt = Package & {
12
12
  };
13
13
  };
14
14
  export declare const NOT_README_FOUND = "ERROR: No README data found!";
15
- declare function addReadmeWebApi(route: Router, storage: Storage, auth: IAuth): void;
15
+ declare function addReadmeWebApi(storage: Storage, auth: IAuth): Router;
16
16
  export default addReadmeWebApi;
@@ -25,6 +25,8 @@ exports.default = exports.NOT_README_FOUND = void 0;
25
25
 
26
26
  var _debug = _interopRequireDefault(require("debug"));
27
27
 
28
+ var _express = require("express");
29
+
28
30
  var _core = require("@verdaccio/core");
29
31
 
30
32
  var _middleware = require("@verdaccio/middleware");
@@ -39,10 +41,13 @@ const debug = (0, _debug.default)('verdaccio:web:api:readme');
39
41
  const NOT_README_FOUND = 'ERROR: No README data found!';
40
42
  exports.NOT_README_FOUND = NOT_README_FOUND;
41
43
 
42
- function addReadmeWebApi(route, storage, auth) {
44
+ function addReadmeWebApi(storage, auth) {
43
45
  debug('initialized readme web api');
44
46
  const can = (0, _middleware.allow)(auth);
45
- route.get('/package/readme/(@:scope/)?:package/:version?', can('access'), function (req, res, next) {
47
+ const pkgRouter = (0, _express.Router)();
48
+ /* eslint new-cap: 0 */
49
+
50
+ pkgRouter.get('/package/readme/(@:scope/)?:package/:version?', can('access'), function (req, res, next) {
46
51
  debug('readme hit');
47
52
  const packageName = req.params.scope ? (0, _webUtils.addScope)(req.params.scope, req.params.package) : req.params.package;
48
53
  debug('readme name %o', packageName); // @ts-ignore
@@ -68,6 +73,7 @@ function addReadmeWebApi(route, storage, auth) {
68
73
  }
69
74
  });
70
75
  });
76
+ return pkgRouter;
71
77
  }
72
78
 
73
79
  var _default = addReadmeWebApi;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/readme.ts"],"names":["debug","NOT_README_FOUND","addReadmeWebApi","route","storage","auth","can","get","req","res","next","packageName","params","scope","package","getPackage","name","uplinksLook","callback","err","info","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","readme"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAIA;;AACA;;AACA;;AAIA;;;;AAMA,MAAMA,KAAK,GAAG,oBAAW,0BAAX,CAAd;AAEO,MAAMC,gBAAgB,GAAG,8BAAzB;;;AAEP,SAASC,eAAT,CAAyBC,KAAzB,EAAwCC,OAAxC,EAA0DC,IAA1D,EAA6E;AAC3EL,EAAAA,KAAK,CAAC,4BAAD,CAAL;AACA,QAAMM,GAAG,GAAG,uBAAMD,IAAN,CAAZ;AAEAF,EAAAA,KAAK,CAACI,GAAN,CACE,+CADF,EAEED,GAAG,CAAC,QAAD,CAFL,EAGE,UAAUE,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;AACjFV,IAAAA,KAAK,CAAC,YAAD,CAAL;AACA,UAAMW,WAAW,GAAGH,GAAG,CAACI,MAAJ,CAAWC,KAAX,GAChB,wBAASL,GAAG,CAACI,MAAJ,CAAWC,KAApB,EAA2BL,GAAG,CAACI,MAAJ,CAAWE,OAAtC,CADgB,GAEhBN,GAAG,CAACI,MAAJ,CAAWE,OAFf;AAGAd,IAAAA,KAAK,CAAC,gBAAD,EAAmBW,WAAnB,CAAL,CALiF,CAOjF;;AACAP,IAAAA,OAAO,CAACW,UAAR,CAAmB;AACjBC,MAAAA,IAAI,EAAEL,WADW;AAEjBM,MAAAA,WAAW,EAAE,IAFI;AAGjBT,MAAAA,GAHiB;AAIjBU,MAAAA,QAAQ,EAAE,UAAUC,GAAV,EAAeC,IAAf,EAA2B;AACnCpB,QAAAA,KAAK,CAAC,eAAD,EAAkBoB,IAAlB,aAAkBA,IAAlB,uBAAkBA,IAAI,CAAEJ,IAAxB,CAAL;;AACA,YAAIG,GAAJ,EAAS;AACP,iBAAOT,IAAI,CAACS,GAAD,CAAX;AACD;;AAEDV,QAAAA,GAAG,CAACY,GAAJ,CAAQC,kBAAYC,YAApB,EAAkCC,cAAQC,eAA1C;;AACA,YAAI;AACFf,UAAAA,IAAI,CAAC,2BAAYU,IAAI,CAACJ,IAAjB,EAAuBI,IAAI,CAACM,MAA5B,CAAD,CAAJ;AACD,SAFD,CAEE,MAAM;AACNhB,UAAAA,IAAI,CAAC,qBAAeT,gBAAf,CAAD,CAAJ;AACD;AACF;AAhBgB,KAAnB;AAkBD,GA7BH;AA+BD;;eAEcC,e","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { IAuth } 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 { Package } from '@verdaccio/types';\n\nimport { AuthorAvatar, addScope, parseReadme } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nexport type PackageExt = Package & { 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(route: Router, storage: Storage, auth: IAuth): void {\n debug('initialized readme web api');\n const can = allow(auth);\n\n route.get(\n '/package/readme/(@:scope/)?:package/:version?',\n can('access'),\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n debug('readme hit');\n const packageName = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : req.params.package;\n debug('readme name %o', packageName);\n\n // @ts-ignore\n storage.getPackage({\n name: packageName,\n uplinksLook: true,\n req,\n callback: function (err, info): void {\n debug('readme plg %o', info?.name);\n if (err) {\n return next(err);\n }\n\n res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);\n try {\n next(parseReadme(info.name, info.readme));\n } catch {\n next(sanitizyReadme(NOT_README_FOUND));\n }\n },\n });\n }\n );\n}\n\nexport default addReadmeWebApi;\n"],"file":"readme.js"}
1
+ {"version":3,"sources":["../../src/api/readme.ts"],"names":["debug","NOT_README_FOUND","addReadmeWebApi","storage","auth","can","pkgRouter","get","req","res","next","packageName","params","scope","package","getPackage","name","uplinksLook","callback","err","info","set","HEADER_TYPE","CONTENT_TYPE","HEADERS","TEXT_PLAIN_UTF8","readme"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAGA;;AACA;;AACA;;AAIA;;;;AAMA,MAAMA,KAAK,GAAG,oBAAW,0BAAX,CAAd;AAEO,MAAMC,gBAAgB,GAAG,8BAAzB;;;AAEP,SAASC,eAAT,CAAyBC,OAAzB,EAA2CC,IAA3C,EAAgE;AAC9DJ,EAAAA,KAAK,CAAC,4BAAD,CAAL;AACA,QAAMK,GAAG,GAAG,uBAAMD,IAAN,CAAZ;AACA,QAAME,SAAS,GAAG,sBAAlB;AAA4B;;AAE5BA,EAAAA,SAAS,CAACC,GAAV,CACE,+CADF,EAEEF,GAAG,CAAC,QAAD,CAFL,EAGE,UAAUG,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;AACjFV,IAAAA,KAAK,CAAC,YAAD,CAAL;AACA,UAAMW,WAAW,GAAGH,GAAG,CAACI,MAAJ,CAAWC,KAAX,GAChB,wBAASL,GAAG,CAACI,MAAJ,CAAWC,KAApB,EAA2BL,GAAG,CAACI,MAAJ,CAAWE,OAAtC,CADgB,GAEhBN,GAAG,CAACI,MAAJ,CAAWE,OAFf;AAGAd,IAAAA,KAAK,CAAC,gBAAD,EAAmBW,WAAnB,CAAL,CALiF,CAOjF;;AACAR,IAAAA,OAAO,CAACY,UAAR,CAAmB;AACjBC,MAAAA,IAAI,EAAEL,WADW;AAEjBM,MAAAA,WAAW,EAAE,IAFI;AAGjBT,MAAAA,GAHiB;AAIjBU,MAAAA,QAAQ,EAAE,UAAUC,GAAV,EAAeC,IAAf,EAA2B;AACnCpB,QAAAA,KAAK,CAAC,eAAD,EAAkBoB,IAAlB,aAAkBA,IAAlB,uBAAkBA,IAAI,CAAEJ,IAAxB,CAAL;;AACA,YAAIG,GAAJ,EAAS;AACP,iBAAOT,IAAI,CAACS,GAAD,CAAX;AACD;;AAEDV,QAAAA,GAAG,CAACY,GAAJ,CAAQC,kBAAYC,YAApB,EAAkCC,cAAQC,eAA1C;;AACA,YAAI;AACFf,UAAAA,IAAI,CAAC,2BAAYU,IAAI,CAACJ,IAAjB,EAAuBI,IAAI,CAACM,MAA5B,CAAD,CAAJ;AACD,SAFD,CAEE,MAAM;AACNhB,UAAAA,IAAI,CAAC,qBAAeT,gBAAf,CAAD,CAAJ;AACD;AACF;AAhBgB,KAAnB;AAkBD,GA7BH;AA+BA,SAAOK,SAAP;AACD;;eAEcJ,e","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { IAuth } 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 { Package } from '@verdaccio/types';\n\nimport { AuthorAvatar, addScope, parseReadme } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nexport type PackageExt = Package & { 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: IAuth): 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 function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n debug('readme hit');\n const packageName = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : req.params.package;\n debug('readme name %o', packageName);\n\n // @ts-ignore\n storage.getPackage({\n name: packageName,\n uplinksLook: true,\n req,\n callback: function (err, info): void {\n debug('readme plg %o', info?.name);\n if (err) {\n return next(err);\n }\n\n res.set(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8);\n try {\n next(parseReadme(info.name, info.readme));\n } catch {\n next(sanitizyReadme(NOT_README_FOUND));\n }\n },\n });\n }\n );\n return pkgRouter;\n}\n\nexport default addReadmeWebApi;\n"],"file":"readme.js"}
@@ -1,5 +1,5 @@
1
1
  import { Router } from 'express';
2
2
  import { IAuth } from '@verdaccio/auth';
3
3
  import { Storage } from '@verdaccio/store';
4
- declare function addSearchWebApi(route: Router, storage: Storage, auth: IAuth): void;
4
+ declare function addSearchWebApi(storage: Storage, auth: IAuth): Router;
5
5
  export default addSearchWebApi;
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _debug = _interopRequireDefault(require("debug"));
9
9
 
10
+ var _express = require("express");
11
+
10
12
  var _core = require("@verdaccio/core");
11
13
 
12
14
  var _store = require("@verdaccio/store");
@@ -15,7 +17,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
15
17
 
16
18
  const debug = (0, _debug.default)('verdaccio:web:api:search');
17
19
 
18
- function addSearchWebApi(route, storage, auth) {
20
+ function addSearchWebApi(storage, auth) {
21
+ const router = (0, _express.Router)();
22
+ /* eslint new-cap: 0 */
23
+
19
24
  const getPackageInfo = async function (name, remoteUser) {
20
25
  return new Promise((resolve, reject) => {
21
26
  debug('searching for %o', name);
@@ -55,7 +60,7 @@ function addSearchWebApi(route, storage, auth) {
55
60
  });
56
61
  };
57
62
 
58
- route.get('/search/:anything', async function (req, res, next) {
63
+ router.get('/search/:anything', async function (req, res, next) {
59
64
  const results = _store.SearchInstance.query(req.params.anything);
60
65
 
61
66
  debug('search results %o', results);
@@ -78,6 +83,7 @@ function addSearchWebApi(route, storage, auth) {
78
83
  next([]);
79
84
  }
80
85
  });
86
+ return router;
81
87
  }
82
88
 
83
89
  var _default = addSearchWebApi;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/search.ts"],"names":["debug","addSearchWebApi","route","storage","auth","getPackageInfo","name","remoteUser","Promise","resolve","reject","getPackage","uplinksLook","callback","err","pkg","message","allow_access","packageName","allowed","versions","DIST_TAGS","latest","get","req","res","next","results","SearchInstance","query","params","anything","length","packages","result","ref","remote_user","push"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { DIST_TAGS } from '@verdaccio/core';\nimport { SearchInstance } from '@verdaccio/store';\nimport { Storage } from '@verdaccio/store';\nimport { Package } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction addSearchWebApi(route: Router, storage: Storage, auth: IAuth): void {\n const getPackageInfo = async function (name, remoteUser): Promise<any> {\n return new Promise((resolve, reject) => {\n debug('searching for %o', name);\n try {\n // @ts-ignore\n storage.getPackage({\n name,\n uplinksLook: false,\n callback: (err, pkg: Package): void => {\n debug('callback get package err %o', err?.message);\n if (!err && pkg) {\n debug('valid package %o', pkg?.name);\n auth.allow_access(\n { packageName: pkg.name },\n remoteUser,\n function (err, allowed): void {\n debug('is allowed %o', allowed);\n if (err || !allowed) {\n debug('deny access');\n reject(err);\n return;\n }\n debug('access succeed');\n resolve(pkg.versions[pkg[DIST_TAGS].latest]);\n }\n );\n } else {\n reject(err);\n }\n },\n });\n } catch (err: any) {\n reject(err);\n }\n });\n };\n\n route.get(\n '/search/:anything',\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const results = SearchInstance.query(req.params.anything);\n debug('search results %o', results);\n if (results.length > 0) {\n let packages: Package[] = [];\n for (let result of results) {\n try {\n const pkg = await getPackageInfo(result.ref, req.remote_user);\n debug('package found %o', result.ref);\n packages.push(pkg);\n } catch (err: any) {\n debug('search for %o failed err %o', result.ref, err?.message);\n }\n }\n next(packages);\n } else {\n next([]);\n }\n }\n );\n}\n\nexport default addSearchWebApi;\n"],"file":"search.js"}
1
+ {"version":3,"sources":["../../src/api/search.ts"],"names":["debug","addSearchWebApi","storage","auth","router","getPackageInfo","name","remoteUser","Promise","resolve","reject","getPackage","uplinksLook","callback","err","pkg","message","allow_access","packageName","allowed","versions","DIST_TAGS","latest","get","req","res","next","results","SearchInstance","query","params","anything","length","packages","result","ref","remote_user","push"],"mappings":";;;;;;;AAAA;;AACA;;AAGA;;AACA;;;;AAMA,MAAMA,KAAK,GAAG,oBAAW,0BAAX,CAAd;;AAEA,SAASC,eAAT,CAAyBC,OAAzB,EAA2CC,IAA3C,EAAgE;AAC9D,QAAMC,MAAM,GAAG,sBAAf;AAAyB;;AACzB,QAAMC,cAAc,GAAG,gBAAgBC,IAAhB,EAAsBC,UAAtB,EAAgD;AACrE,WAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAAqB;AACtCV,MAAAA,KAAK,CAAC,kBAAD,EAAqBM,IAArB,CAAL;;AACA,UAAI;AACF;AACAJ,QAAAA,OAAO,CAACS,UAAR,CAAmB;AACjBL,UAAAA,IADiB;AAEjBM,UAAAA,WAAW,EAAE,KAFI;AAGjBC,UAAAA,QAAQ,EAAE,CAACC,GAAD,EAAMC,GAAN,KAA6B;AACrCf,YAAAA,KAAK,CAAC,6BAAD,EAAgCc,GAAhC,aAAgCA,GAAhC,uBAAgCA,GAAG,CAAEE,OAArC,CAAL;;AACA,gBAAI,CAACF,GAAD,IAAQC,GAAZ,EAAiB;AACff,cAAAA,KAAK,CAAC,mBAAD,EAAsBe,GAAtB,aAAsBA,GAAtB,uBAAsBA,GAAG,CAAET,IAA3B,CAAL;AACAH,cAAAA,IAAI,CAACc,YAAL,CACE;AAAEC,gBAAAA,WAAW,EAAEH,GAAG,CAACT;AAAnB,eADF,EAEEC,UAFF,EAGE,UAAUO,GAAV,EAAeK,OAAf,EAA8B;AAC5BnB,gBAAAA,KAAK,CAAC,eAAD,EAAkBmB,OAAlB,CAAL;;AACA,oBAAIL,GAAG,IAAI,CAACK,OAAZ,EAAqB;AACnBnB,kBAAAA,KAAK,CAAC,aAAD,CAAL;AACAU,kBAAAA,MAAM,CAACI,GAAD,CAAN;AACA;AACD;;AACDd,gBAAAA,KAAK,CAAC,gBAAD,CAAL;AACAS,gBAAAA,OAAO,CAACM,GAAG,CAACK,QAAJ,CAAaL,GAAG,CAACM,eAAD,CAAH,CAAeC,MAA5B,CAAD,CAAP;AACD,eAZH;AAcD,aAhBD,MAgBO;AACLZ,cAAAA,MAAM,CAACI,GAAD,CAAN;AACD;AACF;AAxBgB,SAAnB;AA0BD,OA5BD,CA4BE,OAAOA,GAAP,EAAiB;AACjBJ,QAAAA,MAAM,CAACI,GAAD,CAAN;AACD;AACF,KAjCM,CAAP;AAkCD,GAnCD;;AAqCAV,EAAAA,MAAM,CAACmB,GAAP,CACE,mBADF,EAEE,gBACEC,GADF,EAEEC,GAFF,EAGEC,IAHF,EAIiB;AACf,UAAMC,OAAO,GAAGC,sBAAeC,KAAf,CAAqBL,GAAG,CAACM,MAAJ,CAAWC,QAAhC,CAAhB;;AACA/B,IAAAA,KAAK,CAAC,mBAAD,EAAsB2B,OAAtB,CAAL;;AACA,QAAIA,OAAO,CAACK,MAAR,GAAiB,CAArB,EAAwB;AACtB,UAAIC,QAAmB,GAAG,EAA1B;;AACA,WAAK,IAAIC,MAAT,IAAmBP,OAAnB,EAA4B;AAC1B,YAAI;AACF,gBAAMZ,GAAG,GAAG,MAAMV,cAAc,CAAC6B,MAAM,CAACC,GAAR,EAAaX,GAAG,CAACY,WAAjB,CAAhC;AACApC,UAAAA,KAAK,CAAC,kBAAD,EAAqBkC,MAAM,CAACC,GAA5B,CAAL;AACAF,UAAAA,QAAQ,CAACI,IAAT,CAActB,GAAd;AACD,SAJD,CAIE,OAAOD,GAAP,EAAiB;AACjBd,UAAAA,KAAK,CAAC,6BAAD,EAAgCkC,MAAM,CAACC,GAAvC,EAA4CrB,GAA5C,aAA4CA,GAA5C,uBAA4CA,GAAG,CAAEE,OAAjD,CAAL;AACD;AACF;;AACDU,MAAAA,IAAI,CAACO,QAAD,CAAJ;AACD,KAZD,MAYO;AACLP,MAAAA,IAAI,CAAC,EAAD,CAAJ;AACD;AACF,GAxBH;AA0BA,SAAOtB,MAAP;AACD;;eAEcH,e","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { DIST_TAGS } from '@verdaccio/core';\nimport { SearchInstance } from '@verdaccio/store';\nimport { Storage } from '@verdaccio/store';\nimport { Package } from '@verdaccio/types';\n\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction addSearchWebApi(storage: Storage, auth: IAuth): Router {\n const router = Router(); /* eslint new-cap: 0 */\n const getPackageInfo = async function (name, remoteUser): Promise<any> {\n return new Promise((resolve, reject) => {\n debug('searching for %o', name);\n try {\n // @ts-ignore\n storage.getPackage({\n name,\n uplinksLook: false,\n callback: (err, pkg: Package): void => {\n debug('callback get package err %o', err?.message);\n if (!err && pkg) {\n debug('valid package %o', pkg?.name);\n auth.allow_access(\n { packageName: pkg.name },\n remoteUser,\n function (err, allowed): void {\n debug('is allowed %o', allowed);\n if (err || !allowed) {\n debug('deny access');\n reject(err);\n return;\n }\n debug('access succeed');\n resolve(pkg.versions[pkg[DIST_TAGS].latest]);\n }\n );\n } else {\n reject(err);\n }\n },\n });\n } catch (err: any) {\n reject(err);\n }\n });\n };\n\n router.get(\n '/search/:anything',\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const results = SearchInstance.query(req.params.anything);\n debug('search results %o', results);\n if (results.length > 0) {\n let packages: Package[] = [];\n for (let result of results) {\n try {\n const pkg = await getPackageInfo(result.ref, req.remote_user);\n debug('package found %o', result.ref);\n packages.push(pkg);\n } catch (err: any) {\n debug('search for %o failed err %o', result.ref, err?.message);\n }\n }\n next(packages);\n } else {\n next([]);\n }\n }\n );\n return router;\n}\n\nexport default addSearchWebApi;\n"],"file":"search.js"}
@@ -14,5 +14,5 @@ export declare type PackageExt = Package & {
14
14
  export declare type $SidebarPackage = Package & {
15
15
  latest: Version;
16
16
  };
17
- declare function addSidebarWebApi(route: Router, config: Config, storage: Storage, auth: IAuth): void;
17
+ declare function addSidebarWebApi(config: Config, storage: Storage, auth: IAuth): Router;
18
18
  export default addSidebarWebApi;
@@ -25,6 +25,8 @@ exports.default = void 0;
25
25
 
26
26
  var _debug = _interopRequireDefault(require("debug"));
27
27
 
28
+ var _express = require("express");
29
+
28
30
  var _lodash = _interopRequireDefault(require("lodash"));
29
31
 
30
32
  var _core = require("@verdaccio/core");
@@ -41,11 +43,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
41
43
 
42
44
  const debug = (0, _debug.default)('verdaccio:web:api:sidebar');
43
45
 
44
- function addSidebarWebApi(route, config, storage, auth) {
46
+ function addSidebarWebApi(config, storage, auth) {
45
47
  debug('initialized sidebar web api');
48
+ const router = (0, _express.Router)();
49
+ /* eslint new-cap: 0 */
50
+
46
51
  const can = (0, _middleware.allow)(auth); // Get package readme
47
52
 
48
- route.get('/sidebar/(@:scope/)?:package', can('access'), function (req, res, next) {
53
+ router.get('/sidebar/(@:scope/)?:package', can('access'), function (req, res, next) {
49
54
  const packageName = req.params.scope ? (0, _webUtils.addScope)(req.params.scope, req.params.package) : req.params.package;
50
55
  storage.getPackage({
51
56
  name: packageName,
@@ -84,6 +89,7 @@ function addSidebarWebApi(route, config, storage, auth) {
84
89
  }
85
90
  });
86
91
  });
92
+ return router;
87
93
  }
88
94
 
89
95
  var _default = addSidebarWebApi;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/sidebar.ts"],"names":["debug","addSidebarWebApi","route","config","storage","auth","can","get","req","res","next","packageName","params","scope","package","getPackage","name","uplinksLook","keepUpLinkData","callback","err","info","_","isNil","v","query","sideBarInfo","clone","versions","protocol","headers","host","hostname","url_prefix","latest","author","DIST_TAGS","authorAvatar","web","gravatar","status","HTTP_STATUS","NOT_FOUND","end"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;;AAGA;;AACA;;AAEA;;AAEA;;AAEA;;;;AAOA,MAAMA,KAAK,GAAG,oBAAW,2BAAX,CAAd;;AAEA,SAASC,gBAAT,CAA0BC,KAA1B,EAAyCC,MAAzC,EAAyDC,OAAzD,EAA2EC,IAA3E,EAA8F;AAC5FL,EAAAA,KAAK,CAAC,6BAAD,CAAL;AACA,QAAMM,GAAG,GAAG,uBAAMD,IAAN,CAAZ,CAF4F,CAG5F;;AACAH,EAAAA,KAAK,CAACK,GAAN,CACE,8BADF,EAEED,GAAG,CAAC,QAAD,CAFL,EAGE,UAAUE,GAAV,EAA+BC,GAA/B,EAAqDC,IAArD,EAAmF;AACjF,UAAMC,WAAmB,GAAGH,GAAG,CAACI,MAAJ,CAAWC,KAAX,GACxB,wBAASL,GAAG,CAACI,MAAJ,CAAWC,KAApB,EAA2BL,GAAG,CAACI,MAAJ,CAAWE,OAAtC,CADwB,GAExBN,GAAG,CAACI,MAAJ,CAAWE,OAFf;AAIAV,IAAAA,OAAO,CAACW,UAAR,CAAmB;AACjBC,MAAAA,IAAI,EAAEL,WADW;AAEjBM,MAAAA,WAAW,EAAE,IAFI;AAGjBC,MAAAA,cAAc,EAAE,IAHC;AAIjBV,MAAAA,GAJiB;AAKjBW,MAAAA,QAAQ,EAAE,UAAUC,GAAV,EAAsBC,IAAtB,EAAmD;AAC3D,YAAIC,gBAAEC,KAAF,CAAQH,GAAR,CAAJ,EAAkB;AAChB,gBAAM;AAAEI,YAAAA;AAAF,cAAQhB,GAAG,CAACiB,KAAlB;;AACA,cAAIC,WAAW,GAAGJ,gBAAEK,KAAF,CAAQN,IAAR,CAAlB;;AACAK,UAAAA,WAAW,CAACE,QAAZ,GAAuB,kDACrBP,IADqB,EAErB;AAAEQ,YAAAA,QAAQ,EAAErB,GAAG,CAACqB,QAAhB;AAA0BC,YAAAA,OAAO,EAAEtB,GAAG,CAACsB,OAAvC;AAAuDC,YAAAA,IAAI,EAAEvB,GAAG,CAACwB;AAAjE,WAFqB,EAGrB7B,MAAM,CAAC8B,UAHc,EAIrBL,QAJF;;AAKA,cAAI,OAAOJ,CAAP,KAAa,QAAb,IAAyB,2BAAeH,IAAf,EAAqBG,CAArB,CAA7B,EAAsD;AACpDE,YAAAA,WAAW,CAACQ,MAAZ,GAAqBR,WAAW,CAACE,QAAZ,CAAqBJ,CAArB,CAArB;AACAE,YAAAA,WAAW,CAACQ,MAAZ,CAAmBC,MAAnB,GAA4B,yBAAaT,WAAW,CAACQ,MAAZ,CAAmBC,MAAhC,CAA5B;AACD,WAHD,MAGO;AACLT,YAAAA,WAAW,CAACQ,MAAZ,GAAqBR,WAAW,CAACE,QAAZ,CAAqBP,IAAI,CAACe,eAAD,CAAJ,CAAgBF,MAArC,CAArB;AACAR,YAAAA,WAAW,CAACQ,MAAZ,CAAmBC,MAAnB,GAA4B,yBAAaT,WAAW,CAACQ,MAAZ,CAAmBC,MAAhC,CAA5B;AACD;;AACDT,UAAAA,WAAW,GAAG,gCAAiB,CAAC,QAAD,EAAW,cAAX,EAA2B,MAA3B,EAAmC,MAAnC,CAAjB,EAA6DA,WAA7D,CAAd;AACA,gBAAMW,YAAY,GAAGlC,MAAM,CAACmC,GAAP,GACjB,+BAAmBZ,WAAnB,EAAgCvB,MAAM,CAACmC,GAAP,CAAWC,QAA3C,CADiB,GAEjB,+BAAmBb,WAAnB,CAFJ;AAGAhB,UAAAA,IAAI,CAAC2B,YAAD,CAAJ;AACD,SApBD,MAoBO;AACL5B,UAAAA,GAAG,CAAC+B,MAAJ,CAAWC,kBAAYC,SAAvB;AACAjC,UAAAA,GAAG,CAACkC,GAAJ;AACD;AACF;AA9BgB,KAAnB;AAgCD,GAxCH;AA0CD;;eAEc1C,gB","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { DIST_TAGS, HTTP_STATUS } from '@verdaccio/core';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { convertDistRemoteToLocalTarballUrls } from '@verdaccio/tarball';\nimport { Config, Package, Version } from '@verdaccio/types';\nimport { addGravatarSupport, formatAuthor, isVersionValid } from '@verdaccio/utils';\n\nimport { AuthorAvatar, addScope, deleteProperties } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nexport type PackageExt = Package & { author: AuthorAvatar; dist?: { tarball: string } };\n\nexport type $SidebarPackage = Package & { latest: Version };\nconst debug = buildDebug('verdaccio:web:api:sidebar');\n\nfunction addSidebarWebApi(route: Router, config: Config, storage: Storage, auth: IAuth): void {\n debug('initialized sidebar web api');\n const can = allow(auth);\n // Get package readme\n route.get(\n '/sidebar/(@:scope/)?:package',\n can('access'),\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n const packageName: string = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : req.params.package;\n\n storage.getPackage({\n name: packageName,\n uplinksLook: true,\n keepUpLinkData: true,\n req,\n callback: function (err: Error, info: $SidebarPackage): void {\n if (_.isNil(err)) {\n const { v } = req.query;\n let sideBarInfo = _.clone(info);\n sideBarInfo.versions = convertDistRemoteToLocalTarballUrls(\n info,\n { protocol: req.protocol, headers: req.headers as any, host: req.hostname },\n config.url_prefix\n ).versions;\n if (typeof v === 'string' && isVersionValid(info, v)) {\n sideBarInfo.latest = sideBarInfo.versions[v];\n sideBarInfo.latest.author = formatAuthor(sideBarInfo.latest.author);\n } else {\n sideBarInfo.latest = sideBarInfo.versions[info[DIST_TAGS].latest];\n sideBarInfo.latest.author = formatAuthor(sideBarInfo.latest.author);\n }\n sideBarInfo = deleteProperties(['readme', '_attachments', '_rev', 'name'], sideBarInfo);\n const authorAvatar = config.web\n ? addGravatarSupport(sideBarInfo, config.web.gravatar)\n : addGravatarSupport(sideBarInfo);\n next(authorAvatar);\n } else {\n res.status(HTTP_STATUS.NOT_FOUND);\n res.end();\n }\n },\n });\n }\n );\n}\n\nexport default addSidebarWebApi;\n"],"file":"sidebar.js"}
1
+ {"version":3,"sources":["../../src/api/sidebar.ts"],"names":["debug","addSidebarWebApi","config","storage","auth","router","can","get","req","res","next","packageName","params","scope","package","getPackage","name","uplinksLook","keepUpLinkData","callback","err","info","_","isNil","v","query","sideBarInfo","clone","versions","protocol","headers","host","hostname","url_prefix","latest","author","DIST_TAGS","authorAvatar","web","gravatar","status","HTTP_STATUS","NOT_FOUND","end"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { DIST_TAGS, HTTP_STATUS } from '@verdaccio/core';\nimport { $NextFunctionVer, $RequestExtend, $ResponseExtend, allow } from '@verdaccio/middleware';\nimport { Storage } from '@verdaccio/store';\nimport { convertDistRemoteToLocalTarballUrls } from '@verdaccio/tarball';\nimport { Config, Package, Version } from '@verdaccio/types';\nimport { addGravatarSupport, formatAuthor, isVersionValid } from '@verdaccio/utils';\n\nimport { AuthorAvatar, addScope, deleteProperties } from '../utils/web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nexport type PackageExt = Package & { author: AuthorAvatar; dist?: { tarball: string } };\n\nexport type $SidebarPackage = Package & { latest: Version };\nconst debug = buildDebug('verdaccio:web:api:sidebar');\n\nfunction addSidebarWebApi(config: Config, storage: Storage, auth: IAuth): Router {\n debug('initialized sidebar web api');\n const router = Router(); /* eslint new-cap: 0 */\n const can = allow(auth);\n // Get package readme\n router.get(\n '/sidebar/(@:scope/)?:package',\n can('access'),\n function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n const packageName: string = req.params.scope\n ? addScope(req.params.scope, req.params.package)\n : req.params.package;\n\n storage.getPackage({\n name: packageName,\n uplinksLook: true,\n keepUpLinkData: true,\n req,\n callback: function (err: Error, info: $SidebarPackage): void {\n if (_.isNil(err)) {\n const { v } = req.query;\n let sideBarInfo = _.clone(info);\n sideBarInfo.versions = convertDistRemoteToLocalTarballUrls(\n info,\n { protocol: req.protocol, headers: req.headers as any, host: req.hostname },\n config.url_prefix\n ).versions;\n if (typeof v === 'string' && isVersionValid(info, v)) {\n sideBarInfo.latest = sideBarInfo.versions[v];\n sideBarInfo.latest.author = formatAuthor(sideBarInfo.latest.author);\n } else {\n sideBarInfo.latest = sideBarInfo.versions[info[DIST_TAGS].latest];\n sideBarInfo.latest.author = formatAuthor(sideBarInfo.latest.author);\n }\n sideBarInfo = deleteProperties(['readme', '_attachments', '_rev', 'name'], sideBarInfo);\n const authorAvatar = config.web\n ? addGravatarSupport(sideBarInfo, config.web.gravatar)\n : addGravatarSupport(sideBarInfo);\n next(authorAvatar);\n } else {\n res.status(HTTP_STATUS.NOT_FOUND);\n res.end();\n }\n },\n });\n }\n );\n\n return router;\n}\n\nexport default addSidebarWebApi;\n"],"file":"sidebar.js"}
@@ -1,5 +1,5 @@
1
1
  import { Router } from 'express';
2
2
  import { IAuth } from '@verdaccio/auth';
3
3
  import { Config } from '@verdaccio/types';
4
- declare function addUserAuthApi(route: Router, auth: IAuth, config: Config): void;
4
+ declare function addUserAuthApi(auth: IAuth, config: Config): Router;
5
5
  export default addUserAuthApi;
package/build/api/user.js CHANGED
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _debug = _interopRequireDefault(require("debug"));
9
9
 
10
+ var _express = require("express");
11
+
10
12
  var _lodash = _interopRequireDefault(require("lodash"));
11
13
 
12
14
  var _core = require("@verdaccio/core");
@@ -17,9 +19,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
17
19
 
18
20
  const debug = (0, _debug.default)('verdaccio:web:api:user');
19
21
 
20
- function addUserAuthApi(route, auth, config) {
22
+ function addUserAuthApi(auth, config) {
21
23
  var _config$flags;
22
24
 
25
+ const route = (0, _express.Router)();
26
+ /* eslint new-cap: 0 */
27
+
23
28
  route.post('/login', function (req, res, next) {
24
29
  const {
25
30
  username,
@@ -74,6 +79,8 @@ function addUserAuthApi(route, auth, config) {
74
79
  }
75
80
  });
76
81
  }
82
+
83
+ return route;
77
84
  }
78
85
 
79
86
  var _default = addUserAuthApi;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/user.ts"],"names":["debug","addUserAuthApi","route","auth","config","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","new","old","isUpdated","ok","getInternalError","INTERNAL_SERVER_ERROR","BAD_REQUEST","APP_ERROR","PASSWORD_VALIDATION"],"mappings":"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","sourcesContent":["import buildDebug from 'debug';\nimport { Request, Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { API_ERROR, APP_ERROR, HTTP_STATUS, errorUtils } from '@verdaccio/core';\nimport { Config, JWTSignOptions, RemoteUser } from '@verdaccio/types';\nimport { validatePassword } from '@verdaccio/utils';\n\nimport { $NextFunctionVer } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:user');\n\nfunction addUserAuthApi(route: Router, auth: IAuth, config: Config): void {\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(username, password, async (err, 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;\n const jWTSignOptions: JWTSignOptions = config.security.web.sign;\n\n next({\n token: await auth.jwtEncrypt(user, jWTSignOptions),\n username: req.remote_user.name,\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 (validatePassword(password.new) === false) {\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\nexport default addUserAuthApi;\n"],"file":"user.js"}
1
+ {"version":3,"sources":["../../src/api/user.ts"],"names":["debug","addUserAuthApi","auth","config","route","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","new","old","isUpdated","ok","getInternalError","INTERNAL_SERVER_ERROR","BAD_REQUEST","APP_ERROR","PASSWORD_VALIDATION"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAGA;;AAEA;;;;AAIA,MAAMA,KAAK,GAAG,oBAAW,wBAAX,CAAd;;AAEA,SAASC,cAAT,CAAwBC,IAAxB,EAAqCC,MAArC,EAA6D;AAAA;;AAC3D,QAAMC,KAAK,GAAG,sBAAd;AAAwB;;AACxBA,EAAAA,KAAK,CAACC,IAAN,CAAW,QAAX,EAAqB,UAAUC,GAAV,EAAwBC,GAAxB,EAAuCC,IAAvC,EAAqE;AACxF,UAAM;AAAEC,MAAAA,QAAF;AAAYC,MAAAA;AAAZ,QAAyBJ,GAAG,CAACK,IAAnC;AACAX,IAAAA,KAAK,CAAC,iBAAD,EAAoBS,QAApB,CAAL;AACAP,IAAAA,IAAI,CAACU,YAAL,CAAkBH,QAAlB,EAA4BC,QAA5B,EAAsC,OAAOG,GAAP,EAAYC,IAAZ,KAAgD;AACpF,UAAID,GAAJ,EAAS;AACP,cAAME,SAAS,GAAGF,GAAG,CAACG,OAAJ,GAAcC,kBAAYC,YAA1B,GAAyCD,kBAAYE,cAAvE;AACAnB,QAAAA,KAAK,CAAC,uBAAD,EAA0Be,SAA1B,CAAL;AACAP,QAAAA,IAAI,CAACY,iBAAWC,OAAX,CAAmBN,SAAnB,EAA8BF,GAAG,CAACG,OAAlC,CAAD,CAAJ;AACD,OAJD,MAIO;AACLV,QAAAA,GAAG,CAACgB,WAAJ,GAAkBR,IAAlB;AACA,cAAMS,cAA8B,GAAGpB,MAAM,CAACqB,QAAP,CAAgBC,GAAhB,CAAoBC,IAA3D;AAEAlB,QAAAA,IAAI,CAAC;AACHmB,UAAAA,KAAK,EAAE,MAAMzB,IAAI,CAAC0B,UAAL,CAAgBd,IAAhB,EAAsBS,cAAtB,CADV;AAEHd,UAAAA,QAAQ,EAAEH,GAAG,CAACgB,WAAJ,CAAgBO;AAFvB,SAAD,CAAJ;AAID;AACF,KAdD;AAeD,GAlBD;;AAoBA,MAAI,CAAA1B,MAAM,SAAN,IAAAA,MAAM,WAAN,6BAAAA,MAAM,CAAE2B,KAAR,gEAAeC,cAAf,MAAkC,IAAtC,EAA4C;AAC1C3B,IAAAA,KAAK,CAAC4B,GAAN,CACE,iBADF,EAEE,UAAU1B,GAAV,EAAwBC,GAAxB,EAAuCC,IAAvC,EAAqE;AACnE,UAAIyB,gBAAEC,KAAF,CAAQ5B,GAAG,CAACgB,WAAJ,CAAgBO,IAAxB,CAAJ,EAAmC;AACjCtB,QAAAA,GAAG,CAAC4B,MAAJ,CAAWlB,kBAAYC,YAAvB;AACA,eAAOV,IAAI,CAAC;AACV;AACAQ,UAAAA,OAAO,EAAEoB,gBAAUC;AAFT,SAAD,CAAX;AAID;;AAED,YAAM;AAAE3B,QAAAA;AAAF,UAAeJ,GAAG,CAACK,IAAzB;AACA,YAAM;AAAEkB,QAAAA;AAAF,UAAWvB,GAAG,CAACgB,WAArB;;AAEA,UAAI,6BAAiBZ,QAAQ,CAAC4B,GAA1B,MAAmC,KAAvC,EAA8C;AAC5CpC,QAAAA,IAAI,CAAC6B,cAAL,CACEF,IADF,EAEEnB,QAAQ,CAAC6B,GAFX,EAGE7B,QAAQ,CAAC4B,GAHX,EAIE,CAACzB,GAAD,EAAM2B,SAAN,KAA0B;AACxB,cAAIP,gBAAEC,KAAF,CAAQrB,GAAR,KAAgB2B,SAApB,EAA+B;AAC7BhC,YAAAA,IAAI,CAAC;AACHiC,cAAAA,EAAE,EAAE;AADD,aAAD,CAAJ;AAGD,WAJD,MAIO;AACL,mBAAOjC,IAAI,CAACY,iBAAWsB,gBAAX,CAA4BN,gBAAUO,qBAAtC,CAAD,CAAX;AACD;AACF,SAZH;AAcD,OAfD,MAeO;AACL,eAAOnC,IAAI,CAACY,iBAAWC,OAAX,CAAmBJ,kBAAY2B,WAA/B,EAA4CC,gBAAUC,mBAAtD,CAAD,CAAX;AACD;AACF,KAhCH;AAkCD;;AAED,SAAO1C,KAAP;AACD;;eAEcH,c","sourcesContent":["import buildDebug from 'debug';\nimport { Request, Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { API_ERROR, APP_ERROR, HTTP_STATUS, errorUtils } from '@verdaccio/core';\nimport { Config, JWTSignOptions, RemoteUser } from '@verdaccio/types';\nimport { validatePassword } from '@verdaccio/utils';\n\nimport { $NextFunctionVer } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:user');\n\nfunction addUserAuthApi(auth: IAuth, 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(username, password, async (err, 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;\n const jWTSignOptions: JWTSignOptions = config.security.web.sign;\n\n next({\n token: await auth.jwtEncrypt(user, jWTSignOptions),\n username: req.remote_user.name,\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 (validatePassword(password.new) === false) {\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"],"file":"user.js"}
@@ -13,17 +13,7 @@ var _middleware = require("@verdaccio/middleware");
13
13
 
14
14
  var _store = require("@verdaccio/store");
15
15
 
16
- var _package = _interopRequireDefault(require("../api/package"));
17
-
18
- var _readme = _interopRequireDefault(require("../api/readme"));
19
-
20
- var _search = _interopRequireDefault(require("../api/search"));
21
-
22
- var _sidebar = _interopRequireDefault(require("../api/sidebar"));
23
-
24
- var _user = _interopRequireDefault(require("../api/user"));
25
-
26
- var _webUtils = require("../utils/web-utils");
16
+ var _api = _interopRequireDefault(require("../api"));
27
17
 
28
18
  var _security = require("./security");
29
19
 
@@ -46,19 +36,7 @@ function webAPI(config, auth, storage) {
46
36
  }));
47
37
  route.use(auth.webUIJWTmiddleware());
48
38
  route.use(_security.setSecurityWebHeaders);
49
- (0, _package.default)(route, storage, auth, config);
50
- (0, _readme.default)(route, storage, auth);
51
- (0, _sidebar.default)(route, config, storage, auth);
52
- (0, _search.default)(route, storage, auth);
53
-
54
- if ((0, _webUtils.hasLogin)(config)) {
55
- (0, _user.default)(route, auth, config);
56
- } // What are you looking for? logout? client side will remove token when user click logout,
57
- // or it will auto expire after 24 hours.
58
- // This token is different with the token send to npm client.
59
- // With JWT you will be able to setup expire tokens.
60
-
61
-
39
+ route.use((0, _api.default)(auth, storage, config));
62
40
  return route;
63
41
  }
64
42
  //# sourceMappingURL=web-api.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/middleware/web-api.ts"],"names":["webAPI","config","auth","storage","route","SearchInstance","configureStorage","param","validatePackage","validateName","use","bodyParser","urlencoded","extended","webUIJWTmiddleware","setSecurityWebHeaders"],"mappings":";;;;;;;AAAA;;AACA;;AAGA;;AACA;;AAIA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;AAEO,SAASA,MAAT,CAAgBC,MAAhB,EAAgCC,IAAhC,EAA6CC,OAA7C,EAAuE;AAC5E;AACA,QAAMC,KAAK,GAAG,sBAAd;;AACAC,wBAAeC,gBAAf,CAAgCH,OAAhC,EAH4E,CAK5E;AACA;;;AACAC,EAAAA,KAAK,CAACG,KAAN,CAAY,SAAZ,EAAuBC,2BAAvB;AACAJ,EAAAA,KAAK,CAACG,KAAN,CAAY,UAAZ,EAAwBE,wBAAxB;AACAL,EAAAA,KAAK,CAACG,KAAN,CAAY,SAAZ,EAAuBE,wBAAvB;AACAL,EAAAA,KAAK,CAACG,KAAN,CAAY,UAAZ,EAAwB,uBAAM,IAAN,CAAxB;AAEAH,EAAAA,KAAK,CAACM,GAAN,CAAUC,oBAAWC,UAAX,CAAsB;AAAEC,IAAAA,QAAQ,EAAE;AAAZ,GAAtB,CAAV;AACAT,EAAAA,KAAK,CAACM,GAAN,CAAUR,IAAI,CAACY,kBAAL,EAAV;AACAV,EAAAA,KAAK,CAACM,GAAN,CAAUK,+BAAV;AAEA,wBAAiBX,KAAjB,EAAwBD,OAAxB,EAAiCD,IAAjC,EAAuCD,MAAvC;AACA,uBAAgBG,KAAhB,EAAuBD,OAAvB,EAAgCD,IAAhC;AACA,wBAAiBE,KAAjB,EAAwBH,MAAxB,EAAgCE,OAAhC,EAAyCD,IAAzC;AACA,uBAAgBE,KAAhB,EAAuBD,OAAvB,EAAgCD,IAAhC;;AACA,MAAI,wBAASD,MAAT,CAAJ,EAAsB;AACpB,uBAAeG,KAAf,EAAsBF,IAAtB,EAA4BD,MAA5B;AACD,GAtB2E,CAuB5E;AACA;AACA;AACA;;;AACA,SAAOG,KAAP;AACD","sourcesContent":["import bodyParser from 'body-parser';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { match, validateName, validatePackage } from '@verdaccio/middleware';\nimport { SearchInstance } from '@verdaccio/store';\nimport { Storage } from '@verdaccio/store';\nimport { Config } from '@verdaccio/types';\n\nimport addPackageWebApi from '../api/package';\nimport addReadmeWebApi from '../api/readme';\nimport addSearchWebApi from '../api/search';\nimport addSidebarWebApi from '../api/sidebar';\nimport addUserAuthApi from '../api/user';\nimport { hasLogin } from '../utils/web-utils';\nimport { setSecurityWebHeaders } from './security';\n\nexport function webAPI(config: Config, auth: IAuth, storage: Storage): Router {\n // eslint-disable-next-line new-cap\n const route = Router();\n SearchInstance.configureStorage(storage);\n\n // validate all of these params as a package name\n // this might be too harsh, so ask if it causes trouble=\n route.param('package', validatePackage);\n route.param('filename', validateName);\n route.param('version', validateName);\n route.param('anything', match(/.*/));\n\n route.use(bodyParser.urlencoded({ extended: false }));\n route.use(auth.webUIJWTmiddleware());\n route.use(setSecurityWebHeaders);\n\n addPackageWebApi(route, storage, auth, config);\n addReadmeWebApi(route, storage, auth);\n addSidebarWebApi(route, config, storage, auth);\n addSearchWebApi(route, storage, auth);\n if (hasLogin(config)) {\n addUserAuthApi(route, auth, config);\n }\n // What are you looking for? logout? client side will remove token when user click logout,\n // or it will auto expire after 24 hours.\n // This token is different with the token send to npm client.\n // With JWT you will be able to setup expire tokens.\n return route;\n}\n"],"file":"web-api.js"}
1
+ {"version":3,"sources":["../../src/middleware/web-api.ts"],"names":["webAPI","config","auth","storage","route","SearchInstance","configureStorage","param","validatePackage","validateName","use","bodyParser","urlencoded","extended","webUIJWTmiddleware","setSecurityWebHeaders"],"mappings":";;;;;;;AAAA;;AACA;;AAGA;;AACA;;AAIA;;AACA;;;;AAEO,SAASA,MAAT,CAAgBC,MAAhB,EAAgCC,IAAhC,EAA6CC,OAA7C,EAAuE;AAC5E;AACA,QAAMC,KAAK,GAAG,sBAAd;;AACAC,wBAAeC,gBAAf,CAAgCH,OAAhC,EAH4E,CAI5E;AACA;;;AACAC,EAAAA,KAAK,CAACG,KAAN,CAAY,SAAZ,EAAuBC,2BAAvB;AACAJ,EAAAA,KAAK,CAACG,KAAN,CAAY,UAAZ,EAAwBE,wBAAxB;AACAL,EAAAA,KAAK,CAACG,KAAN,CAAY,SAAZ,EAAuBE,wBAAvB;AACAL,EAAAA,KAAK,CAACG,KAAN,CAAY,UAAZ,EAAwB,uBAAM,IAAN,CAAxB;AACAH,EAAAA,KAAK,CAACM,GAAN,CAAUC,oBAAWC,UAAX,CAAsB;AAAEC,IAAAA,QAAQ,EAAE;AAAZ,GAAtB,CAAV;AACAT,EAAAA,KAAK,CAACM,GAAN,CAAUR,IAAI,CAACY,kBAAL,EAAV;AACAV,EAAAA,KAAK,CAACM,GAAN,CAAUK,+BAAV;AACAX,EAAAA,KAAK,CAACM,GAAN,CAAU,kBAAgBR,IAAhB,EAAsBC,OAAtB,EAA+BF,MAA/B,CAAV;AACA,SAAOG,KAAP;AACD","sourcesContent":["import bodyParser from 'body-parser';\nimport { Router } from 'express';\n\nimport { IAuth } from '@verdaccio/auth';\nimport { match, validateName, validatePackage } from '@verdaccio/middleware';\nimport { SearchInstance } from '@verdaccio/store';\nimport { Storage } from '@verdaccio/store';\nimport { Config } from '@verdaccio/types';\n\nimport webEndpointsApi from '../api';\nimport { setSecurityWebHeaders } from './security';\n\nexport function webAPI(config: Config, auth: IAuth, storage: Storage): Router {\n // eslint-disable-next-line new-cap\n const route = Router();\n SearchInstance.configureStorage(storage);\n // validate all of these params as a package name\n // this might be too harsh, so ask if it causes trouble=\n route.param('package', validatePackage);\n route.param('filename', validateName);\n route.param('version', validateName);\n route.param('anything', match(/.*/));\n route.use(bodyParser.urlencoded({ extended: false }));\n route.use(auth.webUIJWTmiddleware());\n route.use(setSecurityWebHeaders);\n route.use(webEndpointsApi(auth, storage, config));\n return route;\n}\n"],"file":"web-api.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/web",
3
- "version": "6.0.0-6-next.22",
3
+ "version": "6.0.0-6-next.23",
4
4
  "description": "web ui middleware",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -25,28 +25,28 @@
25
25
  },
26
26
  "license": "MIT",
27
27
  "dependencies": {
28
- "@verdaccio/auth": "6.0.0-6-next.16",
28
+ "@verdaccio/auth": "6.0.0-6-next.17",
29
29
  "@verdaccio/core": "6.0.0-6-next.4",
30
30
  "@verdaccio/config": "6.0.0-6-next.12",
31
- "@verdaccio/loaders": "6.0.0-6-next.8",
32
- "@verdaccio/logger": "6.0.0-6-next.8",
33
- "@verdaccio/middleware": "6.0.0-6-next.16",
31
+ "@verdaccio/loaders": "6.0.0-6-next.9",
32
+ "@verdaccio/logger": "6.0.0-6-next.9",
33
+ "@verdaccio/middleware": "6.0.0-6-next.17",
34
34
  "@verdaccio/readme": "11.0.0-6-next.4",
35
- "@verdaccio/store": "6.0.0-6-next.17",
35
+ "@verdaccio/store": "6.0.0-6-next.18",
36
36
  "@verdaccio/tarball": "11.0.0-6-next.11",
37
37
  "@verdaccio/url": "11.0.0-6-next.8",
38
38
  "@verdaccio/utils": "6.0.0-6-next.10",
39
39
  "body-parser": "1.19.1",
40
40
  "debug": "4.3.3",
41
- "express": "4.17.1",
41
+ "express": "4.17.2",
42
42
  "lodash": "4.17.21",
43
43
  "lru-cache": "6.0.0"
44
44
  },
45
45
  "devDependencies": {
46
- "@types/node": "16.11.12",
46
+ "@types/node": "16.11.19",
47
47
  "@verdaccio/types": "11.0.0-6-next.10",
48
48
  "node-html-parser": "4.1.5",
49
- "supertest": "6.1.6",
49
+ "supertest": "6.2.1",
50
50
  "verdaccio-auth-memory": "11.0.0-6-next.7",
51
51
  "verdaccio-memory": "11.0.0-6-next.8"
52
52
  },
@@ -0,0 +1,20 @@
1
+ import { Router } from 'express';
2
+
3
+ import { hasLogin } from '../utils/web-utils';
4
+ import packageApi from './package';
5
+ import readme from './readme';
6
+ import search from './search';
7
+ import sidebar from './sidebar';
8
+ import user from './user';
9
+
10
+ export default (auth, storage, config) => {
11
+ const route = Router(); /* eslint new-cap: 0 */
12
+ route.use('/data/', packageApi(storage, auth, config));
13
+ route.use('/data/', search(storage, auth));
14
+ route.use('/data/', sidebar(config, storage, auth));
15
+ route.use('/data/', readme(storage, auth));
16
+ if (hasLogin(config)) {
17
+ route.use('/sec/', user(auth, config));
18
+ }
19
+ return route;
20
+ };
@@ -22,8 +22,9 @@ export type PackageExt = Package & { author: AuthorAvatar; dist?: { tarball: str
22
22
 
23
23
  const debug = buildDebug('verdaccio:web:api:package');
24
24
 
25
- function addPackageWebApi(route: Router, storage: Storage, auth: IAuth, config: Config): void {
25
+ function addPackageWebApi(storage: Storage, auth: IAuth, config: Config): Router {
26
26
  const isLoginEnabled = config?.web?.login === true ?? true;
27
+ const pkgRouter = Router(); /* eslint new-cap: 0 */
27
28
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
28
29
  const anonymousRemoteUser: RemoteUser = {
29
30
  name: undefined,
@@ -50,7 +51,7 @@ function addPackageWebApi(route: Router, storage: Storage, auth: IAuth, config:
50
51
  });
51
52
 
52
53
  // Get list of all visible package
53
- route.get(
54
+ pkgRouter.get(
54
55
  '/packages',
55
56
  function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
56
57
  debug('hit package web api %o');
@@ -109,6 +110,7 @@ function addPackageWebApi(route: Router, storage: Storage, auth: IAuth, config:
109
110
  });
110
111
  }
111
112
  );
113
+ return pkgRouter;
112
114
  }
113
115
 
114
116
  export default addPackageWebApi;
package/src/api/readme.ts CHANGED
@@ -18,11 +18,12 @@ const debug = buildDebug('verdaccio:web:api:readme');
18
18
 
19
19
  export const NOT_README_FOUND = 'ERROR: No README data found!';
20
20
 
21
- function addReadmeWebApi(route: Router, storage: Storage, auth: IAuth): void {
21
+ function addReadmeWebApi(storage: Storage, auth: IAuth): Router {
22
22
  debug('initialized readme web api');
23
23
  const can = allow(auth);
24
+ const pkgRouter = Router(); /* eslint new-cap: 0 */
24
25
 
25
- route.get(
26
+ pkgRouter.get(
26
27
  '/package/readme/(@:scope/)?:package/:version?',
27
28
  can('access'),
28
29
  function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
@@ -53,6 +54,7 @@ function addReadmeWebApi(route: Router, storage: Storage, auth: IAuth): void {
53
54
  });
54
55
  }
55
56
  );
57
+ return pkgRouter;
56
58
  }
57
59
 
58
60
  export default addReadmeWebApi;
package/src/api/search.ts CHANGED
@@ -11,7 +11,8 @@ import { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';
11
11
 
12
12
  const debug = buildDebug('verdaccio:web:api:search');
13
13
 
14
- function addSearchWebApi(route: Router, storage: Storage, auth: IAuth): void {
14
+ function addSearchWebApi(storage: Storage, auth: IAuth): Router {
15
+ const router = Router(); /* eslint new-cap: 0 */
15
16
  const getPackageInfo = async function (name, remoteUser): Promise<any> {
16
17
  return new Promise((resolve, reject) => {
17
18
  debug('searching for %o', name);
@@ -49,7 +50,7 @@ function addSearchWebApi(route: Router, storage: Storage, auth: IAuth): void {
49
50
  });
50
51
  };
51
52
 
52
- route.get(
53
+ router.get(
53
54
  '/search/:anything',
54
55
  async function (
55
56
  req: $RequestExtend,
@@ -75,6 +76,7 @@ function addSearchWebApi(route: Router, storage: Storage, auth: IAuth): void {
75
76
  }
76
77
  }
77
78
  );
79
+ return router;
78
80
  }
79
81
 
80
82
  export default addSearchWebApi;
@@ -19,11 +19,12 @@ export type PackageExt = Package & { author: AuthorAvatar; dist?: { tarball: str
19
19
  export type $SidebarPackage = Package & { latest: Version };
20
20
  const debug = buildDebug('verdaccio:web:api:sidebar');
21
21
 
22
- function addSidebarWebApi(route: Router, config: Config, storage: Storage, auth: IAuth): void {
22
+ function addSidebarWebApi(config: Config, storage: Storage, auth: IAuth): Router {
23
23
  debug('initialized sidebar web api');
24
+ const router = Router(); /* eslint new-cap: 0 */
24
25
  const can = allow(auth);
25
26
  // Get package readme
26
- route.get(
27
+ router.get(
27
28
  '/sidebar/(@:scope/)?:package',
28
29
  can('access'),
29
30
  function (req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {
@@ -65,6 +66,8 @@ function addSidebarWebApi(route: Router, config: Config, storage: Storage, auth:
65
66
  });
66
67
  }
67
68
  );
69
+
70
+ return router;
68
71
  }
69
72
 
70
73
  export default addSidebarWebApi;
package/src/api/user.ts CHANGED
@@ -11,7 +11,8 @@ import { $NextFunctionVer } from './package';
11
11
 
12
12
  const debug = buildDebug('verdaccio:web:api:user');
13
13
 
14
- function addUserAuthApi(route: Router, auth: IAuth, config: Config): void {
14
+ function addUserAuthApi(auth: IAuth, config: Config): Router {
15
+ const route = Router(); /* eslint new-cap: 0 */
15
16
  route.post('/login', function (req: Request, res: Response, next: $NextFunctionVer): void {
16
17
  const { username, password } = req.body;
17
18
  debug('authenticate %o', username);
@@ -68,6 +69,8 @@ function addUserAuthApi(route: Router, auth: IAuth, config: Config): void {
68
69
  }
69
70
  );
70
71
  }
72
+
73
+ return route;
71
74
  }
72
75
 
73
76
  export default addUserAuthApi;
@@ -7,40 +7,22 @@ import { SearchInstance } from '@verdaccio/store';
7
7
  import { Storage } from '@verdaccio/store';
8
8
  import { Config } from '@verdaccio/types';
9
9
 
10
- import addPackageWebApi from '../api/package';
11
- import addReadmeWebApi from '../api/readme';
12
- import addSearchWebApi from '../api/search';
13
- import addSidebarWebApi from '../api/sidebar';
14
- import addUserAuthApi from '../api/user';
15
- import { hasLogin } from '../utils/web-utils';
10
+ import webEndpointsApi from '../api';
16
11
  import { setSecurityWebHeaders } from './security';
17
12
 
18
13
  export function webAPI(config: Config, auth: IAuth, storage: Storage): Router {
19
14
  // eslint-disable-next-line new-cap
20
15
  const route = Router();
21
16
  SearchInstance.configureStorage(storage);
22
-
23
17
  // validate all of these params as a package name
24
18
  // this might be too harsh, so ask if it causes trouble=
25
19
  route.param('package', validatePackage);
26
20
  route.param('filename', validateName);
27
21
  route.param('version', validateName);
28
22
  route.param('anything', match(/.*/));
29
-
30
23
  route.use(bodyParser.urlencoded({ extended: false }));
31
24
  route.use(auth.webUIJWTmiddleware());
32
25
  route.use(setSecurityWebHeaders);
33
-
34
- addPackageWebApi(route, storage, auth, config);
35
- addReadmeWebApi(route, storage, auth);
36
- addSidebarWebApi(route, config, storage, auth);
37
- addSearchWebApi(route, storage, auth);
38
- if (hasLogin(config)) {
39
- addUserAuthApi(route, auth, config);
40
- }
41
- // What are you looking for? logout? client side will remove token when user click logout,
42
- // or it will auto expire after 24 hours.
43
- // This token is different with the token send to npm client.
44
- // With JWT you will be able to setup expire tokens.
26
+ route.use(webEndpointsApi(auth, storage, config));
45
27
  return route;
46
28
  }
@@ -26,7 +26,7 @@ describe('test web server', () => {
26
26
  manifest: require('./partials/manifest/manifest.json'),
27
27
  }));
28
28
  const response = await supertest(await initializeServer('default-test.yaml'))
29
- .get('/-/verdaccio/packages')
29
+ .get('/-/verdaccio/data/packages')
30
30
  .set('Accept', HEADERS.JSON_CHARSET)
31
31
  .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
32
32
  .expect(HTTP_STATUS.OK);
@@ -55,7 +55,7 @@ describe('readme api', () => {
55
55
 
56
56
  test('should fetch readme scoped package', async () => {
57
57
  const response = await supertest(await initializeServer('default-test.yaml'))
58
- .get('/-/verdaccio/package/readme/@scope/pk1-test')
58
+ .get('/-/verdaccio/data/package/readme/@scope/pk1-test')
59
59
  .set('Accept', HEADERS.TEXT_PLAIN)
60
60
  .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8)
61
61
  .expect(HTTP_STATUS.OK);
@@ -64,7 +64,7 @@ describe('readme api', () => {
64
64
 
65
65
  test('should fetch readme a package', async () => {
66
66
  const response = await supertest(await initializeServer('default-test.yaml'))
67
- .get('/-/verdaccio/package/readme/pk1-test')
67
+ .get('/-/verdaccio/data/package/readme/pk1-test')
68
68
  .set('Accept', HEADERS.TEXT_PLAIN)
69
69
  .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.TEXT_PLAIN_UTF8)
70
70
  .expect(HTTP_STATUS.OK);
@@ -59,7 +59,7 @@ describe('test web server', () => {
59
59
 
60
60
  test('should OK to search api', async () => {
61
61
  const response = await supertest(await initializeServer('default-test.yaml'))
62
- .get('/-/verdaccio/search/keyword')
62
+ .get('/-/verdaccio/data/search/keyword')
63
63
  .set('Accept', HEADERS.JSON_CHARSET)
64
64
  .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
65
65
  .expect(HTTP_STATUS.OK);
@@ -69,7 +69,7 @@ describe('test web server', () => {
69
69
  test('should 404 to search api', async () => {
70
70
  mockQuery.mockReturnValue([]);
71
71
  const response = await supertest(await initializeServer('default-test.yaml'))
72
- .get('/-/verdaccio/search/notFound')
72
+ .get('/-/verdaccio/data/search/notFound')
73
73
  .set('Accept', HEADERS.JSON_CHARSET)
74
74
  .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
75
75
  .expect(HTTP_STATUS.OK);
@@ -85,7 +85,7 @@ describe('test web server', () => {
85
85
  ];
86
86
  });
87
87
  const response = await supertest(await initializeServer('default-test.yaml'))
88
- .get('/-/verdaccio/search/notFound')
88
+ .get('/-/verdaccio/data/search/notFound')
89
89
  .set('Accept', HEADERS.JSON_CHARSET)
90
90
  .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
91
91
  .expect(HTTP_STATUS.OK);
@@ -55,7 +55,7 @@ describe.skip('sidebar api', () => {
55
55
  manifest: require('./partials/manifest/manifest.json'),
56
56
  });
57
57
  const response = await supertest(await initializeServer('default-test.yaml'))
58
- .get('/-/verdaccio/sidebar/@scope/pk1-test')
58
+ .get('/-/verdaccio/data/sidebar/@scope/pk1-test')
59
59
  .set('Accept', HEADERS.TEXT_PLAIN)
60
60
  .expect(HEADER_TYPE.CONTENT_TYPE, HEADERS.JSON_CHARSET)
61
61
  .expect(HTTP_STATUS.OK);
@@ -29,7 +29,7 @@ describe('test web server', () => {
29
29
 
30
30
  test('should get 401', async () => {
31
31
  return supertest(await initializeServer('default-test.yaml'))
32
- .post('/-/verdaccio/login')
32
+ .post('/-/verdaccio/sec/login')
33
33
  .send(
34
34
  JSON.stringify({
35
35
  username: 'test',
@@ -46,7 +46,7 @@ describe('test web server', () => {
46
46
 
47
47
  test('should log in', async () => {
48
48
  return supertest(await initializeServer('default-test.yaml'))
49
- .post('/-/verdaccio/login')
49
+ .post('/-/verdaccio/sec/login')
50
50
  .send(
51
51
  JSON.stringify({
52
52
  username: 'test',
@@ -66,7 +66,7 @@ describe('test web server', () => {
66
66
 
67
67
  test('log in should be disabled', async () => {
68
68
  return supertest(await initializeServer('login-disabled.yaml'))
69
- .post('/-/verdaccio/login')
69
+ .post('/-/verdaccio/sec/login')
70
70
  .send(
71
71
  JSON.stringify({
72
72
  username: 'test',