import { URLPattern } from "urlpattern-polyfill"; import { Event } from "../event-target"; import { NavigateEvent } from "../spec/navigation"; import { Router } from "./router"; type NonNil = T extends null | undefined ? never : T; export type URLPatternResult = NonNil>; export type RouteFnReturn = Promise | R; export interface Fn { (...args: unknown[]): RouteFnReturn; } export interface RouteFn { (event: E, match?: URLPatternResult): RouteFnReturn; } export interface ErrorFn { (error: unknown, event: E, match?: URLPatternResult): RouteFnReturn; } export interface PatternErrorFn { (error: unknown, event: E, match: URLPatternResult): RouteFnReturn; } export interface ThenFn { (value: R, event: E, match?: URLPatternResult): RouteFnReturn; } export interface PatternThenFn { (value: R, event: E, match: URLPatternResult): RouteFnReturn; } export interface PatternRouteFn { (event: E, match: URLPatternResult): RouteFnReturn; } export interface Route { string?: string; pattern?: URLPattern; fn?: Fn; router?: Router; } export type RouteType = "route" | "reject" | "resolve"; export interface RouteRecord extends Record[]> { router: Route[]; } export interface RouterListeningFn { (event: E): RouteFnReturn; } export interface RouterListenFn { (fn: RouterListeningFn): void; } export interface EventListenerTarget { addEventListener(type: E["type"], handler: RouterListeningFn): void; removeEventListener(type: E["type"], handler: RouterListeningFn): void; } export type RouterListenTarget = RouterListenFn | EventListenerTarget; export {};