@crossfox/react-router
Version:
Lightning-fast and highly functional router for React. Effortlessly manage your application's routing with speed and efficiency
2 lines (1 loc) • 3.31 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=t(e);"function"==typeof SuppressedError&&SuppressedError;const n=Array.isArray,o=e=>"[object Object]"===Object.prototype.toString.call(e),s=/:([a-zA-Z0-9-]+)/g,a=/[^/]+/,l=e=>e,u=(e,t,r,n=!0)=>{var l;const u=o(t.at(-1));((null===(l=e.match(s))||void 0===l?void 0:l.length)||0)>t.length+("function"==typeof t[0]?-1:0)+r.length+(u?-1:0)&&t.push(a),n&&!u&&t.push({})};let c={baseUrl:"/",setSUrl:l,onChange:l,sHistory:{current:[]},sUrl:"",sLayout:{current:"default"}};function i(e,t="",r=[]){let s={};for(const a in e){if("$root"===a)continue;let l=e[a];const c=t+a;if(o(l)){const e=l.$root||[];u(a,e,r,!1),Object.assign(s,i(l,c+"/",e))}else n(l)||(l=[l]),u(a,l,r),l.splice(1,0,...r),s[c]=l}return s}const f=()=>r.default.createElement("h1",null,"Page not found"),p={error:({children:e})=>r.default.createElement("div",{className:"page-error"},e),default:({children:e})=>r.default.createElement(r.default.Fragment,null,e)},d=e.createContext(c),h=(e,t={})=>y(c,e,t);function y(e,t,r){e.setSUrl(t,r),e.onChange(e.sUrl,t),history.pushState(null,"",e.baseUrl+t);const n=e.sHistory.current||[];n.length>30&&n.shift(),n.push([t,r])}const g=t=>{const r=e.useContext(d);if(!r)throw new Error(t+" must be used within a <Router>");return r},b=(e,t,n,o={})=>r.default.createElement(d.Provider,{value:e},r.default.createElement(t,null,r.default.createElement(n,Object.assign({},o))));exports.Link=t=>{const{tagName:r="a",data:n={},to:o,children:s}=t,a=function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}(t,["tagName","data","to","children"]);return a.onClick=e=>{e.preventDefault(),h(o,n)},"a"===r&&(a.href=o),e.createElement(r,a,s)},exports.default=function(t){const r=i(t),n=[];for(let e in r){const t=r[e],o=[];e=e.replace(s,((e,r)=>{return o.push(r),"("+(((n=t.splice(1,1)[0])instanceof RegExp?(n+"").slice(1,-1):n)+")");var n})),t.splice(1,0,...o),n.push([RegExp("^"+e+"$"),...t])}return window.addEventListener("popstate",(()=>{h(location.pathname.slice(1))})),function(t){let{url:r,layout:o="default",layouts:s={},baseUrl:a="/",onChange:u=l}=t;s=Object.assign(Object.assign({},p),s);const[i,d]=e.useState(r||location.pathname.slice(1)),h=e.useRef("default"),y={baseUrl:a,sUrl:i,setSUrl:d,sLayout:h,sHistory:e.useRef([]),onChange:u};c=y;for(let e of n){const t=e[0];if(e=[...e],~i.search(t)){const r=e.pop(),n=i.match(t)||[],a={};for(let t=1;t<n.length;t++)a[e[t+1]]=n[t];const l=r.layout||o;return l!==o&&(h.current=l),b(y,s[l],e[1],a)}}return b(y,s.error,f)}},exports.goBack=(e=-1)=>{const t=c.sHistory.current.at(e);t&&(c.onChange(c.sUrl,t[0]),h(...t))},exports.goTo=h,exports.useHistory=()=>g("useHistory").sHistory.current,exports.useLayout=()=>g("useLayout").sLayout.current,exports.useNavigate=()=>{const e=g("useNavigate");return(t,r)=>y(e,t,r)},exports.useRouterData=()=>(g("useRouterData").sHistory.current.at(-1)||[])[1]||[];//# sourceMappingURL=index.js.map