import type { Permission, PermissionContext } from "../../auth/authorize/Permission";
import type { Context, Hono } from "hono";
import type { RouterRoute } from "hono/types";
import type { ServerEnv } from "../../modules/Controller";
import type { MaybePromise } from "../../core/types";
declare const permissionSymbol: unique symbol;
type PermissionMiddlewareOptions<P extends Permission<any, any, any, any>> = {
    onGranted?: (c: Context<ServerEnv>) => MaybePromise<Response | void | undefined>;
    onDenied?: (c: Context<ServerEnv>) => MaybePromise<Response | void | undefined>;
} & (P extends Permission<any, any, infer PC, any> ? PC extends undefined ? {
    context?: never;
} : {
    context: (c: Context<ServerEnv>) => MaybePromise<PermissionContext<P>>;
} : {
    context?: never;
});
export declare function permission<P extends Permission<any, any, any, any>>(permission: P, options: PermissionMiddlewareOptions<P>): import("hono").MiddlewareHandler<ServerEnv, string, {}, Response> & {
    [permissionSymbol]: {
        permission: P;
        options: PermissionMiddlewareOptions<P>;
    };
};
export declare function getPermissionRoutes(hono: Hono<any>): {
    route: RouterRoute;
    permission: Permission;
    options: PermissionMiddlewareOptions<Permission>;
}[];
export {};
