@router-cli/react-router
Version:
File based routing cli for react-router-dom. Types and components. see @router-cli/react-router-dev for the cli and plugins.
55 lines (47 loc) • 2.52 kB
text/typescript
import React from "react";
import { createTypedRouter } from "./createRouter";
import { AllLinkProps, createComponents } from "./public/components";
import { createFunctions } from "./public/functions";
import { createImportHooks, createTypedHooks } from "./public/hooks";
import { AnyRouter, AnyRouteImports, TypedTo, TypedToOrPath, AppRoutes } from "./types";
import { ExtractRouteDataMap } from "./utils/types";
// Types
export interface Register {
}
export type RegisteredRouter = Register extends {
pages: infer TPages extends AnyRouteImports;
layouts: infer TLayouts extends AnyRouteImports;
}
? {
pages: TPages;
layouts: TLayouts;
app: AppRoutes
} : AnyRouter
let ROUTER: RegisteredRouter;
export function register<TRouter extends AnyRouter>(router: TRouter): TRouter{
ROUTER = router;
return router;
}
function getRegisteredRouter(): RegisteredRouter{
if(!ROUTER) throw new Error("router must be registered before it can be used.");
return ROUTER;
}
export type Pages = ExtractRouteDataMap<RegisteredRouter["pages"]>;
export type Routes = keyof Pages;
export type Layouts = ExtractRouteDataMap<RegisteredRouter["layouts"]>;
export type LinkProps<TPath extends Routes = Routes> = AllLinkProps<TPath, Pages>["link"];
export type NavLinkProps<TPath extends Routes = Routes> = AllLinkProps<TPath, Pages>["navLink"];
export type NavigateProps<TPath extends Routes = Routes> = AllLinkProps<TPath, Pages>["navigate"];
export type To<TPath extends Routes = Routes> = TypedTo<TPath, Pages[TPath]>;
export type ToOrPath<TPath extends Routes = Routes> = TypedToOrPath<TPath, Pages[TPath]>;
export type { AllLinkProps, TypedLinkBase } from "./public/components";
// Functions/Components
export const { Link, NavLink, Navigate } = createComponents<Pages>();
export const { matchPath, redirect, makeLinkProps } = createFunctions<Pages>();
export const { useLoaderData, useMatch, useNavigate } = createTypedHooks();
export const createHooks = () => createImportHooks(getRegisteredRouter());
export const createRouter = () => createTypedRouter(getRegisteredRouter()!);
export const RouterOutlet = () => createTypedRouter(getRegisteredRouter()!);
export * from "./utils/errors";
export { createRoute } from "./public/routes";
export { Outlet, useLocation, createBrowserRouter, createMemoryRouter, createHashRouter, RouterProvider, useRouteError, unstable_usePrompt, unstable_useBlocker } from "react-router-dom";