import { ClassType } from '@deepkit/core'; import { ClassDecoratorResult, DecoratorAndFetchSignature, DualDecorator, ExtractApiDataType, ExtractClass, PropertyDecoratorFn, ReceiveType, SerializationOptions, Serializer, Type, UnionToIntersection } from '@deepkit/type'; import { RouteParameterResolver } from './router.js'; import { HttpMiddleware, HttpMiddlewareConfig, HttpMiddlewareFn } from './middleware.js'; type HttpActionMiddleware = (() => HttpMiddlewareConfig) | ClassType | HttpMiddlewareFn; export declare class HttpController { baseUrl: string; actions: Set; groups: string[]; middlewares: (() => HttpMiddlewareConfig)[]; resolverForToken: Map; resolverForParameterName: Map; private actionsProcessed; getUrl(action: HttpAction): string; addAction(action: HttpAction): void; getActions(): Set; removeAction(methodName: string): void; getAction(methodName: string): HttpAction; } export declare class HttpActionParameter { name: string; type?: 'body' | 'query' | 'queries'; /** * undefined = propertyName, '' === root, else given path */ typePath?: string; optional: boolean; } export declare class HttpAction { name: string; description: string; category: string; path: string; httpMethods: string[]; methodName: string; groups: string[]; serializer?: Serializer; middlewares: (() => HttpMiddlewareConfig)[]; serializationOptions?: SerializationOptions; resolverForToken: Map; resolverForParameterName: Map; /** * An arbitrary data container the user can use to store app specific settings/values. */ data: Map; responses: { statusCode: number; description: string; type?: Type; }[]; } export declare class HttpControllerDecorator { t: HttpController; controller(baseUrl?: string): void; group(...group: string[]): void; middleware(...middlewares: HttpActionMiddleware[]): void; /** * Adds a parameter resolver for parameters based on the class type. Use .resolveParameterByName() for name-based resolving. * * ```typescript * * class UserResolver { * resolve(context: RouteParameterResolverContext): any | Promise { * return new User(); * } * } * * @http.resolveParameter(User, UserResolver) * class MyController { * * @http.GET() * myAction(user: User) { * } * } * * new App({providers: [UserResolver]}).run(); * ``` */ resolveParameter(classType: ClassType | string | any, resolver: ClassType): void; /** * Adds a parameter resolver for parameters based on its name. Use .resolveParameter() for class-based resolving. * * ```typescript * * class UserResolver { * resolve(context: RouteParameterResolverContext): any | Promise { * return new User(); * } * } * * @http.resolveParameterByName('user', UserResolver) * class MyController { * * @http.GET() * myAction(user: User) { * } * } * * new App({providers: [UserResolver]}).run(); * ``` */ resolveParameterByName(name: string, resolver: ClassType): void; setAction(action: HttpAction): void; } export declare const httpClass: ClassDecoratorResult; export declare function getActions(target: ClassType): HttpAction[]; export declare class HttpActionDecorator { t: HttpAction; onDecorator(target: ClassType, property: string | undefined, parameterIndexOrDescriptor?: any): void; name(name: string): void; description(description: string): void; serialization(options: SerializationOptions): void; serializer(serializer: Serializer): void; middleware(...middlewares: HttpActionMiddleware[]): void; /** * Allows to change the HttpAction object and composite multiple properties into one function. * * @example * ```typescript * const authGroup = Symbol('authGroup'); * * function authGroup(group: 'admin' | 'user') { * return (action: HttpAction) => { * action.data.set(authGroup, group); * }; * } * * class My Controller { * @http.GET('/assets').use(authGroup('admin')) * assets() {} * } * ``` */ use(use: (action: HttpAction) => void): void; /** * Arbitrary value container that can be read in RouterParameterResolver and all * HTTP workflow events (like authentication). * * @example * ```typescript * class My Controller { * @http.GET('/assets').data('authGroup', 'admin') * assets() {} * } * ``` */ data(name: string, value: any): void; category(category: string): void; group(...group: string[]): void; GET(path?: string): void; HEAD(path?: string): void; POST(path?: string): void; PUT(path?: string): void; DELETE(path?: string): void; OPTIONS(path?: string): void; TRACE(path?: string): void; PATCH(path?: string): void; ANY(path?: string): void; /** * Adds additional information about what HTTP status codes are available in this route. * You can add additionally a description and a response body type. * * The type is used for serialization for responses with the given statusCode. * * This information is available in Deepkit API console. * * ```typescript * * http.GET().response(200, 'All ok') * * interface User { * username: string; * } * http.GET().response(200, 'User object') * * interface HttpErrorMessage { * error: string; * } * http.GET().response(500, 'Error') * ``` */ response(statusCode: number, description?: string, type?: ReceiveType): void; /** * Adds a parameter resolver for parameters based on the class type. Use .resolveParameterByName() for name-based resolving. * * ```typescript * * class UserResolver { * resolve(context: RouteParameterResolverContext): any | Promise { * return new User(); * } * } * * class MyController { * @http.GET() * @http.resolveParameter(User, UserResolver) * myAction(user: User) { * } * } * * new App({providers: [UserResolver]}).run(); * ``` */ resolveParameter(classType: ClassType | string | any, resolver: ClassType): void; /** * Adds a parameter resolver for parameters based on its name. Use .resolveParameter() for class-based resolving. * * ```typescript * * class UserResolver { * resolve(context: RouteParameterResolverContext): any | Promise { * return new User(); * } * } * * class MyController { * @http.GET() * @http.resolveParameterByName('user', UserResolver) * myAction(user: User) { * } * } * * new App({providers: [UserResolver]}).run(); * ``` */ resolveParameterByName(name: string, resolver: ClassType): void; } type HttpActionFluidDecorator = { [name in keyof T]: name extends 'response' ? (statusCode: number, description?: string, type?: ReceiveType) => D & HttpActionFluidDecorator : T[name] extends (...args: infer K) => any ? (...args: K) => D & HttpActionFluidDecorator : D & HttpActionFluidDecorator & { _data: ExtractApiDataType; }; }; type HttpActionPropertyDecoratorResult = HttpActionFluidDecorator, PropertyDecoratorFn> & DecoratorAndFetchSignature; export declare const httpAction: HttpActionPropertyDecoratorResult; type HttpMerge = { [K in keyof U]: K extends 'response' ? (statusCode: number, description?: string, type?: ReceiveType) => PropertyDecoratorFn & U : U[K] extends ((...a: infer A) => infer R) ? R extends DualDecorator ? (...a: A) => PropertyDecoratorFn & R & U : (...a: A) => R : never; }; type MergedHttp = HttpMerge, '_fetch' | 't'>>; export type HttpDecorator = PropertyDecoratorFn & HttpActionFluidDecorator; export declare const http: MergedHttp<[typeof httpClass, typeof httpAction]>; export {}; export declare type __ΩHttpDecorator = any[];