@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.
- package/build/_virtual/_rolldown/runtime.js +23 -0
- package/build/dist-tags.d.ts +4 -4
- package/build/dist-tags.js +52 -124
- package/build/dist-tags.js.map +1 -1
- package/build/dist-tags.mjs +52 -0
- package/build/dist-tags.mjs.map +1 -0
- package/build/index.d.ts +4 -4
- package/build/index.js +61 -78
- package/build/index.js.map +1 -1
- package/build/index.mjs +59 -0
- package/build/index.mjs.map +1 -0
- package/build/package.d.ts +3 -3
- package/build/package.js +69 -120
- package/build/package.js.map +1 -1
- package/build/package.mjs +69 -0
- package/build/package.mjs.map +1 -0
- package/build/ping.d.ts +1 -1
- package/build/ping.js +10 -11
- package/build/ping.js.map +1 -1
- package/build/ping.mjs +11 -0
- package/build/ping.mjs.map +1 -0
- package/build/publish.d.ts +4 -4
- package/build/publish.js +192 -268
- package/build/publish.js.map +1 -1
- package/build/publish.mjs +196 -0
- package/build/publish.mjs.map +1 -0
- package/build/search.d.ts +1 -1
- package/build/search.js +13 -17
- package/build/search.js.map +1 -1
- package/build/search.mjs +14 -0
- package/build/search.mjs.map +1 -0
- package/build/stars.d.ts +2 -2
- package/build/stars.js +21 -59
- package/build/stars.js.map +1 -1
- package/build/stars.mjs +21 -0
- package/build/stars.mjs.map +1 -0
- package/build/user.d.ts +3 -3
- package/build/user.js +106 -188
- package/build/user.js.map +1 -1
- package/build/user.mjs +106 -0
- package/build/user.mjs.map +1 -0
- package/build/v1/login.d.ts +4 -4
- package/build/v1/login.js +115 -246
- package/build/v1/login.js.map +1 -1
- package/build/v1/login.mjs +115 -0
- package/build/v1/login.mjs.map +1 -0
- package/build/v1/profile.d.ts +3 -3
- package/build/v1/profile.js +45 -67
- package/build/v1/profile.js.map +1 -1
- package/build/v1/profile.mjs +45 -0
- package/build/v1/profile.mjs.map +1 -0
- package/build/v1/search.d.ts +3 -3
- package/build/v1/search.js +64 -113
- package/build/v1/search.js.map +1 -1
- package/build/v1/search.mjs +64 -0
- package/build/v1/search.mjs.map +1 -0
- package/build/v1/token.d.ts +4 -4
- package/build/v1/token.js +100 -201
- package/build/v1/token.js.map +1 -1
- package/build/v1/token.mjs +102 -0
- package/build/v1/token.mjs.map +1 -0
- package/build/whoami.d.ts +1 -1
- package/build/whoami.js +20 -25
- package/build/whoami.js.map +1 -1
- package/build/whoami.mjs +20 -0
- package/build/whoami.mjs.map +1 -0
- package/package.json +25 -14
package/build/v1/profile.js
CHANGED
|
@@ -1,69 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
package/build/v1/profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","names":[
|
|
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"}
|
package/build/v1/search.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
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
|
package/build/v1/search.js
CHANGED
|
@@ -1,116 +1,67 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
package/build/v1/search.js.map
CHANGED
|
@@ -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"}
|
package/build/v1/token.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
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;
|