@verdaccio/api 9.0.0-next-9.2 → 9.0.0-next-9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/build/_virtual/_rolldown/runtime.js +23 -0
  2. package/build/dist-tags.d.ts +4 -4
  3. package/build/dist-tags.js +52 -124
  4. package/build/dist-tags.js.map +1 -1
  5. package/build/dist-tags.mjs +52 -0
  6. package/build/dist-tags.mjs.map +1 -0
  7. package/build/index.d.ts +4 -4
  8. package/build/index.js +61 -78
  9. package/build/index.js.map +1 -1
  10. package/build/index.mjs +59 -0
  11. package/build/index.mjs.map +1 -0
  12. package/build/package.d.ts +3 -3
  13. package/build/package.js +69 -120
  14. package/build/package.js.map +1 -1
  15. package/build/package.mjs +69 -0
  16. package/build/package.mjs.map +1 -0
  17. package/build/ping.d.ts +1 -1
  18. package/build/ping.js +10 -11
  19. package/build/ping.js.map +1 -1
  20. package/build/ping.mjs +11 -0
  21. package/build/ping.mjs.map +1 -0
  22. package/build/publish.d.ts +4 -4
  23. package/build/publish.js +192 -268
  24. package/build/publish.js.map +1 -1
  25. package/build/publish.mjs +196 -0
  26. package/build/publish.mjs.map +1 -0
  27. package/build/search.d.ts +1 -1
  28. package/build/search.js +13 -17
  29. package/build/search.js.map +1 -1
  30. package/build/search.mjs +14 -0
  31. package/build/search.mjs.map +1 -0
  32. package/build/stars.d.ts +2 -2
  33. package/build/stars.js +21 -59
  34. package/build/stars.js.map +1 -1
  35. package/build/stars.mjs +21 -0
  36. package/build/stars.mjs.map +1 -0
  37. package/build/user.d.ts +3 -3
  38. package/build/user.js +106 -188
  39. package/build/user.js.map +1 -1
  40. package/build/user.mjs +106 -0
  41. package/build/user.mjs.map +1 -0
  42. package/build/v1/login.d.ts +4 -4
  43. package/build/v1/login.js +115 -246
  44. package/build/v1/login.js.map +1 -1
  45. package/build/v1/login.mjs +115 -0
  46. package/build/v1/login.mjs.map +1 -0
  47. package/build/v1/profile.d.ts +3 -3
  48. package/build/v1/profile.js +45 -67
  49. package/build/v1/profile.js.map +1 -1
  50. package/build/v1/profile.mjs +45 -0
  51. package/build/v1/profile.mjs.map +1 -0
  52. package/build/v1/search.d.ts +3 -3
  53. package/build/v1/search.js +64 -113
  54. package/build/v1/search.js.map +1 -1
  55. package/build/v1/search.mjs +64 -0
  56. package/build/v1/search.mjs.map +1 -0
  57. package/build/v1/token.d.ts +4 -4
  58. package/build/v1/token.js +100 -201
  59. package/build/v1/token.js.map +1 -1
  60. package/build/v1/token.mjs +102 -0
  61. package/build/v1/token.mjs.map +1 -0
  62. package/build/whoami.d.ts +1 -1
  63. package/build/whoami.js +20 -25
  64. package/build/whoami.js.map +1 -1
  65. package/build/whoami.mjs +20 -0
  66. package/build/whoami.mjs.map +1 -0
  67. package/package.json +25 -14
