import { Method } from "../types/global";
import ValueCollection from "./ValueCollection";
import { EndFn, RateLimitConfig, RealAny } from "../types/internal";
import { UsableValidator } from "./Validator";
import { PathItemObject } from "openapi3-ts/oas31";
import HttpRequestContext from "./request/HttpRequestContext";
import WsOpenContext from "./request/WsOpenContext";
import WsMessageContext from "./request/WsMessageContext";
import WsCloseContext from "./request/WsCloseContext";
type Segment = {
    raw: string;
    paramsRegExp: RegExp;
    params: string[];
};
type URLData = {
    type: 'regexp';
    value: RegExp;
    prefix: string;
    segments: Segment[];
} | {
    type: 'normal';
    value: string;
    segments: Segment[];
};
type RequestType = 'http' | 'static' | 'ws';
type Data<Type extends RequestType> = Type extends 'http' ? {
    onRawBody?(ctr: HttpRequestContext, end: EndFn, chunk: ArrayBuffer, isLast: boolean): RealAny;
    onRequest?(ctr: HttpRequestContext): RealAny;
} : Type extends 'static' ? {
    folder: string;
    stripHtmlEnding: boolean;
} : {
    onUpgrade?(ctr: HttpRequestContext, end: EndFn): RealAny;
    onOpen?(ctr: WsOpenContext): RealAny;
    onMessage?(ctr: WsMessageContext): RealAny;
    onClose?(ctr: WsCloseContext): RealAny;
};
export default class Route<Type extends RequestType> {
    type: Type;
    private urlMethod;
    urlData: URLData;
    /**
     * Create a new Route
     * @since 9.0.0
    */ constructor(type: Type, urlMethod: Method, path: string | RegExp, data: Data<Type>);
    /**
     * The Data of this Route
     * @since 9.0.0
    */ data: Data<Type>;
    /**
     * The Validators of this Route
     * @since 9.0.0
    */ validators: UsableValidator[];
    /**
     * The Ratelimit of this Route
     * @since 9.0.0
    */ ratelimit: Type extends 'static' ? null : RateLimitConfig | null;
    /**
     * The OpenAPI Schema of this Route
     * @since 9.0.0
    */ openApi: PathItemObject;
    /**
     * Test the Path against the Request Path
     * @warn NOT FOR STATIC ROUTES
     * @since 9.0.0
    */ matches(method: Method, collection: ValueCollection<string, string>, requestPath: string, requestPathSplit: string[]): boolean;
}
export {};
