diff --git a/index.d.ts b/index.d.ts index e16fce9..4910b37 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,111 +1,131 @@ import type { FastifyPluginCallback, RouteOptions, HTTPMethods } from 'fastify' -interface OverviewStructureSource { - stackIndex: number, - fileName: string, - relativeFileName: string, - lineNumber: number, - columnNumber: number, - functionName: string, - typeName?: string, - methodName?: string, +declare module 'fastify' { + export interface FastifyInstance { + overview: = {}>(opts?: fastifyOverview.FastifyOverviewDecoratorOptions) => fastifyOverview.OverviewStructure; + } } -interface OverviewStructureDecorator { - name: string; - type: 'undefined' | 'object' | 'boolean' | 'number' | 'bigint' | 'string' | 'symbol' | 'function' | 'array' - source?: OverviewStructureSource, -} +type FastifyOverview = FastifyPluginCallback -interface OverviewStructureHook { - name: string; - hash: string; - source?: OverviewStructureSource; -} +declare namespace fastifyOverview { + export interface OverviewStructureSource { + stackIndex: number, + fileName: string, + relativeFileName: string, + lineNumber: number, + columnNumber: number, + functionName: string, + typeName?: string, + methodName?: string, + } -interface OverviewStructureHooks { - onRequest?: OverviewStructureHook[], - preParsing?: OverviewStructureHook[], - preValidation?: OverviewStructureHook[], - preHandler?: OverviewStructureHook[], - preSerialization?: OverviewStructureHook[], - onError?: OverviewStructureHook[], - onSend?: OverviewStructureHook[], - onResponse?: OverviewStructureHook[], - onTimeout?: OverviewStructureHook[], - onListen?: OverviewStructureHook[], - onReady?: OverviewStructureHook[], - preClose?: OverviewStructureHook[], - onClose?: OverviewStructureHook[], - onRoute?: OverviewStructureHook[], - onRegister?: OverviewStructureHook[], - onRequestAbort?: OverviewStructureHook[], -} + export interface OverviewStructureDecorator { + name: string; + type: 'undefined' | 'object' | 'boolean' | 'number' | 'bigint' | 'string' | 'symbol' | 'function' | 'array' + source?: OverviewStructureSource, + } -interface RouteItem { - method: HTTPMethods | HTTPMethods[], - url: string, - prefix: string, - hooks: OverviewStructureHooks, - source?: OverviewStructureSource, -} + export interface OverviewStructureHook { + name: string; + hash: string; + source?: OverviewStructureSource; + } -export interface OverviewStructure { - id: Number, - name: string, - source?: OverviewStructureSource, - children?: OverviewStructure[], - decorators?: { - decorate: OverviewStructureDecorator[], - decorateRequest: OverviewStructureDecorator[], - decorateReply: OverviewStructureDecorator[] - }, - hooks?: OverviewStructureHooks, - routes?: (Omit & T)[] -} + export interface OverviewStructureHooks { + onRequest?: OverviewStructureHook[], + preParsing?: OverviewStructureHook[], + preValidation?: OverviewStructureHook[], + preHandler?: OverviewStructureHook[], + preSerialization?: OverviewStructureHook[], + onError?: OverviewStructureHook[], + onSend?: OverviewStructureHook[], + onResponse?: OverviewStructureHook[], + onTimeout?: OverviewStructureHook[], + onListen?: OverviewStructureHook[], + onReady?: OverviewStructureHook[], + preClose?: OverviewStructureHook[], + onClose?: OverviewStructureHook[], + onRoute?: OverviewStructureHook[], + onRegister?: OverviewStructureHook[], + onRequestAbort?: OverviewStructureHook[], + } -export interface FastifyOverviewOptions { - /** - * Add a `source` property to each node of the tree. - * @default false - */ - addSource?: boolean, - - /** - * Expose a route that will return the JSON structure. - * By default the route is exposed at `GET /json-overview`. - * @default false - */ - exposeRoute?: boolean, - - /** - * Customize the route's options when `exposeRoute` is set to `true` - */ - exposeRouteOptions?: Partial, - - /** - * Customise which properties of the route options will be included in the overview - */ - onRouteDefinition?: (routeOptions: RouteOptions & { routePath: string; path: string; prefix: string }) => Record -} + export interface RouteItem { + method: HTTPMethods | HTTPMethods[], + url: string, + prefix: string, + hooks: OverviewStructureHooks, + source?: OverviewStructureSource, + } -export interface FastifyOverviewDecoratorOptions { - /** - * Filters routes based on the provided predicate - */ - routesFilter?: (routeItem: RouteItem) => boolean, - /** - * To keep the structure light and clean, you can hide empty properties - * @default false - */ - hideEmpty?: boolean, -} + export interface Decorators { + instance?: Record + request?: Record + reply?: Record + } -declare module 'fastify' { - export interface FastifyInstance { - overview: (opts?: FastifyOverviewDecoratorOptions) => OverviewStructure; + type ExtractDecoratorType, K extends keyof Decorators> = T extends Decorators ? T[K] : T + + export interface OverviewStructure = {}> { + id: Number, + name: string, + source?: OverviewStructureSource, + children?: OverviewStructure[], + decorators?: { + decorate: (Omit> & ExtractDecoratorType)[], + decorateRequest: (Omit> & ExtractDecoratorType)[], + decorateReply: (Omit> & ExtractDecoratorType)[] + }, + hooks?: OverviewStructureHooks, + routes?: (Omit & T)[] + } + + export interface FastifyOverviewOptions { + /** + * Add a `source` property to each node of the tree. + * @default false + */ + addSource?: boolean, + + /** + * Expose a route that will return the JSON structure. + * By default the route is exposed at `GET /json-overview`. + * @default false + */ + exposeRoute?: boolean, + + /** + * Customize the route's options when `exposeRoute` is set to `true` + */ + exposeRouteOptions?: Partial, + + /** + * Customise which properties of the route options will be included in the overview + */ + onRouteDefinition?: (routeOptions: RouteOptions & { routePath: string; path: string; prefix: string }) => Record + + /** + * Customise which information from decorators should be added to the overview + */ + onDecorateDefinition?: (type: 'decorate' | 'decorateRequest' | 'decorateReply', name: string, value: unknown) => Record } + + export interface FastifyOverviewDecoratorOptions { + /** + * Filters routes based on the provided predicate + */ + routesFilter?: (routeItem: RouteItem) => boolean, + /** + * To keep the structure light and clean, you can hide empty properties + * @default false + */ + hideEmpty?: boolean, + } + + export const fastifyOverview: FastifyOverview + export { fastifyOverview as default } } -export const FastifyOverview: FastifyPluginCallback -export default FastifyOverview +declare function fastifyOverview(...params: Parameters): ReturnType +export = fastifyOverview