import * as express from 'express'; import {PathParams, RequestHandlerParams} from 'express-serve-static-core'; declare namespace goa { interface Goa { createApplication( controllerFactory: ( name: TNames, context: ControllerContext, callback: (err: any | null, controller: any) => void ) => void, options: GoaOptions ): GoaApplication; createApplication( controllerFactory: (name: TNames, context: ControllerContext) => Promise, options: GoaOptions ): GoaApplication; parseRequest(req: express.Request, params: ActionParams): any action(content?: string, contentType?: string, options?: ResultOptions | number): ActionResult; empty(contentType?: string): EmptyResult; json(json: any, options?: ResultOptions | number): JsonResult; file(file: string, options?: ResultOptions | number): FileResult; view(viewName: TViews, params?: any | (() => any), options?: ResultOptions | number): ViewResult; error(err?: any, options?: ResultOptions | number): ErrorResult; redirect(url: string, options?: ResultOptions | number): RedirectResult; readonly results: { readonly ActionResult: ActionResult readonly EmptyResult: EmptyResult readonly JsonResult: JsonResult readonly FileResult: FileResult readonly ViewResult: ViewResult readonly ErrorResult: ErrorResult readonly RedirectResult: RedirectResult } } export type GoaRequestHandler = express.RequestHandler | { controller: string, action: string } export type GoaRequestHandlerParams = RequestHandlerParams | { controller: string, action?: string, [key: string]: any } export interface GoaRouterMatcher { (path: PathParams, ...handlers: GoaRequestHandler[]): T; (path: PathParams, ...handlers: GoaRequestHandlerParams[]): T; } export interface GoaApplication extends express.Application { all: GoaRouterMatcher; get: GoaRouterMatcher; post: GoaRouterMatcher; put: GoaRouterMatcher; delete: GoaRouterMatcher; del: GoaRouterMatcher; patch: GoaRouterMatcher; options: GoaRouterMatcher; head: GoaRouterMatcher; checkout: GoaRouterMatcher; connect: GoaRouterMatcher; copy: GoaRouterMatcher; lock: GoaRouterMatcher; merge: GoaRouterMatcher; mkactivity: GoaRouterMatcher; mkcol: GoaRouterMatcher; move: GoaRouterMatcher; "m-search": GoaRouterMatcher; notify: GoaRouterMatcher; propfind: GoaRouterMatcher; proppatch: GoaRouterMatcher; purge: GoaRouterMatcher; report: GoaRouterMatcher; search: GoaRouterMatcher; subscribe: GoaRouterMatcher; trace: GoaRouterMatcher; unlock: GoaRouterMatcher; unsubscribe: GoaRouterMatcher; } export interface ResultOptions { status?: number contentType?: string } export interface ControllerContext { req: express.Request; res: express.Response; next: express.NextFunction; } export interface GoaOptions { express: () => express.Application; defaultAction?: string } export type ResultExecuteNextFunction = (err?: any, str?: string) => void; export interface Result { execute(res: express.Response, next?: ResultExecuteNextFunction): void; } export interface ActionResult extends Result { new(content?: string, contentType?: string, options?: ResultOptions | number): this; } export interface EmptyResult extends ActionResult { new(contentType?: string): this; } export interface ErrorResult extends Result { (err?: any, options?: ResultOptions | number): this; } export interface JsonResult extends ActionResult { new(json: any, options?: ResultOptions | number): this; } export interface RedirectResult extends Result { new(url: string, options?: ResultOptions | number): this; } export interface ViewResult extends Result { new(viewName: string, params?: () => any | any, options?: ResultOptions | number): this; } export interface FileResult extends Result { new(file: string, options?: ResultOptions | number): this; } interface ActionParamsStatic { readonly controller: string; readonly action: string; } export type ActionParams = ActionParamsStatic & { [P in keyof TParams]: TParams[P]; }; export type Send = (result: Result, onComplete?: () => (void | Promise)) => void; } declare const goa: goa.Goa; export = goa;