import { ComponentType } from "preact";import { ConnInfo, rutt, ServeInit } from "./deps.ts";import { InnerRenderFunction, RenderContext } from "./render.ts";
export type StartOptions = ServeInit & FreshOptions & { experimentalDenoServe?: boolean;};
export interface FreshOptions { render?: RenderFunction; plugins?: Plugin[]; staticDir?: string;}
export type RenderFunction = ( ctx: RenderContext, render: InnerRenderFunction,) => void | Promise<void>;
export interface PageProps<T = any> { url: URL;
route: string;
params: Record<string, string>;
data: T;}
export interface RouteConfig { routeOverride?: string;
csp?: boolean;}
export interface HandlerContext<Data = unknown, State = Record<string, unknown>> extends ConnInfo { params: Record<string, string>; render: (data?: Data) => Response | Promise<Response>; renderNotFound: () => Response | Promise<Response>; state: State;}
export type Handler<T = any, State = Record<string, unknown>> = ( req: Request, ctx: HandlerContext<T, State>,) => Response | Promise<Response>;
export type Handlers<T = any, State = Record<string, unknown>> = { [K in typeof rutt.METHODS[number]]?: Handler<T, State>;};
export interface RouteModule { default?: ComponentType<PageProps>; handler?: Handler<any, any> | Handlers<any, any>; config?: RouteConfig;}
export interface Route<Data = any> { pattern: string; url: string; name: string; component?: ComponentType<PageProps<Data>>; handler: Handler<Data> | Handlers<Data>; csp: boolean;}
export interface AppProps { Component: ComponentType<Record<never, never>>;}
export interface AppModule { default: ComponentType<AppProps>;}
export interface UnknownPageProps { url: URL;
route: string;}
export interface UnknownHandlerContext<State = Record<string, unknown>> extends ConnInfo { render: () => Response | Promise<Response>; state: State;}
export type UnknownHandler = ( req: Request, ctx: UnknownHandlerContext,) => Response | Promise<Response>;
export interface UnknownPageModule { default?: ComponentType<UnknownPageProps>; handler?: UnknownHandler; config?: RouteConfig;}
export interface UnknownPage { pattern: string; url: string; name: string; component?: ComponentType<UnknownPageProps>; handler: UnknownHandler; csp: boolean;}
export interface ErrorPageProps { url: URL;
pattern: string;
error: unknown;}
export interface ErrorHandlerContext<State = Record<string, unknown>> extends ConnInfo { error: unknown; render: () => Response | Promise<Response>; state: State;}export type ErrorHandler = ( req: Request, ctx: ErrorHandlerContext,) => Response | Promise<Response>;
export interface ErrorPageModule { default?: ComponentType<ErrorPageProps>; handler?: ErrorHandler; config?: RouteConfig;}
export interface ErrorPage { pattern: string; url: string; name: string; component?: ComponentType<ErrorPageProps>; handler: ErrorHandler; csp: boolean;}
export interface MiddlewareHandlerContext<State = Record<string, unknown>> extends ConnInfo { next: () => Promise<Response>; state: State;}
export interface MiddlewareRoute extends Middleware { pattern: string; compiledPattern: URLPattern;}
export type MiddlewareHandler<State = Record<string, unknown>> = ( req: Request, ctx: MiddlewareHandlerContext<State>,) => Response | Promise<Response>;
export interface MiddlewareModule<State = any> { handler: MiddlewareHandler<State> | MiddlewareHandler<State>[];}
export interface Middleware<State = Record<string, unknown>> { handler: MiddlewareHandler<State> | MiddlewareHandler<State>[];}
export interface IslandModule { default: ComponentType<any>;}
export interface Island { id: string; name: string; url: string; component: ComponentType<unknown>;}
export interface Plugin { name: string;
entrypoints?: Record<string, string>;
render?(ctx: PluginRenderContext): PluginRenderResult;}
export interface PluginRenderContext { render: PluginRenderFunction;}
export interface PluginRenderResult { styles?: PluginRenderStyleTag[]; scripts?: PluginRenderScripts[];}
export interface PluginRenderStyleTag { cssText: string; media?: string; id?: string;}
export interface PluginRenderScripts { entrypoint: string; state: unknown;}
export type PluginRenderFunction = () => PluginRenderFunctionResult;
export interface PluginRenderFunctionResult { htmlText: string; requiresHydration: boolean;}