@verdaccio/api 9.0.0-next-9.7 → 9.0.0-next-9.8

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.
@@ -1,7 +1,5 @@
1
- const require_runtime = require("./_virtual/_rolldown/runtime.js");
1
+ require("./_virtual/_rolldown/runtime.js");
2
2
  let _verdaccio_middleware = require("@verdaccio/middleware");
3
- let lodash = require("lodash");
4
- lodash = require_runtime.__toESM(lodash);
5
3
  let _verdaccio_core = require("@verdaccio/core");
6
4
  //#region src/dist-tags.ts
7
5
  function dist_tags_default(route, auth, storage, logger) {
@@ -10,7 +8,7 @@ function dist_tags_default(route, auth, storage, logger) {
10
8
  afterAll: (a, b) => logger.trace(a, b)
11
9
  });
12
10
  const addTagPackageVersionMiddleware = async function(req, res, next) {
13
- if (lodash.default.isString(req.body) === false) return next(_verdaccio_core.errorUtils.getBadRequest("version is missing"));
11
+ if (typeof req.body !== "string") return next(_verdaccio_core.errorUtils.getBadRequest("version is missing"));
14
12
  const tags = {};
15
13
  tags[req.params.tag] = req.body;
16
14
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"dist-tags.js","names":[],"sources":["../src/dist-tags.ts"],"sourcesContent":["import type { Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { HEADERS, constants, errorUtils } from '@verdaccio/core';\nimport { DIST_TAGS_API_ENDPOINTS, allow, getRequestOptions, media } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Logger } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router, auth: Auth, storage: Storage, logger: Logger): void {\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\n const addTagPackageVersionMiddleware = async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<$NextFunctionVer> {\n if (_.isString(req.body) === false) {\n return next(errorUtils.getBadRequest('version is missing'));\n }\n\n const tags = {};\n tags[req.params.tag] = req.body;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_ADDED,\n });\n } catch (err) {\n next(err);\n }\n };\n\n // tagging a package.\n route.put(\n DIST_TAGS_API_ENDPOINTS.tagging,\n can('publish'),\n media(HEADERS.JSON),\n addTagPackageVersionMiddleware\n );\n\n route.put(\n DIST_TAGS_API_ENDPOINTS.tagging_package,\n can('publish'),\n media(HEADERS.JSON),\n addTagPackageVersionMiddleware\n );\n\n route.delete(\n DIST_TAGS_API_ENDPOINTS.tagging_package,\n can('publish'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const tags = {};\n tags[req.params.tag] = null;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_REMOVED,\n });\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.get(\n DIST_TAGS_API_ENDPOINTS.get_dist_tags,\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const name = req.params.package;\n const requestOptions = getRequestOptions(req);\n try {\n const manifest = await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n requestOptions,\n });\n next(manifest[constants.DIST_TAGS]);\n } catch (err) {\n next(err);\n }\n }\n );\n}\n"],"mappings":";;;;;;AAWA,SAAA,kBAAyB,OAAe,MAAY,SAAkB,QAAsB;CAC1F,MAAM,OAAA,GAAA,sBAAA,OAAY,MAAM;EACtB,YAAY,GAAG,MAAM,OAAO,MAAM,GAAG,EAAE;EACvC,WAAW,GAAG,MAAM,OAAO,MAAM,GAAG,EAAE;EACvC,CAAC;CACF,MAAM,iCAAiC,eACrC,KACA,KACA,MAC2B;AAC3B,MAAI,OAAA,QAAE,SAAS,IAAI,KAAK,KAAK,MAC3B,QAAO,KAAK,gBAAA,WAAW,cAAc,qBAAqB,CAAC;EAG7D,MAAM,OAAO,EAAE;AACf,OAAK,IAAI,OAAO,OAAO,IAAI;AAC3B,MAAI;AACF,SAAM,QAAQ,cAAc,IAAI,OAAO,SAAS,KAAK;AACrD,OAAI,OAAO,gBAAA,UAAU,YAAY,QAAQ;AACzC,UAAO,KAAK,EACV,IAAI,gBAAA,UAAU,YAAY,WAC3B,CAAC;WACK,KAAK;AACZ,QAAK,IAAI;;;AAKb,OAAM,IACJ,sBAAA,wBAAwB,SACxB,IAAI,UAAU,GAAA,GAAA,sBAAA,OACR,gBAAA,QAAQ,KAAK,EACnB,+BACD;AAED,OAAM,IACJ,sBAAA,wBAAwB,iBACxB,IAAI,UAAU,GAAA,GAAA,sBAAA,OACR,gBAAA,QAAQ,KAAK,EACnB,+BACD;AAED,OAAM,OACJ,sBAAA,wBAAwB,iBACxB,IAAI,UAAU,EACd,eACE,KACA,KACA,MACe;EACf,MAAM,OAAO,EAAE;AACf,OAAK,IAAI,OAAO,OAAO;AACvB,MAAI;AACF,SAAM,QAAQ,cAAc,IAAI,OAAO,SAAS,KAAK;AACrD,OAAI,OAAO,gBAAA,UAAU,YAAY,QAAQ;AACzC,UAAO,KAAK,EACV,IAAI,gBAAA,UAAU,YAAY,aAC3B,CAAC;WACK,KAAK;AACZ,QAAK,IAAI;;GAGd;AAED,OAAM,IACJ,sBAAA,wBAAwB,eACxB,IAAI,SAAS,EACb,eACE,KACA,KACA,MACe;EACf,MAAM,OAAO,IAAI,OAAO;EACxB,MAAM,kBAAA,GAAA,sBAAA,mBAAmC,IAAI;AAC7C,MAAI;AAMF,SALiB,MAAM,QAAQ,oBAAoB;IACjD;IACA,aAAa;IACb;IACD,CAAC,EACY,gBAAA,UAAU,WAAW;WAC5B,KAAK;AACZ,QAAK,IAAI;;GAGd"}
1
+ {"version":3,"file":"dist-tags.js","names":[],"sources":["../src/dist-tags.ts"],"sourcesContent":["import type { Router } from 'express';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { HEADERS, constants, errorUtils } from '@verdaccio/core';\nimport { DIST_TAGS_API_ENDPOINTS, allow, getRequestOptions, media } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Logger } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router, auth: Auth, storage: Storage, logger: Logger): void {\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\n const addTagPackageVersionMiddleware = async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<$NextFunctionVer> {\n if (typeof req.body !== 'string') {\n return next(errorUtils.getBadRequest('version is missing'));\n }\n\n const tags = {};\n tags[req.params.tag] = req.body;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_ADDED,\n });\n } catch (err) {\n next(err);\n }\n };\n\n // tagging a package.\n route.put(\n DIST_TAGS_API_ENDPOINTS.tagging,\n can('publish'),\n media(HEADERS.JSON),\n addTagPackageVersionMiddleware\n );\n\n route.put(\n DIST_TAGS_API_ENDPOINTS.tagging_package,\n can('publish'),\n media(HEADERS.JSON),\n addTagPackageVersionMiddleware\n );\n\n route.delete(\n DIST_TAGS_API_ENDPOINTS.tagging_package,\n can('publish'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const tags = {};\n tags[req.params.tag] = null;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_REMOVED,\n });\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.get(\n DIST_TAGS_API_ENDPOINTS.get_dist_tags,\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const name = req.params.package;\n const requestOptions = getRequestOptions(req);\n try {\n const manifest = await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n requestOptions,\n });\n next(manifest[constants.DIST_TAGS]);\n } catch (err) {\n next(err);\n }\n }\n );\n}\n"],"mappings":";;;;AAUA,SAAA,kBAAyB,OAAe,MAAY,SAAkB,QAAsB;CAC1F,MAAM,OAAA,GAAA,sBAAA,OAAY,MAAM;EACtB,YAAY,GAAG,MAAM,OAAO,MAAM,GAAG,EAAE;EACvC,WAAW,GAAG,MAAM,OAAO,MAAM,GAAG,EAAE;EACvC,CAAC;CACF,MAAM,iCAAiC,eACrC,KACA,KACA,MAC2B;AAC3B,MAAI,OAAO,IAAI,SAAS,SACtB,QAAO,KAAK,gBAAA,WAAW,cAAc,qBAAqB,CAAC;EAG7D,MAAM,OAAO,EAAE;AACf,OAAK,IAAI,OAAO,OAAO,IAAI;AAC3B,MAAI;AACF,SAAM,QAAQ,cAAc,IAAI,OAAO,SAAS,KAAK;AACrD,OAAI,OAAO,gBAAA,UAAU,YAAY,QAAQ;AACzC,UAAO,KAAK,EACV,IAAI,gBAAA,UAAU,YAAY,WAC3B,CAAC;WACK,KAAK;AACZ,QAAK,IAAI;;;AAKb,OAAM,IACJ,sBAAA,wBAAwB,SACxB,IAAI,UAAU,GAAA,GAAA,sBAAA,OACR,gBAAA,QAAQ,KAAK,EACnB,+BACD;AAED,OAAM,IACJ,sBAAA,wBAAwB,iBACxB,IAAI,UAAU,GAAA,GAAA,sBAAA,OACR,gBAAA,QAAQ,KAAK,EACnB,+BACD;AAED,OAAM,OACJ,sBAAA,wBAAwB,iBACxB,IAAI,UAAU,EACd,eACE,KACA,KACA,MACe;EACf,MAAM,OAAO,EAAE;AACf,OAAK,IAAI,OAAO,OAAO;AACvB,MAAI;AACF,SAAM,QAAQ,cAAc,IAAI,OAAO,SAAS,KAAK;AACrD,OAAI,OAAO,gBAAA,UAAU,YAAY,QAAQ;AACzC,UAAO,KAAK,EACV,IAAI,gBAAA,UAAU,YAAY,aAC3B,CAAC;WACK,KAAK;AACZ,QAAK,IAAI;;GAGd;AAED,OAAM,IACJ,sBAAA,wBAAwB,eACxB,IAAI,SAAS,EACb,eACE,KACA,KACA,MACe;EACf,MAAM,OAAO,IAAI,OAAO;EACxB,MAAM,kBAAA,GAAA,sBAAA,mBAAmC,IAAI;AAC7C,MAAI;AAMF,SALiB,MAAM,QAAQ,oBAAoB;IACjD;IACA,aAAa;IACb;IACD,CAAC,EACY,gBAAA,UAAU,WAAW;WAC5B,KAAK;AACZ,QAAK,IAAI;;GAGd"}
@@ -1,5 +1,4 @@
1
1
  import { DIST_TAGS_API_ENDPOINTS, allow, getRequestOptions, media } from "@verdaccio/middleware";
