routexiz 0.0.11 → 0.0.12

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/README.md CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
  <a href="https://codesandbox.io/p/sandbox/2lslks" target="_blank">LIVE EXAMPLE</a>
6
6
 
7
- > A lightweight, powerful, and modern router for React.
7
+ A lightweight, powerful, and modern router for React.
8
+
9
+ > Tree-based routing — similar to a TreeView, resolving a single branch per navigation.
8
10
 
9
11
  ---
10
12
 
@@ -68,6 +70,7 @@ route(path, component, config?)
68
70
  <b>builder API</b>
69
71
 
70
72
  ```ts
73
+ // dashboard
71
74
  route("/", Layout, root => {
72
75
  root.route("/dashboard", Dashboard, dash => {
73
76
  dash.guard(fn)
@@ -75,6 +78,16 @@ route("/", Layout, root => {
75
78
  dash.meta({ title: "Dashboard" })
76
79
  })
77
80
  })
81
+
82
+ route("/addmin", Admin, root => {
83
+ root.route("/dashboard", AdminDashboard, dash => {
84
+ dash.guard(fn)
85
+ dash.middleware(fn)
86
+ dash.meta({ title: "Dashboard" })
87
+ })
88
+ })
89
+
90
+ // admin/dashboard
78
91
  ```
79
92
 
80
93
  ---
@@ -504,6 +517,8 @@ route("/", Home, root => {
504
517
  root.route("*", () => <div>Page Not Found</div>)
505
518
  })
506
519
 
520
+ // route("*", () => <div>Page Not Found</div>) => same
521
+
507
522
  /* =========================
508
523
  NAVIGATION
509
524
  ========================= */