@@ -1,69 +1,47 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports["default"] = _default;
7
- var _lodash = _interopRequireDefault(require("lodash"));
8
- var _core = require("@verdaccio/core");
9
- var _middleware = require("@verdaccio/middleware");
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
11
- function _default(route, auth, config) {
12
- function buildProfile(name) {
13
- return {
14
- tfa: false,
15
- name: name,
16
- email: '',
17
- email_verified: false,
18
- created: '',
19
- updated: '',
20
- cidr_whitelist: null,
21
- fullname: ''
22
- };
23
- }
24
- route.get(_middleware.PROFILE_API_ENDPOINTS.get_profile, (0, _middleware.rateLimit)(config === null || config === void 0 ? void 0 : config.userRateLimit), function (req, res, next) {
25
- if (_lodash["default"].isNil(req.remote_user.name) === false) {
26
- return next(buildProfile(req.remote_user.name));
27
- }
28
- res.status(_core.HTTP_STATUS.UNAUTHORIZED);
29
- return next({
30
- message: _core.API_ERROR.MUST_BE_LOGGED
31
- });
32
- });
33
- route.post(_middleware.PROFILE_API_ENDPOINTS.get_profile, (0, _middleware.rateLimit)(config === null || config === void 0 ? void 0 : config.userRateLimit), function (req, res, next) {
34
- if (_lodash["default"].isNil(req.remote_user.name)) {
35
- res.status(_core.HTTP_STATUS.UNAUTHORIZED);
36
- return next({
37
- message: _core.API_ERROR.MUST_BE_LOGGED
38
- });
39
- }
40
- var _req$body = req.body,
41
- password = _req$body.password,
42
- tfa = _req$body.tfa;
43
- var name = req.remote_user.name;
44
- if (_lodash["default"].isNil(password) === false) {
45
- var _config$server;
46
- if (_core.validationUtils.validatePassword(password["new"], config === null || config === void 0 || (_config$server = config.server) === null || _config$server === void 0 ? void 0 : _config$server.passwordValidationRegex) === false) {
47
- /* eslint new-cap:off */
48
- return next(_core.errorUtils.getCode(_core.HTTP_STATUS.UNAUTHORIZED, _core.API_ERROR.PASSWORD_SHORT));
49
- }
50
- if (_lodash["default"].isEmpty(password.old)) {
51
- return next(_core.errorUtils.getBadRequest('old password is required'));
52
- }
53
- auth.changePassword(name, password.old, password["new"], function (err, isUpdated) {
54
- if (_lodash["default"].isNull(err) === false) {
55
- return next(_core.errorUtils.getForbidden(err.message));
56
- }
57
- if (isUpdated) {
58
- return next(buildProfile(req.remote_user.name));
59
- }
60
- return next(_core.errorUtils.getInternalError(_core.API_ERROR.INTERNAL_SERVER_ERROR));
61
- });
62
- } else if (_lodash["default"].isNil(tfa) === false) {
63
- return next(_core.errorUtils.getCode(_core.HTTP_STATUS.SERVICE_UNAVAILABLE, _core.SUPPORT_ERRORS.TFA_DISABLED));
64
- } else {
65
- return next(_core.errorUtils.getCode(_core.HTTP_STATUS.INTERNAL_ERROR, _core.APP_ERROR.PROFILE_ERROR));
66
- }
67
- });
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.js");
2
+ let _verdaccio_middleware = require("@verdaccio/middleware");
3
+ let lodash = require("lodash");
4
+ lodash = require_runtime.__toESM(lodash);
5
+ let _verdaccio_core = require("@verdaccio/core");
6
+ //#region src/v1/profile.ts
7
+ function profile_default(route, auth, config) {
8
+ function buildProfile(name) {
9
+ return {
10
+ tfa: false,
11
+ name,
12
+ email: "",
13
+ email_verified: false,
14
+ created: "",
15
+ updated: "",
16
+ cidr_whitelist: null,
17
+ fullname: ""
18
+ };
19
+ }
20
+ route.get(_verdaccio_middleware.PROFILE_API_ENDPOINTS.get_profile, (0, _verdaccio_middleware.rateLimit)(config?.userRateLimit), function(req, res, next) {
21
+ if (lodash.default.isNil(req.remote_user.name) === false) return next(buildProfile(req.remote_user.name));
22
+ res.status(_verdaccio_core.HTTP_STATUS.UNAUTHORIZED);
23
+ return next({ message: _verdaccio_core.API_ERROR.MUST_BE_LOGGED });
24
+ });
25
+ route.post(_verdaccio_middleware.PROFILE_API_ENDPOINTS.get_profile, (0, _verdaccio_middleware.rateLimit)(config?.userRateLimit), function(req, res, next) {
26
+ if (lodash.default.isNil(req.remote_user.name)) {
27
+ res.status(_verdaccio_core.HTTP_STATUS.UNAUTHORIZED);
28
+ return next({ message: _verdaccio_core.API_ERROR.MUST_BE_LOGGED });
29
+ }
30
+ const { password, tfa } = req.body;
31
+ const { name } = req.remote_user;
32
+ if (lodash.default.isNil(password) === false) {
33
+ if (_verdaccio_core.validationUtils.validatePassword(password.new, config?.server?.passwordValidationRegex) === false) return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.UNAUTHORIZED, _verdaccio_core.API_ERROR.PASSWORD_SHORT));
34
+ if (lodash.default.isEmpty(password.old)) return next(_verdaccio_core.errorUtils.getBadRequest("old password is required"));
35
+ auth.changePassword(name, password.old, password.new, (err, isUpdated) => {
36
+ if (lodash.default.isNull(err) === false) return next(_verdaccio_core.errorUtils.getForbidden(err.message));
37
+ if (isUpdated) return next(buildProfile(req.remote_user.name));
38
+ return next(_verdaccio_core.errorUtils.getInternalError(_verdaccio_core.API_ERROR.INTERNAL_SERVER_ERROR));
39
+ });
40
+ } else if (lodash.default.isNil(tfa) === false) return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.SERVICE_UNAVAILABLE, _verdaccio_core.SUPPORT_ERRORS.TFA_DISABLED));
41
+ else return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.INTERNAL_ERROR, _verdaccio_core.APP_ERROR.PROFILE_ERROR));
42
+ });
68
43
  }