2
- import _ from "lodash";
3
2
  import { HEADERS, constants, errorUtils } from "@verdaccio/core";
4
3
  //#region src/dist-tags.ts
5
4
  function dist_tags_default(route, auth, storage, logger) {
@@ -8,7 +7,7 @@ function dist_tags_default(route, auth, storage, logger) {
8
7
  afterAll: (a, b) => logger.trace(a, b)
9
8
  });
10
9
  const addTagPackageVersionMiddleware = async function(req, res, next) {
11
- if (_.isString(req.body) === false) return next(errorUtils.getBadRequest("version is missing"));
10
+ if (typeof req.body !== "string") return next(errorUtils.getBadRequest("version is missing"));
12
11
  const tags = {};
13
12
  tags[req.params.tag] = req.body;
14
13
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"dist-tags.mjs","names":[],"sources":["../src/dist-tags.ts"],"sourcesContent":["import type { Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { HEADERS, constants, errorUtils } from '@verdaccio/core';\nimport { DIST_TAGS_API_ENDPOINTS, allow, getRequestOptions, media } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Logger } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router, auth: Auth, storage: Storage, logger: Logger): void {\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\n const addTagPackageVersionMiddleware = async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<$NextFunctionVer> {\n if (_.isString(req.body) === false) {\n return next(errorUtils.getBadRequest('version is missing'));\n }\n\n const tags = {};\n tags[req.params.tag] = req.body;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_ADDED,\n });\n } catch (err) {\n next(err);\n }\n };\n\n // tagging a package.\n route.put(\n DIST_TAGS_API_ENDPOINTS.tagging,\n can('publish'),\n media(HEADERS.JSON),\n addTagPackageVersionMiddleware\n );\n\n route.put(\n DIST_TAGS_API_ENDPOINTS.tagging_package,\n can('publish'),\n media(HEADERS.JSON),\n addTagPackageVersionMiddleware\n );\n\n route.delete(\n DIST_TAGS_API_ENDPOINTS.tagging_package,\n can('publish'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const tags = {};\n tags[req.params.tag] = null;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_REMOVED,\n });\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.get(\n DIST_TAGS_API_ENDPOINTS.get_dist_tags,\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const name = req.params.package;\n const requestOptions = getRequestOptions(req);\n try {\n const manifest = await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n requestOptions,\n });\n next(manifest[constants.DIST_TAGS]);\n } catch (err) {\n next(err);\n }\n }\n );\n}\n"],"mappings":";;;;AAWA,SAAA,kBAAyB,OAAe,MAAY,SAAkB,QAAsB;CAC1F,MAAM,MAAM,MAAM,MAAM;EACtB,YAAY,GAAG,MAAM,OAAO,MAAM,GAAG,EAAE;EACvC,WAAW,GAAG,MAAM,OAAO,MAAM,GAAG,EAAE;EACvC,CAAC;CACF,MAAM,iCAAiC,eACrC,KACA,KACA,MAC2B;AAC3B,MAAI,EAAE,SAAS,IAAI,KAAK,KAAK,MAC3B,QAAO,KAAK,WAAW,cAAc,qBAAqB,CAAC;EAG7D,MAAM,OAAO,EAAE;AACf,OAAK,IAAI,OAAO,OAAO,IAAI;AAC3B,MAAI;AACF,SAAM,QAAQ,cAAc,IAAI,OAAO,SAAS,KAAK;AACrD,OAAI,OAAO,UAAU,YAAY,QAAQ;AACzC,UAAO,KAAK,EACV,IAAI,UAAU,YAAY,WAC3B,CAAC;WACK,KAAK;AACZ,QAAK,IAAI;;;AAKb,OAAM,IACJ,wBAAwB,SACxB,IAAI,UAAU,EACd,MAAM,QAAQ,KAAK,EACnB,+BACD;AAED,OAAM,IACJ,wBAAwB,iBACxB,IAAI,UAAU,EACd,MAAM,QAAQ,KAAK,EACnB,+BACD;AAED,OAAM,OACJ,wBAAwB,iBACxB,IAAI,UAAU,EACd,eACE,KACA,KACA,MACe;EACf,MAAM,OAAO,EAAE;AACf,OAAK,IAAI,OAAO,OAAO;AACvB,MAAI;AACF,SAAM,QAAQ,cAAc,IAAI,OAAO,SAAS,KAAK;AACrD,OAAI,OAAO,UAAU,YAAY,QAAQ;AACzC,UAAO,KAAK,EACV,IAAI,UAAU,YAAY,aAC3B,CAAC;WACK,KAAK;AACZ,QAAK,IAAI;;GAGd;AAED,OAAM,IACJ,wBAAwB,eACxB,IAAI,SAAS,EACb,eACE,KACA,KACA,MACe;EACf,MAAM,OAAO,IAAI,OAAO;EACxB,MAAM,iBAAiB,kBAAkB,IAAI;AAC7C,MAAI;AAMF,SALiB,MAAM,QAAQ,oBAAoB;IACjD;IACA,aAAa;IACb;IACD,CAAC,EACY,UAAU,WAAW;WAC5B,KAAK;AACZ,QAAK,IAAI;;GAGd"}
1
+ {"version":3,"file":"dist-tags.mjs","names":[],"sources":["../src/dist-tags.ts"],"sourcesContent":["import type { Router } from 'express';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { HEADERS, constants, errorUtils } from '@verdaccio/core';\nimport { DIST_TAGS_API_ENDPOINTS, allow, getRequestOptions, media } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Logger } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types/custom';\n\nexport default function (route: Router, auth: Auth, storage: Storage, logger: Logger): void {\n const can = allow(auth, {\n beforeAll: (a, b) => logger.trace(a, b),\n afterAll: (a, b) => logger.trace(a, b),\n });\n const addTagPackageVersionMiddleware = async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<$NextFunctionVer> {\n if (typeof req.body !== 'string') {\n return next(errorUtils.getBadRequest('version is missing'));\n }\n\n const tags = {};\n tags[req.params.tag] = req.body;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_ADDED,\n });\n } catch (err) {\n next(err);\n }\n };\n\n // tagging a package.\n route.put(\n DIST_TAGS_API_ENDPOINTS.tagging,\n can('publish'),\n media(HEADERS.JSON),\n addTagPackageVersionMiddleware\n );\n\n route.put(\n DIST_TAGS_API_ENDPOINTS.tagging_package,\n can('publish'),\n media(HEADERS.JSON),\n addTagPackageVersionMiddleware\n );\n\n route.delete(\n DIST_TAGS_API_ENDPOINTS.tagging_package,\n can('publish'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const tags = {};\n tags[req.params.tag] = null;\n try {\n await storage.mergeTagsNext(req.params.package, tags);\n res.status(constants.HTTP_STATUS.CREATED);\n return next({\n ok: constants.API_MESSAGE.TAG_REMOVED,\n });\n } catch (err) {\n next(err);\n }\n }\n );\n\n route.get(\n DIST_TAGS_API_ENDPOINTS.get_dist_tags,\n can('access'),\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const name = req.params.package;\n const requestOptions = getRequestOptions(req);\n try {\n const manifest = await storage.getPackageByOptions({\n name,\n uplinksLook: true,\n requestOptions,\n });\n next(manifest[constants.DIST_TAGS]);\n } catch (err) {\n next(err);\n }\n }\n );\n}\n"],"mappings":";;;AAUA,SAAA,kBAAyB,OAAe,MAAY,SAAkB,QAAsB;CAC1F,MAAM,MAAM,MAAM,MAAM;EACtB,YAAY,GAAG,MAAM,OAAO,MAAM,GAAG,EAAE;EACvC,WAAW,GAAG,MAAM,OAAO,MAAM,GAAG,EAAE;EACvC,CAAC;CACF,MAAM,iCAAiC,eACrC,KACA,KACA,MAC2B;AAC3B,MAAI,OAAO,IAAI,SAAS,SACtB,QAAO,KAAK,WAAW,cAAc,qBAAqB,CAAC;EAG7D,MAAM,OAAO,EAAE;AACf,OAAK,IAAI,OAAO,OAAO,IAAI;AAC3B,MAAI;AACF,SAAM,QAAQ,cAAc,IAAI,OAAO,SAAS,KAAK;AACrD,OAAI,OAAO,UAAU,YAAY,QAAQ;AACzC,UAAO,KAAK,EACV,IAAI,UAAU,YAAY,WAC3B,CAAC;WACK,KAAK;AACZ,QAAK,IAAI;;;AAKb,OAAM,IACJ,wBAAwB,SACxB,IAAI,UAAU,EACd,MAAM,QAAQ,KAAK,EACnB,+BACD;AAED,OAAM,IACJ,wBAAwB,iBACxB,IAAI,UAAU,EACd,MAAM,QAAQ,KAAK,EACnB,+BACD;AAED,OAAM,OACJ,wBAAwB,iBACxB,IAAI,UAAU,EACd,eACE,KACA,KACA,MACe;EACf,MAAM,OAAO,EAAE;AACf,OAAK,IAAI,OAAO,OAAO;AACvB,MAAI;AACF,SAAM,QAAQ,cAAc,IAAI,OAAO,SAAS,KAAK;AACrD,OAAI,OAAO,UAAU,YAAY,QAAQ;AACzC,UAAO,KAAK,EACV,IAAI,UAAU,YAAY,aAC3B,CAAC;WACK,KAAK;AACZ,QAAK,IAAI;;GAGd;AAED,OAAM,IACJ,wBAAwB,eACxB,IAAI,SAAS,EACb,eACE,KACA,KACA,MACe;EACf,MAAM,OAAO,IAAI,OAAO;EACxB,MAAM,iBAAiB,kBAAkB,IAAI;AAC7C,MAAI;AAMF,SALiB,MAAM,QAAQ,oBAAoB;IACjD;IACA,aAAa;IACb;IACD,CAAC,EACY,UAAU,WAAW;WAC5B,KAAK;AACZ,QAAK,IAAI;;GAGd"}
package/build/stars.js CHANGED
@@ -1,15 +1,14 @@
1
- const require_runtime = require("./_virtual/_rolldown/runtime.js");
1
+ require("./_virtual/_rolldown/runtime.js");
2
2
  let _verdaccio_middleware = require("@verdaccio/middleware");
