@real-router/preact 0.15.0 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./useRoute-B3rj5MXo.js`);let t=require(`preact/hooks`),n=require(`@real-router/core`),r=require(`@real-router/route-utils`),i=require(`preact`),a=require(`preact/compat`),o=require(`preact/jsx-runtime`),s=require(`@real-router/sources`),c=require(`@real-router/core/api`);function l(e){return null}l.displayName=`RouteView.Match`;function u(e){return null}u.displayName=`RouteView.Self`;function d(e){return null}d.displayName=`RouteView.NotFound`;function f(e,t,n){return t===``?!1:n?e===t:(0,r.startsWithSegment)(e,t)}function p(e,t){for(let n of(0,i.toChildArray)(e))(0,i.isValidElement)(n)&&(n.type===l||n.type===u||n.type===d?t.push(n):p(n.props.children,t))}function m(e,t,n){return(0,o.jsx)(i.Fragment,{children:n===void 0?e:(0,o.jsx)(a.Suspense,{fallback:n,children:e})},t)}function h(e){return e.type===d||e.type===u}function g(e,t){if(e.type===d){t.notFoundChildren=e.props.children;return}t.selfFound||=(t.selfChildren=e.props.children,t.selfFallback=e.props.fallback,!0)}function _(e,t,n,r){let{segment:i,exact:a=!1,fallback:o,children:s}=e.props,c=n?`${n}.${i}`:i;return!r&&f(t,c,a)?m(s,c,o):null}function v(e,t,r,a){if(a.selfFound&&t===r){e.push(m(a.selfChildren,`__route-view-self__`,a.selfFallback));return}t===n.UNKNOWN_ROUTE&&a.notFoundChildren!==null&&e.push((0,o.jsx)(i.Fragment,{children:a.notFoundChildren},`__route-view-not-found__`))}function y(e,t,n){let r={selfChildren:null,selfFallback:void 0,selfFound:!1,notFoundChildren:null},i=!1,a=[];for(let o of e){if(h(o)){g(o,r);continue}let e=_(o,t,n,i);e!==null&&(i=!0,a.push(e))}return i||v(a,t,n,r),{rendered:a,activeMatchFound:i}}function b(e,n,r){let[i,a]=(0,t.useState)(n);return(0,t.useEffect)(()=>{let t=()=>{a(e=>{let t=n();return Object.is(e,t)?e:t})};return t(),e(t)},[e,n]),i}const x=e.a(e.n,`useNavigator`),S=e.a(e.i,`useRouter`);function C(e){let n=S(),r=x(),i=(0,s.createRouteNodeSource)(n,e),{route:a,previousRoute:o}=b(i.subscribe,i.getSnapshot,i.getSnapshot);return(0,t.useMemo)(()=>({navigator:r,route:a,previousRoute:o}),[r,a,o])}function w({nodeName:e,children:n}){let{route:r}=C(e),i=(0,t.useMemo)(()=>{let e=[];return p(n,e),e},[n]),a=r?.name,s=(0,t.useMemo)(()=>a===void 0?[]:y(i,a,e).rendered,[i,a,e]);return s.length>0?(0,o.jsx)(o.Fragment,{children:s}):null}w.displayName=`RouteView`;const T=Object.assign(w,{Match:l,Self:u,NotFound:d}),ee=Object.freeze({}),te=Object.freeze({}),E=`data-real-router-announcer`,D=Object.freeze({destroy:()=>{}});function O(e,t){if(typeof document>`u`)return D;let n=t?.prefix??`Navigated to `,r=t?.getAnnouncementText,i=!0,a=!1,o=!1,s=``,c=null,l,u=k(),d=(e,t)=>{s=e,clearTimeout(l),u.textContent=e,l=setTimeout(()=>{u.textContent=``,s=``},7e3),ne(t)},f=setTimeout(()=>{if(a=!0,c!==null&&!o){let e=c;c=null,d(e,document.querySelector(`h1`))}},100),p=e.subscribe(({route:e})=>{if(i){i=!1;return}requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(o)return;let t=document.querySelector(`h1`),i=j(e,n,r,t);if(!(!i||i===s)){if(!a){c=i;return}d(i,t)}})})});return{destroy(){o=!0,p(),clearTimeout(l),clearTimeout(f),A()}}}function k(){let e=document.querySelector(`[${E}]`);if(e)return e;let t=document.createElement(`div`);return t.setAttribute(`style`,`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0`),t.setAttribute(`aria-live`,`assertive`),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(E,``),(document.body??document.documentElement).prepend(t),t}function A(){document.querySelector(`[${E}]`)?.remove()}function j(e,t,n,r){if(n)try{let t=n(e);if(t)return t}catch(e){console.error(`[real-router] getAnnouncementText threw; falling back to default resolution.`,e)}let i=(r?.textContent??``).trim(),a=e.name.startsWith(`@@`)?``:e.name;return`${t}${i||document.title||a||globalThis.location.pathname}`}function ne(e){e&&(e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}const M=Object.freeze({destroy:()=>{}});function N(e,t){if(globalThis.window===void 0)return M;let n=t?.mode??`restore`;if(n===`native`)return M;let r=t?.anchorScrolling??!0,i=t?.scrollContainer,a=t?.behavior??`auto`,o=t?.storageKey??`real-router:scroll`,s,c=()=>{if(s!==void 0)return s;try{let e=sessionStorage.getItem(o);s=e?JSON.parse(e):{}}catch{s={}}return s},l=(e,t)=>{try{let n=c();if(n[e]===t)return;n[e]=t,sessionStorage.setItem(o,JSON.stringify(n))}catch{}},u=history.scrollRestoration;try{history.scrollRestoration=`manual`}catch{}let d=()=>{let e=i?.();return e?e.scrollTop:globalThis.scrollY},f=e=>{let t=i?.();t?t.scrollTo({top:e,left:0,behavior:a}):globalThis.scrollTo({top:e,left:0,behavior:a})},p=e=>{if(!i){globalThis.scrollTo({top:e,left:0,behavior:a});return}let t=0,n=()=>{if(h)return;let r=i();if(r){if(r.scrollTo({top:e,left:0,behavior:a}),a!==`smooth`&&Math.abs(r.scrollTop-e)<=1)return}else globalThis.scrollTo({top:e,left:0,behavior:a});t>=10||(t+=1,requestAnimationFrame(n))};n()},m=e=>{let t=e.context?.url?.hash;if(t!==void 0){if(r&&t.length>0){let e=document.getElementById(t);if(e){e.scrollIntoView({behavior:a});return}}f(0);return}let n=globalThis.location.hash;if(r&&n.length>1){let e;try{e=decodeURIComponent(n.slice(1))}catch{e=n.slice(1)}let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:a});return}}f(0)},h=!1,g=!1,_=e=>{try{return F(e)}catch{return g||(g=!0,console.error(`[real-router] scroll-restore: route "${e.name}" has params that cannot be canonicalized (e.g. BigInt or cyclic structure). Scroll position will not be captured or restored for this route.`)),null}},v=e.subscribe(({route:e,previousRoute:t})=>{let r=e.context.navigation;if(t){let e=_(t);e!==null&&l(e,d())}requestAnimationFrame(()=>{if(!h){if(n===`top`){m(e);return}if(e.transition.reload||r?.navigationType===`reload`){let t=_(e);p(t===null?0:c()[t]??0);return}if(r?.direction===`back`||r?.navigationType===`traverse`){let t=_(e);p(t===null?0:c()[t]??0);return}e.transition.replace||r?.navigationType===`replace`||m(e)}})}),y=()=>{let t=e.getState();if(t){let e=_(t);e!==null&&l(e,d())}};return globalThis.addEventListener(`pagehide`,y),{destroy:()=>{if(!h){h=!0,v(),globalThis.removeEventListener(`pagehide`,y);try{history.scrollRestoration=u}catch{}}}}}const P=new WeakMap;function F(e){let t=P.get(e);if(t!==void 0)return t;let n=`${e.name}:${I(e.params)}`;return P.set(e,n),n}function I(e){return JSON.stringify(e,L)}function L(e,t){if(typeof t==`function`)return`<fn>`;if(typeof t==`symbol`)return`<sym>`;if(typeof t==`object`&&t&&!Array.isArray(t)){let e=Object.create(null),n=Object.keys(t).sort((e,t)=>e.localeCompare(t));for(let r of n)e[r]=t[r];return e}return t}const R=Object.freeze({destroy:()=>{}}),z=e=>e.context?.url,B=e=>{let t=null,n=1/0,r=null,i=-1/0;for(let a of e){if(!a.isIntersecting)continue;let e=a.rootBounds?.top??0,o=a.boundingClientRect.top-e;o>=0?o<n&&(t=a,n=o):o>i&&(r=a,i=o)}return t??r},V=(e,t)=>{let n=null,r=e=>{let n=e.context;n&&n.url===void 0&&(console.warn(`[real-router] scroll-spy: state.context.url is not claimed. Spy requires browser-plugin or navigation-plugin. Disabling.`),t())},i=e.getState();if(i)r(i);else{let t=!1;n=e.subscribe(({route:e})=>{t||(t=!0,r(e),n?.(),n=null)})}return{destroy(){n?.(),n=null}}},H=e=>{let t=!1,n=null,r=null,i=null,a=()=>{n!==null&&(clearTimeout(n),n=null),i&&(r??globalThis).removeEventListener(`scrollend`,i),i=null,r=null,t=!1};return{get active(){return t},start(){a(),t=!0;let o=()=>{a()};i=o,r=e(),(r??globalThis).addEventListener(`scrollend`,o,{once:!0}),n=setTimeout(o,500)},destroy(){a()}}},U=(e,t)=>{let n=null,r=null;return{schedule(){n===null&&(n=requestAnimationFrame(()=>{n=null,r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null,e()},t)}))},destroy(){n!==null&&(cancelAnimationFrame(n),n=null),r!==null&&(clearTimeout(r),r=null)}}},W=(e,t,n,r,i,a)=>{let o=new Set,s=new Map,c=!1,l=null,u=new IntersectionObserver(e=>{if(!a()){for(let t of e)s.set(t.target,t);r()}},{root:n(),rootMargin:t,threshold:0}),d=()=>{let t=n()??document,r;try{r=t.querySelectorAll(e)}catch{i();return}let a=new Set;for(let e of r){let t=e.id;t&&!c&&(a.has(t)&&(c=!0,console.warn(`[real-router] scroll-spy: duplicate id "${t}" observed. Selection picks the topmost visible match deterministically.`)),a.add(t)),!o.has(e)&&(u.observe(e),o.add(e))}},f=()=>{for(let e of o)e.isConnected||(u.unobserve(e),o.delete(e),s.delete(e));d()};d();let p=n()??document.body,m=new MutationObserver(()=>{l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,f()},250)});return m.observe(p,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`id`]}),{pending:s,destroy(){u.disconnect(),m.disconnect(),l!==null&&(clearTimeout(l),l=null),o.clear(),s.clear()}}};function G(e,t){if(typeof document>`u`||typeof IntersectionObserver>`u`)return R;let{selector:n}=t;if(!n)return R;let r=t.rootMargin??`-20% 0px -60% 0px`,i=t.scrollContainer,a=()=>i?.()??null,o=!1,c=!1,l=!1,u=()=>c||o,d=null,f=(0,s.getTransitionSource)(e),p=V(e,()=>{c=!0}),m=H(a),h=U(()=>{d?.()},150),g=W(n,r,a,()=>{h.schedule()},()=>{c||(c=!0,console.warn(`[real-router] scroll-spy: invalid selector "${n}". Disabling.`))},u);d=()=>{if(o||c){g.pending.clear();return}if(f.getSnapshot().isTransitioning||m.active||g.pending.size===0)return;let t=B(g.pending.values());if(g.pending.clear(),!t)return;let n=t.target.id;if(!n)return;let r=e.getState();if(!r||n===(z(r)?.hash??``))return;let i={hash:n,replace:!0,force:!0,hashChange:!0};l=!0,e.navigate(r.name,r.params,i).catch(()=>{}).finally(()=>{l=!1})};let _=e.subscribe(({route:e})=>{l||z(e)?.hashChanged&&m.start()});return{destroy(){o||(o=!0,_(),g.destroy(),h.destroy(),m.destroy(),p.destroy())}}}const K=Object.freeze({destroy:()=>{}});function re(e){if(typeof document>`u`||typeof document.startViewTransition!=`function`)return K;let t=null,n=null,r=!1,i=()=>{t?.(),t=null},a=e.subscribeLeave(({signal:e})=>{if(!e.aborted)return r=!1,i(),new Promise(a=>{let o=new Promise(e=>{t=e});e.addEventListener(`abort`,()=>{r||(i(),n?.skipTransition?.(),a())},{once:!0});try{n=document.startViewTransition(()=>(a(),o))}catch{i(),a()}})}),o=e.subscribe(()=>{let e=t;r=!0,t=null,e===null?n=null:setTimeout(()=>{e(),n=null},0)});return{destroy:()=>{a(),o(),n?.skipTransition?.(),n=null,i()}}}function q(e){return e.button===0&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&!e.shiftKey}const J=/%[\dA-Fa-f]{2}/;function Y(e){if(J.test(e))try{return encodeURI(decodeURIComponent(e)).replaceAll(`#`,`%23`)}catch{}return encodeURI(e).replaceAll(`#`,`%23`)}function X(e,t,n,r){try{let i=r?.hash,a;i!==void 0&&(a=i.startsWith(`#`)?i.slice(1):i);let o=e.buildUrl;if(o){let e=o(t,n,a===void 0?void 0:{hash:a});if(typeof e==`string`&&e.length>0)return e}let s=e.buildPath(t,n);if(typeof s!=`string`||s.length===0){console.error(`[real-router] Route "${t}" yielded an empty path. The element will render without an href attribute.`);return}return a?`${s}#${Y(a)}`:s}catch{console.error(`[real-router] Route "${t}" is not defined. The element will render without an href attribute.`);return}}function ie(e,t,n,r,i){let a={...i};r!==void 0&&(a.hash=r);let o=e.getState();if(o?.name===t&&Q(o.params,n)){let e=o.context?.url?.hash??``;e!==(r??e)&&(a.force=!0,a.hashChange=!0)}return e.navigate(t,n,a)}const ae=/\s/,oe=/\S+/g;function Z(e){return e?ae.test(e)?e.match(oe)??[]:[e]:[]}function se(e,t,n){if(e&&t){let e=Z(t);if(e.length===0)return n??void 0;if(!n)return e.join(` `);let r=Z(n),i=new Set(r);for(let t of e)i.has(t)||(i.add(t),r.push(t));return r.join(` `)}return n??void 0}function Q(e,t){if(Object.is(e,t))return!0;if(!e||!t)return!1;let n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;let r=e,i=t;for(let e of n)if(!Object.prototype.hasOwnProperty.call(t,e)||!Object.is(r[e],i[e]))return!1;return!0}function ce(e,n,r=!1,i=!0,a){let o=S(),c=(0,t.useMemo)(()=>a===void 0?{strict:r,ignoreQueryParams:i}:{strict:r,ignoreQueryParams:i,hash:a},[r,i,a]),l=(0,t.useMemo)(()=>(0,s.createActiveRouteSource)(o,e,n,c),[o,e,n,c]);return b(l.subscribe,l.getSnapshot,l.getSnapshot)}function le(e,t){return e.routeName===t.routeName&&e.className===t.className&&e.activeClassName===t.activeClassName&&e.activeStrict===t.activeStrict&&e.ignoreQueryParams===t.ignoreQueryParams&&e.onClick===t.onClick&&e.target===t.target&&e.style===t.style&&e.children===t.children&&e.hash===t.hash&&Q(e.routeParams,t.routeParams)&&Q(e.routeOptions,t.routeOptions)}const $=(0,a.memo)(({routeName:e,routeParams:t=ee,routeOptions:n=te,className:r,activeClassName:i=`active`,activeStrict:a=!1,ignoreQueryParams:s=!0,hash:c,onClick:l,target:u,children:d,...f})=>{let p=S(),m=ce(e,t,a,s,c),h=X(p,e,t,c===void 0?void 0:{hash:c}),g=r=>{l&&(l(r),r.defaultPrevented)||!q(r)||u===`_blank`||(r.preventDefault(),ie(p,e,t,c,n).catch(()=>{}))},_=se(m,i,r);return(0,o.jsx)(`a`,{...f,href:h,className:_,onClick:g,children:d})},le);$.displayName=`Link`;function ue({children:e,fallback:n,onError:r}){let a=(0,s.createDismissableError)(S()),c=b(a.subscribe,a.getSnapshot,a.getSnapshot),l=(0,t.useRef)(r);return(0,t.useLayoutEffect)(()=>{l.current=r}),(0,t.useEffect)(()=>{c.error&&l.current?.(c.error,c.toRoute,c.fromRoute)},[c.version]),(0,o.jsxs)(i.Fragment,{children:[e,c.error?n(c.error,c.resetError):null]})}const de=()=>(0,r.getRouteUtils)((0,c.getPluginApi)(S()).getTree());function fe(){let e=(0,s.getTransitionSource)(S());return b(e.subscribe,e.getSnapshot,e.getSnapshot)}function pe(e,n){let r=S(),i=(0,t.useRef)(e),a=n?.skipSameRoute??!0;(0,t.useLayoutEffect)(()=>{i.current=e}),(0,t.useEffect)(()=>r.subscribeLeave(({route:e,nextRoute:t,signal:n})=>{if(!(a&&e.name===t.name)&&!n.aborted)return i.current({route:e,nextRoute:t,signal:n})}),[r,a])}function me(n,r){let{route:i,previousRoute:a}=e.t(),o=(0,t.useRef)(n),s=(0,t.useRef)(null),c=r?.skipSameRoute??!0;(0,t.useLayoutEffect)(()=>{o.current=n}),(0,t.useEffect)(()=>{i.transition.from&&(c&&i.transition.from===i.name||s.current===i||!a||(s.current=i,o.current({route:i,previousRoute:a})))},[i,a,c])}const he=({router:r,children:i,announceNavigation:a,scrollRestoration:c,scrollSpy:l,viewTransitions:u})=>{(0,t.useEffect)(()=>{if(!a)return;let e=O(r);return()=>{e.destroy()}},[a,r]);let d=c?.mode,f=c?.anchorScrolling,p=c?.behavior,m=c?.storageKey,h=c!==void 0;(0,t.useEffect)(()=>{if(!h)return;let e=N(r,{mode:d,anchorScrolling:f,behavior:p,storageKey:m,scrollContainer:c.scrollContainer});return()=>{e.destroy()}},[r,h,d,f,p,m]);let g=l?.selector,_=l?.rootMargin,v=l!==void 0&&g!==void 0&&g!==``;(0,t.useEffect)(()=>{if(!v)return;let e=G(r,{selector:g,rootMargin:_,scrollContainer:l.scrollContainer});return()=>{e.destroy()}},[r,v,g,_]),(0,t.useEffect)(()=>{if(!u)return;let e=re(r);return()=>{e.destroy()}},[r,u]);let y=(0,n.getNavigator)(r),x=(0,t.useMemo)(()=>(0,s.createRouteSource)(r),[r]),{route:S,previousRoute:C}=b(x.subscribe,x.getSnapshot,x.getSnapshot),w=(0,t.useMemo)(()=>({navigator:y,route:S,previousRoute:C}),[y,S,C]);return(0,o.jsx)(e.i.Provider,{value:r,children:(0,o.jsx)(e.n.Provider,{value:y,children:(0,o.jsx)(e.r.Provider,{value:w,children:i})})})};exports.Link=$,exports.NavigatorContext=e.n,exports.RouteContext=e.r,exports.RouteView=T,exports.RouterContext=e.i,exports.RouterErrorBoundary=ue,exports.RouterProvider=he,exports.useNavigator=x,exports.useRoute=e.t,exports.useRouteEnter=me,exports.useRouteExit=pe,exports.useRouteNode=C,exports.useRouteUtils=de,exports.useRouter=S,exports.useRouterTransition=fe;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useRoute-B0pDCgZw.js");let t=require("preact/hooks"),n=require("@real-router/core"),r=require("@real-router/route-utils"),i=require("preact"),a=require("preact/compat"),o=require("preact/jsx-runtime"),s=require("@real-router/sources"),c=require("@real-router/core/api");function l(e){return null}l.displayName=`RouteView.Match`;function u(e){return null}u.displayName=`RouteView.Self`;function d(e){return null}d.displayName=`RouteView.NotFound`;function f(e,t,n){return t===``?!1:n?e===t:(0,r.startsWithSegment)(e,t)}function p(e,t){for(let n of(0,i.toChildArray)(e))(0,i.isValidElement)(n)&&(n.type===l||n.type===u||n.type===d?t.push(n):p(n.props.children,t))}function m(e,t,n){return(0,o.jsx)(i.Fragment,{children:n===void 0?e:(0,o.jsx)(a.Suspense,{fallback:n,children:e})},t)}function h(e){return e.type===d||e.type===u}function g(e,t){if(e.type===d){t.notFoundChildren=e.props.children;return}t.selfFound||=(t.selfChildren=e.props.children,t.selfFallback=e.props.fallback,!0)}function _(e,t,n,r){let{segment:i,exact:a=!1,fallback:o,children:s}=e.props,c=n?`${n}.${i}`:i;return!r&&f(t,c,a)?m(s,c,o):null}function v(e,t,r,a){if(a.selfFound&&t===r){e.push(m(a.selfChildren,`__route-view-self__`,a.selfFallback));return}t===n.UNKNOWN_ROUTE&&a.notFoundChildren!==null&&e.push((0,o.jsx)(i.Fragment,{children:a.notFoundChildren},`__route-view-not-found__`))}function y(e,t,n){let r={selfChildren:null,selfFallback:void 0,selfFound:!1,notFoundChildren:null},i=!1,a=[];for(let o of e){if(h(o)){g(o,r);continue}let e=_(o,t,n,i);e!==null&&(i=!0,a.push(e))}return i||v(a,t,n,r),{rendered:a,activeMatchFound:i}}function b(e,n,r){let[i,a]=(0,t.useState)(n);return(0,t.useEffect)(()=>{let t=()=>{a(e=>{let t=n();return Object.is(e,t)?e:t})};return t(),e(t)},[e,n]),i}const x=e.a(e.n,`useNavigator`),S=e.a(e.i,`useRouter`);function C(e){let n=S(),r=x(),i=(0,s.createRouteNodeSource)(n,e),{route:a,previousRoute:o}=b(i.subscribe,i.getSnapshot,i.getSnapshot);return(0,t.useMemo)(()=>({navigator:r,route:a,previousRoute:o}),[r,a,o])}function w({nodeName:e,children:n}){let{route:r}=C(e),i=(0,t.useMemo)(()=>{let e=[];return p(n,e),e},[n]),a=r?.name,s=(0,t.useMemo)(()=>a===void 0?[]:y(i,a,e).rendered,[i,a,e]);return s.length>0?(0,o.jsx)(o.Fragment,{children:s}):null}w.displayName=`RouteView`;const T=Object.assign(w,{Match:l,Self:u,NotFound:d}),ee=Object.freeze({}),te=Object.freeze({}),E=`data-real-router-announcer`,D=Object.freeze({destroy:()=>{}});function O(e,t){if(typeof document>`u`)return D;let n=t?.prefix??`Navigated to `,r=t?.getAnnouncementText,i=!0,a=!1,o=!1,s=``,c=null,l,u=k(),d=(e,t)=>{s=e,clearTimeout(l),u.textContent=e,l=setTimeout(()=>{u.textContent=``,s=``},7e3),ne(t)},f=setTimeout(()=>{if(a=!0,c!==null&&!o){let e=c;c=null,d(e,document.querySelector(`h1`))}},100),p=e.subscribe(({route:e})=>{if(i){i=!1;return}requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(o)return;let t=document.querySelector(`h1`),i=j(e,n,r,t);if(!(!i||i===s)){if(!a){c=i;return}d(i,t)}})})});return{destroy(){o=!0,p(),clearTimeout(l),clearTimeout(f),A()}}}function k(){let e=document.querySelector(`[${E}]`);if(e)return e;let t=document.createElement(`div`);return t.setAttribute(`style`,`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0`),t.setAttribute(`aria-live`,`assertive`),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(E,``),(document.body??document.documentElement).prepend(t),t}function A(){document.querySelector(`[${E}]`)?.remove()}function j(e,t,n,r){if(n)try{let t=n(e);if(t)return t}catch(e){console.error(`[real-router] getAnnouncementText threw; falling back to default resolution.`,e)}let i=(r?.textContent??``).trim(),a=e.name.startsWith(`@@`)?``:e.name;return`${t}${i||document.title||a||globalThis.location.pathname}`}function ne(e){e&&(e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}const M=Object.freeze({destroy:()=>{}});function N(e,t){if(globalThis.window===void 0)return M;let n=t?.mode??`restore`;if(n===`native`)return M;let r=t?.anchorScrolling??!0,i=t?.scrollContainer,a=t?.behavior??`auto`,o=t?.storageKey??`real-router:scroll`,s,c=()=>{if(s!==void 0)return s;try{let e=sessionStorage.getItem(o);s=e?JSON.parse(e):{}}catch{s={}}return s},l=(e,t)=>{try{let n=c();if(n[e]===t)return;n[e]=t,sessionStorage.setItem(o,JSON.stringify(n))}catch{}},u=history.scrollRestoration;try{history.scrollRestoration=`manual`}catch{}let d=()=>{let e=i?.();return e?e.scrollTop:globalThis.scrollY},f=e=>{let t=i?.();t?t.scrollTo({top:e,left:0,behavior:a}):globalThis.scrollTo({top:e,left:0,behavior:a})},p=e=>{if(!i){globalThis.scrollTo({top:e,left:0,behavior:a});return}let t=0,n=()=>{if(h)return;let r=i();if(r){if(r.scrollTo({top:e,left:0,behavior:a}),a!==`smooth`&&Math.abs(r.scrollTop-e)<=1)return}else globalThis.scrollTo({top:e,left:0,behavior:a});t>=10||(t+=1,requestAnimationFrame(n))};n()},m=e=>{let t=e.context?.url?.hash;if(t!==void 0){if(r&&t.length>0){let e=document.getElementById(t);if(e){e.scrollIntoView({behavior:a});return}}f(0);return}let n=globalThis.location.hash;if(r&&n.length>1){let e;try{e=decodeURIComponent(n.slice(1))}catch{e=n.slice(1)}let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:a});return}}f(0)},h=!1,g=!1,_=e=>{try{return F(e)}catch{return g||(g=!0,console.error(`[real-router] scroll-restore: route "${e.name}" has params that cannot be canonicalized (e.g. BigInt or cyclic structure). Scroll position will not be captured or restored for this route.`)),null}},v=e.subscribe(({route:e,previousRoute:t})=>{let r=e.context.navigation;if(t){let e=_(t);e!==null&&l(e,d())}requestAnimationFrame(()=>{if(!h){if(n===`top`){m(e);return}if(e.transition.reload||r?.navigationType===`reload`){let t=_(e);p(t===null?0:c()[t]??0);return}if(r?.direction===`back`||r?.navigationType===`traverse`){let t=_(e);p(t===null?0:c()[t]??0);return}e.transition.replace||r?.navigationType===`replace`||m(e)}})}),y=()=>{let t=e.getState();if(t){let e=_(t);e!==null&&l(e,d())}};return globalThis.addEventListener(`pagehide`,y),{destroy:()=>{if(!h){h=!0,v(),globalThis.removeEventListener(`pagehide`,y);try{history.scrollRestoration=u}catch{}}}}}const P=new WeakMap;function F(e){let t=P.get(e);if(t!==void 0)return t;let n=`${e.name}:${I(e.params)}`;return P.set(e,n),n}function I(e){return JSON.stringify(e,L)}function L(e,t){if(typeof t==`function`)return`<fn>`;if(typeof t==`symbol`)return`<sym>`;if(typeof t==`object`&&t&&!Array.isArray(t)){let e=Object.create(null),n=Object.keys(t).sort((e,t)=>e.localeCompare(t));for(let r of n)e[r]=t[r];return e}return t}const R=Object.freeze({destroy:()=>{}}),z=e=>e.context?.url,B=e=>{let t=null,n=1/0,r=null,i=-1/0;for(let a of e){if(!a.isIntersecting)continue;let e=a.rootBounds?.top??0,o=a.boundingClientRect.top-e;o>=0?o<n&&(t=a,n=o):o>i&&(r=a,i=o)}return t??r},V=(e,t)=>{let n=null,r=e=>{let n=e.context;n&&n.url===void 0&&(console.warn(`[real-router] scroll-spy: state.context.url is not claimed. Spy requires browser-plugin or navigation-plugin. Disabling.`),t())},i=e.getState();if(i)r(i);else{let t=!1;n=e.subscribe(({route:e})=>{t||(t=!0,r(e),n?.(),n=null)})}return{destroy(){n?.(),n=null}}},H=e=>{let t=!1,n=null,r=null,i=null,a=()=>{n!==null&&(clearTimeout(n),n=null),i&&(r??globalThis).removeEventListener(`scrollend`,i),i=null,r=null,t=!1};return{get active(){return t},start(){a(),t=!0;let o=()=>{a()};i=o,r=e(),(r??globalThis).addEventListener(`scrollend`,o,{once:!0}),n=setTimeout(o,500)},destroy(){a()}}},U=(e,t)=>{let n=null,r=null;return{schedule(){n===null&&(n=requestAnimationFrame(()=>{n=null,r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null,e()},t)}))},destroy(){n!==null&&(cancelAnimationFrame(n),n=null),r!==null&&(clearTimeout(r),r=null)}}},W=(e,t,n,r,i,a)=>{let o=new Set,s=new Map,c=!1,l=null,u=new IntersectionObserver(e=>{if(!a()){for(let t of e)s.set(t.target,t);r()}},{root:n(),rootMargin:t,threshold:0}),d=()=>{let t=n()??document,r;try{r=t.querySelectorAll(e)}catch{i();return}let a=new Set;for(let e of r){let t=e.id;t&&!c&&(a.has(t)&&(c=!0,console.warn(`[real-router] scroll-spy: duplicate id "${t}" observed. Selection picks the topmost visible match deterministically.`)),a.add(t)),!o.has(e)&&(u.observe(e),o.add(e))}},f=()=>{for(let e of o)e.isConnected||(u.unobserve(e),o.delete(e),s.delete(e));d()};d();let p=n()??document.body,m=new MutationObserver(()=>{l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,f()},250)});return m.observe(p,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`id`]}),{pending:s,destroy(){u.disconnect(),m.disconnect(),l!==null&&(clearTimeout(l),l=null),o.clear(),s.clear()}}};function G(e,t){if(typeof document>`u`||typeof IntersectionObserver>`u`)return R;let{selector:n}=t;if(!n)return R;let r=t.rootMargin??`-20% 0px -60% 0px`,i=t.scrollContainer,a=()=>i?.()??null,o=!1,c=!1,l=!1,u=()=>c||o,d=null,f=(0,s.getTransitionSource)(e),p=V(e,()=>{c=!0}),m=H(a),h=U(()=>{d?.()},150),g=W(n,r,a,()=>{h.schedule()},()=>{c||(c=!0,console.warn(`[real-router] scroll-spy: invalid selector "${n}". Disabling.`))},u);d=()=>{if(o||c){g.pending.clear();return}if(f.getSnapshot().isTransitioning||m.active||g.pending.size===0)return;let t=B(g.pending.values());if(g.pending.clear(),!t)return;let n=t.target.id;if(!n)return;let r=e.getState();if(!r||n===(z(r)?.hash??``))return;let i={hash:n,replace:!0,force:!0,hashChange:!0};l=!0,e.navigate(r.name,r.params,i).catch(()=>{}).finally(()=>{l=!1})};let _=e.subscribe(({route:e})=>{l||z(e)?.hashChanged&&m.start()});return{destroy(){o||(o=!0,_(),g.destroy(),h.destroy(),m.destroy(),p.destroy())}}}const K=Object.freeze({destroy:()=>{}});function re(e){if(typeof document>`u`||typeof document.startViewTransition!=`function`)return K;let t=null,n=null,r=!1,i=()=>{t?.(),t=null},a=e.subscribeLeave(({signal:e})=>{if(!e.aborted)return r=!1,i(),new Promise(a=>{let o=new Promise(e=>{t=e});e.addEventListener(`abort`,()=>{r||(i(),n?.skipTransition?.(),a())},{once:!0});try{n=document.startViewTransition(()=>(a(),o))}catch{i(),a()}})}),o=e.subscribe(()=>{let e=t;r=!0,t=null,e===null?n=null:setTimeout(()=>{e(),n=null},0)});return{destroy:()=>{a(),o(),n?.skipTransition?.(),n=null,i()}}}function q(e){return e.button===0&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&!e.shiftKey}const J=/%[\dA-Fa-f]{2}/;function Y(e){if(J.test(e))try{return encodeURI(decodeURIComponent(e)).replaceAll(`#`,`%23`)}catch{}return encodeURI(e).replaceAll(`#`,`%23`)}function X(e,t,n,r){try{let i=r?.hash,a;i!==void 0&&(a=i.startsWith(`#`)?i.slice(1):i);let o=e.buildUrl;if(o){let e=o(t,n,a===void 0?void 0:{hash:a});if(typeof e==`string`&&e.length>0)return e}let s=e.buildPath(t,n);if(typeof s!=`string`||s.length===0){console.error(`[real-router] Route "${t}" yielded an empty path. The element will render without an href attribute.`);return}return a?`${s}#${Y(a)}`:s}catch{console.error(`[real-router] Route "${t}" is not defined. The element will render without an href attribute.`);return}}function ie(e,t,n,r,i){let a={...i};r!==void 0&&(a.hash=r);let o=e.getState();if(o?.name===t&&Q(o.params,n)){let e=o.context?.url?.hash??``;e!==(r??e)&&(a.force=!0,a.hashChange=!0)}return e.navigate(t,n,a)}const ae=/\s/,oe=/\S+/g;function Z(e){return e?ae.test(e)?e.match(oe)??[]:[e]:[]}function se(e,t,n){if(e&&t){let e=Z(t);if(e.length===0)return n??void 0;if(!n)return e.join(` `);let r=Z(n),i=new Set(r);for(let t of e)i.has(t)||(i.add(t),r.push(t));return r.join(` `)}return n??void 0}function Q(e,t){if(Object.is(e,t))return!0;if(!e||!t)return!1;let n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;let r=e,i=t;for(let e of n)if(!Object.prototype.hasOwnProperty.call(t,e)||!Object.is(r[e],i[e]))return!1;return!0}function ce(e,n,r=!1,i=!0,a){let o=S(),c=(0,t.useMemo)(()=>a===void 0?{strict:r,ignoreQueryParams:i}:{strict:r,ignoreQueryParams:i,hash:a},[r,i,a]),l=(0,t.useMemo)(()=>(0,s.createActiveRouteSource)(o,e,n,c),[o,e,n,c]);return b(l.subscribe,l.getSnapshot,l.getSnapshot)}function le(e,t){return e.routeName===t.routeName&&e.className===t.className&&e.activeClassName===t.activeClassName&&e.activeStrict===t.activeStrict&&e.ignoreQueryParams===t.ignoreQueryParams&&e.onClick===t.onClick&&e.target===t.target&&e.style===t.style&&e.children===t.children&&e.hash===t.hash&&Q(e.routeParams,t.routeParams)&&Q(e.routeOptions,t.routeOptions)}const $=(0,a.memo)(({routeName:e,routeParams:t=ee,routeOptions:n=te,className:r,activeClassName:i=`active`,activeStrict:a=!1,ignoreQueryParams:s=!0,hash:c,onClick:l,target:u,children:d,...f})=>{let p=S(),m=ce(e,t,a,s,c),h=X(p,e,t,c===void 0?void 0:{hash:c}),g=r=>{l&&(l(r),r.defaultPrevented)||!q(r)||u===`_blank`||(r.preventDefault(),ie(p,e,t,c,n).catch(()=>{}))},_=se(m,i,r);return(0,o.jsx)(`a`,{...f,href:h,className:_,onClick:g,children:d})},le);$.displayName=`Link`;function ue({children:e,fallback:n,onError:r}){let a=(0,s.createDismissableError)(S()),c=b(a.subscribe,a.getSnapshot,a.getSnapshot),l=(0,t.useRef)(r);return(0,t.useLayoutEffect)(()=>{l.current=r}),(0,t.useEffect)(()=>{c.error&&l.current?.(c.error,c.toRoute,c.fromRoute)},[c.version]),(0,o.jsxs)(i.Fragment,{children:[e,c.error?n(c.error,c.resetError):null]})}const de=()=>(0,r.getRouteUtils)((0,c.getPluginApi)(S()).getTree());function fe(){let e=(0,s.getTransitionSource)(S());return b(e.subscribe,e.getSnapshot,e.getSnapshot)}function pe(e,n){let r=S(),i=(0,t.useRef)(e),a=n?.skipSameRoute??!0;(0,t.useLayoutEffect)(()=>{i.current=e}),(0,t.useEffect)(()=>r.subscribeLeave(({route:e,nextRoute:t,signal:n})=>{if(!(a&&e.name===t.name)&&!n.aborted)return i.current({route:e,nextRoute:t,signal:n})}),[r,a])}function me(n,r){let{route:i,previousRoute:a}=e.t(),o=(0,t.useRef)(n),s=(0,t.useRef)(null),c=r?.skipSameRoute??!0;(0,t.useLayoutEffect)(()=>{o.current=n}),(0,t.useEffect)(()=>{i.transition.from&&(c&&i.transition.from===i.name||s.current===i||!a||(s.current=i,o.current({route:i,previousRoute:a})))},[i,a,c])}const he=({router:r,children:i,announceNavigation:a,scrollRestoration:c,scrollSpy:l,viewTransitions:u})=>{(0,t.useEffect)(()=>{if(!a)return;let e=O(r);return()=>{e.destroy()}},[a,r]);let d=c?.mode,f=c?.anchorScrolling,p=c?.behavior,m=c?.storageKey,h=c!==void 0;(0,t.useEffect)(()=>{if(!h)return;let e=N(r,{mode:d,anchorScrolling:f,behavior:p,storageKey:m,scrollContainer:c.scrollContainer});return()=>{e.destroy()}},[r,h,d,f,p,m]);let g=l?.selector,_=l?.rootMargin,v=l!==void 0&&g!==void 0&&g!==``;(0,t.useEffect)(()=>{if(!v)return;let e=G(r,{selector:g,rootMargin:_,scrollContainer:l.scrollContainer});return()=>{e.destroy()}},[r,v,g,_]),(0,t.useEffect)(()=>{if(!u)return;let e=re(r);return()=>{e.destroy()}},[r,u]);let y=(0,n.getNavigator)(r),x=(0,t.useMemo)(()=>(0,s.createRouteSource)(r),[r]),{route:S,previousRoute:C}=b(x.subscribe,x.getSnapshot,x.getSnapshot),w=(0,t.useMemo)(()=>({navigator:y,route:S,previousRoute:C}),[y,S,C]);return(0,o.jsx)(e.i.Provider,{value:r,children:(0,o.jsx)(e.n.Provider,{value:y,children:(0,o.jsx)(e.r.Provider,{value:w,children:i})})})};exports.Link=$,exports.NavigatorContext=e.n,exports.RouteContext=e.r,exports.RouteView=T,exports.RouterContext=e.i,exports.RouterErrorBoundary=ue,exports.RouterProvider=he,exports.useNavigator=x,exports.useRoute=e.t,exports.useRouteEnter=me,exports.useRouteExit=pe,exports.useRouteNode=C,exports.useRouteUtils=de,exports.useRouter=S,exports.useRouterTransition=fe;
2
2
  //# sourceMappingURL=index.js.map
