fastify-file-router
Version:
A fastify plugin that automatically registers routes from files in a directory.
50 lines • 1.97 kB
TypeScript
import type { FastifyReply, FastifyRequest, FastifySchema } from 'fastify';
import type { FromSchema, JSONSchema } from 'json-schema-to-ts';
/**
* Helper type to extract TypeScript types from JSON schemas in a RouteSchema
* Returns unknown for properties that don't exist (matching Fastify's default behavior)
*/
type ExtractSchemaTypes<T extends FastifySchema> = {
Params: 'params' extends keyof T ? (T['params'] extends JSONSchema ? FromSchema<T['params']> : unknown) : unknown;
Body: 'body' extends keyof T ? (T['body'] extends JSONSchema ? FromSchema<T['body']> : unknown) : unknown;
Querystring: 'querystring' extends keyof T ? T['querystring'] extends JSONSchema ? FromSchema<T['querystring']> : unknown : unknown;
Headers: 'headers' extends keyof T ? (T['headers'] extends JSONSchema ? FromSchema<T['headers']> : unknown) : unknown;
};
/**
* Route handler function type with inferred types from schema
*/
type TypedRouteHandler<T extends FastifySchema> = (request: FastifyRequest<ExtractSchemaTypes<T>>, reply: FastifyReply) => Promise<unknown> | unknown;
/**
* Route module returned by defineRoute
*/
export interface DefinedRoute<T extends FastifySchema> {
schema: T;
handler: TypedRouteHandler<T>;
}
/**
* Helper to define a route with type inference for request parameters, body, querystring, and headers.
*
* @example
* ```typescript
* export const route = defineRoute({
* schema: {
* params: {
* type: 'object',
* properties: { id: { type: 'string' } },
* required: ['id']
* } as const
* },
* handler: async (request, reply) => {
* // request.params.id is correctly typed as string
* const { id } = request.params;
* reply.status(200).send({ id });
* }
* });
* ```
*/
export declare function defineRoute<T extends FastifySchema>(route: {
schema: T;
handler: TypedRouteHandler<T>;
}): DefinedRoute<T>;
export {};
//# sourceMappingURL=defineRoute.d.ts.map