import { Route, RouteProvider, RouteController } from '@anansi/router'; import { createBrowserHistory } from 'history'; import type { Update } from 'history'; import React from 'react'; import type { CreateRouter, ClientSpout } from './types.js'; export default function routerSpout(options: { resolveWith?: any; useResolveWith: () => ResolveWith; createRouter: CreateRouter; onChange?: (update: Update, callback: () => void | undefined) => void; }): ClientSpout< Record, { matchedRoutes: Route[]; } & { router: RouteController>; } > { const createRouteComponent = ( router: RouteController>, ) => function Router({ children }: { children: React.ReactNode }) { const resolveWith = options.useResolveWith(); return ( {children} ); }; return next => async props => { const history = createBrowserHistory(); const router = options.createRouter(history); const matchedRoutes = router.getMatchedRoutes(history.location.pathname); const nextProps = await next({ ...props, matchedRoutes, router }); const Router = createRouteComponent(router); return { ...nextProps, matchedRoutes, router, app: {nextProps.app}, }; }; }