moy-router
Version:
Give a solution for moy-dom router management.
2 lines (1 loc) • 6.5 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("moy-fp"),require("moy-dom")):"function"==typeof define&&define.amd?define(["exports","moy-fp","moy-dom"],t):t(e.MoyRouter={},e.M,e.moyDom)}(this,function(e,m,o){"use strict";var l=c,t=i,r=function(e,t){return p(i(e,t))},n=p,a=u,q="/",T="./",$=new RegExp(["(\\\\.)","(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?"].join("|"),"g");function i(e,t){for(var r,n,o=[],a=0,i=0,p="",u=t&&t.delimiter||q,c=t&&t.delimiters||T,s=!1;null!==(r=$.exec(e));){var f=r[0],m=r[1],l=r.index;if(p+=e.slice(i,l),i=l+f.length,m)p+=m[1],s=!0;else{var h="",d=e[i],y=r[2],g=r[3],v=r[4],x=r[5];if(!s&&p.length){var w=p.length-1;-1<c.indexOf(p[w])&&(h=p[w],p=p.slice(0,w))}p&&(o.push(p),p="",s=!1);var E=""!==h&&void 0!==d&&d!==h,b="+"===x||"*"===x,R="?"===x||"*"===x,j=h||u,k=g||v;o.push({name:y||a++,prefix:h,delimiter:j,optional:R,repeat:b,partial:E,pattern:k?(n=k,n.replace(/([=!:$/()])/g,"\\$1")):"[^"+A(j)+"]+?"})}}return(p||i<e.length)&&o.push(p+e.substr(i)),o}function p(c){for(var s=new Array(c.length),e=0;e<c.length;e++)"object"==typeof c[e]&&(s[e]=new RegExp("^(?:"+c[e].pattern+")$"));return function(e,t){for(var r="",n=t&&t.encode||encodeURIComponent,o=0;o<c.length;o++){var a=c[o];if("string"!=typeof a){var i,p=e?e[a.name]:void 0;if(Array.isArray(p)){if(!a.repeat)throw new TypeError('Expected "'+a.name+'" to not repeat, but got array');if(0===p.length){if(a.optional)continue;throw new TypeError('Expected "'+a.name+'" to not be empty')}for(var u=0;u<p.length;u++){if(i=n(p[u],a),!s[o].test(i))throw new TypeError('Expected all "'+a.name+'" to match "'+a.pattern+'"');r+=(0===u?a.prefix:a.delimiter)+i}}else if("string"!=typeof p&&"number"!=typeof p&&"boolean"!=typeof p){if(!a.optional)throw new TypeError('Expected "'+a.name+'" to be '+(a.repeat?"an array":"a string"));a.partial&&(r+=a.prefix)}else{if(i=n(String(p),a),!s[o].test(i))throw new TypeError('Expected "'+a.name+'" to match "'+a.pattern+'", but got "'+i+'"');r+=a.prefix+i}}else r+=a}return r}}function A(e){return e.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1")}function h(e){return e&&e.sensitive?"":"i"}function u(e,t,r){for(var n=(r=r||{}).strict,o=!1!==r.start,a=!1!==r.end,i=A(r.delimiter||q),p=r.delimiters||T,u=[].concat(r.endsWith||[]).map(A).concat("$").join("|"),c=o?"^":"",s=0===e.length,f=0;f<e.length;f++){var m=e[f];if("string"==typeof m)c+=A(m),s=f===e.length-1&&-1<p.indexOf(m[m.length-1]);else{var l=m.repeat?"(?:"+m.pattern+")(?:"+A(m.delimiter)+"(?:"+m.pattern+"))*":m.pattern;t&&t.push(m),m.optional?m.partial?c+=A(m.prefix)+"("+l+")?":c+="(?:"+A(m.prefix)+"("+l+"))?":c+=A(m.prefix)+"("+l+")"}}return a?(n||(c+="(?:"+i+")?"),c+="$"===u?"$":"(?="+u+")"):(n||(c+="(?:"+i+"(?="+u+"))?"),s||(c+="(?="+i+"|"+u+")")),new RegExp(c,h(r))}function c(e,t,r){return e instanceof RegExp?function(e,t){if(!t)return e;var r=e.source.match(/\((?!\?)/g);if(r)for(var n=0;n<r.length;n++)t.push({name:n,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,pattern:null});return e}(e,t):Array.isArray(e)?function(e,t,r){for(var n=[],o=0;o<e.length;o++)n.push(c(e[o],t,r).source);return new RegExp("(?:"+n.join("|")+")",h(r))}(e,t,r):(n=t,u(i(e,o=r),n,o));var n,o}l.parse=t,l.compile=r,l.tokensToFunction=n,l.tokensToRegExp=a;var s=function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],n=!0,o=!1,a=void 0;try{for(var i,p=e[Symbol.iterator]();!(n=(i=p.next()).done)&&(r.push(i.value),!t||r.length!==t);n=!0);}catch(e){o=!0,a=e}finally{try{!n&&p.return&&p.return()}finally{if(o)throw a}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")},f=m.compose(m.prepend("?"),m.join("&"),m.map(m.compose(m.join("="),m.map(encodeURIComponent))),m.entries),d=m.compose(m.reduce(function(e,t){var r=m.compose(m.map(decodeURIComponent),m.split("="))(t),n=s(r,2),o=n[0],a=n[1];return e[o]=a,e},{}),m.split("&")),y=m.ifElse(function(e,t){var r=e.split("#"),n=s(r,2),o=n[0],a=n[1];t.query=o?d(o):void 0,t.hash=a})(function(e,t){return t.query=d(e)})(m.includes("#")),g=m.ifElse(function(e){var t={};t.pathname=e;var r=m.compose(m.prop(1),m.split("?"))(e);return!r&&e.includes("#")&&(r=m.compose(m.prepend("#"),m.prop(1),m.split("#"))(e)),r&&y(r,t),t})(function(e){return e.params&&(e.pathname=l.compile(e.pathname)(e.params)),e.query&&(e.pathname+=f(e.query)),e.hash&&(e.pathname+=m.concat(e.hash)("#")),e})(m.type("String")),v=m.Maybe.of(window),x=m.curry(function(o,r){return function(t){var n=o.route.pathname.split("?").map(m.split("#"))[0][0],e=m.compose(m.map(function(e){return e.component(Object.assign({},t,{route:{pathname:o.route.pathname,params:o.route.params,query:o.route.query,hash:o.route.hash,state:o.route.state}}))}),m.map(m.tap(m.ifElse(function(e){var r=n.match(e.pathnameRegExp);o.route.params={},e.paramKeys.forEach(function(e,t){o.route.params[e.name]=decodeURIComponent(r[t+1])})})(m.always(void 0))(m.compose(m.and(!o.route.params),m.length,m.prop("paramKeys"))))),m.Maybe.of)(r.find(function(e){return e.pathnameRegExp.test(n)}));return e.isJust?e.join():""}}),w=m.curry(function(t,e){var r=e.to,n=e.innerNode;return o.Element.of("a",{href:m.type("String",r)?r:r.pathname,onclick:function(e){e.preventDefault(),t(r)}},n)});e.createRouter=function(e,n){var r,t=m.map(m.compose(m.dissoc("pathname"),function(e){return m.assoc("pathnameRegExp")(l(m.prop("pathname",e),m.prop("paramKeys",e),{sensitive:!0}))(e)},m.tap(function(e){return e.paramKeys=[]})))(e),o=m.Maybe.of(window).map(function(e){return e.location.pathname+e.location.search+e.location.hash}).chain(g),a=new Proxy({route:o},{set:function(e,t,r){return Reflect.set(e,t,r),"route"===t&&n(),!0}}),i=(r=a,m.and(v.map(function(e){return e.addEventListener("popstate",m.compose(m.assoc("route",m.__,r),m.path(["state","route"])))}))({back:function(){v.map(function(e){return e.history.back()})},go:function(t){v.map(function(e){return e.history.go(t)})},forward:function(){v.map(function(e){return e.history.forward()})},replace:function(e){var t=g(e);v.map(function(e){return m.or(e.history.replaceState(t,"",t.pathname))(m.assoc("route",t,r))})},push:function(e){var t=g(e);v.map(function(e){return m.or(e.history.replaceState(t,"",t.pathname))(m.assoc("route",t,r))})}})),p=i.back,u=i.go,c=i.forward,s=i.replace,f=i.push;return{back:p,go:u,forward:c,replace:s,push:f,RouterView:x(a,t),RouterLink:w(f)}},Object.defineProperty(e,"__esModule",{value:!0})});