@real-router/preact 0.2.0 → 0.2.2

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.
@@ -1,91 +1,111 @@
1
- import * as preact from 'preact';
2
- import { ComponentChildren, VNode, JSX, FunctionComponent } from 'preact';
3
- import { Params, NavigationOptions, Navigator, State, RouterError, Router } from '@real-router/core';
4
- export { Navigator } from '@real-router/core';
5
- import { RouteUtils } from '@real-router/route-utils';
6
- import { RouterTransitionSnapshot } from '@real-router/sources';
7
- export { RouterTransitionSnapshot } from '@real-router/sources';
1
+ import * as _$preact from "preact";
2
+ import { ComponentChildren, FunctionComponent, JSX, VNode } from "preact";
3
+ import { NavigationOptions, Navigator, Navigator as Navigator$1, Params, Router, RouterError, State } from "@real-router/core";
4
+ import { RouteUtils } from "@real-router/route-utils";
5
+ import { RouterTransitionSnapshot, RouterTransitionSnapshot as RouterTransitionSnapshot$1 } from "@real-router/sources";
8
6
 
7
+ //#region src/components/RouteView/types.d.ts
9
8
  interface RouteViewProps {
10
- readonly nodeName: string;
11
- readonly children: ComponentChildren;
9
+ readonly nodeName: string;
10
+ readonly children: ComponentChildren;
12
11
  }
13
12
  interface MatchProps {
14
- readonly segment: string;
15
- readonly exact?: boolean;
16
- readonly fallback?: ComponentChildren;
17
- readonly children: ComponentChildren;
13
+ readonly segment: string;
14
+ readonly exact?: boolean;
15
+ readonly fallback?: ComponentChildren;
16
+ readonly children: ComponentChildren;
18
17
  }
19
18
  interface NotFoundProps {
20
- readonly children: ComponentChildren;
19
+ readonly children: ComponentChildren;
21
20
  }
22
-
21
+ //#endregion
22
+ //#region src/components/RouteView/components.d.ts
23
23
  declare function Match(_props: MatchProps): null;
24
24
  declare namespace Match {
25
- var displayName: string;
25
+ var displayName: string;
26
26
  }
27
27
  declare function NotFound(_props: NotFoundProps): null;
28
28
  declare namespace NotFound {
29
- var displayName: string;
29
+ var displayName: string;
30
30
  }
31
-
32
- declare function RouteViewRoot({ nodeName, children, }: Readonly<RouteViewProps>): VNode | null;
31
+ //#endregion
32
+ //#region src/components/RouteView/RouteView.d.ts
33
+ declare function RouteViewRoot({
34
+ nodeName,
35
+ children
36
+ }: Readonly<RouteViewProps>): VNode | null;
33
37
  declare namespace RouteViewRoot {
34
- var displayName: string;
38
+ var displayName: string;
35
39
  }
36
40
  declare const RouteView: typeof RouteViewRoot & {
37
- Match: typeof Match;
38
- NotFound: typeof NotFound;
41
+ Match: typeof Match;
42
+ NotFound: typeof NotFound;
39
43
  };
