@real-router/vue 0.2.4 → 0.3.0

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.
@@ -13,6 +13,7 @@ interface MatchProps {
13
13
  readonly segment: string;
14
14
  readonly exact?: boolean;
15
15
  readonly fallback?: VNode | (() => VNode);
16
+ readonly keepAlive?: boolean;
16
17
  }
17
18
  type NotFoundProps = Record<string, never>;
18
19
  //#endregion
@@ -76,6 +77,10 @@ declare const RouteView: {
76
77
  type: _$vue.PropType<VNode | (() => VNode)>;
77
78
  default: undefined;
78
79
  };
80
+ keepAlive: {
81
+ type: BooleanConstructor;
82
+ default: boolean;
83
+ };
79
84
  }>, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<_$vue.ExtractPropTypes<{
80
85
  segment: {
81
86
  type: _$vue.PropType<string>;
@@ -89,10 +94,15 @@ declare const RouteView: {
89
94
  type: _$vue.PropType<VNode | (() => VNode)>;
90
95
  default: undefined;
91
96
  };
97
+ keepAlive: {
98
+ type: BooleanConstructor;
99
+ default: boolean;
100
+ };
92
101
  }>> & Readonly<{}>, {
93
102
  fallback: VNode<_$vue.RendererNode, _$vue.RendererElement, {
94
103
  [key: string]: any;
95
104
  }> | (() => VNode);
105
+ keepAlive: boolean;
96
106
  exact: boolean;
97
107
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, true, {}, any>;
98
108
  NotFound: _$vue.DefineComponent<{}, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, _$vue.ComponentProvideOptions, true, {}, any>;
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`vue`),t=require(`@real-router/core`),n=require(`@real-router/route-utils`),r=require(`@real-router/sources`),i=require(`dom-utils`),a=require(`@real-router/core/api`);function o(){return null}const s=(0,e.defineComponent)({name:`RouteView.Match`,props:{segment:{type:String,required:!0},exact:{type:Boolean,default:!1},fallback:{type:[Object,Function],default:void 0}},render:o}),c=(0,e.defineComponent)({name:`RouteView.NotFound`,render:o});function l(e,t,r){return r?e===t:(0,n.startsWithSegment)(e,t)}function u(t){if(Array.isArray(t)){let n=[];for(let r of t)Array.isArray(r)?n.push(...u(r)):(0,e.isVNode)(r)&&n.push(r);return n}return(0,e.isVNode)(t)?[t]:[]}function d(t,n){let r=u(t);for(let t of r)t.type===s||t.type===c?n.push(t):t.type===e.Fragment&&d(t.children,n)}function f(e,n,r){let i=null,a=!1,o,s=[];for(let t of e){if(t.type===c){i=t.children;continue}let e=t.props,u=e?.segment??``,d=e?.exact??!1,f=r?`${r}.${u}`:u;!a&&l(n,f,d)&&(a=!0,o=e?.fallback,s.push(t))}if(!a&&n===t.UNKNOWN_ROUTE&&i!==null){let t=e.filter(e=>e.type===c).at(-1);t&&s.push(t)}return{rendered:s,activeMatchFound:a,fallback:o}}function p(t){let n=(0,e.shallowRef)(t.getSnapshot());return(0,e.onScopeDispose)(t.subscribe(()=>{n.value=t.getSnapshot()})),n}const m=Symbol(`RouterKey`),h=Symbol(`NavigatorKey`),g=Symbol(`RouteKey`),_=()=>{let t=(0,e.inject)(m);if(!t)throw Error(`useRouter must be used within a RouterProvider`);return t};function v(n){let i=_(),a=p((0,r.createRouteNodeSource)(i,n)),o=(0,t.getNavigator)(i),s=(0,e.shallowRef)(a.value.route),c=(0,e.shallowRef)(a.value.previousRoute);return(0,e.watch)(a,e=>{s.value=e.route,c.value=e.previousRoute},{flush:`sync`}),{navigator:o,route:s,previousRoute:c}}function y(e){return e.children?.default?.()??null}function b(t,n){let r=t.get(n);if(r)return r;let i=(0,e.markRaw)((0,e.defineComponent)({name:`KeepAlive-${n}`,setup(e,t){return()=>t.slots.default?.()}}));return t.set(n,i),i}function x(t,n){if(n===void 0)return t;let r=typeof n==`function`?n():n;return(0,e.h)(e.Suspense,{},{default:()=>t,fallback:()=>r})}const S=(0,e.defineComponent)({name:`RouteView`,props:{nodeName:{type:String,required:!0},keepAlive:{type:Boolean,default:!1}},setup(t,{slots:n}){let r=v(t.nodeName),i=new Map;return()=>{let a=r.route.value;if(!a)return null;let o=[];d(n.default?.(),o);let{rendered:l,fallback:u}=f(o,a.name,t.nodeName);if(l.length===0)return null;let p=l[0];if(!t.keepAlive){if(p.type===s||p.type===c){let t=y(p);return t?x((0,e.h)(e.Fragment,t),u):null}return null}let m=p.props?.segment??`__not-found__`,h=b(i,m),g=y(p)??[];return x((0,e.h)(e.KeepAlive,null,{default:()=>(0,e.h)(h,{key:m},{default:()=>g})}),u)}}}),C=Object.assign(S,{Match:s,NotFound:c});function w(e,t,n=!1,i=!0){return p((0,r.createActiveRouteSource)(_(),e,t,{strict:n,ignoreQueryParams:i}))}const T=Object.freeze({}),E=Object.freeze({}),D=(0,e.defineComponent)({name:`Link`,props:{routeName:{type:String,required:!0},routeParams:{type:Object,default:()=>T},routeOptions:{type:Object,default:()=>E},class:{type:String,default:void 0},activeClassName:{type:String,default:`active`},activeStrict:{type:Boolean,default:!1},ignoreQueryParams:{type:Boolean,default:!0},target:{type:String,default:void 0}},setup(t,{slots:n,attrs:r}){let a=_(),o=w(t.routeName,t.routeParams,t.activeStrict,t.ignoreQueryParams),s=(0,e.computed)(()=>(0,i.buildHref)(a,t.routeName,t.routeParams)),c=(0,e.computed)(()=>(0,i.buildActiveClassName)(o.value,t.activeClassName,t.class)),l=e=>{r.onClick&&typeof r.onClick==`function`&&(r.onClick(e),e.defaultPrevented)||!(0,i.shouldNavigate)(e)||t.target===`_blank`||(e.preventDefault(),a.navigate(t.routeName,t.routeParams,t.routeOptions).catch(()=>{}))};return()=>(0,e.h)(`a`,{...r,href:s.value,class:c.value,target:t.target,onClick:l},n.default?.())}}),O=new WeakMap;function k(){let e=_(),t=O.get(e);return t||(t=(0,r.createErrorSource)(e),O.set(e,t)),p(t)}const A=(0,e.defineComponent)({name:`RouterErrorBoundary`,props:{fallback:{type:Function,required:!0},onError:{type:Function,default:void 0}},setup(t,{slots:n}){let r=k(),i=(0,e.ref)(-1);(0,e.watch)(()=>r.value.version,()=>{r.value.error&&t.onError?.(r.value.error,r.value.toRoute,r.value.fromRoute)},{immediate:!0});let a=(0,e.computed)(()=>r.value.version>i.value?r.value.error:null),o=()=>{i.value=r.value.version};return()=>{let r=n.default?.()??[],i=a.value?t.fallback(a.value,o):null;return(0,e.h)(e.Fragment,null,[...r,i])}}});let j=null;function M(e){j=e}function N(){if(!j)throw Error(`v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.`);return j}const P=new WeakMap,F=new WeakMap;function I(e,t){return n=>{(0,i.shouldNavigate)(n)&&(n.preventDefault(),e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{}))}}function L(e,t,n){return r=>{r.key===`Enter`&&!(n instanceof HTMLButtonElement)&&e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{})}}function R(e,t,n){let r=I(t,n),i=L(t,n,e);e.addEventListener(`click`,r),e.addEventListener(`keydown`,i),P.set(e,r),F.set(e,i)}function z(e){let t=P.get(e),n=F.get(e);t&&e.removeEventListener(`click`,t),n&&e.removeEventListener(`keydown`,n),P.delete(e),F.delete(e)}const B={mounted(e,t){let n=N();(0,i.applyLinkA11y)(e),e.style.cursor=`pointer`,R(e,n,t.value)},updated(e,t){let n=N();z(e),R(e,n,t.value)},beforeUnmount(e){z(e)}},V=()=>{let t=(0,e.inject)(h);if(!t)throw Error(`useNavigator must be used within a RouterProvider`);return t},H=()=>(0,n.getRouteUtils)((0,a.getPluginApi)(_()).getTree()),U=()=>{let t=(0,e.inject)(g);if(!t)throw Error(`useRoute must be used within a RouterProvider`);return t};function W(){return p((0,r.createTransitionSource)(_()))}function G(n){return{install(i){let a=(0,t.getNavigator)(n);M(n);let o=(0,r.createRouteSource)(n),s=o.getSnapshot(),c=(0,e.shallowRef)(s.route),l=(0,e.shallowRef)(s.previousRoute);o.subscribe(()=>{let e=o.getSnapshot();c.value=e.route,l.value=e.previousRoute}),i.provide(m,n),i.provide(h,a),i.provide(g,{navigator:a,route:c,previousRoute:l})}}}const K=(0,e.defineComponent)({name:`RouterProvider`,props:{router:{type:Object,required:!0},announceNavigation:{type:Boolean,default:!1}},setup(n,{slots:a}){(0,e.onMounted)(()=>{if(!n.announceNavigation)return;let t=(0,i.createRouteAnnouncer)(n.router);(0,e.onUnmounted)(()=>{t.destroy()})});let o=(0,t.getNavigator)(n.router);M(n.router);let s=(0,r.createRouteSource)(n.router),c=s.getSnapshot(),l=(0,e.shallowRef)(c.route),u=(0,e.shallowRef)(c.previousRoute);return(0,e.onScopeDispose)(s.subscribe(()=>{let e=s.getSnapshot();l.value=e.route,u.value=e.previousRoute})),(0,e.provide)(m,n.router),(0,e.provide)(h,o),(0,e.provide)(g,{navigator:o,route:l,previousRoute:u}),()=>a.default?.()}});exports.Link=D,exports.NavigatorKey=h,exports.RouteKey=g,exports.RouteView=C,exports.RouterErrorBoundary=A,exports.RouterKey=m,exports.RouterProvider=K,exports.createRouterPlugin=G,exports.useNavigator=V,exports.useRoute=U,exports.useRouteNode=v,exports.useRouteUtils=H,exports.useRouter=_,exports.useRouterTransition=W,exports.vLink=B;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`vue`),t=require(`@real-router/core`),n=require(`@real-router/route-utils`),r=require(`@real-router/sources`),i=require(`dom-utils`),a=require(`@real-router/core/api`);function o(){return null}const s=(0,e.defineComponent)({name:`RouteView.Match`,props:{segment:{type:String,required:!0},exact:{type:Boolean,default:!1},fallback:{type:[Object,Function],default:void 0},keepAlive:{type:Boolean,default:!1}},render:o}),c=(0,e.defineComponent)({name:`RouteView.NotFound`,render:o});function l(e,t,r){return r?e===t:(0,n.startsWithSegment)(e,t)}function u(t){if(Array.isArray(t)){let n=[];for(let r of t)Array.isArray(r)?n.push(...u(r)):(0,e.isVNode)(r)&&n.push(r);return n}return(0,e.isVNode)(t)?[t]:[]}function d(t,n){let r=u(t);for(let t of r)t.type===s||t.type===c?n.push(t):t.type===e.Fragment&&d(t.children,n)}function f(e,n,r){let i=null,a=!1,o,s=[];for(let t of e){if(t.type===c){i=t.children;continue}let e=t.props,u=e?.segment??``,d=e?.exact??!1,f=r?`${r}.${u}`:u;!a&&l(n,f,d)&&(a=!0,o=e?.fallback,s.push(t))}if(!a&&n===t.UNKNOWN_ROUTE&&i!==null){let t=e.filter(e=>e.type===c).at(-1);t&&s.push(t)}return{rendered:s,activeMatchFound:a,fallback:o}}function p(t){let n=(0,e.shallowRef)(t.getSnapshot());return(0,e.onScopeDispose)(t.subscribe(()=>{n.value=t.getSnapshot()})),n}const m=Symbol(`RouterKey`),h=Symbol(`NavigatorKey`),g=Symbol(`RouteKey`),_=()=>{let t=(0,e.inject)(m);if(!t)throw Error(`useRouter must be used within a RouterProvider`);return t};function v(n){let i=_(),a=p((0,r.createRouteNodeSource)(i,n)),o=(0,t.getNavigator)(i),s=(0,e.shallowRef)(a.value.route),c=(0,e.shallowRef)(a.value.previousRoute);return(0,e.watch)(a,e=>{s.value=e.route,c.value=e.previousRoute},{flush:`sync`}),{navigator:o,route:s,previousRoute:c}}function y(e){return e.children?.default?.()??null}function b(t,n){let r=t.get(n);if(r)return r;let i=(0,e.markRaw)((0,e.defineComponent)({name:`KeepAlive-${n}`,setup(e,t){return()=>t.slots.default?.()}}));return t.set(n,i),i}function x(t,n){if(n===void 0)return t;let r=typeof n==`function`?n():n;return(0,e.h)(e.Suspense,{},{default:()=>t,fallback:()=>r})}const S=(0,e.markRaw)((0,e.defineComponent)({name:`KeepAlive-placeholder`,render(){return null}}));function C(t,n,r){let i=t.props?.segment??`__not-found__`,a=b(n,i),o=y(t)??[];return x((0,e.h)(e.KeepAlive,null,{default:()=>(0,e.h)(a,{key:i},{default:()=>o})}),r)}function w(t,n,r){let i=t.props;if(i?.keepAlive===!0&&t.type===s){let r=i.segment??`__not-found__`,a=b(n,r),o=y(t)??[];return(0,e.h)(e.Fragment,[(0,e.h)(e.KeepAlive,null,{default:()=>(0,e.h)(a,{key:r},{default:()=>o})})])}let a=y(t);return a?(0,e.h)(e.Fragment,[(0,e.h)(e.KeepAlive,null,{default:()=>(0,e.h)(S)}),x((0,e.h)(e.Fragment,a),r)]):null}const T=(0,e.defineComponent)({name:`RouteView`,props:{nodeName:{type:String,required:!0},keepAlive:{type:Boolean,default:!1}},setup(t,{slots:n}){let r=v(t.nodeName),i=new Map;return()=>{let a=r.route.value;if(!a)return null;let o=[];d(n.default?.(),o);let{rendered:l,fallback:u}=f(o,a.name,t.nodeName);if(l.length===0)return null;let p=l[0];if(t.keepAlive)return C(p,i,u);if(p.type!==s&&p.type!==c)return null;if(o.some(e=>e.type===s&&e.props?.keepAlive===!0))return w(p,i,u);let m=y(p);return m?x((0,e.h)(e.Fragment,m),u):null}}}),E=Object.assign(T,{Match:s,NotFound:c});function D(e,t,n=!1,i=!0){return p((0,r.createActiveRouteSource)(_(),e,t,{strict:n,ignoreQueryParams:i}))}const O=Object.freeze({}),k=Object.freeze({}),A=(0,e.defineComponent)({name:`Link`,props:{routeName:{type:String,required:!0},routeParams:{type:Object,default:()=>O},routeOptions:{type:Object,default:()=>k},class:{type:String,default:void 0},activeClassName:{type:String,default:`active`},activeStrict:{type:Boolean,default:!1},ignoreQueryParams:{type:Boolean,default:!0},target:{type:String,default:void 0}},setup(t,{slots:n,attrs:r}){let a=_(),o=D(t.routeName,t.routeParams,t.activeStrict,t.ignoreQueryParams),s=(0,e.computed)(()=>(0,i.buildHref)(a,t.routeName,t.routeParams)),c=(0,e.computed)(()=>(0,i.buildActiveClassName)(o.value,t.activeClassName,t.class)),l=e=>{r.onClick&&typeof r.onClick==`function`&&(r.onClick(e),e.defaultPrevented)||!(0,i.shouldNavigate)(e)||t.target===`_blank`||(e.preventDefault(),a.navigate(t.routeName,t.routeParams,t.routeOptions).catch(()=>{}))};return()=>(0,e.h)(`a`,{...r,href:s.value,class:c.value,target:t.target,onClick:l},n.default?.())}}),j=new WeakMap;function M(){let e=_(),t=j.get(e);return t||(t=(0,r.createErrorSource)(e),j.set(e,t)),p(t)}const N=(0,e.defineComponent)({name:`RouterErrorBoundary`,props:{fallback:{type:Function,required:!0},onError:{type:Function,default:void 0}},setup(t,{slots:n}){let r=M(),i=(0,e.ref)(-1);(0,e.watch)(()=>r.value.version,()=>{r.value.error&&t.onError?.(r.value.error,r.value.toRoute,r.value.fromRoute)},{immediate:!0});let a=(0,e.computed)(()=>r.value.version>i.value?r.value.error:null),o=()=>{i.value=r.value.version};return()=>{let r=n.default?.()??[],i=a.value?t.fallback(a.value,o):null;return(0,e.h)(e.Fragment,null,[...r,i])}}});let P=null;function F(e){P=e}function I(){if(!P)throw Error(`v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.`);return P}const L=new WeakMap,R=new WeakMap;function z(e,t){return n=>{(0,i.shouldNavigate)(n)&&(n.preventDefault(),e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{}))}}function B(e,t,n){return r=>{r.key===`Enter`&&!(n instanceof HTMLButtonElement)&&e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{})}}function V(e,t,n){let r=z(t,n),i=B(t,n,e);e.addEventListener(`click`,r),e.addEventListener(`keydown`,i),L.set(e,r),R.set(e,i)}function H(e){let t=L.get(e),n=R.get(e);t&&e.removeEventListener(`click`,t),n&&e.removeEventListener(`keydown`,n),L.delete(e),R.delete(e)}const U={mounted(e,t){let n=I();(0,i.applyLinkA11y)(e),e.style.cursor=`pointer`,V(e,n,t.value)},updated(e,t){let n=I();H(e),V(e,n,t.value)},beforeUnmount(e){H(e)}},W=()=>{let t=(0,e.inject)(h);if(!t)throw Error(`useNavigator must be used within a RouterProvider`);return t},G=()=>(0,n.getRouteUtils)((0,a.getPluginApi)(_()).getTree()),K=()=>{let t=(0,e.inject)(g);if(!t)throw Error(`useRoute must be used within a RouterProvider`);return t};function q(){return p((0,r.createTransitionSource)(_()))}function J(n){return{install(i){let a=(0,t.getNavigator)(n);F(n);let o=(0,r.createRouteSource)(n),s=o.getSnapshot(),c=(0,e.shallowRef)(s.route),l=(0,e.shallowRef)(s.previousRoute);o.subscribe(()=>{let e=o.getSnapshot();c.value=e.route,l.value=e.previousRoute}),i.provide(m,n),i.provide(h,a),i.provide(g,{navigator:a,route:c,previousRoute:l})}}}const Y=(0,e.defineComponent)({name:`RouterProvider`,props:{router:{type:Object,required:!0},announceNavigation:{type:Boolean,default:!1}},setup(n,{slots:a}){(0,e.onMounted)(()=>{if(!n.announceNavigation)return;let t=(0,i.createRouteAnnouncer)(n.router);(0,e.onUnmounted)(()=>{t.destroy()})});let o=(0,t.getNavigator)(n.router);F(n.router);let s=(0,r.createRouteSource)(n.router),c=s.getSnapshot(),l=(0,e.shallowRef)(c.route),u=(0,e.shallowRef)(c.previousRoute);return(0,e.onScopeDispose)(s.subscribe(()=>{let e=s.getSnapshot();l.value=e.route,u.value=e.previousRoute})),(0,e.provide)(m,n.router),(0,e.provide)(h,o),(0,e.provide)(g,{navigator:o,route:l,previousRoute:u}),()=>a.default?.()}});exports.Link=A,exports.NavigatorKey=h,exports.RouteKey=g,exports.RouteView=E,exports.RouterErrorBoundary=N,exports.RouterKey=m,exports.RouterProvider=Y,exports.createRouterPlugin=J,exports.useNavigator=W,exports.useRoute=K,exports.useRouteNode=v,exports.useRouteUtils=G,exports.useRouter=_,exports.useRouterTransition=q,exports.vLink=U;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Fragment","UNKNOWN_ROUTE","Suspense","Fragment","KeepAlive","Fragment"],"sources":["../../src/components/RouteView/components.ts","../../src/components/RouteView/helpers.ts","../../src/useRefFromSource.ts","../../src/context.ts","../../src/composables/useRouter.ts","../../src/composables/useRouteNode.ts","../../src/components/RouteView/RouteView.ts","../../src/composables/useIsActiveRoute.ts","../../src/constants.ts","../../src/components/Link.ts","../../src/composables/useRouterError.ts","../../src/components/RouterErrorBoundary.ts","../../src/directives/vLink.ts","../../src/composables/useNavigator.ts","../../src/composables/useRouteUtils.ts","../../src/composables/useRoute.ts","../../src/composables/useRouterTransition.ts","../../src/createRouterPlugin.ts","../../src/RouterProvider.ts"],"sourcesContent":["import { defineComponent } from \"vue\";\n\nimport type { PropType, VNode } from \"vue\";\n\nfunction renderNull() {\n return null;\n}\n\nexport const Match = defineComponent({\n name: \"RouteView.Match\",\n props: {\n segment: {\n type: String as PropType<string>,\n required: true,\n },\n exact: {\n type: Boolean,\n default: false,\n },\n fallback: {\n type: [Object, Function] as PropType<VNode | (() => VNode)>,\n default: undefined,\n },\n },\n render: renderNull,\n});\n\nexport const NotFound = defineComponent({\n name: \"RouteView.NotFound\",\n render: renderNull,\n});\n","import { UNKNOWN_ROUTE } from \"@real-router/core\";\nimport { startsWithSegment } from \"@real-router/route-utils\";\nimport { Fragment, isVNode } from \"vue\";\n\nimport { Match, NotFound } from \"./components\";\n\nimport type { VNode } from \"vue\";\n\ntype FallbackType = VNode | (() => VNode) | undefined;\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\nfunction normalizeChildren(children: unknown): VNode[] {\n if (Array.isArray(children)) {\n const result: VNode[] = [];\n\n for (const child of children) {\n if (Array.isArray(child)) {\n result.push(...normalizeChildren(child));\n } else if (isVNode(child)) {\n result.push(child);\n }\n }\n\n return result;\n }\n\n if (isVNode(children)) {\n return [children];\n }\n\n return [];\n}\n\nexport function collectElements(children: unknown, result: VNode[]): void {\n const vnodes = normalizeChildren(children);\n\n for (const child of vnodes) {\n if (child.type === Match || child.type === NotFound) {\n result.push(child);\n } else if (child.type === Fragment) {\n collectElements(child.children, result);\n }\n }\n}\n\nexport function buildRenderList(\n elements: VNode[],\n routeName: string,\n nodeName: string,\n): {\n rendered: VNode[];\n activeMatchFound: boolean;\n fallback?: FallbackType;\n} {\n let notFoundChildren: unknown = null;\n let activeMatchFound = false;\n let fallback: FallbackType = undefined;\n const rendered: VNode[] = [];\n\n for (const child of elements) {\n if (child.type === NotFound) {\n notFoundChildren = child.children;\n continue;\n }\n\n const props = child.props as {\n segment: string;\n exact?: boolean;\n fallback?: FallbackType;\n } | null;\n const segment = props?.segment ?? \"\";\n const exact = props?.exact ?? false;\n const fullSegmentName = nodeName ? `${nodeName}.${segment}` : segment;\n const isActive =\n !activeMatchFound && isSegmentMatch(routeName, fullSegmentName, exact);\n\n if (isActive) {\n activeMatchFound = true;\n fallback = props?.fallback;\n rendered.push(child);\n }\n }\n\n if (\n !activeMatchFound &&\n routeName === UNKNOWN_ROUTE &&\n notFoundChildren !== null\n ) {\n const nfElements = elements.filter((element) => element.type === NotFound);\n /* v8 ignore next 3 */\n const lastNf = nfElements.at(-1);\n\n if (lastNf) {\n rendered.push(lastNf);\n }\n }\n\n return { rendered, activeMatchFound, fallback };\n}\n","import { shallowRef, onScopeDispose } from \"vue\";\n\nimport type { RouterSource } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useRefFromSource<T>(source: RouterSource<T>): ShallowRef<T> {\n const ref = shallowRef(source.getSnapshot());\n\n const unsub = source.subscribe(() => {\n ref.value = source.getSnapshot();\n });\n\n onScopeDispose(unsub);\n\n return ref;\n}\n","import type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\nimport type { InjectionKey } from \"vue\";\n\nexport const RouterKey: InjectionKey<Router> = Symbol(\"RouterKey\");\n\nexport const NavigatorKey: InjectionKey<Navigator> = Symbol(\"NavigatorKey\");\n\nexport const RouteKey: InjectionKey<RouteContextType> = Symbol(\"RouteKey\");\n","import { inject } from \"vue\";\n\nimport { RouterKey } from \"../context\";\n\nimport type { Router } from \"@real-router/core\";\n\nexport const useRouter = (): Router => {\n const router = inject(RouterKey);\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 { shallowRef, watch } from \"vue\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteContext } from \"../types\";\nimport type { State } from \"@real-router/core\";\n\nexport function useRouteNode(nodeName: string): RouteContext {\n const router = useRouter();\n\n const source = createRouteNodeSource(router, nodeName);\n const snapshot = useRefFromSource(source);\n\n const navigator = getNavigator(router);\n\n const route = shallowRef<State | undefined>(snapshot.value.route);\n const previousRoute = shallowRef<State | undefined>(\n snapshot.value.previousRoute,\n );\n\n watch(\n snapshot,\n (newSnapshot) => {\n route.value = newSnapshot.route;\n previousRoute.value = newSnapshot.previousRoute;\n },\n { flush: \"sync\" },\n );\n\n return {\n navigator,\n route,\n previousRoute,\n };\n}\n","import {\n Fragment,\n defineComponent,\n h,\n KeepAlive,\n markRaw,\n Suspense,\n} from \"vue\";\n\nimport { Match, NotFound } from \"./components\";\nimport { buildRenderList, collectElements } from \"./helpers\";\nimport { useRouteNode } from \"../../composables/useRouteNode\";\n\nimport type { Component, VNode } from \"vue\";\n\ntype SlotChildren = Record<string, (() => VNode[]) | undefined> | null;\n\nfunction getSlotContent(vnode: VNode): VNode[] | null {\n const slots = vnode.children as SlotChildren;\n\n return slots?.default?.() ?? null;\n}\n\nfunction getOrCreateWrapper(\n cache: Map<string, Component>,\n segment: string,\n): Component {\n const existing = cache.get(segment);\n\n if (existing) {\n return existing;\n }\n\n const wrapper = markRaw(\n defineComponent({\n name: `KeepAlive-${segment}`,\n setup(_wrapperProps, wrapperCtx) {\n return () => wrapperCtx.slots.default?.();\n },\n }),\n );\n\n cache.set(segment, wrapper);\n\n return wrapper;\n}\n\nfunction wrapWithSuspense(content: VNode, fallback: unknown): VNode {\n if (fallback === undefined) {\n return content;\n }\n\n const fallbackContent =\n typeof fallback === \"function\" ? (fallback as () => VNode)() : fallback;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n const suspenseComponent = Suspense as any;\n\n return h(\n suspenseComponent,\n {},\n {\n default: () => content,\n fallback: () => fallbackContent,\n },\n );\n}\n\nconst RouteViewComponent = defineComponent({\n name: \"RouteView\",\n props: {\n nodeName: {\n type: String,\n required: true,\n },\n keepAlive: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n const routeContext = useRouteNode(props.nodeName);\n\n const wrapperCache = new Map<string, Component>();\n\n return (): VNode | null => {\n const route = routeContext.route.value;\n\n if (!route) {\n return null;\n }\n\n const elements: VNode[] = [];\n\n collectElements(slots.default?.(), elements);\n\n const { rendered, fallback } = buildRenderList(\n elements,\n route.name,\n props.nodeName,\n );\n\n if (rendered.length === 0) {\n return null;\n }\n\n const activeChild = rendered[0];\n\n if (!props.keepAlive) {\n if (activeChild.type === Match || activeChild.type === NotFound) {\n const content = getSlotContent(activeChild);\n\n if (!content) {\n return null;\n }\n\n const fragment = h(Fragment, content);\n\n return wrapWithSuspense(fragment, fallback);\n }\n\n /* v8 ignore start */\n return null;\n /* v8 ignore stop */\n }\n\n const activeProps = activeChild.props as {\n segment?: string;\n } | null;\n const segment = activeProps?.segment ?? \"__not-found__\";\n\n const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);\n /* v8 ignore next */\n const slotContent = getSlotContent(activeChild) ?? [];\n\n const keepAliveContent = h(KeepAlive, null, {\n default: () =>\n h(WrapperComponent, { key: segment }, { default: () => slotContent }),\n });\n\n return wrapWithSuspense(keepAliveContent, fallback);\n };\n },\n});\n\nexport const RouteView = Object.assign(RouteViewComponent, { Match, NotFound });\n\nexport type {\n RouteViewProps,\n MatchProps as RouteViewMatchProps,\n NotFoundProps as RouteViewNotFoundProps,\n} from \"./types\";\n","import { createActiveRouteSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Params } from \"@real-router/core\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useIsActiveRoute(\n routeName: string,\n params?: Params,\n strict = false,\n ignoreQueryParams = true,\n): ShallowRef<boolean> {\n const router = useRouter();\n\n const source = createActiveRouteSource(router, routeName, params, {\n strict,\n ignoreQueryParams,\n });\n\n return useRefFromSource(source);\n}\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 { shouldNavigate, buildHref, buildActiveClassName } from \"dom-utils\";\nimport { defineComponent, h, computed } from \"vue\";\n\nimport { useIsActiveRoute } from \"../composables/useIsActiveRoute\";\nimport { useRouter } from \"../composables/useRouter\";\nimport { EMPTY_PARAMS, EMPTY_OPTIONS } from \"../constants\";\n\nimport type { Params, NavigationOptions } from \"@real-router/core\";\nimport type { PropType } from \"vue\";\n\nexport const Link = defineComponent({\n name: \"Link\",\n props: {\n routeName: {\n type: String,\n required: true,\n },\n routeParams: {\n type: Object as PropType<Params>,\n default: () => EMPTY_PARAMS,\n },\n routeOptions: {\n type: Object as PropType<NavigationOptions>,\n default: () => EMPTY_OPTIONS,\n },\n class: {\n type: String,\n default: undefined,\n },\n activeClassName: {\n type: String,\n default: \"active\",\n },\n activeStrict: {\n type: Boolean,\n default: false,\n },\n ignoreQueryParams: {\n type: Boolean,\n default: true,\n },\n target: {\n type: String,\n default: undefined,\n },\n },\n setup(props, { slots, attrs }) {\n const router = useRouter();\n\n const isActive = useIsActiveRoute(\n props.routeName,\n props.routeParams,\n props.activeStrict,\n props.ignoreQueryParams,\n );\n\n const href = computed(() =>\n buildHref(router, props.routeName, props.routeParams),\n );\n\n const finalClassName = computed(() =>\n buildActiveClassName(isActive.value, props.activeClassName, props.class),\n );\n\n const handleClick = (evt: MouseEvent) => {\n if (attrs.onClick && typeof attrs.onClick === \"function\") {\n (attrs.onClick as (evt: MouseEvent) => void)(evt);\n\n if (evt.defaultPrevented) {\n return;\n }\n }\n\n if (!shouldNavigate(evt) || props.target === \"_blank\") {\n return;\n }\n\n evt.preventDefault();\n router\n .navigate(props.routeName, props.routeParams, props.routeOptions)\n .catch(() => {});\n };\n\n return () =>\n h(\n \"a\",\n {\n ...attrs,\n href: href.value,\n class: finalClassName.value,\n target: props.target,\n onClick: handleClick,\n },\n slots.default?.(),\n );\n },\n});\n","import { createErrorSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { RouterErrorSnapshot, RouterSource } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nconst cache = new WeakMap<Router, RouterSource<RouterErrorSnapshot>>();\n\nexport function useRouterError(): ShallowRef<RouterErrorSnapshot> {\n const router = useRouter();\n\n let source = cache.get(router);\n\n if (!source) {\n source = createErrorSource(router);\n cache.set(router, source);\n }\n\n return useRefFromSource(source);\n}\n","import { defineComponent, h, ref, watch, computed, Fragment } from \"vue\";\n\nimport { useRouterError } from \"../composables/useRouterError\";\n\nimport type { RouterError, State } from \"@real-router/core\";\nimport type { VNode, PropType } from \"vue\";\n\nexport const RouterErrorBoundary = defineComponent({\n name: \"RouterErrorBoundary\",\n props: {\n fallback: {\n type: Function as PropType<\n (error: RouterError, resetError: () => void) => VNode\n >,\n required: true,\n },\n onError: {\n type: Function as PropType<\n (\n error: RouterError,\n toRoute: State | null,\n fromRoute: State | null,\n ) => void\n >,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const snapshot = useRouterError();\n const dismissedVersion = ref(-1);\n\n watch(\n () => snapshot.value.version,\n () => {\n if (snapshot.value.error) {\n props.onError?.(\n snapshot.value.error,\n snapshot.value.toRoute,\n snapshot.value.fromRoute,\n );\n }\n },\n { immediate: true },\n );\n\n const visibleError = computed(() =>\n snapshot.value.version > dismissedVersion.value\n ? snapshot.value.error\n : null,\n );\n\n const resetError = () => {\n dismissedVersion.value = snapshot.value.version;\n };\n\n return () => {\n const children = slots.default?.() ?? [];\n const errorVNode = visibleError.value\n ? props.fallback(visibleError.value, resetError)\n : null;\n\n return h(Fragment, null, [...children, errorVNode]);\n };\n },\n});\n\nexport type RouterErrorBoundaryProps = InstanceType<\n typeof RouterErrorBoundary\n>[\"$props\"];\n","import { shouldNavigate, applyLinkA11y } from \"dom-utils\";\n\nimport type { Router, NavigationOptions, Params } from \"@real-router/core\";\nimport type { Directive } from \"vue\";\n\nexport interface LinkDirectiveValue {\n name: string;\n params?: Params;\n options?: NavigationOptions;\n}\n\nlet _router: Router | null = null;\n\nexport function setDirectiveRouter(router: Router): void {\n _router = router;\n}\n\nexport function getDirectiveRouter(): Router {\n if (!_router) {\n /* v8 ignore next 3 -- @preserve Defensive: router always initialized by RouterProvider */\n throw new Error(\n \"v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.\",\n );\n }\n\n return _router;\n}\n\nconst clickHandlers = new WeakMap<HTMLElement, (evt: MouseEvent) => void>();\nconst keydownHandlers = new WeakMap<\n HTMLElement,\n (evt: KeyboardEvent) => void\n>();\n\nfunction createClickHandler(\n router: Router,\n value: LinkDirectiveValue,\n): (evt: MouseEvent) => void {\n return (evt: MouseEvent) => {\n if (!shouldNavigate(evt)) {\n return;\n }\n\n evt.preventDefault();\n router\n .navigate(value.name, value.params ?? {}, value.options ?? {})\n .catch(() => {});\n };\n}\n\nfunction createKeydownHandler(\n router: Router,\n value: LinkDirectiveValue,\n element: HTMLElement,\n): (evt: KeyboardEvent) => void {\n return (evt: KeyboardEvent) => {\n if (evt.key === \"Enter\" && !(element instanceof HTMLButtonElement)) {\n router\n .navigate(value.name, value.params ?? {}, value.options ?? {})\n .catch(() => {});\n }\n };\n}\n\nfunction attachHandlers(\n element: HTMLElement,\n router: Router,\n value: LinkDirectiveValue,\n): void {\n const handleClick = createClickHandler(router, value);\n const handleKeyDown = createKeydownHandler(router, value, element);\n\n element.addEventListener(\"click\", handleClick);\n element.addEventListener(\"keydown\", handleKeyDown);\n\n clickHandlers.set(element, handleClick);\n keydownHandlers.set(element, handleKeyDown);\n}\n\nfunction detachHandlers(element: HTMLElement): void {\n const clickHandler = clickHandlers.get(element);\n const keydownHandler = keydownHandlers.get(element);\n\n if (clickHandler) {\n element.removeEventListener(\"click\", clickHandler);\n }\n if (keydownHandler) {\n element.removeEventListener(\"keydown\", keydownHandler);\n }\n\n clickHandlers.delete(element);\n keydownHandlers.delete(element);\n}\n\nexport const vLink: Directive<HTMLElement, LinkDirectiveValue> = {\n mounted(element, binding) {\n const router = getDirectiveRouter();\n\n applyLinkA11y(element);\n\n element.style.cursor = \"pointer\";\n\n attachHandlers(element, router, binding.value);\n },\n\n updated(element, binding) {\n const router = getDirectiveRouter();\n\n detachHandlers(element);\n attachHandlers(element, router, binding.value);\n },\n\n beforeUnmount(element) {\n detachHandlers(element);\n },\n};\n","import { inject } from \"vue\";\n\nimport { NavigatorKey } from \"../context\";\n\nimport type { Navigator } from \"@real-router/core\";\n\nexport const useNavigator = (): Navigator => {\n const navigator = inject(NavigatorKey);\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 { inject } from \"vue\";\n\nimport { RouteKey } from \"../context\";\n\nimport type { RouteContext } from \"../types\";\n\nexport const useRoute = (): RouteContext => {\n const routeContext = inject(RouteKey);\n\n if (!routeContext) {\n throw new Error(\"useRoute must be used within a RouterProvider\");\n }\n\n return routeContext;\n};\n","import { createTransitionSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouterTransitionSnapshot } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useRouterTransition(): ShallowRef<RouterTransitionSnapshot> {\n const router = useRouter();\n\n const source = createTransitionSource(router);\n\n return useRefFromSource(source);\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { shallowRef } from \"vue\";\n\nimport { NavigatorKey, RouteKey, RouterKey } from \"./context\";\nimport { setDirectiveRouter } from \"./directives/vLink\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { Plugin } from \"vue\";\n\nexport function createRouterPlugin(router: Router): Plugin<[]> {\n return {\n install(app): void {\n const navigator = getNavigator(router);\n\n setDirectiveRouter(router);\n\n const source = createRouteSource(router);\n const initialSnapshot = source.getSnapshot();\n\n const route = shallowRef(initialSnapshot.route);\n const previousRoute = shallowRef(initialSnapshot.previousRoute);\n\n source.subscribe(() => {\n const snapshot = source.getSnapshot();\n\n route.value = snapshot.route;\n previousRoute.value = snapshot.previousRoute;\n });\n\n app.provide(RouterKey, router);\n app.provide(NavigatorKey, navigator);\n app.provide(RouteKey, { navigator, route, previousRoute });\n },\n };\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { createRouteAnnouncer } from \"dom-utils\";\nimport {\n defineComponent,\n onMounted,\n onUnmounted,\n provide,\n shallowRef,\n onScopeDispose,\n} from \"vue\";\n\nimport { NavigatorKey, RouteKey, RouterKey } from \"./context\";\nimport { setDirectiveRouter } from \"./directives/vLink\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { PropType } from \"vue\";\n\nexport const RouterProvider = defineComponent({\n name: \"RouterProvider\",\n props: {\n router: {\n type: Object as PropType<Router>,\n required: true,\n },\n announceNavigation: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n onMounted(() => {\n if (!props.announceNavigation) {\n return;\n }\n\n const announcer = createRouteAnnouncer(props.router);\n\n onUnmounted(() => {\n announcer.destroy();\n });\n });\n\n const navigator = getNavigator(props.router);\n\n setDirectiveRouter(props.router);\n\n const source = createRouteSource(props.router);\n const initialSnapshot = source.getSnapshot();\n\n const route = shallowRef(initialSnapshot.route);\n const previousRoute = shallowRef(initialSnapshot.previousRoute);\n\n const unsub = source.subscribe(() => {\n const snapshot = source.getSnapshot();\n\n route.value = snapshot.route;\n previousRoute.value = snapshot.previousRoute;\n });\n\n onScopeDispose(unsub);\n\n provide(RouterKey, props.router);\n provide(NavigatorKey, navigator);\n provide(RouteKey, { navigator, route, previousRoute });\n\n return () => slots.default?.();\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Fragment","UNKNOWN_ROUTE","Suspense","KeepAlive","Fragment","Fragment"],"sources":["../../src/components/RouteView/components.ts","../../src/components/RouteView/helpers.ts","../../src/useRefFromSource.ts","../../src/context.ts","../../src/composables/useRouter.ts","../../src/composables/useRouteNode.ts","../../src/components/RouteView/RouteView.ts","../../src/composables/useIsActiveRoute.ts","../../src/constants.ts","../../src/components/Link.ts","../../src/composables/useRouterError.ts","../../src/components/RouterErrorBoundary.ts","../../src/directives/vLink.ts","../../src/composables/useNavigator.ts","../../src/composables/useRouteUtils.ts","../../src/composables/useRoute.ts","../../src/composables/useRouterTransition.ts","../../src/createRouterPlugin.ts","../../src/RouterProvider.ts"],"sourcesContent":["import { defineComponent } from \"vue\";\n\nimport type { PropType, VNode } from \"vue\";\n\nfunction renderNull() {\n return null;\n}\n\nexport const Match = defineComponent({\n name: \"RouteView.Match\",\n props: {\n segment: {\n type: String as PropType<string>,\n required: true,\n },\n exact: {\n type: Boolean,\n default: false,\n },\n fallback: {\n type: [Object, Function] as PropType<VNode | (() => VNode)>,\n default: undefined,\n },\n keepAlive: {\n type: Boolean,\n default: false,\n },\n },\n render: renderNull,\n});\n\nexport const NotFound = defineComponent({\n name: \"RouteView.NotFound\",\n render: renderNull,\n});\n","import { UNKNOWN_ROUTE } from \"@real-router/core\";\nimport { startsWithSegment } from \"@real-router/route-utils\";\nimport { Fragment, isVNode } from \"vue\";\n\nimport { Match, NotFound } from \"./components\";\n\nimport type { VNode } from \"vue\";\n\ntype FallbackType = VNode | (() => VNode) | undefined;\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\nfunction normalizeChildren(children: unknown): VNode[] {\n if (Array.isArray(children)) {\n const result: VNode[] = [];\n\n for (const child of children) {\n if (Array.isArray(child)) {\n result.push(...normalizeChildren(child));\n } else if (isVNode(child)) {\n result.push(child);\n }\n }\n\n return result;\n }\n\n if (isVNode(children)) {\n return [children];\n }\n\n return [];\n}\n\nexport function collectElements(children: unknown, result: VNode[]): void {\n const vnodes = normalizeChildren(children);\n\n for (const child of vnodes) {\n if (child.type === Match || child.type === NotFound) {\n result.push(child);\n } else if (child.type === Fragment) {\n collectElements(child.children, result);\n }\n }\n}\n\nexport function buildRenderList(\n elements: VNode[],\n routeName: string,\n nodeName: string,\n): {\n rendered: VNode[];\n activeMatchFound: boolean;\n fallback?: FallbackType;\n} {\n let notFoundChildren: unknown = null;\n let activeMatchFound = false;\n let fallback: FallbackType = undefined;\n const rendered: VNode[] = [];\n\n for (const child of elements) {\n if (child.type === NotFound) {\n notFoundChildren = child.children;\n continue;\n }\n\n const props = child.props as {\n segment: string;\n exact?: boolean;\n fallback?: FallbackType;\n } | null;\n const segment = props?.segment ?? \"\";\n const exact = props?.exact ?? false;\n const fullSegmentName = nodeName ? `${nodeName}.${segment}` : segment;\n const isActive =\n !activeMatchFound && isSegmentMatch(routeName, fullSegmentName, exact);\n\n if (isActive) {\n activeMatchFound = true;\n fallback = props?.fallback;\n rendered.push(child);\n }\n }\n\n if (\n !activeMatchFound &&\n routeName === UNKNOWN_ROUTE &&\n notFoundChildren !== null\n ) {\n const nfElements = elements.filter((element) => element.type === NotFound);\n /* v8 ignore next 3 */\n const lastNf = nfElements.at(-1);\n\n if (lastNf) {\n rendered.push(lastNf);\n }\n }\n\n return { rendered, activeMatchFound, fallback };\n}\n","import { shallowRef, onScopeDispose } from \"vue\";\n\nimport type { RouterSource } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useRefFromSource<T>(source: RouterSource<T>): ShallowRef<T> {\n const ref = shallowRef(source.getSnapshot());\n\n const unsub = source.subscribe(() => {\n ref.value = source.getSnapshot();\n });\n\n onScopeDispose(unsub);\n\n return ref;\n}\n","import type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\nimport type { InjectionKey } from \"vue\";\n\nexport const RouterKey: InjectionKey<Router> = Symbol(\"RouterKey\");\n\nexport const NavigatorKey: InjectionKey<Navigator> = Symbol(\"NavigatorKey\");\n\nexport const RouteKey: InjectionKey<RouteContextType> = Symbol(\"RouteKey\");\n","import { inject } from \"vue\";\n\nimport { RouterKey } from \"../context\";\n\nimport type { Router } from \"@real-router/core\";\n\nexport const useRouter = (): Router => {\n const router = inject(RouterKey);\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 { shallowRef, watch } from \"vue\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteContext } from \"../types\";\nimport type { State } from \"@real-router/core\";\n\nexport function useRouteNode(nodeName: string): RouteContext {\n const router = useRouter();\n\n const source = createRouteNodeSource(router, nodeName);\n const snapshot = useRefFromSource(source);\n\n const navigator = getNavigator(router);\n\n const route = shallowRef<State | undefined>(snapshot.value.route);\n const previousRoute = shallowRef<State | undefined>(\n snapshot.value.previousRoute,\n );\n\n watch(\n snapshot,\n (newSnapshot) => {\n route.value = newSnapshot.route;\n previousRoute.value = newSnapshot.previousRoute;\n },\n { flush: \"sync\" },\n );\n\n return {\n navigator,\n route,\n previousRoute,\n };\n}\n","import {\n Fragment,\n defineComponent,\n h,\n KeepAlive,\n markRaw,\n Suspense,\n} from \"vue\";\n\nimport { Match, NotFound } from \"./components\";\nimport { buildRenderList, collectElements } from \"./helpers\";\nimport { useRouteNode } from \"../../composables/useRouteNode\";\n\nimport type { Component, VNode } from \"vue\";\n\ntype SlotChildren = Record<string, (() => VNode[]) | undefined> | null;\n\nfunction getSlotContent(vnode: VNode): VNode[] | null {\n const slots = vnode.children as SlotChildren;\n\n return slots?.default?.() ?? null;\n}\n\nfunction getOrCreateWrapper(\n cache: Map<string, Component>,\n segment: string,\n): Component {\n const existing = cache.get(segment);\n\n if (existing) {\n return existing;\n }\n\n const wrapper = markRaw(\n defineComponent({\n name: `KeepAlive-${segment}`,\n setup(_wrapperProps, wrapperCtx) {\n return () => wrapperCtx.slots.default?.();\n },\n }),\n );\n\n cache.set(segment, wrapper);\n\n return wrapper;\n}\n\nfunction wrapWithSuspense(content: VNode, fallback: unknown): VNode {\n if (fallback === undefined) {\n return content;\n }\n\n const fallbackContent =\n typeof fallback === \"function\" ? (fallback as () => VNode)() : fallback;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n const suspenseComponent = Suspense as any;\n\n return h(\n suspenseComponent,\n {},\n {\n default: () => content,\n fallback: () => fallbackContent,\n },\n );\n}\n\nconst emptyKeepAlivePlaceholder = markRaw(\n defineComponent({\n name: \"KeepAlive-placeholder\",\n render() {\n return null;\n },\n }),\n);\n\nfunction renderWithRootKA(\n activeChild: VNode,\n wrapperCache: Map<string, Component>,\n fallback: unknown,\n): VNode {\n const activeProps = activeChild.props as { segment?: string } | null;\n const segment = activeProps?.segment ?? \"__not-found__\";\n const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);\n const slotContent = getSlotContent(activeChild) ?? [];\n const keepAliveContent = h(KeepAlive, null, {\n default: () =>\n h(WrapperComponent, { key: segment }, { default: () => slotContent }),\n });\n\n return wrapWithSuspense(keepAliveContent, fallback);\n}\n\nfunction renderWithPerMatchKA(\n activeChild: VNode,\n wrapperCache: Map<string, Component>,\n fallback: unknown,\n): VNode | null {\n const matchProps = activeChild.props as {\n segment?: string;\n keepAlive?: boolean;\n } | null;\n\n if (matchProps?.keepAlive === true && activeChild.type === Match) {\n /* v8 ignore start */\n const segment = matchProps.segment ?? \"__not-found__\";\n /* v8 ignore stop */\n const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);\n const slotContent = getSlotContent(activeChild) ?? [];\n\n return h(Fragment, [\n h(KeepAlive, null, {\n default: () =>\n h(WrapperComponent, { key: segment }, { default: () => slotContent }),\n }),\n ]);\n }\n\n const content = getSlotContent(activeChild);\n\n /* v8 ignore start */\n if (!content) {\n return null;\n }\n /* v8 ignore stop */\n\n return h(Fragment, [\n h(KeepAlive, null, { default: () => h(emptyKeepAlivePlaceholder) }),\n wrapWithSuspense(h(Fragment, content), fallback),\n ]);\n}\n\nconst RouteViewComponent = defineComponent({\n name: \"RouteView\",\n props: {\n nodeName: {\n type: String,\n required: true,\n },\n keepAlive: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n const routeContext = useRouteNode(props.nodeName);\n const wrapperCache = new Map<string, Component>();\n\n return (): VNode | null => {\n const route = routeContext.route.value;\n\n if (!route) {\n return null;\n }\n\n const elements: VNode[] = [];\n\n collectElements(slots.default?.(), elements);\n\n const { rendered, fallback } = buildRenderList(\n elements,\n route.name,\n props.nodeName,\n );\n\n if (rendered.length === 0) {\n return null;\n }\n\n const activeChild = rendered[0];\n\n if (props.keepAlive) {\n return renderWithRootKA(activeChild, wrapperCache, fallback);\n }\n\n /* v8 ignore start */\n if (activeChild.type !== Match && activeChild.type !== NotFound) {\n return null;\n }\n /* v8 ignore stop */\n\n const hasPerMatchKA = elements.some(\n (element) =>\n element.type === Match &&\n (element.props as { keepAlive?: boolean } | null)?.keepAlive === true,\n );\n\n if (hasPerMatchKA) {\n return renderWithPerMatchKA(activeChild, wrapperCache, fallback);\n }\n\n const content = getSlotContent(activeChild);\n\n if (!content) {\n return null;\n }\n\n return wrapWithSuspense(h(Fragment, content), fallback);\n };\n },\n});\n\nexport const RouteView = Object.assign(RouteViewComponent, { Match, NotFound });\n\nexport type {\n RouteViewProps,\n MatchProps as RouteViewMatchProps,\n NotFoundProps as RouteViewNotFoundProps,\n} from \"./types\";\n","import { createActiveRouteSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Params } from \"@real-router/core\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useIsActiveRoute(\n routeName: string,\n params?: Params,\n strict = false,\n ignoreQueryParams = true,\n): ShallowRef<boolean> {\n const router = useRouter();\n\n const source = createActiveRouteSource(router, routeName, params, {\n strict,\n ignoreQueryParams,\n });\n\n return useRefFromSource(source);\n}\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 { shouldNavigate, buildHref, buildActiveClassName } from \"dom-utils\";\nimport { defineComponent, h, computed } from \"vue\";\n\nimport { useIsActiveRoute } from \"../composables/useIsActiveRoute\";\nimport { useRouter } from \"../composables/useRouter\";\nimport { EMPTY_PARAMS, EMPTY_OPTIONS } from \"../constants\";\n\nimport type { Params, NavigationOptions } from \"@real-router/core\";\nimport type { PropType } from \"vue\";\n\nexport const Link = defineComponent({\n name: \"Link\",\n props: {\n routeName: {\n type: String,\n required: true,\n },\n routeParams: {\n type: Object as PropType<Params>,\n default: () => EMPTY_PARAMS,\n },\n routeOptions: {\n type: Object as PropType<NavigationOptions>,\n default: () => EMPTY_OPTIONS,\n },\n class: {\n type: String,\n default: undefined,\n },\n activeClassName: {\n type: String,\n default: \"active\",\n },\n activeStrict: {\n type: Boolean,\n default: false,\n },\n ignoreQueryParams: {\n type: Boolean,\n default: true,\n },\n target: {\n type: String,\n default: undefined,\n },\n },\n setup(props, { slots, attrs }) {\n const router = useRouter();\n\n const isActive = useIsActiveRoute(\n props.routeName,\n props.routeParams,\n props.activeStrict,\n props.ignoreQueryParams,\n );\n\n const href = computed(() =>\n buildHref(router, props.routeName, props.routeParams),\n );\n\n const finalClassName = computed(() =>\n buildActiveClassName(isActive.value, props.activeClassName, props.class),\n );\n\n const handleClick = (evt: MouseEvent) => {\n if (attrs.onClick && typeof attrs.onClick === \"function\") {\n (attrs.onClick as (evt: MouseEvent) => void)(evt);\n\n if (evt.defaultPrevented) {\n return;\n }\n }\n\n if (!shouldNavigate(evt) || props.target === \"_blank\") {\n return;\n }\n\n evt.preventDefault();\n router\n .navigate(props.routeName, props.routeParams, props.routeOptions)\n .catch(() => {});\n };\n\n return () =>\n h(\n \"a\",\n {\n ...attrs,\n href: href.value,\n class: finalClassName.value,\n target: props.target,\n onClick: handleClick,\n },\n slots.default?.(),\n );\n },\n});\n","import { createErrorSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { RouterErrorSnapshot, RouterSource } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nconst cache = new WeakMap<Router, RouterSource<RouterErrorSnapshot>>();\n\nexport function useRouterError(): ShallowRef<RouterErrorSnapshot> {\n const router = useRouter();\n\n let source = cache.get(router);\n\n if (!source) {\n source = createErrorSource(router);\n cache.set(router, source);\n }\n\n return useRefFromSource(source);\n}\n","import { defineComponent, h, ref, watch, computed, Fragment } from \"vue\";\n\nimport { useRouterError } from \"../composables/useRouterError\";\n\nimport type { RouterError, State } from \"@real-router/core\";\nimport type { VNode, PropType } from \"vue\";\n\nexport const RouterErrorBoundary = defineComponent({\n name: \"RouterErrorBoundary\",\n props: {\n fallback: {\n type: Function as PropType<\n (error: RouterError, resetError: () => void) => VNode\n >,\n required: true,\n },\n onError: {\n type: Function as PropType<\n (\n error: RouterError,\n toRoute: State | null,\n fromRoute: State | null,\n ) => void\n >,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const snapshot = useRouterError();\n const dismissedVersion = ref(-1);\n\n watch(\n () => snapshot.value.version,\n () => {\n if (snapshot.value.error) {\n props.onError?.(\n snapshot.value.error,\n snapshot.value.toRoute,\n snapshot.value.fromRoute,\n );\n }\n },\n { immediate: true },\n );\n\n const visibleError = computed(() =>\n snapshot.value.version > dismissedVersion.value\n ? snapshot.value.error\n : null,\n );\n\n const resetError = () => {\n dismissedVersion.value = snapshot.value.version;\n };\n\n return () => {\n const children = slots.default?.() ?? [];\n const errorVNode = visibleError.value\n ? props.fallback(visibleError.value, resetError)\n : null;\n\n return h(Fragment, null, [...children, errorVNode]);\n };\n },\n});\n\nexport type RouterErrorBoundaryProps = InstanceType<\n typeof RouterErrorBoundary\n>[\"$props\"];\n","import { shouldNavigate, applyLinkA11y } from \"dom-utils\";\n\nimport type { Router, NavigationOptions, Params } from \"@real-router/core\";\nimport type { Directive } from \"vue\";\n\nexport interface LinkDirectiveValue {\n name: string;\n params?: Params;\n options?: NavigationOptions;\n}\n\nlet _router: Router | null = null;\n\nexport function setDirectiveRouter(router: Router): void {\n _router = router;\n}\n\nexport function getDirectiveRouter(): Router {\n if (!_router) {\n /* v8 ignore next 3 -- @preserve Defensive: router always initialized by RouterProvider */\n throw new Error(\n \"v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.\",\n );\n }\n\n return _router;\n}\n\nconst clickHandlers = new WeakMap<HTMLElement, (evt: MouseEvent) => void>();\nconst keydownHandlers = new WeakMap<\n HTMLElement,\n (evt: KeyboardEvent) => void\n>();\n\nfunction createClickHandler(\n router: Router,\n value: LinkDirectiveValue,\n): (evt: MouseEvent) => void {\n return (evt: MouseEvent) => {\n if (!shouldNavigate(evt)) {\n return;\n }\n\n evt.preventDefault();\n router\n .navigate(value.name, value.params ?? {}, value.options ?? {})\n .catch(() => {});\n };\n}\n\nfunction createKeydownHandler(\n router: Router,\n value: LinkDirectiveValue,\n element: HTMLElement,\n): (evt: KeyboardEvent) => void {\n return (evt: KeyboardEvent) => {\n if (evt.key === \"Enter\" && !(element instanceof HTMLButtonElement)) {\n router\n .navigate(value.name, value.params ?? {}, value.options ?? {})\n .catch(() => {});\n }\n };\n}\n\nfunction attachHandlers(\n element: HTMLElement,\n router: Router,\n value: LinkDirectiveValue,\n): void {\n const handleClick = createClickHandler(router, value);\n const handleKeyDown = createKeydownHandler(router, value, element);\n\n element.addEventListener(\"click\", handleClick);\n element.addEventListener(\"keydown\", handleKeyDown);\n\n clickHandlers.set(element, handleClick);\n keydownHandlers.set(element, handleKeyDown);\n}\n\nfunction detachHandlers(element: HTMLElement): void {\n const clickHandler = clickHandlers.get(element);\n const keydownHandler = keydownHandlers.get(element);\n\n if (clickHandler) {\n element.removeEventListener(\"click\", clickHandler);\n }\n if (keydownHandler) {\n element.removeEventListener(\"keydown\", keydownHandler);\n }\n\n clickHandlers.delete(element);\n keydownHandlers.delete(element);\n}\n\nexport const vLink: Directive<HTMLElement, LinkDirectiveValue> = {\n mounted(element, binding) {\n const router = getDirectiveRouter();\n\n applyLinkA11y(element);\n\n element.style.cursor = \"pointer\";\n\n attachHandlers(element, router, binding.value);\n },\n\n updated(element, binding) {\n const router = getDirectiveRouter();\n\n detachHandlers(element);\n attachHandlers(element, router, binding.value);\n },\n\n beforeUnmount(element) {\n detachHandlers(element);\n },\n};\n","import { inject } from \"vue\";\n\nimport { NavigatorKey } from \"../context\";\n\nimport type { Navigator } from \"@real-router/core\";\n\nexport const useNavigator = (): Navigator => {\n const navigator = inject(NavigatorKey);\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 { inject } from \"vue\";\n\nimport { RouteKey } from \"../context\";\n\nimport type { RouteContext } from \"../types\";\n\nexport const useRoute = (): RouteContext => {\n const routeContext = inject(RouteKey);\n\n if (!routeContext) {\n throw new Error(\"useRoute must be used within a RouterProvider\");\n }\n\n return routeContext;\n};\n","import { createTransitionSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouterTransitionSnapshot } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useRouterTransition(): ShallowRef<RouterTransitionSnapshot> {\n const router = useRouter();\n\n const source = createTransitionSource(router);\n\n return useRefFromSource(source);\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { shallowRef } from \"vue\";\n\nimport { NavigatorKey, RouteKey, RouterKey } from \"./context\";\nimport { setDirectiveRouter } from \"./directives/vLink\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { Plugin } from \"vue\";\n\nexport function createRouterPlugin(router: Router): Plugin<[]> {\n return {\n install(app): void {\n const navigator = getNavigator(router);\n\n setDirectiveRouter(router);\n\n const source = createRouteSource(router);\n const initialSnapshot = source.getSnapshot();\n\n const route = shallowRef(initialSnapshot.route);\n const previousRoute = shallowRef(initialSnapshot.previousRoute);\n\n source.subscribe(() => {\n const snapshot = source.getSnapshot();\n\n route.value = snapshot.route;\n previousRoute.value = snapshot.previousRoute;\n });\n\n app.provide(RouterKey, router);\n app.provide(NavigatorKey, navigator);\n app.provide(RouteKey, { navigator, route, previousRoute });\n },\n };\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { createRouteAnnouncer } from \"dom-utils\";\nimport {\n defineComponent,\n onMounted,\n onUnmounted,\n provide,\n shallowRef,\n onScopeDispose,\n} from \"vue\";\n\nimport { NavigatorKey, RouteKey, RouterKey } from \"./context\";\nimport { setDirectiveRouter } from \"./directives/vLink\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { PropType } from \"vue\";\n\nexport const RouterProvider = defineComponent({\n name: \"RouterProvider\",\n props: {\n router: {\n type: Object as PropType<Router>,\n required: true,\n },\n announceNavigation: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n onMounted(() => {\n if (!props.announceNavigation) {\n return;\n }\n\n const announcer = createRouteAnnouncer(props.router);\n\n onUnmounted(() => {\n announcer.destroy();\n });\n });\n\n const navigator = getNavigator(props.router);\n\n setDirectiveRouter(props.router);\n\n const source = createRouteSource(props.router);\n const initialSnapshot = source.getSnapshot();\n\n const route = shallowRef(initialSnapshot.route);\n const previousRoute = shallowRef(initialSnapshot.previousRoute);\n\n const unsub = source.subscribe(() => {\n const snapshot = source.getSnapshot();\n\n route.value = snapshot.route;\n previousRoute.value = snapshot.previousRoute;\n });\n\n onScopeDispose(unsub);\n\n provide(RouterKey, props.router);\n provide(NavigatorKey, navigator);\n provide(RouteKey, { navigator, route, previousRoute });\n\n return () => slots.default?.();\n },\n});\n"],"mappings":"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"}
@@ -13,6 +13,7 @@ interface MatchProps {
13
13
  readonly segment: string;
14
14
  readonly exact?: boolean;
15
15
  readonly fallback?: VNode | (() => VNode);
16
+ readonly keepAlive?: boolean;
16
17
  }
