import { Route } from "../Route.cjs"; import { JitiOptions, JitiResolveOptions } from "jiti"; import { AsyncLocalStorage } from "node:async_hooks"; //#region src/types/basic.d.ts type OwnStatics = Omit; /** * Controller method reference */ type ControllerHandler = T extends (abstract new (...args: any[]) => infer I) ? [T, ({ [K in keyof I]: I[K] extends ((...args: any[]) => any) ? K : never }[keyof I] & string) | ({ [K in keyof OwnStatics]: OwnStatics[K] extends ((...args: any[]) => any) ? K : never }[keyof OwnStatics] & string)] : [any, string]; type MaybePromise = T | Promise; type RouteGroupCallback = () => MaybePromise; type RouteGroupEntry = RouteGroupCallback | string; type RouteGroupSource = RouteGroupEntry | RouteGroupEntry[]; type RouteGroupConditionEntry = S extends string ? string : S; type RouteGroupConditionSource = RouteGroupConditionEntry>; type MiddlewareHandle = (...args: Args) => MaybePromise; type MiddlewareClass = new () => { handle: M; }; type MiddlewareInstance = { handle: M; }; type ClassMiddleware = MiddlewareClass | MiddlewareInstance; /** * HTTP methods supported by the router */ type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'; /** * Common resource action names */ type ResourceAction = 'index' | 'show' | 'create' | 'update' | 'destroy'; /** * Generic Object type for request data */ type RequestData = Record; type ApiResourceMiddleware = M | M[] | { [K in ResourceAction]?: M | M[] }; interface RouterConfig { /** * When enabled, API param name will be infered from the route path. * So instead of getting /api/users/:id, we will now get /api/users/:user */ inferParamName?: boolean; /** * Configuration for method override functionality, allowing clients to use a * specific header or body parameter to override the HTTP method. */ methodOverride?: { /** Whether method override is enabled */enabled?: boolean; /** Keys in the request body to check for method override */ bodyKeys?: string[] | string; /** Keys in the request headers to check for method override */ headerKeys?: string[] | string; }; /** * Optional method binding / container resolution support. Disabled by default. */ container?: { /** Whether decorated handler parameter binding is enabled */enabled?: boolean; /** Whether unknown constructor tokens should be instantiated automatically */ autoDiscover?: boolean; /** * Whether unresolved decorated arguments should throw instead of using * the default handler signature */ strict?: boolean; }; } type ResourceRouteDefinition = { method: HttpMethod; path: string; }; type ResourceRouteRegistrar = (input: { action: ResourceAction; method: HttpMethod; path: string; handler: any; middlewares?: M[]; name: string; }) => Route; type ResourceRouteRemover = (route: Route) => void; type ResourceRoutesOptions = { only?: ResourceAction[]; except?: ResourceAction[]; middlewares?: ApiResourceMiddleware; }; interface RouteGroupContext { prefix: string; groupMiddlewares: any[]; domain?: string; routeCollectors?: Array>>; } interface RouteGroupOptions { prefix: string; source: S; middlewares?: any[]; domain?: string; context: AsyncLocalStorage; defaultPrefix: string; defaultMiddlewares: any[]; normalizePath: (path: string) => string; removeRoute: (route: Route) => void; } type RouteGroupCondition = (source: RouteGroupConditionSource) => MaybePromise; interface FileImporter { (filePath: string): Promise; (filePath: string, userOptions?: JitiOptions | undefined): Promise; (filePath: string, userOptions?: JitiOptions | undefined, resolveOptions?: (JitiResolveOptions & { default?: true; })): Promise; } //#endregion export { ApiResourceMiddleware, ClassMiddleware, ControllerHandler, FileImporter, HttpMethod, MaybePromise, MiddlewareClass, MiddlewareHandle, MiddlewareInstance, RequestData, ResourceAction, ResourceRouteDefinition, ResourceRouteRegistrar, ResourceRouteRemover, ResourceRoutesOptions, RouteGroupCallback, RouteGroupCondition, RouteGroupConditionEntry, RouteGroupConditionSource, RouteGroupContext, RouteGroupEntry, RouteGroupOptions, RouteGroupSource, RouterConfig };