import type * as fastify from "fastify"; import {mapValues} from "@lodestar/utils"; import {getFastifySchema} from "../schema.js"; import {Endpoint, RouteDefinition, RouteDefinitions} from "../types.js"; import {toColonNotationPath} from "../urlFormat.js"; import {FastifyHandler, createFastifyHandler} from "./handler.js"; import {ApplicationMethod, ApplicationMethods} from "./method.js"; export type FastifySchema = fastify.FastifySchema & { operationId: string; tags?: string[]; }; export type FastifyRoute = { url: string; method: fastify.HTTPMethods; handler: FastifyHandler; schema: FastifySchema; }; export type FastifyRoutes> = {[K in keyof Es]: FastifyRoute}; export function createFastifyRoute( definition: RouteDefinition, method: ApplicationMethod, operationId: string ): FastifyRoute { return { url: toColonNotationPath(definition.url), method: definition.method, handler: createFastifyHandler(definition, method, operationId), schema: { ...getFastifySchema(definition.req.schema), operationId, }, }; } export function createFastifyRoutes>( definitions: RouteDefinitions, methods: ApplicationMethods ): FastifyRoutes { return mapValues(definitions, (definition, operationId) => createFastifyRoute(definition, methods?.[operationId]?.bind(methods), operationId as string) ); }