@@ -1 +1 @@
1
- import n,{createContext as t,useContext as e,Suspense as r,useState as o,useEffect as a,forwardRef as s,useRef as i}from"react";import{jsx as c,jsxs as h,Fragment as u}from"react/jsx-runtime";import l from"joinclass";let d=[];function p(){d=[]}function f(){return d}function m(n){const t={guard:e=>(n.guardFns||(n.guardFns=[]),n.guardFns.push(e),t),middleware:e=>(n.middlewares||(n.middlewares=[]),n.middlewares.push(e),t),meta:e=>(n.meta=e,t),route(t,e,r){const o={path:t,component:e,children:[],options:{},guardFns:[],middlewares:[],parent:n};"function"==typeof r?m(o)(r):r&&(o.options=r),n.children.push(o);const a={guard:n=>(o.guardFns?.push(n),a),middleware:n=>(o.middlewares?.push(n),a),meta:n=>(o.meta=n,a),route(n,t,e){const r={path:n,component:t,children:[],options:{},guardFns:[],middlewares:[],parent:o};return"function"==typeof e?m(r)(e):e&&(r.options=e),o.children.push(r),a}};return a}};return n=>{n(t)}}function y(n,t,e){const r={path:n,component:t,children:[],options:{}};"function"==typeof e?m(r)(e):e&&(r.options=e),d.push(r)}const g=t(null),w=t(null),v=t(null),P=t({loading:!1,path:"",pendingPath:""}),q=t({name:"",stage:"idle"});function b(){const n=e(g);return n?.read()}function E(){const n=e(w);if(!n)throw new Error("RouteContext not found");return n}function k(){return e(v)??{}}function N(){return E().query??{}}function S(){return e(P)}function x(){return e(q)}function R(){const n=E(),t=k(),e=N();let r;try{r=b()}catch{}return{data:r,params:t,query:e,path:n.path}}let A=!1,C=!1,F=c("div",{children:"Loading..."}),I=({error:n})=>h("div",{children:["Global Error: ",String(n)]});function K(n,t){A=n,t&&(F=t)}function M(n,t){C=n,t&&(I=({error:n})=>t(n))}function B(){return A}function D(){return C}function U(){return F}function L(){return I}function O(n){return n.startsWith("/")||(n="/"+n),"/"!==n&&n.endsWith("/")&&(n=n.slice(0,-1)),n}function W(n){return O(n).split("/").filter(Boolean)}function $(n){const[t,e]=n.split("#"),[r,o]=t.split("?"),a={};return o&&o.split("&").forEach(n=>{const[t,e]=n.split("=");t&&(a[decodeURIComponent(t)]=decodeURIComponent(e??""))}),{path:O(r),query:a,hash:e??""}}function j(n,t){const{path:e,query:r,hash:o}=$(t),a=W(e),s=n.map(n=>({node:n,segIndex:0,params:{},chain:[]}));for(;s.length;){const{node:n,segIndex:t,params:e,chain:i}=s.pop(),c=W(n.path);let h=0;const u={...e};for(;h<c.length;h++){const n=c[h],e=a[t+h];if(!e)break;if(n.startsWith(":"))u[n.slice(1)]=decodeURIComponent(e);else if(n!==e)break}if(h!==c.length)continue;const l=t+h,d=[...i,{node:n,params:u,query:r,hash:o}];if(l===a.length)return d;for(const t of n.children)s.push({node:t,segIndex:l,params:u,chain:d})}return null}function J(n){const t={};if(!n)return t;if("string"==typeof n){const e=new URLSearchParams(n);e.forEach((n,r)=>{const o=e.getAll(r);t[r]=o.length>1?o:o[0]})}else for(const e in n){const r=n[e];Array.isArray(r)?t[e]=r.map(n=>String(n)):null!=r&&(t[e]=String(r))}return t}function G(n,t,e,r){const{path:o,query:a,hash:s}=$(n);let i=O(o);if(t)for(const n in t)i=i.replace(`:${n}`,encodeURIComponent(t[n]));const c={...a,...e??{}};if(Object.keys(c).length){const n=new URLSearchParams;for(const t in c){const e=c[t];Array.isArray(e)?e.forEach(e=>n.append(t,String(e))):n.append(t,String(e))}const t=n.toString();t&&(i+=`?${t}`)}return r?i+=`#${r}`:s&&(i+=`#${s}`),i}class T extends n.Component{constructor(n){super(n),this.reset=()=>{this.setState(n=>({hasError:!1,error:null,resetKey:n.resetKey+1}))},this.state={hasError:!1,error:null,resetKey:0}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}render(){if(this.state.hasError){const n=this.props.errorBoundary??(D()?L():void 0),t=this.props.fallback??h("div",{children:["Error: ",String(this.state.error)]});return n?c(n,{error:this.state.error}):t}return c(n.Fragment,{children:this.props.children},this.state.resetKey)}}function z({resource:n,errorBoundary:t,children:e}){try{return n?.read(),c(u,{children:e})}catch(n){if(n instanceof Promise)throw n;const e=t??(D()?L():void 0);if(e)return c(e,{error:n});throw n}}function H({chain:n,data:t}){return c(u,{children:function e(o=0){const a=n[o];if(!a)return null;const s=a.node.component,i=t[a.node.path];if(!s)return e(o+1);let h=a.node.options?.fallback,u=a.node.parent;for(;!h&&u;)h=u.options?.fallback,u=u.parent;return!h&&B()&&(h=U()),c(T,{fallback:h,errorBoundary:a.node.options?.errorBoundary,children:c(r,{fallback:h,children:c(w.Provider,{value:{path:a.node.path,params:a.params,query:J(a.node.query??window.location.search),hash:a.node.hash??""},children:c(g.Provider,{value:i,children:c(v.Provider,{value:a.params,children:c(z,{resource:i,errorBoundary:a.node.options?.errorBoundary,children:c(s,{children:e(o+1)})})})})})})})}()})}async function Q(n){const t=j(f(),n);if(!t)return{};const e={};t.forEach(n=>{const t=n.node.options?.loader;t&&(e[n.node.path]=Y(JSON.stringify({path:n.node.path,params:n.params,query:n.query,hash:n.hash}),()=>t({params:n.params,path:n.node.path,query:n.query,hash:n.hash}),n.node.options?.ttl))});for(const n in e)e[n].read();return e}const V=new Map;function X(n=1/0){const t=Date.now();let e=0;for(const[r,o]of V.entries())if(o.expiry<=t&&(V.delete(r),e++,e>=n))break}function Y(n,t,e,r){const o=Date.now(),a=V.get(n);if(a&&!r&&(!e||a.expiry>o))return a.resource;const s=Z(t());return V.set(n,{resource:s,expiry:o+(e??0)}),s}function Z(n,t){let e=t?"success":"pending",r=t??null;const o=n.then(n=>{e="success",r=n},n=>{e="error",r=n});return{read(){if("pending"===e)throw o;if("error"===e)throw r;return r},update(n){r=n,e="success"},get:()=>r}}let _=null;function nn(){return _}function tn(n,t){const e=f(),[r,o]=n.split("?"),a={...J(o),...t?.query??{}},s=j(e,G(r,t?.params,a,t?.hash));s&&en(s,{forceReload:!1})}function en(n,t){const e={};return n.forEach(n=>{const r=n.node.options?.loader;if(!r)return;const o=JSON.stringify({path:n.node.path,params:n.params,query:n.query,hash:n.hash}),a=n.node.options?.ttl,s=Y(o,()=>r({params:n.params,path:n.node.path,query:n.query,hash:n.hash}),a,t?.forceReload);e[n.node.path]=s}),e}function rn(){const[n,t]=o({chain:[],data:{},loading:!1,path:"",pendingPath:"",transition:{name:"",stage:"idle"}});async function e(n,e){const r=f();let o=j(r,n)??j(r,"*")??[];for(const t of o)for(const e of t.node.guardFns||[]){if(!await e({params:t.params,path:t.node.path,query:t.query,hash:t.hash}))return console.warn("Navigation blocked by guard",n)}for(const n of o)for(const t of n.node.middlewares||[])await t({params:n.params,path:n.node.path,query:n.query,hash:n.hash}).catch(console.error);t(t=>({...t,loading:!0,pendingPath:n,transition:{name:e?.transition||"fade",stage:"exiting"}}));const a=en(o,e);t(t=>({...t,chain:o,data:{...t.data,...a},loading:!1,path:n,pendingPath:"",transition:{name:e?.transition||"fade",stage:"entering"}})),window.scrollTo(0,0)}return a(()=>{_=e,e(window.location.pathname),window.addEventListener("popstate",()=>e(window.location.pathname))},[]),c(P.Provider,{value:{loading:n.loading,path:n.path,pendingPath:n.pendingPath},children:c(q.Provider,{value:n.transition,children:c(H,{chain:n.chain,data:n.data})})})}let on=[],an=[];function sn(n){on.push(n)}function cn(n){an.push(n)}async function hn(n,t,e=!1){const r={...t,forceReload:t?.forceReload??!0},o=G(n,r.params,r.query,r.hash),a=await async function(n){return Promise.all(on.map(t=>t(n))).then(n=>n.every(n=>!1!==n))}(o);if(!a)return console.warn("Navigation blocked by beforeNavigation hook",o);e?window.history.replaceState({},"",o):window.history.pushState({},"",o),nn()?.(o,r),async function(n){for(const t of an)await t(n)}(o)}function un(n,t){return hn(n,t,!1)}function ln(n,t){return un(n,t)}function dn(n){return S().path===n}function pn(n,t){return()=>tn(n,t)}function fn(){const n=(n,t)=>hn(G(n,t?.params,t?.query,t?.hash),t);return n.replace=(n,t)=>hn(G(n,t?.params,t?.query,t?.hash),t,!0),n}function mn({to:n,transition:t,replace:e,params:r,query:o,hash:s,partialMatch:c,disablePrefetch:h}){const u=fn(),l=S(),d=i(null),p=G(n,r,o,s),f=c?l.path?.startsWith(p):l.path===p;return a(()=>{if(h)return;const n=d.current;if(!n)return;const t=new IntersectionObserver(n=>{n.some(n=>n.isIntersecting)&&(tn(p),t.disconnect())},{rootMargin:"200px"});return t.observe(n),()=>t.disconnect()},[p,h]),{ref:d,fullPath:p,isActive:f,go:()=>{e?u.replace(n,{transition:t,params:r,query:o,hash:s}):u(n,{transition:t,params:r,query:o,hash:s})}}}un.replace=(n,t)=>hn(n,t,!0);const yn=s(({fullPath:n,onNavigate:t,onPrefetch:e,onClick:r,onMouseEnter:o,onKeyDown:a,disablePrefetch:s,...i},h)=>c("a",{ref:h,href:n,...i,onClick:n=>{r&&r(n),n.metaKey||n.ctrlKey||n.shiftKey||(n.preventDefault(),t())},onMouseEnter:n=>{o&&o(n),s||e?.()},onKeyDown:n=>{"Enter"===n.key&&(n.preventDefault(),t()),a&&a(n)}}));function gn(n){const{to:t,transition:e,replace:r,activeClassName:o="active",onNavigate:a,partialMatch:s,params:i,query:h,hash:u,className:d,disablePrefetch:p,...f}=n,{ref:m,fullPath:y,isActive:g,go:w}=mn({to:t,transition:e,replace:r,params:i,query:h,hash:u,partialMatch:s,disablePrefetch:p});return c(yn,{ref:m,fullPath:y,onNavigate:()=>{w(),a?.(y)},onPrefetch:()=>tn(y),className:l(d,g&&o),disablePrefetch:p,...f})}function wn(n){const{to:t,transition:e,replace:r,params:o,query:a,hash:s,partialMatch:i,className:h,style:u,disablePrefetch:l,...d}=n,{ref:p,fullPath:f,isActive:m,go:y}=mn({to:t,transition:e,replace:r,params:o,query:a,hash:s,partialMatch:i,disablePrefetch:l}),g="function"==typeof h?h({isActive:m}):h,w="function"==typeof u?u({isActive:m}):u;return c(yn,{ref:p,fullPath:f,onNavigate:y,onPrefetch:()=>tn(f),className:g,style:w,disablePrefetch:l,...d})}yn.displayName="LinkCore";export{gn as Link,g as LoaderDataContext,wn as NavLink,v as ParamsContext,w as RouteContext,rn as RouterProvider,P as RouterStateContext,q as TransitionContext,cn as addAfterNavigationHook,sn as addBeforeNavigationHook,G as buildPath,X as cleanupCache,p as clearRoutes,Z as createResource,L as getGlobalError,U as getGlobalFallback,nn as getGlobalResolve,Y as getResource,f as getRoutes,D as getUseGlobalError,B as getUseGlobalFallback,Q as loadRouteData,j as matchRouteChain,un as navigate,J as normalizeQuery,$ as parseQueryHash,tn as prefetch,ln as redirect,y as route,M as setGlobalError,K as setGlobalFallback,mn as useLinkCore,b as useLoaderData,fn as useNavigate,S as useNavigation,k as useParams,pn as usePrefetch,N as useQuery,E as useRouteContext,dn as useRouteMatch,R as useRouterData,x as useTransition};
1
+ import n,{createContext as t,useContext as e,Suspense as r,useState as o,useEffect as a,forwardRef as s,useRef as i}from"react";import{jsx as c,jsxs as h,Fragment as u}from"react/jsx-runtime";import l from"joinclass";let d=[];function p(){d=[]}function f(){return d}function m(n){const t={guard:e=>(n.guardFns||(n.guardFns=[]),n.guardFns.push(e),t),middleware:e=>(n.middlewares||(n.middlewares=[]),n.middlewares.push(e),t),meta:e=>(n.meta=e,t),route(t,e,r){const o={path:t,component:e,children:[],options:{},guardFns:[],middlewares:[],parent:n};"function"==typeof r?m(o)(r):r&&(o.options=r),n.children.push(o);const a={guard:n=>(o.guardFns?.push(n),a),middleware:n=>(o.middlewares?.push(n),a),meta:n=>(o.meta=n,a),route(n,t,e){const r={path:n,component:t,children:[],options:{},guardFns:[],middlewares:[],parent:o};return"function"==typeof e?m(r)(e):e&&(r.options=e),o.children.push(r),a}};return a}};return n=>{n(t)}}function y(n,t,e){const r={path:n,component:t,children:[],options:{}};"function"==typeof e?m(r)(e):e&&(r.options=e),d.push(r)}const g=t(null),w=t(null),v=t(null),P=t({loading:!1,path:"",pendingPath:""}),q=t({name:"",stage:"idle"});function b(){const n=e(g);return n?.read()}function E(){const n=e(w);if(!n)throw new Error("RouteContext not found");return n}function k(){return e(v)??{}}function N(){return E().query??{}}function S(){return e(P)}function x(){return e(q)}function R(){const n=E(),t=k(),e=N();let r;try{r=b()}catch{}return{data:r,params:t,query:e,path:n.path}}let A=!1,C=!1,F=c("div",{children:"Loading..."}),I=({error:n})=>h("div",{children:["Global Error: ",String(n)]});function K(n,t){A=n,t&&(F=t)}function M(n,t){C=n,t&&(I=({error:n})=>t(n))}function B(){return A}function D(){return C}function U(){return F}function L(){return I}function O(n){return n.startsWith("/")||(n="/"+n),"/"!==n&&n.endsWith("/")&&(n=n.slice(0,-1)),n}function W(n){return O(n).split("/").filter(Boolean)}function $(n){const[t,e]=n.split("#"),[r,o]=t.split("?"),a={};return o&&o.split("&").forEach(n=>{const[t,e]=n.split("=");t&&(a[decodeURIComponent(t)]=decodeURIComponent(e??""))}),{path:O(r),query:a,hash:e??""}}function j(n,t){const{path:e,query:r,hash:o}=$(t),a=W(e),s=n.map(n=>({node:n,segIndex:0,params:{},chain:[]}));for(;s.length;){const{node:n,segIndex:t,params:e,chain:i}=s.pop(),c=W(n.path);let h=0;const u={...e};for(;h<c.length;h++){const n=c[h],e=a[t+h];if(!e)break;if(n.startsWith(":"))u[n.slice(1)]=decodeURIComponent(e);else if(n!==e)break}if(h!==c.length)continue;const l=t+h,d=[...i,{node:n,params:u,query:r,hash:o}];if(l===a.length)return d;for(const t of n.children)s.push({node:t,segIndex:l,params:u,chain:d})}return null}function J(n){const t={};if(!n)return t;if("string"==typeof n){const e=new URLSearchParams(n);e.forEach((n,r)=>{const o=e.getAll(r);t[r]=o.length>1?o:o[0]})}else for(const e in n){const r=n[e];Array.isArray(r)?t[e]=r.map(n=>String(n)):null!=r&&(t[e]=String(r))}return t}function G(n,t,e,r){const{path:o,query:a,hash:s}=$(n);let i=O(o);if(t)for(const n in t)i=i.replace(`:${n}`,encodeURIComponent(t[n]));const c={...a,...e??{}};if(Object.keys(c).length){const n=new URLSearchParams;for(const t in c){const e=c[t];Array.isArray(e)?e.forEach(e=>n.append(t,String(e))):n.append(t,String(e))}const t=n.toString();t&&(i+=`?${t}`)}return r?i+=`#${r}`:s&&(i+=`#${s}`),i}class T extends n.Component{constructor(n){super(n),this.reset=()=>{this.setState(n=>({hasError:!1,error:null,resetKey:n.resetKey+1}))},this.state={hasError:!1,error:null,resetKey:0}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}render(){if(this.state.hasError){const n=this.props.errorBoundary??(D()?L():void 0),t=this.props.fallback??h("div",{children:["Error: ",String(this.state.error)]});return n?c(n,{error:this.state.error}):t}return c(n.Fragment,{children:this.props.children},this.state.resetKey)}}function z({resource:n,errorBoundary:t,children:e}){try{return n?.read(),c(u,{children:e})}catch(n){if(n instanceof Promise)throw n;const e=t??(D()?L():void 0);if(e)return c(e,{error:n});throw n}}function H({chain:n,data:t}){return c(u,{children:function e(o=0){const a=n[o];if(!a)return null;const s=a.node.component,i=t[a.node.path];if(!s)return e(o+1);let h=a.node.options?.fallback,u=a.node.parent;for(;!h&&u;)h=u.options?.fallback,u=u.parent;return!h&&B()&&(h=U()),c(T,{fallback:h,errorBoundary:a.node.options?.errorBoundary,children:c(r,{fallback:h,children:c(w.Provider,{value:{path:a.node.path,params:a.params,query:J(a.node.query??window.location.search),hash:a.node.hash??""},children:c(g.Provider,{value:i,children:c(v.Provider,{value:a.params,children:c(z,{resource:i,errorBoundary:a.node.options?.errorBoundary,children:c(s,{children:e(o+1)})})})})})})})}()})}async function Q(n){const t=j(f(),n);if(!t)return{};const e={};t.forEach(n=>{const t=n.node.options?.loader;t&&(e[n.node.path]=Y(JSON.stringify({path:n.node.path,params:n.params,query:n.query,hash:n.hash}),()=>t({params:n.params,path:n.node.path,query:n.query,hash:n.hash}),n.node.options?.ttl))});for(const n in e)e[n].read();return e}const V=new Map;function X(n=1/0){const t=Date.now();let e=0;for(const[r,o]of V.entries())if(o.expiry<=t&&(V.delete(r),e++,e>=n))break}function Y(n,t,e,r){const o=Date.now(),a=V.get(n);if(a&&!r&&(!e||a.expiry>o))return a.resource;const s=Z(t());return V.set(n,{resource:s,expiry:o+(e??0)}),s}function Z(n,t){let e=t?"success":"pending",r=t??null;const o=n.then(n=>{e="success",r=n},n=>{e="error",r=n});return{read(){if("pending"===e)throw o;if("error"===e)throw r;return r},update(n){r=n,e="success"},get:()=>r}}let _=null;function nn(){return _}function tn(n,t){const e=f(),[r,o]=n.split("?"),a={...J(o),...t?.query??{}},s=j(e,G(r,t?.params,a,t?.hash));s&&en(s,{forceReload:!1})}function en(n,t){const e={};return n.forEach(n=>{const r=n.node.options?.loader;if(!r)return;const o=JSON.stringify({path:n.node.path,params:n.params,query:n.query,hash:n.hash}),a=n.node.options?.ttl,s=Y(o,()=>r({params:n.params,path:n.node.path,query:n.query,hash:n.hash}),a,t?.forceReload);e[n.node.path]=s}),e}function rn(){const[n,t]=o({chain:[],data:{},loading:!1,path:"",pendingPath:"",transition:{name:"",stage:"idle"}});async function e(n,e){const r=f();let o=j(r,n)??j(r,"*")??[];for(const t of o)for(const e of t.node.guardFns||[]){if(!await e({params:t.params,path:t.node.path,query:t.query,hash:t.hash}))return console.warn("Navigation blocked by guard",n)}for(const n of o)for(const t of n.node.middlewares||[])await t({params:n.params,path:n.node.path,query:n.query,hash:n.hash}).catch(console.error);t(t=>({...t,loading:!0,pendingPath:n,transition:{name:e?.transition||"fade",stage:"exiting"}}));const a=en(o,e);t(t=>({...t,chain:o,data:{...t.data,...a},loading:!1,path:n,pendingPath:"",transition:{name:e?.transition||"fade",stage:"entering"}})),window.scrollTo(0,0)}return a(()=>{_=e,e(window.location.pathname),window.addEventListener("popstate",()=>e(window.location.pathname))},[]),c(P.Provider,{value:{loading:n.loading,path:n.path,pendingPath:n.pendingPath},children:c(q.Provider,{value:n.transition,children:c(H,{chain:n.chain,data:n.data})})})}let on=[],an=[];function sn(n){on.push(n)}function cn(n){an.push(n)}async function hn(n,t,e=!1){const r={...t,forceReload:t?.forceReload??!0},o=G(n,r.params,r.query,r.hash),a=await async function(n){return Promise.all(on.map(t=>t(n))).then(n=>n.every(n=>!1!==n))}(o);if(!a)return console.warn("Navigation blocked by beforeNavigation hook",o);e?window.history.replaceState({},"",o):window.history.pushState({},"",o),nn()?.(o,r),async function(n){for(const t of an)await t(n)}(o)}function un(n,t){return hn(n,t,!1)}function ln(n,t){return un(n,t)}function dn(n){return S().path===n}function pn(n,t){return()=>tn(n,t)}function fn(){const n=(n,t)=>hn(G(n,t?.params,t?.query,t?.hash),t);return n.replace=(n,t)=>hn(G(n,t?.params,t?.query,t?.hash),t,!0),n}function mn({to:n,transition:t,replace:e,params:r,query:o,hash:s,partialMatch:c,disablePrefetch:h}){const u=fn(),l=S(),d=i(null),p=G(n,r,o,s),f=c?l.path?.startsWith(p):l.path===p;return a(()=>{if(h)return;const n=d.current;if(!n)return;const t=new IntersectionObserver(n=>{n.some(n=>n.isIntersecting)&&(tn(p),t.disconnect())},{rootMargin:"200px"});return t.observe(n),()=>t.disconnect()},[p,h]),{ref:d,fullPath:p,isActive:f,go:()=>{e?u.replace(n,{transition:t,params:r,query:o,hash:s}):u(n,{transition:t,params:r,query:o,hash:s})}}}un.replace=(n,t)=>hn(n,t,!0);const yn=s(({fullPath:n,onNavigate:t,onPrefetch:e,onClick:r,onMouseEnter:o,onKeyDown:a,disablePrefetch:s,...i},h)=>c("a",{ref:h,href:n,...i,onClick:n=>{r&&r(n),n.metaKey||n.ctrlKey||n.shiftKey||(n.preventDefault(),t())},onMouseEnter:n=>{o&&o(n),s||e?.()},onKeyDown:n=>{"Enter"===n.key&&(n.preventDefault(),t()),a&&a(n)}}));function gn(n){const{to:t,transition:e,replace:r,activeClassName:o="active",onNavigate:a,partialMatch:s,params:i,query:h,hash:u,className:d,disablePrefetch:p,...f}=n,{ref:m,fullPath:y,isActive:g,go:w}=mn({to:t,transition:e,replace:r,params:i,query:h,hash:u,partialMatch:s,disablePrefetch:p});return c(yn,{ref:m,fullPath:y,onNavigate:()=>{w(),a?.(y)},onPrefetch:()=>tn(y),className:l(d,g&&o),disablePrefetch:p,...f})}function wn(n){const{to:t,transition:e,replace:r,params:o,query:a,hash:s,partialMatch:i,className:h,style:u,disablePrefetch:d,...p}=n,{ref:f,fullPath:m,isActive:y,go:g}=mn({to:t,transition:e,replace:r,params:o,query:a,hash:s,partialMatch:i,disablePrefetch:d}),w="function"==typeof h?h({isActive:y}):h,v="function"==typeof u?u({isActive:y}):u;return c(yn,{ref:f,fullPath:m,onNavigate:g,onPrefetch:()=>tn(m),className:l(w),style:v,disablePrefetch:d,...p})}yn.displayName="LinkCore";export{gn as Link,g as LoaderDataContext,wn as NavLink,v as ParamsContext,w as RouteContext,rn as RouterProvider,P as RouterStateContext,q as TransitionContext,cn as addAfterNavigationHook,sn as addBeforeNavigationHook,G as buildPath,X as cleanupCache,p as clearRoutes,Z as createResource,L as getGlobalError,U as getGlobalFallback,nn as getGlobalResolve,Y as getResource,f as getRoutes,D as getUseGlobalError,B as getUseGlobalFallback,Q as loadRouteData,j as matchRouteChain,un as navigate,J as normalizeQuery,$ as parseQueryHash,tn as prefetch,ln as redirect,y as route,M as setGlobalError,K as setGlobalFallback,mn as useLinkCore,b as useLoaderData,fn as useNavigate,S as useNavigation,k as useParams,pn as usePrefetch,N as useQuery,E as useRouteContext,dn as useRouteMatch,R as useRouterData,x as useTransition};
package/build/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("react"),t=require("react/jsx-runtime"),r=require("joinclass");let n=[];function o(){return n}function a(e){const t={guard:r=>(e.guardFns||(e.guardFns=[]),e.guardFns.push(r),t),middleware:r=>(e.middlewares||(e.middlewares=[]),e.middlewares.push(r),t),meta:r=>(e.meta=r,t),route(t,r,n){const o={path:t,component:r,children:[],options:{},guardFns:[],middlewares:[],parent:e};"function"==typeof n?a(o)(n):n&&(o.options=n),e.children.push(o);const s={guard:e=>(o.guardFns?.push(e),s),middleware:e=>(o.middlewares?.push(e),s),meta:e=>(o.meta=e,s),route(e,t,r){const n={path:e,component:t,children:[],options:{},guardFns:[],middlewares:[],parent:o};return"function"==typeof r?a(n)(r):r&&(n.options=r),o.children.push(n),s}};return s}};return e=>{e(t)}}const s=e.createContext(null),i=e.createContext(null),c=e.createContext(null),u=e.createContext({loading:!1,path:"",pendingPath:""}),h=e.createContext({name:"",stage:"idle"});function p(){const t=e.useContext(s);return t?.read()}function l(){const t=e.useContext(i);if(!t)throw new Error("RouteContext not found");return t}function d(){return e.useContext(c)??{}}function f(){return l().query??{}}function x(){return e.useContext(u)}let m=!1,g=!1,y=t.jsx("div",{children:"Loading..."}),v=({error:e})=>t.jsxs("div",{children:["Global Error: ",String(e)]});function w(){return m}function P(){return g}function b(){return y}function q(){return v}function C(e){return e.startsWith("/")||(e="/"+e),"/"!==e&&e.endsWith("/")&&(e=e.slice(0,-1)),e}function R(e){return C(e).split("/").filter(Boolean)}function j(e){const[t,r]=e.split("#"),[n,o]=t.split("?"),a={};return o&&o.split("&").forEach(e=>{const[t,r]=e.split("=");t&&(a[decodeURIComponent(t)]=decodeURIComponent(r??""))}),{path:C(n),query:a,hash:r??""}}function k(e,t){const{path:r,query:n,hash:o}=j(t),a=R(r),s=e.map(e=>({node:e,segIndex:0,params:{},chain:[]}));for(;s.length;){const{node:e,segIndex:t,params:r,chain:i}=s.pop(),c=R(e.path);let u=0;const h={...r};for(;u<c.length;u++){const e=c[u],r=a[t+u];if(!r)break;if(e.startsWith(":"))h[e.slice(1)]=decodeURIComponent(r);else if(e!==r)break}if(u!==c.length)continue;const p=t+u,l=[...i,{node:e,params:h,query:n,hash:o}];if(p===a.length)return l;for(const t of e.children)s.push({node:t,segIndex:p,params:h,chain:l})}return null}function E(e){const t={};if(!e)return t;if("string"==typeof e){const r=new URLSearchParams(e);r.forEach((e,n)=>{const o=r.getAll(n);t[n]=o.length>1?o:o[0]})}else for(const r in e){const n=e[r];Array.isArray(n)?t[r]=n.map(e=>String(e)):null!=n&&(t[r]=String(n))}return t}function N(e,t,r,n){const{path:o,query:a,hash:s}=j(e);let i=C(o);if(t)for(const e in t)i=i.replace(`:${e}`,encodeURIComponent(t[e]));const c={...a,...r??{}};if(Object.keys(c).length){const e=new URLSearchParams;for(const t in c){const r=c[t];Array.isArray(r)?r.forEach(r=>e.append(t,String(r))):e.append(t,String(r))}const t=e.toString();t&&(i+=`?${t}`)}return n?i+=`#${n}`:s&&(i+=`#${s}`),i}class S extends e.Component{constructor(e){super(e),this.reset=()=>{this.setState(e=>({hasError:!1,error:null,resetKey:e.resetKey+1}))},this.state={hasError:!1,error:null,resetKey:0}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}render(){if(this.state.hasError){const e=this.props.errorBoundary??(P()?q():void 0),r=this.props.fallback??t.jsxs("div",{children:["Error: ",String(this.state.error)]});return e?t.jsx(e,{error:this.state.error}):r}return t.jsx(e.Fragment,{children:this.props.children},this.state.resetKey)}}function F({resource:e,errorBoundary:r,children:n}){try{return e?.read(),t.jsx(t.Fragment,{children:n})}catch(e){if(e instanceof Promise)throw e;const n=r??(P()?q():void 0);if(n)return t.jsx(n,{error:e});throw e}}function A({chain:r,data:n}){return t.jsx(t.Fragment,{children:function o(a=0){const u=r[a];if(!u)return null;const h=u.node.component,p=n[u.node.path];if(!h)return o(a+1);let l=u.node.options?.fallback,d=u.node.parent;for(;!l&&d;)l=d.options?.fallback,d=d.parent;return!l&&w()&&(l=b()),t.jsx(S,{fallback:l,errorBoundary:u.node.options?.errorBoundary,children:t.jsx(e.Suspense,{fallback:l,children:t.jsx(i.Provider,{value:{path:u.node.path,params:u.params,query:E(u.node.query??window.location.search),hash:u.node.hash??""},children:t.jsx(s.Provider,{value:p,children:t.jsx(c.Provider,{value:u.params,children:t.jsx(F,{resource:p,errorBoundary:u.node.options?.errorBoundary,children:t.jsx(h,{children:o(a+1)})})})})})})})}()})}const D=new Map;function L(e,t,r,n){const o=Date.now(),a=D.get(e);if(a&&!n&&(!r||a.expiry>o))return a.resource;const s=M(t());return D.set(e,{resource:s,expiry:o+(r??0)}),s}function M(e,t){let r=t?"success":"pending",n=t??null;const o=e.then(e=>{r="success",n=e},e=>{r="error",n=e});return{read(){if("pending"===r)throw o;if("error"===r)throw n;return n},update(e){n=e,r="success"},get:()=>n}}let I=null;function K(){return I}function B(e,t){const r=o(),[n,a]=e.split("?"),s={...E(a),...t?.query??{}},i=k(r,N(n,t?.params,s,t?.hash));i&&G(i,{forceReload:!1})}function G(e,t){const r={};return e.forEach(e=>{const n=e.node.options?.loader;if(!n)return;const o=JSON.stringify({path:e.node.path,params:e.params,query:e.query,hash:e.hash}),a=e.node.options?.ttl,s=L(o,()=>n({params:e.params,path:e.node.path,query:e.query,hash:e.hash}),a,t?.forceReload);r[e.node.path]=s}),r}let U=[],O=[];async function W(e,t,r=!1){const n={...t,forceReload:t?.forceReload??!0},o=N(e,n.params,n.query,n.hash),a=await async function(e){return Promise.all(U.map(t=>t(e))).then(e=>e.every(e=>!1!==e))}(o);if(!a)return console.warn("Navigation blocked by beforeNavigation hook",o);r?window.history.replaceState({},"",o):window.history.pushState({},"",o),K()?.(o,n),async function(e){for(const t of O)await t(e)}(o)}function $(e,t){return W(e,t,!1)}function H(){const e=(e,t)=>W(N(e,t?.params,t?.query,t?.hash),t);return e.replace=(e,t)=>W(N(e,t?.params,t?.query,t?.hash),t,!0),e}function Q({to:t,transition:r,replace:n,params:o,query:a,hash:s,partialMatch:i,disablePrefetch:c}){const u=H(),h=x(),p=e.useRef(null),l=N(t,o,a,s),d=i?h.path?.startsWith(l):h.path===l;return e.useEffect(()=>{if(c)return;const e=p.current;if(!e)return;const t=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(B(l),t.disconnect())},{rootMargin:"200px"});return t.observe(e),()=>t.disconnect()},[l,c]),{ref:p,fullPath:l,isActive:d,go:()=>{n?u.replace(t,{transition:r,params:o,query:a,hash:s}):u(t,{transition:r,params:o,query:a,hash:s})}}}$.replace=(e,t)=>W(e,t,!0);const T=e.forwardRef(({fullPath:e,onNavigate:r,onPrefetch:n,onClick:o,onMouseEnter:a,onKeyDown:s,disablePrefetch:i,...c},u)=>t.jsx("a",{ref:u,href:e,...c,onClick:e=>{o&&o(e),e.metaKey||e.ctrlKey||e.shiftKey||(e.preventDefault(),r())},onMouseEnter:e=>{a&&a(e),i||n?.()},onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),r()),s&&s(e)}}));T.displayName="LinkCore",exports.Link=function(e){const{to:n,transition:o,replace:a,activeClassName:s="active",onNavigate:i,partialMatch:c,params:u,query:h,hash:p,className:l,disablePrefetch:d,...f}=e,{ref:x,fullPath:m,isActive:g,go:y}=Q({to:n,transition:o,replace:a,params:u,query:h,hash:p,partialMatch:c,disablePrefetch:d});return t.jsx(T,{ref:x,fullPath:m,onNavigate:()=>{y(),i?.(m)},onPrefetch:()=>B(m),className:r(l,g&&s),disablePrefetch:d,...f})},exports.LoaderDataContext=s,exports.NavLink=function(e){const{to:r,transition:n,replace:o,params:a,query:s,hash:i,partialMatch:c,className:u,style:h,disablePrefetch:p,...l}=e,{ref:d,fullPath:f,isActive:x,go:m}=Q({to:r,transition:n,replace:o,params:a,query:s,hash:i,partialMatch:c,disablePrefetch:p}),g="function"==typeof u?u({isActive:x}):u,y="function"==typeof h?h({isActive:x}):h;return t.jsx(T,{ref:d,fullPath:f,onNavigate:m,onPrefetch:()=>B(f),className:g,style:y,disablePrefetch:p,...l})},exports.ParamsContext=c,exports.RouteContext=i,exports.RouterProvider=function(){const[r,n]=e.useState({chain:[],data:{},loading:!1,path:"",pendingPath:"",transition:{name:"",stage:"idle"}});async function a(e,t){const r=o();let a=k(r,e)??k(r,"*")??[];for(const t of a)for(const r of t.node.guardFns||[]){if(!await r({params:t.params,path:t.node.path,query:t.query,hash:t.hash}))return console.warn("Navigation blocked by guard",e)}for(const e of a)for(const t of e.node.middlewares||[])await t({params:e.params,path:e.node.path,query:e.query,hash:e.hash}).catch(console.error);n(r=>({...r,loading:!0,pendingPath:e,transition:{name:t?.transition||"fade",stage:"exiting"}}));const s=G(a,t);n(r=>({...r,chain:a,data:{...r.data,...s},loading:!1,path:e,pendingPath:"",transition:{name:t?.transition||"fade",stage:"entering"}})),window.scrollTo(0,0)}return e.useEffect(()=>{I=a,a(window.location.pathname),window.addEventListener("popstate",()=>a(window.location.pathname))},[]),t.jsx(u.Provider,{value:{loading:r.loading,path:r.path,pendingPath:r.pendingPath},children:t.jsx(h.Provider,{value:r.transition,children:t.jsx(A,{chain:r.chain,data:r.data})})})},exports.RouterStateContext=u,exports.TransitionContext=h,exports.addAfterNavigationHook=function(e){O.push(e)},exports.addBeforeNavigationHook=function(e){U.push(e)},exports.buildPath=N,exports.cleanupCache=function(e=1/0){const t=Date.now();let r=0;for(const[n,o]of D.entries())if(o.expiry<=t&&(D.delete(n),r++,r>=e))break},exports.clearRoutes=function(){n=[]},exports.createResource=M,exports.getGlobalError=q,exports.getGlobalFallback=b,exports.getGlobalResolve=K,exports.getResource=L,exports.getRoutes=o,exports.getUseGlobalError=P,exports.getUseGlobalFallback=w,exports.loadRouteData=async function(e){const t=k(o(),e);if(!t)return{};const r={};t.forEach(e=>{const t=e.node.options?.loader;t&&(r[e.node.path]=L(JSON.stringify({path:e.node.path,params:e.params,query:e.query,hash:e.hash}),()=>t({params:e.params,path:e.node.path,query:e.query,hash:e.hash}),e.node.options?.ttl))});for(const e in r)r[e].read();return r},exports.matchRouteChain=k,exports.navigate=$,exports.normalizeQuery=E,exports.parseQueryHash=j,exports.prefetch=B,exports.redirect=function(e,t){return $(e,t)},exports.route=function(e,t,r){const o={path:e,component:t,children:[],options:{}};"function"==typeof r?a(o)(r):r&&(o.options=r),n.push(o)},exports.setGlobalError=function(e,t){g=e,t&&(v=({error:e})=>t(e))},exports.setGlobalFallback=function(e,t){m=e,t&&(y=t)},exports.useLinkCore=Q,exports.useLoaderData=p,exports.useNavigate=H,exports.useNavigation=x,exports.useParams=d,exports.usePrefetch=function(e,t){return()=>B(e,t)},exports.useQuery=f,exports.useRouteContext=l,exports.useRouteMatch=function(e){return x().path===e},exports.useRouterData=function(){const e=l(),t=d(),r=f();let n;try{n=p()}catch{}return{data:n,params:t,query:r,path:e.path}},exports.useTransition=function(){return e.useContext(h)};
1
+ "use strict";var e=require("react"),t=require("react/jsx-runtime"),r=require("joinclass");let n=[];function o(){return n}function a(e){const t={guard:r=>(e.guardFns||(e.guardFns=[]),e.guardFns.push(r),t),middleware:r=>(e.middlewares||(e.middlewares=[]),e.middlewares.push(r),t),meta:r=>(e.meta=r,t),route(t,r,n){const o={path:t,component:r,children:[],options:{},guardFns:[],middlewares:[],parent:e};"function"==typeof n?a(o)(n):n&&(o.options=n),e.children.push(o);const s={guard:e=>(o.guardFns?.push(e),s),middleware:e=>(o.middlewares?.push(e),s),meta:e=>(o.meta=e,s),route(e,t,r){const n={path:e,component:t,children:[],options:{},guardFns:[],middlewares:[],parent:o};return"function"==typeof r?a(n)(r):r&&(n.options=r),o.children.push(n),s}};return s}};return e=>{e(t)}}const s=e.createContext(null),i=e.createContext(null),c=e.createContext(null),u=e.createContext({loading:!1,path:"",pendingPath:""}),h=e.createContext({name:"",stage:"idle"});function p(){const t=e.useContext(s);return t?.read()}function l(){const t=e.useContext(i);if(!t)throw new Error("RouteContext not found");return t}function d(){return e.useContext(c)??{}}function f(){return l().query??{}}function x(){return e.useContext(u)}let m=!1,g=!1,y=t.jsx("div",{children:"Loading..."}),v=({error:e})=>t.jsxs("div",{children:["Global Error: ",String(e)]});function w(){return m}function P(){return g}function b(){return y}function q(){return v}function C(e){return e.startsWith("/")||(e="/"+e),"/"!==e&&e.endsWith("/")&&(e=e.slice(0,-1)),e}function R(e){return C(e).split("/").filter(Boolean)}function j(e){const[t,r]=e.split("#"),[n,o]=t.split("?"),a={};return o&&o.split("&").forEach(e=>{const[t,r]=e.split("=");t&&(a[decodeURIComponent(t)]=decodeURIComponent(r??""))}),{path:C(n),query:a,hash:r??""}}function k(e,t){const{path:r,query:n,hash:o}=j(t),a=R(r),s=e.map(e=>({node:e,segIndex:0,params:{},chain:[]}));for(;s.length;){const{node:e,segIndex:t,params:r,chain:i}=s.pop(),c=R(e.path);let u=0;const h={...r};for(;u<c.length;u++){const e=c[u],r=a[t+u];if(!r)break;if(e.startsWith(":"))h[e.slice(1)]=decodeURIComponent(r);else if(e!==r)break}if(u!==c.length)continue;const p=t+u,l=[...i,{node:e,params:h,query:n,hash:o}];if(p===a.length)return l;for(const t of e.children)s.push({node:t,segIndex:p,params:h,chain:l})}return null}function E(e){const t={};if(!e)return t;if("string"==typeof e){const r=new URLSearchParams(e);r.forEach((e,n)=>{const o=r.getAll(n);t[n]=o.length>1?o:o[0]})}else for(const r in e){const n=e[r];Array.isArray(n)?t[r]=n.map(e=>String(e)):null!=n&&(t[r]=String(n))}return t}function N(e,t,r,n){const{path:o,query:a,hash:s}=j(e);let i=C(o);if(t)for(const e in t)i=i.replace(`:${e}`,encodeURIComponent(t[e]));const c={...a,...r??{}};if(Object.keys(c).length){const e=new URLSearchParams;for(const t in c){const r=c[t];Array.isArray(r)?r.forEach(r=>e.append(t,String(r))):e.append(t,String(r))}const t=e.toString();t&&(i+=`?${t}`)}return n?i+=`#${n}`:s&&(i+=`#${s}`),i}class S extends e.Component{constructor(e){super(e),this.reset=()=>{this.setState(e=>({hasError:!1,error:null,resetKey:e.resetKey+1}))},this.state={hasError:!1,error:null,resetKey:0}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}render(){if(this.state.hasError){const e=this.props.errorBoundary??(P()?q():void 0),r=this.props.fallback??t.jsxs("div",{children:["Error: ",String(this.state.error)]});return e?t.jsx(e,{error:this.state.error}):r}return t.jsx(e.Fragment,{children:this.props.children},this.state.resetKey)}}function F({resource:e,errorBoundary:r,children:n}){try{return e?.read(),t.jsx(t.Fragment,{children:n})}catch(e){if(e instanceof Promise)throw e;const n=r??(P()?q():void 0);if(n)return t.jsx(n,{error:e});throw e}}function A({chain:r,data:n}){return t.jsx(t.Fragment,{children:function o(a=0){const u=r[a];if(!u)return null;const h=u.node.component,p=n[u.node.path];if(!h)return o(a+1);let l=u.node.options?.fallback,d=u.node.parent;for(;!l&&d;)l=d.options?.fallback,d=d.parent;return!l&&w()&&(l=b()),t.jsx(S,{fallback:l,errorBoundary:u.node.options?.errorBoundary,children:t.jsx(e.Suspense,{fallback:l,children:t.jsx(i.Provider,{value:{path:u.node.path,params:u.params,query:E(u.node.query??window.location.search),hash:u.node.hash??""},children:t.jsx(s.Provider,{value:p,children:t.jsx(c.Provider,{value:u.params,children:t.jsx(F,{resource:p,errorBoundary:u.node.options?.errorBoundary,children:t.jsx(h,{children:o(a+1)})})})})})})})}()})}const D=new Map;function L(e,t,r,n){const o=Date.now(),a=D.get(e);if(a&&!n&&(!r||a.expiry>o))return a.resource;const s=M(t());return D.set(e,{resource:s,expiry:o+(r??0)}),s}function M(e,t){let r=t?"success":"pending",n=t??null;const o=e.then(e=>{r="success",n=e},e=>{r="error",n=e});return{read(){if("pending"===r)throw o;if("error"===r)throw n;return n},update(e){n=e,r="success"},get:()=>n}}let I=null;function K(){return I}function B(e,t){const r=o(),[n,a]=e.split("?"),s={...E(a),...t?.query??{}},i=k(r,N(n,t?.params,s,t?.hash));i&&G(i,{forceReload:!1})}function G(e,t){const r={};return e.forEach(e=>{const n=e.node.options?.loader;if(!n)return;const o=JSON.stringify({path:e.node.path,params:e.params,query:e.query,hash:e.hash}),a=e.node.options?.ttl,s=L(o,()=>n({params:e.params,path:e.node.path,query:e.query,hash:e.hash}),a,t?.forceReload);r[e.node.path]=s}),r}let U=[],O=[];async function W(e,t,r=!1){const n={...t,forceReload:t?.forceReload??!0},o=N(e,n.params,n.query,n.hash),a=await async function(e){return Promise.all(U.map(t=>t(e))).then(e=>e.every(e=>!1!==e))}(o);if(!a)return console.warn("Navigation blocked by beforeNavigation hook",o);r?window.history.replaceState({},"",o):window.history.pushState({},"",o),K()?.(o,n),async function(e){for(const t of O)await t(e)}(o)}function $(e,t){return W(e,t,!1)}function H(){const e=(e,t)=>W(N(e,t?.params,t?.query,t?.hash),t);return e.replace=(e,t)=>W(N(e,t?.params,t?.query,t?.hash),t,!0),e}function Q({to:t,transition:r,replace:n,params:o,query:a,hash:s,partialMatch:i,disablePrefetch:c}){const u=H(),h=x(),p=e.useRef(null),l=N(t,o,a,s),d=i?h.path?.startsWith(l):h.path===l;return e.useEffect(()=>{if(c)return;const e=p.current;if(!e)return;const t=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(B(l),t.disconnect())},{rootMargin:"200px"});return t.observe(e),()=>t.disconnect()},[l,c]),{ref:p,fullPath:l,isActive:d,go:()=>{n?u.replace(t,{transition:r,params:o,query:a,hash:s}):u(t,{transition:r,params:o,query:a,hash:s})}}}$.replace=(e,t)=>W(e,t,!0);const T=e.forwardRef(({fullPath:e,onNavigate:r,onPrefetch:n,onClick:o,onMouseEnter:a,onKeyDown:s,disablePrefetch:i,...c},u)=>t.jsx("a",{ref:u,href:e,...c,onClick:e=>{o&&o(e),e.metaKey||e.ctrlKey||e.shiftKey||(e.preventDefault(),r())},onMouseEnter:e=>{a&&a(e),i||n?.()},onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),r()),s&&s(e)}}));T.displayName="LinkCore",exports.Link=function(e){const{to:n,transition:o,replace:a,activeClassName:s="active",onNavigate:i,partialMatch:c,params:u,query:h,hash:p,className:l,disablePrefetch:d,...f}=e,{ref:x,fullPath:m,isActive:g,go:y}=Q({to:n,transition:o,replace:a,params:u,query:h,hash:p,partialMatch:c,disablePrefetch:d});return t.jsx(T,{ref:x,fullPath:m,onNavigate:()=>{y(),i?.(m)},onPrefetch:()=>B(m),className:r(l,g&&s),disablePrefetch:d,...f})},exports.LoaderDataContext=s,exports.NavLink=function(e){const{to:n,transition:o,replace:a,params:s,query:i,hash:c,partialMatch:u,className:h,style:p,disablePrefetch:l,...d}=e,{ref:f,fullPath:x,isActive:m,go:g}=Q({to:n,transition:o,replace:a,params:s,query:i,hash:c,partialMatch:u,disablePrefetch:l}),y="function"==typeof h?h({isActive:m}):h,v="function"==typeof p?p({isActive:m}):p;return t.jsx(T,{ref:f,fullPath:x,onNavigate:g,onPrefetch:()=>B(x),className:r(y),style:v,disablePrefetch:l,...d})},exports.ParamsContext=c,exports.RouteContext=i,exports.RouterProvider=function(){const[r,n]=e.useState({chain:[],data:{},loading:!1,path:"",pendingPath:"",transition:{name:"",stage:"idle"}});async function a(e,t){const r=o();let a=k(r,e)??k(r,"*")??[];for(const t of a)for(const r of t.node.guardFns||[]){if(!await r({params:t.params,path:t.node.path,query:t.query,hash:t.hash}))return console.warn("Navigation blocked by guard",e)}for(const e of a)for(const t of e.node.middlewares||[])await t({params:e.params,path:e.node.path,query:e.query,hash:e.hash}).catch(console.error);n(r=>({...r,loading:!0,pendingPath:e,transition:{name:t?.transition||"fade",stage:"exiting"}}));const s=G(a,t);n(r=>({...r,chain:a,data:{...r.data,...s},loading:!1,path:e,pendingPath:"",transition:{name:t?.transition||"fade",stage:"entering"}})),window.scrollTo(0,0)}return e.useEffect(()=>{I=a,a(window.location.pathname),window.addEventListener("popstate",()=>a(window.location.pathname))},[]),t.jsx(u.Provider,{value:{loading:r.loading,path:r.path,pendingPath:r.pendingPath},children:t.jsx(h.Provider,{value:r.transition,children:t.jsx(A,{chain:r.chain,data:r.data})})})},exports.RouterStateContext=u,exports.TransitionContext=h,exports.addAfterNavigationHook=function(e){O.push(e)},exports.addBeforeNavigationHook=function(e){U.push(e)},exports.buildPath=N,exports.cleanupCache=function(e=1/0){const t=Date.now();let r=0;for(const[n,o]of D.entries())if(o.expiry<=t&&(D.delete(n),r++,r>=e))break},exports.clearRoutes=function(){n=[]},exports.createResource=M,exports.getGlobalError=q,exports.getGlobalFallback=b,exports.getGlobalResolve=K,exports.getResource=L,exports.getRoutes=o,exports.getUseGlobalError=P,exports.getUseGlobalFallback=w,exports.loadRouteData=async function(e){const t=k(o(),e);if(!t)return{};const r={};t.forEach(e=>{const t=e.node.options?.loader;t&&(r[e.node.path]=L(JSON.stringify({path:e.node.path,params:e.params,query:e.query,hash:e.hash}),()=>t({params:e.params,path:e.node.path,query:e.query,hash:e.hash}),e.node.options?.ttl))});for(const e in r)r[e].read();return r},exports.matchRouteChain=k,exports.navigate=$,exports.normalizeQuery=E,exports.parseQueryHash=j,exports.prefetch=B,exports.redirect=function(e,t){return $(e,t)},exports.route=function(e,t,r){const o={path:e,component:t,children:[],options:{}};"function"==typeof r?a(o)(r):r&&(o.options=r),n.push(o)},exports.setGlobalError=function(e,t){g=e,t&&(v=({error:e})=>t(e))},exports.setGlobalFallback=function(e,t){m=e,t&&(y=t)},exports.useLinkCore=Q,exports.useLoaderData=p,exports.useNavigate=H,exports.useNavigation=x,exports.useParams=d,exports.usePrefetch=function(e,t){return()=>B(e,t)},exports.useQuery=f,exports.useRouteContext=l,exports.useRouteMatch=function(e){return x().path===e},exports.useRouterData=function(){const e=l(),t=d(),r=f();let n;try{n=p()}catch{}return{data:n,params:t,query:r,path:e.path}},exports.useTransition=function(){return e.useContext(h)};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "routexiz",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "Intent-based routing for React. Navigate by intent instead of URLs.",
5
5
  "author": "Delpi.Kye",
6
6
  "license": "MIT",
@@ -40,6 +40,11 @@
40
40
  "bugs": {
41
41
  "url": "https://github.com/delpikye-v/routexiz/issues"
42
42
  },
43
+ "funding": {
44
+ "type": "github",
45
+ "url": "https://github.com/sponsors/delpikye-v"
46
+ },
47
+
43
48
  "keywords": [
44
49
  "react",
45
50
  "router",