UNPKG

@tanstack/vue-router

Version:

Modern and scalable routing for Vue applications

60 lines (59 loc) 5.38 kB
import * as Vue from 'vue'; import type { AnyRouter, Constrain, LinkOptions, RegisteredRouter, RoutePaths } from '@tanstack/router-core'; import type { AnchorHTMLAttributes, ReservedProps } from '@vue/runtime-dom'; import type { ValidateLinkOptions, ValidateLinkOptionsArray } from './typePrimitives'; type EventHandler<TEvent = Event> = (e: TEvent) => void; type DataAttributes = { [K in `data-${string}`]?: unknown; }; type LinkHTMLAttributes = AnchorHTMLAttributes & ReservedProps & DataAttributes & { onMouseEnter?: EventHandler<MouseEvent>; onMouseLeave?: EventHandler<MouseEvent>; onMouseOver?: EventHandler<MouseEvent>; onMouseOut?: EventHandler<MouseEvent>; onTouchStart?: EventHandler<TouchEvent>; disabled?: boolean; }; type PropsOfComponent<TComp> = TComp extends (props: infer P, ...args: Array<unknown>) => any ? P : TComp extends Vue.Component<infer P> ? P : Record<string, unknown>; export declare function useLinkProps<TRouter extends AnyRouter = RegisteredRouter, TFrom extends RoutePaths<TRouter['routeTree']> | string = string, TTo extends string = '', TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom, TMaskTo extends string = ''>(options: UseLinkPropsOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo>): LinkHTMLAttributes; export type UseLinkPropsOptions<TRouter extends AnyRouter = RegisteredRouter, TFrom extends RoutePaths<TRouter['routeTree']> | string = string, TTo extends string | undefined = '.', TMaskFrom extends RoutePaths<TRouter['routeTree']> | string = TFrom, TMaskTo extends string = '.'> = ActiveLinkOptions<'a', TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & LinkHTMLAttributes; export type ActiveLinkOptions<TComp = 'a', TRouter extends AnyRouter = RegisteredRouter, TFrom extends string = string, TTo extends string | undefined = '.', TMaskFrom extends string = TFrom, TMaskTo extends string = '.'> = LinkOptions<TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & ActiveLinkOptionProps<TComp>; type ActiveLinkProps<TComp> = Partial<(TComp extends keyof HTMLElementTagNameMap ? LinkHTMLAttributes : PropsOfComponent<TComp>) & { [key: `data-${string}`]: unknown; }>; export interface ActiveLinkOptionProps<TComp = 'a'> { /** * A function that returns additional props for the `active` state of this link. * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated) */ activeProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>); /** * A function that returns additional props for the `inactive` state of this link. * These props override other props passed to the link (`style`'s are merged, `class`'s are concatenated) */ inactiveProps?: ActiveLinkProps<TComp> | (() => ActiveLinkProps<TComp>); } export type LinkProps<TComp = 'a', TRouter extends AnyRouter = RegisteredRouter, TFrom extends string = string, TTo extends string | undefined = '.', TMaskFrom extends string = TFrom, TMaskTo extends string = '.'> = ActiveLinkOptions<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo> & LinkPropsChildren; export interface LinkPropsChildren { children?: Vue.VNodeChild | ((state: { isActive: boolean; isTransitioning: boolean; }) => Vue.VNodeChild); } type LinkComponentVueProps<TComp> = TComp extends keyof HTMLElementTagNameMap ? Omit<LinkHTMLAttributes, keyof CreateLinkProps> : Omit<PropsOfComponent<TComp>, keyof CreateLinkProps>; export type LinkComponentProps<TComp = 'a', TRouter extends AnyRouter = RegisteredRouter, TFrom extends string = string, TTo extends string | undefined = '.', TMaskFrom extends string = TFrom, TMaskTo extends string = '.'> = LinkComponentVueProps<TComp> & LinkProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>; export type CreateLinkProps = LinkProps<any, any, string, string, string, string>; export type LinkComponent<in out TComp, in out TDefaultFrom extends string = string> = <TRouter extends AnyRouter = RegisteredRouter, const TFrom extends string = TDefaultFrom, const TTo extends string | undefined = undefined, const TMaskFrom extends string = TFrom, const TMaskTo extends string = ''>(props: LinkComponentProps<TComp, TRouter, TFrom, TTo, TMaskFrom, TMaskTo>) => Vue.VNode; export interface LinkComponentRoute<in out TDefaultFrom extends string = string> { defaultFrom: TDefaultFrom; <TRouter extends AnyRouter = RegisteredRouter, const TTo extends string | undefined = undefined, const TMaskTo extends string = ''>(props: LinkComponentProps<'a', TRouter, this['defaultFrom'], TTo, this['defaultFrom'], TMaskTo>): Vue.VNode; } export declare function createLink<const TComp>(Comp: Constrain<TComp, any, (props: CreateLinkProps) => Vue.VNode>): LinkComponent<TComp>; /** * Link component with proper TypeScript generics support */ export declare const Link: Vue.Component<unknown> & Vue.Component<CreateLinkProps> & LinkComponent<"a">; export type LinkOptionsFnOptions<TOptions, TComp, TRouter extends AnyRouter = RegisteredRouter> = TOptions extends ReadonlyArray<any> ? ValidateLinkOptionsArray<TRouter, TOptions, string, TComp> : ValidateLinkOptions<TRouter, TOptions, string, TComp>; export type LinkOptionsFn<TComp> = <const TOptions, TRouter extends AnyRouter = RegisteredRouter>(options: LinkOptionsFnOptions<TOptions, TComp, TRouter>) => TOptions; export declare const linkOptions: LinkOptionsFn<'a'>; export {};