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