3
- let lodash = require("lodash");
4
- lodash = require_runtime.__toESM(lodash);
5
3
  let _verdaccio_core = require("@verdaccio/core");
4
+ let lodash_es = require("lodash-es");
6
5
  //#region src/stars.ts
7
6
  function stars_default(route, storage) {
8
7
  route.get(_verdaccio_middleware.STARS_API_ENDPOINTS.get_user_starred_packages, async (req, res, next) => {
9
8
  const query = req.query;
10
9
  if (typeof query?.key !== "string") return next(_verdaccio_core.errorUtils.getBadRequest("missing query key username"));
11
10
  try {
12
- const filteredPackages = (await storage.getLocalDatabase()).filter((localPackage) => lodash.default.keys(localPackage[_verdaccio_core.USERS]).includes(query?.key.toString().replace(/['"]+/g, "")));
11
+ const filteredPackages = (await storage.getLocalDatabase()).filter((localPackage) => (0, lodash_es.keys)(localPackage[_verdaccio_core.USERS]).includes(query?.key.toString().replace(/['"]+/g, "")));
13
12
  res.status(_verdaccio_core.HTTP_STATUS.OK);
14
13
  next({ rows: filteredPackages.map((filteredPackage) => ({ value: filteredPackage.name })) });
15
14
  } catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"stars.js","names":[],"sources":["../src/stars.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { HTTP_STATUS, USERS, errorUtils } from '@verdaccio/core';\nimport { STARS_API_ENDPOINTS } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Version } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../types/custom';\n\nexport default function (route: Router, storage: Storage): void {\n route.get(\n STARS_API_ENDPOINTS.get_user_starred_packages,\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer): Promise<void> => {\n const query: { key: string } = req.query;\n if (typeof query?.key !== 'string') {\n return next(errorUtils.getBadRequest('missing query key username'));\n }\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n const filteredPackages: Version[] = localPackages.filter((localPackage: Version) =>\n _.keys(localPackage[USERS]).includes(query?.key.toString().replace(/['\"]+/g, ''))\n );\n\n res.status(HTTP_STATUS.OK);\n next({\n rows: filteredPackages.map((filteredPackage: Version) => ({\n value: filteredPackage.name,\n })),\n });\n } catch (err: any) {\n return next(err);\n }\n }\n );\n}\n"],"mappings":";;;;;;AAUA,SAAA,cAAyB,OAAe,SAAwB;AAC9D,OAAM,IACJ,sBAAA,oBAAoB,2BACpB,OAAO,KAAqB,KAAe,SAA0C;EACnF,MAAM,QAAyB,IAAI;AACnC,MAAI,OAAO,OAAO,QAAQ,SACxB,QAAO,KAAK,gBAAA,WAAW,cAAc,6BAA6B,CAAC;AAGrE,MAAI;GAEF,MAAM,oBAD2B,MAAM,QAAQ,kBAAkB,EACf,QAAQ,iBACxD,OAAA,QAAE,KAAK,aAAa,gBAAA,OAAO,CAAC,SAAS,OAAO,IAAI,UAAU,CAAC,QAAQ,UAAU,GAAG,CAAC,CAClF;AAED,OAAI,OAAO,gBAAA,YAAY,GAAG;AAC1B,QAAK,EACH,MAAM,iBAAiB,KAAK,qBAA8B,EACxD,OAAO,gBAAgB,MACxB,EAAE,EACJ,CAAC;WACK,KAAU;AACjB,UAAO,KAAK,IAAI;;GAGrB"}
1
+ {"version":3,"file":"stars.js","names":[],"sources":["../src/stars.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport { keys } from 'lodash-es';\n\nimport { HTTP_STATUS, USERS, errorUtils } from '@verdaccio/core';\nimport { STARS_API_ENDPOINTS } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Version } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../types/custom';\n\nexport default function (route: Router, storage: Storage): void {\n route.get(\n STARS_API_ENDPOINTS.get_user_starred_packages,\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer): Promise<void> => {\n const query: { key: string } = req.query;\n if (typeof query?.key !== 'string') {\n return next(errorUtils.getBadRequest('missing query key username'));\n }\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n const filteredPackages: Version[] = localPackages.filter((localPackage: Version) =>\n keys(localPackage[USERS]).includes(query?.key.toString().replace(/['\"]+/g, ''))\n );\n\n res.status(HTTP_STATUS.OK);\n next({\n rows: filteredPackages.map((filteredPackage: Version) => ({\n value: filteredPackage.name,\n })),\n });\n } catch (err: any) {\n return next(err);\n }\n }\n );\n}\n"],"mappings":";;;;;AAUA,SAAA,cAAyB,OAAe,SAAwB;AAC9D,OAAM,IACJ,sBAAA,oBAAoB,2BACpB,OAAO,KAAqB,KAAe,SAA0C;EACnF,MAAM,QAAyB,IAAI;AACnC,MAAI,OAAO,OAAO,QAAQ,SACxB,QAAO,KAAK,gBAAA,WAAW,cAAc,6BAA6B,CAAC;AAGrE,MAAI;GAEF,MAAM,oBAD2B,MAAM,QAAQ,kBAAkB,EACf,QAAQ,kBAAA,GAAA,UAAA,MACnD,aAAa,gBAAA,OAAO,CAAC,SAAS,OAAO,IAAI,UAAU,CAAC,QAAQ,UAAU,GAAG,CAAC,CAChF;AAED,OAAI,OAAO,gBAAA,YAAY,GAAG;AAC1B,QAAK,EACH,MAAM,iBAAiB,KAAK,qBAA8B,EACxD,OAAO,gBAAgB,MACxB,EAAE,EACJ,CAAC;WACK,KAAU;AACjB,UAAO,KAAK,IAAI;;GAGrB"}
package/build/stars.mjs CHANGED
@@ -1,13 +1,13 @@
1
1
  import { STARS_API_ENDPOINTS } from "@verdaccio/middleware";
2
- import _ from "lodash";
3
2
  import { HTTP_STATUS, USERS, errorUtils } from "@verdaccio/core";
3
+ import { keys } from "lodash-es";
4
4
  //#region src/stars.ts
5
5
  function stars_default(route, storage) {
6
6
  route.get(STARS_API_ENDPOINTS.get_user_starred_packages, async (req, res, next) => {
7
7
  const query = req.query;
8
8
  if (typeof query?.key !== "string") return next(errorUtils.getBadRequest("missing query key username"));
9
9
  try {
10
- const filteredPackages = (await storage.getLocalDatabase()).filter((localPackage) => _.keys(localPackage[USERS]).includes(query?.key.toString().replace(/['"]+/g, "")));
10
+ const filteredPackages = (await storage.getLocalDatabase()).filter((localPackage) => keys(localPackage[USERS]).includes(query?.key.toString().replace(/['"]+/g, "")));
11
11
  res.status(HTTP_STATUS.OK);
12
12
  next({ rows: filteredPackages.map((filteredPackage) => ({ value: filteredPackage.name })) });
13
13
  } catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"stars.mjs","names":[],"sources":["../src/stars.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport { HTTP_STATUS, USERS, errorUtils } from '@verdaccio/core';\nimport { STARS_API_ENDPOINTS } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Version } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../types/custom';\n\nexport default function (route: Router, storage: Storage): void {\n route.get(\n STARS_API_ENDPOINTS.get_user_starred_packages,\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer): Promise<void> => {\n const query: { key: string } = req.query;\n if (typeof query?.key !== 'string') {\n return next(errorUtils.getBadRequest('missing query key username'));\n }\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n const filteredPackages: Version[] = localPackages.filter((localPackage: Version) =>\n _.keys(localPackage[USERS]).includes(query?.key.toString().replace(/['\"]+/g, ''))\n );\n\n res.status(HTTP_STATUS.OK);\n next({\n rows: filteredPackages.map((filteredPackage: Version) => ({\n value: filteredPackage.name,\n })),\n });\n } catch (err: any) {\n return next(err);\n }\n }\n );\n}\n"],"mappings":";;;;AAUA,SAAA,cAAyB,OAAe,SAAwB;AAC9D,OAAM,IACJ,oBAAoB,2BACpB,OAAO,KAAqB,KAAe,SAA0C;EACnF,MAAM,QAAyB,IAAI;AACnC,MAAI,OAAO,OAAO,QAAQ,SACxB,QAAO,KAAK,WAAW,cAAc,6BAA6B,CAAC;AAGrE,MAAI;GAEF,MAAM,oBAD2B,MAAM,QAAQ,kBAAkB,EACf,QAAQ,iBACxD,EAAE,KAAK,aAAa,OAAO,CAAC,SAAS,OAAO,IAAI,UAAU,CAAC,QAAQ,UAAU,GAAG,CAAC,CAClF;AAED,OAAI,OAAO,YAAY,GAAG;AAC1B,QAAK,EACH,MAAM,iBAAiB,KAAK,qBAA8B,EACxD,OAAO,gBAAgB,MACxB,EAAE,EACJ,CAAC;WACK,KAAU;AACjB,UAAO,KAAK,IAAI;;GAGrB"}
1
+ {"version":3,"file":"stars.mjs","names":[],"sources":["../src/stars.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport { keys } from 'lodash-es';\n\nimport { HTTP_STATUS, USERS, errorUtils } from '@verdaccio/core';\nimport { STARS_API_ENDPOINTS } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Version } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../types/custom';\n\nexport default function (route: Router, storage: Storage): void {\n route.get(\n STARS_API_ENDPOINTS.get_user_starred_packages,\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer): Promise<void> => {\n const query: { key: string } = req.query;\n if (typeof query?.key !== 'string') {\n return next(errorUtils.getBadRequest('missing query key username'));\n }\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n const filteredPackages: Version[] = localPackages.filter((localPackage: Version) =>\n keys(localPackage[USERS]).includes(query?.key.toString().replace(/['\"]+/g, ''))\n );\n\n res.status(HTTP_STATUS.OK);\n next({\n rows: filteredPackages.map((filteredPackage: Version) => ({\n value: filteredPackage.name,\n })),\n });\n } catch (err: any) {\n return next(err);\n }\n }\n );\n}\n"],"mappings":";;;;AAUA,SAAA,cAAyB,OAAe,SAAwB;AAC9D,OAAM,IACJ,oBAAoB,2BACpB,OAAO,KAAqB,KAAe,SAA0C;EACnF,MAAM,QAAyB,IAAI;AACnC,MAAI,OAAO,OAAO,QAAQ,SACxB,QAAO,KAAK,WAAW,cAAc,6BAA6B,CAAC;AAGrE,MAAI;GAEF,MAAM,oBAD2B,MAAM,QAAQ,kBAAkB,EACf,QAAQ,iBACxD,KAAK,aAAa,OAAO,CAAC,SAAS,OAAO,IAAI,UAAU,CAAC,QAAQ,UAAU,GAAG,CAAC,CAChF;AAED,OAAI,OAAO,YAAY,GAAG;AAC1B,QAAK,EACH,MAAM,iBAAiB,KAAK,qBAA8B,EACxD,OAAO,gBAAgB,MACxB,EAAE,EACJ,CAAC;WACK,KAAU;AACjB,UAAO,KAAK,IAAI;;GAGrB"}
@@ -1,8 +1,7 @@
1
- const require_runtime = require("../_virtual/_rolldown/runtime.js");
1
+ require("../_virtual/_rolldown/runtime.js");
2
2
  let _verdaccio_middleware = require("@verdaccio/middleware");
3
- let lodash = require("lodash");
4
- lodash = require_runtime.__toESM(lodash);
5
3
  let _verdaccio_core = require("@verdaccio/core");
4
+ let lodash_es = require("lodash-es");
6
5
  //#region src/v1/profile.ts
7
6
  function profile_default(route, auth, config) {
8
7
  function buildProfile(name) {
@@ -18,26 +17,26 @@ function profile_default(route, auth, config) {
18
17
  };
19
18
  }
20
19
  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));
20
+ if ((0, lodash_es.isNil)(req.remote_user.name) === false) return next(buildProfile(req.remote_user.name));
22
21
  res.status(_verdaccio_core.HTTP_STATUS.UNAUTHORIZED);
23
22
  return next({ message: _verdaccio_core.API_ERROR.MUST_BE_LOGGED });
24
23
  });
25
24
  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)) {
25
+ if ((0, lodash_es.isNil)(req.remote_user.name)) {
27
26
  res.status(_verdaccio_core.HTTP_STATUS.UNAUTHORIZED);
28
27
  return next({ message: _verdaccio_core.API_ERROR.MUST_BE_LOGGED });
29
28
  }
30
29
  const { password, tfa } = req.body;
31
30
  const { name } = req.remote_user;
32
- if (lodash.default.isNil(password) === false) {
31
+ if ((0, lodash_es.isNil)(password) === false) {
33
32
  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"));
33
+ if ((0, lodash_es.isEmpty)(password.old)) return next(_verdaccio_core.errorUtils.getBadRequest("old password is required"));
35
34
  auth.changePassword(name, password.old, password.new, (err, isUpdated) => {
36
- if (lodash.default.isNull(err) === false) return next(_verdaccio_core.errorUtils.getForbidden(err.message));
35
+ if (err !== null) return next(_verdaccio_core.errorUtils.getForbidden(err.message));
37
36
  if (isUpdated) return next(buildProfile(req.remote_user.name));
38
37
  return next(_verdaccio_core.errorUtils.getInternalError(_verdaccio_core.API_ERROR.INTERNAL_SERVER_ERROR));
39
38
  });
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));
39
+ } else if ((0, lodash_es.isNil)(tfa) === false) return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.SERVICE_UNAVAILABLE, _verdaccio_core.SUPPORT_ERRORS.TFA_DISABLED));
41
40
  else return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.INTERNAL_ERROR, _verdaccio_core.APP_ERROR.PROFILE_ERROR));
42
41
  });
43
42
  }
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"profile.js","names":[],"sources":["../../src/v1/profile.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport { isEmpty, isNil } from 'lodash-es';\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 (err !== null) {\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,OAAA,GAAA,UAAA,OAAU,IAAI,YAAY,KAAK,KAAK,MAClC,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,OAAA,GAAA,UAAA,OAAU,IAAI,YAAY,KAAK,EAAE;AAC/B,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,OAAA,GAAA,UAAA,OAAU,SAAS,KAAK,OAAO;AAC7B,OACE,gBAAA,gBAAgB,iBACd,SAAS,KACT,QAAQ,QAAQ,wBACjB,KAAK,MAGN,QAAO,KAAK,gBAAA,WAAW,QAAQ,gBAAA,YAAY,cAAc,gBAAA,UAAU,eAAe,CAAC;AAGrF,QAAA,GAAA,UAAA,SAAY,SAAS,IAAI,CACvB,QAAO,KAAK,gBAAA,WAAW,cAAc,2BAA2B,CAAC;AAGnE,QAAK,eACH,MACA,SAAS,KACT,SAAS,MACR,KAAK,cAAgC;AACpC,QAAI,QAAQ,KACV,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;kCACc,IAAI,KAAK,MACxB,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"}
@@ -1,6 +1,6 @@
1
1
  import { PROFILE_API_ENDPOINTS, rateLimit } from "@verdaccio/middleware";
2
- import _ from "lodash";
3
2
  import { API_ERROR, APP_ERROR, HTTP_STATUS, SUPPORT_ERRORS, errorUtils, validationUtils } from "@verdaccio/core";
3
+ import { isEmpty, isNil } from "lodash-es";
4
4
  //#region src/v1/profile.ts
5
5
  function profile_default(route, auth, config) {
6
6
  function buildProfile(name) {
@@ -16,26 +16,26 @@ function profile_default(route, auth, config) {
16
16
  };
17
17
  }
18
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));
19
+ if (isNil(req.remote_user.name) === false) return next(buildProfile(req.remote_user.name));
20
20
  res.status(HTTP_STATUS.UNAUTHORIZED);
21
21
  return next({ message: API_ERROR.MUST_BE_LOGGED });
22
22
  });
23
23
  route.post(PROFILE_API_ENDPOINTS.get_profile, rateLimit(config?.userRateLimit), function(req, res, next) {
24
- if (_.isNil(req.remote_user.name)) {
24
+ if (isNil(req.remote_user.name)) {
25
25
  res.status(HTTP_STATUS.UNAUTHORIZED);
26
26
  return next({ message: API_ERROR.MUST_BE_LOGGED });
27
27
  }
28
28
  const { password, tfa } = req.body;
29
29
  const { name } = req.remote_user;
30
- if (_.isNil(password) === false) {
30
+ if (isNil(password) === false) {
31
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"));
32
+ if (isEmpty(password.old)) return next(errorUtils.getBadRequest("old password is required"));
33
33
  auth.changePassword(name, password.old, password.new, (err, isUpdated) => {
34
- if (_.isNull(err) === false) return next(errorUtils.getForbidden(err.message));
34
+ if (err !== null) return next(errorUtils.getForbidden(err.message));
35
35
  if (isUpdated) return next(buildProfile(req.remote_user.name));
36
36
  return next(errorUtils.getInternalError(API_ERROR.INTERNAL_SERVER_ERROR));
37
37
  });
38
- } else if (_.isNil(tfa) === false) return next(errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED));
38
+ } else if (isNil(tfa) === false) return next(errorUtils.getCode(HTTP_STATUS.SERVICE_UNAVAILABLE, SUPPORT_ERRORS.TFA_DISABLED));
39
39
  else return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, APP_ERROR.PROFILE_ERROR));
40
40
  });
41
41
  }
@@ -1 +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
+ {"version":3,"file":"profile.mjs","names":[],"sources":["../../src/v1/profile.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport { isEmpty, isNil } from 'lodash-es';\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 (err !== null) {\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,MAAM,IAAI,YAAY,KAAK,KAAK,MAClC,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,MAAM,IAAI,YAAY,KAAK,EAAE;AAC/B,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,MAAM,SAAS,KAAK,OAAO;AAC7B,OACE,gBAAgB,iBACd,SAAS,KACT,QAAQ,QAAQ,wBACjB,KAAK,MAGN,QAAO,KAAK,WAAW,QAAQ,YAAY,cAAc,UAAU,eAAe,CAAC;AAGrF,OAAI,QAAQ,SAAS,IAAI,CACvB,QAAO,KAAK,WAAW,cAAc,2BAA2B,CAAC;AAGnE,QAAK,eACH,MACA,SAAS,KACT,SAAS,MACR,KAAK,cAAgC;AACpC,QAAI,QAAQ,KACV,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,MAAM,IAAI,KAAK,MACxB,QAAO,KACL,WAAW,QAAQ,YAAY,qBAAqB,eAAe,aAAa,CACjF;MAED,QAAO,KAAK,WAAW,QAAQ,YAAY,gBAAgB,UAAU,cAAc,CAAC;GAGzF"}
@@ -1,7 +1,5 @@
1
1
  const require_runtime = require("../_virtual/_rolldown/runtime.js");
2
2
  let _verdaccio_middleware = require("@verdaccio/middleware");
3
- let lodash = require("lodash");
4
- lodash = require_runtime.__toESM(lodash);
5
3
  let _verdaccio_core = require("@verdaccio/core");
6
4
  let debug = require("debug");
7
5
  debug = require_runtime.__toESM(debug);
@@ -46,7 +44,7 @@ function search_default(route, auth, storage, logger) {
46
44
  debug$1("storage items tota: %o", data.length);
47
45
  const final = (await Promise.all(data.map((pkgItem) => {
48
46
  return checkAccess(pkgItem, auth, req.remote_user);
49
- }))).filter((i) => !lodash.default.isNull(i)).slice(from, size);
47
+ }))).filter((i) => i !== null).slice(from, size);
50
48
  logger.debug(`search results ${final?.length}`);