44
+ //#endregion
45
+ exports.default = profile_default;
46
+
69
47
  //# sourceMappingURL=profile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","names":["_lodash","_interopRequireDefault","require","_core","_middleware","e","__esModule","_default","route","auth","config","buildProfile","name","tfa","email","email_verified","created","updated","cidr_whitelist","fullname","get","PROFILE_API_ENDPOINTS","get_profile","rateLimit","userRateLimit","req","res","next","_","isNil","remote_user","status","HTTP_STATUS","UNAUTHORIZED","message","API_ERROR","MUST_BE_LOGGED","post","_req$body","body","password","_config$server","validationUtils","validatePassword","server","passwordValidationRegex","errorUtils","getCode","PASSWORD_SHORT","isEmpty","old","getBadRequest","changePassword","err","isUpdated","isNull","getForbidden","getInternalError","INTERNAL_SERVER_ERROR","SERVICE_UNAVAILABLE","SUPPORT_ERRORS","TFA_DISABLED","INTERNAL_ERROR","APP_ERROR","PROFILE_ERROR"],"sources":["../../src/v1/profile.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport {\n API_ERROR,\n APP_ERROR,\n HTTP_STATUS,\n SUPPORT_ERRORS,\n errorUtils,\n validationUtils,\n} from '@verdaccio/core';\nimport { PROFILE_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Config } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport interface Profile {\n tfa: boolean;\n name: string;\n email: string;\n email_verified: boolean;\n created: string;\n updated: string;\n cidr_whitelist: string[] | null;\n fullname: string;\n}\n\nexport default function (route: Router, auth: Auth, config: Config): void {\n function buildProfile(name: string): Profile {\n return {\n tfa: false,\n name,\n email: '',\n email_verified: false,\n created: '',\n updated: '',\n cidr_whitelist: null,\n fullname: '',\n };\n }\n\n route.get(\n PROFILE_API_ENDPOINTS.get_profile,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name) === false) {\n return next(buildProfile(req.remote_user.name));\n }\n\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n );\n\n route.post(\n PROFILE_API_ENDPOINTS.get_profile,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name)) {\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n\n const { password, tfa } = req.body;\n const { name } = req.remote_user;\n\n if (_.isNil(password) === false) {\n if (\n validationUtils.validatePassword(\n password.new,\n config?.server?.passwordValidationRegex\n ) === false\n ) {\n /* eslint new-cap:off */\n return next(errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.PASSWORD_SHORT));\n }\n\n if (_.isEmpty(password.old)) {\n return next(errorUtils.getBadRequest('old password is required'));\n }\n\n auth.changePassword(\n name,\n password.old,\n password.new,\n (err, isUpdated): $NextFunctionVer => {\n if (_.isNull(err) === false) {\n return next(errorUtils.getForbidden(err.message));\n }\n\n if (isUpdated) {\n return next(buildProfile(req.remote_user.name));\n }\n return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));\n }\n );\n } else if (_.isNil(tfa) === false) {\n return next(\n errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED)\n );\n } else {\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));\n }\n }\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"profile.js","names":[],"sources":["../../src/v1/profile.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport {\n API_ERROR,\n APP_ERROR,\n HTTP_STATUS,\n SUPPORT_ERRORS,\n errorUtils,\n validationUtils,\n} from '@verdaccio/core';\nimport { PROFILE_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Config } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport interface Profile {\n tfa: boolean;\n name: string;\n email: string;\n email_verified: boolean;\n created: string;\n updated: string;\n cidr_whitelist: string[] | null;\n fullname: string;\n}\n\nexport default function (route: Router, auth: Auth, config: Config): void {\n function buildProfile(name: string): Profile {\n return {\n tfa: false,\n name,\n email: '',\n email_verified: false,\n created: '',\n updated: '',\n cidr_whitelist: null,\n fullname: '',\n };\n }\n\n route.get(\n PROFILE_API_ENDPOINTS.get_profile,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name) === false) {\n return next(buildProfile(req.remote_user.name));\n }\n\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n );\n\n route.post(\n PROFILE_API_ENDPOINTS.get_profile,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name)) {\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n\n const { password, tfa } = req.body;\n const { name } = req.remote_user;\n\n if (_.isNil(password) === false) {\n if (\n validationUtils.validatePassword(\n password.new,\n config?.server?.passwordValidationRegex\n ) === false\n ) {\n /* eslint new-cap:off */\n return next(errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.PASSWORD_SHORT));\n }\n\n if (_.isEmpty(password.old)) {\n return next(errorUtils.getBadRequest('old password is required'));\n }\n\n auth.changePassword(\n name,\n password.old,\n password.new,\n (err, isUpdated): $NextFunctionVer => {\n if (_.isNull(err) === false) {\n return next(errorUtils.getForbidden(err.message));\n }\n\n if (isUpdated) {\n return next(buildProfile(req.remote_user.name));\n }\n return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));\n }\n );\n } else if (_.isNil(tfa) === false) {\n return next(\n errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED)\n );\n } else {\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));\n }\n }\n );\n}\n"],"mappings":";;;;;;AA4BA,SAAA,gBAAyB,OAAe,MAAY,QAAsB;CACxE,SAAS,aAAa,MAAuB;AAC3C,SAAO;GACL,KAAK;GACL;GACA,OAAO;GACP,gBAAgB;GAChB,SAAS;GACT,SAAS;GACT,gBAAgB;GAChB,UAAU;GACX;;AAGH,OAAM,IACJ,sBAAA,sBAAsB,cAAA,GAAA,sBAAA,WACZ,QAAQ,cAAc,EAChC,SAAU,KAAqB,KAAe,MAA8B;AAC1E,MAAI,OAAA,QAAE,MAAM,IAAI,YAAY,KAAK,KAAK,MACpC,QAAO,KAAK,aAAa,IAAI,YAAY,KAAK,CAAC;AAGjD,MAAI,OAAO,gBAAA,YAAY,aAAa;AACpC,SAAO,KAAK,EACV,SAAS,gBAAA,UAAU,gBACpB,CAAC;GAEL;AAED,OAAM,KACJ,sBAAA,sBAAsB,cAAA,GAAA,sBAAA,WACZ,QAAQ,cAAc,EAChC,SAAU,KAAqB,KAAe,MAA8B;AAC1E,MAAI,OAAA,QAAE,MAAM,IAAI,YAAY,KAAK,EAAE;AACjC,OAAI,OAAO,gBAAA,YAAY,aAAa;AACpC,UAAO,KAAK,EACV,SAAS,gBAAA,UAAU,gBACpB,CAAC;;EAGJ,MAAM,EAAE,UAAU,QAAQ,IAAI;EAC9B,MAAM,EAAE,SAAS,IAAI;AAErB,MAAI,OAAA,QAAE,MAAM,SAAS,KAAK,OAAO;AAC/B,OACE,gBAAA,gBAAgB,iBACd,SAAS,KACT,QAAQ,QAAQ,wBACjB,KAAK,MAGN,QAAO,KAAK,gBAAA,WAAW,QAAQ,gBAAA,YAAY,cAAc,gBAAA,UAAU,eAAe,CAAC;AAGrF,OAAI,OAAA,QAAE,QAAQ,SAAS,IAAI,CACzB,QAAO,KAAK,gBAAA,WAAW,cAAc,2BAA2B,CAAC;AAGnE,QAAK,eACH,MACA,SAAS,KACT,SAAS,MACR,KAAK,cAAgC;AACpC,QAAI,OAAA,QAAE,OAAO,IAAI,KAAK,MACpB,QAAO,KAAK,gBAAA,WAAW,aAAa,IAAI,QAAQ,CAAC;AAGnD,QAAI,UACF,QAAO,KAAK,aAAa,IAAI,YAAY,KAAK,CAAC;AAEjD,WAAO,KAAK,gBAAA,WAAW,iBAAiB,gBAAA,UAAU,sBAAsB,CAAC;KAE5E;aACQ,OAAA,QAAE,MAAM,IAAI,KAAK,MAC1B,QAAO,KACL,gBAAA,WAAW,QAAQ,gBAAA,YAAY,qBAAqB,gBAAA,eAAe,aAAa,CACjF;MAED,QAAO,KAAK,gBAAA,WAAW,QAAQ,gBAAA,YAAY,gBAAgB,gBAAA,UAAU,cAAc,CAAC;GAGzF"}
