import Koa, { Context, DefaultState, Request as KoaRequest } from 'koa'; import { Container } from './container'; import { AppMiddleware } from './middleware'; export interface AuthUser { username?: string | null; id?: string | number | symbol | null; authenticated: boolean; access_token?: string | null; isAnonymous(): boolean; } export interface AuthenticatedUser extends AuthUser { username: string; id: string | number | symbol; authenticated: true; } export interface Request extends KoaRequest { body?: Body; } export interface AppState extends DefaultState { container: DIC; } export interface AppContext, User extends AuthUser = AuthUser, Body = unknown> extends Context { scope: DIC; state: State; user: User; request: Request; } export interface App, Context extends AppContext> extends Koa { middleware: AppMiddleware[]; }