@jayalfredprufrock/mobx-toolbox 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/router.d.mts +13 -17
- package/dist/router.d.mts.map +1 -1
- package/dist/router.mjs +1 -1
- package/dist/router.mjs.map +1 -1
- package/package.json +1 -1
package/dist/router.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _$react from "react";
|
|
2
|
-
import React$1
|
|
2
|
+
import React$1 from "react";
|
|
3
3
|
import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
4
|
import { History, Location } from "history";
|
|
5
5
|
|
|
@@ -114,28 +114,24 @@ type ExtractParams<P> = P extends `${infer S1}/${infer Rest}` ? ExtractParam<S1,
|
|
|
114
114
|
type ExtractPaths<R> = { [S in keyof R]: S extends string ? S extends "index" ? "/" : R[S] extends Leaf ? `/${S}` : JoinSegments<S, ExtractPaths<R[S]>> : never }[keyof R];
|
|
115
115
|
//#endregion
|
|
116
116
|
//#region src/router/components/link.d.ts
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
type LinkComponentProps<C extends React$1.ElementType> = Omit<React$1.ComponentProps<C>, " ref" | "exact" | "to" | "params" | "onClick">;
|
|
118
|
+
type LinkPropsBase<C extends React$1.ElementType, I extends React$1.ElementType = C> = LinkComponentProps<C> & {
|
|
119
|
+
exact?: boolean;
|
|
120
|
+
ref?: React$1.Ref<React$1.ComponentRef<I>>;
|
|
121
|
+
};
|
|
122
|
+
interface LinkComponent<C extends React$1.ElementType, I extends React$1.ElementType = C> {
|
|
123
|
+
<P extends StaticRoutePath>(props: LinkPropsBase<C, I> & {
|
|
119
124
|
to: P;
|
|
120
125
|
params?: undefined;
|
|
121
126
|
}): React$1.ReactNode;
|
|
122
|
-
<P extends DynamicRoutePath>(props:
|
|
127
|
+
<P extends DynamicRoutePath>(props: LinkPropsBase<C, I> & {
|
|
123
128
|
to: P;
|
|
124
129
|
params: ExtractParams<P>;
|
|
125
130
|
}): React$1.ReactNode;
|
|
126
131
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
type Link = LinkComponent<LinkPropsBase>;
|
|
132
|
-
type LinkProps = React$1.ComponentProps<Link>;
|
|
133
|
-
declare const Link: Link & {
|
|
134
|
-
displayName: string;
|
|
135
|
-
};
|
|
136
|
-
declare const makeLinkComponent: <C extends React$1.JSXElementConstructor<{
|
|
137
|
-
children?: React$1.ReactNode;
|
|
138
|
-
}>>(C: C) => LinkComponent<React$1.ComponentProps<C>>;
|
|
132
|
+
declare const makeLinkComponent: <C extends React$1.ElementType, I extends React$1.ElementType = C>(C: C, baseProps?: Partial<LinkComponentProps<C>> & {
|
|
133
|
+
as?: I;
|
|
134
|
+
}) => LinkComponent<C, I>;
|
|
139
135
|
//#endregion
|
|
140
136
|
//#region src/router/components/navigate.d.ts
|
|
141
137
|
declare const Navigate: <P extends RoutePath>(props: NavigateOptions<P>) => null;
|
|
@@ -210,5 +206,5 @@ declare const isRedirect: (data: any) => data is Redirector;
|
|
|
210
206
|
declare const isLeaf: (data: any) => data is Leaf;
|
|
211
207
|
declare const isLazyComponent: (data: any) => data is LazyComponent;
|
|
212
208
|
//#endregion
|
|
213
|
-
export { CONTEXT, Component, DynamicRoutePath, ExtractParam, ExtractParams, ExtractPaths, GUARD, Guard, HasParam, JoinSegments, LAYOUT, LOAD, LazyComponent, Leaf,
|
|
209
|
+
export { CONTEXT, Component, DynamicRoutePath, ExtractParam, ExtractParams, ExtractPaths, GUARD, Guard, HasParam, JoinSegments, LAYOUT, LOAD, LazyComponent, Leaf, LinkComponent, LinkPropsBase, Loader, MatchState, MobxRenderSegment, MobxRouter, MobxRouterConfig, MobxRouterRoutes, Navigate, NavigateOptions, Obj, PAGE, Page, PassThrough, REDIRECT, Redirect, Redirector, RouteConfig, RoutePath, Router, RouterOutlet, RouterProps, RouterStore, Routes, StaticRoutePath, WRAPPER, WithToAndParams, isComponent, isLazyComponent, isLeaf, isPage, isRedirect, makeLinkComponent, makeRoute, makeRoutes, matchRoute, redirect, resolvePath, routerContext, useRouter };
|
|
214
210
|
//# sourceMappingURL=router.d.mts.map
|
package/dist/router.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.mts","names":[],"sources":["../src/router/outlet.tsx","../src/router/route.tsx","../src/router/symbols.ts","../src/router/types.ts","../src/router/components/link.tsx","../src/router/components/navigate.tsx","../src/router/router.store.ts","../src/router/components/router.tsx","../src/router/make-routes.tsx","../src/router/redirect.ts","../src/router/util.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"router.d.mts","names":[],"sources":["../src/router/outlet.tsx","../src/router/route.tsx","../src/router/symbols.ts","../src/router/types.ts","../src/router/components/link.tsx","../src/router/components/navigate.tsx","../src/router/router.store.ts","../src/router/components/router.tsx","../src/router/make-routes.tsx","../src/router/redirect.ts","../src/router/util.ts"],"mappings":"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"}
|
package/dist/router.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{observer as e}from"mobx-react-lite";import{createContext as
|
|
1
|
+
import{observer as e}from"mobx-react-lite";import t,{createContext as n,useCallback as r,useContext as i,useLayoutEffect as a}from"react";import{action as o,computed as s,makeAutoObservable as c,observable as l}from"mobx";import{jsx as u}from"react/jsx-runtime";import{createBrowserHistory as d}from"history";const f=Symbol.for(`MOBX_ROUTER_CONTEXT`),p=Symbol.for(`MOBX_ROUTER_LAYOUT`),m=Symbol.for(`MOBX_ROUTER_WRAPPER`),h=Symbol.for(`MOBX_ROUTER_LOAD`),g=Symbol.for(`MOBX_ROUTER_GUARD`),_=Symbol.for(`MOBX_ROUTER_PAGE`),v=Symbol.for(`MOBX_ROUTER_REDIRECT`),y=(e,t)=>e.replaceAll(/:[^/]*/g,n=>{let r=t?.[n.slice(0)];if(!r)throw Error(`Unable to resolve route '${e}. Paramater '${n}' not specified.`);return r}),b=e=>e?typeof e==`function`||typeof e==`object`&&e.$$typeof===Symbol.for(`react.memo`):!1,x=e=>typeof e==`object`?Object.getOwnPropertySymbols(e).includes(_):!1,S=e=>typeof e==`object`?Object.getOwnPropertySymbols(e).includes(v):!1,C=e=>b(e)||x(e)||S(e),w=e=>typeof e==`function`&&e.toString().startsWith(`() => import(`),T=({children:e})=>e,E=e(({route:e,outlets:t})=>{let[n,...r]=t;if(!n)return null;let i=n.Component;return i?u(i,{route:e,children:r.length>0&&u(E,{route:e,outlets:r})}):null}),D=n(null),O=()=>i(D),k=e(({store:e})=>e.activeRoute?u(D.Provider,{value:e,children:u(E,{route:e.activeRoute,outlets:e.activeRoute.outlets})}):null),A=(n,i)=>e(({to:e,params:a,exact:o,children:s,...c})=>{let l=O(),u={...i,...c};return c.role!==`link`&&(u.href=y(e,a)),l.doesPathMatch(e,o)&&(u[`aria-current`]=`page`),u.onClick=r(t=>{t.preventDefault(),!c.disabled&&l.navigate({to:e,...a})},[l,a,e,c.disabled]),t.createElement(n,u,s)}),j=e=>{let t=O();return a(()=>{t.navigate(e)},[t,e]),null},M=({children:e})=>e;var N=class{@l accessor state=`preloading`;@l.ref accessor promise;@l.ref accessor data;@l.ref accessor component;@s get Component(){switch(this.state){case`loading`:return function(){return u(`p`,{children:`Loading...`})};case`ready`:return this.component??M;default:return}}constructor(e){this.config=e}@o async load(e){let t=[];if(w(this.config.component)?t.push(this.loadComponent()):this.component=this.config.component,this.config.loader&&t.push(this.loadData(e)),!t.length){this.setState(`ready`);return}let n=setTimeout(()=>{this.state===`preloading`&&this.setState(`loading`)},300);this.promise=Promise.all(t).then(()=>{clearTimeout(n),this.state===`loading`?setTimeout(()=>{this.setState(`ready`)},300):this.setState(`ready`)}).catch(()=>{clearTimeout(n),this.setState(`error`)}),await this.promise}@o setData(e){this.data=e}@o setState(e){this.state=e}async loadData(e){await this.config.loader?.(e).then(e=>this.setData(e))}async loadComponent(){if(!(this.component||!this.config.component))if(w(this.config.component)){let e=await this.config.component();for(let t in e)(t===`default`||t.endsWith(`Page`))&&(this.component=e[t])}else this.component=this.config.component}},P=class{constructor(e){this.options=e}};const F=e=>new P(e);var I=class{path;outlets;guards;context;params;@s get data(){return Object.assign({},...this.outlets.map(e=>e.data))}constructor(e){this.path=e.path,this.guards=e.guards,this.context=e.context??{},this.outlets=e.outlets,this.params=e.params}async guard(){for(let e of this.guards)await e(this)}async load(){await Promise.all(this.outlets.map(e=>e.load(this)))}};const L=e=>e.replace(/^\/+|\/+$/g,``).split(`/`),R=e=>{let t=e.outlets.filter(e=>e!==void 0),n=e.guards.filter(e=>e!==void 0);return e.layout&&t.unshift(new N({component:e.layout})),new I({...e,outlets:t,guards:n,path:e.segments.join(`/`)})},z=(e,t,n)=>{let r={segments:[],params:{},...n,layout:t[p]??n?.layout,context:{...n?.context,...t[f]},guards:[...n?.guards??[],t[g]],outlets:[...n?.outlets??[],t[m]?new N({component:t[m]}):void 0,t[h]?new N({loader:t[h]}):void 0]},[i,...a]=L(e),o=a.join(`/`),s=t[i||`index`];if(!s){let e=Object.keys(t).find(e=>e.startsWith(`$`));e&&(s=t[e],r.params[e.slice(1)]=i)}if(!s)throw Error(`Not Found.`);if(r.segments.push(i??`index`),C(s)){if(o)throw Error(`Not Found.`);if(S(s))throw new P(typeof s[v]==`string`?{to:s[v]}:s[v]);if(b(s)||w(s))return r.outlets.push(new N({component:s})),R(r)}return x(s)?(r.layout=s[p]??r.layout,Object.assign(r.context,s[f]),r.guards.push(s[g]),r.outlets.push(new N({component:s[_],loader:s[h]})),R(r)):z(o,s,r)},B=()=>e=>e;var V=class{history;routesDef;location;activeRoute;get search(){return new URLSearchParams(this.location?.search)}get query(){return Object.fromEntries(this.search)}get pathParams(){let e={},t=this.activeSegments.filter(e=>e.startsWith(`$`)),n=this.location.pathname.split(`/`).slice(1);return t.forEach((t,r)=>{let i=n[r+1];i&&(e[t]=i)}),e}get activeSegments(){return this.activeRoute?.path.split(`/`)??[]}constructor(e){c({history:!1,routesDef:!1}),this.history=e?.history??d()}initialize(e){this.routesDef=e,this.history.listen(e=>{this.setLocation(e.location)}),this.setLocation(this.history.location)}doesPathMatch(e,t){let n=e.slice(1).split(`/`);return n.every((e,t)=>e===this.activeSegments[t]||e.startsWith(`$`))&&this.activeSegments.length>=n.length&&(!t||n.length===this.activeSegments.length)}navigate(e){document.startViewTransition?document.startViewTransition(()=>this._navigate(e)).ready.catch(e=>console.log(e,typeof e)):this._navigate(e)}_navigate(e){let{to:t,replace:n,state:r,search:i={},preserveSearch:a,params:o}=e,s=i instanceof URLSearchParams?i:new URLSearchParams(i);if(a)for(let[e,t]of this.search)s.has(e)||s.set(e,t);let c={pathname:y(t,o),search:s.size?`?${s.toString()}`:void 0};n?this.history.replace(c,r):this.history.push(c,r)}setQueryParam(e,t){this.search.set(e,t),this.history.replace({search:this.search.toString()})}removeQueryParam(e){let t=new URLSearchParams(this.location.search),n=t.get(e)??void 0;return n!==void 0&&(t.delete(e),this.history.replace({search:t.toString()})),n}async setLocation(e){if(this.routesDef){if(e.pathname!==`/`&&e.pathname.endsWith(`/`)){this.history.replace({...e,pathname:e.pathname.slice(0,-1)});return}this.location=e;try{let t=z(e.pathname,this.routesDef);if(await t.guard(),this.location!==e)return;this.activeRoute=t,await this.activeRoute?.load()}catch(e){if(e instanceof P){this.navigate(e.options);return}throw e}}}};export{f as CONTEXT,g as GUARD,p as LAYOUT,h as LOAD,j as Navigate,_ as PAGE,T as PassThrough,v as REDIRECT,P as Redirect,k as Router,E as RouterOutlet,V as RouterStore,m as WRAPPER,b as isComponent,w as isLazyComponent,C as isLeaf,x as isPage,S as isRedirect,A as makeLinkComponent,R as makeRoute,B as makeRoutes,z as matchRoute,F as redirect,y as resolvePath,D as routerContext,O as useRouter};
|
|
2
2
|
//# sourceMappingURL=router.mjs.map
|
package/dist/router.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.mjs","names":[],"sources":["../src/router/symbols.ts","../src/router/util.ts","../src/router/components/router.tsx","../src/router/components/link.tsx","../src/router/components/navigate.tsx","../src/router/outlet.tsx","../src/router/redirect.ts","../src/router/route.tsx","../src/router/make-routes.tsx","../src/router/router.store.ts"],"sourcesContent":["export const CONTEXT: unique symbol = Symbol.for(\"MOBX_ROUTER_CONTEXT\");\nexport const LAYOUT: unique symbol = Symbol.for(\"MOBX_ROUTER_LAYOUT\");\nexport const WRAPPER: unique symbol = Symbol.for(\"MOBX_ROUTER_WRAPPER\");\nexport const LOAD: unique symbol = Symbol.for(\"MOBX_ROUTER_LOAD\");\nexport const GUARD: unique symbol = Symbol.for(\"MOBX_ROUTER_GUARD\");\nexport const PAGE: unique symbol = Symbol.for(\"MOBX_ROUTER_PAGE\");\nexport const REDIRECT: unique symbol = Symbol.for(\"MOBX_ROUTER_REDIRECT\");\n","import { PAGE, REDIRECT } from \"./symbols\";\nimport type { Component, LazyComponent, Leaf, Obj, Page, Redirector } from \"./types\";\n\nexport const resolvePath = (to: string, params?: Obj): string => {\n return to.replaceAll(/:[^/]*/g, (segment) => {\n const value = params?.[segment.slice(0)];\n if (!value)\n throw new Error(`Unable to resolve route '${to}. Paramater '${segment}' not specified.`);\n return value;\n });\n};\n\nexport const isComponent = (data: any): data is Component => {\n if (!data) return false;\n return (\n typeof data === \"function\" ||\n (typeof data === \"object\" && data[\"$$typeof\"] === Symbol.for(\"react.memo\"))\n );\n};\n\nexport const isPage = (data: any): data is Page => {\n if (typeof data !== \"object\") return false;\n const symbols = Object.getOwnPropertySymbols(data);\n return symbols.includes(PAGE);\n};\n\nexport const isRedirect = (data: any): data is Redirector => {\n if (typeof data !== \"object\") return false;\n const symbols = Object.getOwnPropertySymbols(data);\n return symbols.includes(REDIRECT);\n};\n\nexport const isLeaf = (data: any): data is Leaf => {\n return isComponent(data) || isPage(data) || isRedirect(data);\n};\n\nexport const isLazyComponent = (data: any): data is LazyComponent => {\n return typeof data === \"function\" && data.toString().startsWith(\"() => import(\");\n};\n","import { observer } from \"mobx-react-lite\";\nimport { createContext, useContext } from \"react\";\nimport type { Outlet } from \"../outlet\";\nimport type { Route } from \"../route\";\nimport type { RouterStore } from \"../router.store\";\nimport type { Component } from \"../types\";\n\nexport const PassThrough: Component = ({ children }) => children;\n\nexport const RouterOutlet: React.FC<{ route: Route; outlets: Outlet[] }> = observer(\n ({ route, outlets }) => {\n const [outlet, ...remainingOutlets] = outlets;\n\n if (!outlet) return null;\n\n const C = outlet.Component;\n\n if (!C) return null;\n\n return (\n <C route={route}>\n {remainingOutlets.length > 0 && <RouterOutlet route={route} outlets={remainingOutlets} />}\n </C>\n );\n },\n);\n\nexport const routerContext = createContext<RouterStore>(null as any);\nexport const useRouter = () => useContext(routerContext);\n\nexport interface RouterProps {\n store: RouterStore;\n}\n\nexport const Router = observer(({ store }: RouterProps) => {\n if (!store.activeRoute) {\n return null;\n }\n\n return (\n <routerContext.Provider value={store}>\n <RouterOutlet route={store.activeRoute} outlets={store.activeRoute.outlets} />\n </routerContext.Provider>\n );\n});\n","import { observer } from \"mobx-react-lite\";\nimport React, { type HTMLProps, useCallback } from \"react\";\nimport type {\n DynamicRoutePath,\n ExtractParams,\n NavigateOptions,\n RoutePath,\n StaticRoutePath,\n} from \"../types\";\nimport { resolvePath } from \"../util\";\nimport { useRouter } from \"./router\";\n\n// function overloading is much faster than leveraging conditional types\n// but is a bit awkward to use without the makeLinkComponent helper below.\n// consider the commented out solution once the typescript go compiler\n// is released if performance is no longer an issue\nexport interface LinkComponent<T> {\n <P extends StaticRoutePath>(props: T & { to: P; params?: undefined }): React.ReactNode;\n <P extends DynamicRoutePath>(props: T & { to: P; params: ExtractParams<P> }): React.ReactNode;\n}\n\nexport interface LinkPropsBase extends Omit<HTMLProps<HTMLAnchorElement>, \"onClick\" | \"href\"> {\n exact?: boolean;\n ref?: React.RefObject<HTMLAnchorElement>;\n}\n\nexport type Link = LinkComponent<LinkPropsBase>;\nexport type LinkProps = React.ComponentProps<Link>;\n\nexport const Link = observer((({ to, params, exact, children, ...props }: LinkProps) => {\n const router = useRouter();\n\n const resolvedPath = resolvePath(to, params);\n\n const matchingProps = router.doesPathMatch(to, exact)\n ? ({ \"aria-current\": \"page\" } as const)\n : undefined;\n\n const onClick = useCallback(\n (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n event.preventDefault();\n router.navigate({ to, ...(params as any) } as NavigateOptions<RoutePath>);\n },\n [router, params, to],\n );\n\n return (\n <a href={resolvedPath} {...props} {...matchingProps} onClick={onClick}>\n {children}\n </a>\n );\n}) as Link);\n\n// this smooths over some of the awkwardness when extending this component\nexport const makeLinkComponent = <\n C extends React.JSXElementConstructor<{ children?: React.ReactNode }>,\n>(\n C: C,\n) => {\n return (({ children, to, params, ...props }: any) => (\n <C {...props}>\n <Link to={to as any} params={params as any}>\n {children}\n </Link>\n </C>\n )) as LinkComponent<React.ComponentProps<C>>;\n};\n\n/*\nexport interface LinkPropsBase extends Omit<HTMLProps<HTMLAnchorElement>, 'onClick' | 'href'> {\n\tref?: React.RefObject<HTMLAnchorElement>;\n}\n\nexport type LinkProps<P extends RoutePath> = WithToAndParams<P, LinkPropsBase>;\n\nexport const Link = <P extends RoutePath>({ to, params, children, ...props }: LinkProps<P>) => {\n\tconst router = useRouter();\n\n\tconst resolvedPath = resolvePath(to, params);\n\n\tconst onClick = useCallback(\n\t\t(event: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n\t\t\tevent.preventDefault();\n\t\t\trouter.navigate({ to, ...params } as NavigateOptions<RoutePath>);\n\t\t},\n\t\t[router, params, to],\n\t);\n\n\treturn (\n\t\t<a href={resolvedPath} {...props} onClick={onClick} ref={ref}>\n\t\t\t{children}\n\t\t</a>\n\t);\n};\n*/\n","import { useLayoutEffect } from \"react\";\nimport type { NavigateOptions, RoutePath } from \"../types\";\nimport { useRouter } from \"./router\";\n\nexport const Navigate = <P extends RoutePath>(props: NavigateOptions<P>) => {\n const router = useRouter();\n\n useLayoutEffect(() => {\n router.navigate(props);\n }, [router, props]);\n\n return null;\n};\n","import { action, computed, observable } from \"mobx\";\nimport type { Route } from \"./route\";\nimport type { Component, LazyComponent, Loader } from \"./types\";\nimport { isLazyComponent } from \"./util\";\n\nexport interface OutletConfig {\n component?: Component | LazyComponent;\n loader?: Loader;\n}\n\nexport type RouteSegmentState = \"preloading\" | \"loading\" | \"error\" | \"ready\";\n\nexport const DefaultOutlet: Component = ({ children }) => children;\n\nexport class Outlet {\n @observable accessor state: RouteSegmentState = \"preloading\";\n @observable.ref accessor promise: Promise<unknown> | undefined;\n @observable.ref accessor data: unknown;\n @observable.ref accessor component: Component | undefined;\n\n @computed get Component(): Component | undefined {\n switch (this.state) {\n case \"loading\":\n return function Loading() {\n return <p>Loading...</p>;\n };\n\n case \"ready\":\n return this.component ?? DefaultOutlet;\n\n default:\n return undefined;\n }\n }\n\n constructor(readonly config: OutletConfig) {}\n\n @action\n async load(route: Route): Promise<void> {\n const promises: Promise<void>[] = [];\n\n if (isLazyComponent(this.config.component)) {\n promises.push(this.loadComponent());\n } else {\n this.component = this.config.component;\n }\n\n if (this.config.loader) {\n promises.push(this.loadData(route));\n }\n\n if (!promises.length) {\n this.setState(\"ready\");\n return;\n }\n\n // wait to transition to loading to avoid\n // screen flashes when the loader function\n // executes quickly\n const preloadingTimer = setTimeout(() => {\n if (this.state === \"preloading\") {\n this.setState(\"loading\");\n }\n }, 300);\n\n this.promise = Promise.all(promises)\n .then(() => {\n clearTimeout(preloadingTimer);\n if (this.state === \"loading\") {\n // if we had to transition to regular loading because\n // the loader was taking too long, force an additional\n // timeout to prevent a loading flash\n setTimeout(() => {\n this.setState(\"ready\");\n }, 300);\n } else {\n this.setState(\"ready\");\n }\n })\n .catch(() => {\n clearTimeout(preloadingTimer);\n // TODO: check for type of error\n // handle access denied and redirects\n this.setState(\"error\");\n });\n\n await this.promise;\n }\n\n @action\n setData(data: unknown) {\n this.data = data;\n }\n\n @action\n setState(state: RouteSegmentState) {\n this.state = state;\n }\n\n private async loadData(route: Route): Promise<void> {\n await this.config.loader?.(route).then((data) => this.setData(data));\n }\n\n private async loadComponent(): Promise<void> {\n if (this.component || !this.config.component) {\n return;\n }\n\n if (isLazyComponent(this.config.component)) {\n const importResult = await this.config.component();\n for (const exportName in importResult) {\n if (exportName === \"default\" || exportName.endsWith(\"Page\")) {\n this.component = importResult[exportName];\n }\n }\n } else {\n this.component = this.config.component;\n }\n }\n}\n","import type { NavigateOptions, RoutePath } from \"./types\";\n\nexport class Redirect<P extends RoutePath> {\n constructor(readonly options: NavigateOptions<P>) {}\n}\n\nexport const redirect = <P extends RoutePath>(options: NavigateOptions<P>): Redirect<P> =>\n new Redirect(options);\n","import { computed } from \"mobx\";\nimport type { Outlet } from \"./outlet\";\nimport type { Component, Guard, Obj } from \"./types\";\n\nexport interface RouteConfig {\n path: string;\n outlets: Outlet[];\n guards: Guard[];\n context?: Obj;\n layout?: Component;\n params: Obj;\n}\n\nexport class Route {\n readonly path: string;\n readonly outlets: Outlet[];\n readonly guards: Guard[];\n readonly context: Obj;\n readonly params: Obj;\n\n @computed get data(): Obj {\n return Object.assign({}, ...this.outlets.map((o) => o.data));\n }\n\n constructor(def: RouteConfig) {\n this.path = def.path;\n this.guards = def.guards;\n this.context = def.context ?? {};\n this.outlets = def.outlets;\n this.params = def.params;\n }\n\n async guard(): Promise<void> {\n for (const guard of this.guards) {\n await guard(this);\n }\n }\n\n async load(): Promise<void> {\n await Promise.all(this.outlets.map((outlet) => outlet.load(this)));\n }\n}\n","import { Outlet } from \"./outlet\";\nimport { Redirect } from \"./redirect\";\nimport { Route } from \"./route\";\nimport { CONTEXT, GUARD, LAYOUT, LOAD, PAGE, REDIRECT, WRAPPER } from \"./symbols\";\nimport type { Component, Guard, Obj, Routes } from \"./types\";\nimport { isComponent, isLazyComponent, isLeaf, isPage, isRedirect } from \"./util\";\n\nconst pathToSegments = (path: string): string[] => {\n return path.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\n};\n\nexport interface MatchState {\n segments: string[];\n context: Obj;\n params: Obj;\n outlets: (Outlet | undefined)[];\n guards: (Guard | undefined)[];\n layout?: Component;\n}\n\nexport const makeRoute = (matchState: MatchState): Route => {\n const outlets = matchState.outlets.filter((o) => o !== undefined);\n const guards = matchState.guards.filter((g) => g !== undefined);\n\n if (matchState.layout) {\n outlets.unshift(new Outlet({ component: matchState.layout }));\n }\n\n return new Route({ ...matchState, outlets, guards, path: matchState.segments.join(\"/\") });\n};\n\nexport const matchRoute = (path: string, routeDef: Routes, matchState?: MatchState): Route => {\n const state: MatchState = {\n segments: [],\n params: {},\n ...matchState,\n layout: routeDef[LAYOUT] ?? matchState?.layout,\n context: { ...matchState?.context, ...routeDef[CONTEXT] },\n guards: [...(matchState?.guards ?? []), routeDef[GUARD]],\n outlets: [\n ...(matchState?.outlets ?? []),\n routeDef[WRAPPER] ? new Outlet({ component: routeDef[WRAPPER] }) : undefined,\n routeDef[LOAD] ? new Outlet({ loader: routeDef[LOAD] }) : undefined,\n ],\n };\n\n const [segment, ...remainingSegments] = pathToSegments(path);\n const remainingPath = remainingSegments.join(\"/\");\n\n let defAtSegment = routeDef[segment || \"index\"];\n\n if (!defAtSegment) {\n const matchedSegment = Object.keys(routeDef).find((segment) => segment.startsWith(\"$\"));\n if (matchedSegment) {\n defAtSegment = routeDef[matchedSegment];\n state.params[matchedSegment.slice(1)] = segment;\n }\n }\n\n if (!defAtSegment) {\n throw new Error(\"Not Found.\");\n }\n\n state.segments.push(segment ?? \"index\");\n\n if (isLeaf(defAtSegment)) {\n if (remainingPath) {\n throw new Error(\"Not Found.\");\n }\n\n if (isRedirect(defAtSegment)) {\n const redirect =\n typeof defAtSegment[REDIRECT] === \"string\"\n ? { to: defAtSegment[REDIRECT] }\n : defAtSegment[REDIRECT];\n throw new Redirect(redirect as any);\n }\n\n if (isComponent(defAtSegment) || isLazyComponent(defAtSegment)) {\n state.outlets.push(new Outlet({ component: defAtSegment }));\n return makeRoute(state);\n }\n }\n\n // at this point we have a nested route or a [Page] definition\n\n if (isPage(defAtSegment)) {\n state.layout = defAtSegment[LAYOUT] ?? state.layout;\n Object.assign(state.context, defAtSegment[CONTEXT]);\n state.guards.push(defAtSegment[GUARD]);\n state.outlets.push(\n new Outlet({\n component: defAtSegment[PAGE],\n loader: defAtSegment[LOAD],\n }),\n );\n\n return makeRoute(state);\n }\n\n // now we know we have a nested route\n return matchRoute(remainingPath, defAtSegment, state);\n};\n\n// TODO: ideally this could resolve to something less than R,\n// but specific enough to infer all paths as a literal union.\n// As it stands, there are certain things we can't access reliably\n// without the compiler complaining about circular references\n// try \"as const satisfies\" approach which would allow us to\n// exchange a less specific version of MobxRoutesRoot for this\nexport const makeRoutes =\n () =>\n <R extends Routes>(routes: R): R => {\n // todo: perform some validation here\n // - no forward slashes in keys\n // - at most one variable segment per level\n // - only lowercase letters (except variables)\n // - paths/variables cannot contain $ that aren't at the beginning\n // - path variables must be unique across a path\n\n return routes;\n };\n","import { createBrowserHistory, type History, type Location } from \"history\";\nimport { makeAutoObservable } from \"mobx\";\nimport { matchRoute } from \"./make-routes\";\nimport { Redirect } from \"./redirect\";\nimport type { Route } from \"./route\";\nimport type { Component, MobxRouterConfig, NavigateOptions, Obj, RoutePath, Routes } from \"./types\";\nimport { resolvePath } from \"./util\";\n\nexport interface MobxRenderSegment {\n segment: string;\n component: Component;\n props?: Obj;\n}\n\nexport class RouterStore {\n readonly history: History;\n\n routesDef?: Routes;\n\n location!: Location;\n activeRoute: Route | undefined;\n\n get search(): URLSearchParams {\n return new URLSearchParams(this.location?.search);\n }\n\n get query(): Record<string, string> {\n return Object.fromEntries(this.search);\n }\n\n get pathParams(): Record<string, string> {\n const params = {} as Record<string, string>;\n\n const paramSegments = this.activeSegments.filter((segment) => segment.startsWith(\"$\"));\n const pathValues = this.location.pathname.split(\"/\").slice(1);\n\n paramSegments.forEach((segment, index) => {\n const value = pathValues[index + 1];\n if (value) {\n params[segment] = value;\n }\n });\n\n return params as Record<string, string>;\n }\n\n get activeSegments(): string[] {\n return this.activeRoute?.path.split(\"/\") ?? [];\n }\n\n constructor(config?: MobxRouterConfig) {\n makeAutoObservable({\n history: false,\n routesDef: false,\n });\n\n this.history = config?.history ?? createBrowserHistory();\n }\n\n initialize(routesDef: Routes): void {\n this.routesDef = routesDef;\n this.history.listen((data) => {\n void this.setLocation(data.location);\n });\n\n void this.setLocation(this.history.location);\n }\n\n doesPathMatch<P extends RoutePath>(path: P, exact?: boolean): boolean {\n const segments = path.slice(1).split(\"/\");\n const segmentsMatch = segments.every(\n (segment, i) => segment === this.activeSegments[i] || segment.startsWith(\"$\"),\n );\n\n return (\n segmentsMatch &&\n this.activeSegments.length >= segments.length &&\n (!exact || segments.length === this.activeSegments.length)\n );\n }\n\n navigate<P extends RoutePath>(options: NavigateOptions<P>): void {\n if (!document.startViewTransition) {\n this._navigate(options);\n } else {\n const transition = document.startViewTransition(() => this._navigate(options));\n transition.ready.catch((e) => console.log(e, typeof e));\n }\n }\n\n _navigate<P extends RoutePath>(options: NavigateOptions<P>): void {\n const { to, replace, state, search = {}, preserveSearch, params } = options;\n\n const searchParams = search instanceof URLSearchParams ? search : new URLSearchParams(search);\n\n if (preserveSearch) {\n for (const [name, value] of this.search) {\n if (!searchParams.has(name)) {\n searchParams.set(name, value);\n }\n }\n }\n\n const location = {\n pathname: resolvePath(to, params),\n search: searchParams.size ? `?${searchParams.toString()}` : undefined,\n };\n\n if (replace) {\n this.history.replace(location, state);\n } else {\n this.history.push(location, state);\n }\n }\n\n setQueryParam(param: string, value: string): void {\n this.search.set(param, value);\n this.history.replace({ search: this.search.toString() });\n }\n\n removeQueryParam(param: string): string | undefined {\n const params = new URLSearchParams(this.location.search);\n const value = params.get(param) ?? undefined;\n if (value !== undefined) {\n params.delete(param);\n this.history.replace({ search: params.toString() });\n }\n return value;\n }\n\n async setLocation(location: Location): Promise<void> {\n if (!this.routesDef) return;\n\n // TODO: this should not be the responsibility of mobx-router\n // and should really be handled server-side\n if (location.pathname !== \"/\" && location.pathname.endsWith(\"/\")) {\n this.history.replace({ ...location, pathname: location.pathname.slice(0, -1) });\n return;\n }\n\n this.location = location;\n\n try {\n const matchedRoute = matchRoute(location.pathname, this.routesDef);\n\n await matchedRoute.guard();\n\n // navigating within a guard function\n // is essentially a redirect\n if (this.location !== location) {\n return;\n }\n\n this.activeRoute = matchedRoute;\n await this.activeRoute?.load();\n } catch (e) {\n if (e instanceof Redirect) {\n this.navigate(e.options);\n return;\n }\n throw e;\n }\n }\n}\n"],"mappings":"kTAAA,MAAa,EAAyB,OAAO,IAAI,sBAAsB,CAC1D,EAAwB,OAAO,IAAI,qBAAqB,CACxD,EAAyB,OAAO,IAAI,sBAAsB,CAC1D,EAAsB,OAAO,IAAI,mBAAmB,CACpD,EAAuB,OAAO,IAAI,oBAAoB,CACtD,EAAsB,OAAO,IAAI,mBAAmB,CACpD,EAA0B,OAAO,IAAI,uBAAuB,CCH5D,GAAe,EAAY,IAC/B,EAAG,WAAW,UAAY,GAAY,CAC3C,IAAM,EAAQ,IAAS,EAAQ,MAAM,EAAE,EACvC,GAAI,CAAC,EACH,MAAU,MAAM,4BAA4B,EAAG,eAAe,EAAQ,kBAAkB,CAC1F,OAAO,GACP,CAGS,EAAe,GACrB,EAEH,OAAO,GAAS,YACf,OAAO,GAAS,UAAY,EAAK,WAAgB,OAAO,IAAI,aAAa,CAH1D,GAOP,EAAU,GACjB,OAAO,GAAS,SACJ,OAAO,sBAAsB,EAAK,CACnC,SAAS,EAAK,CAFQ,GAK1B,EAAc,GACrB,OAAO,GAAS,SACJ,OAAO,sBAAsB,EAAK,CACnC,SAAS,EAAS,CAFI,GAK1B,EAAU,GACd,EAAY,EAAK,EAAI,EAAO,EAAK,EAAI,EAAW,EAAK,CAGjD,EAAmB,GACvB,OAAO,GAAS,YAAc,EAAK,UAAU,CAAC,WAAW,gBAAgB,CC9BrE,GAA0B,CAAE,cAAe,EAE3C,EAA8D,GACxE,CAAE,QAAO,aAAc,CACtB,GAAM,CAAC,EAAQ,GAAG,GAAoB,EAEtC,GAAI,CAAC,EAAQ,OAAO,KAEpB,IAAM,EAAI,EAAO,UAIjB,OAFK,EAGH,EAAC,EAAD,CAAU,iBACP,EAAiB,OAAS,GAAK,EAAC,EAAD,CAAqB,QAAO,QAAS,EAAoB,CAAA,CACvF,CAAA,CALS,MAQlB,CAEY,EAAgB,EAA2B,KAAY,CACvD,MAAkB,EAAW,EAAc,CAM3C,EAAS,GAAU,CAAE,WAC3B,EAAM,YAKT,EAAC,EAAc,SAAf,CAAwB,MAAO,WAC7B,EAAC,EAAD,CAAc,MAAO,EAAM,YAAa,QAAS,EAAM,YAAY,QAAW,CAAA,CACvD,CAAA,CANlB,KAQT,CCfW,EAAO,IAAW,CAAE,KAAI,SAAQ,QAAO,WAAU,GAAG,KAAuB,CACtF,IAAM,EAAS,GAAW,CAEpB,EAAe,EAAY,EAAI,EAAO,CAEtC,EAAgB,EAAO,cAAc,EAAI,EAAM,CAChD,CAAE,eAAgB,OAAQ,CAC3B,IAAA,GAEE,EAAU,EACb,GAA2D,CAC1D,EAAM,gBAAgB,CACtB,EAAO,SAAS,CAAE,KAAI,GAAI,EAAgB,CAA+B,EAE3E,CAAC,EAAQ,EAAQ,EAAG,CACrB,CAED,OACE,EAAC,IAAD,CAAG,KAAM,EAAc,GAAI,EAAO,GAAI,EAAwB,UAC3D,WACC,CAAA,GAEG,CAGE,EAGX,KAES,CAAE,WAAU,KAAI,SAAQ,GAAG,KAClC,EAAC,EAAD,CAAG,GAAI,WACL,EAAC,EAAD,CAAU,KAAmB,SAC1B,WACI,CAAA,CACL,CAAA,EC5DK,EAAiC,GAA8B,CAC1E,IAAM,EAAS,GAAW,CAM1B,OAJA,MAAsB,CACpB,EAAO,SAAS,EAAM,EACrB,CAAC,EAAQ,EAAM,CAAC,CAEZ,MCCI,GAA4B,CAAE,cAAe,EAE1D,IAAa,EAAb,KAAoB,CAClB,CAAC,WAAoB,MAA2B,aAChD,CAAC,EAAW,aAAa,QACzB,CAAC,EAAW,aAAa,KACzB,CAAC,EAAW,aAAa,UAEzB,CAAC,MAAa,WAAmC,CAC/C,OAAQ,KAAK,MAAb,CACE,IAAK,UACH,OAAO,UAAmB,CACxB,OAAO,EAAC,IAAD,CAAA,SAAG,aAAc,CAAA,EAG5B,IAAK,QACH,OAAO,KAAK,WAAa,EAE3B,QACE,QAIN,YAAY,EAA+B,CAAtB,KAAA,OAAA,EAErB,CAAC,QACK,KAAK,EAA6B,CACtC,IAAM,EAA4B,EAAE,CAYpC,GAVI,EAAgB,KAAK,OAAO,UAAU,CACxC,EAAS,KAAK,KAAK,eAAe,CAAC,CAEnC,KAAK,UAAY,KAAK,OAAO,UAG3B,KAAK,OAAO,QACd,EAAS,KAAK,KAAK,SAAS,EAAM,CAAC,CAGjC,CAAC,EAAS,OAAQ,CACpB,KAAK,SAAS,QAAQ,CACtB,OAMF,IAAM,EAAkB,eAAiB,CACnC,KAAK,QAAU,cACjB,KAAK,SAAS,UAAU,EAEzB,IAAI,CAEP,KAAK,QAAU,QAAQ,IAAI,EAAS,CACjC,SAAW,CACV,aAAa,EAAgB,CACzB,KAAK,QAAU,UAIjB,eAAiB,CACf,KAAK,SAAS,QAAQ,EACrB,IAAI,CAEP,KAAK,SAAS,QAAQ,EAExB,CACD,UAAY,CACX,aAAa,EAAgB,CAG7B,KAAK,SAAS,QAAQ,EACtB,CAEJ,MAAM,KAAK,QAGb,CAAC,EACD,QAAQ,EAAe,CACrB,KAAK,KAAO,EAGd,CAAC,EACD,SAAS,EAA0B,CACjC,KAAK,MAAQ,EAGf,MAAc,SAAS,EAA6B,CAClD,MAAM,KAAK,OAAO,SAAS,EAAM,CAAC,KAAM,GAAS,KAAK,QAAQ,EAAK,CAAC,CAGtE,MAAc,eAA+B,CACvC,UAAK,WAAa,CAAC,KAAK,OAAO,WAInC,GAAI,EAAgB,KAAK,OAAO,UAAU,CAAE,CAC1C,IAAM,EAAe,MAAM,KAAK,OAAO,WAAW,CAClD,IAAK,IAAM,KAAc,GACnB,IAAe,WAAa,EAAW,SAAS,OAAO,IACzD,KAAK,UAAY,EAAa,SAIlC,KAAK,UAAY,KAAK,OAAO,YClHtB,EAAb,KAA2C,CACzC,YAAY,EAAsC,CAA7B,KAAA,QAAA,IAGvB,MAAa,EAAiC,GAC5C,IAAI,EAAS,EAAQ,CCMvB,IAAa,EAAb,KAAmB,CACjB,KACA,QACA,OACA,QACA,OAEA,CAAC,MAAa,MAAY,CACxB,OAAO,OAAO,OAAO,EAAE,CAAE,GAAG,KAAK,QAAQ,IAAK,GAAM,EAAE,KAAK,CAAC,CAG9D,YAAY,EAAkB,CAC5B,KAAK,KAAO,EAAI,KAChB,KAAK,OAAS,EAAI,OAClB,KAAK,QAAU,EAAI,SAAW,EAAE,CAChC,KAAK,QAAU,EAAI,QACnB,KAAK,OAAS,EAAI,OAGpB,MAAM,OAAuB,CAC3B,IAAK,IAAM,KAAS,KAAK,OACvB,MAAM,EAAM,KAAK,CAIrB,MAAM,MAAsB,CAC1B,MAAM,QAAQ,IAAI,KAAK,QAAQ,IAAK,GAAW,EAAO,KAAK,KAAK,CAAC,CAAC,GChCtE,MAAM,EAAkB,GACf,EAAK,QAAQ,aAAc,GAAG,CAAC,MAAM,IAAI,CAYrC,EAAa,GAAkC,CAC1D,IAAM,EAAU,EAAW,QAAQ,OAAQ,GAAM,IAAM,IAAA,GAAU,CAC3D,EAAS,EAAW,OAAO,OAAQ,GAAM,IAAM,IAAA,GAAU,CAM/D,OAJI,EAAW,QACb,EAAQ,QAAQ,IAAI,EAAO,CAAE,UAAW,EAAW,OAAQ,CAAC,CAAC,CAGxD,IAAI,EAAM,CAAE,GAAG,EAAY,UAAS,SAAQ,KAAM,EAAW,SAAS,KAAK,IAAI,CAAE,CAAC,EAG9E,GAAc,EAAc,EAAkB,IAAmC,CAC5F,IAAM,EAAoB,CACxB,SAAU,EAAE,CACZ,OAAQ,EAAE,CACV,GAAG,EACH,OAAQ,EAAS,IAAW,GAAY,OACxC,QAAS,CAAE,GAAG,GAAY,QAAS,GAAG,EAAS,GAAU,CACzD,OAAQ,CAAC,GAAI,GAAY,QAAU,EAAE,CAAG,EAAS,GAAO,CACxD,QAAS,CACP,GAAI,GAAY,SAAW,EAAE,CAC7B,EAAS,GAAW,IAAI,EAAO,CAAE,UAAW,EAAS,GAAU,CAAC,CAAG,IAAA,GACnE,EAAS,GAAQ,IAAI,EAAO,CAAE,OAAQ,EAAS,GAAO,CAAC,CAAG,IAAA,GAC3D,CACF,CAEK,CAAC,EAAS,GAAG,GAAqB,EAAe,EAAK,CACtD,EAAgB,EAAkB,KAAK,IAAI,CAE7C,EAAe,EAAS,GAAW,SAEvC,GAAI,CAAC,EAAc,CACjB,IAAM,EAAiB,OAAO,KAAK,EAAS,CAAC,KAAM,GAAY,EAAQ,WAAW,IAAI,CAAC,CACnF,IACF,EAAe,EAAS,GACxB,EAAM,OAAO,EAAe,MAAM,EAAE,EAAI,GAI5C,GAAI,CAAC,EACH,MAAU,MAAM,aAAa,CAK/B,GAFA,EAAM,SAAS,KAAK,GAAW,QAAQ,CAEnC,EAAO,EAAa,CAAE,CACxB,GAAI,EACF,MAAU,MAAM,aAAa,CAG/B,GAAI,EAAW,EAAa,CAK1B,MAAM,IAAI,EAHR,OAAO,EAAa,IAAc,SAC9B,CAAE,GAAI,EAAa,GAAW,CAC9B,EAAa,GACgB,CAGrC,GAAI,EAAY,EAAa,EAAI,EAAgB,EAAa,CAE5D,OADA,EAAM,QAAQ,KAAK,IAAI,EAAO,CAAE,UAAW,EAAc,CAAC,CAAC,CACpD,EAAU,EAAM,CAqB3B,OAfI,EAAO,EAAa,EACtB,EAAM,OAAS,EAAa,IAAW,EAAM,OAC7C,OAAO,OAAO,EAAM,QAAS,EAAa,GAAS,CACnD,EAAM,OAAO,KAAK,EAAa,GAAO,CACtC,EAAM,QAAQ,KACZ,IAAI,EAAO,CACT,UAAW,EAAa,GACxB,OAAQ,EAAa,GACtB,CAAC,CACH,CAEM,EAAU,EAAM,EAIlB,EAAW,EAAe,EAAc,EAAM,EAS1C,MAEQ,GAQV,EC1GX,IAAa,EAAb,KAAyB,CACvB,QAEA,UAEA,SACA,YAEA,IAAI,QAA0B,CAC5B,OAAO,IAAI,gBAAgB,KAAK,UAAU,OAAO,CAGnD,IAAI,OAAgC,CAClC,OAAO,OAAO,YAAY,KAAK,OAAO,CAGxC,IAAI,YAAqC,CACvC,IAAM,EAAS,EAAE,CAEX,EAAgB,KAAK,eAAe,OAAQ,GAAY,EAAQ,WAAW,IAAI,CAAC,CAChF,EAAa,KAAK,SAAS,SAAS,MAAM,IAAI,CAAC,MAAM,EAAE,CAS7D,OAPA,EAAc,SAAS,EAAS,IAAU,CACxC,IAAM,EAAQ,EAAW,EAAQ,GAC7B,IACF,EAAO,GAAW,IAEpB,CAEK,EAGT,IAAI,gBAA2B,CAC7B,OAAO,KAAK,aAAa,KAAK,MAAM,IAAI,EAAI,EAAE,CAGhD,YAAY,EAA2B,CACrC,EAAmB,CACjB,QAAS,GACT,UAAW,GACZ,CAAC,CAEF,KAAK,QAAU,GAAQ,SAAW,GAAsB,CAG1D,WAAW,EAAyB,CAClC,KAAK,UAAY,EACjB,KAAK,QAAQ,OAAQ,GAAS,CACvB,KAAK,YAAY,EAAK,SAAS,EACpC,CAEG,KAAK,YAAY,KAAK,QAAQ,SAAS,CAG9C,cAAmC,EAAS,EAA0B,CACpE,IAAM,EAAW,EAAK,MAAM,EAAE,CAAC,MAAM,IAAI,CAKzC,OAJsB,EAAS,OAC5B,EAAS,IAAM,IAAY,KAAK,eAAe,IAAM,EAAQ,WAAW,IAAI,CAC9E,EAIC,KAAK,eAAe,QAAU,EAAS,SACtC,CAAC,GAAS,EAAS,SAAW,KAAK,eAAe,QAIvD,SAA8B,EAAmC,CAC1D,SAAS,oBAGO,SAAS,wBAA0B,KAAK,UAAU,EAAQ,CAAC,CACnE,MAAM,MAAO,GAAM,QAAQ,IAAI,EAAG,OAAO,EAAE,CAAC,CAHvD,KAAK,UAAU,EAAQ,CAO3B,UAA+B,EAAmC,CAChE,GAAM,CAAE,KAAI,UAAS,QAAO,SAAS,EAAE,CAAE,iBAAgB,UAAW,EAE9D,EAAe,aAAkB,gBAAkB,EAAS,IAAI,gBAAgB,EAAO,CAE7F,GAAI,MACG,GAAM,CAAC,EAAM,KAAU,KAAK,OAC1B,EAAa,IAAI,EAAK,EACzB,EAAa,IAAI,EAAM,EAAM,CAKnC,IAAM,EAAW,CACf,SAAU,EAAY,EAAI,EAAO,CACjC,OAAQ,EAAa,KAAO,IAAI,EAAa,UAAU,GAAK,IAAA,GAC7D,CAEG,EACF,KAAK,QAAQ,QAAQ,EAAU,EAAM,CAErC,KAAK,QAAQ,KAAK,EAAU,EAAM,CAItC,cAAc,EAAe,EAAqB,CAChD,KAAK,OAAO,IAAI,EAAO,EAAM,CAC7B,KAAK,QAAQ,QAAQ,CAAE,OAAQ,KAAK,OAAO,UAAU,CAAE,CAAC,CAG1D,iBAAiB,EAAmC,CAClD,IAAM,EAAS,IAAI,gBAAgB,KAAK,SAAS,OAAO,CAClD,EAAQ,EAAO,IAAI,EAAM,EAAI,IAAA,GAKnC,OAJI,IAAU,IAAA,KACZ,EAAO,OAAO,EAAM,CACpB,KAAK,QAAQ,QAAQ,CAAE,OAAQ,EAAO,UAAU,CAAE,CAAC,EAE9C,EAGT,MAAM,YAAY,EAAmC,CAC9C,QAAK,UAIV,IAAI,EAAS,WAAa,KAAO,EAAS,SAAS,SAAS,IAAI,CAAE,CAChE,KAAK,QAAQ,QAAQ,CAAE,GAAG,EAAU,SAAU,EAAS,SAAS,MAAM,EAAG,GAAG,CAAE,CAAC,CAC/E,OAGF,KAAK,SAAW,EAEhB,GAAI,CACF,IAAM,EAAe,EAAW,EAAS,SAAU,KAAK,UAAU,CAMlE,GAJA,MAAM,EAAa,OAAO,CAItB,KAAK,WAAa,EACpB,OAGF,KAAK,YAAc,EACnB,MAAM,KAAK,aAAa,MAAM,OACvB,EAAG,CACV,GAAI,aAAa,EAAU,CACzB,KAAK,SAAS,EAAE,QAAQ,CACxB,OAEF,MAAM"}
|
|
1
|
+
{"version":3,"file":"router.mjs","names":[],"sources":["../src/router/symbols.ts","../src/router/util.ts","../src/router/components/router.tsx","../src/router/components/link.tsx","../src/router/components/navigate.tsx","../src/router/outlet.tsx","../src/router/redirect.ts","../src/router/route.tsx","../src/router/make-routes.tsx","../src/router/router.store.ts"],"sourcesContent":["export const CONTEXT: unique symbol = Symbol.for(\"MOBX_ROUTER_CONTEXT\");\nexport const LAYOUT: unique symbol = Symbol.for(\"MOBX_ROUTER_LAYOUT\");\nexport const WRAPPER: unique symbol = Symbol.for(\"MOBX_ROUTER_WRAPPER\");\nexport const LOAD: unique symbol = Symbol.for(\"MOBX_ROUTER_LOAD\");\nexport const GUARD: unique symbol = Symbol.for(\"MOBX_ROUTER_GUARD\");\nexport const PAGE: unique symbol = Symbol.for(\"MOBX_ROUTER_PAGE\");\nexport const REDIRECT: unique symbol = Symbol.for(\"MOBX_ROUTER_REDIRECT\");\n","import { PAGE, REDIRECT } from \"./symbols\";\nimport type { Component, LazyComponent, Leaf, Obj, Page, Redirector } from \"./types\";\n\nexport const resolvePath = (to: string, params?: Obj): string => {\n return to.replaceAll(/:[^/]*/g, (segment) => {\n const value = params?.[segment.slice(0)];\n if (!value)\n throw new Error(`Unable to resolve route '${to}. Paramater '${segment}' not specified.`);\n return value;\n });\n};\n\nexport const isComponent = (data: any): data is Component => {\n if (!data) return false;\n return (\n typeof data === \"function\" ||\n (typeof data === \"object\" && data[\"$$typeof\"] === Symbol.for(\"react.memo\"))\n );\n};\n\nexport const isPage = (data: any): data is Page => {\n if (typeof data !== \"object\") return false;\n const symbols = Object.getOwnPropertySymbols(data);\n return symbols.includes(PAGE);\n};\n\nexport const isRedirect = (data: any): data is Redirector => {\n if (typeof data !== \"object\") return false;\n const symbols = Object.getOwnPropertySymbols(data);\n return symbols.includes(REDIRECT);\n};\n\nexport const isLeaf = (data: any): data is Leaf => {\n return isComponent(data) || isPage(data) || isRedirect(data);\n};\n\nexport const isLazyComponent = (data: any): data is LazyComponent => {\n return typeof data === \"function\" && data.toString().startsWith(\"() => import(\");\n};\n","import { observer } from \"mobx-react-lite\";\nimport { createContext, useContext } from \"react\";\nimport type { Outlet } from \"../outlet\";\nimport type { Route } from \"../route\";\nimport type { RouterStore } from \"../router.store\";\nimport type { Component } from \"../types\";\n\nexport const PassThrough: Component = ({ children }) => children;\n\nexport const RouterOutlet: React.FC<{ route: Route; outlets: Outlet[] }> = observer(\n ({ route, outlets }) => {\n const [outlet, ...remainingOutlets] = outlets;\n\n if (!outlet) return null;\n\n const C = outlet.Component;\n\n if (!C) return null;\n\n return (\n <C route={route}>\n {remainingOutlets.length > 0 && <RouterOutlet route={route} outlets={remainingOutlets} />}\n </C>\n );\n },\n);\n\nexport const routerContext = createContext<RouterStore>(null as any);\nexport const useRouter = () => useContext(routerContext);\n\nexport interface RouterProps {\n store: RouterStore;\n}\n\nexport const Router = observer(({ store }: RouterProps) => {\n if (!store.activeRoute) {\n return null;\n }\n\n return (\n <routerContext.Provider value={store}>\n <RouterOutlet route={store.activeRoute} outlets={store.activeRoute.outlets} />\n </routerContext.Provider>\n );\n});\n","import { observer } from \"mobx-react-lite\";\nimport React, { useCallback } from \"react\";\nimport type {\n DynamicRoutePath,\n ExtractParams,\n NavigateOptions,\n RoutePath,\n StaticRoutePath,\n} from \"../types\";\nimport { resolvePath } from \"../util\";\nimport { useRouter } from \"./router\";\n\ntype LinkComponentProps<C extends React.ElementType> = Omit<\n React.ComponentProps<C>,\n \" ref\" | \"exact\" | \"to\" | \"params\" | \"onClick\"\n>;\n\nexport type LinkPropsBase<\n C extends React.ElementType,\n I extends React.ElementType = C,\n> = LinkComponentProps<C> & {\n exact?: boolean;\n ref?: React.Ref<React.ComponentRef<I>>;\n};\n\n// function overloading is much faster than leveraging conditional types\n// but once the typescript go compiler is released and performance is no\n// longer an issue, it might make sense to simplify this a bit so it can\n// be more easily consumed by users\nexport interface LinkComponent<C extends React.ElementType, I extends React.ElementType = C> {\n <P extends StaticRoutePath>(\n props: LinkPropsBase<C, I> & { to: P; params?: undefined },\n ): React.ReactNode;\n <P extends DynamicRoutePath>(\n props: LinkPropsBase<C, I> & { to: P; params: ExtractParams<P> },\n ): React.ReactNode;\n}\n\n// final thing to do is make sure refs still work in React 19\n\n// this smooths over some of the awkwardness when extending this component\nexport const makeLinkComponent = <C extends React.ElementType, I extends React.ElementType = C>(\n C: C,\n baseProps?: Partial<LinkComponentProps<C>> & { as?: I },\n) => {\n return observer(({ to, params, exact, children, ...props }: any) => {\n const router = useRouter();\n const mergedProps = { ...baseProps, ...props };\n\n if (props.role !== \"link\") {\n mergedProps.href = resolvePath(to, params);\n }\n\n if (router.doesPathMatch(to, exact)) {\n mergedProps[\"aria-current\"] = \"page\";\n }\n\n mergedProps.onClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n event.preventDefault();\n if (props.disabled) return;\n router.navigate({ to, ...(params as any) } as NavigateOptions<RoutePath>);\n },\n [router, params, to, props.disabled],\n );\n\n return React.createElement(C, mergedProps, children);\n }) as LinkComponent<C, I>;\n};\n\n//export const Link = makeLinkComponent('a');\n","import { useLayoutEffect } from \"react\";\nimport type { NavigateOptions, RoutePath } from \"../types\";\nimport { useRouter } from \"./router\";\n\nexport const Navigate = <P extends RoutePath>(props: NavigateOptions<P>) => {\n const router = useRouter();\n\n useLayoutEffect(() => {\n router.navigate(props);\n }, [router, props]);\n\n return null;\n};\n","import { action, computed, observable } from \"mobx\";\nimport type { Route } from \"./route\";\nimport type { Component, LazyComponent, Loader } from \"./types\";\nimport { isLazyComponent } from \"./util\";\n\nexport interface OutletConfig {\n component?: Component | LazyComponent;\n loader?: Loader;\n}\n\nexport type RouteSegmentState = \"preloading\" | \"loading\" | \"error\" | \"ready\";\n\nexport const DefaultOutlet: Component = ({ children }) => children;\n\nexport class Outlet {\n @observable accessor state: RouteSegmentState = \"preloading\";\n @observable.ref accessor promise: Promise<unknown> | undefined;\n @observable.ref accessor data: unknown;\n @observable.ref accessor component: Component | undefined;\n\n @computed get Component(): Component | undefined {\n switch (this.state) {\n case \"loading\":\n return function Loading() {\n return <p>Loading...</p>;\n };\n\n case \"ready\":\n return this.component ?? DefaultOutlet;\n\n default:\n return undefined;\n }\n }\n\n constructor(readonly config: OutletConfig) {}\n\n @action\n async load(route: Route): Promise<void> {\n const promises: Promise<void>[] = [];\n\n if (isLazyComponent(this.config.component)) {\n promises.push(this.loadComponent());\n } else {\n this.component = this.config.component;\n }\n\n if (this.config.loader) {\n promises.push(this.loadData(route));\n }\n\n if (!promises.length) {\n this.setState(\"ready\");\n return;\n }\n\n // wait to transition to loading to avoid\n // screen flashes when the loader function\n // executes quickly\n const preloadingTimer = setTimeout(() => {\n if (this.state === \"preloading\") {\n this.setState(\"loading\");\n }\n }, 300);\n\n this.promise = Promise.all(promises)\n .then(() => {\n clearTimeout(preloadingTimer);\n if (this.state === \"loading\") {\n // if we had to transition to regular loading because\n // the loader was taking too long, force an additional\n // timeout to prevent a loading flash\n setTimeout(() => {\n this.setState(\"ready\");\n }, 300);\n } else {\n this.setState(\"ready\");\n }\n })\n .catch(() => {\n clearTimeout(preloadingTimer);\n // TODO: check for type of error\n // handle access denied and redirects\n this.setState(\"error\");\n });\n\n await this.promise;\n }\n\n @action\n setData(data: unknown) {\n this.data = data;\n }\n\n @action\n setState(state: RouteSegmentState) {\n this.state = state;\n }\n\n private async loadData(route: Route): Promise<void> {\n await this.config.loader?.(route).then((data) => this.setData(data));\n }\n\n private async loadComponent(): Promise<void> {\n if (this.component || !this.config.component) {\n return;\n }\n\n if (isLazyComponent(this.config.component)) {\n const importResult = await this.config.component();\n for (const exportName in importResult) {\n if (exportName === \"default\" || exportName.endsWith(\"Page\")) {\n this.component = importResult[exportName];\n }\n }\n } else {\n this.component = this.config.component;\n }\n }\n}\n","import type { NavigateOptions, RoutePath } from \"./types\";\n\nexport class Redirect<P extends RoutePath> {\n constructor(readonly options: NavigateOptions<P>) {}\n}\n\nexport const redirect = <P extends RoutePath>(options: NavigateOptions<P>): Redirect<P> =>\n new Redirect(options);\n","import { computed } from \"mobx\";\nimport type { Outlet } from \"./outlet\";\nimport type { Component, Guard, Obj } from \"./types\";\n\nexport interface RouteConfig {\n path: string;\n outlets: Outlet[];\n guards: Guard[];\n context?: Obj;\n layout?: Component;\n params: Obj;\n}\n\nexport class Route {\n readonly path: string;\n readonly outlets: Outlet[];\n readonly guards: Guard[];\n readonly context: Obj;\n readonly params: Obj;\n\n @computed get data(): Obj {\n return Object.assign({}, ...this.outlets.map((o) => o.data));\n }\n\n constructor(def: RouteConfig) {\n this.path = def.path;\n this.guards = def.guards;\n this.context = def.context ?? {};\n this.outlets = def.outlets;\n this.params = def.params;\n }\n\n async guard(): Promise<void> {\n for (const guard of this.guards) {\n await guard(this);\n }\n }\n\n async load(): Promise<void> {\n await Promise.all(this.outlets.map((outlet) => outlet.load(this)));\n }\n}\n","import { Outlet } from \"./outlet\";\nimport { Redirect } from \"./redirect\";\nimport { Route } from \"./route\";\nimport { CONTEXT, GUARD, LAYOUT, LOAD, PAGE, REDIRECT, WRAPPER } from \"./symbols\";\nimport type { Component, Guard, Obj, Routes } from \"./types\";\nimport { isComponent, isLazyComponent, isLeaf, isPage, isRedirect } from \"./util\";\n\nconst pathToSegments = (path: string): string[] => {\n return path.replace(/^\\/+|\\/+$/g, \"\").split(\"/\");\n};\n\nexport interface MatchState {\n segments: string[];\n context: Obj;\n params: Obj;\n outlets: (Outlet | undefined)[];\n guards: (Guard | undefined)[];\n layout?: Component;\n}\n\nexport const makeRoute = (matchState: MatchState): Route => {\n const outlets = matchState.outlets.filter((o) => o !== undefined);\n const guards = matchState.guards.filter((g) => g !== undefined);\n\n if (matchState.layout) {\n outlets.unshift(new Outlet({ component: matchState.layout }));\n }\n\n return new Route({ ...matchState, outlets, guards, path: matchState.segments.join(\"/\") });\n};\n\nexport const matchRoute = (path: string, routeDef: Routes, matchState?: MatchState): Route => {\n const state: MatchState = {\n segments: [],\n params: {},\n ...matchState,\n layout: routeDef[LAYOUT] ?? matchState?.layout,\n context: { ...matchState?.context, ...routeDef[CONTEXT] },\n guards: [...(matchState?.guards ?? []), routeDef[GUARD]],\n outlets: [\n ...(matchState?.outlets ?? []),\n routeDef[WRAPPER] ? new Outlet({ component: routeDef[WRAPPER] }) : undefined,\n routeDef[LOAD] ? new Outlet({ loader: routeDef[LOAD] }) : undefined,\n ],\n };\n\n const [segment, ...remainingSegments] = pathToSegments(path);\n const remainingPath = remainingSegments.join(\"/\");\n\n let defAtSegment = routeDef[segment || \"index\"];\n\n if (!defAtSegment) {\n const matchedSegment = Object.keys(routeDef).find((segment) => segment.startsWith(\"$\"));\n if (matchedSegment) {\n defAtSegment = routeDef[matchedSegment];\n state.params[matchedSegment.slice(1)] = segment;\n }\n }\n\n if (!defAtSegment) {\n throw new Error(\"Not Found.\");\n }\n\n state.segments.push(segment ?? \"index\");\n\n if (isLeaf(defAtSegment)) {\n if (remainingPath) {\n throw new Error(\"Not Found.\");\n }\n\n if (isRedirect(defAtSegment)) {\n const redirect =\n typeof defAtSegment[REDIRECT] === \"string\"\n ? { to: defAtSegment[REDIRECT] }\n : defAtSegment[REDIRECT];\n throw new Redirect(redirect as any);\n }\n\n if (isComponent(defAtSegment) || isLazyComponent(defAtSegment)) {\n state.outlets.push(new Outlet({ component: defAtSegment }));\n return makeRoute(state);\n }\n }\n\n // at this point we have a nested route or a [Page] definition\n\n if (isPage(defAtSegment)) {\n state.layout = defAtSegment[LAYOUT] ?? state.layout;\n Object.assign(state.context, defAtSegment[CONTEXT]);\n state.guards.push(defAtSegment[GUARD]);\n state.outlets.push(\n new Outlet({\n component: defAtSegment[PAGE],\n loader: defAtSegment[LOAD],\n }),\n );\n\n return makeRoute(state);\n }\n\n // now we know we have a nested route\n return matchRoute(remainingPath, defAtSegment, state);\n};\n\n// TODO: ideally this could resolve to something less than R,\n// but specific enough to infer all paths as a literal union.\n// As it stands, there are certain things we can't access reliably\n// without the compiler complaining about circular references\n// try \"as const satisfies\" approach which would allow us to\n// exchange a less specific version of MobxRoutesRoot for this\nexport const makeRoutes =\n () =>\n <R extends Routes>(routes: R): R => {\n // todo: perform some validation here\n // - no forward slashes in keys\n // - at most one variable segment per level\n // - only lowercase letters (except variables)\n // - paths/variables cannot contain $ that aren't at the beginning\n // - path variables must be unique across a path\n\n return routes;\n };\n","import { createBrowserHistory, type History, type Location } from \"history\";\nimport { makeAutoObservable } from \"mobx\";\nimport { matchRoute } from \"./make-routes\";\nimport { Redirect } from \"./redirect\";\nimport type { Route } from \"./route\";\nimport type { Component, MobxRouterConfig, NavigateOptions, Obj, RoutePath, Routes } from \"./types\";\nimport { resolvePath } from \"./util\";\n\nexport interface MobxRenderSegment {\n segment: string;\n component: Component;\n props?: Obj;\n}\n\nexport class RouterStore {\n readonly history: History;\n\n routesDef?: Routes;\n\n location!: Location;\n activeRoute: Route | undefined;\n\n get search(): URLSearchParams {\n return new URLSearchParams(this.location?.search);\n }\n\n get query(): Record<string, string> {\n return Object.fromEntries(this.search);\n }\n\n get pathParams(): Record<string, string> {\n const params = {} as Record<string, string>;\n\n const paramSegments = this.activeSegments.filter((segment) => segment.startsWith(\"$\"));\n const pathValues = this.location.pathname.split(\"/\").slice(1);\n\n paramSegments.forEach((segment, index) => {\n const value = pathValues[index + 1];\n if (value) {\n params[segment] = value;\n }\n });\n\n return params as Record<string, string>;\n }\n\n get activeSegments(): string[] {\n return this.activeRoute?.path.split(\"/\") ?? [];\n }\n\n constructor(config?: MobxRouterConfig) {\n makeAutoObservable({\n history: false,\n routesDef: false,\n });\n\n this.history = config?.history ?? createBrowserHistory();\n }\n\n initialize(routesDef: Routes): void {\n this.routesDef = routesDef;\n this.history.listen((data) => {\n void this.setLocation(data.location);\n });\n\n void this.setLocation(this.history.location);\n }\n\n doesPathMatch<P extends RoutePath>(path: P, exact?: boolean): boolean {\n const segments = path.slice(1).split(\"/\");\n const segmentsMatch = segments.every(\n (segment, i) => segment === this.activeSegments[i] || segment.startsWith(\"$\"),\n );\n\n return (\n segmentsMatch &&\n this.activeSegments.length >= segments.length &&\n (!exact || segments.length === this.activeSegments.length)\n );\n }\n\n navigate<P extends RoutePath>(options: NavigateOptions<P>): void {\n if (!document.startViewTransition) {\n this._navigate(options);\n } else {\n const transition = document.startViewTransition(() => this._navigate(options));\n transition.ready.catch((e) => console.log(e, typeof e));\n }\n }\n\n _navigate<P extends RoutePath>(options: NavigateOptions<P>): void {\n const { to, replace, state, search = {}, preserveSearch, params } = options;\n\n const searchParams = search instanceof URLSearchParams ? search : new URLSearchParams(search);\n\n if (preserveSearch) {\n for (const [name, value] of this.search) {\n if (!searchParams.has(name)) {\n searchParams.set(name, value);\n }\n }\n }\n\n const location = {\n pathname: resolvePath(to, params),\n search: searchParams.size ? `?${searchParams.toString()}` : undefined,\n };\n\n if (replace) {\n this.history.replace(location, state);\n } else {\n this.history.push(location, state);\n }\n }\n\n setQueryParam(param: string, value: string): void {\n this.search.set(param, value);\n this.history.replace({ search: this.search.toString() });\n }\n\n removeQueryParam(param: string): string | undefined {\n const params = new URLSearchParams(this.location.search);\n const value = params.get(param) ?? undefined;\n if (value !== undefined) {\n params.delete(param);\n this.history.replace({ search: params.toString() });\n }\n return value;\n }\n\n async setLocation(location: Location): Promise<void> {\n if (!this.routesDef) return;\n\n // TODO: this should not be the responsibility of mobx-router\n // and should really be handled server-side\n if (location.pathname !== \"/\" && location.pathname.endsWith(\"/\")) {\n this.history.replace({ ...location, pathname: location.pathname.slice(0, -1) });\n return;\n }\n\n this.location = location;\n\n try {\n const matchedRoute = matchRoute(location.pathname, this.routesDef);\n\n await matchedRoute.guard();\n\n // navigating within a guard function\n // is essentially a redirect\n if (this.location !== location) {\n return;\n }\n\n this.activeRoute = matchedRoute;\n await this.activeRoute?.load();\n } catch (e) {\n if (e instanceof Redirect) {\n this.navigate(e.options);\n return;\n }\n throw e;\n }\n }\n}\n"],"mappings":"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"}
|