@@ -0,0 +1,45 @@
1
+ import { PROFILE_API_ENDPOINTS, rateLimit } from "@verdaccio/middleware";
2
+ import _ from "lodash";
3
+ import { API_ERROR, APP_ERROR, HTTP_STATUS, SUPPORT_ERRORS, errorUtils, validationUtils } from "@verdaccio/core";
4
+ //#region src/v1/profile.ts
5
+ function profile_default(route, auth, config) {
6
+ function buildProfile(name) {
7
+ return {
8
+ tfa: false,
9
+ name,
10
+ email: "",
11
+ email_verified: false,
12
+ created: "",
13
+ updated: "",
14
+ cidr_whitelist: null,
15
+ fullname: ""
16
+ };
17
+ }
18
+ route.get(PROFILE_API_ENDPOINTS.get_profile, rateLimit(config?.userRateLimit), function(req, res, next) {
19
+ if (_.isNil(req.remote_user.name) === false) return next(buildProfile(req.remote_user.name));
20
+ res.status(HTTP_STATUS.UNAUTHORIZED);
21
+ return next({ message: API_ERROR.MUST_BE_LOGGED });
22
+ });
23
+ route.post(PROFILE_API_ENDPOINTS.get_profile, rateLimit(config?.userRateLimit), function(req, res, next) {
24
+ if (_.isNil(req.remote_user.name)) {
25
+ res.status(HTTP_STATUS.UNAUTHORIZED);
26
+ return next({ message: API_ERROR.MUST_BE_LOGGED });
27
+ }
28
+ const { password, tfa } = req.body;
29
+ const { name } = req.remote_user;
30
+ if (_.isNil(password) === false) {
31
+ if (validationUtils.validatePassword(password.new, config?.server?.passwordValidationRegex) === false) return next(errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.PASSWORD_SHORT));
32
+ if (_.isEmpty(password.old)) return next(errorUtils.getBadRequest("old password is required"));
33
+ auth.changePassword(name, password.old, password.new, (err, isUpdated) => {
34
+ if (_.isNull(err) === false) return next(errorUtils.getForbidden(err.message));
35
+ if (isUpdated) return next(buildProfile(req.remote_user.name));
36
+ return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));
37
+ });
38
+ } else if (_.isNil(tfa) === false) return next(errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED));
39
+ else return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));
40
+ });
41
+ }
42
+ //#endregion
43
+ export { profile_default as default };
44
+
45
+ //# sourceMappingURL=profile.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.mjs","names":[],"sources":["../../src/v1/profile.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport {\n API_ERROR,\n APP_ERROR,\n HTTP_STATUS,\n SUPPORT_ERRORS,\n errorUtils,\n validationUtils,\n} from '@verdaccio/core';\nimport { PROFILE_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Config } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport interface Profile {\n tfa: boolean;\n name: string;\n email: string;\n email_verified: boolean;\n created: string;\n updated: string;\n cidr_whitelist: string[] | null;\n fullname: string;\n}\n\nexport default function (route: Router, auth: Auth, config: Config): void {\n function buildProfile(name: string): Profile {\n return {\n tfa: false,\n name,\n email: '',\n email_verified: false,\n created: '',\n updated: '',\n cidr_whitelist: null,\n fullname: '',\n };\n }\n\n route.get(\n PROFILE_API_ENDPOINTS.get_profile,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name) === false) {\n return next(buildProfile(req.remote_user.name));\n }\n\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n );\n\n route.post(\n PROFILE_API_ENDPOINTS.get_profile,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer): void {\n if (_.isNil(req.remote_user.name)) {\n res.status(HTTP_STATUS.UNAUTHORIZED);\n return next({\n message: API_ERROR.MUST_BE_LOGGED,\n });\n }\n\n const { password, tfa } = req.body;\n const { name } = req.remote_user;\n\n if (_.isNil(password) === false) {\n if (\n validationUtils.validatePassword(\n password.new,\n config?.server?.passwordValidationRegex\n ) === false\n ) {\n /* eslint new-cap:off */\n return next(errorUtils.getCode(HTTP_STATUS.UNAUTHORIZED, API_ERROR.PASSWORD_SHORT));\n }\n\n if (_.isEmpty(password.old)) {\n return next(errorUtils.getBadRequest('old password is required'));\n }\n\n auth.changePassword(\n name,\n password.old,\n password.new,\n (err, isUpdated): $NextFunctionVer => {\n if (_.isNull(err) === false) {\n return next(errorUtils.getForbidden(err.message));\n }\n\n if (isUpdated) {\n return next(buildProfile(req.remote_user.name));\n }\n return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));\n }\n );\n } else if (_.isNil(tfa) === false) {\n return next(\n errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED)\n );\n } else {\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));\n }\n }\n );\n}\n"],"mappings":";;;;AA4BA,SAAA,gBAAyB,OAAe,MAAY,QAAsB;CACxE,SAAS,aAAa,MAAuB;AAC3C,SAAO;GACL,KAAK;GACL;GACA,OAAO;GACP,gBAAgB;GAChB,SAAS;GACT,SAAS;GACT,gBAAgB;GAChB,UAAU;GACX;;AAGH,OAAM,IACJ,sBAAsB,aACtB,UAAU,QAAQ,cAAc,EAChC,SAAU,KAAqB,KAAe,MAA8B;AAC1E,MAAI,EAAE,MAAM,IAAI,YAAY,KAAK,KAAK,MACpC,QAAO,KAAK,aAAa,IAAI,YAAY,KAAK,CAAC;AAGjD,MAAI,OAAO,YAAY,aAAa;AACpC,SAAO,KAAK,EACV,SAAS,UAAU,gBACpB,CAAC;GAEL;AAED,OAAM,KACJ,sBAAsB,aACtB,UAAU,QAAQ,cAAc,EAChC,SAAU,KAAqB,KAAe,MAA8B;AAC1E,MAAI,EAAE,MAAM,IAAI,YAAY,KAAK,EAAE;AACjC,OAAI,OAAO,YAAY,aAAa;AACpC,UAAO,KAAK,EACV,SAAS,UAAU,gBACpB,CAAC;;EAGJ,MAAM,EAAE,UAAU,QAAQ,IAAI;EAC9B,MAAM,EAAE,SAAS,IAAI;AAErB,MAAI,EAAE,MAAM,SAAS,KAAK,OAAO;AAC/B,OACE,gBAAgB,iBACd,SAAS,KACT,QAAQ,QAAQ,wBACjB,KAAK,MAGN,QAAO,KAAK,WAAW,QAAQ,YAAY,cAAc,UAAU,eAAe,CAAC;AAGrF,OAAI,EAAE,QAAQ,SAAS,IAAI,CACzB,QAAO,KAAK,WAAW,cAAc,2BAA2B,CAAC;AAGnE,QAAK,eACH,MACA,SAAS,KACT,SAAS,MACR,KAAK,cAAgC;AACpC,QAAI,EAAE,OAAO,IAAI,KAAK,MACpB,QAAO,KAAK,WAAW,aAAa,IAAI,QAAQ,CAAC;AAGnD,QAAI,UACF,QAAO,KAAK,aAAa,IAAI,YAAY,KAAK,CAAC;AAEjD,WAAO,KAAK,WAAW,iBAAiB,UAAU,sBAAsB,CAAC;KAE5E;aACQ,EAAE,MAAM,IAAI,KAAK,MAC1B,QAAO,KACL,WAAW,QAAQ,YAAY,qBAAqB,eAAe,aAAa,CACjF;MAED,QAAO,KAAK,WAAW,QAAQ,YAAY,gBAAgB,UAAU,cAAc,CAAC;GAGzF"}
@@ -1,6 +1,6 @@
1
- import type { Auth } from '@verdaccio/auth';
2
- import type { Storage } from '@verdaccio/store';
3
- import type { Logger } from '@verdaccio/types';
1
+ import { Auth } from '@verdaccio/auth';
2
+ import { Storage } from '@verdaccio/store';
3
+ import { Logger } from '@verdaccio/types';
4
4
  /**
5
5
  * Endpoint for npm search v1
6
6
  * Empty value
@@ -1,116 +1,67 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports["default"] = _default;
7
- var _debug = _interopRequireDefault(require("debug"));
8
- var _lodash = _interopRequireDefault(require("lodash"));
9
- var _core = require("@verdaccio/core");
10
- var _middleware = require("@verdaccio/middleware");
11
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
12
- function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
13
- function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
14
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
15
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
16
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
17
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
18
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
19
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
20
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
21
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
22
- var debug = (0, _debug["default"])('verdaccio:api:search');
23
-
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.js");
2
+ let debug = require("debug");
3
+ debug = require_runtime.__toESM(debug);
4
+ let _verdaccio_middleware = require("@verdaccio/middleware");
5
+ let lodash = require("lodash");
6
+ lodash = require_runtime.__toESM(lodash);
7
+ let _verdaccio_core = require("@verdaccio/core");
8
+ //#region src/v1/search.ts
9
+ var debug$1 = (0, debug.default)("verdaccio:api:search");
24
10
  /**
25
- * Endpoint for npm search v1
26
- * Empty value
27
- * - {"objects":[],"total":0,"time":"Sun Jul 25 2021 14:09:11 GMT+0000 (Coordinated Universal Time)"}
28
- * req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'
29
- */
30
- function _default(route, auth, storage, logger) {
31
- function checkAccess(pkg, auth, remoteUser) {
32
- return new Promise(function (resolve, reject) {
33
- var _pkg$package;
34
- auth.allow_access({
35
- packageName: pkg === null || pkg === void 0 || (_pkg$package = pkg["package"]) === null || _pkg$package === void 0 ? void 0 : _pkg$package.name
36
- }, remoteUser, function (err, allowed) {
37
- if (err) {
38
- if (err.status && String(err.status).match(/^4\d\d$/)) {
39
- // auth plugin returns 4xx user error,
40
- // that's equivalent of !allowed basically
41
- allowed = false;
42
- return resolve(null);
43
- } else {
44
- reject(err);
45
- }
46
- } else {
47
- return resolve(allowed ? pkg : null);
48
- }
49
- });
50
- });
51
- }
52
- route.get(_middleware.SEARCH_API_ENDPOINTS.search, /*#__PURE__*/function () {
53
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(req, res, next) {
54
- var query, url, _map, _map2, size, from, data, abort, checkAccessPromises, _final, response, _t;
55
- return _regenerator().w(function (_context) {
56
- while (1) switch (_context.p = _context.n) {
57
- case 0:
58
- query = req.query, url = req.url;
59
- _map = ['size', 'from'].map(function (k) {
60
- return query[k];
61
- }), _map2 = _slicedToArray(_map, 2), size = _map2[0], from = _map2[1];
62
- abort = new AbortController();
63
- req.socket.on('close', function () {
64
- debug('search web aborted');
65
- abort.abort();
66
- });
67
- size = parseInt(size, 10) || 20;
68
- from = parseInt(from, 10) || 0;
69
- _context.p = 1;
70
- debug('storage search initiated');
71
- _context.n = 2;
72
- return storage.search({
73
- query: query,
74
- url: url,
75
- abort: abort
76
- });
77
- case 2:
78
- data = _context.v;
79
- debug('storage items tota: %o', data.length);
80
- _context.n = 3;
81
- return Promise.all(data.map(function (pkgItem) {
82
- return checkAccess(pkgItem, auth, req.remote_user);
83
- }));
84
- case 3:
85
- checkAccessPromises = _context.v;
86
- _final = checkAccessPromises.filter(function (i) {
87
- return !_lodash["default"].isNull(i);
88
- }).slice(from, size);
89
- logger.debug("search results ".concat(_final === null || _final === void 0 ? void 0 : _final.length));
90
- response = {
91
- objects: _final,
92
- total: _final.length,
93
- time: new Date().toUTCString()
94
- };
95
- res.status(_core.HTTP_STATUS.OK).json(response);
96
- _context.n = 5;
97
- break;
98
- case 4:
99
- _context.p = 4;
100
- _t = _context.v;
101
- logger.error({
102
- error: _t
103
- }, 'search endpoint has failed @{error.message}');
104
- next(next);
105
- return _context.a(2);
106
- case 5:
107
- return _context.a(2);
108
- }
109
- }, _callee, null, [[1, 4]]);
110
- }));
111
- return function (_x, _x2, _x3) {
112
- return _ref.apply(this, arguments);
113
- };
114
- }());
11
+ * Endpoint for npm search v1
12
+ * Empty value
13
+ * - {"objects":[],"total":0,"time":"Sun Jul 25 2021 14:09:11 GMT+0000 (Coordinated Universal Time)"}
14
+ * req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'
15
+ */
16
+ function search_default(route, auth, storage, logger) {
17
+ function checkAccess(pkg, auth, remoteUser) {
18
+ return new Promise((resolve, reject) => {
19
+ auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function(err, allowed) {
20
+ if (err) if (err.status && String(err.status).match(/^4\d\d$/)) {
21
+ allowed = false;
22
+ return resolve(null);
23
+ } else reject(err);
24
+ else return resolve(allowed ? pkg : null);
25
+ });
26
+ });
27
+ }
28
+ route.get(_verdaccio_middleware.SEARCH_API_ENDPOINTS.search, async (req, res, next) => {
29
+ const { query, url } = req;
30
+ let [size, from] = ["size", "from"].map((k) => query[k]);
31
+ let data;
32
+ const abort = new AbortController();
33
+ req.socket.on("close", function() {
34
+ debug$1("search web aborted");
35
+ abort.abort();
36
+ });
37
+ size = parseInt(size, 10) || 20;
38
+ from = parseInt(from, 10) || 0;
39
+ try {
40
+ debug$1("storage search initiated");
41
+ data = await storage.search({
42
+ query,
43
+ url,
44
+ abort
45
+ });
46
+ debug$1("storage items tota: %o", data.length);
47
+ const final = (await Promise.all(data.map((pkgItem) => {
48
+ return checkAccess(pkgItem, auth, req.remote_user);
49
+ }))).filter((i) => !lodash.default.isNull(i)).slice(from, size);
50
+ logger.debug(`search results ${final?.length}`);
51
+ const response = {
52
+ objects: final,
53
+ total: final.length,
54
+ time: (/* @__PURE__ */ new Date()).toUTCString()
55
+ };
56
+ res.status(_verdaccio_core.HTTP_STATUS.OK).json(response);
57
+ } catch (error) {
58
+ logger.error({ error }, "search endpoint has failed @{error.message}");
59
+ next(next);
60
+ return;
61
+ }
62
+ });
115
63
  }
