/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectionToken } from "@ogre-tools/injectable"; import type { Route } from "./front-end-route-injection-token"; type InferParametersFrom = TRoute extends Route ? TParameters : never; type RequiredKeys = Exclude< { [K in keyof T]: T extends Record ? K : never; }[keyof T], undefined >; type ObjectContainingNoRequired = T extends void ? never : RequiredKeys extends [] ? any : never; type ObjectContainsNoRequired = T extends ObjectContainingNoRequired ? true : false; // TODO: Missing types for: // - Navigating to route without parameters, with parameters // - Navigating to route with required parameters, without parameters type Parameters = TParameters extends void ? {} : ObjectContainsNoRequired extends true ? { parameters?: TParameters } : { parameters: TParameters }; export type NavigateToRouteOptions = Parameters< InferParametersFrom > & { query?: Record; fragment?: string; withoutAffectingBackButton?: boolean; }; export type NavigateToRoute = >( route: TRoute, options?: NavigateToRouteOptions) => void; export const navigateToRouteInjectionToken = getInjectionToken( { id: "navigate-to-route-injection-token" }, );