40
-
41
- interface RouteState<P extends Params = Params, MP extends Params = Params> {
42
- route: State<P, MP> | undefined;
43
- previousRoute?: State | undefined;
44
+ //#endregion
45
+ //#region src/types.d.ts
46
+ interface RouteState<P extends Params = Params> {
47
+ route: State<P> | undefined;
48
+ previousRoute?: State | undefined;
44
49
  }
45
50
  type RouteContext$1 = {
46
- navigator: Navigator;
51
+ navigator: Navigator$1;
47
52
  } & RouteState;
48
53
  interface LinkProps<P extends Params = Params> extends Omit<JSX.HTMLAttributes<HTMLAnchorElement>, "className"> {
49
- routeName: string;
50
- routeParams?: P;
51
- routeOptions?: NavigationOptions;
52
- className?: string;
53
- activeClassName?: string;
54
- activeStrict?: boolean;
55
- ignoreQueryParams?: boolean;
56
- target?: string;
54
+ routeName: string;
55
+ routeParams?: P;
56
+ routeOptions?: NavigationOptions;
57
+ className?: string;
58
+ activeClassName?: string;
59
+ activeStrict?: boolean;
60
+ ignoreQueryParams?: boolean;
61
+ target?: string;
57
62
  }
58
-
63
+ //#endregion
64
+ //#region src/components/Link.d.ts
59
65
  declare const Link: FunctionComponent<LinkProps>;
60
-
66
+ //#endregion
67
+ //#region src/components/RouterErrorBoundary.d.ts
61
68
  interface RouterErrorBoundaryProps {
62
- readonly children: ComponentChildren;
63
- readonly fallback: (error: RouterError, resetError: () => void) => ComponentChildren;
64
- readonly onError?: (error: RouterError, toRoute: State | null, fromRoute: State | null) => void;
69
+ readonly children: ComponentChildren;
70
+ readonly fallback: (error: RouterError, resetError: () => void) => ComponentChildren;
71
+ readonly onError?: (error: RouterError, toRoute: State | null, fromRoute: State | null) => void;
65
72
  }
66
- declare function RouterErrorBoundary({ children, fallback, onError, }: RouterErrorBoundaryProps): VNode;
67
-
73
+ declare function RouterErrorBoundary({
74
+ children,
75
+ fallback,
76
+ onError
77
+ }: RouterErrorBoundaryProps): VNode;
78
+ //#endregion
79
+ //#region src/hooks/useRouter.d.ts
68
80
  declare const useRouter: () => Router;
69
-
70
- declare const useNavigator: () => Navigator;
71
-
81
+ //#endregion
82
+ //#region src/hooks/useNavigator.d.ts
83
+ declare const useNavigator: () => Navigator$1;
84
+ //#endregion
85
+ //#region src/hooks/useRouteUtils.d.ts
72
86
  declare const useRouteUtils: () => RouteUtils;
73
-
87
+ //#endregion
88
+ //#region src/hooks/useRoute.d.ts
74
89
  declare const useRoute: () => RouteContext$1;
75
-
90
+ //#endregion
91
+ //#region src/hooks/useRouteNode.d.ts
76
92
  declare function useRouteNode(nodeName: string): RouteContext$1;
77
-
78
- declare function useRouterTransition(): RouterTransitionSnapshot;
79
-
93
+ //#endregion
94
+ //#region src/hooks/useRouterTransition.d.ts
95
+ declare function useRouterTransition(): RouterTransitionSnapshot$1;
96
+ //#endregion
97
+ //#region src/RouterProvider.d.ts
80
98
  interface RouteProviderProps {
81
- router: Router;
82
- children: ComponentChildren;
83
- announceNavigation?: boolean;
99
+ router: Router;
100
+ children: ComponentChildren;
101
+ announceNavigation?: boolean;
84
102
  }
85
103
  declare const RouterProvider: FunctionComponent<RouteProviderProps>;
86
-
87
- declare const RouteContext: preact.Context<RouteContext$1 | null>;
88
- declare const RouterContext: preact.Context<Router<object> | null>;
89
- declare const NavigatorContext: preact.Context<Navigator | null>;
90
-
91
- export { Link, type LinkProps, NavigatorContext, RouteContext, RouteView, type MatchProps as RouteViewMatchProps, type NotFoundProps as RouteViewNotFoundProps, type RouteViewProps, RouterContext, RouterErrorBoundary, type RouterErrorBoundaryProps, RouterProvider, useNavigator, useRoute, useRouteNode, useRouteUtils, useRouter, useRouterTransition };
104
+ //#endregion
105
+ //#region src/context.d.ts
106
+ declare const RouteContext: _$preact.Context<RouteContext$1 | null>;
107
+ declare const RouterContext: _$preact.Context<Router<object> | null>;
108
+ declare const NavigatorContext: _$preact.Context<Navigator$1 | null>;
109
+ //#endregion
110
+ export { Link, type LinkProps, type Navigator, NavigatorContext, RouteContext, RouteView, type MatchProps as RouteViewMatchProps, type NotFoundProps as RouteViewNotFoundProps, type RouteViewProps, RouterContext, RouterErrorBoundary, type RouterErrorBoundaryProps, RouterProvider, type RouterTransitionSnapshot, useNavigator, useRoute, useRouteNode, useRouteUtils, useRouter, useRouterTransition };
111
+ //# sourceMappingURL=index.d.ts.map
package/dist/cjs/index.js CHANGED
@@ -1 +1,2 @@
1
- var e=require("@real-router/core"),r=require("@real-router/route-utils"),t=require("preact"),o=require("preact/compat"),n=require("preact/jsx-runtime"),u=require("@real-router/sources"),s=require("preact/hooks"),i=require("dom-utils"),a=require("@real-router/core/api");function c(e){return null}function l(e){return null}function d(e,t,o){return o?e===t:r.startsWithSegment(e,t)}function p(e,r){for(const o of t.toChildArray(e))t.isValidElement(o)&&(o.type===c||o.type===l?r.push(o):p(o.props.children,r))}function m(e,r,t){const[o,n]=s.useState(r);return s.useEffect(()=>(n(r()),e(()=>{n(r())})),[e,r]),o}c.displayName="RouteView.Match",l.displayName="RouteView.NotFound";var f=t.createContext(null),v=t.createContext(null),g=t.createContext(null),h=()=>{const e=s.useContext(v);if(!e)throw new Error("useRouter must be used within a RouterProvider");return e};function N(r){const t=h(),o=s.useMemo(()=>u.createRouteNodeSource(t,r),[t,r]),{route:n,previousRoute:i}=m(o.subscribe,o.getSnapshot),a=s.useMemo(()=>e.getNavigator(t),[t]);return s.useMemo(()=>({navigator:a,route:n,previousRoute:i}),[a,n,i])}function x({nodeName:r,children:u}){const{route:s}=N(r);if(!s)return null;const i=[];p(u,i);const{rendered:a}=function(r,u,s){let i=null,a=!1;const c=[];for(const e of r){if(e.type===l){i=e.props.children;continue}const{segment:r,exact:p=!1,fallback:m}=e.props,f=s?`${s}.${r}`:r;if(!a&&d(u,f,p)){a=!0;const r=e.props.children;c.push(n.jsx(t.Fragment,{children:void 0===m?r:n.jsx(o.Suspense,{fallback:m,children:r})},f))}}return a||u!==e.UNKNOWN_ROUTE||null===i||c.push(n.jsx(t.Fragment,{children:i},"__route-view-not-found__")),{rendered:c,activeMatchFound:a}}(i,s.name,r);return a.length>0?n.jsx(n.Fragment,{children:a}):null}x.displayName="RouteView";var R=Object.assign(x,{Match:c,NotFound:l}),b=Object.freeze({}),S=Object.freeze({});function y(e){const r=JSON.stringify(e);return s.useMemo(()=>e,[r])}var C=o.memo(({routeName:e,routeParams:r=b,routeOptions:t=S,className:o,activeClassName:a="active",activeStrict:c=!1,ignoreQueryParams:l=!0,onClick:d,target:p,children:f,...v})=>{const g=h(),N=y(r),x=y(t),R=function(e,r,t=!1,o=!0){const n=h(),i=y(r),a=s.useMemo(()=>u.createActiveRouteSource(n,e,i,{strict:t,ignoreQueryParams:o}),[n,e,i,t,o]);return m(a.subscribe,a.getSnapshot)}(e,N,c,l),C=s.useMemo(()=>i.buildHref(g,e,N),[g,e,N]),M=s.useCallback(r=>{d&&(d(r),r.defaultPrevented)||i.shouldNavigate(r)&&"_blank"!==p&&(r.preventDefault(),g.navigate(e,N,x).catch(()=>{}))},[d,p,g,e,N,x]),P=s.useMemo(()=>i.buildActiveClassName(R,a,o),[R,a,o]);return n.jsx("a",{...v,href:C,className:P,onClick:M,children:f})},function(e,r){return e.routeName===r.routeName&&e.className===r.className&&e.activeClassName===r.activeClassName&&e.activeStrict===r.activeStrict&&e.ignoreQueryParams===r.ignoreQueryParams&&e.onClick===r.onClick&&e.target===r.target&&e.style===r.style&&e.children===r.children&&JSON.stringify(e.routeParams)===JSON.stringify(r.routeParams)&&JSON.stringify(e.routeOptions)===JSON.stringify(r.routeOptions)});C.displayName="Link";var M=new WeakMap;exports.Link=C,exports.NavigatorContext=g,exports.RouteContext=f,exports.RouteView=R,exports.RouterContext=v,exports.RouterErrorBoundary=function({children:e,fallback:r,onError:o}){const i=function(){const e=h(),r=s.useMemo(()=>{let r=M.get(e);return r||(r=u.createErrorSource(e),M.set(e,r)),r},[e]);return m(r.subscribe,r.getSnapshot)}(),[a,c]=s.useState(-1),l=s.useRef(o);l.current=o,s.useEffect(()=>{i.error&&l.current?.(i.error,i.toRoute,i.fromRoute)},[i.version]);const d=i.version>a?i.error:null,p=s.useCallback(()=>{c(i.version)},[i.version]);return n.jsxs(t.Fragment,{children:[e,d?r(d,p):null]})},exports.RouterProvider=({router:r,children:t,announceNavigation:o})=>{s.useEffect(()=>{if(!o)return;const e=i.createRouteAnnouncer(r);return()=>{e.destroy()}},[o,r]);const a=s.useMemo(()=>e.getNavigator(r),[r]),c=s.useMemo(()=>u.createRouteSource(r),[r]),{route:l,previousRoute:d}=m(c.subscribe,c.getSnapshot),p=s.useMemo(()=>({navigator:a,route:l,previousRoute:d}),[a,l,d]);return n.jsx(v.Provider,{value:r,children:n.jsx(g.Provider,{value:a,children:n.jsx(f.Provider,{value:p,children:t})})})},exports.useNavigator=()=>{const e=s.useContext(g);if(!e)throw new Error("useNavigator must be used within a RouterProvider");return e},exports.useRoute=()=>{const e=s.useContext(f);if(!e)throw new Error("useRoute must be used within a RouteProvider");return e},exports.useRouteNode=N,exports.useRouteUtils=()=>{const e=h();return r.getRouteUtils(a.getPluginApi(e).getTree())},exports.useRouter=h,exports.useRouterTransition=function(){const e=h(),r=s.useMemo(()=>u.createTransitionSource(e),[e]);return m(r.subscribe,r.getSnapshot)};//# sourceMappingURL=index.js.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@real-router/core`),t=require(`@real-router/route-utils`),n=require(`preact`),r=require(`preact/compat`),i=require(`preact/jsx-runtime`),a=require(`@real-router/sources`),o=require(`preact/hooks`),s=require(`dom-utils`),c=require(`@real-router/core/api`);function l(e){return null}l.displayName=`RouteView.Match`;function u(e){return null}u.displayName=`RouteView.NotFound`;function d(e,n,r){return r?e===n:(0,t.startsWithSegment)(e,n)}function f(e,t){for(let r of(0,n.toChildArray)(e))(0,n.isValidElement)(r)&&(r.type===l||r.type===u?t.push(r):f(r.props.children,t))}function p(t,a,o){let s=null,c=!1,l=[];for(let e of t){if(e.type===u){s=e.props.children;continue}let{segment:t,exact:f=!1,fallback:p}=e.props,m=o?`${o}.${t}`:t;if(!c&&d(a,m,f)){c=!0;let t=e.props.children,a=p===void 0?t:(0,i.jsx)(r.Suspense,{fallback:p,children:t});l.push((0,i.jsx)(n.Fragment,{children:a},m))}}return!c&&a===e.UNKNOWN_ROUTE&&s!==null&&l.push((0,i.jsx)(n.Fragment,{children:s},`__route-view-not-found__`)),{rendered:l,activeMatchFound:c}}function m(e,t,n){let[r,i]=(0,o.useState)(t);return(0,o.useEffect)(()=>(i(t()),e(()=>{i(t())})),[e,t]),r}const h=(0,n.createContext)(null),g=(0,n.createContext)(null),_=(0,n.createContext)(null),v=()=>{let e=(0,o.useContext)(g);if(!e)throw Error(`useRouter must be used within a RouterProvider`);return e};function y(t){let n=v(),r=(0,o.useMemo)(()=>(0,a.createRouteNodeSource)(n,t),[n,t]),{route:i,previousRoute:s}=m(r.subscribe,r.getSnapshot,r.getSnapshot),c=(0,o.useMemo)(()=>(0,e.getNavigator)(n),[n]);return(0,o.useMemo)(()=>({navigator:c,route:i,previousRoute:s}),[c,i,s])}function b({nodeName:e,children:t}){let{route:n}=y(e);if(!n)return null;let r=[];f(t,r);let{rendered:a}=p(r,n.name,e);return a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}b.displayName=`RouteView`;const x=Object.assign(b,{Match:l,NotFound:u}),S=Object.freeze({}),C=Object.freeze({});function w(e){return(0,o.useMemo)(()=>e,[JSON.stringify(e)])}function T(e,t,n=!1,r=!0){let i=v(),s=w(t),c=(0,o.useMemo)(()=>(0,a.createActiveRouteSource)(i,e,s,{strict:n,ignoreQueryParams:r}),[i,e,s,n,r]);return m(c.subscribe,c.getSnapshot,c.getSnapshot)}function E(e,t){return e.routeName===t.routeName&&e.className===t.className&&e.activeClassName===t.activeClassName&&e.activeStrict===t.activeStrict&&e.ignoreQueryParams===t.ignoreQueryParams&&e.onClick===t.onClick&&e.target===t.target&&e.style===t.style&&e.children===t.children&&JSON.stringify(e.routeParams)===JSON.stringify(t.routeParams)&&JSON.stringify(e.routeOptions)===JSON.stringify(t.routeOptions)}const D=(0,r.memo)(({routeName:e,routeParams:t=S,routeOptions:n=C,className:r,activeClassName:a=`active`,activeStrict:c=!1,ignoreQueryParams:l=!0,onClick:u,target:d,children:f,...p})=>{let m=v(),h=w(t),g=w(n),_=T(e,h,c,l),y=(0,o.useMemo)(()=>(0,s.buildHref)(m,e,h),[m,e,h]),b=(0,o.useCallback)(t=>{u&&(u(t),t.defaultPrevented)||!(0,s.shouldNavigate)(t)||d===`_blank`||(t.preventDefault(),m.navigate(e,h,g).catch(()=>{}))},[u,d,m,e,h,g]),x=(0,o.useMemo)(()=>(0,s.buildActiveClassName)(_,a,r),[_,a,r]);return(0,i.jsx)(`a`,{...p,href:y,className:x,onClick:b,children:f})},E);D.displayName=`Link`;const O=new WeakMap;function k(){let e=v(),t=(0,o.useMemo)(()=>{let t=O.get(e);return t||(t=(0,a.createErrorSource)(e),O.set(e,t)),t},[e]);return m(t.subscribe,t.getSnapshot,t.getSnapshot)}function A({children:e,fallback:t,onError:r}){let a=k(),[s,c]=(0,o.useState)(-1),l=(0,o.useRef)(r);l.current=r,(0,o.useEffect)(()=>{a.error&&l.current?.(a.error,a.toRoute,a.fromRoute)},[a.version]);let u=a.version>s?a.error:null,d=(0,o.useCallback)(()=>{c(a.version)},[a.version]);return(0,i.jsxs)(n.Fragment,{children:[e,u?t(u,d):null]})}const j=()=>{let e=(0,o.useContext)(_);if(!e)throw Error(`useNavigator must be used within a RouterProvider`);return e},M=()=>(0,t.getRouteUtils)((0,c.getPluginApi)(v()).getTree()),N=()=>{let e=(0,o.useContext)(h);if(!e)throw Error(`useRoute must be used within a RouteProvider`);return e};function P(){let e=v(),t=(0,o.useMemo)(()=>(0,a.createTransitionSource)(e),[e]);return m(t.subscribe,t.getSnapshot,t.getSnapshot)}const F=({router:t,children:n,announceNavigation:r})=>{(0,o.useEffect)(()=>{if(!r)return;let e=(0,s.createRouteAnnouncer)(t);return()=>{e.destroy()}},[r,t]);let c=(0,o.useMemo)(()=>(0,e.getNavigator)(t),[t]),l=(0,o.useMemo)(()=>(0,a.createRouteSource)(t),[t]),{route:u,previousRoute:d}=m(l.subscribe,l.getSnapshot,l.getSnapshot),f=(0,o.useMemo)(()=>({navigator:c,route:u,previousRoute:d}),[c,u,d]);return(0,i.jsx)(g.Provider,{value:t,children:(0,i.jsx)(_.Provider,{value:c,children:(0,i.jsx)(h.Provider,{value:f,children:n})})})};exports.Link=D,exports.NavigatorContext=_,exports.RouteContext=h,exports.RouteView=x,exports.RouterContext=g,exports.RouterErrorBoundary=A,exports.RouterProvider=F,exports.useNavigator=j,exports.useRoute=N,exports.useRouteNode=y,exports.useRouteUtils=M,exports.useRouter=v,exports.useRouterTransition=P;
2
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/RouteView/components.tsx","../../src/components/RouteView/helpers.tsx","../../src/useSyncExternalStore.ts","../../src/context.ts","../../src/hooks/useRouter.tsx","../../src/hooks/useRouteNode.tsx","../../src/components/RouteView/RouteView.tsx","../../src/constants.ts","../../src/hooks/useStableValue.tsx","../../src/hooks/useIsActiveRoute.tsx","../../src/components/Link.tsx","../../src/hooks/useRouterError.tsx","../../src/components/RouterErrorBoundary.tsx","../../src/hooks/useNavigator.tsx","../../src/hooks/useRouteUtils.tsx","../../src/hooks/useRoute.tsx","../../src/hooks/useRouterTransition.tsx","../../src/RouterProvider.tsx"],"names":["startsWithSegment","toChildArray","isValidElement","jsx","Suspense","Fragment","UNKNOWN_ROUTE","useState","useEffect","createContext","useContext","useMemo","createRouteNodeSource","getNavigator","createActiveRouteSource","memo","buildHref","useCallback","shouldNavigate","buildActiveClassName","createErrorSource","useRef","jsxs","getRouteUtils","getPluginApi","createTransitionSource","createRouteAnnouncer","createRouteSource"],"mappings":"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","file":"index.js","sourcesContent":["import type { MatchProps, NotFoundProps } from \"./types\";\n\nexport function Match(_props: MatchProps): null {\n return null;\n}\n\nMatch.displayName = \"RouteView.Match\";\n\nexport function NotFound(_props: NotFoundProps): null {\n return null;\n}\n\nNotFound.displayName = \"RouteView.NotFound\";\n","import { UNKNOWN_ROUTE } from \"@real-router/core\";\nimport { startsWithSegment } from \"@real-router/route-utils\";\nimport { Fragment, isValidElement, toChildArray } from \"preact\";\nimport { Suspense } from \"preact/compat\";\n\nimport { Match, NotFound } from \"./components\";\n\nimport type { MatchProps, NotFoundProps } from \"./types\";\nimport type { VNode, ComponentChildren } from \"preact\";\n\nfunction isSegmentMatch(\n routeName: string,\n fullSegmentName: string,\n exact: boolean,\n): boolean {\n if (exact) {\n return routeName === fullSegmentName;\n }\n\n return startsWithSegment(routeName, fullSegmentName);\n}\n\nexport function collectElements(\n children: ComponentChildren,\n result: VNode[],\n): void {\n for (const child of toChildArray(children)) {\n if (!isValidElement(child)) {\n continue;\n }\n\n if (child.type === Match || child.type === NotFound) {\n result.push(child);\n } else {\n collectElements(\n (child.props as { readonly children: ComponentChildren }).children,\n result,\n );\n }\n }\n}\n\nexport function buildRenderList(\n elements: VNode[],\n routeName: string,\n nodeName: string,\n): { rendered: VNode[]; activeMatchFound: boolean } {\n let notFoundChildren: ComponentChildren = null;\n let activeMatchFound = false;\n const rendered: VNode[] = [];\n\n for (const child of elements) {\n if (child.type === NotFound) {\n notFoundChildren = (child.props as NotFoundProps).children;\n continue;\n }\n\n const { segment, exact = false, fallback } = child.props as MatchProps;\n const fullSegmentName = nodeName ? `${nodeName}.${segment}` : segment;\n const isActive =\n !activeMatchFound && isSegmentMatch(routeName, fullSegmentName, exact);\n\n if (isActive) {\n activeMatchFound = true;\n const matchChildren = (child.props as MatchProps).children;\n const content =\n fallback === undefined ? (\n matchChildren\n ) : (\n <Suspense fallback={fallback}>{matchChildren}</Suspense>\n );\n\n rendered.push(<Fragment key={fullSegmentName}>{content}</Fragment>);\n }\n }\n\n if (\n !activeMatchFound &&\n routeName === UNKNOWN_ROUTE &&\n notFoundChildren !== null\n ) {\n rendered.push(\n <Fragment key=\"__route-view-not-found__\">{notFoundChildren}</Fragment>,\n );\n }\n\n return { rendered, activeMatchFound };\n}\n","import { useEffect, useState } from \"preact/hooks\";\n\n/**\n * Polyfill for React's useSyncExternalStore.\n *\n * Preact does not provide a native useSyncExternalStore.\n * This implementation uses useState + useEffect to subscribe\n * to external stores.\n *\n * Race condition handling: the value may change between\n * `useState(getSnapshot)` (render) and `useEffect` (commit).\n * We synchronize by calling `setValue(getSnapshot())` before\n * subscribing in the effect.\n */\nexport function useSyncExternalStore<T>(\n subscribe: (onStoreChange: () => void) => () => void,\n getSnapshot: () => T,\n _getServerSnapshot?: () => T,\n): T {\n const [value, setValue] = useState(getSnapshot);\n\n useEffect(() => {\n // Synchronize before subscribing to handle race condition\n setValue(getSnapshot());\n\n return subscribe(() => {\n setValue(getSnapshot());\n });\n }, [subscribe, getSnapshot]);\n\n return value;\n}\n","import { createContext } from \"preact\";\n\nimport type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport const NavigatorContext = createContext<Navigator | null>(null);\n","import { useContext } from \"preact/hooks\";\n\nimport { RouterContext } from \"../context\";\n\nimport type { Router } from \"@real-router/core\";\n\nexport const useRouter = (): Router => {\n const router = useContext(RouterContext);\n\n if (!router) {\n throw new Error(\"useRouter must be used within a RouterProvider\");\n }\n\n return router;\n};\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteNodeSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteContext } from \"../types\";\n\nexport function useRouteNode(nodeName: string): RouteContext {\n const router = useRouter();\n\n const store = useMemo(\n () => createRouteNodeSource(router, nodeName),\n [router, nodeName],\n );\n\n const { route, previousRoute } = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n\n const navigator = useMemo(() => getNavigator(router), [router]);\n\n return useMemo(\n (): RouteContext => ({ navigator, route, previousRoute }),\n [navigator, route, previousRoute],\n );\n}\n","import { Match, NotFound } from \"./components\";\nimport { buildRenderList, collectElements } from \"./helpers\";\nimport { useRouteNode } from \"../../hooks/useRouteNode\";\n\nimport type { RouteViewProps } from \"./types\";\nimport type { VNode } from \"preact\";\n\nfunction RouteViewRoot({\n nodeName,\n children,\n}: Readonly<RouteViewProps>): VNode | null {\n const { route } = useRouteNode(nodeName);\n\n if (!route) {\n return null;\n }\n\n const elements: VNode[] = [];\n\n collectElements(children, elements);\n\n const { rendered } = buildRenderList(elements, route.name, nodeName);\n\n if (rendered.length > 0) {\n return <>{rendered}</>;\n }\n\n return null;\n}\n\nRouteViewRoot.displayName = \"RouteView\";\n\nexport const RouteView = Object.assign(RouteViewRoot, { Match, NotFound });\n\nexport type {\n RouteViewProps,\n MatchProps as RouteViewMatchProps,\n NotFoundProps as RouteViewNotFoundProps,\n} from \"./types\";\n","/**\n * Stable empty object for default params\n */\nexport const EMPTY_PARAMS = Object.freeze({});\n\n/**\n * Stable empty options object\n */\nexport const EMPTY_OPTIONS = Object.freeze({});\n","import { useMemo } from \"preact/hooks\";\n\nexport function useStableValue<T>(value: T): T {\n const serialized = JSON.stringify(value);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => value, [serialized]);\n}\n","import { createActiveRouteSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\nimport { useStableValue } from \"./useStableValue\";\n\nimport type { Params } from \"@real-router/core\";\n\nexport function useIsActiveRoute(\n routeName: string,\n params?: Params,\n strict = false,\n ignoreQueryParams = true,\n): boolean {\n const router = useRouter();\n\n const stableParams = useStableValue(params);\n\n const store = useMemo(\n () =>\n createActiveRouteSource(router, routeName, stableParams, {\n strict,\n ignoreQueryParams,\n }),\n [router, routeName, stableParams, strict, ignoreQueryParams],\n );\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { shouldNavigate, buildHref, buildActiveClassName } from \"dom-utils\";\nimport { memo } from \"preact/compat\";\nimport { useCallback, useMemo } from \"preact/hooks\";\n\nimport { EMPTY_PARAMS, EMPTY_OPTIONS } from \"../constants\";\nimport { useIsActiveRoute } from \"../hooks/useIsActiveRoute\";\nimport { useRouter } from \"../hooks/useRouter\";\nimport { useStableValue } from \"../hooks/useStableValue\";\n\nimport type { LinkProps } from \"../types\";\nimport type { FunctionComponent, JSX } from \"preact\";\n\nfunction areLinkPropsEqual(\n prev: Readonly<LinkProps>,\n next: Readonly<LinkProps>,\n): boolean {\n return (\n prev.routeName === next.routeName &&\n prev.className === next.className &&\n prev.activeClassName === next.activeClassName &&\n prev.activeStrict === next.activeStrict &&\n prev.ignoreQueryParams === next.ignoreQueryParams &&\n prev.onClick === next.onClick &&\n prev.target === next.target &&\n prev.style === next.style &&\n prev.children === next.children &&\n JSON.stringify(prev.routeParams) === JSON.stringify(next.routeParams) &&\n JSON.stringify(prev.routeOptions) === JSON.stringify(next.routeOptions)\n );\n}\n\nexport const Link: FunctionComponent<LinkProps> = memo(\n ({\n routeName,\n routeParams = EMPTY_PARAMS,\n routeOptions = EMPTY_OPTIONS,\n className,\n activeClassName = \"active\",\n activeStrict = false,\n ignoreQueryParams = true,\n onClick,\n target,\n children,\n ...props\n }) => {\n const router = useRouter();\n\n const stableParams = useStableValue(routeParams);\n const stableOptions = useStableValue(routeOptions);\n\n const isActive = useIsActiveRoute(\n routeName,\n stableParams,\n activeStrict,\n ignoreQueryParams,\n );\n\n const href = useMemo(\n () => buildHref(router, routeName, stableParams),\n [router, routeName, stableParams],\n );\n\n const handleClick = useCallback(\n (evt: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {\n if (onClick) {\n onClick(evt);\n\n if (evt.defaultPrevented) {\n return;\n }\n }\n\n if (!shouldNavigate(evt) || target === \"_blank\") {\n return;\n }\n\n evt.preventDefault();\n router.navigate(routeName, stableParams, stableOptions).catch(() => {});\n },\n [onClick, target, router, routeName, stableParams, stableOptions],\n );\n\n const finalClassName = useMemo(\n () => buildActiveClassName(isActive, activeClassName, className),\n [isActive, activeClassName, className],\n );\n\n return (\n <a\n {...props}\n href={href}\n className={finalClassName}\n onClick={handleClick}\n >\n {children}\n </a>\n );\n },\n areLinkPropsEqual,\n);\n\nLink.displayName = \"Link\";\n","import { createErrorSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { RouterErrorSnapshot, RouterSource } from \"@real-router/sources\";\n\nconst cache = new WeakMap<Router, RouterSource<RouterErrorSnapshot>>();\n\nexport function useRouterError(): RouterErrorSnapshot {\n const router = useRouter();\n\n const store = useMemo(() => {\n let source = cache.get(router);\n\n if (!source) {\n source = createErrorSource(router);\n cache.set(router, source);\n }\n\n return source;\n }, [router]);\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { Fragment } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\n\nimport { useRouterError } from \"../hooks/useRouterError\";\n\nimport type { RouterError, State } from \"@real-router/core\";\nimport type { ComponentChildren, VNode } from \"preact\";\n\nexport interface RouterErrorBoundaryProps {\n readonly children: ComponentChildren;\n readonly fallback: (\n error: RouterError,\n resetError: () => void,\n ) => ComponentChildren;\n readonly onError?: (\n error: RouterError,\n toRoute: State | null,\n fromRoute: State | null,\n ) => void;\n}\n\nexport function RouterErrorBoundary({\n children,\n fallback,\n onError,\n}: RouterErrorBoundaryProps): VNode {\n const snapshot = useRouterError();\n const [dismissedVersion, setDismissedVersion] = useState(-1);\n\n const onErrorRef = useRef(onError);\n\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (snapshot.error) {\n onErrorRef.current?.(\n snapshot.error,\n snapshot.toRoute,\n snapshot.fromRoute,\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- onError tracked via ref, snapshot fields accessed inside callback\n }, [snapshot.version]);\n\n const visibleError =\n snapshot.version > dismissedVersion ? snapshot.error : null;\n\n const resetError = useCallback(() => {\n setDismissedVersion(snapshot.version);\n }, [snapshot.version]);\n\n return (\n <Fragment>\n {children}\n {visibleError ? fallback(visibleError, resetError) : null}\n </Fragment>\n );\n}\n","import { useContext } from \"preact/hooks\";\n\nimport { NavigatorContext } from \"../context\";\n\nimport type { Navigator } from \"@real-router/core\";\n\nexport const useNavigator = (): Navigator => {\n const navigator = useContext(NavigatorContext);\n\n if (!navigator) {\n throw new Error(\"useNavigator must be used within a RouterProvider\");\n }\n\n return navigator;\n};\n","import { getPluginApi } from \"@real-router/core/api\";\nimport { getRouteUtils } from \"@real-router/route-utils\";\n\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteUtils } from \"@real-router/route-utils\";\n\nexport const useRouteUtils = (): RouteUtils => {\n const router = useRouter();\n\n return getRouteUtils(getPluginApi(router).getTree());\n};\n","import { useContext } from \"preact/hooks\";\n\nimport { RouteContext } from \"../context\";\n\nimport type { RouteContext as RouteContextType } from \"../types\";\n\nexport const useRoute = (): RouteContextType => {\n const routeContext = useContext(RouteContext);\n\n if (!routeContext) {\n throw new Error(\"useRoute must be used within a RouteProvider\");\n }\n\n return routeContext;\n};\n","import { createTransitionSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouterTransitionSnapshot } from \"@real-router/sources\";\n\nexport function useRouterTransition(): RouterTransitionSnapshot {\n const router = useRouter();\n\n const store = useMemo(() => createTransitionSource(router), [router]);\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { createRouteAnnouncer } from \"dom-utils\";\nimport { useEffect, useMemo } from \"preact/hooks\";\n\nimport { NavigatorContext, RouteContext, RouterContext } from \"./context\";\nimport { useSyncExternalStore } from \"./useSyncExternalStore\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { FunctionComponent, ComponentChildren } from \"preact\";\n\nexport interface RouteProviderProps {\n router: Router;\n children: ComponentChildren;\n announceNavigation?: boolean;\n}\n\nexport const RouterProvider: FunctionComponent<RouteProviderProps> = ({\n router,\n children,\n announceNavigation,\n}) => {\n useEffect(() => {\n if (!announceNavigation) {\n return;\n }\n\n const announcer = createRouteAnnouncer(router);\n\n return () => {\n announcer.destroy();\n };\n }, [announceNavigation, router]);\n const navigator = useMemo(() => getNavigator(router), [router]);\n\n // useSyncExternalStore manages the router subscription lifecycle:\n // subscribe connects to router on first listener, unsubscribes on last.\n const store = useMemo(() => createRouteSource(router), [router]);\n const { route, previousRoute } = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot, // SSR: router returns same state on server and client\n );\n\n const routeContextValue = useMemo(\n () => ({ navigator, route, previousRoute }),\n [navigator, route, previousRoute],\n );\n\n return (\n <RouterContext.Provider value={router}>\n <NavigatorContext.Provider value={navigator}>\n <RouteContext.Provider value={routeContextValue}>\n {children}\n </RouteContext.Provider>\n </NavigatorContext.Provider>\n </RouterContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"file":"index.js","names":["Suspense","Fragment","UNKNOWN_ROUTE","Fragment"],"sources":["../../src/components/RouteView/components.tsx","../../src/components/RouteView/helpers.tsx","../../src/useSyncExternalStore.ts","../../src/context.ts","../../src/hooks/useRouter.tsx","../../src/hooks/useRouteNode.tsx","../../src/components/RouteView/RouteView.tsx","../../src/constants.ts","../../src/hooks/useStableValue.tsx","../../src/hooks/useIsActiveRoute.tsx","../../src/components/Link.tsx","../../src/hooks/useRouterError.tsx","../../src/components/RouterErrorBoundary.tsx","../../src/hooks/useNavigator.tsx","../../src/hooks/useRouteUtils.tsx","../../src/hooks/useRoute.tsx","../../src/hooks/useRouterTransition.tsx","../../src/RouterProvider.tsx"],"sourcesContent":["import type { MatchProps, NotFoundProps } from \"./types\";\n\nexport function Match(_props: MatchProps): null {\n return null;\n}\n\nMatch.displayName = \"RouteView.Match\";\n\nexport function NotFound(_props: NotFoundProps): null {\n return null;\n}\n\nNotFound.displayName = \"RouteView.NotFound\";\n","import { UNKNOWN_ROUTE } from \"@real-router/core\";\nimport { startsWithSegment } from \"@real-router/route-utils\";\nimport { Fragment, isValidElement, toChildArray } from \"preact\";\nimport { Suspense } from \"preact/compat\";\n\nimport { Match, NotFound } from \"./components\";\n\nimport type { MatchProps, NotFoundProps } from \"./types\";\nimport type { VNode, ComponentChildren } from \"preact\";\n\nfunction isSegmentMatch(\n routeName: string,\n fullSegmentName: string,\n exact: boolean,\n): boolean {\n if (exact) {\n return routeName === fullSegmentName;\n }\n\n return startsWithSegment(routeName, fullSegmentName);\n}\n\nexport function collectElements(\n children: ComponentChildren,\n result: VNode[],\n): void {\n for (const child of toChildArray(children)) {\n if (!isValidElement(child)) {\n continue;\n }\n\n if (child.type === Match || child.type === NotFound) {\n result.push(child);\n } else {\n collectElements(\n (child.props as { readonly children: ComponentChildren }).children,\n result,\n );\n }\n }\n}\n\nexport function buildRenderList(\n elements: VNode[],\n routeName: string,\n nodeName: string,\n): { rendered: VNode[]; activeMatchFound: boolean } {\n let notFoundChildren: ComponentChildren = null;\n let activeMatchFound = false;\n const rendered: VNode[] = [];\n\n for (const child of elements) {\n if (child.type === NotFound) {\n notFoundChildren = (child.props as NotFoundProps).children;\n continue;\n }\n\n const { segment, exact = false, fallback } = child.props as MatchProps;\n const fullSegmentName = nodeName ? `${nodeName}.${segment}` : segment;\n const isActive =\n !activeMatchFound && isSegmentMatch(routeName, fullSegmentName, exact);\n\n if (isActive) {\n activeMatchFound = true;\n const matchChildren = (child.props as MatchProps).children;\n const content =\n fallback === undefined ? (\n matchChildren\n ) : (\n <Suspense fallback={fallback}>{matchChildren}</Suspense>\n );\n\n rendered.push(<Fragment key={fullSegmentName}>{content}</Fragment>);\n }\n }\n\n if (\n !activeMatchFound &&\n routeName === UNKNOWN_ROUTE &&\n notFoundChildren !== null\n ) {\n rendered.push(\n <Fragment key=\"__route-view-not-found__\">{notFoundChildren}</Fragment>,\n );\n }\n\n return { rendered, activeMatchFound };\n}\n","import { useEffect, useState } from \"preact/hooks\";\n\n/**\n * Polyfill for React's useSyncExternalStore.\n *\n * Preact does not provide a native useSyncExternalStore.\n * This implementation uses useState + useEffect to subscribe\n * to external stores.\n *\n * Race condition handling: the value may change between\n * `useState(getSnapshot)` (render) and `useEffect` (commit).\n * We synchronize by calling `setValue(getSnapshot())` before\n * subscribing in the effect.\n */\nexport function useSyncExternalStore<T>(\n subscribe: (onStoreChange: () => void) => () => void,\n getSnapshot: () => T,\n _getServerSnapshot?: () => T,\n): T {\n const [value, setValue] = useState(getSnapshot);\n\n useEffect(() => {\n // Synchronize before subscribing to handle race condition\n setValue(getSnapshot());\n\n return subscribe(() => {\n setValue(getSnapshot());\n });\n }, [subscribe, getSnapshot]);\n\n return value;\n}\n","import { createContext } from \"preact\";\n\nimport type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport const NavigatorContext = createContext<Navigator | null>(null);\n","import { useContext } from \"preact/hooks\";\n\nimport { RouterContext } from \"../context\";\n\nimport type { Router } from \"@real-router/core\";\n\nexport const useRouter = (): Router => {\n const router = useContext(RouterContext);\n\n if (!router) {\n throw new Error(\"useRouter must be used within a RouterProvider\");\n }\n\n return router;\n};\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteNodeSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteContext } from \"../types\";\n\nexport function useRouteNode(nodeName: string): RouteContext {\n const router = useRouter();\n\n const store = useMemo(\n () => createRouteNodeSource(router, nodeName),\n [router, nodeName],\n );\n\n const { route, previousRoute } = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n\n const navigator = useMemo(() => getNavigator(router), [router]);\n\n return useMemo(\n (): RouteContext => ({ navigator, route, previousRoute }),\n [navigator, route, previousRoute],\n );\n}\n","import { Match, NotFound } from \"./components\";\nimport { buildRenderList, collectElements } from \"./helpers\";\nimport { useRouteNode } from \"../../hooks/useRouteNode\";\n\nimport type { RouteViewProps } from \"./types\";\nimport type { VNode } from \"preact\";\n\nfunction RouteViewRoot({\n nodeName,\n children,\n}: Readonly<RouteViewProps>): VNode | null {\n const { route } = useRouteNode(nodeName);\n\n if (!route) {\n return null;\n }\n\n const elements: VNode[] = [];\n\n collectElements(children, elements);\n\n const { rendered } = buildRenderList(elements, route.name, nodeName);\n\n if (rendered.length > 0) {\n return <>{rendered}</>;\n }\n\n return null;\n}\n\nRouteViewRoot.displayName = \"RouteView\";\n\nexport const RouteView = Object.assign(RouteViewRoot, { Match, NotFound });\n\nexport type {\n RouteViewProps,\n MatchProps as RouteViewMatchProps,\n NotFoundProps as RouteViewNotFoundProps,\n} from \"./types\";\n","/**\n * Stable empty object for default params\n */\nexport const EMPTY_PARAMS = Object.freeze({});\n\n/**\n * Stable empty options object\n */\nexport const EMPTY_OPTIONS = Object.freeze({});\n","import { useMemo } from \"preact/hooks\";\n\nexport function useStableValue<T>(value: T): T {\n const serialized = JSON.stringify(value);\n\n // eslint-disable-next-line @eslint-react/exhaustive-deps\n return useMemo(() => value, [serialized]);\n}\n","import { createActiveRouteSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\nimport { useStableValue } from \"./useStableValue\";\n\nimport type { Params } from \"@real-router/core\";\n\nexport function useIsActiveRoute(\n routeName: string,\n params?: Params,\n strict = false,\n ignoreQueryParams = true,\n): boolean {\n const router = useRouter();\n\n const stableParams = useStableValue(params);\n\n const store = useMemo(\n () =>\n createActiveRouteSource(router, routeName, stableParams, {\n strict,\n ignoreQueryParams,\n }),\n [router, routeName, stableParams, strict, ignoreQueryParams],\n );\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { shouldNavigate, buildHref, buildActiveClassName } from \"dom-utils\";\nimport { memo } from \"preact/compat\";\nimport { useCallback, useMemo } from \"preact/hooks\";\n\nimport { EMPTY_PARAMS, EMPTY_OPTIONS } from \"../constants\";\nimport { useIsActiveRoute } from \"../hooks/useIsActiveRoute\";\nimport { useRouter } from \"../hooks/useRouter\";\nimport { useStableValue } from \"../hooks/useStableValue\";\n\nimport type { LinkProps } from \"../types\";\nimport type { FunctionComponent, JSX } from \"preact\";\n\nfunction areLinkPropsEqual(\n prev: Readonly<LinkProps>,\n next: Readonly<LinkProps>,\n): boolean {\n return (\n prev.routeName === next.routeName &&\n prev.className === next.className &&\n prev.activeClassName === next.activeClassName &&\n prev.activeStrict === next.activeStrict &&\n prev.ignoreQueryParams === next.ignoreQueryParams &&\n prev.onClick === next.onClick &&\n prev.target === next.target &&\n prev.style === next.style &&\n prev.children === next.children &&\n JSON.stringify(prev.routeParams) === JSON.stringify(next.routeParams) &&\n JSON.stringify(prev.routeOptions) === JSON.stringify(next.routeOptions)\n );\n}\n\nexport const Link: FunctionComponent<LinkProps> = memo(\n ({\n routeName,\n routeParams = EMPTY_PARAMS,\n routeOptions = EMPTY_OPTIONS,\n className,\n activeClassName = \"active\",\n activeStrict = false,\n ignoreQueryParams = true,\n onClick,\n target,\n children,\n ...props\n }) => {\n const router = useRouter();\n\n const stableParams = useStableValue(routeParams);\n const stableOptions = useStableValue(routeOptions);\n\n const isActive = useIsActiveRoute(\n routeName,\n stableParams,\n activeStrict,\n ignoreQueryParams,\n );\n\n const href = useMemo(\n () => buildHref(router, routeName, stableParams),\n [router, routeName, stableParams],\n );\n\n const handleClick = useCallback(\n (evt: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {\n if (onClick) {\n onClick(evt);\n\n if (evt.defaultPrevented) {\n return;\n }\n }\n\n if (!shouldNavigate(evt) || target === \"_blank\") {\n return;\n }\n\n evt.preventDefault();\n router.navigate(routeName, stableParams, stableOptions).catch(() => {});\n },\n [onClick, target, router, routeName, stableParams, stableOptions],\n );\n\n const finalClassName = useMemo(\n () => buildActiveClassName(isActive, activeClassName, className),\n [isActive, activeClassName, className],\n );\n\n return (\n <a\n {...props}\n href={href}\n className={finalClassName}\n onClick={handleClick}\n >\n {children}\n </a>\n );\n },\n areLinkPropsEqual,\n);\n\nLink.displayName = \"Link\";\n","import { createErrorSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { RouterErrorSnapshot, RouterSource } from \"@real-router/sources\";\n\nconst cache = new WeakMap<Router, RouterSource<RouterErrorSnapshot>>();\n\nexport function useRouterError(): RouterErrorSnapshot {\n const router = useRouter();\n\n const store = useMemo(() => {\n let source = cache.get(router);\n\n if (!source) {\n source = createErrorSource(router);\n cache.set(router, source);\n }\n\n return source;\n }, [router]);\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { Fragment } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\n\nimport { useRouterError } from \"../hooks/useRouterError\";\n\nimport type { RouterError, State } from \"@real-router/core\";\nimport type { ComponentChildren, VNode } from \"preact\";\n\nexport interface RouterErrorBoundaryProps {\n readonly children: ComponentChildren;\n readonly fallback: (\n error: RouterError,\n resetError: () => void,\n ) => ComponentChildren;\n readonly onError?: (\n error: RouterError,\n toRoute: State | null,\n fromRoute: State | null,\n ) => void;\n}\n\nexport function RouterErrorBoundary({\n children,\n fallback,\n onError,\n}: RouterErrorBoundaryProps): VNode {\n const snapshot = useRouterError();\n const [dismissedVersion, setDismissedVersion] = useState(-1);\n\n const onErrorRef = useRef(onError);\n\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (snapshot.error) {\n onErrorRef.current?.(\n snapshot.error,\n snapshot.toRoute,\n snapshot.fromRoute,\n );\n }\n // eslint-disable-next-line @eslint-react/exhaustive-deps -- onError tracked via ref, snapshot fields accessed inside callback\n }, [snapshot.version]);\n\n const visibleError =\n snapshot.version > dismissedVersion ? snapshot.error : null;\n\n const resetError = useCallback(() => {\n setDismissedVersion(snapshot.version);\n }, [snapshot.version]);\n\n return (\n <Fragment>\n {children}\n {visibleError ? fallback(visibleError, resetError) : null}\n </Fragment>\n );\n}\n","import { useContext } from \"preact/hooks\";\n\nimport { NavigatorContext } from \"../context\";\n\nimport type { Navigator } from \"@real-router/core\";\n\nexport const useNavigator = (): Navigator => {\n const navigator = useContext(NavigatorContext);\n\n if (!navigator) {\n throw new Error(\"useNavigator must be used within a RouterProvider\");\n }\n\n return navigator;\n};\n","import { getPluginApi } from \"@real-router/core/api\";\nimport { getRouteUtils } from \"@real-router/route-utils\";\n\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteUtils } from \"@real-router/route-utils\";\n\nexport const useRouteUtils = (): RouteUtils => {\n const router = useRouter();\n\n return getRouteUtils(getPluginApi(router).getTree());\n};\n","import { useContext } from \"preact/hooks\";\n\nimport { RouteContext } from \"../context\";\n\nimport type { RouteContext as RouteContextType } from \"../types\";\n\nexport const useRoute = (): RouteContextType => {\n const routeContext = useContext(RouteContext);\n\n if (!routeContext) {\n throw new Error(\"useRoute must be used within a RouteProvider\");\n }\n\n return routeContext;\n};\n","import { createTransitionSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouterTransitionSnapshot } from \"@real-router/sources\";\n\nexport function useRouterTransition(): RouterTransitionSnapshot {\n const router = useRouter();\n\n const store = useMemo(() => createTransitionSource(router), [router]);\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { createRouteAnnouncer } from \"dom-utils\";\nimport { useEffect, useMemo } from \"preact/hooks\";\n\nimport { NavigatorContext, RouteContext, RouterContext } from \"./context\";\nimport { useSyncExternalStore } from \"./useSyncExternalStore\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { FunctionComponent, ComponentChildren } from \"preact\";\n\nexport interface RouteProviderProps {\n router: Router;\n children: ComponentChildren;\n announceNavigation?: boolean;\n}\n\nexport const RouterProvider: FunctionComponent<RouteProviderProps> = ({\n router,\n children,\n announceNavigation,\n}) => {\n useEffect(() => {\n if (!announceNavigation) {\n return;\n }\n\n const announcer = createRouteAnnouncer(router);\n\n return () => {\n announcer.destroy();\n };\n }, [announceNavigation, router]);\n const navigator = useMemo(() => getNavigator(router), [router]);\n\n // useSyncExternalStore manages the router subscription lifecycle:\n // subscribe connects to router on first listener, unsubscribes on last.\n const store = useMemo(() => createRouteSource(router), [router]);\n const { route, previousRoute } = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot, // SSR: router returns same state on server and client\n );\n\n const routeContextValue = useMemo(\n () => ({ navigator, route, previousRoute }),\n [navigator, route, previousRoute],\n );\n\n return (\n <RouterContext.Provider value={router}>\n <NavigatorContext.Provider value={navigator}>\n <RouteContext.Provider value={routeContextValue}>\n {children}\n </RouteContext.Provider>\n </NavigatorContext.Provider>\n </RouterContext.Provider>\n );\n};\n"],"mappings":"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"}
@@ -1,91 +1,111 @@
1
- import * as preact from 'preact';
2
- import { ComponentChildren, VNode, JSX, FunctionComponent } from 'preact';
3
- import { Params, NavigationOptions, Navigator, State, RouterError, Router } from '@real-router/core';
4
- export { Navigator } from '@real-router/core';
5
- import { RouteUtils } from '@real-router/route-utils';
6
- import { RouterTransitionSnapshot } from '@real-router/sources';
7
- export { RouterTransitionSnapshot } from '@real-router/sources';
1
+ import { NavigationOptions, Navigator, Navigator as Navigator$1, Params, Router, RouterError, State } from "@real-router/core";
2
+ import { RouteUtils } from "@real-router/route-utils";
3
+ import * as _$preact from "preact";
4
+ import { ComponentChildren, FunctionComponent, JSX, VNode } from "preact";
5
+ import { RouterTransitionSnapshot, RouterTransitionSnapshot as RouterTransitionSnapshot$1 } from "@real-router/sources";
8
6
 