64
+ //#endregion
65
+ exports.default = search_default;
66
+
116
67
  //# sourceMappingURL=search.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","names":["_debug","_interopRequireDefault","require","_lodash","_core","_middleware","e","__esModule","_regenerator","t","r","Symbol","n","iterator","o","toStringTag","i","c","prototype","Generator","u","Object","create","_regeneratorDefine2","f","p","y","G","v","a","d","bind","length","l","TypeError","call","done","value","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","w","m","defineProperty","_regeneratorDefine","_invoke","enumerable","configurable","writable","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_arrayLikeToArray","toString","slice","constructor","name","Array","from","test","next","push","isArray","asyncGeneratorStep","Promise","resolve","then","_asyncToGenerator","arguments","apply","_next","_throw","debug","buildDebug","_default","route","auth","storage","logger","checkAccess","pkg","remoteUser","reject","_pkg$package","allow_access","packageName","err","allowed","status","String","match","get","SEARCH_API_ENDPOINTS","search","_ref","_callee","req","res","query","url","_map","_map2","size","data","abort","checkAccessPromises","_final","response","_t","_context","map","k","AbortController","socket","on","parseInt","all","pkgItem","remote_user","final","filter","_","isNull","concat","objects","total","time","Date","toUTCString","HTTP_STATUS","OK","json","error","_x","_x2","_x3"],"sources":["../../src/v1/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport type { searchUtils } from '@verdaccio/core';\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { SEARCH_API_ENDPOINTS } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Logger, Manifest } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:api:search');\n\n/**\n * Endpoint for npm search v1\n * Empty value\n * - {\"objects\":[],\"total\":0,\"time\":\"Sun Jul 25 2021 14:09:11 GMT+0000 (Coordinated Universal Time)\"}\n * req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'\n */\nexport default function (route, auth: Auth, storage: Storage, logger: Logger): void {\n function 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\n route.get(SEARCH_API_ENDPOINTS.search, async (req, res, next) => {\n const { query, url } = req;\n let [size, from] = ['size', 'from'].map((k) => query[k]);\n let data;\n const abort = new AbortController();\n\n req.socket.on('close', function () {\n debug('search web aborted');\n abort.abort();\n });\n\n size = parseInt(size, 10) || 20;\n from = parseInt(from, 10) || 0;\n\n try {\n debug('storage search initiated');\n data = await storage.search({\n query,\n url,\n abort,\n });\n debug('storage items tota: %o', data.length);\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 logger.debug(`search results ${final?.length}`);\n\n const response: searchUtils.SearchResults = {\n objects: final,\n total: final.length,\n time: new Date().toUTCString(),\n };\n\n res.status(HTTP_STATUS.OK).json(response);\n } catch (error) {\n logger.error({ error }, 'search endpoint has failed @{error.message}');\n next(next);\n return;\n }\n });\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"search.js","names":[],"sources":["../../src/v1/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport type { searchUtils } from '@verdaccio/core';\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { SEARCH_API_ENDPOINTS } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Logger, Manifest } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:api:search');\n\n/**\n * Endpoint for npm search v1\n * Empty value\n * - {\"objects\":[],\"total\":0,\"time\":\"Sun Jul 25 2021 14:09:11 GMT+0000 (Coordinated Universal Time)\"}\n * req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'\n */\nexport default function (route, auth: Auth, storage: Storage, logger: Logger): void {\n function 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\n route.get(SEARCH_API_ENDPOINTS.search, async (req, res, next) => {\n const { query, url } = req;\n let [size, from] = ['size', 'from'].map((k) => query[k]);\n let data;\n const abort = new AbortController();\n\n req.socket.on('close', function () {\n debug('search web aborted');\n abort.abort();\n });\n\n size = parseInt(size, 10) || 20;\n from = parseInt(from, 10) || 0;\n\n try {\n debug('storage search initiated');\n data = await storage.search({\n query,\n url,\n abort,\n });\n debug('storage items tota: %o', data.length);\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 logger.debug(`search results ${final?.length}`);\n\n const response: searchUtils.SearchResults = {\n objects: final,\n total: final.length,\n time: new Date().toUTCString(),\n };\n\n res.status(HTTP_STATUS.OK).json(response);\n } catch (error) {\n logger.error({ error }, 'search endpoint has failed @{error.message}');\n next(next);\n return;\n }\n });\n}\n"],"mappings":";;;;;;;;AAUA,IAAM,WAAA,GAAA,MAAA,SAAmB,uBAAuB;;;;;;;AAQhD,SAAA,eAAyB,OAAO,MAAY,SAAkB,QAAsB;CAClF,SAAS,YAAY,KAAU,MAAW,YAAsC;AAC9E,SAAO,IAAI,SAAS,SAAS,WAAW;AACtC,QAAK,aAAa,EAAE,aAAa,KAAK,SAAS,MAAM,EAAE,YAAY,SAAU,KAAK,SAAS;AACzF,QAAI,IACF,KAAI,IAAI,UAAU,OAAO,IAAI,OAAO,CAAC,MAAM,UAAU,EAAE;AAGrD,eAAU;AACV,YAAO,QAAQ,KAAK;UAEpB,QAAO,IAAI;QAGb,QAAO,QAAQ,UAAU,MAAM,KAAK;KAEtC;IACF;;AAGJ,OAAM,IAAI,sBAAA,qBAAqB,QAAQ,OAAO,KAAK,KAAK,SAAS;EAC/D,MAAM,EAAE,OAAO,QAAQ;EACvB,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG;EACxD,IAAI;EACJ,MAAM,QAAQ,IAAI,iBAAiB;AAEnC,MAAI,OAAO,GAAG,SAAS,WAAY;AACjC,WAAM,qBAAqB;AAC3B,SAAM,OAAO;IACb;AAEF,SAAO,SAAS,MAAM,GAAG,IAAI;AAC7B,SAAO,SAAS,MAAM,GAAG,IAAI;AAE7B,MAAI;AACF,WAAM,2BAA2B;AACjC,UAAO,MAAM,QAAQ,OAAO;IAC1B;IACA;IACA;IACD,CAAC;AACF,WAAM,0BAA0B,KAAK,OAAO;GAO5C,MAAM,SANmD,MAAM,QAAQ,IACrE,KAAK,KAAK,YAAY;AACpB,WAAO,YAAY,SAAS,MAAM,IAAI,YAAY;KAClD,CACH,EAGE,QAAQ,MAAM,CAAC,OAAA,QAAE,OAAO,EAAE,CAAC,CAC3B,MAAM,MAAM,KAAK;AACpB,UAAO,MAAM,kBAAkB,OAAO,SAAS;GAE/C,MAAM,WAAsC;IAC1C,SAAS;IACT,OAAO,MAAM;IACb,uBAAM,IAAI,MAAM,EAAC,aAAa;IAC/B;AAED,OAAI,OAAO,gBAAA,YAAY,GAAG,CAAC,KAAK,SAAS;WAClC,OAAO;AACd,UAAO,MAAM,EAAE,OAAO,EAAE,8CAA8C;AACtE,QAAK,KAAK;AACV;;GAEF"}
