{"version":3,"file":"index.mjs","names":[],"sources":["../../src/api/index.ts"],"sourcesContent":["import compression from 'compression';\nimport cors from 'cors';\nimport type { Application } from 'express';\nimport express from 'express';\nimport _ from 'lodash';\n\nimport { Auth } from '@verdaccio/auth';\nimport { getUserAgent } from '@verdaccio/config';\nimport type { pluginUtils } from '@verdaccio/core';\nimport { PLUGIN_CATEGORY } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport { errorReportingMiddleware, final, handleError, log } from '@verdaccio/middleware';\nimport { SearchMemoryIndexer } from '@verdaccio/search-indexer';\nimport type { ConfigYaml, Config as IConfig } from '@verdaccio/types';\n\nimport AppConfig from '../lib/config';\nimport { API_ERROR } from '../lib/constants';\nimport { logger } from '../lib/logger';\nimport Storage from '../lib/storage';\nimport { ErrorCode } from '../lib/utils';\nimport type { $NextFunctionVer, $RequestExtend, $ResponseExtend } from '../types';\nimport hookDebug from './debug';\nimport apiEndpoint from './endpoint';\nimport { serveFavicon } from './middleware';\nimport webMiddleware from './web';\n\nconst version = process.env.PACKAGE_VERSION || 'dev';\n\nconst defineAPI = async function (config: IConfig, storage: Storage): Promise<express.Application> {\n  const auth = new Auth(config, logger, { legacyMergeConfigs: true });\n  await auth.init();\n  const app: Application = express();\n  SearchMemoryIndexer.configureStorage(storage);\n  await SearchMemoryIndexer.init(logger);\n  // run in production mode by default, just in case\n  // it shouldn't make any difference anyway\n  app.set('env', process.env.NODE_ENV || 'production');\n\n  // Allow `req.ip` to resolve properly when Verdaccio is behind a proxy or load-balancer\n  // See: https://expressjs.com/en/guide/behind-proxies.html\n  if (config.server?.trustProxy) {\n    app.set('trust proxy', config.server.trustProxy);\n  }\n\n  app.use(cors());\n\n  // // Router setup\n  app.use(log(logger));\n  app.use(errorReportingMiddleware(logger));\n  if (config.user_agent) {\n    app.use(function (_req: $RequestExtend, res: $ResponseExtend, next: $NextFunctionVer): void {\n      res.setHeader('X-Powered-By', getUserAgent(config.user_agent));\n      next();\n    });\n  } else {\n    app.disable('x-powered-by');\n  }\n\n  app.use(compression());\n\n  app.get('/-/static/favicon.ico', serveFavicon(config));\n\n  // Hook for tests only\n  if (config._debug) {\n    hookDebug(app, config.configPath);\n  }\n\n  const plugins: pluginUtils.ExpressMiddleware<IConfig, '', Auth>[] = await asyncLoadPlugin(\n    config.middlewares,\n    {\n      config,\n      logger,\n    },\n    function (plugin) {\n      return typeof plugin.register_middlewares !== 'undefined';\n    },\n    true,\n    config?.serverSettings?.pluginPrefix ?? 'verdaccio',\n    PLUGIN_CATEGORY.MIDDLEWARE\n  );\n\n  // Register JWT middleware so middleware plugins can access req.remote_user\n  app.use(auth.apiJWTmiddleware());\n\n  plugins.forEach((plugin: any) => {\n    plugin.register_middlewares(app, auth, storage);\n  });\n\n  // // For  npm request\n  app.use(apiEndpoint(config, auth, storage));\n\n  // For WebUI & WebUI API\n  if (_.get(config, 'web.enable', true)) {\n    app.use((_req, res, next) => {\n      res.locals.app_version = version ?? '';\n      next();\n    });\n    const middleware = await webMiddleware(config, auth, storage, logger);\n    app.use(middleware);\n  } else {\n    app.get('/', function (_, __, next: $NextFunctionVer) {\n      next(ErrorCode.getNotFound(API_ERROR.WEB_DISABLED));\n    });\n  }\n\n  app.get('/*', function (_, __, next: $NextFunctionVer) {\n    next(ErrorCode.getNotFound(API_ERROR.FILE_NOT_FOUND));\n  });\n  app.use(handleError(logger));\n  app.use(final);\n\n  return app;\n};\n\nexport default (async function (configHash: ConfigYaml): Promise<express.Application> {\n  const config: IConfig = new AppConfig(_.cloneDeep(configHash));\n\n  const storage = new Storage(config);\n  // waits until init calls have been initialized\n  await storage.init(config);\n  return await defineAPI(config, storage);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA0BA,IAAM,UAAA;AAEN,IAAM,YAAY,eAAgB,QAAiB,SAAgD;CACjG,MAAM,OAAO,IAAI,KAAK,QAAQ,QAAQ,EAAE,oBAAoB,KAAK,CAAC;CAClE,MAAM,KAAK,KAAK;CAChB,MAAM,MAAmB,QAAQ;CACjC,oBAAoB,iBAAiB,OAAO;CAC5C,MAAM,oBAAoB,KAAK,MAAM;CAGrC,IAAI,IAAI,OAAA,QAAA,IAAA,YAA+B,YAAY;CAInD,IAAI,OAAO,QAAQ,YACjB,IAAI,IAAI,eAAe,OAAO,OAAO,UAAU;CAGjD,IAAI,IAAI,KAAK,CAAC;CAGd,IAAI,IAAI,IAAI,MAAM,CAAC;CACnB,IAAI,IAAI,yBAAyB,MAAM,CAAC;CACxC,IAAI,OAAO,YACT,IAAI,IAAI,SAAU,MAAsB,KAAsB,MAA8B;EAC1F,IAAI,UAAU,gBAAgB,aAAa,OAAO,UAAU,CAAC;EAC7D,KAAK;CACP,CAAC;MAED,IAAI,QAAQ,cAAc;CAG5B,IAAI,IAAI,YAAY,CAAC;CAErB,IAAI,IAAI,yBAAyB,aAAa,MAAM,CAAC;CAGrD,IAAI,OAAO,QACT,cAAU,KAAK,OAAO,UAAU;CAGlC,MAAM,UAA8D,MAAM,gBACxE,OAAO,aACP;EACE;EACA;CACF,GACA,SAAU,QAAQ;EAChB,OAAO,OAAO,OAAO,yBAAyB;CAChD,GACA,MACA,QAAQ,gBAAgB,gBAAgB,aACxC,gBAAgB,UAClB;CAGA,IAAI,IAAI,KAAK,iBAAiB,CAAC;CAE/B,QAAQ,SAAS,WAAgB;EAC/B,OAAO,qBAAqB,KAAK,MAAM,OAAO;CAChD,CAAC;CAGD,IAAI,IAAI,iBAAY,QAAQ,MAAM,OAAO,CAAC;CAG1C,IAAI,EAAE,IAAI,QAAQ,cAAc,IAAI,GAAG;EACrC,IAAI,KAAK,MAAM,KAAK,SAAS;GAC3B,IAAI,OAAO,cAAc;GACzB,KAAK;EACP,CAAC;EACD,MAAM,aAAa,MAAM,YAAc,QAAQ,MAAM,SAAS,MAAM;EACpE,IAAI,IAAI,UAAU;CACpB,OACE,IAAI,IAAI,KAAK,SAAU,GAAG,IAAI,MAAwB;EACpD,KAAK,UAAU,YAAY,UAAU,YAAY,CAAC;CACpD,CAAC;CAGH,IAAI,IAAI,MAAM,SAAU,GAAG,IAAI,MAAwB;EACrD,KAAK,UAAU,YAAY,UAAU,cAAc,CAAC;CACtD,CAAC;CACD,IAAI,IAAI,YAAY,MAAM,CAAC;CAC3B,IAAI,IAAI,KAAK;CAEb,OAAO;AACT;AAEA,IAAA,eAAgB,eAAgB,YAAsD;CACpF,MAAM,SAAkB,IAAI,SAAU,EAAE,UAAU,UAAU,CAAC;CAE7D,MAAM,UAAU,IAAI,QAAQ,MAAM;CAElC,MAAM,QAAQ,KAAK,MAAM;CACzB,OAAO,MAAM,UAAU,QAAQ,OAAO;AACxC"}