7
+ //#region src/components/RouteView/types.d.ts
9
8
  interface RouteViewProps {
10
- readonly nodeName: string;
11
- readonly children: ComponentChildren;
9
+ readonly nodeName: string;
10
+ readonly children: ComponentChildren;
12
11
  }
13
12
  interface MatchProps {
14
- readonly segment: string;
15
- readonly exact?: boolean;
16
- readonly fallback?: ComponentChildren;
17
- readonly children: ComponentChildren;
13
+ readonly segment: string;
14
+ readonly exact?: boolean;
15
+ readonly fallback?: ComponentChildren;
16
+ readonly children: ComponentChildren;
18
17
  }
19
18
  interface NotFoundProps {
20
- readonly children: ComponentChildren;
19
+ readonly children: ComponentChildren;
21
20
  }
22
-
21
+ //#endregion
22
+ //#region src/components/RouteView/components.d.ts
23
23
  declare function Match(_props: MatchProps): null;
24
24
  declare namespace Match {
25
- var displayName: string;
25
+ var displayName: string;
26
26
  }
27
27
  declare function NotFound(_props: NotFoundProps): null;
28
28
  declare namespace NotFound {
29
- var displayName: string;
29
+ var displayName: string;
30
30
  }
31
-
32
- declare function RouteViewRoot({ nodeName, children, }: Readonly<RouteViewProps>): VNode | null;
31
+ //#endregion
32
+ //#region src/components/RouteView/RouteView.d.ts
33
+ declare function RouteViewRoot({
34
+ nodeName,
35
+ children
36
+ }: Readonly<RouteViewProps>): VNode | null;
33
37
  declare namespace RouteViewRoot {
34
- var displayName: string;
38
+ var displayName: string;
35
39
  }