package/dist/cjs/ssr.js CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./useRoute-B3rj5MXo.js`);let t=require(`preact/hooks`),n=require(`preact`),r=require(`preact/compat`),i=require(`preact/jsx-runtime`);function a({children:e,fallback:n=null}){let[r,i]=(0,t.useState)(!1);return(0,t.useEffect)(()=>{i(!0)},[]),r?e:n}function o({children:e,fallback:n=null}){let[r,i]=(0,t.useState)(!1);return(0,t.useEffect)(()=>{i(!0)},[]),r?n:e}const s=new Promise(()=>{});function c(t){let{route:n}=e.t();return n.context.ssrDataDeferred?.[t]??s}function l(e){let t=e;return t.status===void 0?(t.status=`pending`,e.then(e=>{t.status===`pending`&&(t.status=`fulfilled`,t.value=e)},e=>{t.status===`pending`&&(t.status=`rejected`,t.reason=e)}),t):t}function u({name:e,children:t}){let n=c(e),r=l(n);if(r.status===`fulfilled`)return t(r.value);throw r.status===`rejected`?r.reason:n}function d({fallback:e,children:t}){return(0,i.jsx)(r.Suspense,{fallback:e,children:t})}const f=(0,n.createContext)(null);function p({sink:e,children:t}){return(0,i.jsx)(f.Provider,{value:e,children:t})}function m({code:e}){let n=(0,t.useContext)(f);return n&&(process.env.NODE_ENV!==`production`&&(!Number.isInteger(e)||e<100||e>999)&&console.error(`[real-router] <HttpStatusCode code={${String(e)}} /> received an invalid HTTP status code. Node's res.end() rejects values that are not an integer in [100, 999] — pass a real HTTP status (commonly 4xx/5xx).`),n.code=e),null}function h(){return{code:void 0}}exports.Await=u,exports.ClientOnly=a,exports.HttpStatusCode=m,exports.HttpStatusProvider=p,exports.ServerOnly=o,exports.Streamed=d,exports.createHttpStatusSink=h,exports.useDeferred=c;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./useRoute-B0pDCgZw.js");let t=require("preact/hooks"),n=require("preact"),r=require("preact/compat"),i=require("preact/jsx-runtime");function a({children:e,fallback:n=null}){let[r,i]=(0,t.useState)(!1);return(0,t.useEffect)(()=>{i(!0)},[]),r?e:n}function o({children:e,fallback:n=null}){let[r,i]=(0,t.useState)(!1);return(0,t.useEffect)(()=>{i(!0)},[]),r?n:e}const s=new Promise(()=>{});function c(t){let{route:n}=e.t();return n.context.ssrDataDeferred?.[t]??s}function l(e){let t=e;return t.status===void 0?(t.status=`pending`,e.then(e=>{t.status===`pending`&&(t.status=`fulfilled`,t.value=e)},e=>{t.status===`pending`&&(t.status=`rejected`,t.reason=e)}),t):t}function u({name:e,children:t}){let n=c(e),r=l(n);if(r.status===`fulfilled`)return t(r.value);throw r.status===`rejected`?r.reason:n}function d({fallback:e,children:t}){return(0,i.jsx)(r.Suspense,{fallback:e,children:t})}const f=(0,n.createContext)(null);function p({sink:e,children:t}){return(0,i.jsx)(f.Provider,{value:e,children:t})}function m({code:e}){let n=(0,t.useContext)(f);return n&&(process.env.NODE_ENV!==`production`&&(!Number.isInteger(e)||e<100||e>999)&&console.error(`[real-router] <HttpStatusCode code={${String(e)}} /> received an invalid HTTP status code. Node's res.end() rejects values that are not an integer in [100, 999] — pass a real HTTP status (commonly 4xx/5xx).`),n.code=e),null}function h(){return{code:void 0}}exports.Await=u,exports.ClientOnly=a,exports.HttpStatusCode=m,exports.HttpStatusProvider=p,exports.ServerOnly=o,exports.Streamed=d,exports.createHttpStatusSink=h,exports.useDeferred=c;
2
2
  //# sourceMappingURL=ssr.js.map
@@ -1,2 +1,2 @@
1
- let e=require(`preact/hooks`),t=require(`preact`);const n=(0,t.createContext)(null),r=(0,t.createContext)(null),i=(0,t.createContext)(null);function a(t,n){return()=>{let r=(0,e.useContext)(t);if(!r)throw Error(`${n} must be used within a RouterProvider`);return r}}const o=a(n,`useRoute`),s=()=>{let e=o();if(!e.route)throw Error(`useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?`);return e};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
2
- //# sourceMappingURL=useRoute-B3rj5MXo.js.map
1
+ let e=require("preact/hooks"),t=require("preact");const n=(0,t.createContext)(null),r=(0,t.createContext)(null),i=(0,t.createContext)(null);function a(t,n){return()=>{let r=(0,e.useContext)(t);if(!r)throw Error(`${n} must be used within a RouterProvider`);return r}}const o=a(n,`useRoute`),s=()=>{let e=o();if(!e.route)throw Error(`useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?`);return e};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return s}});
2
+ //# sourceMappingURL=useRoute-B0pDCgZw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRoute-B3rj5MXo.js","names":[],"sources":["../../src/context.ts","../../src/hooks/useRoute.tsx"],"sourcesContent":["import { createContext } from \"preact\";\nimport { useContext } from \"preact/hooks\";\n\nimport type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\nimport type { Context } from \"preact\";\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport const NavigatorContext = createContext<Navigator | null>(null);\n\nexport function createUseContextOrThrow<T>(\n context: Context<T | null>,\n hookName: string,\n): () => T {\n return () => {\n const value = useContext(context);\n\n if (!value) {\n throw new Error(`${hookName} must be used within a RouterProvider`);\n }\n\n return value;\n };\n}\n","import { createUseContextOrThrow, RouteContext } from \"../context\";\n\nimport type { RouteContext as RouteContextType } from \"../types\";\nimport type { Params, State } from \"@real-router/core\";\n\nconst useRouteContextOrThrow = createUseContextOrThrow(\n RouteContext,\n \"useRoute\",\n);\n\nexport const useRoute = <P extends Params = Params>(): Omit<\n RouteContextType<P>,\n \"route\"\n> & { route: State<P> } => {\n const routeContext = useRouteContextOrThrow();\n\n if (!routeContext.route) {\n throw new Error(\n \"useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?\",\n );\n }\n\n return routeContext as Omit<RouteContextType<P>, \"route\"> & {\n route: State<P>;\n };\n};\n"],"mappings":"kDAOA,MAAa,GAAA,EAAA,EAAA,eAAsD,IAAI,EAE1D,GAAA,EAAA,EAAA,eAA6C,IAAI,EAEjD,GAAA,EAAA,EAAA,eAAmD,IAAI,EAEpE,SAAgB,EACd,EACA,EACS,CACT,UAAa,CACX,IAAM,GAAA,EAAA,EAAA,YAAmB,CAAO,EAEhC,GAAI,CAAC,EACH,MAAU,MAAM,GAAG,EAAS,sCAAsC,EAGpE,OAAO,CACT,CACF,CCrBA,MAAM,EAAyB,EAC7B,EACA,UACF,EAEa,MAGc,CACzB,IAAM,EAAe,EAAuB,EAE5C,GAAI,CAAC,EAAa,MAChB,MAAU,MACR,mIACF,EAGF,OAAO,CAGT"}
1
+ {"version":3,"file":"useRoute-B0pDCgZw.js","names":[],"sources":["../../src/context.ts","../../src/hooks/useRoute.tsx"],"sourcesContent":["import { createContext } from \"preact\";\nimport { useContext } from \"preact/hooks\";\n\nimport type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\nimport type { Context } from \"preact\";\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport const NavigatorContext = createContext<Navigator | null>(null);\n\nexport function createUseContextOrThrow<T>(\n context: Context<T | null>,\n hookName: string,\n): () => T {\n return () => {\n const value = useContext(context);\n\n if (!value) {\n throw new Error(`${hookName} must be used within a RouterProvider`);\n }\n\n return value;\n };\n}\n","import { createUseContextOrThrow, RouteContext } from \"../context\";\n\nimport type { RouteContext as RouteContextType } from \"../types\";\nimport type { Params, State } from \"@real-router/core\";\n\nconst useRouteContextOrThrow = createUseContextOrThrow(\n RouteContext,\n \"useRoute\",\n);\n\nexport const useRoute = <P extends Params = Params>(): Omit<\n RouteContextType<P>,\n \"route\"\n> & { route: State<P> } => {\n const routeContext = useRouteContextOrThrow();\n\n if (!routeContext.route) {\n throw new Error(\n \"useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?\",\n );\n }\n\n return routeContext as Omit<RouteContextType<P>, \"route\"> & {\n route: State<P>;\n };\n};\n"],"mappings":"kDAOA,MAAa,GAAA,EAAA,EAAA,eAAsD,IAAI,EAE1D,GAAA,EAAA,EAAA,eAA6C,IAAI,EAEjD,GAAA,EAAA,EAAA,eAAmD,IAAI,EAEpE,SAAgB,EACd,EACA,EACS,CACT,UAAa,CACX,IAAM,GAAA,EAAA,EAAA,YAAmB,CAAO,EAEhC,GAAI,CAAC,EACH,MAAU,MAAM,GAAG,EAAS,sCAAsC,EAGpE,OAAO,CACT,CACF,CCrBA,MAAM,EAAyB,EAC7B,EACA,UACF,EAEa,MAGc,CACzB,IAAM,EAAe,EAAuB,EAE5C,GAAI,CAAC,EAAa,MAChB,MAAU,MACR,mIACF,EAGF,OAAO,CAGT"}
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,n,r,t as i}from"./useRoute-BSPVVbLz.mjs";import{useEffect as a,useLayoutEffect as o,useMemo as s,useRef as c,useState as l}from"preact/hooks";import{UNKNOWN_ROUTE as u,getNavigator as d}from"@real-router/core";import{getRouteUtils as f,startsWithSegment as p}from"@real-router/route-utils";import{Fragment as m,isValidElement as h,toChildArray as g}from"preact";import{Suspense as _,memo as v}from"preact/compat";import{Fragment as y,jsx as b,jsxs as x}from"preact/jsx-runtime";import{createActiveRouteSource as S,createDismissableError as C,createRouteNodeSource as w,createRouteSource as ee,getTransitionSource as T}from"@real-router/sources";import{getPluginApi as te}from"@real-router/core/api";function E(e){return null}E.displayName=`RouteView.Match`;function D(e){return null}D.displayName=`RouteView.Self`;function O(e){return null}O.displayName=`RouteView.NotFound`;function ne(e,t,n){return t===``?!1:n?e===t:p(e,t)}function k(e,t){for(let n of g(e))h(n)&&(n.type===E||n.type===D||n.type===O?t.push(n):k(n.props.children,t))}function A(e,t,n){return b(m,{children:n===void 0?e:b(_,{fallback:n,children:e})},t)}function re(e){return e.type===O||e.type===D}function ie(e,t){if(e.type===O){t.notFoundChildren=e.props.children;return}t.selfFound||=(t.selfChildren=e.props.children,t.selfFallback=e.props.fallback,!0)}function j(e,t,n,r){let{segment:i,exact:a=!1,fallback:o,children:s}=e.props,c=n?`${n}.${i}`:i;return!r&&ne(t,c,a)?A(s,c,o):null}function M(e,t,n,r){if(r.selfFound&&t===n){e.push(A(r.selfChildren,`__route-view-self__`,r.selfFallback));return}t===u&&r.notFoundChildren!==null&&e.push(b(m,{children:r.notFoundChildren},`__route-view-not-found__`))}function ae(e,t,n){let r={selfChildren:null,selfFallback:void 0,selfFound:!1,notFoundChildren:null},i=!1,a=[];for(let o of e){if(re(o)){ie(o,r);continue}let e=j(o,t,n,i);e!==null&&(i=!0,a.push(e))}return i||M(a,t,n,r),{rendered:a,activeMatchFound:i}}function N(e,t,n){let[r,i]=l(t);return a(()=>{let n=()=>{i(e=>{let n=t();return Object.is(e,n)?e:n})};return n(),e(n)},[e,t]),r}const P=e(n,`useNavigator`),F=e(t,`useRouter`);function I(e){let t=F(),n=P(),r=w(t,e),{route:i,previousRoute:a}=N(r.subscribe,r.getSnapshot,r.getSnapshot);return s(()=>({navigator:n,route:i,previousRoute:a}),[n,i,a])}function L({nodeName:e,children:t}){let{route:n}=I(e),r=s(()=>{let e=[];return k(t,e),e},[t]),i=n?.name,a=s(()=>i===void 0?[]:ae(r,i,e).rendered,[r,i,e]);return a.length>0?b(y,{children:a}):null}L.displayName=`RouteView`;const oe=Object.assign(L,{Match:E,Self:D,NotFound:O}),se=Object.freeze({}),R=Object.freeze({}),z=`data-real-router-announcer`,B=Object.freeze({destroy:()=>{}});function V(e,t){if(typeof document>`u`)return B;let n=t?.prefix??`Navigated to `,r=t?.getAnnouncementText,i=!0,a=!1,o=!1,s=``,c=null,l,u=H(),d=(e,t)=>{s=e,clearTimeout(l),u.textContent=e,l=setTimeout(()=>{u.textContent=``,s=``},7e3),G(t)},f=setTimeout(()=>{if(a=!0,c!==null&&!o){let e=c;c=null,d(e,document.querySelector(`h1`))}},100),p=e.subscribe(({route:e})=>{if(i){i=!1;return}requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(o)return;let t=document.querySelector(`h1`),i=W(e,n,r,t);if(!(!i||i===s)){if(!a){c=i;return}d(i,t)}})})});return{destroy(){o=!0,p(),clearTimeout(l),clearTimeout(f),U()}}}function H(){let e=document.querySelector(`[${z}]`);if(e)return e;let t=document.createElement(`div`);return t.setAttribute(`style`,`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0`),t.setAttribute(`aria-live`,`assertive`),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(z,``),(document.body??document.documentElement).prepend(t),t}function U(){document.querySelector(`[${z}]`)?.remove()}function W(e,t,n,r){if(n)try{let t=n(e);if(t)return t}catch(e){console.error(`[real-router] getAnnouncementText threw; falling back to default resolution.`,e)}let i=(r?.textContent??``).trim(),a=e.name.startsWith(`@@`)?``:e.name;return`${t}${i||document.title||a||globalThis.location.pathname}`}function G(e){e&&(e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}const K=Object.freeze({destroy:()=>{}});function ce(e,t){if(globalThis.window===void 0)return K;let n=t?.mode??`restore`;if(n===`native`)return K;let r=t?.anchorScrolling??!0,i=t?.scrollContainer,a=t?.behavior??`auto`,o=t?.storageKey??`real-router:scroll`,s,c=()=>{if(s!==void 0)return s;try{let e=sessionStorage.getItem(o);s=e?JSON.parse(e):{}}catch{s={}}return s},l=(e,t)=>{try{let n=c();if(n[e]===t)return;n[e]=t,sessionStorage.setItem(o,JSON.stringify(n))}catch{}},u=history.scrollRestoration;try{history.scrollRestoration=`manual`}catch{}let d=()=>{let e=i?.();return e?e.scrollTop:globalThis.scrollY},f=e=>{let t=i?.();t?t.scrollTo({top:e,left:0,behavior:a}):globalThis.scrollTo({top:e,left:0,behavior:a})},p=e=>{if(!i){globalThis.scrollTo({top:e,left:0,behavior:a});return}let t=0,n=()=>{if(h)return;let r=i();if(r){if(r.scrollTo({top:e,left:0,behavior:a}),a!==`smooth`&&Math.abs(r.scrollTop-e)<=1)return}else globalThis.scrollTo({top:e,left:0,behavior:a});t>=10||(t+=1,requestAnimationFrame(n))};n()},m=e=>{let t=e.context?.url?.hash;if(t!==void 0){if(r&&t.length>0){let e=document.getElementById(t);if(e){e.scrollIntoView({behavior:a});return}}f(0);return}let n=globalThis.location.hash;if(r&&n.length>1){let e;try{e=decodeURIComponent(n.slice(1))}catch{e=n.slice(1)}let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:a});return}}f(0)},h=!1,g=!1,_=e=>{try{return le(e)}catch{return g||(g=!0,console.error(`[real-router] scroll-restore: route "${e.name}" has params that cannot be canonicalized (e.g. BigInt or cyclic structure). Scroll position will not be captured or restored for this route.`)),null}},v=e.subscribe(({route:e,previousRoute:t})=>{let r=e.context.navigation;if(t){let e=_(t);e!==null&&l(e,d())}requestAnimationFrame(()=>{if(!h){if(n===`top`){m(e);return}if(e.transition.reload||r?.navigationType===`reload`){let t=_(e);p(t===null?0:c()[t]??0);return}if(r?.direction===`back`||r?.navigationType===`traverse`){let t=_(e);p(t===null?0:c()[t]??0);return}e.transition.replace||r?.navigationType===`replace`||m(e)}})}),y=()=>{let t=e.getState();if(t){let e=_(t);e!==null&&l(e,d())}};return globalThis.addEventListener(`pagehide`,y),{destroy:()=>{if(!h){h=!0,v(),globalThis.removeEventListener(`pagehide`,y);try{history.scrollRestoration=u}catch{}}}}}const q=new WeakMap;function le(e){let t=q.get(e);if(t!==void 0)return t;let n=`${e.name}:${ue(e.params)}`;return q.set(e,n),n}function ue(e){return JSON.stringify(e,de)}function de(e,t){if(typeof t==`function`)return`<fn>`;if(typeof t==`symbol`)return`<sym>`;if(typeof t==`object`&&t&&!Array.isArray(t)){let e=Object.create(null),n=Object.keys(t).sort((e,t)=>e.localeCompare(t));for(let r of n)e[r]=t[r];return e}return t}const J=Object.freeze({destroy:()=>{}}),Y=e=>e.context?.url,fe=e=>{let t=null,n=1/0,r=null,i=-1/0;for(let a of e){if(!a.isIntersecting)continue;let e=a.rootBounds?.top??0,o=a.boundingClientRect.top-e;o>=0?o<n&&(t=a,n=o):o>i&&(r=a,i=o)}return t??r},pe=(e,t)=>{let n=null,r=e=>{let n=e.context;n&&n.url===void 0&&(console.warn(`[real-router] scroll-spy: state.context.url is not claimed. Spy requires browser-plugin or navigation-plugin. Disabling.`),t())},i=e.getState();if(i)r(i);else{let t=!1;n=e.subscribe(({route:e})=>{t||(t=!0,r(e),n?.(),n=null)})}return{destroy(){n?.(),n=null}}},me=e=>{let t=!1,n=null,r=null,i=null,a=()=>{n!==null&&(clearTimeout(n),n=null),i&&(r??globalThis).removeEventListener(`scrollend`,i),i=null,r=null,t=!1};return{get active(){return t},start(){a(),t=!0;let o=()=>{a()};i=o,r=e(),(r??globalThis).addEventListener(`scrollend`,o,{once:!0}),n=setTimeout(o,500)},destroy(){a()}}},he=(e,t)=>{let n=null,r=null;return{schedule(){n===null&&(n=requestAnimationFrame(()=>{n=null,r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null,e()},t)}))},destroy(){n!==null&&(cancelAnimationFrame(n),n=null),r!==null&&(clearTimeout(r),r=null)}}},ge=(e,t,n,r,i,a)=>{let o=new Set,s=new Map,c=!1,l=null,u=new IntersectionObserver(e=>{if(!a()){for(let t of e)s.set(t.target,t);r()}},{root:n(),rootMargin:t,threshold:0}),d=()=>{let t=n()??document,r;try{r=t.querySelectorAll(e)}catch{i();return}let a=new Set;for(let e of r){let t=e.id;t&&!c&&(a.has(t)&&(c=!0,console.warn(`[real-router] scroll-spy: duplicate id "${t}" observed. Selection picks the topmost visible match deterministically.`)),a.add(t)),!o.has(e)&&(u.observe(e),o.add(e))}},f=()=>{for(let e of o)e.isConnected||(u.unobserve(e),o.delete(e),s.delete(e));d()};d();let p=n()??document.body,m=new MutationObserver(()=>{l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,f()},250)});return m.observe(p,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`id`]}),{pending:s,destroy(){u.disconnect(),m.disconnect(),l!==null&&(clearTimeout(l),l=null),o.clear(),s.clear()}}};function _e(e,t){if(typeof document>`u`||typeof IntersectionObserver>`u`)return J;let{selector:n}=t;if(!n)return J;let r=t.rootMargin??`-20% 0px -60% 0px`,i=t.scrollContainer,a=()=>i?.()??null,o=!1,s=!1,c=!1,l=()=>s||o,u=null,d=T(e),f=pe(e,()=>{s=!0}),p=me(a),m=he(()=>{u?.()},150),h=ge(n,r,a,()=>{m.schedule()},()=>{s||(s=!0,console.warn(`[real-router] scroll-spy: invalid selector "${n}". Disabling.`))},l);u=()=>{if(o||s){h.pending.clear();return}if(d.getSnapshot().isTransitioning||p.active||h.pending.size===0)return;let t=fe(h.pending.values());if(h.pending.clear(),!t)return;let n=t.target.id;if(!n)return;let r=e.getState();if(!r||n===(Y(r)?.hash??``))return;let i={hash:n,replace:!0,force:!0,hashChange:!0};c=!0,e.navigate(r.name,r.params,i).catch(()=>{}).finally(()=>{c=!1})};let g=e.subscribe(({route:e})=>{c||Y(e)?.hashChanged&&p.start()});return{destroy(){o||(o=!0,g(),h.destroy(),m.destroy(),p.destroy(),f.destroy())}}}const ve=Object.freeze({destroy:()=>{}});function ye(e){if(typeof document>`u`||typeof document.startViewTransition!=`function`)return ve;let t=null,n=null,r=!1,i=()=>{t?.(),t=null},a=e.subscribeLeave(({signal:e})=>{if(!e.aborted)return r=!1,i(),new Promise(a=>{let o=new Promise(e=>{t=e});e.addEventListener(`abort`,()=>{r||(i(),n?.skipTransition?.(),a())},{once:!0});try{n=document.startViewTransition(()=>(a(),o))}catch{i(),a()}})}),o=e.subscribe(()=>{let e=t;r=!0,t=null,e===null?n=null:setTimeout(()=>{e(),n=null},0)});return{destroy:()=>{a(),o(),n?.skipTransition?.(),n=null,i()}}}function be(e){return e.button===0&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&!e.shiftKey}const xe=/%[\dA-Fa-f]{2}/;function Se(e){if(xe.test(e))try{return encodeURI(decodeURIComponent(e)).replaceAll(`#`,`%23`)}catch{}return encodeURI(e).replaceAll(`#`,`%23`)}function Ce(e,t,n,r){try{let i=r?.hash,a;i!==void 0&&(a=i.startsWith(`#`)?i.slice(1):i);let o=e.buildUrl;if(o){let e=o(t,n,a===void 0?void 0:{hash:a});if(typeof e==`string`&&e.length>0)return e}let s=e.buildPath(t,n);if(typeof s!=`string`||s.length===0){console.error(`[real-router] Route "${t}" yielded an empty path. The element will render without an href attribute.`);return}return a?`${s}#${Se(a)}`:s}catch{console.error(`[real-router] Route "${t}" is not defined. The element will render without an href attribute.`);return}}function we(e,t,n,r,i){let a={...i};r!==void 0&&(a.hash=r);let o=e.getState();if(o?.name===t&&Z(o.params,n)){let e=o.context?.url?.hash??``;e!==(r??e)&&(a.force=!0,a.hashChange=!0)}return e.navigate(t,n,a)}const Te=/\s/,Ee=/\S+/g;function X(e){return e?Te.test(e)?e.match(Ee)??[]:[e]:[]}function De(e,t,n){if(e&&t){let e=X(t);if(e.length===0)return n??void 0;if(!n)return e.join(` `);let r=X(n),i=new Set(r);for(let t of e)i.has(t)||(i.add(t),r.push(t));return r.join(` `)}return n??void 0}function Z(e,t){if(Object.is(e,t))return!0;if(!e||!t)return!1;let n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;let r=e,i=t;for(let e of n)if(!Object.prototype.hasOwnProperty.call(t,e)||!Object.is(r[e],i[e]))return!1;return!0}function Oe(e,t,n=!1,r=!0,i){let a=F(),o=s(()=>i===void 0?{strict:n,ignoreQueryParams:r}:{strict:n,ignoreQueryParams:r,hash:i},[n,r,i]),c=s(()=>S(a,e,t,o),[a,e,t,o]);return N(c.subscribe,c.getSnapshot,c.getSnapshot)}function ke(e,t){return e.routeName===t.routeName&&e.className===t.className&&e.activeClassName===t.activeClassName&&e.activeStrict===t.activeStrict&&e.ignoreQueryParams===t.ignoreQueryParams&&e.onClick===t.onClick&&e.target===t.target&&e.style===t.style&&e.children===t.children&&e.hash===t.hash&&Z(e.routeParams,t.routeParams)&&Z(e.routeOptions,t.routeOptions)}const Q=v(({routeName:e,routeParams:t=se,routeOptions:n=R,className:r,activeClassName:i=`active`,activeStrict:a=!1,ignoreQueryParams:o=!0,hash:s,onClick:c,target:l,children:u,...d})=>{let f=F(),p=Oe(e,t,a,o,s),m=Ce(f,e,t,s===void 0?void 0:{hash:s}),h=r=>{c&&(c(r),r.defaultPrevented)||!be(r)||l===`_blank`||(r.preventDefault(),we(f,e,t,s,n).catch(()=>{}))},g=De(p,i,r);return b(`a`,{...d,href:m,className:g,onClick:h,children:u})},ke);Q.displayName=`Link`;function Ae({children:e,fallback:t,onError:n}){let r=C(F()),i=N(r.subscribe,r.getSnapshot,r.getSnapshot),s=c(n);return o(()=>{s.current=n}),a(()=>{i.error&&s.current?.(i.error,i.toRoute,i.fromRoute)},[i.version]),x(m,{children:[e,i.error?t(i.error,i.resetError):null]})}const $=()=>f(te(F()).getTree());function je(){let e=T(F());return N(e.subscribe,e.getSnapshot,e.getSnapshot)}function Me(e,t){let n=F(),r=c(e),i=t?.skipSameRoute??!0;o(()=>{r.current=e}),a(()=>n.subscribeLeave(({route:e,nextRoute:t,signal:n})=>{if(!(i&&e.name===t.name)&&!n.aborted)return r.current({route:e,nextRoute:t,signal:n})}),[n,i])}function Ne(e,t){let{route:n,previousRoute:r}=i(),s=c(e),l=c(null),u=t?.skipSameRoute??!0;o(()=>{s.current=e}),a(()=>{n.transition.from&&(u&&n.transition.from===n.name||l.current===n||!r||(l.current=n,s.current({route:n,previousRoute:r})))},[n,r,u])}const Pe=({router:e,children:i,announceNavigation:o,scrollRestoration:c,scrollSpy:l,viewTransitions:u})=>{a(()=>{if(!o)return;let t=V(e);return()=>{t.destroy()}},[o,e]);let f=c?.mode,p=c?.anchorScrolling,m=c?.behavior,h=c?.storageKey,g=c!==void 0;a(()=>{if(!g)return;let t=ce(e,{mode:f,anchorScrolling:p,behavior:m,storageKey:h,scrollContainer:c.scrollContainer});return()=>{t.destroy()}},[e,g,f,p,m,h]);let _=l?.selector,v=l?.rootMargin,y=l!==void 0&&_!==void 0&&_!==``;a(()=>{if(!y)return;let t=_e(e,{selector:_,rootMargin:v,scrollContainer:l.scrollContainer});return()=>{t.destroy()}},[e,y,_,v]),a(()=>{if(!u)return;let t=ye(e);return()=>{t.destroy()}},[e,u]);let x=d(e),S=s(()=>ee(e),[e]),{route:C,previousRoute:w}=N(S.subscribe,S.getSnapshot,S.getSnapshot),T=s(()=>({navigator:x,route:C,previousRoute:w}),[x,C,w]);return b(t.Provider,{value:e,children:b(n.Provider,{value:x,children:b(r.Provider,{value:T,children:i})})})};export{Q as Link,n as NavigatorContext,r as RouteContext,oe as RouteView,t as RouterContext,Ae as RouterErrorBoundary,Pe as RouterProvider,P as useNavigator,i as useRoute,Ne as useRouteEnter,Me as useRouteExit,I as useRouteNode,$ as useRouteUtils,F as useRouter,je as useRouterTransition};
1
+ import{a as e,i as t,n,r,t as i}from"./useRoute-DdZuiE4J.mjs";import{useEffect as a,useLayoutEffect as o,useMemo as s,useRef as c,useState as l}from"preact/hooks";import{UNKNOWN_ROUTE as u,getNavigator as d}from"@real-router/core";import{getRouteUtils as f,startsWithSegment as p}from"@real-router/route-utils";import{Fragment as m,isValidElement as h,toChildArray as g}from"preact";import{Suspense as _,memo as v}from"preact/compat";import{Fragment as y,jsx as b,jsxs as x}from"preact/jsx-runtime";import{createActiveRouteSource as S,createDismissableError as C,createRouteNodeSource as w,createRouteSource as ee,getTransitionSource as T}from"@real-router/sources";import{getPluginApi as te}from"@real-router/core/api";function E(e){return null}E.displayName=`RouteView.Match`;function D(e){return null}D.displayName=`RouteView.Self`;function O(e){return null}O.displayName=`RouteView.NotFound`;function ne(e,t,n){return t===``?!1:n?e===t:p(e,t)}function k(e,t){for(let n of g(e))h(n)&&(n.type===E||n.type===D||n.type===O?t.push(n):k(n.props.children,t))}function A(e,t,n){return b(m,{children:n===void 0?e:b(_,{fallback:n,children:e})},t)}function re(e){return e.type===O||e.type===D}function ie(e,t){if(e.type===O){t.notFoundChildren=e.props.children;return}t.selfFound||=(t.selfChildren=e.props.children,t.selfFallback=e.props.fallback,!0)}function j(e,t,n,r){let{segment:i,exact:a=!1,fallback:o,children:s}=e.props,c=n?`${n}.${i}`:i;return!r&&ne(t,c,a)?A(s,c,o):null}function M(e,t,n,r){if(r.selfFound&&t===n){e.push(A(r.selfChildren,`__route-view-self__`,r.selfFallback));return}t===u&&r.notFoundChildren!==null&&e.push(b(m,{children:r.notFoundChildren},`__route-view-not-found__`))}function ae(e,t,n){let r={selfChildren:null,selfFallback:void 0,selfFound:!1,notFoundChildren:null},i=!1,a=[];for(let o of e){if(re(o)){ie(o,r);continue}let e=j(o,t,n,i);e!==null&&(i=!0,a.push(e))}return i||M(a,t,n,r),{rendered:a,activeMatchFound:i}}function N(e,t,n){let[r,i]=l(t);return a(()=>{let n=()=>{i(e=>{let n=t();return Object.is(e,n)?e:n})};return n(),e(n)},[e,t]),r}const P=e(n,`useNavigator`),F=e(t,`useRouter`);function I(e){let t=F(),n=P(),r=w(t,e),{route:i,previousRoute:a}=N(r.subscribe,r.getSnapshot,r.getSnapshot);return s(()=>({navigator:n,route:i,previousRoute:a}),[n,i,a])}function L({nodeName:e,children:t}){let{route:n}=I(e),r=s(()=>{let e=[];return k(t,e),e},[t]),i=n?.name,a=s(()=>i===void 0?[]:ae(r,i,e).rendered,[r,i,e]);return a.length>0?b(y,{children:a}):null}L.displayName=`RouteView`;const oe=Object.assign(L,{Match:E,Self:D,NotFound:O}),se=Object.freeze({}),R=Object.freeze({}),z=`data-real-router-announcer`,B=Object.freeze({destroy:()=>{}});function V(e,t){if(typeof document>`u`)return B;let n=t?.prefix??`Navigated to `,r=t?.getAnnouncementText,i=!0,a=!1,o=!1,s=``,c=null,l,u=H(),d=(e,t)=>{s=e,clearTimeout(l),u.textContent=e,l=setTimeout(()=>{u.textContent=``,s=``},7e3),G(t)},f=setTimeout(()=>{if(a=!0,c!==null&&!o){let e=c;c=null,d(e,document.querySelector(`h1`))}},100),p=e.subscribe(({route:e})=>{if(i){i=!1;return}requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(o)return;let t=document.querySelector(`h1`),i=W(e,n,r,t);if(!(!i||i===s)){if(!a){c=i;return}d(i,t)}})})});return{destroy(){o=!0,p(),clearTimeout(l),clearTimeout(f),U()}}}function H(){let e=document.querySelector(`[${z}]`);if(e)return e;let t=document.createElement(`div`);return t.setAttribute(`style`,`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0`),t.setAttribute(`aria-live`,`assertive`),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(z,``),(document.body??document.documentElement).prepend(t),t}function U(){document.querySelector(`[${z}]`)?.remove()}function W(e,t,n,r){if(n)try{let t=n(e);if(t)return t}catch(e){console.error(`[real-router] getAnnouncementText threw; falling back to default resolution.`,e)}let i=(r?.textContent??``).trim(),a=e.name.startsWith(`@@`)?``:e.name;return`${t}${i||document.title||a||globalThis.location.pathname}`}function G(e){e&&(e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}const K=Object.freeze({destroy:()=>{}});function ce(e,t){if(globalThis.window===void 0)return K;let n=t?.mode??`restore`;if(n===`native`)return K;let r=t?.anchorScrolling??!0,i=t?.scrollContainer,a=t?.behavior??`auto`,o=t?.storageKey??`real-router:scroll`,s,c=()=>{if(s!==void 0)return s;try{let e=sessionStorage.getItem(o);s=e?JSON.parse(e):{}}catch{s={}}return s},l=(e,t)=>{try{let n=c();if(n[e]===t)return;n[e]=t,sessionStorage.setItem(o,JSON.stringify(n))}catch{}},u=history.scrollRestoration;try{history.scrollRestoration=`manual`}catch{}let d=()=>{let e=i?.();return e?e.scrollTop:globalThis.scrollY},f=e=>{let t=i?.();t?t.scrollTo({top:e,left:0,behavior:a}):globalThis.scrollTo({top:e,left:0,behavior:a})},p=e=>{if(!i){globalThis.scrollTo({top:e,left:0,behavior:a});return}let t=0,n=()=>{if(h)return;let r=i();if(r){if(r.scrollTo({top:e,left:0,behavior:a}),a!==`smooth`&&Math.abs(r.scrollTop-e)<=1)return}else globalThis.scrollTo({top:e,left:0,behavior:a});t>=10||(t+=1,requestAnimationFrame(n))};n()},m=e=>{let t=e.context?.url?.hash;if(t!==void 0){if(r&&t.length>0){let e=document.getElementById(t);if(e){e.scrollIntoView({behavior:a});return}}f(0);return}let n=globalThis.location.hash;if(r&&n.length>1){let e;try{e=decodeURIComponent(n.slice(1))}catch{e=n.slice(1)}let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:a});return}}f(0)},h=!1,g=!1,_=e=>{try{return le(e)}catch{return g||(g=!0,console.error(`[real-router] scroll-restore: route "${e.name}" has params that cannot be canonicalized (e.g. BigInt or cyclic structure). Scroll position will not be captured or restored for this route.`)),null}},v=e.subscribe(({route:e,previousRoute:t})=>{let r=e.context.navigation;if(t){let e=_(t);e!==null&&l(e,d())}requestAnimationFrame(()=>{if(!h){if(n===`top`){m(e);return}if(e.transition.reload||r?.navigationType===`reload`){let t=_(e);p(t===null?0:c()[t]??0);return}if(r?.direction===`back`||r?.navigationType===`traverse`){let t=_(e);p(t===null?0:c()[t]??0);return}e.transition.replace||r?.navigationType===`replace`||m(e)}})}),y=()=>{let t=e.getState();if(t){let e=_(t);e!==null&&l(e,d())}};return globalThis.addEventListener(`pagehide`,y),{destroy:()=>{if(!h){h=!0,v(),globalThis.removeEventListener(`pagehide`,y);try{history.scrollRestoration=u}catch{}}}}}const q=new WeakMap;function le(e){let t=q.get(e);if(t!==void 0)return t;let n=`${e.name}:${ue(e.params)}`;return q.set(e,n),n}function ue(e){return JSON.stringify(e,de)}function de(e,t){if(typeof t==`function`)return`<fn>`;if(typeof t==`symbol`)return`<sym>`;if(typeof t==`object`&&t&&!Array.isArray(t)){let e=Object.create(null),n=Object.keys(t).sort((e,t)=>e.localeCompare(t));for(let r of n)e[r]=t[r];return e}return t}const J=Object.freeze({destroy:()=>{}}),Y=e=>e.context?.url,fe=e=>{let t=null,n=1/0,r=null,i=-1/0;for(let a of e){if(!a.isIntersecting)continue;let e=a.rootBounds?.top??0,o=a.boundingClientRect.top-e;o>=0?o<n&&(t=a,n=o):o>i&&(r=a,i=o)}return t??r},pe=(e,t)=>{let n=null,r=e=>{let n=e.context;n&&n.url===void 0&&(console.warn(`[real-router] scroll-spy: state.context.url is not claimed. Spy requires browser-plugin or navigation-plugin. Disabling.`),t())},i=e.getState();if(i)r(i);else{let t=!1;n=e.subscribe(({route:e})=>{t||(t=!0,r(e),n?.(),n=null)})}return{destroy(){n?.(),n=null}}},me=e=>{let t=!1,n=null,r=null,i=null,a=()=>{n!==null&&(clearTimeout(n),n=null),i&&(r??globalThis).removeEventListener(`scrollend`,i),i=null,r=null,t=!1};return{get active(){return t},start(){a(),t=!0;let o=()=>{a()};i=o,r=e(),(r??globalThis).addEventListener(`scrollend`,o,{once:!0}),n=setTimeout(o,500)},destroy(){a()}}},he=(e,t)=>{let n=null,r=null;return{schedule(){n===null&&(n=requestAnimationFrame(()=>{n=null,r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null,e()},t)}))},destroy(){n!==null&&(cancelAnimationFrame(n),n=null),r!==null&&(clearTimeout(r),r=null)}}},ge=(e,t,n,r,i,a)=>{let o=new Set,s=new Map,c=!1,l=null,u=new IntersectionObserver(e=>{if(!a()){for(let t of e)s.set(t.target,t);r()}},{root:n(),rootMargin:t,threshold:0}),d=()=>{let t=n()??document,r;try{r=t.querySelectorAll(e)}catch{i();return}let a=new Set;for(let e of r){let t=e.id;t&&!c&&(a.has(t)&&(c=!0,console.warn(`[real-router] scroll-spy: duplicate id "${t}" observed. Selection picks the topmost visible match deterministically.`)),a.add(t)),!o.has(e)&&(u.observe(e),o.add(e))}},f=()=>{for(let e of o)e.isConnected||(u.unobserve(e),o.delete(e),s.delete(e));d()};d();let p=n()??document.body,m=new MutationObserver(()=>{l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,f()},250)});return m.observe(p,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`id`]}),{pending:s,destroy(){u.disconnect(),m.disconnect(),l!==null&&(clearTimeout(l),l=null),o.clear(),s.clear()}}};function _e(e,t){if(typeof document>`u`||typeof IntersectionObserver>`u`)return J;let{selector:n}=t;if(!n)return J;let r=t.rootMargin??`-20% 0px -60% 0px`,i=t.scrollContainer,a=()=>i?.()??null,o=!1,s=!1,c=!1,l=()=>s||o,u=null,d=T(e),f=pe(e,()=>{s=!0}),p=me(a),m=he(()=>{u?.()},150),h=ge(n,r,a,()=>{m.schedule()},()=>{s||(s=!0,console.warn(`[real-router] scroll-spy: invalid selector "${n}". Disabling.`))},l);u=()=>{if(o||s){h.pending.clear();return}if(d.getSnapshot().isTransitioning||p.active||h.pending.size===0)return;let t=fe(h.pending.values());if(h.pending.clear(),!t)return;let n=t.target.id;if(!n)return;let r=e.getState();if(!r||n===(Y(r)?.hash??``))return;let i={hash:n,replace:!0,force:!0,hashChange:!0};c=!0,e.navigate(r.name,r.params,i).catch(()=>{}).finally(()=>{c=!1})};let g=e.subscribe(({route:e})=>{c||Y(e)?.hashChanged&&p.start()});return{destroy(){o||(o=!0,g(),h.destroy(),m.destroy(),p.destroy(),f.destroy())}}}const ve=Object.freeze({destroy:()=>{}});function ye(e){if(typeof document>`u`||typeof document.startViewTransition!=`function`)return ve;let t=null,n=null,r=!1,i=()=>{t?.(),t=null},a=e.subscribeLeave(({signal:e})=>{if(!e.aborted)return r=!1,i(),new Promise(a=>{let o=new Promise(e=>{t=e});e.addEventListener(`abort`,()=>{r||(i(),n?.skipTransition?.(),a())},{once:!0});try{n=document.startViewTransition(()=>(a(),o))}catch{i(),a()}})}),o=e.subscribe(()=>{let e=t;r=!0,t=null,e===null?n=null:setTimeout(()=>{e(),n=null},0)});return{destroy:()=>{a(),o(),n?.skipTransition?.(),n=null,i()}}}function be(e){return e.button===0&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&!e.shiftKey}const xe=/%[\dA-Fa-f]{2}/;function Se(e){if(xe.test(e))try{return encodeURI(decodeURIComponent(e)).replaceAll(`#`,`%23`)}catch{}return encodeURI(e).replaceAll(`#`,`%23`)}function Ce(e,t,n,r){try{let i=r?.hash,a;i!==void 0&&(a=i.startsWith(`#`)?i.slice(1):i);let o=e.buildUrl;if(o){let e=o(t,n,a===void 0?void 0:{hash:a});if(typeof e==`string`&&e.length>0)return e}let s=e.buildPath(t,n);if(typeof s!=`string`||s.length===0){console.error(`[real-router] Route "${t}" yielded an empty path. The element will render without an href attribute.`);return}return a?`${s}#${Se(a)}`:s}catch{console.error(`[real-router] Route "${t}" is not defined. The element will render without an href attribute.`);return}}function we(e,t,n,r,i){let a={...i};r!==void 0&&(a.hash=r);let o=e.getState();if(o?.name===t&&Z(o.params,n)){let e=o.context?.url?.hash??``;e!==(r??e)&&(a.force=!0,a.hashChange=!0)}return e.navigate(t,n,a)}const Te=/\s/,Ee=/\S+/g;function X(e){return e?Te.test(e)?e.match(Ee)??[]:[e]:[]}function De(e,t,n){if(e&&t){let e=X(t);if(e.length===0)return n??void 0;if(!n)return e.join(` `);let r=X(n),i=new Set(r);for(let t of e)i.has(t)||(i.add(t),r.push(t));return r.join(` `)}return n??void 0}function Z(e,t){if(Object.is(e,t))return!0;if(!e||!t)return!1;let n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;let r=e,i=t;for(let e of n)if(!Object.prototype.hasOwnProperty.call(t,e)||!Object.is(r[e],i[e]))return!1;return!0}function Oe(e,t,n=!1,r=!0,i){let a=F(),o=s(()=>i===void 0?{strict:n,ignoreQueryParams:r}:{strict:n,ignoreQueryParams:r,hash:i},[n,r,i]),c=s(()=>S(a,e,t,o),[a,e,t,o]);return N(c.subscribe,c.getSnapshot,c.getSnapshot)}function ke(e,t){return e.routeName===t.routeName&&e.className===t.className&&e.activeClassName===t.activeClassName&&e.activeStrict===t.activeStrict&&e.ignoreQueryParams===t.ignoreQueryParams&&e.onClick===t.onClick&&e.target===t.target&&e.style===t.style&&e.children===t.children&&e.hash===t.hash&&Z(e.routeParams,t.routeParams)&&Z(e.routeOptions,t.routeOptions)}const Q=v(({routeName:e,routeParams:t=se,routeOptions:n=R,className:r,activeClassName:i=`active`,activeStrict:a=!1,ignoreQueryParams:o=!0,hash:s,onClick:c,target:l,children:u,...d})=>{let f=F(),p=Oe(e,t,a,o,s),m=Ce(f,e,t,s===void 0?void 0:{hash:s}),h=r=>{c&&(c(r),r.defaultPrevented)||!be(r)||l===`_blank`||(r.preventDefault(),we(f,e,t,s,n).catch(()=>{}))},g=De(p,i,r);return b(`a`,{...d,href:m,className:g,onClick:h,children:u})},ke);Q.displayName=`Link`;function Ae({children:e,fallback:t,onError:n}){let r=C(F()),i=N(r.subscribe,r.getSnapshot,r.getSnapshot),s=c(n);return o(()=>{s.current=n}),a(()=>{i.error&&s.current?.(i.error,i.toRoute,i.fromRoute)},[i.version]),x(m,{children:[e,i.error?t(i.error,i.resetError):null]})}const $=()=>f(te(F()).getTree());function je(){let e=T(F());return N(e.subscribe,e.getSnapshot,e.getSnapshot)}function Me(e,t){let n=F(),r=c(e),i=t?.skipSameRoute??!0;o(()=>{r.current=e}),a(()=>n.subscribeLeave(({route:e,nextRoute:t,signal:n})=>{if(!(i&&e.name===t.name)&&!n.aborted)return r.current({route:e,nextRoute:t,signal:n})}),[n,i])}function Ne(e,t){let{route:n,previousRoute:r}=i(),s=c(e),l=c(null),u=t?.skipSameRoute??!0;o(()=>{s.current=e}),a(()=>{n.transition.from&&(u&&n.transition.from===n.name||l.current===n||!r||(l.current=n,s.current({route:n,previousRoute:r})))},[n,r,u])}const Pe=({router:e,children:i,announceNavigation:o,scrollRestoration:c,scrollSpy:l,viewTransitions:u})=>{a(()=>{if(!o)return;let t=V(e);return()=>{t.destroy()}},[o,e]);let f=c?.mode,p=c?.anchorScrolling,m=c?.behavior,h=c?.storageKey,g=c!==void 0;a(()=>{if(!g)return;let t=ce(e,{mode:f,anchorScrolling:p,behavior:m,storageKey:h,scrollContainer:c.scrollContainer});return()=>{t.destroy()}},[e,g,f,p,m,h]);let _=l?.selector,v=l?.rootMargin,y=l!==void 0&&_!==void 0&&_!==``;a(()=>{if(!y)return;let t=_e(e,{selector:_,rootMargin:v,scrollContainer:l.scrollContainer});return()=>{t.destroy()}},[e,y,_,v]),a(()=>{if(!u)return;let t=ye(e);return()=>{t.destroy()}},[e,u]);let x=d(e),S=s(()=>ee(e),[e]),{route:C,previousRoute:w}=N(S.subscribe,S.getSnapshot,S.getSnapshot),T=s(()=>({navigator:x,route:C,previousRoute:w}),[x,C,w]);return b(t.Provider,{value:e,children:b(n.Provider,{value:x,children:b(r.Provider,{value:T,children:i})})})};export{Q as Link,n as NavigatorContext,r as RouteContext,oe as RouteView,t as RouterContext,Ae as RouterErrorBoundary,Pe as RouterProvider,P as useNavigator,i as useRoute,Ne as useRouteEnter,Me as useRouteExit,I as useRouteNode,$ as useRouteUtils,F as useRouter,je as useRouterTransition};
2
2
  //# sourceMappingURL=index.mjs.map