17
18
  type NotFoundProps = Record<string, never>;
18
19
  //#endregion
@@ -76,6 +77,10 @@ declare const RouteView: {
76
77
  type: _$vue.PropType<VNode | (() => VNode)>;
77
78
  default: undefined;
78
79
  };
80
+ keepAlive: {
81
+ type: BooleanConstructor;
82
+ default: boolean;
83
+ };
79
84
  }>, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<_$vue.ExtractPropTypes<{
80
85
  segment: {
81
86
  type: _$vue.PropType<string>;
@@ -89,10 +94,15 @@ declare const RouteView: {
89
94
  type: _$vue.PropType<VNode | (() => VNode)>;
90
95
  default: undefined;
91
96
  };
97
+ keepAlive: {
98
+ type: BooleanConstructor;
99
+ default: boolean;
100
+ };
92
101
  }>> & Readonly<{}>, {
93
102
  fallback: VNode<_$vue.RendererNode, _$vue.RendererElement, {
94
103
  [key: string]: any;
95
104
  }> | (() => VNode);
105
+ keepAlive: boolean;
96
106
  exact: boolean;
97
107
  }, {}, {}, {}, string, _$vue.ComponentProvideOptions, true, {}, any>;
98
108
  NotFound: _$vue.DefineComponent<{}, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, _$vue.ComponentProvideOptions, true, {}, any>;
@@ -1,2 +1,2 @@
1
- import{Fragment as e,KeepAlive as t,Suspense as n,computed as r,defineComponent as i,h as a,inject as o,isVNode as s,markRaw as c,onMounted as l,onScopeDispose as u,onUnmounted as d,provide as f,ref as p,shallowRef as m,watch as h}from"vue";import{UNKNOWN_ROUTE as ee,getNavigator as g}from"@real-router/core";import{getRouteUtils as te,startsWithSegment as ne}from"@real-router/route-utils";import{createActiveRouteSource as re,createErrorSource as _,createRouteNodeSource as v,createRouteSource as y,createTransitionSource as ie}from"@real-router/sources";import{applyLinkA11y as ae,buildActiveClassName as oe,buildHref as b,createRouteAnnouncer as x,shouldNavigate as S}from"dom-utils";import{getPluginApi as C}from"@real-router/core/api";function w(){return null}const T=i({name:`RouteView.Match`,props:{segment:{type:String,required:!0},exact:{type:Boolean,default:!1},fallback:{type:[Object,Function],default:void 0}},render:w}),E=i({name:`RouteView.NotFound`,render:w});function D(e,t,n){return n?e===t:ne(e,t)}function O(e){if(Array.isArray(e)){let t=[];for(let n of e)Array.isArray(n)?t.push(...O(n)):s(n)&&t.push(n);return t}return s(e)?[e]:[]}function k(t,n){let r=O(t);for(let t of r)t.type===T||t.type===E?n.push(t):t.type===e&&k(t.children,n)}function se(e,t,n){let r=null,i=!1,a,o=[];for(let s of e){if(s.type===E){r=s.children;continue}let e=s.props,c=e?.segment??``,l=e?.exact??!1,u=n?`${n}.${c}`:c;!i&&D(t,u,l)&&(i=!0,a=e?.fallback,o.push(s))}if(!i&&t===ee&&r!==null){let t=e.filter(e=>e.type===E).at(-1);t&&o.push(t)}return{rendered:o,activeMatchFound:i,fallback:a}}function A(e){let t=m(e.getSnapshot());return u(e.subscribe(()=>{t.value=e.getSnapshot()})),t}const j=Symbol(`RouterKey`),M=Symbol(`NavigatorKey`),N=Symbol(`RouteKey`),P=()=>{let e=o(j);if(!e)throw Error(`useRouter must be used within a RouterProvider`);return e};function F(e){let t=P(),n=A(v(t,e)),r=g(t),i=m(n.value.route),a=m(n.value.previousRoute);return h(n,e=>{i.value=e.route,a.value=e.previousRoute},{flush:`sync`}),{navigator:r,route:i,previousRoute:a}}function I(e){return e.children?.default?.()??null}function L(e,t){let n=e.get(t);if(n)return n;let r=c(i({name:`KeepAlive-${t}`,setup(e,t){return()=>t.slots.default?.()}}));return e.set(t,r),r}function R(e,t){if(t===void 0)return e;let r=typeof t==`function`?t():t;return a(n,{},{default:()=>e,fallback:()=>r})}const z=i({name:`RouteView`,props:{nodeName:{type:String,required:!0},keepAlive:{type:Boolean,default:!1}},setup(n,{slots:r}){let i=F(n.nodeName),o=new Map;return()=>{let s=i.route.value;if(!s)return null;let c=[];k(r.default?.(),c);let{rendered:l,fallback:u}=se(c,s.name,n.nodeName);if(l.length===0)return null;let d=l[0];if(!n.keepAlive){if(d.type===T||d.type===E){let t=I(d);return t?R(a(e,t),u):null}return null}let f=d.props?.segment??`__not-found__`,p=L(o,f),m=I(d)??[];return R(a(t,null,{default:()=>a(p,{key:f},{default:()=>m})}),u)}}}),B=Object.assign(z,{Match:T,NotFound:E});function V(e,t,n=!1,r=!0){return A(re(P(),e,t,{strict:n,ignoreQueryParams:r}))}const H=Object.freeze({}),U=Object.freeze({}),W=i({name:`Link`,props:{routeName:{type:String,required:!0},routeParams:{type:Object,default:()=>H},routeOptions:{type:Object,default:()=>U},class:{type:String,default:void 0},activeClassName:{type:String,default:`active`},activeStrict:{type:Boolean,default:!1},ignoreQueryParams:{type:Boolean,default:!0},target:{type:String,default:void 0}},setup(e,{slots:t,attrs:n}){let i=P(),o=V(e.routeName,e.routeParams,e.activeStrict,e.ignoreQueryParams),s=r(()=>b(i,e.routeName,e.routeParams)),c=r(()=>oe(o.value,e.activeClassName,e.class)),l=t=>{n.onClick&&typeof n.onClick==`function`&&(n.onClick(t),t.defaultPrevented)||!S(t)||e.target===`_blank`||(t.preventDefault(),i.navigate(e.routeName,e.routeParams,e.routeOptions).catch(()=>{}))};return()=>a(`a`,{...n,href:s.value,class:c.value,target:e.target,onClick:l},t.default?.())}}),G=new WeakMap;function ce(){let e=P(),t=G.get(e);return t||(t=_(e),G.set(e,t)),A(t)}const le=i({name:`RouterErrorBoundary`,props:{fallback:{type:Function,required:!0},onError:{type:Function,default:void 0}},setup(t,{slots:n}){let i=ce(),o=p(-1);h(()=>i.value.version,()=>{i.value.error&&t.onError?.(i.value.error,i.value.toRoute,i.value.fromRoute)},{immediate:!0});let s=r(()=>i.value.version>o.value?i.value.error:null),c=()=>{o.value=i.value.version};return()=>{let r=n.default?.()??[],i=s.value?t.fallback(s.value,c):null;return a(e,null,[...r,i])}}});let K=null;function q(e){K=e}function J(){if(!K)throw Error(`v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.`);return K}const Y=new WeakMap,X=new WeakMap;function Z(e,t){return n=>{S(n)&&(n.preventDefault(),e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{}))}}function ue(e,t,n){return r=>{r.key===`Enter`&&!(n instanceof HTMLButtonElement)&&e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{})}}function Q(e,t,n){let r=Z(t,n),i=ue(t,n,e);e.addEventListener(`click`,r),e.addEventListener(`keydown`,i),Y.set(e,r),X.set(e,i)}function $(e){let t=Y.get(e),n=X.get(e);t&&e.removeEventListener(`click`,t),n&&e.removeEventListener(`keydown`,n),Y.delete(e),X.delete(e)}const de={mounted(e,t){let n=J();ae(e),e.style.cursor=`pointer`,Q(e,n,t.value)},updated(e,t){let n=J();$(e),Q(e,n,t.value)},beforeUnmount(e){$(e)}},fe=()=>{let e=o(M);if(!e)throw Error(`useNavigator must be used within a RouterProvider`);return e},pe=()=>te(C(P()).getTree()),me=()=>{let e=o(N);if(!e)throw Error(`useRoute must be used within a RouterProvider`);return e};function he(){return A(ie(P()))}function ge(e){return{install(t){let n=g(e);q(e);let r=y(e),i=r.getSnapshot(),a=m(i.route),o=m(i.previousRoute);r.subscribe(()=>{let e=r.getSnapshot();a.value=e.route,o.value=e.previousRoute}),t.provide(j,e),t.provide(M,n),t.provide(N,{navigator:n,route:a,previousRoute:o})}}}const _e=i({name:`RouterProvider`,props:{router:{type:Object,required:!0},announceNavigation:{type:Boolean,default:!1}},setup(e,{slots:t}){l(()=>{if(!e.announceNavigation)return;let t=x(e.router);d(()=>{t.destroy()})});let n=g(e.router);q(e.router);let r=y(e.router),i=r.getSnapshot(),a=m(i.route),o=m(i.previousRoute);return u(r.subscribe(()=>{let e=r.getSnapshot();a.value=e.route,o.value=e.previousRoute})),f(j,e.router),f(M,n),f(N,{navigator:n,route:a,previousRoute:o}),()=>t.default?.()}});export{W as Link,M as NavigatorKey,N as RouteKey,B as RouteView,le as RouterErrorBoundary,j as RouterKey,_e as RouterProvider,ge as createRouterPlugin,fe as useNavigator,me as useRoute,F as useRouteNode,pe as useRouteUtils,P as useRouter,he as useRouterTransition,de as vLink};
1
+ import{Fragment as e,KeepAlive as t,Suspense as n,computed as r,defineComponent as i,h as a,inject as o,isVNode as s,markRaw as c,onMounted as l,onScopeDispose as u,onUnmounted as d,provide as f,ref as ee,shallowRef as p,watch as m}from"vue";import{UNKNOWN_ROUTE as h,getNavigator as g}from"@real-router/core";import{getRouteUtils as te,startsWithSegment as ne}from"@real-router/route-utils";import{createActiveRouteSource as re,createErrorSource as _,createRouteNodeSource as v,createRouteSource as y,createTransitionSource as ie}from"@real-router/sources";import{applyLinkA11y as ae,buildActiveClassName as oe,buildHref as se,createRouteAnnouncer as b,shouldNavigate as x}from"dom-utils";import{getPluginApi as S}from"@real-router/core/api";function C(){return null}const w=i({name:`RouteView.Match`,props:{segment:{type:String,required:!0},exact:{type:Boolean,default:!1},fallback:{type:[Object,Function],default:void 0},keepAlive:{type:Boolean,default:!1}},render:C}),T=i({name:`RouteView.NotFound`,render:C});function E(e,t,n){return n?e===t:ne(e,t)}function D(e){if(Array.isArray(e)){let t=[];for(let n of e)Array.isArray(n)?t.push(...D(n)):s(n)&&t.push(n);return t}return s(e)?[e]:[]}function O(t,n){let r=D(t);for(let t of r)t.type===w||t.type===T?n.push(t):t.type===e&&O(t.children,n)}function ce(e,t,n){let r=null,i=!1,a,o=[];for(let s of e){if(s.type===T){r=s.children;continue}let e=s.props,c=e?.segment??``,l=e?.exact??!1,u=n?`${n}.${c}`:c;!i&&E(t,u,l)&&(i=!0,a=e?.fallback,o.push(s))}if(!i&&t===h&&r!==null){let t=e.filter(e=>e.type===T).at(-1);t&&o.push(t)}return{rendered:o,activeMatchFound:i,fallback:a}}function k(e){let t=p(e.getSnapshot());return u(e.subscribe(()=>{t.value=e.getSnapshot()})),t}const A=Symbol(`RouterKey`),j=Symbol(`NavigatorKey`),M=Symbol(`RouteKey`),N=()=>{let e=o(A);if(!e)throw Error(`useRouter must be used within a RouterProvider`);return e};function P(e){let t=N(),n=k(v(t,e)),r=g(t),i=p(n.value.route),a=p(n.value.previousRoute);return m(n,e=>{i.value=e.route,a.value=e.previousRoute},{flush:`sync`}),{navigator:r,route:i,previousRoute:a}}function F(e){return e.children?.default?.()??null}function I(e,t){let n=e.get(t);if(n)return n;let r=c(i({name:`KeepAlive-${t}`,setup(e,t){return()=>t.slots.default?.()}}));return e.set(t,r),r}function L(e,t){if(t===void 0)return e;let r=typeof t==`function`?t():t;return a(n,{},{default:()=>e,fallback:()=>r})}const R=c(i({name:`KeepAlive-placeholder`,render(){return null}}));function z(e,n,r){let i=e.props?.segment??`__not-found__`,o=I(n,i),s=F(e)??[];return L(a(t,null,{default:()=>a(o,{key:i},{default:()=>s})}),r)}function B(n,r,i){let o=n.props;if(o?.keepAlive===!0&&n.type===w){let i=o.segment??`__not-found__`,s=I(r,i),c=F(n)??[];return a(e,[a(t,null,{default:()=>a(s,{key:i},{default:()=>c})})])}let s=F(n);return s?a(e,[a(t,null,{default:()=>a(R)}),L(a(e,s),i)]):null}const V=i({name:`RouteView`,props:{nodeName:{type:String,required:!0},keepAlive:{type:Boolean,default:!1}},setup(t,{slots:n}){let r=P(t.nodeName),i=new Map;return()=>{let o=r.route.value;if(!o)return null;let s=[];O(n.default?.(),s);let{rendered:c,fallback:l}=ce(s,o.name,t.nodeName);if(c.length===0)return null;let u=c[0];if(t.keepAlive)return z(u,i,l);if(u.type!==w&&u.type!==T)return null;if(s.some(e=>e.type===w&&e.props?.keepAlive===!0))return B(u,i,l);let d=F(u);return d?L(a(e,d),l):null}}}),H=Object.assign(V,{Match:w,NotFound:T});function U(e,t,n=!1,r=!0){return k(re(N(),e,t,{strict:n,ignoreQueryParams:r}))}const W=Object.freeze({}),G=Object.freeze({}),le=i({name:`Link`,props:{routeName:{type:String,required:!0},routeParams:{type:Object,default:()=>W},routeOptions:{type:Object,default:()=>G},class:{type:String,default:void 0},activeClassName:{type:String,default:`active`},activeStrict:{type:Boolean,default:!1},ignoreQueryParams:{type:Boolean,default:!0},target:{type:String,default:void 0}},setup(e,{slots:t,attrs:n}){let i=N(),o=U(e.routeName,e.routeParams,e.activeStrict,e.ignoreQueryParams),s=r(()=>se(i,e.routeName,e.routeParams)),c=r(()=>oe(o.value,e.activeClassName,e.class)),l=t=>{n.onClick&&typeof n.onClick==`function`&&(n.onClick(t),t.defaultPrevented)||!x(t)||e.target===`_blank`||(t.preventDefault(),i.navigate(e.routeName,e.routeParams,e.routeOptions).catch(()=>{}))};return()=>a(`a`,{...n,href:s.value,class:c.value,target:e.target,onClick:l},t.default?.())}}),K=new WeakMap;function ue(){let e=N(),t=K.get(e);return t||(t=_(e),K.set(e,t)),k(t)}const de=i({name:`RouterErrorBoundary`,props:{fallback:{type:Function,required:!0},onError:{type:Function,default:void 0}},setup(t,{slots:n}){let i=ue(),o=ee(-1);m(()=>i.value.version,()=>{i.value.error&&t.onError?.(i.value.error,i.value.toRoute,i.value.fromRoute)},{immediate:!0});let s=r(()=>i.value.version>o.value?i.value.error:null),c=()=>{o.value=i.value.version};return()=>{let r=n.default?.()??[],i=s.value?t.fallback(s.value,c):null;return a(e,null,[...r,i])}}});let q=null;function J(e){q=e}function Y(){if(!q)throw Error(`v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.`);return q}const X=new WeakMap,Z=new WeakMap;function fe(e,t){return n=>{x(n)&&(n.preventDefault(),e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{}))}}function pe(e,t,n){return r=>{r.key===`Enter`&&!(n instanceof HTMLButtonElement)&&e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{})}}function Q(e,t,n){let r=fe(t,n),i=pe(t,n,e);e.addEventListener(`click`,r),e.addEventListener(`keydown`,i),X.set(e,r),Z.set(e,i)}function $(e){let t=X.get(e),n=Z.get(e);t&&e.removeEventListener(`click`,t),n&&e.removeEventListener(`keydown`,n),X.delete(e),Z.delete(e)}const me={mounted(e,t){let n=Y();ae(e),e.style.cursor=`pointer`,Q(e,n,t.value)},updated(e,t){let n=Y();$(e),Q(e,n,t.value)},beforeUnmount(e){$(e)}},he=()=>{let e=o(j);if(!e)throw Error(`useNavigator must be used within a RouterProvider`);return e},ge=()=>te(S(N()).getTree()),_e=()=>{let e=o(M);if(!e)throw Error(`useRoute must be used within a RouterProvider`);return e};function ve(){return k(ie(N()))}function ye(e){return{install(t){let n=g(e);J(e);let r=y(e),i=r.getSnapshot(),a=p(i.route),o=p(i.previousRoute);r.subscribe(()=>{let e=r.getSnapshot();a.value=e.route,o.value=e.previousRoute}),t.provide(A,e),t.provide(j,n),t.provide(M,{navigator:n,route:a,previousRoute:o})}}}const be=i({name:`RouterProvider`,props:{router:{type:Object,required:!0},announceNavigation:{type:Boolean,default:!1}},setup(e,{slots:t}){l(()=>{if(!e.announceNavigation)return;let t=b(e.router);d(()=>{t.destroy()})});let n=g(e.router);J(e.router);let r=y(e.router),i=r.getSnapshot(),a=p(i.route),o=p(i.previousRoute);return u(r.subscribe(()=>{let e=r.getSnapshot();a.value=e.route,o.value=e.previousRoute})),f(A,e.router),f(j,n),f(M,{navigator:n,route:a,previousRoute:o}),()=>t.default?.()}});export{le as Link,j as NavigatorKey,M as RouteKey,H as RouteView,de as RouterErrorBoundary,A as RouterKey,be as RouterProvider,ye as createRouterPlugin,he as useNavigator,_e as useRoute,P as useRouteNode,ge as useRouteUtils,N as useRouter,ve as useRouterTransition,me as vLink};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/components/RouteView/components.ts","../../src/components/RouteView/helpers.ts","../../src/useRefFromSource.ts","../../src/context.ts","../../src/composables/useRouter.ts","../../src/composables/useRouteNode.ts","../../src/components/RouteView/RouteView.ts","../../src/composables/useIsActiveRoute.ts","../../src/constants.ts","../../src/components/Link.ts","../../src/composables/useRouterError.ts","../../src/components/RouterErrorBoundary.ts","../../src/directives/vLink.ts","../../src/composables/useNavigator.ts","../../src/composables/useRouteUtils.ts","../../src/composables/useRoute.ts","../../src/composables/useRouterTransition.ts","../../src/createRouterPlugin.ts","../../src/RouterProvider.ts"],"sourcesContent":["import { defineComponent } from \"vue\";\n\nimport type { PropType, VNode } from \"vue\";\n\nfunction renderNull() {\n return null;\n}\n\nexport const Match = defineComponent({\n name: \"RouteView.Match\",\n props: {\n segment: {\n type: String as PropType<string>,\n required: true,\n },\n exact: {\n type: Boolean,\n default: false,\n },\n fallback: {\n type: [Object, Function] as PropType<VNode | (() => VNode)>,\n default: undefined,\n },\n },\n render: renderNull,\n});\n\nexport const NotFound = defineComponent({\n name: \"RouteView.NotFound\",\n render: renderNull,\n});\n","import { UNKNOWN_ROUTE } from \"@real-router/core\";\nimport { startsWithSegment } from \"@real-router/route-utils\";\nimport { Fragment, isVNode } from \"vue\";\n\nimport { Match, NotFound } from \"./components\";\n\nimport type { VNode } from \"vue\";\n\ntype FallbackType = VNode | (() => VNode) | undefined;\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\nfunction normalizeChildren(children: unknown): VNode[] {\n if (Array.isArray(children)) {\n const result: VNode[] = [];\n\n for (const child of children) {\n if (Array.isArray(child)) {\n result.push(...normalizeChildren(child));\n } else if (isVNode(child)) {\n result.push(child);\n }\n }\n\n return result;\n }\n\n if (isVNode(children)) {\n return [children];\n }\n\n return [];\n}\n\nexport function collectElements(children: unknown, result: VNode[]): void {\n const vnodes = normalizeChildren(children);\n\n for (const child of vnodes) {\n if (child.type === Match || child.type === NotFound) {\n result.push(child);\n } else if (child.type === Fragment) {\n collectElements(child.children, result);\n }\n }\n}\n\nexport function buildRenderList(\n elements: VNode[],\n routeName: string,\n nodeName: string,\n): {\n rendered: VNode[];\n activeMatchFound: boolean;\n fallback?: FallbackType;\n} {\n let notFoundChildren: unknown = null;\n let activeMatchFound = false;\n let fallback: FallbackType = undefined;\n const rendered: VNode[] = [];\n\n for (const child of elements) {\n if (child.type === NotFound) {\n notFoundChildren = child.children;\n continue;\n }\n\n const props = child.props as {\n segment: string;\n exact?: boolean;\n fallback?: FallbackType;\n } | null;\n const segment = props?.segment ?? \"\";\n const exact = props?.exact ?? false;\n const fullSegmentName = nodeName ? `${nodeName}.${segment}` : segment;\n const isActive =\n !activeMatchFound && isSegmentMatch(routeName, fullSegmentName, exact);\n\n if (isActive) {\n activeMatchFound = true;\n fallback = props?.fallback;\n rendered.push(child);\n }\n }\n\n if (\n !activeMatchFound &&\n routeName === UNKNOWN_ROUTE &&\n notFoundChildren !== null\n ) {\n const nfElements = elements.filter((element) => element.type === NotFound);\n /* v8 ignore next 3 */\n const lastNf = nfElements.at(-1);\n\n if (lastNf) {\n rendered.push(lastNf);\n }\n }\n\n return { rendered, activeMatchFound, fallback };\n}\n","import { shallowRef, onScopeDispose } from \"vue\";\n\nimport type { RouterSource } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useRefFromSource<T>(source: RouterSource<T>): ShallowRef<T> {\n const ref = shallowRef(source.getSnapshot());\n\n const unsub = source.subscribe(() => {\n ref.value = source.getSnapshot();\n });\n\n onScopeDispose(unsub);\n\n return ref;\n}\n","import type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\nimport type { InjectionKey } from \"vue\";\n\nexport const RouterKey: InjectionKey<Router> = Symbol(\"RouterKey\");\n\nexport const NavigatorKey: InjectionKey<Navigator> = Symbol(\"NavigatorKey\");\n\nexport const RouteKey: InjectionKey<RouteContextType> = Symbol(\"RouteKey\");\n","import { inject } from \"vue\";\n\nimport { RouterKey } from \"../context\";\n\nimport type { Router } from \"@real-router/core\";\n\nexport const useRouter = (): Router => {\n const router = inject(RouterKey);\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 { shallowRef, watch } from \"vue\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteContext } from \"../types\";\nimport type { State } from \"@real-router/core\";\n\nexport function useRouteNode(nodeName: string): RouteContext {\n const router = useRouter();\n\n const source = createRouteNodeSource(router, nodeName);\n const snapshot = useRefFromSource(source);\n\n const navigator = getNavigator(router);\n\n const route = shallowRef<State | undefined>(snapshot.value.route);\n const previousRoute = shallowRef<State | undefined>(\n snapshot.value.previousRoute,\n );\n\n watch(\n snapshot,\n (newSnapshot) => {\n route.value = newSnapshot.route;\n previousRoute.value = newSnapshot.previousRoute;\n },\n { flush: \"sync\" },\n );\n\n return {\n navigator,\n route,\n previousRoute,\n };\n}\n","import {\n Fragment,\n defineComponent,\n h,\n KeepAlive,\n markRaw,\n Suspense,\n} from \"vue\";\n\nimport { Match, NotFound } from \"./components\";\nimport { buildRenderList, collectElements } from \"./helpers\";\nimport { useRouteNode } from \"../../composables/useRouteNode\";\n\nimport type { Component, VNode } from \"vue\";\n\ntype SlotChildren = Record<string, (() => VNode[]) | undefined> | null;\n\nfunction getSlotContent(vnode: VNode): VNode[] | null {\n const slots = vnode.children as SlotChildren;\n\n return slots?.default?.() ?? null;\n}\n\nfunction getOrCreateWrapper(\n cache: Map<string, Component>,\n segment: string,\n): Component {\n const existing = cache.get(segment);\n\n if (existing) {\n return existing;\n }\n\n const wrapper = markRaw(\n defineComponent({\n name: `KeepAlive-${segment}`,\n setup(_wrapperProps, wrapperCtx) {\n return () => wrapperCtx.slots.default?.();\n },\n }),\n );\n\n cache.set(segment, wrapper);\n\n return wrapper;\n}\n\nfunction wrapWithSuspense(content: VNode, fallback: unknown): VNode {\n if (fallback === undefined) {\n return content;\n }\n\n const fallbackContent =\n typeof fallback === \"function\" ? (fallback as () => VNode)() : fallback;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n const suspenseComponent = Suspense as any;\n\n return h(\n suspenseComponent,\n {},\n {\n default: () => content,\n fallback: () => fallbackContent,\n },\n );\n}\n\nconst RouteViewComponent = defineComponent({\n name: \"RouteView\",\n props: {\n nodeName: {\n type: String,\n required: true,\n },\n keepAlive: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n const routeContext = useRouteNode(props.nodeName);\n\n const wrapperCache = new Map<string, Component>();\n\n return (): VNode | null => {\n const route = routeContext.route.value;\n\n if (!route) {\n return null;\n }\n\n const elements: VNode[] = [];\n\n collectElements(slots.default?.(), elements);\n\n const { rendered, fallback } = buildRenderList(\n elements,\n route.name,\n props.nodeName,\n );\n\n if (rendered.length === 0) {\n return null;\n }\n\n const activeChild = rendered[0];\n\n if (!props.keepAlive) {\n if (activeChild.type === Match || activeChild.type === NotFound) {\n const content = getSlotContent(activeChild);\n\n if (!content) {\n return null;\n }\n\n const fragment = h(Fragment, content);\n\n return wrapWithSuspense(fragment, fallback);\n }\n\n /* v8 ignore start */\n return null;\n /* v8 ignore stop */\n }\n\n const activeProps = activeChild.props as {\n segment?: string;\n } | null;\n const segment = activeProps?.segment ?? \"__not-found__\";\n\n const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);\n /* v8 ignore next */\n const slotContent = getSlotContent(activeChild) ?? [];\n\n const keepAliveContent = h(KeepAlive, null, {\n default: () =>\n h(WrapperComponent, { key: segment }, { default: () => slotContent }),\n });\n\n return wrapWithSuspense(keepAliveContent, fallback);\n };\n },\n});\n\nexport const RouteView = Object.assign(RouteViewComponent, { Match, NotFound });\n\nexport type {\n RouteViewProps,\n MatchProps as RouteViewMatchProps,\n NotFoundProps as RouteViewNotFoundProps,\n} from \"./types\";\n","import { createActiveRouteSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Params } from \"@real-router/core\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useIsActiveRoute(\n routeName: string,\n params?: Params,\n strict = false,\n ignoreQueryParams = true,\n): ShallowRef<boolean> {\n const router = useRouter();\n\n const source = createActiveRouteSource(router, routeName, params, {\n strict,\n ignoreQueryParams,\n });\n\n return useRefFromSource(source);\n}\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 { shouldNavigate, buildHref, buildActiveClassName } from \"dom-utils\";\nimport { defineComponent, h, computed } from \"vue\";\n\nimport { useIsActiveRoute } from \"../composables/useIsActiveRoute\";\nimport { useRouter } from \"../composables/useRouter\";\nimport { EMPTY_PARAMS, EMPTY_OPTIONS } from \"../constants\";\n\nimport type { Params, NavigationOptions } from \"@real-router/core\";\nimport type { PropType } from \"vue\";\n\nexport const Link = defineComponent({\n name: \"Link\",\n props: {\n routeName: {\n type: String,\n required: true,\n },\n routeParams: {\n type: Object as PropType<Params>,\n default: () => EMPTY_PARAMS,\n },\n routeOptions: {\n type: Object as PropType<NavigationOptions>,\n default: () => EMPTY_OPTIONS,\n },\n class: {\n type: String,\n default: undefined,\n },\n activeClassName: {\n type: String,\n default: \"active\",\n },\n activeStrict: {\n type: Boolean,\n default: false,\n },\n ignoreQueryParams: {\n type: Boolean,\n default: true,\n },\n target: {\n type: String,\n default: undefined,\n },\n },\n setup(props, { slots, attrs }) {\n const router = useRouter();\n\n const isActive = useIsActiveRoute(\n props.routeName,\n props.routeParams,\n props.activeStrict,\n props.ignoreQueryParams,\n );\n\n const href = computed(() =>\n buildHref(router, props.routeName, props.routeParams),\n );\n\n const finalClassName = computed(() =>\n buildActiveClassName(isActive.value, props.activeClassName, props.class),\n );\n\n const handleClick = (evt: MouseEvent) => {\n if (attrs.onClick && typeof attrs.onClick === \"function\") {\n (attrs.onClick as (evt: MouseEvent) => void)(evt);\n\n if (evt.defaultPrevented) {\n return;\n }\n }\n\n if (!shouldNavigate(evt) || props.target === \"_blank\") {\n return;\n }\n\n evt.preventDefault();\n router\n .navigate(props.routeName, props.routeParams, props.routeOptions)\n .catch(() => {});\n };\n\n return () =>\n h(\n \"a\",\n {\n ...attrs,\n href: href.value,\n class: finalClassName.value,\n target: props.target,\n onClick: handleClick,\n },\n slots.default?.(),\n );\n },\n});\n","import { createErrorSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { RouterErrorSnapshot, RouterSource } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nconst cache = new WeakMap<Router, RouterSource<RouterErrorSnapshot>>();\n\nexport function useRouterError(): ShallowRef<RouterErrorSnapshot> {\n const router = useRouter();\n\n let source = cache.get(router);\n\n if (!source) {\n source = createErrorSource(router);\n cache.set(router, source);\n }\n\n return useRefFromSource(source);\n}\n","import { defineComponent, h, ref, watch, computed, Fragment } from \"vue\";\n\nimport { useRouterError } from \"../composables/useRouterError\";\n\nimport type { RouterError, State } from \"@real-router/core\";\nimport type { VNode, PropType } from \"vue\";\n\nexport const RouterErrorBoundary = defineComponent({\n name: \"RouterErrorBoundary\",\n props: {\n fallback: {\n type: Function as PropType<\n (error: RouterError, resetError: () => void) => VNode\n >,\n required: true,\n },\n onError: {\n type: Function as PropType<\n (\n error: RouterError,\n toRoute: State | null,\n fromRoute: State | null,\n ) => void\n >,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const snapshot = useRouterError();\n const dismissedVersion = ref(-1);\n\n watch(\n () => snapshot.value.version,\n () => {\n if (snapshot.value.error) {\n props.onError?.(\n snapshot.value.error,\n snapshot.value.toRoute,\n snapshot.value.fromRoute,\n );\n }\n },\n { immediate: true },\n );\n\n const visibleError = computed(() =>\n snapshot.value.version > dismissedVersion.value\n ? snapshot.value.error\n : null,\n );\n\n const resetError = () => {\n dismissedVersion.value = snapshot.value.version;\n };\n\n return () => {\n const children = slots.default?.() ?? [];\n const errorVNode = visibleError.value\n ? props.fallback(visibleError.value, resetError)\n : null;\n\n return h(Fragment, null, [...children, errorVNode]);\n };\n },\n});\n\nexport type RouterErrorBoundaryProps = InstanceType<\n typeof RouterErrorBoundary\n>[\"$props\"];\n","import { shouldNavigate, applyLinkA11y } from \"dom-utils\";\n\nimport type { Router, NavigationOptions, Params } from \"@real-router/core\";\nimport type { Directive } from \"vue\";\n\nexport interface LinkDirectiveValue {\n name: string;\n params?: Params;\n options?: NavigationOptions;\n}\n\nlet _router: Router | null = null;\n\nexport function setDirectiveRouter(router: Router): void {\n _router = router;\n}\n\nexport function getDirectiveRouter(): Router {\n if (!_router) {\n /* v8 ignore next 3 -- @preserve Defensive: router always initialized by RouterProvider */\n throw new Error(\n \"v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.\",\n );\n }\n\n return _router;\n}\n\nconst clickHandlers = new WeakMap<HTMLElement, (evt: MouseEvent) => void>();\nconst keydownHandlers = new WeakMap<\n HTMLElement,\n (evt: KeyboardEvent) => void\n>();\n\nfunction createClickHandler(\n router: Router,\n value: LinkDirectiveValue,\n): (evt: MouseEvent) => void {\n return (evt: MouseEvent) => {\n if (!shouldNavigate(evt)) {\n return;\n }\n\n evt.preventDefault();\n router\n .navigate(value.name, value.params ?? {}, value.options ?? {})\n .catch(() => {});\n };\n}\n\nfunction createKeydownHandler(\n router: Router,\n value: LinkDirectiveValue,\n element: HTMLElement,\n): (evt: KeyboardEvent) => void {\n return (evt: KeyboardEvent) => {\n if (evt.key === \"Enter\" && !(element instanceof HTMLButtonElement)) {\n router\n .navigate(value.name, value.params ?? {}, value.options ?? {})\n .catch(() => {});\n }\n };\n}\n\nfunction attachHandlers(\n element: HTMLElement,\n router: Router,\n value: LinkDirectiveValue,\n): void {\n const handleClick = createClickHandler(router, value);\n const handleKeyDown = createKeydownHandler(router, value, element);\n\n element.addEventListener(\"click\", handleClick);\n element.addEventListener(\"keydown\", handleKeyDown);\n\n clickHandlers.set(element, handleClick);\n keydownHandlers.set(element, handleKeyDown);\n}\n\nfunction detachHandlers(element: HTMLElement): void {\n const clickHandler = clickHandlers.get(element);\n const keydownHandler = keydownHandlers.get(element);\n\n if (clickHandler) {\n element.removeEventListener(\"click\", clickHandler);\n }\n if (keydownHandler) {\n element.removeEventListener(\"keydown\", keydownHandler);\n }\n\n clickHandlers.delete(element);\n keydownHandlers.delete(element);\n}\n\nexport const vLink: Directive<HTMLElement, LinkDirectiveValue> = {\n mounted(element, binding) {\n const router = getDirectiveRouter();\n\n applyLinkA11y(element);\n\n element.style.cursor = \"pointer\";\n\n attachHandlers(element, router, binding.value);\n },\n\n updated(element, binding) {\n const router = getDirectiveRouter();\n\n detachHandlers(element);\n attachHandlers(element, router, binding.value);\n },\n\n beforeUnmount(element) {\n detachHandlers(element);\n },\n};\n","import { inject } from \"vue\";\n\nimport { NavigatorKey } from \"../context\";\n\nimport type { Navigator } from \"@real-router/core\";\n\nexport const useNavigator = (): Navigator => {\n const navigator = inject(NavigatorKey);\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 { inject } from \"vue\";\n\nimport { RouteKey } from \"../context\";\n\nimport type { RouteContext } from \"../types\";\n\nexport const useRoute = (): RouteContext => {\n const routeContext = inject(RouteKey);\n\n if (!routeContext) {\n throw new Error(\"useRoute must be used within a RouterProvider\");\n }\n\n return routeContext;\n};\n","import { createTransitionSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouterTransitionSnapshot } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useRouterTransition(): ShallowRef<RouterTransitionSnapshot> {\n const router = useRouter();\n\n const source = createTransitionSource(router);\n\n return useRefFromSource(source);\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { shallowRef } from \"vue\";\n\nimport { NavigatorKey, RouteKey, RouterKey } from \"./context\";\nimport { setDirectiveRouter } from \"./directives/vLink\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { Plugin } from \"vue\";\n\nexport function createRouterPlugin(router: Router): Plugin<[]> {\n return {\n install(app): void {\n const navigator = getNavigator(router);\n\n setDirectiveRouter(router);\n\n const source = createRouteSource(router);\n const initialSnapshot = source.getSnapshot();\n\n const route = shallowRef(initialSnapshot.route);\n const previousRoute = shallowRef(initialSnapshot.previousRoute);\n\n source.subscribe(() => {\n const snapshot = source.getSnapshot();\n\n route.value = snapshot.route;\n previousRoute.value = snapshot.previousRoute;\n });\n\n app.provide(RouterKey, router);\n app.provide(NavigatorKey, navigator);\n app.provide(RouteKey, { navigator, route, previousRoute });\n },\n };\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { createRouteAnnouncer } from \"dom-utils\";\nimport {\n defineComponent,\n onMounted,\n onUnmounted,\n provide,\n shallowRef,\n onScopeDispose,\n} from \"vue\";\n\nimport { NavigatorKey, RouteKey, RouterKey } from \"./context\";\nimport { setDirectiveRouter } from \"./directives/vLink\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { PropType } from \"vue\";\n\nexport const RouterProvider = defineComponent({\n name: \"RouterProvider\",\n props: {\n router: {\n type: Object as PropType<Router>,\n required: true,\n },\n announceNavigation: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n onMounted(() => {\n if (!props.announceNavigation) {\n return;\n }\n\n const announcer = createRouteAnnouncer(props.router);\n\n onUnmounted(() => {\n announcer.destroy();\n });\n });\n\n const navigator = getNavigator(props.router);\n\n setDirectiveRouter(props.router);\n\n const source = createRouteSource(props.router);\n const initialSnapshot = source.getSnapshot();\n\n const route = shallowRef(initialSnapshot.route);\n const previousRoute = shallowRef(initialSnapshot.previousRoute);\n\n const unsub = source.subscribe(() => {\n const snapshot = source.getSnapshot();\n\n route.value = snapshot.route;\n previousRoute.value = snapshot.previousRoute;\n });\n\n onScopeDispose(unsub);\n\n provide(RouterKey, props.router);\n provide(NavigatorKey, navigator);\n provide(RouteKey, { navigator, route, previousRoute });\n\n return () => slots.default?.();\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/components/RouteView/components.ts","../../src/components/RouteView/helpers.ts","../../src/useRefFromSource.ts","../../src/context.ts","../../src/composables/useRouter.ts","../../src/composables/useRouteNode.ts","../../src/components/RouteView/RouteView.ts","../../src/composables/useIsActiveRoute.ts","../../src/constants.ts","../../src/components/Link.ts","../../src/composables/useRouterError.ts","../../src/components/RouterErrorBoundary.ts","../../src/directives/vLink.ts","../../src/composables/useNavigator.ts","../../src/composables/useRouteUtils.ts","../../src/composables/useRoute.ts","../../src/composables/useRouterTransition.ts","../../src/createRouterPlugin.ts","../../src/RouterProvider.ts"],"sourcesContent":["import { defineComponent } from \"vue\";\n\nimport type { PropType, VNode } from \"vue\";\n\nfunction renderNull() {\n return null;\n}\n\nexport const Match = defineComponent({\n name: \"RouteView.Match\",\n props: {\n segment: {\n type: String as PropType<string>,\n required: true,\n },\n exact: {\n type: Boolean,\n default: false,\n },\n fallback: {\n type: [Object, Function] as PropType<VNode | (() => VNode)>,\n default: undefined,\n },\n keepAlive: {\n type: Boolean,\n default: false,\n },\n },\n render: renderNull,\n});\n\nexport const NotFound = defineComponent({\n name: \"RouteView.NotFound\",\n render: renderNull,\n});\n","import { UNKNOWN_ROUTE } from \"@real-router/core\";\nimport { startsWithSegment } from \"@real-router/route-utils\";\nimport { Fragment, isVNode } from \"vue\";\n\nimport { Match, NotFound } from \"./components\";\n\nimport type { VNode } from \"vue\";\n\ntype FallbackType = VNode | (() => VNode) | undefined;\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\nfunction normalizeChildren(children: unknown): VNode[] {\n if (Array.isArray(children)) {\n const result: VNode[] = [];\n\n for (const child of children) {\n if (Array.isArray(child)) {\n result.push(...normalizeChildren(child));\n } else if (isVNode(child)) {\n result.push(child);\n }\n }\n\n return result;\n }\n\n if (isVNode(children)) {\n return [children];\n }\n\n return [];\n}\n\nexport function collectElements(children: unknown, result: VNode[]): void {\n const vnodes = normalizeChildren(children);\n\n for (const child of vnodes) {\n if (child.type === Match || child.type === NotFound) {\n result.push(child);\n } else if (child.type === Fragment) {\n collectElements(child.children, result);\n }\n }\n}\n\nexport function buildRenderList(\n elements: VNode[],\n routeName: string,\n nodeName: string,\n): {\n rendered: VNode[];\n activeMatchFound: boolean;\n fallback?: FallbackType;\n} {\n let notFoundChildren: unknown = null;\n let activeMatchFound = false;\n let fallback: FallbackType = undefined;\n const rendered: VNode[] = [];\n\n for (const child of elements) {\n if (child.type === NotFound) {\n notFoundChildren = child.children;\n continue;\n }\n\n const props = child.props as {\n segment: string;\n exact?: boolean;\n fallback?: FallbackType;\n } | null;\n const segment = props?.segment ?? \"\";\n const exact = props?.exact ?? false;\n const fullSegmentName = nodeName ? `${nodeName}.${segment}` : segment;\n const isActive =\n !activeMatchFound && isSegmentMatch(routeName, fullSegmentName, exact);\n\n if (isActive) {\n activeMatchFound = true;\n fallback = props?.fallback;\n rendered.push(child);\n }\n }\n\n if (\n !activeMatchFound &&\n routeName === UNKNOWN_ROUTE &&\n notFoundChildren !== null\n ) {\n const nfElements = elements.filter((element) => element.type === NotFound);\n /* v8 ignore next 3 */\n const lastNf = nfElements.at(-1);\n\n if (lastNf) {\n rendered.push(lastNf);\n }\n }\n\n return { rendered, activeMatchFound, fallback };\n}\n","import { shallowRef, onScopeDispose } from \"vue\";\n\nimport type { RouterSource } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useRefFromSource<T>(source: RouterSource<T>): ShallowRef<T> {\n const ref = shallowRef(source.getSnapshot());\n\n const unsub = source.subscribe(() => {\n ref.value = source.getSnapshot();\n });\n\n onScopeDispose(unsub);\n\n return ref;\n}\n","import type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\nimport type { InjectionKey } from \"vue\";\n\nexport const RouterKey: InjectionKey<Router> = Symbol(\"RouterKey\");\n\nexport const NavigatorKey: InjectionKey<Navigator> = Symbol(\"NavigatorKey\");\n\nexport const RouteKey: InjectionKey<RouteContextType> = Symbol(\"RouteKey\");\n","import { inject } from \"vue\";\n\nimport { RouterKey } from \"../context\";\n\nimport type { Router } from \"@real-router/core\";\n\nexport const useRouter = (): Router => {\n const router = inject(RouterKey);\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 { shallowRef, watch } from \"vue\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouteContext } from \"../types\";\nimport type { State } from \"@real-router/core\";\n\nexport function useRouteNode(nodeName: string): RouteContext {\n const router = useRouter();\n\n const source = createRouteNodeSource(router, nodeName);\n const snapshot = useRefFromSource(source);\n\n const navigator = getNavigator(router);\n\n const route = shallowRef<State | undefined>(snapshot.value.route);\n const previousRoute = shallowRef<State | undefined>(\n snapshot.value.previousRoute,\n );\n\n watch(\n snapshot,\n (newSnapshot) => {\n route.value = newSnapshot.route;\n previousRoute.value = newSnapshot.previousRoute;\n },\n { flush: \"sync\" },\n );\n\n return {\n navigator,\n route,\n previousRoute,\n };\n}\n","import {\n Fragment,\n defineComponent,\n h,\n KeepAlive,\n markRaw,\n Suspense,\n} from \"vue\";\n\nimport { Match, NotFound } from \"./components\";\nimport { buildRenderList, collectElements } from \"./helpers\";\nimport { useRouteNode } from \"../../composables/useRouteNode\";\n\nimport type { Component, VNode } from \"vue\";\n\ntype SlotChildren = Record<string, (() => VNode[]) | undefined> | null;\n\nfunction getSlotContent(vnode: VNode): VNode[] | null {\n const slots = vnode.children as SlotChildren;\n\n return slots?.default?.() ?? null;\n}\n\nfunction getOrCreateWrapper(\n cache: Map<string, Component>,\n segment: string,\n): Component {\n const existing = cache.get(segment);\n\n if (existing) {\n return existing;\n }\n\n const wrapper = markRaw(\n defineComponent({\n name: `KeepAlive-${segment}`,\n setup(_wrapperProps, wrapperCtx) {\n return () => wrapperCtx.slots.default?.();\n },\n }),\n );\n\n cache.set(segment, wrapper);\n\n return wrapper;\n}\n\nfunction wrapWithSuspense(content: VNode, fallback: unknown): VNode {\n if (fallback === undefined) {\n return content;\n }\n\n const fallbackContent =\n typeof fallback === \"function\" ? (fallback as () => VNode)() : fallback;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-assignment\n const suspenseComponent = Suspense as any;\n\n return h(\n suspenseComponent,\n {},\n {\n default: () => content,\n fallback: () => fallbackContent,\n },\n );\n}\n\nconst emptyKeepAlivePlaceholder = markRaw(\n defineComponent({\n name: \"KeepAlive-placeholder\",\n render() {\n return null;\n },\n }),\n);\n\nfunction renderWithRootKA(\n activeChild: VNode,\n wrapperCache: Map<string, Component>,\n fallback: unknown,\n): VNode {\n const activeProps = activeChild.props as { segment?: string } | null;\n const segment = activeProps?.segment ?? \"__not-found__\";\n const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);\n const slotContent = getSlotContent(activeChild) ?? [];\n const keepAliveContent = h(KeepAlive, null, {\n default: () =>\n h(WrapperComponent, { key: segment }, { default: () => slotContent }),\n });\n\n return wrapWithSuspense(keepAliveContent, fallback);\n}\n\nfunction renderWithPerMatchKA(\n activeChild: VNode,\n wrapperCache: Map<string, Component>,\n fallback: unknown,\n): VNode | null {\n const matchProps = activeChild.props as {\n segment?: string;\n keepAlive?: boolean;\n } | null;\n\n if (matchProps?.keepAlive === true && activeChild.type === Match) {\n /* v8 ignore start */\n const segment = matchProps.segment ?? \"__not-found__\";\n /* v8 ignore stop */\n const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);\n const slotContent = getSlotContent(activeChild) ?? [];\n\n return h(Fragment, [\n h(KeepAlive, null, {\n default: () =>\n h(WrapperComponent, { key: segment }, { default: () => slotContent }),\n }),\n ]);\n }\n\n const content = getSlotContent(activeChild);\n\n /* v8 ignore start */\n if (!content) {\n return null;\n }\n /* v8 ignore stop */\n\n return h(Fragment, [\n h(KeepAlive, null, { default: () => h(emptyKeepAlivePlaceholder) }),\n wrapWithSuspense(h(Fragment, content), fallback),\n ]);\n}\n\nconst RouteViewComponent = defineComponent({\n name: \"RouteView\",\n props: {\n nodeName: {\n type: String,\n required: true,\n },\n keepAlive: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n const routeContext = useRouteNode(props.nodeName);\n const wrapperCache = new Map<string, Component>();\n\n return (): VNode | null => {\n const route = routeContext.route.value;\n\n if (!route) {\n return null;\n }\n\n const elements: VNode[] = [];\n\n collectElements(slots.default?.(), elements);\n\n const { rendered, fallback } = buildRenderList(\n elements,\n route.name,\n props.nodeName,\n );\n\n if (rendered.length === 0) {\n return null;\n }\n\n const activeChild = rendered[0];\n\n if (props.keepAlive) {\n return renderWithRootKA(activeChild, wrapperCache, fallback);\n }\n\n /* v8 ignore start */\n if (activeChild.type !== Match && activeChild.type !== NotFound) {\n return null;\n }\n /* v8 ignore stop */\n\n const hasPerMatchKA = elements.some(\n (element) =>\n element.type === Match &&\n (element.props as { keepAlive?: boolean } | null)?.keepAlive === true,\n );\n\n if (hasPerMatchKA) {\n return renderWithPerMatchKA(activeChild, wrapperCache, fallback);\n }\n\n const content = getSlotContent(activeChild);\n\n if (!content) {\n return null;\n }\n\n return wrapWithSuspense(h(Fragment, content), fallback);\n };\n },\n});\n\nexport const RouteView = Object.assign(RouteViewComponent, { Match, NotFound });\n\nexport type {\n RouteViewProps,\n MatchProps as RouteViewMatchProps,\n NotFoundProps as RouteViewNotFoundProps,\n} from \"./types\";\n","import { createActiveRouteSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Params } from \"@real-router/core\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useIsActiveRoute(\n routeName: string,\n params?: Params,\n strict = false,\n ignoreQueryParams = true,\n): ShallowRef<boolean> {\n const router = useRouter();\n\n const source = createActiveRouteSource(router, routeName, params, {\n strict,\n ignoreQueryParams,\n });\n\n return useRefFromSource(source);\n}\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 { shouldNavigate, buildHref, buildActiveClassName } from \"dom-utils\";\nimport { defineComponent, h, computed } from \"vue\";\n\nimport { useIsActiveRoute } from \"../composables/useIsActiveRoute\";\nimport { useRouter } from \"../composables/useRouter\";\nimport { EMPTY_PARAMS, EMPTY_OPTIONS } from \"../constants\";\n\nimport type { Params, NavigationOptions } from \"@real-router/core\";\nimport type { PropType } from \"vue\";\n\nexport const Link = defineComponent({\n name: \"Link\",\n props: {\n routeName: {\n type: String,\n required: true,\n },\n routeParams: {\n type: Object as PropType<Params>,\n default: () => EMPTY_PARAMS,\n },\n routeOptions: {\n type: Object as PropType<NavigationOptions>,\n default: () => EMPTY_OPTIONS,\n },\n class: {\n type: String,\n default: undefined,\n },\n activeClassName: {\n type: String,\n default: \"active\",\n },\n activeStrict: {\n type: Boolean,\n default: false,\n },\n ignoreQueryParams: {\n type: Boolean,\n default: true,\n },\n target: {\n type: String,\n default: undefined,\n },\n },\n setup(props, { slots, attrs }) {\n const router = useRouter();\n\n const isActive = useIsActiveRoute(\n props.routeName,\n props.routeParams,\n props.activeStrict,\n props.ignoreQueryParams,\n );\n\n const href = computed(() =>\n buildHref(router, props.routeName, props.routeParams),\n );\n\n const finalClassName = computed(() =>\n buildActiveClassName(isActive.value, props.activeClassName, props.class),\n );\n\n const handleClick = (evt: MouseEvent) => {\n if (attrs.onClick && typeof attrs.onClick === \"function\") {\n (attrs.onClick as (evt: MouseEvent) => void)(evt);\n\n if (evt.defaultPrevented) {\n return;\n }\n }\n\n if (!shouldNavigate(evt) || props.target === \"_blank\") {\n return;\n }\n\n evt.preventDefault();\n router\n .navigate(props.routeName, props.routeParams, props.routeOptions)\n .catch(() => {});\n };\n\n return () =>\n h(\n \"a\",\n {\n ...attrs,\n href: href.value,\n class: finalClassName.value,\n target: props.target,\n onClick: handleClick,\n },\n slots.default?.(),\n );\n },\n});\n","import { createErrorSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { RouterErrorSnapshot, RouterSource } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nconst cache = new WeakMap<Router, RouterSource<RouterErrorSnapshot>>();\n\nexport function useRouterError(): ShallowRef<RouterErrorSnapshot> {\n const router = useRouter();\n\n let source = cache.get(router);\n\n if (!source) {\n source = createErrorSource(router);\n cache.set(router, source);\n }\n\n return useRefFromSource(source);\n}\n","import { defineComponent, h, ref, watch, computed, Fragment } from \"vue\";\n\nimport { useRouterError } from \"../composables/useRouterError\";\n\nimport type { RouterError, State } from \"@real-router/core\";\nimport type { VNode, PropType } from \"vue\";\n\nexport const RouterErrorBoundary = defineComponent({\n name: \"RouterErrorBoundary\",\n props: {\n fallback: {\n type: Function as PropType<\n (error: RouterError, resetError: () => void) => VNode\n >,\n required: true,\n },\n onError: {\n type: Function as PropType<\n (\n error: RouterError,\n toRoute: State | null,\n fromRoute: State | null,\n ) => void\n >,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n const snapshot = useRouterError();\n const dismissedVersion = ref(-1);\n\n watch(\n () => snapshot.value.version,\n () => {\n if (snapshot.value.error) {\n props.onError?.(\n snapshot.value.error,\n snapshot.value.toRoute,\n snapshot.value.fromRoute,\n );\n }\n },\n { immediate: true },\n );\n\n const visibleError = computed(() =>\n snapshot.value.version > dismissedVersion.value\n ? snapshot.value.error\n : null,\n );\n\n const resetError = () => {\n dismissedVersion.value = snapshot.value.version;\n };\n\n return () => {\n const children = slots.default?.() ?? [];\n const errorVNode = visibleError.value\n ? props.fallback(visibleError.value, resetError)\n : null;\n\n return h(Fragment, null, [...children, errorVNode]);\n };\n },\n});\n\nexport type RouterErrorBoundaryProps = InstanceType<\n typeof RouterErrorBoundary\n>[\"$props\"];\n","import { shouldNavigate, applyLinkA11y } from \"dom-utils\";\n\nimport type { Router, NavigationOptions, Params } from \"@real-router/core\";\nimport type { Directive } from \"vue\";\n\nexport interface LinkDirectiveValue {\n name: string;\n params?: Params;\n options?: NavigationOptions;\n}\n\nlet _router: Router | null = null;\n\nexport function setDirectiveRouter(router: Router): void {\n _router = router;\n}\n\nexport function getDirectiveRouter(): Router {\n if (!_router) {\n /* v8 ignore next 3 -- @preserve Defensive: router always initialized by RouterProvider */\n throw new Error(\n \"v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.\",\n );\n }\n\n return _router;\n}\n\nconst clickHandlers = new WeakMap<HTMLElement, (evt: MouseEvent) => void>();\nconst keydownHandlers = new WeakMap<\n HTMLElement,\n (evt: KeyboardEvent) => void\n>();\n\nfunction createClickHandler(\n router: Router,\n value: LinkDirectiveValue,\n): (evt: MouseEvent) => void {\n return (evt: MouseEvent) => {\n if (!shouldNavigate(evt)) {\n return;\n }\n\n evt.preventDefault();\n router\n .navigate(value.name, value.params ?? {}, value.options ?? {})\n .catch(() => {});\n };\n}\n\nfunction createKeydownHandler(\n router: Router,\n value: LinkDirectiveValue,\n element: HTMLElement,\n): (evt: KeyboardEvent) => void {\n return (evt: KeyboardEvent) => {\n if (evt.key === \"Enter\" && !(element instanceof HTMLButtonElement)) {\n router\n .navigate(value.name, value.params ?? {}, value.options ?? {})\n .catch(() => {});\n }\n };\n}\n\nfunction attachHandlers(\n element: HTMLElement,\n router: Router,\n value: LinkDirectiveValue,\n): void {\n const handleClick = createClickHandler(router, value);\n const handleKeyDown = createKeydownHandler(router, value, element);\n\n element.addEventListener(\"click\", handleClick);\n element.addEventListener(\"keydown\", handleKeyDown);\n\n clickHandlers.set(element, handleClick);\n keydownHandlers.set(element, handleKeyDown);\n}\n\nfunction detachHandlers(element: HTMLElement): void {\n const clickHandler = clickHandlers.get(element);\n const keydownHandler = keydownHandlers.get(element);\n\n if (clickHandler) {\n element.removeEventListener(\"click\", clickHandler);\n }\n if (keydownHandler) {\n element.removeEventListener(\"keydown\", keydownHandler);\n }\n\n clickHandlers.delete(element);\n keydownHandlers.delete(element);\n}\n\nexport const vLink: Directive<HTMLElement, LinkDirectiveValue> = {\n mounted(element, binding) {\n const router = getDirectiveRouter();\n\n applyLinkA11y(element);\n\n element.style.cursor = \"pointer\";\n\n attachHandlers(element, router, binding.value);\n },\n\n updated(element, binding) {\n const router = getDirectiveRouter();\n\n detachHandlers(element);\n attachHandlers(element, router, binding.value);\n },\n\n beforeUnmount(element) {\n detachHandlers(element);\n },\n};\n","import { inject } from \"vue\";\n\nimport { NavigatorKey } from \"../context\";\n\nimport type { Navigator } from \"@real-router/core\";\n\nexport const useNavigator = (): Navigator => {\n const navigator = inject(NavigatorKey);\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 { inject } from \"vue\";\n\nimport { RouteKey } from \"../context\";\n\nimport type { RouteContext } from \"../types\";\n\nexport const useRoute = (): RouteContext => {\n const routeContext = inject(RouteKey);\n\n if (!routeContext) {\n throw new Error(\"useRoute must be used within a RouterProvider\");\n }\n\n return routeContext;\n};\n","import { createTransitionSource } from \"@real-router/sources\";\n\nimport { useRefFromSource } from \"../useRefFromSource\";\nimport { useRouter } from \"./useRouter\";\n\nimport type { RouterTransitionSnapshot } from \"@real-router/sources\";\nimport type { ShallowRef } from \"vue\";\n\nexport function useRouterTransition(): ShallowRef<RouterTransitionSnapshot> {\n const router = useRouter();\n\n const source = createTransitionSource(router);\n\n return useRefFromSource(source);\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { shallowRef } from \"vue\";\n\nimport { NavigatorKey, RouteKey, RouterKey } from \"./context\";\nimport { setDirectiveRouter } from \"./directives/vLink\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { Plugin } from \"vue\";\n\nexport function createRouterPlugin(router: Router): Plugin<[]> {\n return {\n install(app): void {\n const navigator = getNavigator(router);\n\n setDirectiveRouter(router);\n\n const source = createRouteSource(router);\n const initialSnapshot = source.getSnapshot();\n\n const route = shallowRef(initialSnapshot.route);\n const previousRoute = shallowRef(initialSnapshot.previousRoute);\n\n source.subscribe(() => {\n const snapshot = source.getSnapshot();\n\n route.value = snapshot.route;\n previousRoute.value = snapshot.previousRoute;\n });\n\n app.provide(RouterKey, router);\n app.provide(NavigatorKey, navigator);\n app.provide(RouteKey, { navigator, route, previousRoute });\n },\n };\n}\n","import { getNavigator } from \"@real-router/core\";\nimport { createRouteSource } from \"@real-router/sources\";\nimport { createRouteAnnouncer } from \"dom-utils\";\nimport {\n defineComponent,\n onMounted,\n onUnmounted,\n provide,\n shallowRef,\n onScopeDispose,\n} from \"vue\";\n\nimport { NavigatorKey, RouteKey, RouterKey } from \"./context\";\nimport { setDirectiveRouter } from \"./directives/vLink\";\n\nimport type { Router } from \"@real-router/core\";\nimport type { PropType } from \"vue\";\n\nexport const RouterProvider = defineComponent({\n name: \"RouterProvider\",\n props: {\n router: {\n type: Object as PropType<Router>,\n required: true,\n },\n announceNavigation: {\n type: Boolean,\n default: false,\n },\n },\n setup(props, { slots }) {\n onMounted(() => {\n if (!props.announceNavigation) {\n return;\n }\n\n const announcer = createRouteAnnouncer(props.router);\n\n onUnmounted(() => {\n announcer.destroy();\n });\n });\n\n const navigator = getNavigator(props.router);\n\n setDirectiveRouter(props.router);\n\n const source = createRouteSource(props.router);\n const initialSnapshot = source.getSnapshot();\n\n const route = shallowRef(initialSnapshot.route);\n const previousRoute = shallowRef(initialSnapshot.previousRoute);\n\n const unsub = source.subscribe(() => {\n const snapshot = source.getSnapshot();\n\n route.value = snapshot.route;\n previousRoute.value = snapshot.previousRoute;\n });\n\n onScopeDispose(unsub);\n\n provide(RouterKey, props.router);\n provide(NavigatorKey, navigator);\n provide(RouteKey, { navigator, route, previousRoute });\n\n return () => slots.default?.();\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@real-router/vue",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "type": "commonjs",
5
5
  "description": "Vue 3 integration for Real-Router",
6
6
  "main": "./dist/cjs/index.js",
@@ -50,16 +50,16 @@
50
50
  "license": "MIT",
51
51
  "sideEffects": false,
52
52
  "dependencies": {
53
- "@real-router/core": "^0.43.0",
54
- "@real-router/route-utils": "^0.1.9",
55
- "@real-router/sources": "^0.3.3",
56
- "dom-utils": "^0.2.5"
53
+ "@real-router/core": "^0.44.0",
54
+ "@real-router/route-utils": "^0.1.10",
55
+ "@real-router/sources": "^0.4.0",
56
+ "dom-utils": "^0.2.6"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@testing-library/jest-dom": "6.9.1",
60
60
  "@vue/test-utils": "2.4.6",
61
61
  "vue": "3.5.13",
62
- "@real-router/browser-plugin": "^0.11.2"
62
+ "@real-router/browser-plugin": "^0.11.3"
63
63
  },
64
64
  "peerDependencies": {
65
65
  "vue": ">=3.3.0"
@@ -66,6 +66,71 @@ function wrapWithSuspense(content: VNode, fallback: unknown): VNode {
66
66
  );
67
67
  }
68
68
 
69
+ const emptyKeepAlivePlaceholder = markRaw(
70
+ defineComponent({
71
+ name: "KeepAlive-placeholder",
72
+ render() {
73
+ return null;
74
+ },
75
+ }),
76
+ );
77
+
78
+ function renderWithRootKA(
79
+ activeChild: VNode,
80
+ wrapperCache: Map<string, Component>,
81
+ fallback: unknown,
82
+ ): VNode {
83
+ const activeProps = activeChild.props as { segment?: string } | null;
84
+ const segment = activeProps?.segment ?? "__not-found__";
85
+ const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);
86
+ const slotContent = getSlotContent(activeChild) ?? [];
87
+ const keepAliveContent = h(KeepAlive, null, {
88
+ default: () =>
89
+ h(WrapperComponent, { key: segment }, { default: () => slotContent }),
90
+ });
91
+
92
+ return wrapWithSuspense(keepAliveContent, fallback);
93
+ }
94
+
95
+ function renderWithPerMatchKA(
96
+ activeChild: VNode,
97
+ wrapperCache: Map<string, Component>,
98
+ fallback: unknown,
99
+ ): VNode | null {
100
+ const matchProps = activeChild.props as {
101
+ segment?: string;
102
+ keepAlive?: boolean;
103
+ } | null;
104
+
105
+ if (matchProps?.keepAlive === true && activeChild.type === Match) {
106
+ /* v8 ignore start */
107
+ const segment = matchProps.segment ?? "__not-found__";
108
+ /* v8 ignore stop */
109
+ const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);
110
+ const slotContent = getSlotContent(activeChild) ?? [];
111
+
112
+ return h(Fragment, [
113
+ h(KeepAlive, null, {
114
+ default: () =>
115
+ h(WrapperComponent, { key: segment }, { default: () => slotContent }),
116
+ }),
117
+ ]);
118
+ }
119
+
120
+ const content = getSlotContent(activeChild);
121
+
122
+ /* v8 ignore start */
123
+ if (!content) {
124
+ return null;
125
+ }
126
+ /* v8 ignore stop */
127
+
128
+ return h(Fragment, [
129
+ h(KeepAlive, null, { default: () => h(emptyKeepAlivePlaceholder) }),
130
+ wrapWithSuspense(h(Fragment, content), fallback),
131
+ ]);
132
+ }
133
+
69
134
  const RouteViewComponent = defineComponent({
70
135
  name: "RouteView",
71
136
  props: {
@@ -80,7 +145,6 @@ const RouteViewComponent = defineComponent({
80
145
  },
81
146
  setup(props, { slots }) {
82
147
  const routeContext = useRouteNode(props.nodeName);
83
-
84
148
  const wrapperCache = new Map<string, Component>();
85
149
 
86
150
  return (): VNode | null => {
@@ -106,39 +170,33 @@ const RouteViewComponent = defineComponent({
106
170
 
107
171
  const activeChild = rendered[0];
108
172
 
109
- if (!props.keepAlive) {
110
- if (activeChild.type === Match || activeChild.type === NotFound) {
111
- const content = getSlotContent(activeChild);
112
-
113
- if (!content) {
114
- return null;
115
- }
116
-
117
- const fragment = h(Fragment, content);
118
-
119
- return wrapWithSuspense(fragment, fallback);
120
- }
173
+ if (props.keepAlive) {
174
+ return renderWithRootKA(activeChild, wrapperCache, fallback);
175
+ }
121
176
 
122
- /* v8 ignore start */
177
+ /* v8 ignore start */
178
+ if (activeChild.type !== Match && activeChild.type !== NotFound) {
123
179
  return null;
124
- /* v8 ignore stop */
125
180
  }
181
+ /* v8 ignore stop */
182
+
183
+ const hasPerMatchKA = elements.some(
184
+ (element) =>
185
+ element.type === Match &&
186
+ (element.props as { keepAlive?: boolean } | null)?.keepAlive === true,
187
+ );
126
188
 
127
- const activeProps = activeChild.props as {
128
- segment?: string;
129
- } | null;
130
- const segment = activeProps?.segment ?? "__not-found__";
189
+ if (hasPerMatchKA) {
190
+ return renderWithPerMatchKA(activeChild, wrapperCache, fallback);
191
+ }
131
192
 
132
- const WrapperComponent = getOrCreateWrapper(wrapperCache, segment);
133
- /* v8 ignore next */
134
- const slotContent = getSlotContent(activeChild) ?? [];
193
+ const content = getSlotContent(activeChild);
135
194
 
136
- const keepAliveContent = h(KeepAlive, null, {
137
- default: () =>
138
- h(WrapperComponent, { key: segment }, { default: () => slotContent }),
139
- });
195
+ if (!content) {
196
+ return null;
197
+ }
140
198
 
141
- return wrapWithSuspense(keepAliveContent, fallback);
199
+ return wrapWithSuspense(h(Fragment, content), fallback);
142
200
  };
143
201
  },
144
202
  });
@@ -21,6 +21,10 @@ export const Match = defineComponent({
21
21
  type: [Object, Function] as PropType<VNode | (() => VNode)>,
22
22
  default: undefined,
23
23
  },
24
+ keepAlive: {
25
+ type: Boolean,
26
+ default: false,
27
+ },
24
28
  },
25
29
  render: renderNull,
26
30
  });
@@ -9,6 +9,7 @@ export interface MatchProps {
9
9
  readonly segment: string;
10
10
  readonly exact?: boolean;
11
11
  readonly fallback?: VNode | (() => VNode);
12
+ readonly keepAlive?: boolean;
12
13
  }
13
14
 
14
15
  export type NotFoundProps = Record<string, never>;