36
40
  declare const RouteView: typeof RouteViewRoot & {
37
- Match: typeof Match;
38
- NotFound: typeof NotFound;
41
+ Match: typeof Match;
42
+ NotFound: typeof NotFound;
39
43
  };
40
-
41
- interface RouteState<P extends Params = Params, MP extends Params = Params> {
42
- route: State<P, MP> | undefined;
43
- previousRoute?: State | undefined;
44
+ //#endregion
45
+ //#region src/types.d.ts
46
+ interface RouteState<P extends Params = Params> {
47
+ route: State<P> | undefined;
48
+ previousRoute?: State | undefined;
44
49
  }
45
50
  type RouteContext$1 = {
46
- navigator: Navigator;
51
+ navigator: Navigator$1;
47
52
  } & RouteState;
48
53
  interface LinkProps<P extends Params = Params> extends Omit<JSX.HTMLAttributes<HTMLAnchorElement>, "className"> {
49
- routeName: string;
50
- routeParams?: P;
51
- routeOptions?: NavigationOptions;
52
- className?: string;
53
- activeClassName?: string;
54
- activeStrict?: boolean;
55
- ignoreQueryParams?: boolean;
56
- target?: string;
54
+ routeName: string;
55
+ routeParams?: P;
56
+ routeOptions?: NavigationOptions;
57
+ className?: string;
58
+ activeClassName?: string;
59
+ activeStrict?: boolean;
60
+ ignoreQueryParams?: boolean;
61
+ target?: string;
57
62
  }
58
-
63
+ //#endregion
64
+ //#region src/components/Link.d.ts
59
65
  declare const Link: FunctionComponent<LinkProps>;
60
-
66
+ //#endregion
67
+ //#region src/components/RouterErrorBoundary.d.ts
61
68
  interface RouterErrorBoundaryProps {
62
- readonly children: ComponentChildren;
63
- readonly fallback: (error: RouterError, resetError: () => void) => ComponentChildren;
64
- readonly onError?: (error: RouterError, toRoute: State | null, fromRoute: State | null) => void;
69
+ readonly children: ComponentChildren;
70
+ readonly fallback: (error: RouterError, resetError: () => void) => ComponentChildren;
71
+ readonly onError?: (error: RouterError, toRoute: State | null, fromRoute: State | null) => void;
65
72
  }
66
- declare function RouterErrorBoundary({ children, fallback, onError, }: RouterErrorBoundaryProps): VNode;
67
-
73
+ declare function RouterErrorBoundary({
74
+ children,
75
+ fallback,
76
+ onError
77
+ }: RouterErrorBoundaryProps): VNode;
78
+ //#endregion
79
+ //#region src/hooks/useRouter.d.ts
68
80
  declare const useRouter: () => Router;
69
-
70
- declare const useNavigator: () => Navigator;
71
-
81
+ //#endregion
82
+ //#region src/hooks/useNavigator.d.ts
83
+ declare const useNavigator: () => Navigator$1;
84
+ //#endregion
85
+ //#region src/hooks/useRouteUtils.d.ts
72
86
  declare const useRouteUtils: () => RouteUtils;
73
-
87
+ //#endregion
88
+ //#region src/hooks/useRoute.d.ts
74
89
  declare const useRoute: () => RouteContext$1;
75
-
90
+ //#endregion
91
+ //#region src/hooks/useRouteNode.d.ts
76
92
  declare function useRouteNode(nodeName: string): RouteContext$1;
77
-
78
- declare function useRouterTransition(): RouterTransitionSnapshot;
79
-
93
+ //#endregion
94
+ //#region src/hooks/useRouterTransition.d.ts
95
+ declare function useRouterTransition(): RouterTransitionSnapshot$1;
96
+ //#endregion
97
+ //#region src/RouterProvider.d.ts
80
98
  interface RouteProviderProps {
81
- router: Router;
82
- children: ComponentChildren;
83
- announceNavigation?: boolean;
99
+ router: Router;
100
+ children: ComponentChildren;
101
+ announceNavigation?: boolean;
84
102
  }
85
103
  declare const RouterProvider: FunctionComponent<RouteProviderProps>;
86
-
87
- declare const RouteContext: preact.Context<RouteContext$1 | null>;
88
- declare const RouterContext: preact.Context<Router<object> | null>;
89
- declare const NavigatorContext: preact.Context<Navigator | null>;
90
-
91
- export { Link, type LinkProps, NavigatorContext, RouteContext, RouteView, type MatchProps as RouteViewMatchProps, type NotFoundProps as RouteViewNotFoundProps, type RouteViewProps, RouterContext, RouterErrorBoundary, type RouterErrorBoundaryProps, RouterProvider, useNavigator, useRoute, useRouteNode, useRouteUtils, useRouter, useRouterTransition };
104
+ //#endregion
105
+ //#region src/context.d.ts
106
+ declare const RouteContext: _$preact.Context<RouteContext$1 | null>;
107
+ declare const RouterContext: _$preact.Context<Router<object> | null>;
108
+ declare const NavigatorContext: _$preact.Context<Navigator$1 | null>;
109
+ //#endregion
110
+ export { Link, type LinkProps, type Navigator, NavigatorContext, RouteContext, RouteView, type MatchProps as RouteViewMatchProps, type NotFoundProps as RouteViewNotFoundProps, type RouteViewProps, RouterContext, RouterErrorBoundary, type RouterErrorBoundaryProps, RouterProvider, type RouterTransitionSnapshot, useNavigator, useRoute, useRouteNode, useRouteUtils, useRouter, useRouterTransition };
111
+ //# sourceMappingURL=index.d.mts.map
@@ -1 +1,2 @@
1
- import{getNavigator as r,UNKNOWN_ROUTE as e}from"@real-router/core";import{startsWithSegment as t,getRouteUtils as n}from"@real-router/route-utils";import{createContext as o,toChildArray as i,isValidElement as u,Fragment as a}from"preact";import{memo as s,Suspense as c}from"preact/compat";import{jsx as l,Fragment as m,jsxs as f}from"preact/jsx-runtime";import{createActiveRouteSource as p,createRouteNodeSource as d,createTransitionSource as v,createRouteSource as h,createErrorSource as g}from"@real-router/sources";import{useMemo as N,useCallback as b,useContext as y,useState as w,useEffect as P,useRef as R}from"preact/hooks";import{buildHref as S,shouldNavigate as k,buildActiveClassName as O,createRouteAnnouncer as C}from"dom-utils";import{getPluginApi as J}from"@real-router/core/api";function _(r){return null}function j(r){return null}function E(r,e,n){return n?r===e:t(r,e)}function F(r,e){for(const t of i(r))u(t)&&(t.type===_||t.type===j?e.push(t):F(t.props.children,e))}function M(r,e,t){const[n,o]=w(e);return P(()=>(o(e()),r(()=>{o(e())})),[r,e]),n}_.displayName="RouteView.Match",j.displayName="RouteView.NotFound";var Q=o(null),x=o(null),V=o(null),z=()=>{const r=y(x);if(!r)throw new Error("useRouter must be used within a RouterProvider");return r};function $(e){const t=z(),n=N(()=>d(t,e),[t,e]),{route:o,previousRoute:i}=M(n.subscribe,n.getSnapshot),u=N(()=>r(t),[t]);return N(()=>({navigator:u,route:o,previousRoute:i}),[u,o,i])}function D({nodeName:r,children:t}){const{route:n}=$(r);if(!n)return null;const o=[];F(t,o);const{rendered:i}=function(r,t,n){let o=null,i=!1;const u=[];for(const e of r){if(e.type===j){o=e.props.children;continue}const{segment:r,exact:s=!1,fallback:m}=e.props,f=n?`${n}.${r}`:r;if(!i&&E(t,f,s)){i=!0;const r=e.props.children;u.push(l(a,{children:void 0===m?r:l(c,{fallback:m,children:r})},f))}}return i||t!==e||null===o||u.push(l(a,{children:o},"__route-view-not-found__")),{rendered:u,activeMatchFound:i}}(o,n.name,r);return i.length>0?l(m,{children:i}):null}D.displayName="RouteView";var L=Object.assign(D,{Match:_,NotFound:j}),T=Object.freeze({}),W=Object.freeze({});function q(r){const e=JSON.stringify(r);return N(()=>r,[e])}var A=s(({routeName:r,routeParams:e=T,routeOptions:t=W,className:n,activeClassName:o="active",activeStrict:i=!1,ignoreQueryParams:u=!0,onClick:a,target:s,children:c,...m})=>{const f=z(),d=q(e),v=q(t),h=function(r,e,t=!1,n=!0){const o=z(),i=q(e),u=N(()=>p(o,r,i,{strict:t,ignoreQueryParams:n}),[o,r,i,t,n]);return M(u.subscribe,u.getSnapshot)}(r,d,i,u),g=N(()=>S(f,r,d),[f,r,d]),y=b(e=>{a&&(a(e),e.defaultPrevented)||k(e)&&"_blank"!==s&&(e.preventDefault(),f.navigate(r,d,v).catch(()=>{}))},[a,s,f,r,d,v]),w=N(()=>O(h,o,n),[h,o,n]);return l("a",{...m,href:g,className:w,onClick:y,children:c})},function(r,e){return r.routeName===e.routeName&&r.className===e.className&&r.activeClassName===e.activeClassName&&r.activeStrict===e.activeStrict&&r.ignoreQueryParams===e.ignoreQueryParams&&r.onClick===e.onClick&&r.target===e.target&&r.style===e.style&&r.children===e.children&&JSON.stringify(r.routeParams)===JSON.stringify(e.routeParams)&&JSON.stringify(r.routeOptions)===JSON.stringify(e.routeOptions)});A.displayName="Link";var B=new WeakMap;function G({children:r,fallback:e,onError:t}){const n=function(){const r=z(),e=N(()=>{let e=B.get(r);return e||(e=g(r),B.set(r,e)),e},[r]);return M(e.subscribe,e.getSnapshot)}(),[o,i]=w(-1),u=R(t);u.current=t,P(()=>{n.error&&u.current?.(n.error,n.toRoute,n.fromRoute)},[n.version]);const s=n.version>o?n.error:null,c=b(()=>{i(n.version)},[n.version]);return f(a,{children:[r,s?e(s,c):null]})}var H=()=>{const r=y(V);if(!r)throw new Error("useNavigator must be used within a RouterProvider");return r},I=()=>{const r=z();return n(J(r).getTree())},K=()=>{const r=y(Q);if(!r)throw new Error("useRoute must be used within a RouteProvider");return r};function U(){const r=z(),e=N(()=>v(r),[r]);return M(e.subscribe,e.getSnapshot)}var X=({router:e,children:t,announceNavigation:n})=>{P(()=>{if(!n)return;const r=C(e);return()=>{r.destroy()}},[n,e]);const o=N(()=>r(e),[e]),i=N(()=>h(e),[e]),{route:u,previousRoute:a}=M(i.subscribe,i.getSnapshot),s=N(()=>({navigator:o,route:u,previousRoute:a}),[o,u,a]);return l(x.Provider,{value:e,children:l(V.Provider,{value:o,children:l(Q.Provider,{value:s,children:t})})})};export{A as Link,V as NavigatorContext,Q as RouteContext,L as RouteView,x as RouterContext,G as RouterErrorBoundary,X as RouterProvider,H as useNavigator,K as useRoute,$ as useRouteNode,I as useRouteUtils,z as useRouter,U as useRouterTransition};//# sourceMappingURL=index.mjs.map
1
+ import{UNKNOWN_ROUTE as e,getNavigator as t}from"@real-router/core";import{getRouteUtils as n,startsWithSegment as r}from"@real-router/route-utils";import{Fragment as i,createContext as a,isValidElement as o,toChildArray as s}from"preact";import{Suspense as c,memo as l}from"preact/compat";import{Fragment as u,jsx as d,jsxs as f}from"preact/jsx-runtime";import{createActiveRouteSource as p,createErrorSource as m,createRouteNodeSource as h,createRouteSource as g,createTransitionSource as _}from"@real-router/sources";import{useCallback as v,useContext as y,useEffect as b,useMemo as x,useRef as S,useState as C}from"preact/hooks";import{buildActiveClassName as w,buildHref as T,createRouteAnnouncer as E,shouldNavigate as D}from"dom-utils";import{getPluginApi as O}from"@real-router/core/api";function k(e){return null}k.displayName=`RouteView.Match`;function A(e){return null}A.displayName=`RouteView.NotFound`;function j(e,t,n){return n?e===t:r(e,t)}function M(e,t){for(let n of s(e))o(n)&&(n.type===k||n.type===A?t.push(n):M(n.props.children,t))}function N(t,n,r){let a=null,o=!1,s=[];for(let e of t){if(e.type===A){a=e.props.children;continue}let{segment:t,exact:l=!1,fallback:u}=e.props,f=r?`${r}.${t}`:t;if(!o&&j(n,f,l)){o=!0;let t=e.props.children,n=u===void 0?t:d(c,{fallback:u,children:t});s.push(d(i,{children:n},f))}}return!o&&n===e&&a!==null&&s.push(d(i,{children:a},`__route-view-not-found__`)),{rendered:s,activeMatchFound:o}}function P(e,t,n){let[r,i]=C(t);return b(()=>(i(t()),e(()=>{i(t())})),[e,t]),r}const F=a(null),I=a(null),L=a(null),R=()=>{let e=y(I);if(!e)throw Error(`useRouter must be used within a RouterProvider`);return e};function z(e){let n=R(),r=x(()=>h(n,e),[n,e]),{route:i,previousRoute:a}=P(r.subscribe,r.getSnapshot,r.getSnapshot),o=x(()=>t(n),[n]);return x(()=>({navigator:o,route:i,previousRoute:a}),[o,i,a])}function B({nodeName:e,children:t}){let{route:n}=z(e);if(!n)return null;let r=[];M(t,r);let{rendered:i}=N(r,n.name,e);return i.length>0?d(u,{children:i}):null}B.displayName=`RouteView`;const V=Object.assign(B,{Match:k,NotFound:A}),H=Object.freeze({}),U=Object.freeze({});function W(e){return x(()=>e,[JSON.stringify(e)])}function G(e,t,n=!1,r=!0){let i=R(),a=W(t),o=x(()=>p(i,e,a,{strict:n,ignoreQueryParams:r}),[i,e,a,n,r]);return P(o.subscribe,o.getSnapshot,o.getSnapshot)}function K(e,t){return e.routeName===t.routeName&&e.className===t.className&&e.activeClassName===t.activeClassName&&e.activeStrict===t.activeStrict&&e.ignoreQueryParams===t.ignoreQueryParams&&e.onClick===t.onClick&&e.target===t.target&&e.style===t.style&&e.children===t.children&&JSON.stringify(e.routeParams)===JSON.stringify(t.routeParams)&&JSON.stringify(e.routeOptions)===JSON.stringify(t.routeOptions)}const q=l(({routeName:e,routeParams:t=H,routeOptions:n=U,className:r,activeClassName:i=`active`,activeStrict:a=!1,ignoreQueryParams:o=!0,onClick:s,target:c,children:l,...u})=>{let f=R(),p=W(t),m=W(n),h=G(e,p,a,o),g=x(()=>T(f,e,p),[f,e,p]),_=v(t=>{s&&(s(t),t.defaultPrevented)||!D(t)||c===`_blank`||(t.preventDefault(),f.navigate(e,p,m).catch(()=>{}))},[s,c,f,e,p,m]),y=x(()=>w(h,i,r),[h,i,r]);return d(`a`,{...u,href:g,className:y,onClick:_,children:l})},K);q.displayName=`Link`;const J=new WeakMap;function Y(){let e=R(),t=x(()=>{let t=J.get(e);return t||(t=m(e),J.set(e,t)),t},[e]);return P(t.subscribe,t.getSnapshot,t.getSnapshot)}function X({children:e,fallback:t,onError:n}){let r=Y(),[a,o]=C(-1),s=S(n);s.current=n,b(()=>{r.error&&s.current?.(r.error,r.toRoute,r.fromRoute)},[r.version]);let c=r.version>a?r.error:null,l=v(()=>{o(r.version)},[r.version]);return f(i,{children:[e,c?t(c,l):null]})}const Z=()=>{let e=y(L);if(!e)throw Error(`useNavigator must be used within a RouterProvider`);return e},Q=()=>n(O(R()).getTree()),$=()=>{let e=y(F);if(!e)throw Error(`useRoute must be used within a RouteProvider`);return e};function ee(){let e=R(),t=x(()=>_(e),[e]);return P(t.subscribe,t.getSnapshot,t.getSnapshot)}const te=({router:e,children:n,announceNavigation:r})=>{b(()=>{if(!r)return;let t=E(e);return()=>{t.destroy()}},[r,e]);let i=x(()=>t(e),[e]),a=x(()=>g(e),[e]),{route:o,previousRoute:s}=P(a.subscribe,a.getSnapshot,a.getSnapshot),c=x(()=>({navigator:i,route:o,previousRoute:s}),[i,o,s]);return d(I.Provider,{value:e,children:d(L.Provider,{value:i,children:d(F.Provider,{value:c,children:n})})})};export{q as Link,L as NavigatorContext,F as RouteContext,V as RouteView,I as RouterContext,X as RouterErrorBoundary,te as RouterProvider,Z as useNavigator,$ as useRoute,z as useRouteNode,Q as useRouteUtils,R as useRouter,ee as useRouterTransition};
2
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/RouteView/components.tsx","../../src/components/RouteView/helpers.tsx","../../src/useSyncExternalStore.ts","../../src/context.ts","../../src/hooks/useRouter.tsx","../../src/hooks/useRouteNode.tsx","../../src/components/RouteView/RouteView.tsx","../../src/constants.ts","../../src/hooks/useStableValue.tsx","../../src/hooks/useIsActiveRoute.tsx","../../src/components/Link.tsx","../../src/hooks/useRouterError.tsx","../../src/components/RouterErrorBoundary.tsx","../../src/hooks/useNavigator.tsx","../../src/hooks/useRouteUtils.tsx","../../src/hooks/useRoute.tsx","../../src/hooks/useRouterTransition.tsx","../../src/RouterProvider.tsx"],"names":["Fragment","jsx","useMemo","useState","useEffect","useCallback","useContext","getNavigator"],"mappings":";AAEO,SAAS,MAAM,MAAA,EAA0B;AAC9C,EAAA,OAAO,IAAA;AACT;AAEA,KAAA,CAAM,WAAA,GAAc,iBAAA;AAEb,SAAS,SAAS,MAAA,EAA6B;AACpD,EAAA,OAAO,IAAA;AACT;AAEA,QAAA,CAAS,WAAA,GAAc,oBAAA;ACFvB,SAAS,cAAA,CACP,SAAA,EACA,eAAA,EACA,KAAA,EACS;AACT,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,SAAA,KAAc,eAAA;AAAA,EACvB;AAEA,EAAA,OAAO,iBAAA,CAAkB,WAAW,eAAe,CAAA;AACrD;AAEO,SAAS,eAAA,CACd,UACA,MAAA,EACM;AACN,EAAA,KAAA,MAAW,KAAA,IAAS,YAAA,CAAa,QAAQ,CAAA,EAAG;AAC1C,IAAA,IAAI,CAAC,cAAA,CAAe,KAAK,CAAA,EAAG;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,KAAA,IAAS,KAAA,CAAM,SAAS,QAAA,EAAU;AACnD,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,eAAA;AAAA,QACG,MAAM,KAAA,CAAmD,QAAA;AAAA,QAC1D;AAAA,OACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,eAAA,CACd,QAAA,EACA,SAAA,EACA,QAAA,EACkD;AAClD,EAAA,IAAI,gBAAA,GAAsC,IAAA;AAC1C,EAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,EAAA,MAAM,WAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,gBAAA,GAAoB,MAAM,KAAA,CAAwB,QAAA;AAClD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,OAAA,EAAS,KAAA,GAAQ,KAAA,EAAO,QAAA,KAAa,KAAA,CAAM,KAAA;AACnD,IAAA,MAAM,kBAAkB,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,OAAA;AAC9D,IAAA,MAAM,WACJ,CAAC,gBAAA,IAAoB,cAAA,CAAe,SAAA,EAAW,iBAAiB,KAAK,CAAA;AAEvE,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,gBAAA,GAAmB,IAAA;AACnB,MAAA,MAAM,aAAA,GAAiB,MAAM,KAAA,CAAqB,QAAA;AAClD,MAAA,MAAM,UACJ,QAAA,KAAa,MAAA,GACX,gCAEA,GAAA,CAAC,QAAA,EAAA,EAAS,UAAqB,QAAA,EAAA,aAAA,EAAc,CAAA;AAGjD,MAAA,QAAA,CAAS,IAAA,iBAAK,GAAA,CAACA,UAAA,EAAA,EAAgC,QAAA,EAAA,OAAA,EAAA,EAAlB,eAA0B,CAAW,CAAA;AAAA,IACpE;AAAA,EACF;AAEA,EAAA,IACE,CAAC,gBAAA,IACD,SAAA,KAAc,aAAA,IACd,qBAAqB,IAAA,EACrB;AACA,IAAA,QAAA,CAAS,IAAA;AAAA,sBACP,GAAA,CAACA,UAAA,EAAA,EAAyC,QAAA,EAAA,gBAAA,EAAA,EAA5B,0BAA6C;AAAA,KAC7D;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAU,gBAAA,EAAiB;AACtC;ACzEO,SAAS,oBAAA,CACd,SAAA,EACA,WAAA,EACA,kBAAA,EACG;AACH,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,WAAW,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,QAAA,CAAS,aAAa,CAAA;AAEtB,IAAA,OAAO,UAAU,MAAM;AACrB,MAAA,QAAA,CAAS,aAAa,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAE3B,EAAA,OAAO,KAAA;AACT;AC1BO,IAAM,YAAA,GAAe,cAAuC,IAAI;AAEhE,IAAM,aAAA,GAAgB,cAA6B,IAAI;AAEvD,IAAM,gBAAA,GAAmB,cAAgC,IAAI;;;ACH7D,IAAM,YAAY,MAAc;AACrC,EAAA,MAAM,MAAA,GAAS,WAAW,aAAa,CAAA;AAEvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,MAAA;AACT;;;ACLO,SAAS,aAAa,QAAA,EAAgC;AAC3D,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,MAAM,qBAAA,CAAsB,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC5C,CAAC,QAAQ,QAAQ;AAAA,GACnB;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAI,oBAAA;AAAA,IAC/B,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AAEA,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM,YAAA,CAAa,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAE9D,EAAA,OAAO,OAAA;AAAA,IACL,OAAqB,EAAE,SAAA,EAAW,KAAA,EAAO,aAAA,EAAc,CAAA;AAAA,IACvD,CAAC,SAAA,EAAW,KAAA,EAAO,aAAa;AAAA,GAClC;AACF;ACtBA,SAAS,aAAA,CAAc;AAAA,EACrB,QAAA;AAAA,EACA;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,YAAA,CAAa,QAAQ,CAAA;AAEvC,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAoB,EAAC;AAE3B,EAAA,eAAA,CAAgB,UAAU,QAAQ,CAAA;AAElC,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,gBAAgB,QAAA,EAAU,KAAA,CAAM,MAAM,QAAQ,CAAA;AAEnE,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,uBAAOC,GAAAA,CAAAD,QAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,aAAA,CAAc,WAAA,GAAc,WAAA;AAErB,IAAM,YAAY,MAAA,CAAO,MAAA,CAAO,eAAe,EAAE,KAAA,EAAO,UAAU;;;AC7BlE,IAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAKrC,IAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;ACNtC,SAAS,eAAkB,KAAA,EAAa;AAC7C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAGvC,EAAA,OAAOE,OAAAA,CAAQ,MAAM,KAAA,EAAO,CAAC,UAAU,CAAC,CAAA;AAC1C;;;ACEO,SAAS,iBACd,SAAA,EACA,MAAA,EACA,MAAA,GAAS,KAAA,EACT,oBAAoB,IAAA,EACX;AACT,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,YAAA,GAAe,eAAe,MAAM,CAAA;AAE1C,EAAA,MAAM,KAAA,GAAQA,OAAAA;AAAA,IACZ,MACE,uBAAA,CAAwB,MAAA,EAAQ,SAAA,EAAW,YAAA,EAAc;AAAA,MACvD,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,CAAC,MAAA,EAAQ,SAAA,EAAW,YAAA,EAAc,QAAQ,iBAAiB;AAAA,GAC7D;AAEA,EAAA,OAAO,oBAAA;AAAA,IACL,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AACF;ACrBA,SAAS,iBAAA,CACP,MACA,IAAA,EACS;AACT,EAAA,OACE,IAAA,CAAK,SAAA,KAAc,IAAA,CAAK,SAAA,IACxB,IAAA,CAAK,cAAc,IAAA,CAAK,SAAA,IACxB,IAAA,CAAK,eAAA,KAAoB,IAAA,CAAK,eAAA,IAC9B,KAAK,YAAA,KAAiB,IAAA,CAAK,YAAA,IAC3B,IAAA,CAAK,iBAAA,KAAsB,IAAA,CAAK,iBAAA,IAChC,IAAA,CAAK,OAAA,KAAY,IAAA,CAAK,OAAA,IACtB,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,UACrB,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,KAAA,IACpB,IAAA,CAAK,QAAA,KAAa,KAAK,QAAA,IACvB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA,KAAM,KAAK,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA,IACpE,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,YAAY,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,YAAY,CAAA;AAE1E;AAEO,IAAM,IAAA,GAAqC,IAAA;AAAA,EAChD,CAAC;AAAA,IACC,SAAA;AAAA,IACA,WAAA,GAAc,YAAA;AAAA,IACd,YAAA,GAAe,aAAA;AAAA,IACf,SAAA;AAAA,IACA,eAAA,GAAkB,QAAA;AAAA,IAClB,YAAA,GAAe,KAAA;AAAA,IACf,iBAAA,GAAoB,IAAA;AAAA,IACpB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,GACL,KAAM;AACJ,IAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,IAAA,MAAM,YAAA,GAAe,eAAe,WAAW,CAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,eAAe,YAAY,CAAA;AAEjD,IAAA,MAAM,QAAA,GAAW,gBAAA;AAAA,MACf,SAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAAOA,OAAAA;AAAA,MACX,MAAM,SAAA,CAAU,MAAA,EAAQ,SAAA,EAAW,YAAY,CAAA;AAAA,MAC/C,CAAC,MAAA,EAAQ,SAAA,EAAW,YAAY;AAAA,KAClC;AAEA,IAAA,MAAM,WAAA,GAAc,WAAA;AAAA,MAClB,CAAC,GAAA,KAAmD;AAClD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,GAAG,CAAA;AAEX,UAAA,IAAI,IAAI,gBAAA,EAAkB;AACxB,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,cAAA,CAAe,GAAG,CAAA,IAAK,WAAW,QAAA,EAAU;AAC/C,UAAA;AAAA,QACF;AAEA,QAAA,GAAA,CAAI,cAAA,EAAe;AACnB,QAAA,MAAA,CAAO,SAAS,SAAA,EAAW,YAAA,EAAc,aAAa,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACxE,CAAA;AAAA,MACA,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,cAAc,aAAa;AAAA,KAClE;AAEA,IAAA,MAAM,cAAA,GAAiBA,OAAAA;AAAA,MACrB,MAAM,oBAAA,CAAqB,QAAA,EAAU,eAAA,EAAiB,SAAS,CAAA;AAAA,MAC/D,CAAC,QAAA,EAAU,eAAA,EAAiB,SAAS;AAAA,KACvC;AAEA,IAAA,uBACED,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACE,GAAG,KAAA;AAAA,QACJ,IAAA;AAAA,QACA,SAAA,EAAW,cAAA;AAAA,QACX,OAAA,EAAS,WAAA;AAAA,QAER;AAAA;AAAA,KACH;AAAA,EAEJ,CAAA;AAAA,EACA;AACF;AAEA,IAAA,CAAK,WAAA,GAAc,MAAA;AC5FnB,IAAM,KAAA,uBAAY,OAAA,EAAmD;AAE9D,SAAS,cAAA,GAAsC;AACpD,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,KAAA,GAAQC,QAAQ,MAAM;AAC1B,IAAA,IAAI,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAE7B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACjC,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,OAAO,oBAAA;AAAA,IACL,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AACF;ACTO,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,WAAW,cAAA,EAAe;AAChC,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIC,SAAS,EAAE,CAAA;AAE3D,EAAA,MAAM,UAAA,GAAa,OAAO,OAAO,CAAA;AAEjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,UAAA,CAAW,OAAA;AAAA,QACT,QAAA,CAAS,KAAA;AAAA,QACT,QAAA,CAAS,OAAA;AAAA,QACT,QAAA,CAAS;AAAA,OACX;AAAA,IACF;AAAA,EAEF,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA;AAErB,EAAA,MAAM,YAAA,GACJ,QAAA,CAAS,OAAA,GAAU,gBAAA,GAAmB,SAAS,KAAA,GAAQ,IAAA;AAEzD,EAAA,MAAM,UAAA,GAAaC,YAAY,MAAM;AACnC,IAAA,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA;AAErB,EAAA,uBACE,IAAA,CAACL,YAAA,EACE,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,YAAA,GAAe,QAAA,CAAS,YAAA,EAAc,UAAU,CAAA,GAAI;AAAA,GAAA,EACvD,CAAA;AAEJ;ACnDO,IAAM,eAAe,MAAiB;AAC3C,EAAA,MAAM,SAAA,GAAYM,WAAW,gBAAgB,CAAA;AAE7C,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO,SAAA;AACT;ACPO,IAAM,gBAAgB,MAAkB;AAC7C,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,OAAO,aAAA,CAAc,YAAA,CAAa,MAAM,CAAA,CAAE,SAAS,CAAA;AACrD;ACLO,IAAM,WAAW,MAAwB;AAC9C,EAAA,MAAM,YAAA,GAAeA,WAAW,YAAY,CAAA;AAE5C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,YAAA;AACT;ACNO,SAAS,mBAAA,GAAgD;AAC9D,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,KAAA,GAAQJ,QAAQ,MAAM,sBAAA,CAAuB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEpE,EAAA,OAAO,oBAAA;AAAA,IACL,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AACF;ACDO,IAAM,iBAAwD,CAAC;AAAA,EACpE,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,qBAAqB,MAAM,CAAA;AAE7C,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,OAAA,EAAQ;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,MAAM,CAAC,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAYF,QAAQ,MAAMK,YAAAA,CAAa,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAI9D,EAAA,MAAM,KAAA,GAAQL,QAAQ,MAAM,iBAAA,CAAkB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC/D,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAI,oBAAA;AAAA,IAC/B,KAAA,CAAM,SAAA;AAAA,IACN,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM;AAAA;AAAA,GACR;AAEA,EAAA,MAAM,iBAAA,GAAoBA,OAAAA;AAAA,IACxB,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,aAAA,EAAc,CAAA;AAAA,IACzC,CAAC,SAAA,EAAW,KAAA,EAAO,aAAa;AAAA,GAClC;AAEA,EAAA,uBACED,IAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,KAAA,EAAO,MAAA,EAC7B,QAAA,kBAAAA,GAAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,SAAA,EAChC,QAAA,kBAAAA,GAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,KAAA,EAAO,iBAAA,EAC3B,QAAA,EACH,CAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"index.mjs","sourcesContent":["import type { MatchProps, NotFoundProps } from \"./types\";\n\nexport function Match(_props: MatchProps): null {\n return null;\n}\n\nMatch.displayName = \"RouteView.Match\";\n\nexport function NotFound(_props: NotFoundProps): null {\n return null;\n}\n\nNotFound.displayName = \"RouteView.NotFound\";\n","import { UNKNOWN_ROUTE } from \"@real-router/core\";\nimport { startsWithSegment } from \"@real-router/route-utils\";\nimport { Fragment, isValidElement, toChildArray } from \"preact\";\nimport { Suspense } from \"preact/compat\";\n\nimport { Match, NotFound } from \"./components\";\n\nimport type { MatchProps, NotFoundProps } from \"./types\";\nimport type { VNode, ComponentChildren } from \"preact\";\n\nfunction isSegmentMatch(\n routeName: string,\n fullSegmentName: string,\n exact: boolean,\n): boolean {\n if (exact) {\n return routeName === fullSegmentName;\n }\n\n return startsWithSegment(routeName, fullSegmentName);\n}\n\nexport function collectElements(\n children: ComponentChildren,\n result: VNode[],\n): void {\n for (const child of toChildArray(children)) {\n if (!isValidElement(child)) {\n continue;\n }\n\n if (child.type === Match || child.type === NotFound) {\n result.push(child);\n } else {\n collectElements(\n (child.props as { readonly children: ComponentChildren }).children,\n result,\n );\n }\n }\n}\n\nexport function buildRenderList(\n elements: VNode[],\n routeName: string,\n nodeName: string,\n): { rendered: VNode[]; activeMatchFound: boolean } {\n let notFoundChildren: ComponentChildren = null;\n let activeMatchFound = false;\n const rendered: VNode[] = [];\n\n for (const child of elements) {\n if (child.type === NotFound) {\n notFoundChildren = (child.props as NotFoundProps).children;\n continue;\n }\n\n const { segment, exact = false, fallback } = child.props as MatchProps;\n const fullSegmentName = nodeName ? `${nodeName}.${segment}` : segment;\n const isActive =\n !activeMatchFound && isSegmentMatch(routeName, fullSegmentName, exact);\n\n if (isActive) {\n activeMatchFound = true;\n const matchChildren = (child.props as MatchProps).children;\n const content =\n fallback === undefined ? (\n matchChildren\n ) : (\n <Suspense fallback={fallback}>{matchChildren}</Suspense>\n );\n\n rendered.push(<Fragment key={fullSegmentName}>{content}</Fragment>);\n }\n }\n\n if (\n !activeMatchFound &&\n routeName === UNKNOWN_ROUTE &&\n notFoundChildren !== null\n ) {\n rendered.push(\n <Fragment key=\"__route-view-not-found__\">{notFoundChildren}</Fragment>,\n );\n }\n\n return { rendered, activeMatchFound };\n}\n","import { useEffect, useState } from \"preact/hooks\";\n\n/**\n * Polyfill for React's useSyncExternalStore.\n *\n * Preact does not provide a native useSyncExternalStore.\n * This implementation uses useState + useEffect to subscribe\n * to external stores.\n *\n * Race condition handling: the value may change between\n * `useState(getSnapshot)` (render) and `useEffect` (commit).\n * We synchronize by calling `setValue(getSnapshot())` before\n * subscribing in the effect.\n */\nexport function useSyncExternalStore<T>(\n subscribe: (onStoreChange: () => void) => () => void,\n getSnapshot: () => T,\n _getServerSnapshot?: () => T,\n): T {\n const [value, setValue] = useState(getSnapshot);\n\n useEffect(() => {\n // Synchronize before subscribing to handle race condition\n setValue(getSnapshot());\n\n return subscribe(() => {\n setValue(getSnapshot());\n });\n }, [subscribe, getSnapshot]);\n\n return value;\n}\n","import { createContext } from \"preact\";\n\nimport type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport const NavigatorContext = createContext<Navigator | null>(null);\n","import { useContext } from \"preact/hooks\";\n\nimport { RouterContext } from \"../context\";\n\nimport type { Router } from \"@real-router/core\";\n\nexport const useRouter = (): Router => {\n const router = useContext(RouterContext);\n\n if (!router) {\n throw new Error(\"useRouter must be used within a RouterProvider\");\n }\n\n return router;\n};\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteNodeSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteContext } from \"../types\";\n\nexport function useRouteNode(nodeName: string): RouteContext {\n const router = useRouter();\n\n const store = useMemo(\n () => createRouteNodeSource(router, nodeName),\n [router, nodeName],\n );\n\n const { route, previousRoute } = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n\n const navigator = useMemo(() => getNavigator(router), [router]);\n\n return useMemo(\n (): RouteContext => ({ navigator, route, previousRoute }),\n [navigator, route, previousRoute],\n );\n}\n","import { Match, NotFound } from \"./components\";\nimport { buildRenderList, collectElements } from \"./helpers\";\nimport { useRouteNode } from \"../../hooks/useRouteNode\";\n\nimport type { RouteViewProps } from \"./types\";\nimport type { VNode } from \"preact\";\n\nfunction RouteViewRoot({\n nodeName,\n children,\n}: Readonly<RouteViewProps>): VNode | null {\n const { route } = useRouteNode(nodeName);\n\n if (!route) {\n return null;\n }\n\n const elements: VNode[] = [];\n\n collectElements(children, elements);\n\n const { rendered } = buildRenderList(elements, route.name, nodeName);\n\n if (rendered.length > 0) {\n return <>{rendered}</>;\n }\n\n return null;\n}\n\nRouteViewRoot.displayName = \"RouteView\";\n\nexport const RouteView = Object.assign(RouteViewRoot, { Match, NotFound });\n\nexport type {\n RouteViewProps,\n MatchProps as RouteViewMatchProps,\n NotFoundProps as RouteViewNotFoundProps,\n} from \"./types\";\n","/**\n * Stable empty object for default params\n */\nexport const EMPTY_PARAMS = Object.freeze({});\n\n/**\n * Stable empty options object\n */\nexport const EMPTY_OPTIONS = Object.freeze({});\n","import { useMemo } from \"preact/hooks\";\n\nexport function useStableValue<T>(value: T): T {\n const serialized = JSON.stringify(value);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => value, [serialized]);\n}\n","import { createActiveRouteSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\nimport { useStableValue } from \"./useStableValue\";\n\nimport type { Params } from \"@real-router/core\";\n\nexport function useIsActiveRoute(\n routeName: string,\n params?: Params,\n strict = false,\n ignoreQueryParams = true,\n): boolean {\n const router = useRouter();\n\n const stableParams = useStableValue(params);\n\n const store = useMemo(\n () =>\n createActiveRouteSource(router, routeName, stableParams, {\n strict,\n ignoreQueryParams,\n }),\n [router, routeName, stableParams, strict, ignoreQueryParams],\n );\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { shouldNavigate, buildHref, buildActiveClassName } from \"dom-utils\";\nimport { memo } from \"preact/compat\";\nimport { useCallback, useMemo } from \"preact/hooks\";\n\nimport { EMPTY_PARAMS, EMPTY_OPTIONS } from \"../constants\";\nimport { useIsActiveRoute } from \"../hooks/useIsActiveRoute\";\nimport { useRouter } from \"../hooks/useRouter\";\nimport { useStableValue } from \"../hooks/useStableValue\";\n\nimport type { LinkProps } from \"../types\";\nimport type { FunctionComponent, JSX } from \"preact\";\n\nfunction areLinkPropsEqual(\n prev: Readonly<LinkProps>,\n next: Readonly<LinkProps>,\n): boolean {\n return (\n prev.routeName === next.routeName &&\n prev.className === next.className &&\n prev.activeClassName === next.activeClassName &&\n prev.activeStrict === next.activeStrict &&\n prev.ignoreQueryParams === next.ignoreQueryParams &&\n prev.onClick === next.onClick &&\n prev.target === next.target &&\n prev.style === next.style &&\n prev.children === next.children &&\n JSON.stringify(prev.routeParams) === JSON.stringify(next.routeParams) &&\n JSON.stringify(prev.routeOptions) === JSON.stringify(next.routeOptions)\n );\n}\n\nexport const Link: FunctionComponent<LinkProps> = memo(\n ({\n routeName,\n routeParams = EMPTY_PARAMS,\n routeOptions = EMPTY_OPTIONS,\n className,\n activeClassName = \"active\",\n activeStrict = false,\n ignoreQueryParams = true,\n onClick,\n target,\n children,\n ...props\n }) => {\n const router = useRouter();\n\n const stableParams = useStableValue(routeParams);\n const stableOptions = useStableValue(routeOptions);\n\n const isActive = useIsActiveRoute(\n routeName,\n stableParams,\n activeStrict,\n ignoreQueryParams,\n );\n\n const href = useMemo(\n () => buildHref(router, routeName, stableParams),\n [router, routeName, stableParams],\n );\n\n const handleClick = useCallback(\n (evt: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {\n if (onClick) {\n onClick(evt);\n\n if (evt.defaultPrevented) {\n return;\n }\n }\n\n if (!shouldNavigate(evt) || target === \"_blank\") {\n return;\n }\n\n evt.preventDefault();\n router.navigate(routeName, stableParams, stableOptions).catch(() => {});\n },\n [onClick, target, router, routeName, stableParams, stableOptions],\n );\n\n const finalClassName = useMemo(\n () => buildActiveClassName(isActive, activeClassName, className),\n [isActive, activeClassName, className],\n );\n\n return (\n <a\n {...props}\n href={href}\n className={finalClassName}\n onClick={handleClick}\n >\n {children}\n </a>\n );\n },\n areLinkPropsEqual,\n);\n\nLink.displayName = \"Link\";\n","import { createErrorSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { RouterErrorSnapshot, RouterSource } from \"@real-router/sources\";\n\nconst cache = new WeakMap<Router, RouterSource<RouterErrorSnapshot>>();\n\nexport function useRouterError(): RouterErrorSnapshot {\n const router = useRouter();\n\n const store = useMemo(() => {\n let source = cache.get(router);\n\n if (!source) {\n source = createErrorSource(router);\n cache.set(router, source);\n }\n\n return source;\n }, [router]);\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { Fragment } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\n\nimport { useRouterError } from \"../hooks/useRouterError\";\n\nimport type { RouterError, State } from \"@real-router/core\";\nimport type { ComponentChildren, VNode } from \"preact\";\n\nexport interface RouterErrorBoundaryProps {\n readonly children: ComponentChildren;\n readonly fallback: (\n error: RouterError,\n resetError: () => void,\n ) => ComponentChildren;\n readonly onError?: (\n error: RouterError,\n toRoute: State | null,\n fromRoute: State | null,\n ) => void;\n}\n\nexport function RouterErrorBoundary({\n children,\n fallback,\n onError,\n}: RouterErrorBoundaryProps): VNode {\n const snapshot = useRouterError();\n const [dismissedVersion, setDismissedVersion] = useState(-1);\n\n const onErrorRef = useRef(onError);\n\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (snapshot.error) {\n onErrorRef.current?.(\n snapshot.error,\n snapshot.toRoute,\n snapshot.fromRoute,\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- onError tracked via ref, snapshot fields accessed inside callback\n }, [snapshot.version]);\n\n const visibleError =\n snapshot.version > dismissedVersion ? snapshot.error : null;\n\n const resetError = useCallback(() => {\n setDismissedVersion(snapshot.version);\n }, [snapshot.version]);\n\n return (\n <Fragment>\n {children}\n {visibleError ? fallback(visibleError, resetError) : null}\n </Fragment>\n );\n}\n","import { useContext } from \"preact/hooks\";\n\nimport { NavigatorContext } from \"../context\";\n\nimport type { Navigator } from \"@real-router/core\";\n\nexport const useNavigator = (): Navigator => {\n const navigator = useContext(NavigatorContext);\n\n if (!navigator) {\n throw new Error(\"useNavigator must be used within a RouterProvider\");\n }\n\n return navigator;\n};\n","import { getPluginApi } from \"@real-router/core/api\";\nimport { getRouteUtils } from \"@real-router/route-utils\";\n\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteUtils } from \"@real-router/route-utils\";\n\nexport const useRouteUtils = (): RouteUtils => {\n const router = useRouter();\n\n return getRouteUtils(getPluginApi(router).getTree());\n};\n","import { useContext } from \"preact/hooks\";\n\nimport { RouteContext } from \"../context\";\n\nimport type { RouteContext as RouteContextType } from \"../types\";\n\nexport const useRoute = (): RouteContextType => {\n const routeContext = useContext(RouteContext);\n\n if (!routeContext) {\n throw new Error(\"useRoute must be used within a RouteProvider\");\n }\n\n return routeContext;\n};\n","import { createTransitionSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouterTransitionSnapshot } from \"@real-router/sources\";\n\nexport function useRouterTransition(): RouterTransitionSnapshot {\n const router = useRouter();\n\n const store = useMemo(() => createTransitionSource(router), [router]);\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { createRouteAnnouncer } from \"dom-utils\";\nimport { useEffect, useMemo } from \"preact/hooks\";\n\nimport { NavigatorContext, RouteContext, RouterContext } from \"./context\";\nimport { useSyncExternalStore } from \"./useSyncExternalStore\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { FunctionComponent, ComponentChildren } from \"preact\";\n\nexport interface RouteProviderProps {\n router: Router;\n children: ComponentChildren;\n announceNavigation?: boolean;\n}\n\nexport const RouterProvider: FunctionComponent<RouteProviderProps> = ({\n router,\n children,\n announceNavigation,\n}) => {\n useEffect(() => {\n if (!announceNavigation) {\n return;\n }\n\n const announcer = createRouteAnnouncer(router);\n\n return () => {\n announcer.destroy();\n };\n }, [announceNavigation, router]);\n const navigator = useMemo(() => getNavigator(router), [router]);\n\n // useSyncExternalStore manages the router subscription lifecycle:\n // subscribe connects to router on first listener, unsubscribes on last.\n const store = useMemo(() => createRouteSource(router), [router]);\n const { route, previousRoute } = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot, // SSR: router returns same state on server and client\n );\n\n const routeContextValue = useMemo(\n () => ({ navigator, route, previousRoute }),\n [navigator, route, previousRoute],\n );\n\n return (\n <RouterContext.Provider value={router}>\n <NavigatorContext.Provider value={navigator}>\n <RouteContext.Provider value={routeContextValue}>\n {children}\n </RouteContext.Provider>\n </NavigatorContext.Provider>\n </RouterContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/components/RouteView/components.tsx","../../src/components/RouteView/helpers.tsx","../../src/useSyncExternalStore.ts","../../src/context.ts","../../src/hooks/useRouter.tsx","../../src/hooks/useRouteNode.tsx","../../src/components/RouteView/RouteView.tsx","../../src/constants.ts","../../src/hooks/useStableValue.tsx","../../src/hooks/useIsActiveRoute.tsx","../../src/components/Link.tsx","../../src/hooks/useRouterError.tsx","../../src/components/RouterErrorBoundary.tsx","../../src/hooks/useNavigator.tsx","../../src/hooks/useRouteUtils.tsx","../../src/hooks/useRoute.tsx","../../src/hooks/useRouterTransition.tsx","../../src/RouterProvider.tsx"],"sourcesContent":["import type { MatchProps, NotFoundProps } from \"./types\";\n\nexport function Match(_props: MatchProps): null {\n return null;\n}\n\nMatch.displayName = \"RouteView.Match\";\n\nexport function NotFound(_props: NotFoundProps): null {\n return null;\n}\n\nNotFound.displayName = \"RouteView.NotFound\";\n","import { UNKNOWN_ROUTE } from \"@real-router/core\";\nimport { startsWithSegment } from \"@real-router/route-utils\";\nimport { Fragment, isValidElement, toChildArray } from \"preact\";\nimport { Suspense } from \"preact/compat\";\n\nimport { Match, NotFound } from \"./components\";\n\nimport type { MatchProps, NotFoundProps } from \"./types\";\nimport type { VNode, ComponentChildren } from \"preact\";\n\nfunction isSegmentMatch(\n routeName: string,\n fullSegmentName: string,\n exact: boolean,\n): boolean {\n if (exact) {\n return routeName === fullSegmentName;\n }\n\n return startsWithSegment(routeName, fullSegmentName);\n}\n\nexport function collectElements(\n children: ComponentChildren,\n result: VNode[],\n): void {\n for (const child of toChildArray(children)) {\n if (!isValidElement(child)) {\n continue;\n }\n\n if (child.type === Match || child.type === NotFound) {\n result.push(child);\n } else {\n collectElements(\n (child.props as { readonly children: ComponentChildren }).children,\n result,\n );\n }\n }\n}\n\nexport function buildRenderList(\n elements: VNode[],\n routeName: string,\n nodeName: string,\n): { rendered: VNode[]; activeMatchFound: boolean } {\n let notFoundChildren: ComponentChildren = null;\n let activeMatchFound = false;\n const rendered: VNode[] = [];\n\n for (const child of elements) {\n if (child.type === NotFound) {\n notFoundChildren = (child.props as NotFoundProps).children;\n continue;\n }\n\n const { segment, exact = false, fallback } = child.props as MatchProps;\n const fullSegmentName = nodeName ? `${nodeName}.${segment}` : segment;\n const isActive =\n !activeMatchFound && isSegmentMatch(routeName, fullSegmentName, exact);\n\n if (isActive) {\n activeMatchFound = true;\n const matchChildren = (child.props as MatchProps).children;\n const content =\n fallback === undefined ? (\n matchChildren\n ) : (\n <Suspense fallback={fallback}>{matchChildren}</Suspense>\n );\n\n rendered.push(<Fragment key={fullSegmentName}>{content}</Fragment>);\n }\n }\n\n if (\n !activeMatchFound &&\n routeName === UNKNOWN_ROUTE &&\n notFoundChildren !== null\n ) {\n rendered.push(\n <Fragment key=\"__route-view-not-found__\">{notFoundChildren}</Fragment>,\n );\n }\n\n return { rendered, activeMatchFound };\n}\n","import { useEffect, useState } from \"preact/hooks\";\n\n/**\n * Polyfill for React's useSyncExternalStore.\n *\n * Preact does not provide a native useSyncExternalStore.\n * This implementation uses useState + useEffect to subscribe\n * to external stores.\n *\n * Race condition handling: the value may change between\n * `useState(getSnapshot)` (render) and `useEffect` (commit).\n * We synchronize by calling `setValue(getSnapshot())` before\n * subscribing in the effect.\n */\nexport function useSyncExternalStore<T>(\n subscribe: (onStoreChange: () => void) => () => void,\n getSnapshot: () => T,\n _getServerSnapshot?: () => T,\n): T {\n const [value, setValue] = useState(getSnapshot);\n\n useEffect(() => {\n // Synchronize before subscribing to handle race condition\n setValue(getSnapshot());\n\n return subscribe(() => {\n setValue(getSnapshot());\n });\n }, [subscribe, getSnapshot]);\n\n return value;\n}\n","import { createContext } from \"preact\";\n\nimport type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport const NavigatorContext = createContext<Navigator | null>(null);\n","import { useContext } from \"preact/hooks\";\n\nimport { RouterContext } from \"../context\";\n\nimport type { Router } from \"@real-router/core\";\n\nexport const useRouter = (): Router => {\n const router = useContext(RouterContext);\n\n if (!router) {\n throw new Error(\"useRouter must be used within a RouterProvider\");\n }\n\n return router;\n};\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteNodeSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteContext } from \"../types\";\n\nexport function useRouteNode(nodeName: string): RouteContext {\n const router = useRouter();\n\n const store = useMemo(\n () => createRouteNodeSource(router, nodeName),\n [router, nodeName],\n );\n\n const { route, previousRoute } = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n\n const navigator = useMemo(() => getNavigator(router), [router]);\n\n return useMemo(\n (): RouteContext => ({ navigator, route, previousRoute }),\n [navigator, route, previousRoute],\n );\n}\n","import { Match, NotFound } from \"./components\";\nimport { buildRenderList, collectElements } from \"./helpers\";\nimport { useRouteNode } from \"../../hooks/useRouteNode\";\n\nimport type { RouteViewProps } from \"./types\";\nimport type { VNode } from \"preact\";\n\nfunction RouteViewRoot({\n nodeName,\n children,\n}: Readonly<RouteViewProps>): VNode | null {\n const { route } = useRouteNode(nodeName);\n\n if (!route) {\n return null;\n }\n\n const elements: VNode[] = [];\n\n collectElements(children, elements);\n\n const { rendered } = buildRenderList(elements, route.name, nodeName);\n\n if (rendered.length > 0) {\n return <>{rendered}</>;\n }\n\n return null;\n}\n\nRouteViewRoot.displayName = \"RouteView\";\n\nexport const RouteView = Object.assign(RouteViewRoot, { Match, NotFound });\n\nexport type {\n RouteViewProps,\n MatchProps as RouteViewMatchProps,\n NotFoundProps as RouteViewNotFoundProps,\n} from \"./types\";\n","/**\n * Stable empty object for default params\n */\nexport const EMPTY_PARAMS = Object.freeze({});\n\n/**\n * Stable empty options object\n */\nexport const EMPTY_OPTIONS = Object.freeze({});\n","import { useMemo } from \"preact/hooks\";\n\nexport function useStableValue<T>(value: T): T {\n const serialized = JSON.stringify(value);\n\n // eslint-disable-next-line @eslint-react/exhaustive-deps\n return useMemo(() => value, [serialized]);\n}\n","import { createActiveRouteSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\nimport { useStableValue } from \"./useStableValue\";\n\nimport type { Params } from \"@real-router/core\";\n\nexport function useIsActiveRoute(\n routeName: string,\n params?: Params,\n strict = false,\n ignoreQueryParams = true,\n): boolean {\n const router = useRouter();\n\n const stableParams = useStableValue(params);\n\n const store = useMemo(\n () =>\n createActiveRouteSource(router, routeName, stableParams, {\n strict,\n ignoreQueryParams,\n }),\n [router, routeName, stableParams, strict, ignoreQueryParams],\n );\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { shouldNavigate, buildHref, buildActiveClassName } from \"dom-utils\";\nimport { memo } from \"preact/compat\";\nimport { useCallback, useMemo } from \"preact/hooks\";\n\nimport { EMPTY_PARAMS, EMPTY_OPTIONS } from \"../constants\";\nimport { useIsActiveRoute } from \"../hooks/useIsActiveRoute\";\nimport { useRouter } from \"../hooks/useRouter\";\nimport { useStableValue } from \"../hooks/useStableValue\";\n\nimport type { LinkProps } from \"../types\";\nimport type { FunctionComponent, JSX } from \"preact\";\n\nfunction areLinkPropsEqual(\n prev: Readonly<LinkProps>,\n next: Readonly<LinkProps>,\n): boolean {\n return (\n prev.routeName === next.routeName &&\n prev.className === next.className &&\n prev.activeClassName === next.activeClassName &&\n prev.activeStrict === next.activeStrict &&\n prev.ignoreQueryParams === next.ignoreQueryParams &&\n prev.onClick === next.onClick &&\n prev.target === next.target &&\n prev.style === next.style &&\n prev.children === next.children &&\n JSON.stringify(prev.routeParams) === JSON.stringify(next.routeParams) &&\n JSON.stringify(prev.routeOptions) === JSON.stringify(next.routeOptions)\n );\n}\n\nexport const Link: FunctionComponent<LinkProps> = memo(\n ({\n routeName,\n routeParams = EMPTY_PARAMS,\n routeOptions = EMPTY_OPTIONS,\n className,\n activeClassName = \"active\",\n activeStrict = false,\n ignoreQueryParams = true,\n onClick,\n target,\n children,\n ...props\n }) => {\n const router = useRouter();\n\n const stableParams = useStableValue(routeParams);\n const stableOptions = useStableValue(routeOptions);\n\n const isActive = useIsActiveRoute(\n routeName,\n stableParams,\n activeStrict,\n ignoreQueryParams,\n );\n\n const href = useMemo(\n () => buildHref(router, routeName, stableParams),\n [router, routeName, stableParams],\n );\n\n const handleClick = useCallback(\n (evt: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {\n if (onClick) {\n onClick(evt);\n\n if (evt.defaultPrevented) {\n return;\n }\n }\n\n if (!shouldNavigate(evt) || target === \"_blank\") {\n return;\n }\n\n evt.preventDefault();\n router.navigate(routeName, stableParams, stableOptions).catch(() => {});\n },\n [onClick, target, router, routeName, stableParams, stableOptions],\n );\n\n const finalClassName = useMemo(\n () => buildActiveClassName(isActive, activeClassName, className),\n [isActive, activeClassName, className],\n );\n\n return (\n <a\n {...props}\n href={href}\n className={finalClassName}\n onClick={handleClick}\n >\n {children}\n </a>\n );\n },\n areLinkPropsEqual,\n);\n\nLink.displayName = \"Link\";\n","import { createErrorSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { RouterErrorSnapshot, RouterSource } from \"@real-router/sources\";\n\nconst cache = new WeakMap<Router, RouterSource<RouterErrorSnapshot>>();\n\nexport function useRouterError(): RouterErrorSnapshot {\n const router = useRouter();\n\n const store = useMemo(() => {\n let source = cache.get(router);\n\n if (!source) {\n source = createErrorSource(router);\n cache.set(router, source);\n }\n\n return source;\n }, [router]);\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { Fragment } from \"preact\";\nimport { useCallback, useEffect, useRef, useState } from \"preact/hooks\";\n\nimport { useRouterError } from \"../hooks/useRouterError\";\n\nimport type { RouterError, State } from \"@real-router/core\";\nimport type { ComponentChildren, VNode } from \"preact\";\n\nexport interface RouterErrorBoundaryProps {\n readonly children: ComponentChildren;\n readonly fallback: (\n error: RouterError,\n resetError: () => void,\n ) => ComponentChildren;\n readonly onError?: (\n error: RouterError,\n toRoute: State | null,\n fromRoute: State | null,\n ) => void;\n}\n\nexport function RouterErrorBoundary({\n children,\n fallback,\n onError,\n}: RouterErrorBoundaryProps): VNode {\n const snapshot = useRouterError();\n const [dismissedVersion, setDismissedVersion] = useState(-1);\n\n const onErrorRef = useRef(onError);\n\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (snapshot.error) {\n onErrorRef.current?.(\n snapshot.error,\n snapshot.toRoute,\n snapshot.fromRoute,\n );\n }\n // eslint-disable-next-line @eslint-react/exhaustive-deps -- onError tracked via ref, snapshot fields accessed inside callback\n }, [snapshot.version]);\n\n const visibleError =\n snapshot.version > dismissedVersion ? snapshot.error : null;\n\n const resetError = useCallback(() => {\n setDismissedVersion(snapshot.version);\n }, [snapshot.version]);\n\n return (\n <Fragment>\n {children}\n {visibleError ? fallback(visibleError, resetError) : null}\n </Fragment>\n );\n}\n","import { useContext } from \"preact/hooks\";\n\nimport { NavigatorContext } from \"../context\";\n\nimport type { Navigator } from \"@real-router/core\";\n\nexport const useNavigator = (): Navigator => {\n const navigator = useContext(NavigatorContext);\n\n if (!navigator) {\n throw new Error(\"useNavigator must be used within a RouterProvider\");\n }\n\n return navigator;\n};\n","import { getPluginApi } from \"@real-router/core/api\";\nimport { getRouteUtils } from \"@real-router/route-utils\";\n\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteUtils } from \"@real-router/route-utils\";\n\nexport const useRouteUtils = (): RouteUtils => {\n const router = useRouter();\n\n return getRouteUtils(getPluginApi(router).getTree());\n};\n","import { useContext } from \"preact/hooks\";\n\nimport { RouteContext } from \"../context\";\n\nimport type { RouteContext as RouteContextType } from \"../types\";\n\nexport const useRoute = (): RouteContextType => {\n const routeContext = useContext(RouteContext);\n\n if (!routeContext) {\n throw new Error(\"useRoute must be used within a RouteProvider\");\n }\n\n return routeContext;\n};\n","import { createTransitionSource } from \"@real-router/sources\";\nimport { useMemo } from \"preact/hooks\";\n\nimport { useSyncExternalStore } from \"../useSyncExternalStore\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouterTransitionSnapshot } from \"@real-router/sources\";\n\nexport function useRouterTransition(): RouterTransitionSnapshot {\n const router = useRouter();\n\n const store = useMemo(() => createTransitionSource(router), [router]);\n\n return useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot,\n );\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { createRouteAnnouncer } from \"dom-utils\";\nimport { useEffect, useMemo } from \"preact/hooks\";\n\nimport { NavigatorContext, RouteContext, RouterContext } from \"./context\";\nimport { useSyncExternalStore } from \"./useSyncExternalStore\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { FunctionComponent, ComponentChildren } from \"preact\";\n\nexport interface RouteProviderProps {\n router: Router;\n children: ComponentChildren;\n announceNavigation?: boolean;\n}\n\nexport const RouterProvider: FunctionComponent<RouteProviderProps> = ({\n router,\n children,\n announceNavigation,\n}) => {\n useEffect(() => {\n if (!announceNavigation) {\n return;\n }\n\n const announcer = createRouteAnnouncer(router);\n\n return () => {\n announcer.destroy();\n };\n }, [announceNavigation, router]);\n const navigator = useMemo(() => getNavigator(router), [router]);\n\n // useSyncExternalStore manages the router subscription lifecycle:\n // subscribe connects to router on first listener, unsubscribes on last.\n const store = useMemo(() => createRouteSource(router), [router]);\n const { route, previousRoute } = useSyncExternalStore(\n store.subscribe,\n store.getSnapshot,\n store.getSnapshot, // SSR: router returns same state on server and client\n );\n\n const routeContextValue = useMemo(\n () => ({ navigator, route, previousRoute }),\n [navigator, route, previousRoute],\n );\n\n return (\n <RouterContext.Provider value={router}>\n <NavigatorContext.Provider value={navigator}>\n <RouteContext.Provider value={routeContextValue}>\n {children}\n </RouteContext.Provider>\n </NavigatorContext.Provider>\n </RouterContext.Provider>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@real-router/preact",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "type": "commonjs",
5
5
  "description": "Preact integration for Real-Router",
6
6
  "main": "./dist/cjs/index.js",
@@ -48,10 +48,10 @@
48
48
  "license": "MIT",
49
49
  "sideEffects": false,
50
50
  "dependencies": {
51
- "@real-router/core": "^0.40.1",
52
- "@real-router/route-utils": "^0.1.6",
53
- "@real-router/sources": "^0.3.0",
54
- "dom-utils": "^0.2.2"
51
+ "@real-router/core": "^0.41.0",
52
+ "@real-router/route-utils": "^0.1.7",
53
+ "@real-router/sources": "^0.3.1",
54
+ "dom-utils": "^0.2.3"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@testing-library/dom": "10.4.1",
@@ -59,19 +59,19 @@
59
59
  "@testing-library/preact": "3.2.4",
60
60
  "@testing-library/user-event": "14.6.1",
61
61
  "preact": "10.25.4",
62
- "@real-router/browser-plugin": "^0.10.6"
62
+ "@real-router/browser-plugin": "^0.11.0"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "preact": ">=10.0.0"
66
66
  },
67
67
  "scripts": {
68
- "build": "tsup",
68
+ "build": "tsdown --config-loader unrun",
69
69
  "test": "vitest",
70
70
  "test:stress": "vitest run --config vitest.config.stress.mts",
71
71
  "type-check": "tsc --noEmit",
72
72
  "lint": "eslint --cache --ext .ts,.tsx src/ tests/ --fix --max-warnings 0",
73
73
  "lint:package": "publint",
74
74
  "lint:types": "attw --pack .",
75
- "build:dist-only": "tsup"
75
+ "build:dist-only": "tsdown --config-loader unrun"
76
76
  }
77
77
  }
@@ -39,7 +39,7 @@ export function RouterErrorBoundary({
39
39
  snapshot.fromRoute,
40
40
  );
41
41
  }
42
- // eslint-disable-next-line react-hooks/exhaustive-deps -- onError tracked via ref, snapshot fields accessed inside callback
42
+ // eslint-disable-next-line @eslint-react/exhaustive-deps -- onError tracked via ref, snapshot fields accessed inside callback
43
43
  }, [snapshot.version]);
