import { isRouter, Router } from "./router"; import { URLPattern } from "./url-pattern"; import { getNavigation } from "../get-navigation"; import {Event} from "../event-target"; import {NavigateEvent} from "../spec/navigation"; import {PatternRouteFn, RouteFn} from "./types"; let router: Router; export function getRouter(): Router { if (isRouter(router)) { return router; } const navigation = getNavigation(); const local = new Router(navigation, "navigate"); router = local; return local; } export function route( pattern: string | URLPattern, fn: PatternRouteFn ): Router; export function route( fn: RouteFn ): Router; export function route( ...args: [string | URLPattern, PatternRouteFn] | [RouteFn] ): Router { let pattern, fn; if (args.length === 1) { [fn] = args; } else if (args.length === 2) { [pattern, fn] = args; } return routes(pattern).route(fn); } export function routes( pattern: string | URLPattern, router: Router ): Router; export function routes( pattern: string | URLPattern ): Router; export function routes( router: Router ): Router; export function routes(): Router; export function routes( ...args: | [string | URLPattern] | [string | URLPattern, Router | undefined] | [Router | undefined] | [] ): Router { let router: Router; if (!args.length) { router = new Router(); getRouter().routes(router); } else if (args.length === 1) { const [arg] = args; if (isRouter(arg)) { router = arg; getRouter().routes(router); } else { const pattern = arg; router = new Router(); getRouter().routes(pattern, router); } } else if (args.length >= 2) { const [pattern, routerArg] = args; router = routerArg ?? new Router(); getRouter().routes(pattern, router); } return router; }