UNPKG

@sigiljs/sigil

Version:

TypeScript-first Node.js HTTP framework offering schema-driven routing, modifier-based middleware, plugin extensibility, and flexible response templating

166 lines (165 loc) 8.01 kB
import { Pathfinder, RouteParams } from '@sigiljs/pathfinder'; import { ClientRequest } from '../index'; import { default as SigilResponsesList } from '../sigil/misc/sigil-responses-list'; import { default as Sigil } from '../sigil/sigil'; import { Internal } from '../types'; import { MergePayloads, ModifierConstructor } from './modifier/modifier'; import { RouteOptions } from './route'; import { default as RouteCore } from './route-core'; type Constructor = (readonly ModifierConstructor<any, any>[]) | undefined; type THandler<Path extends string, Body extends Record<string, any> | undefined = undefined, Headers extends Record<string, string | undefined> = Record<string, string | undefined>, Query extends Record<string, string | undefined> = Record<string, string | undefined>, M extends Constructor | undefined = undefined> = (request: X<Internal.Requests.ClientRequest<RouteParams<Path>, Body, Headers, Query>, M>, responses: SigilResponsesList, app: Sigil | null) => Internal.Requests.HandlerResponse; type X<T extends ClientRequest<any>, M extends Constructor> = T & (M extends readonly ModifierConstructor<any, any>[] ? MergePayloads<M> : {}); /** * Extends RouteCore to provide methods for registering HTTP routes * with optional validation schemas. Automatically derives request types * based on configured schemas. * * @template Modifier tuple of modifier constructors applied to this route. * @template BodySchema shape of the request body schema, if provided. * @template HeadersSchema shape of the request headers schema, if provided. * @template QuerySchema shape of the request query schema, if provided. */ export default class RouteRequests<Modifier extends Constructor, BodySchema extends Record<string, any> | undefined = undefined, HeadersSchema extends Record<string, string | undefined> = Record<string, string | undefined>, QuerySchema extends Record<string, string | undefined> = Record<string, string | undefined>> extends RouteCore<Modifier> { /** * @param modifiers array of modifier constructors to apply. * @param pathfinder the underlying pathfinder router instance. * @param $options optional router configuration options. */ constructor(modifiers: Modifier, pathfinder: Pathfinder, $options?: RouteOptions<Modifier>); /** * Registers a GET route. * Not available if a body schema was previously applied. * * @param path URL path for the route. * @param handler request handler function. * @returns chainable methods for adding metadata (meta, description). */ get<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** Registers a POST route. */ post<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** Registers a PUT route. */ put<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** Registers a PATCH route. */ patch<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** Registers a DELETE route. */ delete<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** Registers an OPTIONS route. */ options<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** Registers a TRACE route. */ trace<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** Registers a CONNECT route. */ connect<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** Registers a HEAD route. */ head<Path extends string>(path: Path, handler: THandler<Path, BodySchema, HeadersSchema, QuerySchema, Modifier>): { /** * Adds metadata to the registered route. * @param payload partial metadata object to merge. */ meta(payload?: Partial<Internal.Route.RequestMetadataDescriptor> | undefined): void; /** * Shortcut to set the route description metadata. * @param payload description text. */ description(payload: string): void; }; /** * Internal method to register a route with pathfinder. * Validates incoming requests against schemas if provided. * * @param method HTTP method for the route. * @param path URL path for the route. * @param handler request handler function. * @returns chainable methods for adding metadata (meta, description). * @private */ private $request; } export {};