44
44
 
45
45
  const visibleError =
@@ -3,6 +3,6 @@ import { useMemo } from "preact/hooks";
3
3
  export function useStableValue<T>(value: T): T {
4
4
  const serialized = JSON.stringify(value);
5
5
 
6
- // eslint-disable-next-line react-hooks/exhaustive-deps
6
+ // eslint-disable-next-line @eslint-react/exhaustive-deps
7
7
  return useMemo(() => value, [serialized]);
8
8
  }
package/src/types.ts CHANGED
@@ -6,11 +6,8 @@ import type {
6
6
  } from "@real-router/core";
7
7
  import type { JSX } from "preact";
8
8
 
9
- export interface RouteState<
10
- P extends Params = Params,
11
- MP extends Params = Params,
12
- > {
13
- route: State<P, MP> | undefined;
9
+ export interface RouteState<P extends Params = Params> {
10
+ route: State<P> | undefined;
14
11
  previousRoute?: State | undefined;
15
12
  }
16
13
 
@@ -1 +0,0 @@
1
- {"inputs":{"../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js":{"bytes":569,"imports":[],"format":"esm"},"src/components/RouteView/components.tsx":{"bytes":286,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/components/RouteView/helpers.tsx":{"bytes":2348,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/route-utils","kind":"import-statement","external":true},{"path":"preact","kind":"import-statement","external":true},{"path":"preact/compat","kind":"import-statement","external":true},{"path":"src/components/RouteView/components.tsx","kind":"import-statement","original":"./components"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/useSyncExternalStore.ts":{"bytes":911,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/context.ts":{"bytes":379,"imports":[{"path":"preact","kind":"import-statement","external":true},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRouter.tsx":{"bytes":338,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/context.ts","kind":"import-statement","original":"../context"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRouteNode.tsx":{"bytes":831,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"../useSyncExternalStore"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/components/RouteView/RouteView.tsx":{"bytes":905,"imports":[{"path":"src/components/RouteView/components.tsx","kind":"import-statement","original":"./components"},{"path":"src/components/RouteView/helpers.tsx","kind":"import-statement","original":"./helpers"},{"path":"src/hooks/useRouteNode.tsx","kind":"import-statement","original":"../../hooks/useRouteNode"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/components/RouteView/index.ts":{"bytes":145,"imports":[{"path":"src/components/RouteView/RouteView.tsx","kind":"import-statement","original":"./RouteView"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/constants.ts":{"bytes":185,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useStableValue.tsx":{"bytes":240,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useIsActiveRoute.tsx":{"bytes":854,"imports":[{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"../useSyncExternalStore"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"},{"path":"src/hooks/useStableValue.tsx","kind":"import-statement","original":"./useStableValue"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/components/Link.tsx":{"bytes":2766,"imports":[{"path":"dom-utils","kind":"import-statement","external":true},{"path":"preact/compat","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"../constants"},{"path":"src/hooks/useIsActiveRoute.tsx","kind":"import-statement","original":"../hooks/useIsActiveRoute"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"../hooks/useRouter"},{"path":"src/hooks/useStableValue.tsx","kind":"import-statement","original":"../hooks/useStableValue"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRouterError.tsx":{"bytes":805,"imports":[{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"../useSyncExternalStore"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/components/RouterErrorBoundary.tsx":{"bytes":1529,"imports":[{"path":"preact","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/hooks/useRouterError.tsx","kind":"import-statement","original":"../hooks/useRouterError"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useNavigator.tsx":{"bytes":365,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/context.ts","kind":"import-statement","original":"../context"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRouteUtils.tsx":{"bytes":355,"imports":[{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"@real-router/route-utils","kind":"import-statement","external":true},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRoute.tsx":{"bytes":378,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/context.ts","kind":"import-statement","original":"../context"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRouterTransition.tsx":{"bytes":557,"imports":[{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"../useSyncExternalStore"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/RouterProvider.tsx":{"bytes":1815,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"dom-utils","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/context.ts","kind":"import-statement","original":"./context"},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"./useSyncExternalStore"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":1030,"imports":[{"path":"src/components/RouteView/index.ts","kind":"import-statement","original":"./components/RouteView"},{"path":"src/components/Link.tsx","kind":"import-statement","original":"./components/Link"},{"path":"src/components/RouterErrorBoundary.tsx","kind":"import-statement","original":"./components/RouterErrorBoundary"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./hooks/useRouter"},{"path":"src/hooks/useNavigator.tsx","kind":"import-statement","original":"./hooks/useNavigator"},{"path":"src/hooks/useRouteUtils.tsx","kind":"import-statement","original":"./hooks/useRouteUtils"},{"path":"src/hooks/useRoute.tsx","kind":"import-statement","original":"./hooks/useRoute"},{"path":"src/hooks/useRouteNode.tsx","kind":"import-statement","original":"./hooks/useRouteNode"},{"path":"src/hooks/useRouterTransition.tsx","kind":"import-statement","original":"./hooks/useRouterTransition"},{"path":"src/RouterProvider.tsx","kind":"import-statement","original":"./RouterProvider"},{"path":"src/context.ts","kind":"import-statement","original":"./context"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/cjs/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":24741},"dist/cjs/index.js":{"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/route-utils","kind":"import-statement","external":true},{"path":"preact","kind":"import-statement","external":true},{"path":"preact/compat","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true},{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true},{"path":"dom-utils","kind":"import-statement","external":true},{"path":"preact/compat","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true},{"path":"preact","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"@real-router/route-utils","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"dom-utils","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"exports":["Link","NavigatorContext","RouteContext","RouteView","RouterContext","RouterErrorBoundary","RouterProvider","useNavigator","useRoute","useRouteNode","useRouteUtils","useRouter","useRouterTransition"],"entryPoint":"src/index.ts","inputs":{"src/components/RouteView/components.tsx":{"bytesInOutput":171},"src/components/RouteView/helpers.tsx":{"bytesInOutput":1879},"src/hooks/useRouteNode.tsx":{"bytesInOutput":627},"src/useSyncExternalStore.ts":{"bytesInOutput":346},"src/hooks/useRouter.tsx":{"bytesInOutput":223},"src/context.ts":{"bytesInOutput":165},"src/components/RouteView/RouteView.tsx":{"bytesInOutput":567},"src/components/RouteView/index.ts":{"bytesInOutput":0},"src/index.ts":{"bytesInOutput":0},"src/components/Link.tsx":{"bytesInOutput":2315},"src/constants.ts":{"bytesInOutput":77},"src/hooks/useIsActiveRoute.tsx":{"bytesInOutput":597},"src/hooks/useStableValue.tsx":{"bytesInOutput":177},"src/components/RouterErrorBoundary.tsx":{"bytesInOutput":977},"src/hooks/useRouterError.tsx":{"bytesInOutput":519},"src/hooks/useNavigator.tsx":{"bytesInOutput":257},"src/hooks/useRouteUtils.tsx":{"bytesInOutput":229},"src/hooks/useRoute.tsx":{"bytesInOutput":253},"src/hooks/useRouterTransition.tsx":{"bytesInOutput":356},"src/RouterProvider.tsx":{"bytesInOutput":1298}},"bytes":12006}}}
@@ -1 +0,0 @@
1
- {"inputs":{"src/components/RouteView/components.tsx":{"bytes":286,"imports":[],"format":"esm"},"src/components/RouteView/helpers.tsx":{"bytes":2348,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/route-utils","kind":"import-statement","external":true},{"path":"preact","kind":"import-statement","external":true},{"path":"preact/compat","kind":"import-statement","external":true},{"path":"src/components/RouteView/components.tsx","kind":"import-statement","original":"./components"},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/useSyncExternalStore.ts":{"bytes":911,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true}],"format":"esm"},"src/context.ts":{"bytes":379,"imports":[{"path":"preact","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRouter.tsx":{"bytes":338,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"src/hooks/useRouteNode.tsx":{"bytes":831,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"../useSyncExternalStore"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"}],"format":"esm"},"src/components/RouteView/RouteView.tsx":{"bytes":905,"imports":[{"path":"src/components/RouteView/components.tsx","kind":"import-statement","original":"./components"},{"path":"src/components/RouteView/helpers.tsx","kind":"import-statement","original":"./helpers"},{"path":"src/hooks/useRouteNode.tsx","kind":"import-statement","original":"../../hooks/useRouteNode"},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/components/RouteView/index.ts":{"bytes":145,"imports":[{"path":"src/components/RouteView/RouteView.tsx","kind":"import-statement","original":"./RouteView"}],"format":"esm"},"src/constants.ts":{"bytes":185,"imports":[],"format":"esm"},"src/hooks/useStableValue.tsx":{"bytes":240,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useIsActiveRoute.tsx":{"bytes":854,"imports":[{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"../useSyncExternalStore"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"},{"path":"src/hooks/useStableValue.tsx","kind":"import-statement","original":"./useStableValue"}],"format":"esm"},"src/components/Link.tsx":{"bytes":2766,"imports":[{"path":"dom-utils","kind":"import-statement","external":true},{"path":"preact/compat","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/constants.ts","kind":"import-statement","original":"../constants"},{"path":"src/hooks/useIsActiveRoute.tsx","kind":"import-statement","original":"../hooks/useIsActiveRoute"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"../hooks/useRouter"},{"path":"src/hooks/useStableValue.tsx","kind":"import-statement","original":"../hooks/useStableValue"},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useRouterError.tsx":{"bytes":805,"imports":[{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"../useSyncExternalStore"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"}],"format":"esm"},"src/components/RouterErrorBoundary.tsx":{"bytes":1529,"imports":[{"path":"preact","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/hooks/useRouterError.tsx","kind":"import-statement","original":"../hooks/useRouterError"},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/hooks/useNavigator.tsx":{"bytes":365,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"src/hooks/useRouteUtils.tsx":{"bytes":355,"imports":[{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"@real-router/route-utils","kind":"import-statement","external":true},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"}],"format":"esm"},"src/hooks/useRoute.tsx":{"bytes":378,"imports":[{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/context.ts","kind":"import-statement","original":"../context"}],"format":"esm"},"src/hooks/useRouterTransition.tsx":{"bytes":557,"imports":[{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"../useSyncExternalStore"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./useRouter"}],"format":"esm"},"src/RouterProvider.tsx":{"bytes":1815,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"dom-utils","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"src/context.ts","kind":"import-statement","original":"./context"},{"path":"src/useSyncExternalStore.ts","kind":"import-statement","original":"./useSyncExternalStore"},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":1030,"imports":[{"path":"src/components/RouteView/index.ts","kind":"import-statement","original":"./components/RouteView"},{"path":"src/components/Link.tsx","kind":"import-statement","original":"./components/Link"},{"path":"src/components/RouterErrorBoundary.tsx","kind":"import-statement","original":"./components/RouterErrorBoundary"},{"path":"src/hooks/useRouter.tsx","kind":"import-statement","original":"./hooks/useRouter"},{"path":"src/hooks/useNavigator.tsx","kind":"import-statement","original":"./hooks/useNavigator"},{"path":"src/hooks/useRouteUtils.tsx","kind":"import-statement","original":"./hooks/useRouteUtils"},{"path":"src/hooks/useRoute.tsx","kind":"import-statement","original":"./hooks/useRoute"},{"path":"src/hooks/useRouteNode.tsx","kind":"import-statement","original":"./hooks/useRouteNode"},{"path":"src/hooks/useRouterTransition.tsx","kind":"import-statement","original":"./hooks/useRouterTransition"},{"path":"src/RouterProvider.tsx","kind":"import-statement","original":"./RouterProvider"},{"path":"src/context.ts","kind":"import-statement","original":"./context"}],"format":"esm"}},"outputs":{"dist/esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":24741},"dist/esm/index.mjs":{"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/route-utils","kind":"import-statement","external":true},{"path":"preact","kind":"import-statement","external":true},{"path":"preact/compat","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true},{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true},{"path":"dom-utils","kind":"import-statement","external":true},{"path":"preact/compat","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true},{"path":"preact","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"@real-router/route-utils","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/sources","kind":"import-statement","external":true},{"path":"dom-utils","kind":"import-statement","external":true},{"path":"preact/hooks","kind":"import-statement","external":true},{"path":"preact/jsx-runtime","kind":"import-statement","external":true}],"exports":["Link","NavigatorContext","RouteContext","RouteView","RouterContext","RouterErrorBoundary","RouterProvider","useNavigator","useRoute","useRouteNode","useRouteUtils","useRouter","useRouterTransition"],"entryPoint":"src/index.ts","inputs":{"src/components/RouteView/components.tsx":{"bytesInOutput":171},"src/components/RouteView/helpers.tsx":{"bytesInOutput":1879},"src/hooks/useRouteNode.tsx":{"bytesInOutput":627},"src/useSyncExternalStore.ts":{"bytesInOutput":346},"src/hooks/useRouter.tsx":{"bytesInOutput":223},"src/context.ts":{"bytesInOutput":165},"src/components/RouteView/RouteView.tsx":{"bytesInOutput":567},"src/components/RouteView/index.ts":{"bytesInOutput":0},"src/index.ts":{"bytesInOutput":0},"src/components/Link.tsx":{"bytesInOutput":2315},"src/constants.ts":{"bytesInOutput":77},"src/hooks/useIsActiveRoute.tsx":{"bytesInOutput":597},"src/hooks/useStableValue.tsx":{"bytesInOutput":177},"src/components/RouterErrorBoundary.tsx":{"bytesInOutput":977},"src/hooks/useRouterError.tsx":{"bytesInOutput":519},"src/hooks/useNavigator.tsx":{"bytesInOutput":257},"src/hooks/useRouteUtils.tsx":{"bytesInOutput":229},"src/hooks/useRoute.tsx":{"bytesInOutput":253},"src/hooks/useRouterTransition.tsx":{"bytesInOutput":356},"src/RouterProvider.tsx":{"bytesInOutput":1298}},"bytes":12006}}}