UNPKG

type-route

Version:

The flexible, type safe routing library.

3 lines (2 loc) 16.5 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=require("history"),e=require("react");function n(){return(n=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(r[a]=n[a])}return r}).apply(this,arguments)}function a(r,e){(null==e||e>r.length)&&(e=r.length);for(var n=0,a=new Array(e);n<e;n++)a[n]=r[n];return a}function t(r,e){var n="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(n)return(n=n.call(r)).next.bind(n);if(Array.isArray(r)||(n=function(r,e){if(r){if("string"==typeof r)return a(r,void 0);var n=Object.prototype.toString.call(r).slice(8,-1);return"Object"===n&&r.constructor&&(n=r.constructor.name),"Map"===n||"Set"===n?Array.from(r):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(r,void 0):void 0}}(r))||e&&r&&"number"==typeof r.length){n&&(r=n);var t=0;return function(){return t>=r.length?{done:!0}:{done:!1,value:r[t++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function i(r){return Array.isArray(r)?r:[r]}function o(r){return"${p."+r+"}"}function u(r,e){var n={};return Object.keys(e).forEach((function(a){var t=e[a];t["~internal"].kind===r&&(n[a]=t)})),n}function l(r,e,n){var a=r["~internal"].valueSerializer.stringify(e);return n?encodeURIComponent(a):a}var f={__noMatch:!0},c=function(r,e){for(var n=0;n<e.length;n++)if(e[n]!==r[n])return!1;return!0},s=function(r,e){for(var n=1;n<=e.length;n++)if(e[e.length-n]!==r[r.length-n])return!1;return!0},p=function(r,e){var n=r.split(e);return[n[0],n.slice(1).join(e)]},v=s,m=c;function d(r){for(var e,a=r.object,i=r.paramDefs,o=r.urlEncodeDefault,u=r.arraySeparator,l={},c=Object.keys(i).map((function(r){return n({name:r},i[r])})),s=n({},a),p=function(){var r=e.value,n=a[r.name];if(delete s[r.name],void 0===n)return r["~internal"].optional?"continue":{v:!1};var t=void 0;if(null===n){if(!r["~internal"].array)return r["~internal"].optional?"continue":{v:!1};t=[]}else if(r["~internal"].array){if((t=n.split(u).map((function(e){var n;return r["~internal"].valueSerializer.parse((null!=(n=r["~internal"].valueSerializer.urlEncode)?n:o)?decodeURIComponent(e):e)}))).some((function(r){return r===f})))return r["~internal"].optional?"continue":{v:!1}}else{var i;if((t=r["~internal"].valueSerializer.parse((null!=(i=r["~internal"].valueSerializer.urlEncode)?i:o)?decodeURIComponent(n):n))===f)return r["~internal"].optional?"continue":{v:!1}}l[r.name]=t},v=t(c);!(e=v()).done;){var m=p();if("continue"!==m&&"object"==typeof m)return m.v}return{params:l,numExtraneousParams:Object.keys(s).length}}function y(r){var e=r.pathDefs,a=r.params,t=u("query",a),i=u("state",a),o={};return Object.keys(a).forEach((function(r){var e=a[r];void 0!==e["~internal"].default&&(o[r]=e["~internal"].default)})),function(r){var a=r.routerLocation,u=r.arraySeparator,l=r.queryStringSerializer;if(void 0===a.path)return!1;var c=function(r){for(var e=r.path,a=r.pathDefs,t=r.arraySeparator,i=0;i<a.length;i++){var o=u(a[i]);if(!1!==o)return n({},o,{primaryPath:0===i})}return!1;function u(r){var n={};if("/"===e&&0===r.length)return{params:n,numExtraneousParams:0};var a=e.length>1&&v(e,"/");a&&(e=e.slice(0,e.length-1));for(var i=e.split("/").slice(1),o=function(e){var o,u,l,c=e>=r.length?null:r[e],s=e>=i.length?null:i[e];if(null===c)return{v:!1};if(null===s)return 0==r.length-1-e&&null!=(l=c.namedParamDef)&&l["~internal"].optional?"break":{v:!1};if(null!=(o=c.namedParamDef)&&o["~internal"].trailing&&(s=i.slice(e).join("/")),!m(s,c.leading))return{v:!1};var p=s.slice(c.leading.length);if(!v(p,c.trailing))return{v:!1};var d=p.slice(0,p.length-c.trailing.length);if(!c.namedParamDef)return""===d?"continue":{v:!1};if(""===d)return c.namedParamDef["~internal"].optional?"continue":{v:!1};var y=null!=(u=c.namedParamDef["~internal"].valueSerializer.urlEncode)?u:!c.namedParamDef["~internal"].trailing,h=void 0;if(c.namedParamDef["~internal"].array){if((h=d.split(t).map((function(r){var e;return null==(e=c.namedParamDef)?void 0:e["~internal"].valueSerializer.parse(y?decodeURIComponent(r):r)}))).some((function(r){return r===f})))return{v:!1}}else if((h=c.namedParamDef["~internal"].valueSerializer.parse(y?decodeURIComponent(d):d))===f)return{v:!1};return c.namedParamDef["~internal"].trailing&&a&&""===c.trailing&&(h+="/"),n[c.namedParamDef.paramName]=h,c.namedParamDef["~internal"].trailing?"break":void 0},u=0;u<Math.max(r.length,i.length);u++){var l=o(u);if("break"===l)break;if("continue"!==l&&"object"==typeof l)return l.v}return{params:n,numExtraneousParams:0}}}({path:a.path,pathDefs:e,arraySeparator:u});if(!1===c)return!1;var s=function(r,e,n,a){var t={};return r&&(t=n.parse(r)),d({object:t,paramDefs:e,urlEncodeDefault:!0,arraySeparator:a})}(a.query,t,l,u);if(!1===s)return!1;var p=function(r,e,n){return d({object:null!=r?r:{},paramDefs:e,urlEncodeDefault:!1,arraySeparator:n})}(a.state,i,u);return!1!==p&&{primaryPath:c.primaryPath,params:n({},o,c.params,s.params,p.params),numExtraneousParams:c.numExtraneousParams+s.numExtraneousParams+p.numExtraneousParams}}}function h(r){return void 0===r&&(r={}),!(r.target&&r.target.target&&"_self"!==r.target.target||r.defaultPrevented||0!==r.button||r.metaKey||r.altKey||r.ctrlKey||r.shiftKey||(r&&r.preventDefault&&r.preventDefault(),0))}var g=c;function S(r){var e=r.routeName,a=r.params,t=r.location,i=r.routerContext,o=i.navigate,u=i.history.createHref({pathname:!1===e?t.fullPath:t.path,search:t.query?"?"+t.query:""});g(u,"#")&&(u="/"+u),!1!==e&&"/"!==i.baseUrl&&(u=i.baseUrl+u);var l={name:e,params:a,href:u,link:{href:u,onClick:function(r){if(h(r))return l.push()}},action:null,push:function(){return o(n({},l,{action:"push"}),!0)},replace:function(){return o(n({},l,{action:"replace"}),!0)}};return l}function b(r,e,a){var f,c,s,p,v=(f=u("path",e["~internal"].params),c=e["~internal"].path,s=Object.keys(f).map((function(r){return n({paramName:r},f[r])})),p={},s.forEach((function(r){var e=r.paramName;p[e]=o(e)})),i(c(p)).map((function(r){if(1===r.length)return[];for(var e,n=r.split("/").slice(1),a={},i=[],u=t(n);!(e=u()).done;){for(var l,f=e.value,c=null,p=t(s);!(l=p()).done;){var v=l.value;f.indexOf(o(v.paramName))>=0&&(c=v,a[v.paramName]=!0)}if(c){var m=f.split(o(c.paramName));i.push({leading:m[0],trailing:m[1],namedParamDef:c})}else i.push({leading:f,trailing:"",namedParamDef:null})}return s.map((function(r){return r.paramName})).filter((function(r){return!a[r]})),i}))),m=function(t){void 0===t&&(t={});var i=a(),o=i.arraySeparator,u=i.queryStringSerializer,f=i.baseUrl,c=n({},t);Object.keys(e["~internal"].params).forEach((function(r){var n=e["~internal"].params[r];void 0===c[r]&&void 0!==n["~internal"].default&&(c[r]=n["~internal"].default)}));var s=function(r){var e=r.paramCollection,a=r.paramDefCollection,t=r.arraySeparator,i=r.queryStringSerializer,o=r.pathDefs,u=r.baseUrl,f={path:{},query:{},state:{}},c=function(r){var n,i=e[r];if(void 0===i)return"continue";var o=a[r],u=null!=(n=o["~internal"].valueSerializer.urlEncode)?n:"state"!==o["~internal"].kind&&!o["~internal"].trailing,c=function(r){return o["~internal"].array?0===r.length?null:r.map((function(r){return l(o,r,u)})).join(t):l(o,r,u)},s=c(i);if("query"===o["~internal"].kind&&void 0!==o["~internal"].default&&c(o["~internal"].default)===s)return"continue";f[o["~internal"].kind][r]={valueSerializerId:o["~internal"].valueSerializer.id,array:o["~internal"].array,value:s}};for(var s in a)c(s);var p="/"+o[0].filter((function(r){var e=r.namedParamDef;return!(null!=e&&e["~internal"].optional&&void 0===f.path[e.paramName])})).map((function(r){var e=r.namedParamDef;return r.leading+(e?f.path[e.paramName].value:"")+r.trailing})).join("/");return{fullPath:("/"===u?"":u)+p,path:p,query:Object.keys(f.query).length>0?i.stringify(f.query):void 0,state:0===Object.keys(f.state).length?void 0:Object.keys(f.state).reduce((function(r,e){var a;return n({},r,((a={})[e]=f.state[e].value,a))}),{})}}({paramCollection:t,paramDefCollection:e["~internal"].params,arraySeparator:o,queryStringSerializer:u,pathDefs:v,baseUrl:f});return S({routeName:r,params:c,location:s,routerContext:i})};return Object.defineProperty(m,"name",{value:r}),m["~internal"]={type:"RouteBuilder",match:y({pathDefs:v,params:e["~internal"].params}),pathDefs:v,Route:null},m}function P(r){var e,n;void 0===r&&(r={});var a=null!=(e=r.queryStringArrayFormat)?e:"singleKeyWithBracket",i=null!=(n=r.arraySeparator)?n:",",o="multiKey"===a||"multiKeyWithBracket"===a,u="multiKey"===a||"singleKey"===a?"":"[]";return{parse:function(r){for(var e,n={},a=t(r.split("&"));!(e=a()).done;){var l=e.value.split("="),f=l[0],c=l[1],p=l.slice(2);if(!(void 0===f||p.length>0)){var v=decodeURIComponent(s(f,u)?f.slice(0,f.length-u.length):f);void 0===c?n[v]=null:n[v]&&o?n[v]+=""+i+c:n[v]=c}}return n},stringify:function(r){return Object.keys(r).map((function(e){var n=encodeURIComponent(e),a=r[e].array?""+n+u:n,t=r[e].value;return null===t?a:r[e].array&&o?t.split(i).map((function(r){return a+"="+r})).join("&"):a+"="+t})).join("&")}}}function D(r,e){var a=e.queryStringSerializer,t=e.arraySeparator,i=(0,e.getRoutes)(),o=!1;for(var u in i){var l=i[u]["~internal"].match({routerLocation:r,queryStringSerializer:a,arraySeparator:t});if(!1!==l){if(0===l.numExtraneousParams)return{route:i[u](l.params),primaryPath:l.primaryPath};(!1===o||l.numExtraneousParams<o.numExtraneousParams)&&(o=n({},l,{routeName:u}))}}return o?{route:i[o.routeName](o.params),primaryPath:o.primaryPath}:{route:S({routeName:!1,params:{},location:r,routerContext:e}),primaryPath:!0}}var j=c;function k(r,e){return{fullPath:r.pathname,path:j(r.pathname,e)?"/"!==e?r.pathname.replace(e,""):r.pathname:void 0,query:r.search?j(r.search,"?")?r.search.slice(1):r.search:void 0,state:"object"==typeof r.state&&null!==r.state?r.state.state:void 0}}var w=p;function x(r,e,n){var a=w(r,"?");return D(k({pathname:a[0],search:a[1],state:e},n.baseUrl),n)}function E(r){var e=r.startListening,n=r.stopListening,a=[],t=0;return{add:function(r){var i=t++;return a.push({id:i,handler:r}),1===a.length&&e(),function(){var r=a.map((function(r){return r.id})).indexOf(i);r>=0&&(a.splice(r,1),0===a.length&&n())}},getHandlers:function(){return a.map((function(r){return r.handler}))}}}function O(r,e){if("push"===r.action&&"object"==typeof window&&null!==window&&"function"==typeof window.scroll&&!1!==e&&"object"==typeof navigator&&null!==navigator&&"string"==typeof navigator.userAgent&&!(navigator.userAgent.indexOf("Node.js")>0||navigator.userAgent.indexOf("jsdom")>0))try{window.scroll(0,0)}catch(r){}}function q(r,e){var n={};if(r.name)for(var a,i=t(Object.keys(r.params).sort());!(a=i()).done;){var o=a.value,u=e[r.name]["~internal"].params[o]["~internal"];"state"===u.kind&&(n[o]=u.valueSerializer.stringify(r.params[o]))}return n}var z=p;function N(){for(var e,a,i,o,u,l=arguments.length,f=new Array(l),c=0;c<l;c++)f[c]=arguments[c];var s,p,v=C(f),m=v.routeDefs,d=v.opts,y=E({startListening:function(){p=s.listen((function(r){if(b)b=!1;else{var e=k(r.location,h),a=r.action.toLowerCase(),t=D(e,H()),i=t.primaryPath;T(n({},t.route,{action:a}),i)}}))},stopListening:function(){return null==p?void 0:p()}}),h=null!=(e=d.baseUrl)?e:"/",g=null!=(a=null==(i=d.arrayFormat)?void 0:i.separator)?a:",",S=null!=(o=d.queryStringSerializer)?o:P({queryStringArrayFormat:null==(u=d.arrayFormat)?void 0:u.queryString,arraySeparator:g}),b=!1,j=!1,w=null,N=null,A=[];L(d.session);var I=R(H),U={routes:I,session:{push:function(r,e){var a=x(r,e,H()),t=a.primaryPath;return K(n({},a.route,{action:"push"}),t)},replace:function(r,e){var a=x(r,e,H()),t=a.primaryPath;return K(n({},a.route,{action:"replace"}),t)},back:function(r){void 0===r&&(r=1),s.go(-r)},forward:function(r){void 0===r&&(r=1),s.go(r)},getInitialRoute:function(){if(!w){var r=D(k(s.location,h),H());r.primaryPath||(j=!0,r.route.replace(),r=D(k(s.location,h),H())),w=r.route}return w},reset:function(r){return L(r)},block:function(r){A.push(r);var e=s.block((function(e){var a=D(k(e.location,h),H()).route,t=e.action.toLowerCase();r({route:n({},a,{action:t}),retry:e.retry})}));return function(){A.splice(A.findIndex((function(e){return e===r})),1),e()}},listen:function(r){return y.add(r)}}};return U;function L(e){void 0===e&&(e={type:"undefined"!=typeof window&&void 0!==window.document?"browser":"memory"}),w=null,s="memory"===e.type?r.createMemoryHistory({initialEntries:e.initialEntries,initialIndex:e.initialIndex}):"hash"===e.type?r.createHashHistory({window:e.window}):r.createBrowserHistory({window:e.window})}function K(r,e){var n;if(A.length>0)A.forEach((function(e){e({route:r,retry:function(){r["push"===r.action?"push":"replace"]()}})}));else{var a=q(r,m);if((null==(n=N)?void 0:n.href)!==r.href||JSON.stringify(q(N,m))!==JSON.stringify(a)){j?j=!1:T(r,e),b=!0;var t=z(r.href,"?"),i=t[1];s["replace"===r.action?"replace":"push"]({pathname:t[0],search:i?"?"+i:"",hash:""},a?{state:a}:void 0)}}}function T(r,e){if(e){for(var n,a=t(y.getHandlers());!(n=a()).done;)(0,n.value)(r);O(r,d.scrollToTop),N=r}else r.replace()}function H(){return{queryStringSerializer:S,arraySeparator:g,navigate:K,history:s,routeDefs:m,getRoutes:function(){return I},baseUrl:h}}}function C(r){return{routeDefs:1===r.length?r[0]:r[1],opts:1===r.length?{}:r[0]}}function R(r){var e={},n=r().routeDefs;for(var a in n)e[a]=b(a,n[a],r);return e}function A(r){return 1===r.length?{params:{},path:function(){return r[0]}}:{params:r[0],path:r[1]}}var I={id:"boolean",parse:function(r){return"true"===r||"false"!==r&&f},stringify:function(r){return r?"true":"false"}},U={id:"number",parse:function(r){return e=r,isNaN(parseFloat(e))||!/^-?\d*\.?\d*$/.test(e)?f:parseFloat(r);var e},stringify:function(r){return r.toString()}},L={id:"string",parse:function(r){return r},stringify:function(r){return r}},K={path:n({},T("path",!1),{trailing:T("path",!0)}),query:T("query",!1),state:T("state",!1)};function T(r,e){return n({},a(!1,!1),{array:a(!1,!0),optional:n({},a(!0,!1),{array:a(!0,!0)})});function a(n,a){return{string:t({"~internal":{type:"ParamDef",array:a,kind:r,optional:n,valueSerializer:L,trailing:e,default:void 0}}),number:t({"~internal":{type:"ParamDef",array:a,kind:r,optional:n,valueSerializer:U,trailing:e,default:void 0}}),boolean:t({"~internal":{type:"ParamDef",array:a,kind:r,optional:n,valueSerializer:I,trailing:e,default:void 0}}),ofType:function(i){return void 0===i&&(i={id:"json",parse:function(r){var e;try{e=JSON.parse(r)}catch(r){return f}return e},stringify:function(r){return JSON.stringify(r)}}),t({"~internal":{type:"ParamDef",array:a,kind:r,optional:n,valueSerializer:i,trailing:e,default:void 0}})}}}function t(r){var e=r["~internal"];return e.optional?{"~internal":e,default:function(r){return{"~internal":n({},e,{default:r})}}}:{"~internal":e}}}exports.createGroup=function(r){var e={};return r.forEach((function(r){r.routeNames?r.routeNames.forEach((function(r){e[r]=!0})):e[r.name]=!0})),{"~internal":{type:"RouteGroup",Route:null},routeNames:Object.keys(e),has:function(r){return!1!==r.name&&!!e[r.name]}}},exports.createRouter=function(){for(var r=arguments.length,a=new Array(r),t=0;t<r;t++)a[t]=arguments[t];var i=C(a),o=i.opts,u=i.routeDefs,l=N(n({},o,{scrollToTop:!1}),u),f=e.createContext(null);return n({},l,{RouteProvider:c,useRoute:s});function c(r){var n=e.useState(l.session.getInitialRoute()),a=n[0],t=n[1];return e.useLayoutEffect((function(){return l.session.listen(t)}),[]),e.useEffect((function(){O(a,o.scrollToTop)}),[a]),e.createElement(f.Provider,{value:a},r.children)}function s(){return e.useContext(f)}},exports.defineRoute=function r(){for(var e=arguments.length,a=new Array(e),t=0;t<e;t++)a[t]=arguments[t];var o=A(a),u={"~internal":{type:"RouteDef",params:o.params,path:o.path},extend:function(){for(var e=arguments.length,a=new Array(e),t=0;t<e;t++)a[t]=arguments[t];var u=A(a),l=u.params,f=u.path,c=Object.keys(o.params),s=Object.keys(l);return c.filter((function(r){return s.indexOf(r)>=0})),r(n({},l,o.params),(function(r){var e,n=i(o.path(t(c))),a=i(f(t(s)));return(e=[]).concat.apply(e,n.map((function(r){return a.map((function(e){return"/"===r?e:r+("/"===e?"":e)}))})));function t(e){var n={};return e.forEach((function(e){n[e]=r[e]})),n}}))}};return u},exports.noMatch=f,exports.param=K,exports.preventDefaultLinkClickBehavior=h; //# sourceMappingURL=type-route.cjs.production.min.js.map