import * as ziggy_js from 'ziggy-js';
import { RouteParamsWithQueryOverload, RouteParam, Config } from 'ziggy-js';
import { Plugin, DefineComponent } from 'vue';

type Route = keyof ZiggyLaravelRoutes;
type RequestPayload = Record<string, any>;
interface IInertiaTyped {
    options: InertiaTypedOptions;
    route: (name: Route, params?: RouteParamsWithQueryOverload | RouteParam, absolute?: boolean, customZiggy?: Config) => string;
    isRoute: (name: Route, params?: RouteParamsWithQueryOverload) => boolean;
    currentRoute: () => string;
}
interface InertiaTypedOptions {
    inject: boolean;
    router: any;
}

declare const InertiaTyped: Plugin;

type Page = Promise<DefineComponent>;
/**
 * Resolve `createInertiaApp`.
 *
 * @example
 * createInertiaApp({
 *   resolve: name => appResolve(name, import.meta.globEager('./Pages/*.vue'))
 * })
 */
declare const appResolve: (name: string, glob: Record<string, unknown>) => Page;
/**
 * Title for `createInertiaApp`.
 *
 * @example
 * createInertiaApp({
 *   title: (title) => appTitle(title, 'Override Title')
 * })
 */
declare const appTitle: (title: string, overrideTitle?: string) => string;

declare const useInertia: () => {
    router: {
        get: (url: Route, data?: RequestPayload) => any;
        post: (url: Route, data?: RequestPayload) => any;
        patch: (url: Route, data?: RequestPayload) => any;
        put: (url: Route, data?: RequestPayload) => any;
        delete: (url: Route) => any;
    };
    route: (name: keyof ZiggyLaravelRoutes, params?: ziggy_js.RouteParamsWithQueryOverload | ziggy_js.RouteParam | undefined, absolute?: boolean | undefined, customZiggy?: ziggy_js.Config | undefined) => string;
    isRoute: (name: keyof ZiggyLaravelRoutes, params?: ziggy_js.RouteParamsWithQueryOverload | undefined) => boolean;
    currentRoute: () => string;
};

export { IInertiaTyped, InertiaTyped, InertiaTypedOptions, appResolve, appTitle, useInertia };