@@ -0,0 +1,64 @@
1
+ import buildDebug from "debug";
2
+ import { SEARCH_API_ENDPOINTS } from "@verdaccio/middleware";
3
+ import _ from "lodash";
4
+ import { HTTP_STATUS } from "@verdaccio/core";
5
+ //#region src/v1/search.ts
6
+ var debug = buildDebug("verdaccio:api:search");
7
+ /**
8
+ * Endpoint for npm search v1
9
+ * Empty value
10
+ * - {"objects":[],"total":0,"time":"Sun Jul 25 2021 14:09:11 GMT+0000 (Coordinated Universal Time)"}
11
+ * req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'
12
+ */
13
+ function search_default(route, auth, storage, logger) {
14
+ function checkAccess(pkg, auth, remoteUser) {
15
+ return new Promise((resolve, reject) => {
16
+ auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function(err, allowed) {
17
+ if (err) if (err.status && String(err.status).match(/^4\d\d$/)) {
18
+ allowed = false;
19
+ return resolve(null);
20
+ } else reject(err);
21
+ else return resolve(allowed ? pkg : null);
22
+ });
23
+ });
24
+ }
25
+ route.get(SEARCH_API_ENDPOINTS.search, async (req, res, next) => {
26
+ const { query, url } = req;
27
+ let [size, from] = ["size", "from"].map((k) => query[k]);
28
+ let data;
29
+ const abort = new AbortController();
30
+ req.socket.on("close", function() {
31
+ debug("search web aborted");
32
+ abort.abort();
33
+ });
34
+ size = parseInt(size, 10) || 20;
35
+ from = parseInt(from, 10) || 0;
36
+ try {
37
+ debug("storage search initiated");
38
+ data = await storage.search({
39
+ query,
40
+ url,
41
+ abort
42
+ });
43
+ debug("storage items tota: %o", data.length);
44
+ const final = (await Promise.all(data.map((pkgItem) => {
45
+ return checkAccess(pkgItem, auth, req.remote_user);
46
+ }))).filter((i) => !_.isNull(i)).slice(from, size);
47
+ logger.debug(`search results ${final?.length}`);
48
+ const response = {
49
+ objects: final,
50
+ total: final.length,
51
+ time: (/* @__PURE__ */ new Date()).toUTCString()
52
+ };
53
+ res.status(HTTP_STATUS.OK).json(response);
54
+ } catch (error) {
55
+ logger.error({ error }, "search endpoint has failed @{error.message}");
56
+ next(next);
57
+ return;
58
+ }
59
+ });
60
+ }
61
+ //#endregion
62
+ export { search_default as default };
63
+
64
+ //# sourceMappingURL=search.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.mjs","names":[],"sources":["../../src/v1/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport type { searchUtils } from '@verdaccio/core';\nimport { HTTP_STATUS } from '@verdaccio/core';\nimport { SEARCH_API_ENDPOINTS } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Logger, Manifest } from '@verdaccio/types';\n\nconst debug = buildDebug('verdaccio:api:search');\n\n/**\n * Endpoint for npm search v1\n * Empty value\n * - {\"objects\":[],\"total\":0,\"time\":\"Sun Jul 25 2021 14:09:11 GMT+0000 (Coordinated Universal Time)\"}\n * req: 'GET /-/v1/search?text=react&size=20&frpom=0&quality=0.65&popularity=0.98&maintenance=0.5'\n */\nexport default function (route, auth: Auth, storage: Storage, logger: Logger): void {\n function 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\n route.get(SEARCH_API_ENDPOINTS.search, async (req, res, next) => {\n const { query, url } = req;\n let [size, from] = ['size', 'from'].map((k) => query[k]);\n let data;\n const abort = new AbortController();\n\n req.socket.on('close', function () {\n debug('search web aborted');\n abort.abort();\n });\n\n size = parseInt(size, 10) || 20;\n from = parseInt(from, 10) || 0;\n\n try {\n debug('storage search initiated');\n data = await storage.search({\n query,\n url,\n abort,\n });\n debug('storage items tota: %o', data.length);\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 logger.debug(`search results ${final?.length}`);\n\n const response: searchUtils.SearchResults = {\n objects: final,\n total: final.length,\n time: new Date().toUTCString(),\n };\n\n res.status(HTTP_STATUS.OK).json(response);\n } catch (error) {\n logger.error({ error }, 'search endpoint has failed @{error.message}');\n next(next);\n return;\n }\n });\n}\n"],"mappings":";;;;;AAUA,IAAM,QAAQ,WAAW,uBAAuB;;;;;;;AAQhD,SAAA,eAAyB,OAAO,MAAY,SAAkB,QAAsB;CAClF,SAAS,YAAY,KAAU,MAAW,YAAsC;AAC9E,SAAO,IAAI,SAAS,SAAS,WAAW;AACtC,QAAK,aAAa,EAAE,aAAa,KAAK,SAAS,MAAM,EAAE,YAAY,SAAU,KAAK,SAAS;AACzF,QAAI,IACF,KAAI,IAAI,UAAU,OAAO,IAAI,OAAO,CAAC,MAAM,UAAU,EAAE;AAGrD,eAAU;AACV,YAAO,QAAQ,KAAK;UAEpB,QAAO,IAAI;QAGb,QAAO,QAAQ,UAAU,MAAM,KAAK;KAEtC;IACF;;AAGJ,OAAM,IAAI,qBAAqB,QAAQ,OAAO,KAAK,KAAK,SAAS;EAC/D,MAAM,EAAE,OAAO,QAAQ;EACvB,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG;EACxD,IAAI;EACJ,MAAM,QAAQ,IAAI,iBAAiB;AAEnC,MAAI,OAAO,GAAG,SAAS,WAAY;AACjC,SAAM,qBAAqB;AAC3B,SAAM,OAAO;IACb;AAEF,SAAO,SAAS,MAAM,GAAG,IAAI;AAC7B,SAAO,SAAS,MAAM,GAAG,IAAI;AAE7B,MAAI;AACF,SAAM,2BAA2B;AACjC,UAAO,MAAM,QAAQ,OAAO;IAC1B;IACA;IACA;IACD,CAAC;AACF,SAAM,0BAA0B,KAAK,OAAO;GAO5C,MAAM,SANmD,MAAM,QAAQ,IACrE,KAAK,KAAK,YAAY;AACpB,WAAO,YAAY,SAAS,MAAM,IAAI,YAAY;KAClD,CACH,EAGE,QAAQ,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAC3B,MAAM,MAAM,KAAK;AACpB,UAAO,MAAM,kBAAkB,OAAO,SAAS;GAE/C,MAAM,WAAsC;IAC1C,SAAS;IACT,OAAO,MAAM;IACb,uBAAM,IAAI,MAAM,EAAC,aAAa;IAC/B;AAED,OAAI,OAAO,YAAY,GAAG,CAAC,KAAK,SAAS;WAClC,OAAO;AACd,UAAO,MAAM,EAAE,OAAO,EAAE,8CAA8C;AACtE,QAAK,KAAK;AACV;;GAEF"}
@@ -1,7 +1,7 @@
1
- import type { Router } from 'express';
2
- import type { Auth } from '@verdaccio/auth';
3
- import type { Storage } from '@verdaccio/store';
4
- import type { Config, Logger, Token } from '@verdaccio/types';
1
+ import { Router } from 'express';
2
+ import { Auth } from '@verdaccio/auth';
3
+ import { Storage } from '@verdaccio/store';
4
+ import { Config, Logger, Token } from '@verdaccio/types';
5
5
  export type NormalizeToken = Token & {
6
6
  cidr_whitelist: string[];
7
7
  created: string;