Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

restructure types #101

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
214 changes: 117 additions & 97 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -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: <T = {}, D extends Record<PropertyKey, unknown> = {}>(opts?: fastifyOverview.FastifyOverviewDecoratorOptions) => fastifyOverview.OverviewStructure<T, D>;
}
}

interface OverviewStructureDecorator {
name: string;
type: 'undefined' | 'object' | 'boolean' | 'number' | 'bigint' | 'string' | 'symbol' | 'function' | 'array'
source?: OverviewStructureSource,
}
type FastifyOverview = FastifyPluginCallback<fastifyOverview.FastifyOverviewOptions>

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<T = {}> {
id: Number,
name: string,
source?: OverviewStructureSource,
children?: OverviewStructure<T>[],
decorators?: {
decorate: OverviewStructureDecorator[],
decorateRequest: OverviewStructureDecorator[],
decorateReply: OverviewStructureDecorator[]
},
hooks?: OverviewStructureHooks,
routes?: (Omit<RouteItem, keyof T> & 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<RouteOptions>,

/**
* Customise which properties of the route options will be included in the overview
*/
onRouteDefinition?: (routeOptions: RouteOptions & { routePath: string; path: string; prefix: string }) => Record<string, unknown>
}
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<string, unknown>
request?: Record<string, unknown>
reply?: Record<string, unknown>
}

declare module 'fastify' {
export interface FastifyInstance {
overview: <T = {}>(opts?: FastifyOverviewDecoratorOptions) => OverviewStructure<T>;
type ExtractDecoratorType<T extends Record<PropertyKey, unknown>, K extends keyof Decorators> = T extends Decorators ? T[K] : T

export interface OverviewStructure<T = {}, D extends Record<PropertyKey, unknown> = {}> {
id: Number,
name: string,
source?: OverviewStructureSource,
children?: OverviewStructure<T>[],
decorators?: {
decorate: (Omit<OverviewStructureDecorator, keyof ExtractDecoratorType<D, 'instance'>> & ExtractDecoratorType<D, 'instance'>)[],
decorateRequest: (Omit<OverviewStructureDecorator, keyof ExtractDecoratorType<D, 'request'>> & ExtractDecoratorType<D, 'request'>)[],
decorateReply: (Omit<OverviewStructureDecorator, keyof ExtractDecoratorType<D, 'reply'>> & ExtractDecoratorType<D, 'reply'>)[]
},
hooks?: OverviewStructureHooks,
routes?: (Omit<RouteItem, keyof T> & 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<RouteOptions>,

/**
* Customise which properties of the route options will be included in the overview
*/
onRouteDefinition?: (routeOptions: RouteOptions & { routePath: string; path: string; prefix: string }) => Record<string, unknown>

/**
* Customise which information from decorators should be added to the overview
*/
onDecorateDefinition?: (type: 'decorate' | 'decorateRequest' | 'decorateReply', name: string, value: unknown) => Record<string, unknown>
}

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<FastifyOverviewOptions>
export default FastifyOverview
declare function fastifyOverview(...params: Parameters<FastifyOverview>): ReturnType<FastifyOverview>
export = fastifyOverview
Loading