51
49
  const response = {
52
50
  objects: final,
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"search.js","names":[],"sources":["../../src/v1/search.ts"],"sourcesContent":["import buildDebug from 'debug';\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) => i !== null)\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":";;;;;;AASA,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,MAAM,KAAK,CACzB,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"}
@@ -1,5 +1,4 @@
1
1
  import { SEARCH_API_ENDPOINTS } from "@verdaccio/middleware";
2
- import _ from "lodash";
3
2
  import { HTTP_STATUS } from "@verdaccio/core";
4
3
  import buildDebug from "debug";
5
4
  //#region src/v1/search.ts
@@ -43,7 +42,7 @@ function search_default(route, auth, storage, logger) {
43
42
  debug("storage items tota: %o", data.length);
44
43
  const final = (await Promise.all(data.map((pkgItem) => {
45
44
  return checkAccess(pkgItem, auth, req.remote_user);
46
- }))).filter((i) => !_.isNull(i)).slice(from, size);
45
+ }))).filter((i) => i !== null).slice(from, size);
47
46
  logger.debug(`search results ${final?.length}`);
48
47
  const response = {
49
48
  objects: final,
@@ -1 +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
+ {"version":3,"file":"search.mjs","names":[],"sources":["../../src/v1/search.ts"],"sourcesContent":["import buildDebug from 'debug';\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) => i !== null)\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":";;;;AASA,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,MAAM,KAAK,CACzB,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.js CHANGED
@@ -1,8 +1,7 @@
1
- const require_runtime = require("../_virtual/_rolldown/runtime.js");
1
+ require("../_virtual/_rolldown/runtime.js");
2
2
  let _verdaccio_middleware = require("@verdaccio/middleware");
3
- let lodash = require("lodash");
4
- lodash = require_runtime.__toESM(lodash);
5
3
  let _verdaccio_core = require("@verdaccio/core");
4
+ let lodash_es = require("lodash-es");
6
5
  let _verdaccio_auth = require("@verdaccio/auth");
7
6
  //#region src/v1/token.ts
8
7
  function normalizeToken(token) {
@@ -15,7 +14,7 @@ function normalizeToken(token) {
15
14
  function token_default(route, auth, storage, config, logger) {
16
15
  route.get(_verdaccio_middleware.TOKEN_API_ENDPOINTS.get_tokens, (0, _verdaccio_middleware.rateLimit)(config?.userRateLimit), async function(req, res, next) {
17
16
  const { name } = req.remote_user;
18
- if (lodash.default.isNil(name) === false) try {
17
+ if ((0, lodash_es.isNil)(name) === false) try {
19
18
  const tokens = await storage.readTokens({ user: name });
20
19
  const totalTokens = tokens.length;
21
20
  logger.debug({ totalTokens }, "token list retrieved: @{totalTokens}");
@@ -33,14 +32,14 @@ function token_default(route, auth, storage, config, logger) {
33
32
  route.post(_verdaccio_middleware.TOKEN_API_ENDPOINTS.get_tokens, (0, _verdaccio_middleware.rateLimit)(config?.userRateLimit), function(req, res, next) {
34
33
  const { password, readonly, cidr_whitelist } = req.body;
35
34
  const { name } = req.remote_user;
36
- if (!lodash.default.isBoolean(readonly) || !lodash.default.isArray(cidr_whitelist)) return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.BAD_DATA, _verdaccio_core.SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
35
+ if (!(0, lodash_es.isBoolean)(readonly) || !Array.isArray(cidr_whitelist)) return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.BAD_DATA, _verdaccio_core.SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
37
36
  auth.authenticate(name, password, async (err, user) => {
38
37
  if (err) {
39
38
  const errorCode = err.message ? _verdaccio_core.HTTP_STATUS.UNAUTHORIZED : _verdaccio_core.HTTP_STATUS.INTERNAL_ERROR;
40
39
  return next(_verdaccio_core.errorUtils.getCode(errorCode, err.message));
41
40
  }
42
41
  req.remote_user = user;
43
- if (!lodash.default.isFunction(storage.saveToken)) return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.NOT_IMPLEMENTED, _verdaccio_core.SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT));
42
+ if (typeof storage.saveToken !== "function") return next(_verdaccio_core.errorUtils.getCode(_verdaccio_core.HTTP_STATUS.NOT_IMPLEMENTED, _verdaccio_core.SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT));
44
43
  try {
45
44
  const token = await (0, _verdaccio_auth.getApiToken)(auth, config, user, password);
46
45
  if (!token) throw _verdaccio_core.errorUtils.getInternalError();
@@ -81,7 +80,7 @@ function token_default(route, auth, storage, config, logger) {
81
80
  route.delete(_verdaccio_middleware.TOKEN_API_ENDPOINTS.delete_token, (0, _verdaccio_middleware.rateLimit)(config?.userRateLimit), async (req, res, next) => {
82
81
  const { params: { tokenKey } } = req;
83
82
  const { name } = req.remote_user;
84
- if (lodash.default.isNil(name) === false) {
83
+ if ((0, lodash_es.isNil)(name) === false) {
85
84
  logger.debug({ name }, "@{name} has requested remove a token");
86
85
  try {
87
86
  await storage.deleteToken(name, tokenKey);
@@ -1 +1 @@
1
- {"version":3,"file":"token.js","names":[],"sources":["../../src/v1/token.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { getApiToken } from '@verdaccio/auth';\nimport { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from '@verdaccio/core';\nimport { TOKEN_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Config, Logger, RemoteUser, Token } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n cidr_whitelist: string[];\n created: string;\n};\n\n// npm expects \"cidr_whitelist\" for token list\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n cidr_whitelist: token.cidr || [],\n created: new Date(token.created).toISOString(),\n };\n}\n\n// https://github.com/npm/npm-profile/blob/latest/lib/index.js\nexport default function (\n route: Router,\n auth: Auth,\n storage: Storage,\n config: Config,\n logger: Logger\n): void {\n route.get(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\n async function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { name } = req.remote_user;\n\n if (_.isNil(name) === false) {\n try {\n const tokens = await storage.readTokens({ user: name });\n const totalTokens = tokens.length;\n logger.debug({ totalTokens }, 'token list retrieved: @{totalTokens}');\n\n res.status(HTTP_STATUS.OK);\n return next({\n objects: tokens.map(normalizeToken),\n urls: {\n next: '', // TODO: pagination?\n },\n });\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token list has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n\n route.post(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { password, readonly, cidr_whitelist } = req.body;\n const { name } = req.remote_user;\n\n if (!_.isBoolean(readonly) || !_.isArray(cidr_whitelist)) {\n return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));\n }\n\n auth.authenticate(name, password, async (err, user?: RemoteUser) => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n return next(errorUtils.getCode(errorCode, err.message));\n }\n\n req.remote_user = user;\n\n if (!_.isFunction(storage.saveToken)) {\n return next(\n errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT)\n );\n }\n\n try {\n const token = await getApiToken(auth, config, user as RemoteUser, password);\n if (!token) {\n throw errorUtils.getInternalError();\n }\n\n const key = cryptoUtils.stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = cryptoUtils.mask(token, 5);\n const created = new Date().getTime();\n\n /**\n * cidr_whitelist: is not being used, we pass it through\n * token: we do not store the real token (it is generated once and retrieved\n * to the user), just a mask of it.\n */\n const saveToken: Token = {\n user: name,\n token: maskedToken,\n key,\n cidr: cidr_whitelist,\n readonly,\n created,\n };\n\n await storage.saveToken(saveToken);\n logger.debug({ key, name }, 'token @{key} was created for user @{name}');\n res.set(HEADERS.CACHE_CONTROL, HEADERS.NO_CACHE);\n return next(\n normalizeToken({\n token,\n user: name,\n key: saveToken.key,\n cidr: cidr_whitelist,\n readonly,\n created: saveToken.created,\n })\n );\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getInternalError(error.message));\n }\n });\n }\n );\n\n route.delete(\n TOKEN_API_ENDPOINTS.delete_token,\n rateLimit(config?.userRateLimit),\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer) => {\n const {\n params: { tokenKey },\n } = req;\n const { name } = req.remote_user;\n\n if (_.isNil(name) === false) {\n logger.debug({ name }, '@{name} has requested remove a token');\n try {\n await storage.deleteToken(name, tokenKey);\n logger.info({ tokenKey, name }, 'token id @{tokenKey} was revoked for user @{name}');\n return next({});\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"token.js","names":[],"sources":["../../src/v1/token.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport { isBoolean, isNil } from 'lodash-es';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { getApiToken } from '@verdaccio/auth';\nimport { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from '@verdaccio/core';\nimport { TOKEN_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Config, Logger, RemoteUser, Token } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n cidr_whitelist: string[];\n created: string;\n};\n\n// npm expects \"cidr_whitelist\" for token list\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n cidr_whitelist: token.cidr || [],\n created: new Date(token.created).toISOString(),\n };\n}\n\n// https://github.com/npm/npm-profile/blob/latest/lib/index.js\nexport default function (\n route: Router,\n auth: Auth,\n storage: Storage,\n config: Config,\n logger: Logger\n): void {\n route.get(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\n async function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { name } = req.remote_user;\n\n if (isNil(name) === false) {\n try {\n const tokens = await storage.readTokens({ user: name });\n const totalTokens = tokens.length;\n logger.debug({ totalTokens }, 'token list retrieved: @{totalTokens}');\n\n res.status(HTTP_STATUS.OK);\n return next({\n objects: tokens.map(normalizeToken),\n urls: {\n next: '', // TODO: pagination?\n },\n });\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token list has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n\n route.post(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { password, readonly, cidr_whitelist } = req.body;\n const { name } = req.remote_user;\n\n if (!isBoolean(readonly) || !Array.isArray(cidr_whitelist)) {\n return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));\n }\n\n auth.authenticate(name, password, async (err, user?: RemoteUser) => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n return next(errorUtils.getCode(errorCode, err.message));\n }\n\n req.remote_user = user;\n\n if (typeof storage.saveToken !== 'function') {\n return next(\n errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT)\n );\n }\n\n try {\n const token = await getApiToken(auth, config, user as RemoteUser, password);\n if (!token) {\n throw errorUtils.getInternalError();\n }\n\n const key = cryptoUtils.stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = cryptoUtils.mask(token, 5);\n const created = new Date().getTime();\n\n /**\n * cidr_whitelist: is not being used, we pass it through\n * token: we do not store the real token (it is generated once and retrieved\n * to the user), just a mask of it.\n */\n const saveToken: Token = {\n user: name,\n token: maskedToken,\n key,\n cidr: cidr_whitelist,\n readonly,\n created,\n };\n\n await storage.saveToken(saveToken);\n logger.debug({ key, name }, 'token @{key} was created for user @{name}');\n res.set(HEADERS.CACHE_CONTROL, HEADERS.NO_CACHE);\n return next(\n normalizeToken({\n token,\n user: name,\n key: saveToken.key,\n cidr: cidr_whitelist,\n readonly,\n created: saveToken.created,\n })\n );\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getInternalError(error.message));\n }\n });\n }\n );\n\n route.delete(\n TOKEN_API_ENDPOINTS.delete_token,\n rateLimit(config?.userRateLimit),\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer) => {\n const {\n params: { tokenKey },\n } = req;\n const { name } = req.remote_user;\n\n if (isNil(name) === false) {\n logger.debug({ name }, '@{name} has requested remove a token');\n try {\n await storage.deleteToken(name, tokenKey);\n logger.info({ tokenKey, name }, 'token id @{tokenKey} was revoked for user @{name}');\n return next({});\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { TOKEN_API_ENDPOINTS, rateLimit } from "@verdaccio/middleware";
2
- import _ from "lodash";
3
2
  import { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from "@verdaccio/core";
3
+ import { isBoolean, isNil } from "lodash-es";
4
4
  import { getApiToken } from "@verdaccio/auth";
5
5
  //#region src/v1/token.ts
6
6
  function normalizeToken(token) {
@@ -13,7 +13,7 @@ function normalizeToken(token) {
13
13
  function token_default(route, auth, storage, config, logger) {
14
14
  route.get(TOKEN_API_ENDPOINTS.get_tokens, rateLimit(config?.userRateLimit), async function(req, res, next) {
15
15
  const { name } = req.remote_user;
16
- if (_.isNil(name) === false) try {
16
+ if (isNil(name) === false) try {
17
17
  const tokens = await storage.readTokens({ user: name });
18
18
  const totalTokens = tokens.length;
19
19
  logger.debug({ totalTokens }, "token list retrieved: @{totalTokens}");
@@ -31,14 +31,14 @@ function token_default(route, auth, storage, config, logger) {
31
31
  route.post(TOKEN_API_ENDPOINTS.get_tokens, rateLimit(config?.userRateLimit), function(req, res, next) {
32
32
  const { password, readonly, cidr_whitelist } = req.body;
33
33
  const { name } = req.remote_user;
34
- if (!_.isBoolean(readonly) || !_.isArray(cidr_whitelist)) return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
34
+ if (!isBoolean(readonly) || !Array.isArray(cidr_whitelist)) return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));
35
35
  auth.authenticate(name, password, async (err, user) => {
36
36
  if (err) {
37
37
  const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;
38
38
  return next(errorUtils.getCode(errorCode, err.message));
39
39
  }
40
40
  req.remote_user = user;
41
- if (!_.isFunction(storage.saveToken)) return next(errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT));
41
+ if (typeof storage.saveToken !== "function") return next(errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT));
42
42
  try {
43
43
  const token = await getApiToken(auth, config, user, password);
44
44
  if (!token) throw errorUtils.getInternalError();
@@ -79,7 +79,7 @@ function token_default(route, auth, storage, config, logger) {
79
79
  route.delete(TOKEN_API_ENDPOINTS.delete_token, rateLimit(config?.userRateLimit), async (req, res, next) => {
80
80
  const { params: { tokenKey } } = req;
81
81
  const { name } = req.remote_user;
82
- if (_.isNil(name) === false) {
82
+ if (isNil(name) === false) {
83
83
  logger.debug({ name }, "@{name} has requested remove a token");
84
84
  try {
85
85
  await storage.deleteToken(name, tokenKey);
@@ -1 +1 @@
1
- {"version":3,"file":"token.mjs","names":[],"sources":["../../src/v1/token.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport _ from 'lodash';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { getApiToken } from '@verdaccio/auth';\nimport { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from '@verdaccio/core';\nimport { TOKEN_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Config, Logger, RemoteUser, Token } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n cidr_whitelist: string[];\n created: string;\n};\n\n// npm expects \"cidr_whitelist\" for token list\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n cidr_whitelist: token.cidr || [],\n created: new Date(token.created).toISOString(),\n };\n}\n\n// https://github.com/npm/npm-profile/blob/latest/lib/index.js\nexport default function (\n route: Router,\n auth: Auth,\n storage: Storage,\n config: Config,\n logger: Logger\n): void {\n route.get(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\n async function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { name } = req.remote_user;\n\n if (_.isNil(name) === false) {\n try {\n const tokens = await storage.readTokens({ user: name });\n const totalTokens = tokens.length;\n logger.debug({ totalTokens }, 'token list retrieved: @{totalTokens}');\n\n res.status(HTTP_STATUS.OK);\n return next({\n objects: tokens.map(normalizeToken),\n urls: {\n next: '', // TODO: pagination?\n },\n });\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token list has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n\n route.post(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { password, readonly, cidr_whitelist } = req.body;\n const { name } = req.remote_user;\n\n if (!_.isBoolean(readonly) || !_.isArray(cidr_whitelist)) {\n return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));\n }\n\n auth.authenticate(name, password, async (err, user?: RemoteUser) => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n return next(errorUtils.getCode(errorCode, err.message));\n }\n\n req.remote_user = user;\n\n if (!_.isFunction(storage.saveToken)) {\n return next(\n errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT)\n );\n }\n\n try {\n const token = await getApiToken(auth, config, user as RemoteUser, password);\n if (!token) {\n throw errorUtils.getInternalError();\n }\n\n const key = cryptoUtils.stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = cryptoUtils.mask(token, 5);\n const created = new Date().getTime();\n\n /**\n * cidr_whitelist: is not being used, we pass it through\n * token: we do not store the real token (it is generated once and retrieved\n * to the user), just a mask of it.\n */\n const saveToken: Token = {\n user: name,\n token: maskedToken,\n key,\n cidr: cidr_whitelist,\n readonly,\n created,\n };\n\n await storage.saveToken(saveToken);\n logger.debug({ key, name }, 'token @{key} was created for user @{name}');\n res.set(HEADERS.CACHE_CONTROL, HEADERS.NO_CACHE);\n return next(\n normalizeToken({\n token,\n user: name,\n key: saveToken.key,\n cidr: cidr_whitelist,\n readonly,\n created: saveToken.created,\n })\n );\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getInternalError(error.message));\n }\n });\n }\n );\n\n route.delete(\n TOKEN_API_ENDPOINTS.delete_token,\n rateLimit(config?.userRateLimit),\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer) => {\n const {\n params: { tokenKey },\n } = req;\n const { name } = req.remote_user;\n\n if (_.isNil(name) === false) {\n logger.debug({ name }, '@{name} has requested remove a token');\n try {\n await storage.deleteToken(name, tokenKey);\n logger.info({ tokenKey, name }, 'token id @{tokenKey} was revoked for user @{name}');\n return next({});\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"token.mjs","names":[],"sources":["../../src/v1/token.ts"],"sourcesContent":["import type { Response, Router } from 'express';\nimport { isBoolean, isNil } from 'lodash-es';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { getApiToken } from '@verdaccio/auth';\nimport { HEADERS, HTTP_STATUS, SUPPORT_ERRORS, cryptoUtils, errorUtils } from '@verdaccio/core';\nimport { TOKEN_API_ENDPOINTS, rateLimit } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Config, Logger, RemoteUser, Token } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend } from '../../types/custom';\n\nexport type NormalizeToken = Token & {\n cidr_whitelist: string[];\n created: string;\n};\n\n// npm expects \"cidr_whitelist\" for token list\nfunction normalizeToken(token: Token): NormalizeToken {\n return {\n ...token,\n cidr_whitelist: token.cidr || [],\n created: new Date(token.created).toISOString(),\n };\n}\n\n// https://github.com/npm/npm-profile/blob/latest/lib/index.js\nexport default function (\n route: Router,\n auth: Auth,\n storage: Storage,\n config: Config,\n logger: Logger\n): void {\n route.get(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\n async function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { name } = req.remote_user;\n\n if (isNil(name) === false) {\n try {\n const tokens = await storage.readTokens({ user: name });\n const totalTokens = tokens.length;\n logger.debug({ totalTokens }, 'token list retrieved: @{totalTokens}');\n\n res.status(HTTP_STATUS.OK);\n return next({\n objects: tokens.map(normalizeToken),\n urls: {\n next: '', // TODO: pagination?\n },\n });\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token list has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n\n route.post(\n TOKEN_API_ENDPOINTS.get_tokens,\n rateLimit(config?.userRateLimit),\n function (req: $RequestExtend, res: Response, next: $NextFunctionVer) {\n const { password, readonly, cidr_whitelist } = req.body;\n const { name } = req.remote_user;\n\n if (!isBoolean(readonly) || !Array.isArray(cidr_whitelist)) {\n return next(errorUtils.getCode(HTTP_STATUS.BAD_DATA, SUPPORT_ERRORS.PARAMETERS_NOT_VALID));\n }\n\n auth.authenticate(name, password, async (err, user?: RemoteUser) => {\n if (err) {\n const errorCode = err.message ? HTTP_STATUS.UNAUTHORIZED : HTTP_STATUS.INTERNAL_ERROR;\n return next(errorUtils.getCode(errorCode, err.message));\n }\n\n req.remote_user = user;\n\n if (typeof storage.saveToken !== 'function') {\n return next(\n errorUtils.getCode(HTTP_STATUS.NOT_IMPLEMENTED, SUPPORT_ERRORS.STORAGE_NOT_IMPLEMENT)\n );\n }\n\n try {\n const token = await getApiToken(auth, config, user as RemoteUser, password);\n if (!token) {\n throw errorUtils.getInternalError();\n }\n\n const key = cryptoUtils.stringToMD5(token);\n // TODO: use a utility here\n const maskedToken = cryptoUtils.mask(token, 5);\n const created = new Date().getTime();\n\n /**\n * cidr_whitelist: is not being used, we pass it through\n * token: we do not store the real token (it is generated once and retrieved\n * to the user), just a mask of it.\n */\n const saveToken: Token = {\n user: name,\n token: maskedToken,\n key,\n cidr: cidr_whitelist,\n readonly,\n created,\n };\n\n await storage.saveToken(saveToken);\n logger.debug({ key, name }, 'token @{key} was created for user @{name}');\n res.set(HEADERS.CACHE_CONTROL, HEADERS.NO_CACHE);\n return next(\n normalizeToken({\n token,\n user: name,\n key: saveToken.key,\n cidr: cidr_whitelist,\n readonly,\n created: saveToken.created,\n })\n );\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getInternalError(error.message));\n }\n });\n }\n );\n\n route.delete(\n TOKEN_API_ENDPOINTS.delete_token,\n rateLimit(config?.userRateLimit),\n async (req: $RequestExtend, res: Response, next: $NextFunctionVer) => {\n const {\n params: { tokenKey },\n } = req;\n const { name } = req.remote_user;\n\n if (isNil(name) === false) {\n logger.debug({ name }, '@{name} has requested remove a token');\n try {\n await storage.deleteToken(name, tokenKey);\n logger.info({ tokenKey, name }, 'token id @{tokenKey} was revoked for user @{name}');\n return next({});\n } catch (error: any) {\n logger.error({ error: error.msg }, 'token creation has failed: @{error}');\n return next(errorUtils.getCode(HTTP_STATUS.INTERNAL_ERROR, error.message));\n }\n }\n return next(errorUtils.getUnauthorized());\n }\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/api",
3
- "version": "9.0.0-next-9.7",
3
+ "version": "9.0.0-next-9.8",
4
4
  "description": "Verdaccio Registry API",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -33,19 +33,20 @@
33
33
  },
34
34
  "license": "MIT",
35
35
  "dependencies": {
36
- "@verdaccio/auth": "9.0.0-next-9.7",
37
- "@verdaccio/config": "9.0.0-next-9.7",
38
- "@verdaccio/core": "9.0.0-next-9.7",
39
- "@verdaccio/logger": "9.0.0-next-9.7",
40
- "@verdaccio/middleware": "9.0.0-next-9.7",
41
- "@verdaccio/store": "9.0.0-next-9.7",
36
+ "@verdaccio/auth": "9.0.0-next-9.8",
37
+ "@verdaccio/config": "9.0.0-next-9.8",
38
+ "@verdaccio/core": "9.0.0-next-9.8",
39
+ "@verdaccio/logger": "9.0.0-next-9.8",
40
+ "@verdaccio/middleware": "9.0.0-next-9.8",
41
+ "@verdaccio/store": "9.0.0-next-9.8",
42
42
  "debug": "4.4.3",
43
43
  "express": "5.2.1",
44
- "lodash": "4.17.23"
44
+ "lodash-es": "4.17.23"
45
45
  },
46
46
  "devDependencies": {
47
- "@verdaccio/test-helper": "5.0.0-next-9.7",
47
+ "@verdaccio/test-helper": "5.0.0-next-9.8",
48
48
  "@verdaccio/types": "14.0.0-next-9.4",
49
+ "@types/lodash-es": "4.17.12",
49
50
  "mockdate": "3.0.5",
50
51
  "nock": "13.5.6",
51
52
  "supertest": "7.1.4",