{"version":3,"file":"routing.mjs","sources":["../../../src/services/server/routing.ts"],"sourcesContent":["import Router from '@koa/router';\nimport { has } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport createEndpointComposer from './compose-endpoint';\n\nconst policyOrMiddlewareSchema = yup.lazy((value) => {\n  if (typeof value === 'string') {\n    return yup.string().required();\n  }\n\n  if (typeof value === 'function') {\n    return yup.mixed().isFunction();\n  }\n\n  return yup.object({\n    name: yup.string().required(),\n    options: yup.object().notRequired(), // any options\n  });\n});\n\nconst routeSchema = yup.object({\n  method: yup.string().oneOf(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'ALL']).required(),\n  path: yup.string().required(),\n  handler: yup.lazy((value) => {\n    if (typeof value === 'string') {\n      return yup.string().required();\n    }\n\n    if (Array.isArray(value)) {\n      return yup.array().required();\n    }\n\n    return yup.mixed().isFunction().required();\n  }),\n  request: yup\n    .object({\n      params: yup.object().notRequired(),\n      query: yup.object().notRequired(),\n      body: yup.object().notRequired(),\n    })\n    .notRequired(),\n  response: yup.object().notRequired(),\n  config: yup\n    .object({\n      auth: yup.lazy((value) => {\n        if (value === false) {\n          return yup.boolean().required();\n        }\n\n        return yup.object({\n          scope: yup.array().of(yup.string()).required(),\n        });\n      }),\n      policies: yup\n        .array()\n        // FIXME: fixed in yup v1\n        .of(policyOrMiddlewareSchema as any)\n        .notRequired(),\n      middlewares: yup\n        .array()\n        // FIXME: fixed in yup v1\n        .of(policyOrMiddlewareSchema as any)\n        .notRequired(),\n    })\n    .notRequired(),\n});\n\nconst validateRouteConfig = (routeConfig: Core.RouteInput) => {\n  try {\n    return routeSchema.validateSync(routeConfig, {\n      strict: true,\n      abortEarly: false,\n      stripUnknown: true,\n    });\n  } catch (error) {\n    if (error instanceof yup.ValidationError) {\n      throw new Error(`Invalid route config ${error.message}`);\n    }\n  }\n};\n\nconst createRouteManager = (strapi: Core.Strapi, opts: { type?: string } = {}) => {\n  const { type } = opts;\n\n  const composeEndpoint = createEndpointComposer(strapi);\n\n  const createRoute = (route: Core.RouteInput, router: Router) => {\n    validateRouteConfig(route);\n\n    // NOTE: the router type is used to tag controller actions and for authentication / authorization so we need to pass this info down to the route level\n    const routeWithInfo = Object.assign(route, {\n      info: {\n        ...(route.info ?? {}),\n        type: type ?? 'api',\n      },\n    });\n\n    composeEndpoint(routeWithInfo, { router });\n  };\n\n  const addRoutes = (routes: Core.Router | Core.RouteInput[], router: Router) => {\n    if (Array.isArray(routes)) {\n      routes.forEach((route) => createRoute(route, router));\n    } else if (routes.routes) {\n      const subRouter = new Router({ prefix: routes.prefix });\n\n      routes.routes.forEach((route) => {\n        const hasPrefix = has('prefix', route.config);\n        createRoute(route, hasPrefix ? router : subRouter);\n      });\n\n      return router.use(subRouter.routes(), subRouter.allowedMethods());\n    }\n  };\n\n  return {\n    addRoutes,\n  };\n};\n\nexport { validateRouteConfig, createRouteManager };\n"],"names":["policyOrMiddlewareSchema","yup","lazy","value","string","required","mixed","isFunction","object","name","options","notRequired","routeSchema","method","oneOf","path","handler","Array","isArray","array","request","params","query","body","response","config","auth","boolean","scope","of","policies","middlewares","validateRouteConfig","routeConfig","validateSync","strict","abortEarly","stripUnknown","error","ValidationError","Error","message","createRouteManager","strapi","opts","type","composeEndpoint","createEndpointComposer","createRoute","route","router","routeWithInfo","Object","assign","info","addRoutes","routes","forEach","subRouter","Router","prefix","hasPrefix","has","use","allowedMethods"],"mappings":"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"}