UNPKG

opinionated-machine

Version:

Very opinionated DI framework for fastify, built on top of awilix

42 lines (41 loc) 1.63 kB
import type { ApiContract } from '@lokalise/api-contracts'; import type { RouteOptions } from 'fastify'; import type { GatewayMetadataValue } from '../gateway/gatewayMetadata.ts'; /** * Abstract base class for controllers that use the `ApiContract` API. * * Concrete controllers declare a static `contracts` field and a `routes` object * built with `buildApiRoute()`. The generic ensures every contract has a matching route. * * @example * ```typescript * class UserController extends AbstractApiController<typeof UserController.contracts> { * static contracts = { * getUser: getUserContract, * streamUpdates: streamUpdatesContract, * } as const * * readonly routes = { * getUser: buildApiRoute(UserController.contracts.getUser, async (req) => ({ * status: 200, * body: { id: req.params.id }, * })), * streamUpdates: buildApiRoute(UserController.contracts.streamUpdates, async (_req, sse) => { * sse.start('keepAlive') * }), * } * } * ``` */ export declare abstract class AbstractApiController<APIContracts extends Record<string, ApiContract>> { abstract readonly routes: Record<keyof APIContracts, RouteOptions>; /** * Optional controller-level defaults for gateway metadata. * * Merged underneath per-route metadata (passed inline via * `buildApiRoute(..., { gatewayMetadata })` or attached post-hoc via * `withGatewayMetadata`) when `DIContext.buildGatewayManifest()` assembles a * manifest. See `AbstractController.gatewayDefaults` for full semantics. */ readonly gatewayDefaults?: GatewayMetadataValue; }