@verdaccio/web 9.0.0-next-9.8 → 9.0.0-next-9.10

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.
@@ -37,7 +37,7 @@ function addPackageWebApi(storage, auth, config) {
37
37
  async function processPackages(packages = [], req) {
38
38
  const permissions = [];
39
39
  const packagesToProcess = packages.slice();
40
- debug$1("process packages %o", packagesToProcess);
40
+ debug$1("process packages %o", packagesToProcess.length);
41
41
  const requestOptions = (0, _verdaccio_middleware.getRequestOptions)(req);
42
42
  for (const pkg of packagesToProcess) {
43
43
  const pkgCopy = { ...pkg };
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","names":[],"sources":["../../src/api/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport { isNil } from 'lodash-es';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { createAnonymousRemoteUser } from '@verdaccio/config';\nimport { logger } from '@verdaccio/logger';\nimport {\n $NextFunctionVer,\n $RequestExtend,\n $ResponseExtend,\n WebUrls,\n getRequestOptions,\n} from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport { getLocalRegistryTarballUri } from '@verdaccio/tarball';\nimport type { Config, RemoteUser, Version } from '@verdaccio/types';\n\nimport { formatAuthor, generateGravatarUrl } from '../author-utils';\nimport { hasLogin, sortByName, sortByTime } from '../web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nconst getField = (field = 'name') => {\n return field === 'name' || field === 'time' ? field : 'name';\n};\n\nconst getOrder = (order = 'asc') => {\n return order === 'asc';\n};\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(storage: Storage, auth: Auth, config: Config): Router {\n const isLoginEnabled = hasLogin(config);\n debug('is login enabled: %o', isLoginEnabled);\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n const anonymousRemoteUser: RemoteUser = createAnonymousRemoteUser();\n\n debug('initialized package web api');\n const checkAllow = (name: string, remoteUser: RemoteUser): Promise<boolean> =>\n new Promise((resolve, reject): void => {\n const remoteUserAccess = !isLoginEnabled ? anonymousRemoteUser : remoteUser;\n try {\n auth.allow_access({ packageName: name }, remoteUserAccess, (err, allowed): void => {\n if (err) {\n resolve(false);\n }\n return resolve(allowed as boolean);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n async function processPackages(packages: Version[] = [], req): Promise<Version[]> {\n const permissions: Version[] = [];\n const packagesToProcess = packages.slice();\n debug('process packages %o', packagesToProcess);\n const requestOptions = getRequestOptions(req);\n for (const pkg of packagesToProcess) {\n const pkgCopy = { ...pkg };\n pkgCopy.author = formatAuthor(pkg.author);\n try {\n if (await checkAllow(pkg.name, req.remote_user)) {\n if (config.web) {\n // @ts-ignore\n pkgCopy.author.avatar = generateGravatarUrl(pkgCopy.author.email, config.web.gravatar);\n }\n // convert any remote dist to a local reference\n // eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz\n if (!isNil(pkgCopy.dist) && pkgCopy.dist.tarball !== null) {\n pkgCopy.dist.tarball = getLocalRegistryTarballUri(\n pkgCopy.dist.tarball,\n pkg.name,\n requestOptions,\n config?.url_prefix\n );\n }\n permissions.push(pkgCopy);\n }\n } catch (err: any) {\n debug('process packages error %o', err);\n logger.error(\n { name: pkg.name, error: err },\n 'permission process for @{name} has failed: @{error}'\n );\n throw err;\n }\n }\n\n debug('allowed %o packages', permissions.length);\n return permissions;\n }\n\n // Get list of all visible package\n pkgRouter.get(\n WebUrls.packages_all,\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('hit package web api %o');\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n\n const field = getField(config?.web?.sort_field);\n const order = getOrder(config?.web?.sort_packages);\n debug('order by %o %o', field, order);\n const pkgs = await processPackages(localPackages, req);\n if (field === 'name') next(sortByName(pkgs, order));\n else next(sortByTime(pkgs, order));\n } catch (error: any) {\n next(error);\n }\n }\n );\n\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"mappings":";;;;;;;;;;;;AAuBA,IAAM,YAAY,QAAQ,WAAW;AACnC,QAAO,UAAU,UAAU,UAAU,SAAS,QAAQ;;AAGxD,IAAM,YAAY,QAAQ,UAAU;AAClC,QAAO,UAAU;;AAGnB,IAAM,WAAA,GAAA,MAAA,SAAmB,4BAA4B;AAErD,SAAS,iBAAiB,SAAkB,MAAY,QAAwB;CAC9E,MAAM,iBAAiB,kBAAA,SAAS,OAAO;AACvC,SAAM,wBAAwB,eAAe;CAC7C,MAAM,aAAA,GAAA,QAAA,SAAoB;CAC1B,MAAM,uBAAA,GAAA,kBAAA,4BAA6D;AAEnE,SAAM,8BAA8B;CACpC,MAAM,cAAc,MAAc,eAChC,IAAI,SAAS,SAAS,WAAiB;EACrC,MAAM,mBAAmB,CAAC,iBAAiB,sBAAsB;AACjE,MAAI;AACF,QAAK,aAAa,EAAE,aAAa,MAAM,EAAE,mBAAmB,KAAK,YAAkB;AACjF,QAAI,IACF,SAAQ,MAAM;AAEhB,WAAO,QAAQ,QAAmB;KAClC;WACK,KAAU;AACjB,UAAO,IAAI;;GAEb;CAEJ,eAAe,gBAAgB,WAAsB,EAAE,EAAE,KAAyB;EAChF,MAAM,cAAyB,EAAE;EACjC,MAAM,oBAAoB,SAAS,OAAO;AAC1C,UAAM,uBAAuB,kBAAkB;EAC/C,MAAM,kBAAA,GAAA,sBAAA,mBAAmC,IAAI;AAC7C,OAAK,MAAM,OAAO,mBAAmB;GACnC,MAAM,UAAU,EAAE,GAAG,KAAK;AAC1B,WAAQ,SAAS,qBAAA,aAAa,IAAI,OAAO;AACzC,OAAI;AACF,QAAI,MAAM,WAAW,IAAI,MAAM,IAAI,YAAY,EAAE;AAC/C,SAAI,OAAO,IAET,SAAQ,OAAO,SAAS,qBAAA,oBAAoB,QAAQ,OAAO,OAAO,OAAO,IAAI,SAAS;AAIxF,SAAI,EAAA,GAAA,UAAA,OAAO,QAAQ,KAAK,IAAI,QAAQ,KAAK,YAAY,KACnD,SAAQ,KAAK,WAAA,GAAA,mBAAA,4BACX,QAAQ,KAAK,SACb,IAAI,MACJ,gBACA,QAAQ,WACT;AAEH,iBAAY,KAAK,QAAQ;;YAEpB,KAAU;AACjB,YAAM,6BAA6B,IAAI;AACvC,sBAAA,OAAO,MACL;KAAE,MAAM,IAAI;KAAM,OAAO;KAAK,EAC9B,sDACD;AACD,UAAM;;;AAIV,UAAM,uBAAuB,YAAY,OAAO;AAChD,SAAO;;AAIT,WAAU,IACR,sBAAA,QAAQ,cACR,eACE,KACA,KACA,MACe;AACf,UAAM,yBAAyB;AAE/B,MAAI;GACF,MAAM,gBAA2B,MAAM,QAAQ,kBAAkB;GAEjE,MAAM,QAAQ,SAAS,QAAQ,KAAK,WAAW;GAC/C,MAAM,QAAQ,SAAS,QAAQ,KAAK,cAAc;AAClD,WAAM,kBAAkB,OAAO,MAAM;GACrC,MAAM,OAAO,MAAM,gBAAgB,eAAe,IAAI;AACtD,OAAI,UAAU,OAAQ,MAAK,kBAAA,WAAW,MAAM,MAAM,CAAC;OAC9C,MAAK,kBAAA,WAAW,MAAM,MAAM,CAAC;WAC3B,OAAY;AACnB,QAAK,MAAM;;GAGhB;AAED,QAAO"}
1
+ {"version":3,"file":"package.js","names":[],"sources":["../../src/api/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport { isNil } from 'lodash-es';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { createAnonymousRemoteUser } from '@verdaccio/config';\nimport { logger } from '@verdaccio/logger';\nimport {\n $NextFunctionVer,\n $RequestExtend,\n $ResponseExtend,\n WebUrls,\n getRequestOptions,\n} from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport { getLocalRegistryTarballUri } from '@verdaccio/tarball';\nimport type { Config, RemoteUser, Version } from '@verdaccio/types';\n\nimport { formatAuthor, generateGravatarUrl } from '../author-utils';\nimport { hasLogin, sortByName, sortByTime } from '../web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nconst getField = (field = 'name') => {\n return field === 'name' || field === 'time' ? field : 'name';\n};\n\nconst getOrder = (order = 'asc') => {\n return order === 'asc';\n};\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(storage: Storage, auth: Auth, config: Config): Router {\n const isLoginEnabled = hasLogin(config);\n debug('is login enabled: %o', isLoginEnabled);\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n const anonymousRemoteUser: RemoteUser = createAnonymousRemoteUser();\n\n debug('initialized package web api');\n const checkAllow = (name: string, remoteUser: RemoteUser): Promise<boolean> =>\n new Promise((resolve, reject): void => {\n const remoteUserAccess = !isLoginEnabled ? anonymousRemoteUser : remoteUser;\n try {\n auth.allow_access({ packageName: name }, remoteUserAccess, (err, allowed): void => {\n if (err) {\n resolve(false);\n }\n return resolve(allowed as boolean);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n async function processPackages(packages: Version[] = [], req): Promise<Version[]> {\n const permissions: Version[] = [];\n const packagesToProcess = packages.slice();\n debug('process packages %o', packagesToProcess.length);\n const requestOptions = getRequestOptions(req);\n for (const pkg of packagesToProcess) {\n const pkgCopy = { ...pkg };\n pkgCopy.author = formatAuthor(pkg.author);\n try {\n if (await checkAllow(pkg.name, req.remote_user)) {\n if (config.web) {\n // @ts-ignore\n pkgCopy.author.avatar = generateGravatarUrl(pkgCopy.author.email, config.web.gravatar);\n }\n // convert any remote dist to a local reference\n // eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz\n if (!isNil(pkgCopy.dist) && pkgCopy.dist.tarball !== null) {\n pkgCopy.dist.tarball = getLocalRegistryTarballUri(\n pkgCopy.dist.tarball,\n pkg.name,\n requestOptions,\n config?.url_prefix\n );\n }\n permissions.push(pkgCopy);\n }\n } catch (err: any) {\n debug('process packages error %o', err);\n logger.error(\n { name: pkg.name, error: err },\n 'permission process for @{name} has failed: @{error}'\n );\n throw err;\n }\n }\n\n debug('allowed %o packages', permissions.length);\n return permissions;\n }\n\n // Get list of all visible package\n pkgRouter.get(\n WebUrls.packages_all,\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('hit package web api %o');\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n\n const field = getField(config?.web?.sort_field);\n const order = getOrder(config?.web?.sort_packages);\n debug('order by %o %o', field, order);\n const pkgs = await processPackages(localPackages, req);\n if (field === 'name') next(sortByName(pkgs, order));\n else next(sortByTime(pkgs, order));\n } catch (error: any) {\n next(error);\n }\n }\n );\n\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"mappings":";;;;;;;;;;;;AAuBA,IAAM,YAAY,QAAQ,WAAW;AACnC,QAAO,UAAU,UAAU,UAAU,SAAS,QAAQ;;AAGxD,IAAM,YAAY,QAAQ,UAAU;AAClC,QAAO,UAAU;;AAGnB,IAAM,WAAA,GAAA,MAAA,SAAmB,4BAA4B;AAErD,SAAS,iBAAiB,SAAkB,MAAY,QAAwB;CAC9E,MAAM,iBAAiB,kBAAA,SAAS,OAAO;AACvC,SAAM,wBAAwB,eAAe;CAC7C,MAAM,aAAA,GAAA,QAAA,SAAoB;CAC1B,MAAM,uBAAA,GAAA,kBAAA,4BAA6D;AAEnE,SAAM,8BAA8B;CACpC,MAAM,cAAc,MAAc,eAChC,IAAI,SAAS,SAAS,WAAiB;EACrC,MAAM,mBAAmB,CAAC,iBAAiB,sBAAsB;AACjE,MAAI;AACF,QAAK,aAAa,EAAE,aAAa,MAAM,EAAE,mBAAmB,KAAK,YAAkB;AACjF,QAAI,IACF,SAAQ,MAAM;AAEhB,WAAO,QAAQ,QAAmB;KAClC;WACK,KAAU;AACjB,UAAO,IAAI;;GAEb;CAEJ,eAAe,gBAAgB,WAAsB,EAAE,EAAE,KAAyB;EAChF,MAAM,cAAyB,EAAE;EACjC,MAAM,oBAAoB,SAAS,OAAO;AAC1C,UAAM,uBAAuB,kBAAkB,OAAO;EACtD,MAAM,kBAAA,GAAA,sBAAA,mBAAmC,IAAI;AAC7C,OAAK,MAAM,OAAO,mBAAmB;GACnC,MAAM,UAAU,EAAE,GAAG,KAAK;AAC1B,WAAQ,SAAS,qBAAA,aAAa,IAAI,OAAO;AACzC,OAAI;AACF,QAAI,MAAM,WAAW,IAAI,MAAM,IAAI,YAAY,EAAE;AAC/C,SAAI,OAAO,IAET,SAAQ,OAAO,SAAS,qBAAA,oBAAoB,QAAQ,OAAO,OAAO,OAAO,IAAI,SAAS;AAIxF,SAAI,EAAA,GAAA,UAAA,OAAO,QAAQ,KAAK,IAAI,QAAQ,KAAK,YAAY,KACnD,SAAQ,KAAK,WAAA,GAAA,mBAAA,4BACX,QAAQ,KAAK,SACb,IAAI,MACJ,gBACA,QAAQ,WACT;AAEH,iBAAY,KAAK,QAAQ;;YAEpB,KAAU;AACjB,YAAM,6BAA6B,IAAI;AACvC,sBAAA,OAAO,MACL;KAAE,MAAM,IAAI;KAAM,OAAO;KAAK,EAC9B,sDACD;AACD,UAAM;;;AAIV,UAAM,uBAAuB,YAAY,OAAO;AAChD,SAAO;;AAIT,WAAU,IACR,sBAAA,QAAQ,cACR,eACE,KACA,KACA,MACe;AACf,UAAM,yBAAyB;AAE/B,MAAI;GACF,MAAM,gBAA2B,MAAM,QAAQ,kBAAkB;GAEjE,MAAM,QAAQ,SAAS,QAAQ,KAAK,WAAW;GAC/C,MAAM,QAAQ,SAAS,QAAQ,KAAK,cAAc;AAClD,WAAM,kBAAkB,OAAO,MAAM;GACrC,MAAM,OAAO,MAAM,gBAAgB,eAAe,IAAI;AACtD,OAAI,UAAU,OAAQ,MAAK,kBAAA,WAAW,MAAM,MAAM,CAAC;OAC9C,MAAK,kBAAA,WAAW,MAAM,MAAM,CAAC;WAC3B,OAAY;AACnB,QAAK,MAAM;;GAGhB;AAED,QAAO"}
@@ -35,7 +35,7 @@ function addPackageWebApi(storage, auth, config) {
35
35
  async function processPackages(packages = [], req) {
36
36
  const permissions = [];
37
37
  const packagesToProcess = packages.slice();
38
- debug("process packages %o", packagesToProcess);
38
+ debug("process packages %o", packagesToProcess.length);
39
39
  const requestOptions = getRequestOptions(req);
40
40
  for (const pkg of packagesToProcess) {
41
41
  const pkgCopy = { ...pkg };
@@ -1 +1 @@
1
- {"version":3,"file":"package.mjs","names":[],"sources":["../../src/api/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport { isNil } from 'lodash-es';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { createAnonymousRemoteUser } from '@verdaccio/config';\nimport { logger } from '@verdaccio/logger';\nimport {\n $NextFunctionVer,\n $RequestExtend,\n $ResponseExtend,\n WebUrls,\n getRequestOptions,\n} from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport { getLocalRegistryTarballUri } from '@verdaccio/tarball';\nimport type { Config, RemoteUser, Version } from '@verdaccio/types';\n\nimport { formatAuthor, generateGravatarUrl } from '../author-utils';\nimport { hasLogin, sortByName, sortByTime } from '../web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nconst getField = (field = 'name') => {\n return field === 'name' || field === 'time' ? field : 'name';\n};\n\nconst getOrder = (order = 'asc') => {\n return order === 'asc';\n};\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(storage: Storage, auth: Auth, config: Config): Router {\n const isLoginEnabled = hasLogin(config);\n debug('is login enabled: %o', isLoginEnabled);\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n const anonymousRemoteUser: RemoteUser = createAnonymousRemoteUser();\n\n debug('initialized package web api');\n const checkAllow = (name: string, remoteUser: RemoteUser): Promise<boolean> =>\n new Promise((resolve, reject): void => {\n const remoteUserAccess = !isLoginEnabled ? anonymousRemoteUser : remoteUser;\n try {\n auth.allow_access({ packageName: name }, remoteUserAccess, (err, allowed): void => {\n if (err) {\n resolve(false);\n }\n return resolve(allowed as boolean);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n async function processPackages(packages: Version[] = [], req): Promise<Version[]> {\n const permissions: Version[] = [];\n const packagesToProcess = packages.slice();\n debug('process packages %o', packagesToProcess);\n const requestOptions = getRequestOptions(req);\n for (const pkg of packagesToProcess) {\n const pkgCopy = { ...pkg };\n pkgCopy.author = formatAuthor(pkg.author);\n try {\n if (await checkAllow(pkg.name, req.remote_user)) {\n if (config.web) {\n // @ts-ignore\n pkgCopy.author.avatar = generateGravatarUrl(pkgCopy.author.email, config.web.gravatar);\n }\n // convert any remote dist to a local reference\n // eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz\n if (!isNil(pkgCopy.dist) && pkgCopy.dist.tarball !== null) {\n pkgCopy.dist.tarball = getLocalRegistryTarballUri(\n pkgCopy.dist.tarball,\n pkg.name,\n requestOptions,\n config?.url_prefix\n );\n }\n permissions.push(pkgCopy);\n }\n } catch (err: any) {\n debug('process packages error %o', err);\n logger.error(\n { name: pkg.name, error: err },\n 'permission process for @{name} has failed: @{error}'\n );\n throw err;\n }\n }\n\n debug('allowed %o packages', permissions.length);\n return permissions;\n }\n\n // Get list of all visible package\n pkgRouter.get(\n WebUrls.packages_all,\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('hit package web api %o');\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n\n const field = getField(config?.web?.sort_field);\n const order = getOrder(config?.web?.sort_packages);\n debug('order by %o %o', field, order);\n const pkgs = await processPackages(localPackages, req);\n if (field === 'name') next(sortByName(pkgs, order));\n else next(sortByTime(pkgs, order));\n } catch (error: any) {\n next(error);\n }\n }\n );\n\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"mappings":";;;;;;;;;;AAuBA,IAAM,YAAY,QAAQ,WAAW;AACnC,QAAO,UAAU,UAAU,UAAU,SAAS,QAAQ;;AAGxD,IAAM,YAAY,QAAQ,UAAU;AAClC,QAAO,UAAU;;AAGnB,IAAM,QAAQ,WAAW,4BAA4B;AAErD,SAAS,iBAAiB,SAAkB,MAAY,QAAwB;CAC9E,MAAM,iBAAiB,SAAS,OAAO;AACvC,OAAM,wBAAwB,eAAe;CAC7C,MAAM,YAAY,QAAQ;CAC1B,MAAM,sBAAkC,2BAA2B;AAEnE,OAAM,8BAA8B;CACpC,MAAM,cAAc,MAAc,eAChC,IAAI,SAAS,SAAS,WAAiB;EACrC,MAAM,mBAAmB,CAAC,iBAAiB,sBAAsB;AACjE,MAAI;AACF,QAAK,aAAa,EAAE,aAAa,MAAM,EAAE,mBAAmB,KAAK,YAAkB;AACjF,QAAI,IACF,SAAQ,MAAM;AAEhB,WAAO,QAAQ,QAAmB;KAClC;WACK,KAAU;AACjB,UAAO,IAAI;;GAEb;CAEJ,eAAe,gBAAgB,WAAsB,EAAE,EAAE,KAAyB;EAChF,MAAM,cAAyB,EAAE;EACjC,MAAM,oBAAoB,SAAS,OAAO;AAC1C,QAAM,uBAAuB,kBAAkB;EAC/C,MAAM,iBAAiB,kBAAkB,IAAI;AAC7C,OAAK,MAAM,OAAO,mBAAmB;GACnC,MAAM,UAAU,EAAE,GAAG,KAAK;AAC1B,WAAQ,SAAS,aAAa,IAAI,OAAO;AACzC,OAAI;AACF,QAAI,MAAM,WAAW,IAAI,MAAM,IAAI,YAAY,EAAE;AAC/C,SAAI,OAAO,IAET,SAAQ,OAAO,SAAS,oBAAoB,QAAQ,OAAO,OAAO,OAAO,IAAI,SAAS;AAIxF,SAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAQ,KAAK,YAAY,KACnD,SAAQ,KAAK,UAAU,2BACrB,QAAQ,KAAK,SACb,IAAI,MACJ,gBACA,QAAQ,WACT;AAEH,iBAAY,KAAK,QAAQ;;YAEpB,KAAU;AACjB,UAAM,6BAA6B,IAAI;AACvC,WAAO,MACL;KAAE,MAAM,IAAI;KAAM,OAAO;KAAK,EAC9B,sDACD;AACD,UAAM;;;AAIV,QAAM,uBAAuB,YAAY,OAAO;AAChD,SAAO;;AAIT,WAAU,IACR,QAAQ,cACR,eACE,KACA,KACA,MACe;AACf,QAAM,yBAAyB;AAE/B,MAAI;GACF,MAAM,gBAA2B,MAAM,QAAQ,kBAAkB;GAEjE,MAAM,QAAQ,SAAS,QAAQ,KAAK,WAAW;GAC/C,MAAM,QAAQ,SAAS,QAAQ,KAAK,cAAc;AAClD,SAAM,kBAAkB,OAAO,MAAM;GACrC,MAAM,OAAO,MAAM,gBAAgB,eAAe,IAAI;AACtD,OAAI,UAAU,OAAQ,MAAK,WAAW,MAAM,MAAM,CAAC;OAC9C,MAAK,WAAW,MAAM,MAAM,CAAC;WAC3B,OAAY;AACnB,QAAK,MAAM;;GAGhB;AAED,QAAO"}
1
+ {"version":3,"file":"package.mjs","names":[],"sources":["../../src/api/package.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport { isNil } from 'lodash-es';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { createAnonymousRemoteUser } from '@verdaccio/config';\nimport { logger } from '@verdaccio/logger';\nimport {\n $NextFunctionVer,\n $RequestExtend,\n $ResponseExtend,\n WebUrls,\n getRequestOptions,\n} from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport { getLocalRegistryTarballUri } from '@verdaccio/tarball';\nimport type { Config, RemoteUser, Version } from '@verdaccio/types';\n\nimport { formatAuthor, generateGravatarUrl } from '../author-utils';\nimport { hasLogin, sortByName, sortByTime } from '../web-utils';\n\nexport { $RequestExtend, $ResponseExtend, $NextFunctionVer }; // Was required by other packages\n\nconst getField = (field = 'name') => {\n return field === 'name' || field === 'time' ? field : 'name';\n};\n\nconst getOrder = (order = 'asc') => {\n return order === 'asc';\n};\n\nconst debug = buildDebug('verdaccio:web:api:package');\n\nfunction addPackageWebApi(storage: Storage, auth: Auth, config: Config): Router {\n const isLoginEnabled = hasLogin(config);\n debug('is login enabled: %o', isLoginEnabled);\n const pkgRouter = Router(); /* eslint new-cap: 0 */\n const anonymousRemoteUser: RemoteUser = createAnonymousRemoteUser();\n\n debug('initialized package web api');\n const checkAllow = (name: string, remoteUser: RemoteUser): Promise<boolean> =>\n new Promise((resolve, reject): void => {\n const remoteUserAccess = !isLoginEnabled ? anonymousRemoteUser : remoteUser;\n try {\n auth.allow_access({ packageName: name }, remoteUserAccess, (err, allowed): void => {\n if (err) {\n resolve(false);\n }\n return resolve(allowed as boolean);\n });\n } catch (err: any) {\n reject(err);\n }\n });\n\n async function processPackages(packages: Version[] = [], req): Promise<Version[]> {\n const permissions: Version[] = [];\n const packagesToProcess = packages.slice();\n debug('process packages %o', packagesToProcess.length);\n const requestOptions = getRequestOptions(req);\n for (const pkg of packagesToProcess) {\n const pkgCopy = { ...pkg };\n pkgCopy.author = formatAuthor(pkg.author);\n try {\n if (await checkAllow(pkg.name, req.remote_user)) {\n if (config.web) {\n // @ts-ignore\n pkgCopy.author.avatar = generateGravatarUrl(pkgCopy.author.email, config.web.gravatar);\n }\n // convert any remote dist to a local reference\n // eg: if the dist points to npmjs, switch to localhost:4873/prefix/etc.tar.gz\n if (!isNil(pkgCopy.dist) && pkgCopy.dist.tarball !== null) {\n pkgCopy.dist.tarball = getLocalRegistryTarballUri(\n pkgCopy.dist.tarball,\n pkg.name,\n requestOptions,\n config?.url_prefix\n );\n }\n permissions.push(pkgCopy);\n }\n } catch (err: any) {\n debug('process packages error %o', err);\n logger.error(\n { name: pkg.name, error: err },\n 'permission process for @{name} has failed: @{error}'\n );\n throw err;\n }\n }\n\n debug('allowed %o packages', permissions.length);\n return permissions;\n }\n\n // Get list of all visible package\n pkgRouter.get(\n WebUrls.packages_all,\n async function (\n req: $RequestExtend,\n res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n debug('hit package web api %o');\n\n try {\n const localPackages: Version[] = await storage.getLocalDatabase();\n\n const field = getField(config?.web?.sort_field);\n const order = getOrder(config?.web?.sort_packages);\n debug('order by %o %o', field, order);\n const pkgs = await processPackages(localPackages, req);\n if (field === 'name') next(sortByName(pkgs, order));\n else next(sortByTime(pkgs, order));\n } catch (error: any) {\n next(error);\n }\n }\n );\n\n return pkgRouter;\n}\n\nexport default addPackageWebApi;\n"],"mappings":";;;;;;;;;;AAuBA,IAAM,YAAY,QAAQ,WAAW;AACnC,QAAO,UAAU,UAAU,UAAU,SAAS,QAAQ;;AAGxD,IAAM,YAAY,QAAQ,UAAU;AAClC,QAAO,UAAU;;AAGnB,IAAM,QAAQ,WAAW,4BAA4B;AAErD,SAAS,iBAAiB,SAAkB,MAAY,QAAwB;CAC9E,MAAM,iBAAiB,SAAS,OAAO;AACvC,OAAM,wBAAwB,eAAe;CAC7C,MAAM,YAAY,QAAQ;CAC1B,MAAM,sBAAkC,2BAA2B;AAEnE,OAAM,8BAA8B;CACpC,MAAM,cAAc,MAAc,eAChC,IAAI,SAAS,SAAS,WAAiB;EACrC,MAAM,mBAAmB,CAAC,iBAAiB,sBAAsB;AACjE,MAAI;AACF,QAAK,aAAa,EAAE,aAAa,MAAM,EAAE,mBAAmB,KAAK,YAAkB;AACjF,QAAI,IACF,SAAQ,MAAM;AAEhB,WAAO,QAAQ,QAAmB;KAClC;WACK,KAAU;AACjB,UAAO,IAAI;;GAEb;CAEJ,eAAe,gBAAgB,WAAsB,EAAE,EAAE,KAAyB;EAChF,MAAM,cAAyB,EAAE;EACjC,MAAM,oBAAoB,SAAS,OAAO;AAC1C,QAAM,uBAAuB,kBAAkB,OAAO;EACtD,MAAM,iBAAiB,kBAAkB,IAAI;AAC7C,OAAK,MAAM,OAAO,mBAAmB;GACnC,MAAM,UAAU,EAAE,GAAG,KAAK;AAC1B,WAAQ,SAAS,aAAa,IAAI,OAAO;AACzC,OAAI;AACF,QAAI,MAAM,WAAW,IAAI,MAAM,IAAI,YAAY,EAAE;AAC/C,SAAI,OAAO,IAET,SAAQ,OAAO,SAAS,oBAAoB,QAAQ,OAAO,OAAO,OAAO,IAAI,SAAS;AAIxF,SAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAQ,KAAK,YAAY,KACnD,SAAQ,KAAK,UAAU,2BACrB,QAAQ,KAAK,SACb,IAAI,MACJ,gBACA,QAAQ,WACT;AAEH,iBAAY,KAAK,QAAQ;;YAEpB,KAAU;AACjB,UAAM,6BAA6B,IAAI;AACvC,WAAO,MACL;KAAE,MAAM,IAAI;KAAM,OAAO;KAAK,EAC9B,sDACD;AACD,UAAM;;;AAIV,QAAM,uBAAuB,YAAY,OAAO;AAChD,SAAO;;AAIT,WAAU,IACR,QAAQ,cACR,eACE,KACA,KACA,MACe;AACf,QAAM,yBAAyB;AAE/B,MAAI;GACF,MAAM,gBAA2B,MAAM,QAAQ,kBAAkB;GAEjE,MAAM,QAAQ,SAAS,QAAQ,KAAK,WAAW;GAC/C,MAAM,QAAQ,SAAS,QAAQ,KAAK,cAAc;AAClD,SAAM,kBAAkB,OAAO,MAAM;GACrC,MAAM,OAAO,MAAM,gBAAgB,eAAe,IAAI;AACtD,OAAI,UAAU,OAAQ,MAAK,WAAW,MAAM,MAAM,CAAC;OAC9C,MAAK,WAAW,MAAM,MAAM,CAAC;WAC3B,OAAY;AACnB,QAAK,MAAM;;GAGhB;AAED,QAAO"}
@@ -21,12 +21,13 @@ function checkAccess(pkg, auth, remoteUser) {
21
21
  function addSearchWebApi(storage, auth) {
22
22
  const router = (0, express.Router)();
23
23
  router.get(_verdaccio_middleware.WebUrls.search, async function(req, _res, next) {
24
+ const abort = new AbortController();
25
+ const onClientClose = () => {
26
+ debug$1("search web aborted");
27
+ abort.abort();
28
+ };
29
+ req.socket.on("close", onClientClose);
24
30
  try {
25
- const abort = new AbortController();
26
- req.socket.on("close", function() {
27
- debug$1("search web aborted");
28
- abort.abort();
29
- });
30
31
  const text = req.params.anything ?? "";
31
32
  const size = 20;
32
33
  const from = 0;
@@ -50,6 +51,8 @@ function addSearchWebApi(storage, auth) {
50
51
  }))).filter((i) => i !== null).slice(from, size));
51
52
  } catch (err) {
52
53
  next(_verdaccio_core.errorUtils.getInternalError(err.message));
54
+ } finally {
55
+ req.socket.off("close", onClientClose);
53
56
  }
54
57
  });
55
58
  return router;
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","names":[],"sources":["../../src/api/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport { URLSearchParams } from 'node:url';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { errorUtils } from '@verdaccio/core';\nimport type { SearchQuery } from '@verdaccio/core/src/search-utils';\nimport { WebUrls } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Manifest } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction checkAccess(pkg: any, auth: any, remoteUser): Promise<Manifest | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n}\n\nfunction addSearchWebApi(storage: Storage, auth: Auth): Router {\n const router = Router(); /* eslint new-cap: 0 */\n router.get(\n WebUrls.search,\n async function (\n req: $RequestExtend,\n _res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n try {\n const abort = new AbortController();\n req.socket.on('close', function () {\n debug('search web aborted');\n abort.abort();\n });\n const text: string = (req.params.anything as string) ?? '';\n // These values are declared as optimal by npm cli\n // FUTURE: could be overwritten by ui settings.\n const size = 20;\n const from = 0;\n const query: SearchQuery = {\n from: 0,\n maintenance: 0.5,\n popularity: 0.98,\n quality: 0.65,\n size: 20,\n text,\n };\n // @ts-ignore\n const urlParams = new URLSearchParams(query);\n debug('search web init');\n const data = await storage?.search({\n query,\n url: `/-/v1/search?${urlParams.toString()}`,\n abort,\n });\n const checkAccessPromises = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final = checkAccessPromises\n .filter((i): i is Manifest => i !== null)\n .slice(from, size);\n\n next(final);\n } catch (err: any) {\n next(errorUtils.getInternalError(err.message));\n }\n }\n );\n return router;\n}\n\nexport default addSearchWebApi;\n"],"mappings":";;;;;;;;AAaA,IAAM,WAAA,GAAA,MAAA,SAAmB,2BAA2B;AAEpD,SAAS,YAAY,KAAU,MAAW,YAAsC;AAC9E,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,OAAK,aAAa,EAAE,aAAa,KAAK,SAAS,MAAM,EAAE,YAAY,SAAU,KAAK,SAAS;AACzF,OAAI,IACF,KAAI,IAAI,UAAU,OAAO,IAAI,OAAO,CAAC,MAAM,UAAU,EAAE;AAGrD,cAAU;AACV,WAAO,QAAQ,KAAK;SAEpB,QAAO,IAAI;OAGb,QAAO,QAAQ,UAAU,MAAM,KAAK;IAEtC;GACF;;AAGJ,SAAS,gBAAgB,SAAkB,MAAoB;CAC7D,MAAM,UAAA,GAAA,QAAA,SAAiB;AACvB,QAAO,IACL,sBAAA,QAAQ,QACR,eACE,KACA,MACA,MACe;AACf,MAAI;GACF,MAAM,QAAQ,IAAI,iBAAiB;AACnC,OAAI,OAAO,GAAG,SAAS,WAAY;AACjC,YAAM,qBAAqB;AAC3B,UAAM,OAAO;KACb;GACF,MAAM,OAAgB,IAAI,OAAO,YAAuB;GAGxD,MAAM,OAAO;GACb,MAAM,OAAO;GACb,MAAM,QAAqB;IACzB,MAAM;IACN,aAAa;IACb,YAAY;IACZ,SAAS;IACT,MAAM;IACN;IACD;GAED,MAAM,YAAY,IAAI,SAAA,gBAAgB,MAAM;AAC5C,WAAM,kBAAkB;GACxB,MAAM,OAAO,MAAM,SAAS,OAAO;IACjC;IACA,KAAK,gBAAgB,UAAU,UAAU;IACzC;IACD,CAAC;AAWF,SAV4B,MAAM,QAAQ,IACxC,KAAK,KAAK,YAAY;AACpB,WAAO,YAAY,SAAS,MAAM,IAAI,YAAY;KAClD,CACH,EAGE,QAAQ,MAAqB,MAAM,KAAK,CACxC,MAAM,MAAM,KAAK,CAET;WACJ,KAAU;AACjB,QAAK,gBAAA,WAAW,iBAAiB,IAAI,QAAQ,CAAC;;GAGnD;AACD,QAAO"}
1
+ {"version":3,"file":"search.js","names":[],"sources":["../../src/api/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport { URLSearchParams } from 'node:url';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { errorUtils } from '@verdaccio/core';\nimport type { SearchQuery } from '@verdaccio/core/src/search-utils';\nimport { WebUrls } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Manifest } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction checkAccess(pkg: any, auth: any, remoteUser): Promise<Manifest | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n}\n\nfunction addSearchWebApi(storage: Storage, auth: Auth): Router {\n const router = Router(); /* eslint new-cap: 0 */\n router.get(\n WebUrls.search,\n async function (\n req: $RequestExtend,\n _res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const abort = new AbortController();\n const onClientClose = (): void => {\n debug('search web aborted');\n abort.abort();\n };\n req.socket.on('close', onClientClose);\n try {\n const text: string = (req.params.anything as string) ?? '';\n // These values are declared as optimal by npm cli\n // FUTURE: could be overwritten by ui settings.\n const size = 20;\n const from = 0;\n const query: SearchQuery = {\n from: 0,\n maintenance: 0.5,\n popularity: 0.98,\n quality: 0.65,\n size: 20,\n text,\n };\n // @ts-ignore\n const urlParams = new URLSearchParams(query);\n debug('search web init');\n const data = await storage?.search({\n query,\n url: `/-/v1/search?${urlParams.toString()}`,\n abort,\n });\n const checkAccessPromises = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final = checkAccessPromises\n .filter((i): i is Manifest => i !== null)\n .slice(from, size);\n\n next(final);\n } catch (err: any) {\n next(errorUtils.getInternalError(err.message));\n } finally {\n req.socket.off('close', onClientClose);\n }\n }\n );\n return router;\n}\n\nexport default addSearchWebApi;\n"],"mappings":";;;;;;;;AAaA,IAAM,WAAA,GAAA,MAAA,SAAmB,2BAA2B;AAEpD,SAAS,YAAY,KAAU,MAAW,YAAsC;AAC9E,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,OAAK,aAAa,EAAE,aAAa,KAAK,SAAS,MAAM,EAAE,YAAY,SAAU,KAAK,SAAS;AACzF,OAAI,IACF,KAAI,IAAI,UAAU,OAAO,IAAI,OAAO,CAAC,MAAM,UAAU,EAAE;AAGrD,cAAU;AACV,WAAO,QAAQ,KAAK;SAEpB,QAAO,IAAI;OAGb,QAAO,QAAQ,UAAU,MAAM,KAAK;IAEtC;GACF;;AAGJ,SAAS,gBAAgB,SAAkB,MAAoB;CAC7D,MAAM,UAAA,GAAA,QAAA,SAAiB;AACvB,QAAO,IACL,sBAAA,QAAQ,QACR,eACE,KACA,MACA,MACe;EACf,MAAM,QAAQ,IAAI,iBAAiB;EACnC,MAAM,sBAA4B;AAChC,WAAM,qBAAqB;AAC3B,SAAM,OAAO;;AAEf,MAAI,OAAO,GAAG,SAAS,cAAc;AACrC,MAAI;GACF,MAAM,OAAgB,IAAI,OAAO,YAAuB;GAGxD,MAAM,OAAO;GACb,MAAM,OAAO;GACb,MAAM,QAAqB;IACzB,MAAM;IACN,aAAa;IACb,YAAY;IACZ,SAAS;IACT,MAAM;IACN;IACD;GAED,MAAM,YAAY,IAAI,SAAA,gBAAgB,MAAM;AAC5C,WAAM,kBAAkB;GACxB,MAAM,OAAO,MAAM,SAAS,OAAO;IACjC;IACA,KAAK,gBAAgB,UAAU,UAAU;IACzC;IACD,CAAC;AAWF,SAV4B,MAAM,QAAQ,IACxC,KAAK,KAAK,YAAY;AACpB,WAAO,YAAY,SAAS,MAAM,IAAI,YAAY;KAClD,CACH,EAGE,QAAQ,MAAqB,MAAM,KAAK,CACxC,MAAM,MAAM,KAAK,CAET;WACJ,KAAU;AACjB,QAAK,gBAAA,WAAW,iBAAiB,IAAI,QAAQ,CAAC;YACtC;AACR,OAAI,OAAO,IAAI,SAAS,cAAc;;GAG3C;AACD,QAAO"}
@@ -19,12 +19,13 @@ function checkAccess(pkg, auth, remoteUser) {
19
19
  function addSearchWebApi(storage, auth) {
20
20
  const router = Router();
21
21
  router.get(WebUrls.search, async function(req, _res, next) {
22
+ const abort = new AbortController();
23
+ const onClientClose = () => {
24
+ debug("search web aborted");
25
+ abort.abort();
26
+ };
27
+ req.socket.on("close", onClientClose);
22
28
  try {
23
- const abort = new AbortController();
24
- req.socket.on("close", function() {
25
- debug("search web aborted");
26
- abort.abort();
27
- });
28
29
  const text = req.params.anything ?? "";
29
30
  const size = 20;
30
31
  const from = 0;
@@ -48,6 +49,8 @@ function addSearchWebApi(storage, auth) {
48
49
  }))).filter((i) => i !== null).slice(from, size));
49
50
  } catch (err) {
50
51
  next(errorUtils.getInternalError(err.message));
52
+ } finally {
53
+ req.socket.off("close", onClientClose);
51
54
  }
52
55
  });
53
56
  return router;
@@ -1 +1 @@
1
- {"version":3,"file":"search.mjs","names":[],"sources":["../../src/api/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport { URLSearchParams } from 'node:url';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { errorUtils } from '@verdaccio/core';\nimport type { SearchQuery } from '@verdaccio/core/src/search-utils';\nimport { WebUrls } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Manifest } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction checkAccess(pkg: any, auth: any, remoteUser): Promise<Manifest | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n}\n\nfunction addSearchWebApi(storage: Storage, auth: Auth): Router {\n const router = Router(); /* eslint new-cap: 0 */\n router.get(\n WebUrls.search,\n async function (\n req: $RequestExtend,\n _res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n try {\n const abort = new AbortController();\n req.socket.on('close', function () {\n debug('search web aborted');\n abort.abort();\n });\n const text: string = (req.params.anything as string) ?? '';\n // These values are declared as optimal by npm cli\n // FUTURE: could be overwritten by ui settings.\n const size = 20;\n const from = 0;\n const query: SearchQuery = {\n from: 0,\n maintenance: 0.5,\n popularity: 0.98,\n quality: 0.65,\n size: 20,\n text,\n };\n // @ts-ignore\n const urlParams = new URLSearchParams(query);\n debug('search web init');\n const data = await storage?.search({\n query,\n url: `/-/v1/search?${urlParams.toString()}`,\n abort,\n });\n const checkAccessPromises = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final = checkAccessPromises\n .filter((i): i is Manifest => i !== null)\n .slice(from, size);\n\n next(final);\n } catch (err: any) {\n next(errorUtils.getInternalError(err.message));\n }\n }\n );\n return router;\n}\n\nexport default addSearchWebApi;\n"],"mappings":";;;;;;AAaA,IAAM,QAAQ,WAAW,2BAA2B;AAEpD,SAAS,YAAY,KAAU,MAAW,YAAsC;AAC9E,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,OAAK,aAAa,EAAE,aAAa,KAAK,SAAS,MAAM,EAAE,YAAY,SAAU,KAAK,SAAS;AACzF,OAAI,IACF,KAAI,IAAI,UAAU,OAAO,IAAI,OAAO,CAAC,MAAM,UAAU,EAAE;AAGrD,cAAU;AACV,WAAO,QAAQ,KAAK;SAEpB,QAAO,IAAI;OAGb,QAAO,QAAQ,UAAU,MAAM,KAAK;IAEtC;GACF;;AAGJ,SAAS,gBAAgB,SAAkB,MAAoB;CAC7D,MAAM,SAAS,QAAQ;AACvB,QAAO,IACL,QAAQ,QACR,eACE,KACA,MACA,MACe;AACf,MAAI;GACF,MAAM,QAAQ,IAAI,iBAAiB;AACnC,OAAI,OAAO,GAAG,SAAS,WAAY;AACjC,UAAM,qBAAqB;AAC3B,UAAM,OAAO;KACb;GACF,MAAM,OAAgB,IAAI,OAAO,YAAuB;GAGxD,MAAM,OAAO;GACb,MAAM,OAAO;GACb,MAAM,QAAqB;IACzB,MAAM;IACN,aAAa;IACb,YAAY;IACZ,SAAS;IACT,MAAM;IACN;IACD;GAED,MAAM,YAAY,IAAI,gBAAgB,MAAM;AAC5C,SAAM,kBAAkB;GACxB,MAAM,OAAO,MAAM,SAAS,OAAO;IACjC;IACA,KAAK,gBAAgB,UAAU,UAAU;IACzC;IACD,CAAC;AAWF,SAV4B,MAAM,QAAQ,IACxC,KAAK,KAAK,YAAY;AACpB,WAAO,YAAY,SAAS,MAAM,IAAI,YAAY;KAClD,CACH,EAGE,QAAQ,MAAqB,MAAM,KAAK,CACxC,MAAM,MAAM,KAAK,CAET;WACJ,KAAU;AACjB,QAAK,WAAW,iBAAiB,IAAI,QAAQ,CAAC;;GAGnD;AACD,QAAO"}
1
+ {"version":3,"file":"search.mjs","names":[],"sources":["../../src/api/search.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport { Router } from 'express';\nimport { URLSearchParams } from 'node:url';\n\nimport type { Auth } from '@verdaccio/auth';\nimport { errorUtils } from '@verdaccio/core';\nimport type { SearchQuery } from '@verdaccio/core/src/search-utils';\nimport { WebUrls } from '@verdaccio/middleware';\nimport type { Storage } from '@verdaccio/store';\nimport type { Manifest } from '@verdaccio/types';\n\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from './package';\n\nconst debug = buildDebug('verdaccio:web:api:search');\n\nfunction checkAccess(pkg: any, auth: any, remoteUser): Promise<Manifest | null> {\n return new Promise((resolve, reject) => {\n auth.allow_access({ packageName: pkg?.package?.name }, remoteUser, function (err, allowed) {\n if (err) {\n if (err.status && String(err.status).match(/^4\\d\\d$/)) {\n // auth plugin returns 4xx user error,\n // that's equivalent of !allowed basically\n allowed = false;\n return resolve(null);\n } else {\n reject(err);\n }\n } else {\n return resolve(allowed ? pkg : null);\n }\n });\n });\n}\n\nfunction addSearchWebApi(storage: Storage, auth: Auth): Router {\n const router = Router(); /* eslint new-cap: 0 */\n router.get(\n WebUrls.search,\n async function (\n req: $RequestExtend,\n _res: $ResponseExtend,\n next: $NextFunctionVer\n ): Promise<void> {\n const abort = new AbortController();\n const onClientClose = (): void => {\n debug('search web aborted');\n abort.abort();\n };\n req.socket.on('close', onClientClose);\n try {\n const text: string = (req.params.anything as string) ?? '';\n // These values are declared as optimal by npm cli\n // FUTURE: could be overwritten by ui settings.\n const size = 20;\n const from = 0;\n const query: SearchQuery = {\n from: 0,\n maintenance: 0.5,\n popularity: 0.98,\n quality: 0.65,\n size: 20,\n text,\n };\n // @ts-ignore\n const urlParams = new URLSearchParams(query);\n debug('search web init');\n const data = await storage?.search({\n query,\n url: `/-/v1/search?${urlParams.toString()}`,\n abort,\n });\n const checkAccessPromises = await Promise.all(\n data.map((pkgItem) => {\n return checkAccess(pkgItem, auth, req.remote_user);\n })\n );\n\n const final = checkAccessPromises\n .filter((i): i is Manifest => i !== null)\n .slice(from, size);\n\n next(final);\n } catch (err: any) {\n next(errorUtils.getInternalError(err.message));\n } finally {\n req.socket.off('close', onClientClose);\n }\n }\n );\n return router;\n}\n\nexport default addSearchWebApi;\n"],"mappings":";;;;;;AAaA,IAAM,QAAQ,WAAW,2BAA2B;AAEpD,SAAS,YAAY,KAAU,MAAW,YAAsC;AAC9E,QAAO,IAAI,SAAS,SAAS,WAAW;AACtC,OAAK,aAAa,EAAE,aAAa,KAAK,SAAS,MAAM,EAAE,YAAY,SAAU,KAAK,SAAS;AACzF,OAAI,IACF,KAAI,IAAI,UAAU,OAAO,IAAI,OAAO,CAAC,MAAM,UAAU,EAAE;AAGrD,cAAU;AACV,WAAO,QAAQ,KAAK;SAEpB,QAAO,IAAI;OAGb,QAAO,QAAQ,UAAU,MAAM,KAAK;IAEtC;GACF;;AAGJ,SAAS,gBAAgB,SAAkB,MAAoB;CAC7D,MAAM,SAAS,QAAQ;AACvB,QAAO,IACL,QAAQ,QACR,eACE,KACA,MACA,MACe;EACf,MAAM,QAAQ,IAAI,iBAAiB;EACnC,MAAM,sBAA4B;AAChC,SAAM,qBAAqB;AAC3B,SAAM,OAAO;;AAEf,MAAI,OAAO,GAAG,SAAS,cAAc;AACrC,MAAI;GACF,MAAM,OAAgB,IAAI,OAAO,YAAuB;GAGxD,MAAM,OAAO;GACb,MAAM,OAAO;GACb,MAAM,QAAqB;IACzB,MAAM;IACN,aAAa;IACb,YAAY;IACZ,SAAS;IACT,MAAM;IACN;IACD;GAED,MAAM,YAAY,IAAI,gBAAgB,MAAM;AAC5C,SAAM,kBAAkB;GACxB,MAAM,OAAO,MAAM,SAAS,OAAO;IACjC;IACA,KAAK,gBAAgB,UAAU,UAAU;IACzC;IACD,CAAC;AAWF,SAV4B,MAAM,QAAQ,IACxC,KAAK,KAAK,YAAY;AACpB,WAAO,YAAY,SAAS,MAAM,IAAI,YAAY;KAClD,CACH,EAGE,QAAQ,MAAqB,MAAM,KAAK,CACxC,MAAM,MAAM,KAAK,CAET;WACJ,KAAU;AACjB,QAAK,WAAW,iBAAiB,IAAI,QAAQ,CAAC;YACtC;AACR,OAAI,OAAO,IAAI,SAAS,cAAc;;GAG3C;AACD,QAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/web",
3
- "version": "9.0.0-next-9.8",
3
+ "version": "9.0.0-next-9.10",
4
4
  "description": "Verdaccio Web Middleware",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -28,24 +28,25 @@
28
28
  },
29
29
  "license": "MIT",
30
30
  "dependencies": {
31
- "@verdaccio/auth": "9.0.0-next-9.8",
32
- "@verdaccio/config": "9.0.0-next-9.8",
33
- "@verdaccio/core": "9.0.0-next-9.8",
34
- "@verdaccio/loaders": "9.0.0-next-9.8",
35
- "@verdaccio/logger": "9.0.0-next-9.8",
36
- "@verdaccio/middleware": "9.0.0-next-9.8",
37
- "@verdaccio/store": "9.0.0-next-9.8",
38
- "@verdaccio/tarball": "14.0.0-next-9.8",
31
+ "@verdaccio/auth": "9.0.0-next-9.10",
32
+ "@verdaccio/config": "9.0.0-next-9.10",
33
+ "@verdaccio/core": "9.0.0-next-9.10",
34
+ "@verdaccio/loaders": "9.0.0-next-9.10",
35
+ "@verdaccio/logger": "9.0.0-next-9.10",
36
+ "@verdaccio/middleware": "9.0.0-next-9.10",
37
+ "@verdaccio/store": "9.0.0-next-9.10",
38
+ "@verdaccio/tarball": "14.0.0-next-9.10",
39
39
  "debug": "4.4.3",
40
40
  "express": "5.2.1",
41
41
  "lodash-es": "4.17.23"
42
42
  },
43
43
  "devDependencies": {
44
- "@verdaccio/api": "9.0.0-next-9.8",
45
- "@verdaccio/test-helper": "5.0.0-next-9.8",
46
- "@verdaccio/types": "14.0.0-next-9.4",
44
+ "@verdaccio/api": "9.0.0-next-9.10",
45
+ "@verdaccio/test-helper": "5.0.0-next-9.10",
46
+ "@verdaccio/types": "14.0.0-next-9.5",
47
47
  "@types/lodash-es": "4.17.12",
48
48
  "jsdom": "28.1.0",
49
+ "nock": "13.5.6",
49
50
  "supertest": "7.1.4",
50
51
  "vitest": "4.1.0"
51
52
  },