{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/api/web/index.ts"],"sourcesContent":["import buildDebug from 'debug';\nimport type { RequestHandler } from 'express';\nimport express, { Router } from 'express';\nimport _ from 'lodash';\n\nimport { PLUGIN_CATEGORY } from '@verdaccio/core';\nimport { asyncLoadPlugin } from '@verdaccio/loaders';\nimport {\n  WebUrlsNamespace,\n  renderWebMiddleware,\n  setSecurityWebHeaders,\n  validateName,\n  validatePackage,\n} from '@verdaccio/middleware';\nimport defaultTheme from '@verdaccio/ui-theme';\n\n// the local wrapper keeps a live binding; importing `logger` straight from the\n// CJS @verdaccio/logger package snapshots `undefined` in the ESM build\nimport { logger } from '../../lib/logger';\nimport webEndpointsApi from './api';\n\nconst debug = buildDebug('verdaccio:web');\nexport const PLUGIN_UI_PREFIX = 'verdaccio-theme';\nexport const DEFAULT_PLUGIN_UI_THEME = '@verdaccio/ui-theme';\n\nexport async function loadTheme(config: any) {\n  if (_.isNil(config.theme) === false) {\n    const plugin = await asyncLoadPlugin(\n      config.theme,\n      { config, logger },\n      // TODO: add types { staticPath: string; manifest: unknown; manifestFiles: unknown }\n      function (plugin: any) {\n        /**\n                 *\n                 - `staticPath`: is the same data returned in Verdaccio 5.\n                 - `manifest`: A webpack manifest object.\n                 - `manifestFiles`: A object with one property `js` and the array (order matters) of the manifest id to be loaded in the template dynamically.\n                 */\n        return plugin.staticPath && plugin.manifest && plugin.manifestFiles;\n      },\n      true,\n      config?.serverSettings?.pluginPrefix ?? PLUGIN_UI_PREFIX,\n      PLUGIN_CATEGORY.THEME\n    );\n    if (plugin.length > 1) {\n      logger.warn('multiple ui themes are not supported; only the first plugin is used');\n    }\n\n    return _.head(plugin);\n  }\n}\n\nexport function webAPIMiddleware(\n  tokenMiddleware: RequestHandler,\n  webEndpointsApi: RequestHandler\n): Router {\n  const route = Router();\n  // validate all of these params as a package name\n  // this might be too harsh, so ask if it causes trouble=\n  route.param('package', validatePackage);\n  route.param('filename', validateName);\n  route.param('version', validateName);\n  route.use(express.urlencoded({ extended: false }));\n  route.use(setSecurityWebHeaders);\n\n  if (typeof tokenMiddleware === 'function') {\n    route.use(tokenMiddleware);\n  }\n\n  if (typeof webEndpointsApi === 'function') {\n    route.use(webEndpointsApi);\n  }\n\n  return route;\n}\n\nexport function webMiddleware(config, middlewares, pluginOptions): any {\n  const router = express.Router();\n  const { tokenMiddleware, webEndpointsApi } = middlewares;\n  // render web\n  router.use(WebUrlsNamespace.root, renderWebMiddleware(config, tokenMiddleware, pluginOptions));\n  // web endpoints: search, packages, readme, sidebar, etc\n  router.use(WebUrlsNamespace.endpoints, webAPIMiddleware(tokenMiddleware, webEndpointsApi));\n  return router;\n}\n\nexport default async (config, auth, storage, logger) => {\n  let pluginOptions = await loadTheme(config);\n  if (!pluginOptions) {\n    debug('no theme plugin found, using default theme');\n    pluginOptions = defaultTheme(config.web);\n    logger.info(\n      { name: DEFAULT_PLUGIN_UI_THEME, pluginCategory: PLUGIN_CATEGORY.THEME },\n      'plugin @{name} successfully loaded (@{pluginCategory})'\n    );\n  }\n\n  const router = Router();\n  // web endpoints, search, packages, etc\n  router.use(\n    webMiddleware(\n      config,\n      {\n        tokenMiddleware: auth.webUIJWTmiddleware(),\n        webEndpointsApi: webEndpointsApi(auth, storage, config),\n      },\n      pluginOptions\n    )\n  );\n  return router;\n};\n"],"mappings":";;;;;;;;;;AAqBA,IAAM,QAAQ,YAAW,eAAe;AACxC,IAAa,mBAAmB;AAChC,IAAa,0BAA0B;AAEvC,eAAsB,UAAU,QAAa;CAC3C,IAAI,EAAE,MAAM,OAAO,KAAK,MAAM,OAAO;EACnC,MAAM,SAAS,MAAM,gBACnB,OAAO,OACP;GAAE;GAAQ;EAAO,GAEjB,SAAU,QAAa;;;;;;;GAOrB,OAAO,OAAO,cAAc,OAAO,YAAY,OAAO;EACxD,GACA,MACA,QAAQ,gBAAgB,gBAAA,mBACxB,gBAAgB,KAClB;EACA,IAAI,OAAO,SAAS,GAClB,OAAO,KAAK,qEAAqE;EAGnF,OAAO,EAAE,KAAK,MAAM;CACtB;AACF;AAEA,SAAgB,iBACd,iBACA,iBACQ;CACR,MAAM,QAAQ,OAAO;CAGrB,MAAM,MAAM,WAAW,eAAe;CACtC,MAAM,MAAM,YAAY,YAAY;CACpC,MAAM,MAAM,WAAW,YAAY;CACnC,MAAM,IAAI,QAAQ,WAAW,EAAE,UAAU,MAAM,CAAC,CAAC;CACjD,MAAM,IAAI,qBAAqB;CAE/B,IAAI,OAAO,oBAAoB,YAC7B,MAAM,IAAI,eAAe;CAG3B,IAAI,OAAO,oBAAoB,YAC7B,MAAM,IAAI,eAAe;CAG3B,OAAO;AACT;AAEA,SAAgB,cAAc,QAAQ,aAAa,eAAoB;CACrE,MAAM,SAAS,QAAQ,OAAO;CAC9B,MAAM,EAAE,iBAAiB,oBAAoB;CAE7C,OAAO,IAAI,iBAAiB,MAAM,oBAAoB,QAAQ,iBAAiB,aAAa,CAAC;CAE7F,OAAO,IAAI,iBAAiB,WAAW,iBAAiB,iBAAiB,eAAe,CAAC;CACzF,OAAO;AACT;AAEA,IAAA,cAAe,OAAO,QAAQ,MAAM,SAAS,WAAW;CACtD,IAAI,gBAAgB,MAAM,UAAU,MAAM;CAC1C,IAAI,CAAC,eAAe;EAClB,MAAM,4CAA4C;EAClD,gBAAgB,aAAa,OAAO,GAAG;EACvC,OAAO,KACL;GAAE,MAAM;GAAyB,gBAAgB,gBAAgB;EAAM,GACvE,wDACF;CACF;CAEA,MAAM,SAAS,OAAO;CAEtB,OAAO,IACL,cACE,QACA;EACE,iBAAiB,KAAK,mBAAmB;EACzC,iBAAiB,YAAgB,MAAM,SAAS,MAAM;CACxD,GACA,aACF,CACF;CACA,OAAO;AACT"}