package/dist/esm/ssr.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{t as e}from"./useRoute-BSPVVbLz.mjs";import{useContext as t,useEffect as n,useState as r}from"preact/hooks";import{createContext as i}from"preact";import{Suspense as a}from"preact/compat";import{jsx as o}from"preact/jsx-runtime";function s({children:e,fallback:t=null}){let[i,a]=r(!1);return n(()=>{a(!0)},[]),i?e:t}function c({children:e,fallback:t=null}){let[i,a]=r(!1);return n(()=>{a(!0)},[]),i?t:e}const l=new Promise(()=>{});function u(t){let{route:n}=e();return n.context.ssrDataDeferred?.[t]??l}function d(e){let t=e;return t.status===void 0?(t.status=`pending`,e.then(e=>{t.status===`pending`&&(t.status=`fulfilled`,t.value=e)},e=>{t.status===`pending`&&(t.status=`rejected`,t.reason=e)}),t):t}function f({name:e,children:t}){let n=u(e),r=d(n);if(r.status===`fulfilled`)return t(r.value);throw r.status===`rejected`?r.reason:n}function p({fallback:e,children:t}){return o(a,{fallback:e,children:t})}const m=i(null);function h({sink:e,children:t}){return o(m.Provider,{value:e,children:t})}function g({code:e}){let n=t(m);return n&&(process.env.NODE_ENV!==`production`&&(!Number.isInteger(e)||e<100||e>999)&&console.error(`[real-router] <HttpStatusCode code={${String(e)}} /> received an invalid HTTP status code. Node's res.end() rejects values that are not an integer in [100, 999] — pass a real HTTP status (commonly 4xx/5xx).`),n.code=e),null}function _(){return{code:void 0}}export{f as Await,s as ClientOnly,g as HttpStatusCode,h as HttpStatusProvider,c as ServerOnly,p as Streamed,_ as createHttpStatusSink,u as useDeferred};
1
+ import{t as e}from"./useRoute-DdZuiE4J.mjs";import{useContext as t,useEffect as n,useState as r}from"preact/hooks";import{createContext as i}from"preact";import{Suspense as a}from"preact/compat";import{jsx as o}from"preact/jsx-runtime";function s({children:e,fallback:t=null}){let[i,a]=r(!1);return n(()=>{a(!0)},[]),i?e:t}function c({children:e,fallback:t=null}){let[i,a]=r(!1);return n(()=>{a(!0)},[]),i?t:e}const l=new Promise(()=>{});function u(t){let{route:n}=e();return n.context.ssrDataDeferred?.[t]??l}function d(e){let t=e;return t.status===void 0?(t.status=`pending`,e.then(e=>{t.status===`pending`&&(t.status=`fulfilled`,t.value=e)},e=>{t.status===`pending`&&(t.status=`rejected`,t.reason=e)}),t):t}function f({name:e,children:t}){let n=u(e),r=d(n);if(r.status===`fulfilled`)return t(r.value);throw r.status===`rejected`?r.reason:n}function p({fallback:e,children:t}){return o(a,{fallback:e,children:t})}const m=i(null);function h({sink:e,children:t}){return o(m.Provider,{value:e,children:t})}function g({code:e}){let n=t(m);return n&&(process.env.NODE_ENV!==`production`&&(!Number.isInteger(e)||e<100||e>999)&&console.error(`[real-router] <HttpStatusCode code={${String(e)}} /> received an invalid HTTP status code. Node's res.end() rejects values that are not an integer in [100, 999] — pass a real HTTP status (commonly 4xx/5xx).`),n.code=e),null}function _(){return{code:void 0}}export{f as Await,s as ClientOnly,g as HttpStatusCode,h as HttpStatusProvider,c as ServerOnly,p as Streamed,_ as createHttpStatusSink,u as useDeferred};
2
2
  //# sourceMappingURL=ssr.mjs.map
@@ -1,2 +1,2 @@
1
1
  import{useContext as e}from"preact/hooks";import{createContext as t}from"preact";const n=t(null),r=t(null),i=t(null);function a(t,n){return()=>{let r=e(t);if(!r)throw Error(`${n} must be used within a RouterProvider`);return r}}const o=a(n,`useRoute`),s=()=>{let e=o();if(!e.route)throw Error(`useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?`);return e};export{a,r as i,i as n,n as r,s as t};
2
- //# sourceMappingURL=useRoute-BSPVVbLz.mjs.map
2
+ //# sourceMappingURL=useRoute-DdZuiE4J.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useRoute-BSPVVbLz.mjs","names":[],"sources":["../../src/context.ts","../../src/hooks/useRoute.tsx"],"sourcesContent":["import { createContext } from \"preact\";\nimport { useContext } from \"preact/hooks\";\n\nimport type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\nimport type { Context } from \"preact\";\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport const NavigatorContext = createContext<Navigator | null>(null);\n\nexport function createUseContextOrThrow<T>(\n context: Context<T | null>,\n hookName: string,\n): () => T {\n return () => {\n const value = useContext(context);\n\n if (!value) {\n throw new Error(`${hookName} must be used within a RouterProvider`);\n }\n\n return value;\n };\n}\n","import { createUseContextOrThrow, RouteContext } from \"../context\";\n\nimport type { RouteContext as RouteContextType } from \"../types\";\nimport type { Params, State } from \"@real-router/core\";\n\nconst useRouteContextOrThrow = createUseContextOrThrow(\n RouteContext,\n \"useRoute\",\n);\n\nexport const useRoute = <P extends Params = Params>(): Omit<\n RouteContextType<P>,\n \"route\"\n> & { route: State<P> } => {\n const routeContext = useRouteContextOrThrow();\n\n if (!routeContext.route) {\n throw new Error(\n \"useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?\",\n );\n }\n\n return routeContext as Omit<RouteContextType<P>, \"route\"> & {\n route: State<P>;\n };\n};\n"],"mappings":"iFAOA,MAAa,EAAe,EAAuC,IAAI,EAE1D,EAAgB,EAA6B,IAAI,EAEjD,EAAmB,EAAgC,IAAI,EAEpE,SAAgB,EACd,EACA,EACS,CACT,UAAa,CACX,IAAM,EAAQ,EAAW,CAAO,EAEhC,GAAI,CAAC,EACH,MAAU,MAAM,GAAG,EAAS,sCAAsC,EAGpE,OAAO,CACT,CACF,CCrBA,MAAM,EAAyB,EAC7B,EACA,UACF,EAEa,MAGc,CACzB,IAAM,EAAe,EAAuB,EAE5C,GAAI,CAAC,EAAa,MAChB,MAAU,MACR,mIACF,EAGF,OAAO,CAGT"}
1
+ {"version":3,"file":"useRoute-DdZuiE4J.mjs","names":[],"sources":["../../src/context.ts","../../src/hooks/useRoute.tsx"],"sourcesContent":["import { createContext } from \"preact\";\nimport { useContext } from \"preact/hooks\";\n\nimport type { RouteContext as RouteContextType } from \"./types\";\nimport type { Router, Navigator } from \"@real-router/core\";\nimport type { Context } from \"preact\";\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n\nexport const RouterContext = createContext<Router | null>(null);\n\nexport const NavigatorContext = createContext<Navigator | null>(null);\n\nexport function createUseContextOrThrow<T>(\n context: Context<T | null>,\n hookName: string,\n): () => T {\n return () => {\n const value = useContext(context);\n\n if (!value) {\n throw new Error(`${hookName} must be used within a RouterProvider`);\n }\n\n return value;\n };\n}\n","import { createUseContextOrThrow, RouteContext } from \"../context\";\n\nimport type { RouteContext as RouteContextType } from \"../types\";\nimport type { Params, State } from \"@real-router/core\";\n\nconst useRouteContextOrThrow = createUseContextOrThrow(\n RouteContext,\n \"useRoute\",\n);\n\nexport const useRoute = <P extends Params = Params>(): Omit<\n RouteContextType<P>,\n \"route\"\n> & { route: State<P> } => {\n const routeContext = useRouteContextOrThrow();\n\n if (!routeContext.route) {\n throw new Error(\n \"useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?\",\n );\n }\n\n return routeContext as Omit<RouteContextType<P>, \"route\"> & {\n route: State<P>;\n };\n};\n"],"mappings":"iFAOA,MAAa,EAAe,EAAuC,IAAI,EAE1D,EAAgB,EAA6B,IAAI,EAEjD,EAAmB,EAAgC,IAAI,EAEpE,SAAgB,EACd,EACA,EACS,CACT,UAAa,CACX,IAAM,EAAQ,EAAW,CAAO,EAEhC,GAAI,CAAC,EACH,MAAU,MAAM,GAAG,EAAS,sCAAsC,EAGpE,OAAO,CACT,CACF,CCrBA,MAAM,EAAyB,EAC7B,EACA,UACF,EAEa,MAGc,CACzB,IAAM,EAAe,EAAuB,EAE5C,GAAI,CAAC,EAAa,MAChB,MAAU,MACR,mIACF,EAGF,OAAO,CAGT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@real-router/preact",
3
- "version": "0.15.0",
3
+ "version": "0.15.1",
4
4
  "type": "commonjs",
5
5
  "description": "Preact integration for Real-Router",
6
6
  "main": "./dist/cjs/index.js",
@@ -64,9 +64,9 @@
64
64
  "license": "MIT",
65
65
  "sideEffects": false,
66
66
  "dependencies": {
67
- "@real-router/core": "^0.54.6",
67
+ "@real-router/core": "^0.55.0",
68
68
  "@real-router/route-utils": "^0.2.2",
69
- "@real-router/sources": "^0.8.3"
69
+ "@real-router/sources": "^0.8.4"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@testing-library/dom": "10.4.1",
@@ -75,7 +75,7 @@
75
75
  "@testing-library/user-event": "14.6.1",
76
76
  "preact": "10.29.2",
77
77
  "preact-render-to-string": "6.7.0",
78
- "@real-router/browser-plugin": "^0.17.4"
78
+ "@real-router/browser-plugin": "^0.17.5"
79
79
  },
80
80
  "peerDependencies": {
81
81
  "preact": ">=10.28.0 || ^11.0.0-0"