diff --git a/CHANGELOG.md b/CHANGELOG.md index 98237a68..08632159 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ + +## 1.1.1 (2015-11-24) + + + + # 1.1.0 (2015-11-19) diff --git a/dist/amd/router5.js b/dist/amd/router5.js index 4abda6bc..fb1df114 100644 --- a/dist/amd/router5.js +++ b/dist/amd/router5.js @@ -1,6 +1,6 @@ /** * @license - * @version 1.1.0 + * @version 1.1.1 * The MIT License (MIT) * * Copyright (c) 2015 Thomas Roch @@ -160,12 +160,12 @@ define('router5', [], function () { return searchPart.split('&').map(function (_) { return _.split('='); }).reduce(function (obj, m) { - return appendQueryParam(obj, m[0], m[1]); + return appendQueryParam(obj, m[0], m[1] ? decodeURIComponent(m[1]) : m[1]); }, {}); }; var toSerialisable = function toSerialisable(val) { - return val !== undefined && val !== null && val !== '' ? '=' + val : ''; + return val !== undefined && val !== null && val !== '' ? '=' + encodeURIComponent(val) : ''; }; var _serialise = function _serialise(key, val) { @@ -369,13 +369,13 @@ define('router5', [], function () { var remainingSearchParams = searchPart.split('&').reduce(function (obj, p) { var splitParam = p.split('='); var key = splitParam[0]; - var val = splitParam[1]; + var val = decodeURIComponent(splitParam[1]); if (params.indexOf(key) === -1) obj[key] = val || ''; return obj; }, {}); var remainingSearchPart = Object.keys(remainingSearchParams).map(function (p) { - return [p].concat(isSerialisable(remainingSearchParams[p]) ? remainingSearchParams[p] : []); + return [p].concat(isSerialisable(remainingSearchParams[p]) ? encodeURIComponent(remainingSearchParams[p]) : []); }).map(function (p) { return p.join('='); }).join('&'); diff --git a/dist/amd/router5.min.js b/dist/amd/router5.min.js index ff894430..019c9743 100644 --- a/dist/amd/router5.min.js +++ b/dist/amd/router5.min.js @@ -1 +1 @@ -define("router5",[],function(){"use strict";function t(t,e){function n(t){return t.split(".").reduce(function(t,e){return t.concat(t.length?t[t.length-1]+"."+e:e)},[])}var r=void 0,a=e?n(e.name):[],i=n(t.name),u=Math.min(a.length,i.length);if(e&&e.name===t.name)r=Math.max(u-1,0);else for(r=0;u>r&&a[r]===i[r];r+=1);var s=a.slice(r).reverse(),o=i.slice(r),c=e&&r>0?a[r-1]:"";return{intersection:c,toDeactivate:s,toActivate:o}}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(){var t=function(){return console.group("Router transition")},e=function(){return console.groupEnd("Router transition")};return{name:"LOGGER",onStart:function(){console.info("Router started")},onStop:function(){console.info("Router stopped")},onTransitionStart:function(n,r){e(),t(),console.log("Transition started from state"),console.log(r),console.log("To state"),console.log(n)},onTransitionCancel:function(t,e){console.warn("Transition cancelled")},onTransitionError:function(t,n,r){console.warn("Transition error with code "+r.code),e()},onTransitionSuccess:function(t,n){console.log("Transition success"),e()}}}function r(t,e,n){var r=e.isCancelled,a=e.toState,i=e.fromState,u=e.context,s=e.additionalArgs,o=arguments.length<=3||void 0===arguments[3]?!0:arguments[3],c=Array.isArray(t)?t:Object.keys(t),l=(S({},i),function(t){return"object"==typeof t&&void 0!==t.name&&void 0!==t.params&&void 0!==t.path}),h=function(t){return t.name!==a.name||t.params!==a.params||t.path!==a.path},f=function(e){if(!c.length)return!0;var n="string"==typeof c[0],r=n?c[0]:{},l=n?t[c[0]]:c[0],h=l.apply(u||null,s.concat([a,i,e]));return o&&"boolean"==typeof h?e(h?null:r):h&&"function"==typeof h.then&&h.then(function(t){return e(null,t)},function(){return e(r)}),!1},m=function(t,e){t?n(t):(e&&l(e)&&(h(e)?console.error("[router5][transition] State values changed during transition process and ignored."):a=e),c=c.slice(1),g())},g=function(){if(r())n(null);else{var t=f(m);t&&n(null,a)}};g()}function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(e,n,i,u){var s=!1,o=e.getAdditionalArgs(),c=function(){return s},l=function(){return s=!0},h=function(t,r){t||c()||!e.options.autoCleanUp||!function(){var t=_(n.name);Object.keys(e._cmps).filter(function(n){-1===t.indexOf(n)&&e.deregisterComponent(n)})}(),u(c()?{code:A.TRANSITION_CANCELLED}:t,r||n)},f=t(n,i),m=f.toDeactivate,g=f.toActivate,p={isCancelled:c,toState:n,fromState:i,additionalArgs:[]},d=function(t,n,i){var u=m.filter(function(t){return e._cmps[t]&&e._cmps[t].canDeactivate}).reduce(function(t,n){return S({},t,a({},n,e._cmps[n].canDeactivate))},{});r(u,S({},p,{additionalArgs:o}),function(t){return i(t?{code:A.CANNOT_DEACTIVATE,segment:t}:null)})},v=function(t,n,i){var u=g.filter(function(t){return e._canAct[t]}).reduce(function(t,n){return S({},t,a({},n,e._canAct[n]))},{});r(u,S({},p,{additionalArgs:o}),function(t){return i(t?{code:A.CANNOT_ACTIVATE,segment:t}:null)})},y=e.mware,E=function(t,n,a){var i=Array.isArray(e.mware)?e.mware:[e.mware];r(i,S({},p,{context:{cancel:l,router:e}}),function(e,n){var r=e?"object"==typeof e?e:{error:e}:null;a(e?S({code:A.TRANSITION_ERR},r):null,n||t)})},T=(i?[d]:[]).concat(v).concat(y?E:[]);return r(T,p,h),l}var u=function(){function t(t,e){for(var n=0;n$)/g,""):"[a-zA-Z0-9-_.~]+")+")"},o=[{name:"url-parameter",pattern:/^:([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function(t){return new RegExp(s(t[2]))}},{name:"url-parameter-splat",pattern:/^\*([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/,regex:/([^\?]*)/},{name:"url-parameter-matrix",pattern:/^\;([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function(t){return new RegExp(";"+t[1]+"="+s(t[2]))}},{name:"query-parameter",pattern:/^(?:\?|&)(?:\:)?([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/},{name:"delimiter",pattern:/^(\/|\?)/,regex:function(t){return new RegExp("\\"+t[0])}},{name:"sub-delimiter",pattern:/^(\!|\&|\-|_|\.|;)/,regex:function(t){return new RegExp(t[0])}},{name:"fragment",pattern:/^([0-9a-zA-Z]+?)/,regex:function(t){return new RegExp(t[0])}}],c=function k(t){var e=arguments.length<=1||void 0===arguments[1]?[]:arguments[1],n=o.some(function(n){var r=t.match(n.pattern);return r?(e.push({type:n.name,match:r[0],val:r.slice(1,2),otherVal:r.slice(2),regex:n.regex instanceof Function?n.regex(r):n.regex}),r[0].length0,this.hasSpatParam=this.tokens.filter(function(t){return/splat$/.test(t.type)}).length>0,this.hasMatrixParams=this.tokens.filter(function(t){return/matrix$/.test(t.type)}).length>0,this.hasQueryParams=this.tokens.filter(function(t){return"query-parameter"===t.type}).length>0,this.urlParams=this.hasUrlParams?this.tokens.filter(function(t){return/^url-parameter/.test(t.type)}).map(function(t){return t.val.slice(0,1)}).reduce(function(t,e){return t.concat(e)}):[],this.queryParams=this.hasQueryParams?this.tokens.filter(function(t){return"query-parameter"===t.type}).map(function(t){return t.val}).reduce(function(t,e){return t.concat(e)}):[],this.params=this.urlParams.concat(this.queryParams),this.source=this.tokens.filter(function(t){return void 0!==t.regex}).map(function(t){return t.regex.source}).join("")}return u(t,null,[{key:"createPath",value:function(e){return new t(e)}},{key:"serialise",value:function(t,e){return g(t,e)}}]),u(t,[{key:"_urlMatch",value:function(t,e){var n=this,r=t.match(e);return r?this.urlParams.length?r.slice(1,this.urlParams.length+1).reduce(function(t,e,r){return t[n.urlParams[r]]=e,t},{}):{}:null}},{key:"match",value:function n(t){var e=this,r=arguments.length<=1||void 0===arguments[1]?0:arguments[1],a=l(this.source,r),n=this._urlMatch(t,new RegExp("^"+a+(this.hasQueryParams?"\\?.*$":"$")));if(!n||!this.hasQueryParams)return n;var i=f(t),u=Object.keys(i).filter(function(t){return-1===e.queryParams.indexOf(t)});return 0===u.length?(Object.keys(i).forEach(function(t){return n[t]=i[t]}),n):null}},{key:"partialMatch",value:function(t){var e=this,n=arguments.length<=1||void 0===arguments[1]?0:arguments[1],r=l(this.source,n),a=this._urlMatch(t,new RegExp("^"+r));if(!a)return a;if(!this.hasQueryParams)return a;var i=f(t);return Object.keys(i).filter(function(t){return e.queryParams.indexOf(t)>=0}).forEach(function(t){return h(a,t,i[t])}),a}},{key:"build",value:function(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=arguments.length<=1||void 0===arguments[1]?{ignoreConstraints:!1,ignoreSearch:!1}:arguments[1];if(this.urlParams.some(function(e){return void 0===t[e]}))throw new Error("Missing parameters");if(!e.ignoreConstraints){var n=this.tokens.filter(function(t){return/^url-parameter/.test(t.type)&&!/-splat$/.test(t.type)}).every(function(e){return new RegExp("^"+s(e.otherVal[0])+"$").test(t[e.val])});if(!n)throw new Error("Some parameters are of invalid format")}var r=this.tokens.filter(function(t){return"query-parameter"!==t.type}).map(function(e){return"url-parameter-matrix"===e.type?";"+e.val[0]+"="+t[e.val[0]]:/^url-parameter/.test(e.type)?t[e.val[0]]:e.match}).join("");if(e.ignoreSearch)return r;var a=this.queryParams.filter(function(e){return-1!==Object.keys(t).indexOf(e)}).map(function(e){return g(e,t[e])}).join("&");return r+(a?"?"+a:"")}}]),t}(),d=function(t){return void 0!==t&&null!==t&&""!==t},v=function(t,e){if(-1===t.indexOf("?"))return t;var n=t.split("?"),r=n[0],a=n[1],i=a.split("&").reduce(function(t,n){var r=n.split("="),a=r[0],i=r[1];return-1===e.indexOf(a)&&(t[a]=i||""),t},{}),u=Object.keys(i).map(function(t){return[t].concat(d(i[t])?i[t]:[])}).map(function(t){return t.join("=")}).join("&");return r+(u?"?"+u:"")},y=function(){function t(){var n=arguments.length<=0||void 0===arguments[0]?"":arguments[0],r=arguments.length<=1||void 0===arguments[1]?"":arguments[1],a=arguments.length<=2||void 0===arguments[2]?[]:arguments[2];return e(this,t),this.name=n,this.path=r,this.parser=r?new p(r):null,this.children=[],this.add(a),this}return u(t,[{key:"add",value:function(e){var n=this;if(void 0!==e&&null!==e){if(e instanceof Array)return void e.forEach(function(t){return n.add(t)});if(!(e instanceof t||e instanceof Object))throw new Error("RouteNode.add() expects routes to be an Object or an instance of RouteNode.");if(e instanceof Object){if(!e.name||!e.path)throw new Error("RouteNode.add() expects routes to have a name and a path defined.");e=new t(e.name,e.path,e.children)}if(-1!==this.children.map(function(t){return t.name}).indexOf(e.name))throw new Error('Alias "'+e.name+'" is already defined in route node');if(-1!==this.children.map(function(t){return t.path}).indexOf(e.path))throw new Error('Path "'+e.path+'" is already defined in route node');var r=e.name.split(".");if(1===r.length)this.children.push(e),this.children.sort(function(t,e){if("/"===t.path)return 1;if("/"===e.path)return-1;var n=t.parser.hasUrlParams||t.parser.hasSpatParam,r=e.parser.hasUrlParams||e.parser.hasSpatParam;if(!n&&!r)return t.path&&e.path?t.path.lengtha?1:0});else{var a=this.getSegmentsByName(r.slice(0,-1).join("."));if(!a)throw new Error("Could not add route named '"+e.name+"', parent is missing.");a[a.length-1].add(new t(r[r.length-1],e.path,e.children))}return this}}},{key:"addNode",value:function(e,n){return this.add(new t(e,n)),this}},{key:"getSegmentsByName",value:function(t){var e=function(t,e){var n=e.filter(function(e){return e.name===t});return n.length?n[0]:void 0},n=[],r=t.split("."),a=this.children,i=r.every(function(t){var r=e(t,a);return r?(a=r.children,n.push(r),!0):!1});return i?n:null}},{key:"getSegmentsMatchingPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],n=function i(t,n,r){var a=function(a){var u=t[a],s=u.parser.partialMatch(n),o=void 0;if(!s&&e)s=u.parser.match(n,!0),o="";else if(s){var c=u.parser.build(s,{ignoreSearch:!0});o=v(n.replace(c,""),u.parser.queryParams),e&&"/"===o&&!/\/$/.test(c)&&(o="")}return s?(r.push(u),Object.keys(s).forEach(function(t){return r.params[t]=s[t]}),o.length?u.children.length?{v:i(u.children,o,r)}:{v:null}:{v:r}):void 0};for(var u in t){var s=a(u);if("object"==typeof s)return s.v}return null},r=this.parser?[this]:this.children,a=[];return a.params={},n(r,t,a)}},{key:"getPathFromSegments",value:function(t){return t?t.map(function(t){return t.path}).join(""):null}},{key:"getPath",value:function(t){return this.getPathFromSegments(this.getSegmentsByName(t))}},{key:"buildPathFromSegments",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if(!t)return null;var n=t.filter(function(t){return t.parser.hasQueryParams}).map(function(t){return t.parser.queryParams}),r=n.length?n.reduce(function(t,e){return t.concat(e)}).filter(function(t){return-1!==Object.keys(e).indexOf(t)}).map(function(t){return p.serialise(t,e[t])}).join("&"):null;return t.map(function(t){return t.parser.build(e,{ignoreSearch:!0})}).join("")+(r?"?"+r:"")}},{key:"buildPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return this.buildPathFromSegments(this.getSegmentsByName(t),e)}},{key:"getMatchPathFromSegments",value:function(t){if(!t||!t.length)return null;var e=t.map(function(t){return t.name}).join("."),n=t.params;return{name:e,params:n}}},{key:"matchPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];return this.getMatchPathFromSegments(this.getSegmentsMatchingPath(t,e))}}]),t}(),A={ROUTER_NOT_STARTED:"NOT_STARTED",ROUTER_ALREADY_STARTED:"ALREADY_STARTED",ROUTE_NOT_FOUND:"ROUTE_NOT_FOUND",SAME_STATES:"SAME_STATES",CANNOT_DEACTIVATE:"CANNOT_DEACTIVATE",CANNOT_ACTIVATE:"CANNOT_ACTIVATE",TRANSITION_ERR:"TRANSITION_ERR",TRANSITION_CANCELLED:"CANCELLED"},S=Object.assign||function(t){for(var e=1;e0&&("string"==typeof e[0]&&(a=e[0]),"object"==typeof e[0]&&(i=e[0]));var s=function(e,n){var a=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];r&&r(e,n),e||t._invokeListeners("$$success",n,null,{replace:!0}),e&&a&&t._invokeListeners("$$error",n,null,e)};return void 0===a&&void 0===i&&this.getLocation&&(a=this.getLocation()),i?(this.lastKnownState=i,s(null,i)):!function(){i=void 0===a?null:t.matchPath(a);var e=function(){return t.navigate(u.defaultRoute,u.defaultParams,{replace:!0},function(t,e){return s(t,e,!1)})};i?(t.lastStateAttempt=i,t._transition(t.lastStateAttempt,t.lastKnownState,function(t,n){t?u.defaultRoute?e():s(t,null,!1):s(null,n)})):u.defaultRoute?e():s({code:A.ROUTE_NOT_FOUND,path:a},null)}(),this}},{key:"stop",value:function(){return this.started?(this.lastKnownState=null,this.lastStateAttempt=null,this.started=!1,this._invokeListeners("$stop"),this):this}},{key:"getState",value:function(){return this.lastKnownState}},{key:"isActive",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],r=arguments.length<=3||void 0===arguments[3]?!0:arguments[3],a=this.getState();return a?n||a.name===t?this.areStatesEqual(E(t,e),a,r):this.areStatesDescendants(E(t,e),a):!1}},{key:"areStatesEqual",value:function(t,e){var n=this,r=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];if(t.name!==e.name)return!1;var a=function(t){return n.rootNode.getSegmentsByName(t).map(function(t){return t.parser[r?"urlParams":"params"]}).reduce(function(t,e){return t.concat(e)},[])},i=a(t.name),u=a(e.name);return i.length===u.length&&i.every(function(n){return t.params[n]===e.params[n]})}},{key:"areStatesDescendants",value:function(t,e){var n=new RegExp("^"+t.name+"\\.(.*)$");return n.test(e.name)?Object.keys(t.params).every(function(n){return t.params[n]===e.params[n]}):!1}},{key:"_invokeListeners",value:function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];(this._cbs[t]||[]).forEach(function(t){return t.apply(void 0,n)})}},{key:"_addListener",value:function(t,e,n){return this._cbs[t]=(this._cbs[t]||[]).concat(e),this}},{key:"registerComponent",value:function(t,e){var n=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];return this._cmps[t]&&n&&console.warn("A component was alread registered for route node "+t+"."),this._cmps[t]=e,this}},{key:"canDeactivate",value:function(t,e){if(!this.options.autoCleanUp)throw new Error('[router.canDeactivate()] Cannot be used if "autoCleanUp" is set to false');return this.registerComponent(t,{canDeactivate:function(t,n){return e}},!1),this}},{key:"deregisterComponent",value:function(t){this._cmps[t]=void 0}},{key:"canActivate",value:function(t,e){return this._canAct[t]=e,this}},{key:"buildUrl",value:function(t,e){return this._buildUrl(this.buildPath(t,e))}},{key:"_buildUrl",value:function(t){return(this.options.base||"")+(this.options.useHash?"#"+this.options.hashPrefix:"")+t}},{key:"buildPath",value:function(t,e){return this.rootNode.buildPath(t,e)}},{key:"matchPath",value:function(t){var e=this.rootNode.matchPath(t,this.options.trailingSlash);return e?E(e.name,e.params,t):null}},{key:"urlToPath",value:function(t){var e=t.match(/^(?:http|https)\:\/\/(?:[0-9a-z_\-\.\:]+?)(?=\/)(.*)$/),n=e?e[1]:t,r=n.match(/^(.+?)(#.+?)?(\?.+)?$/);if(!r)throw new Error("[router5] Could not parse url "+t);var a=r[1],i=r[2]||"",u=r[3]||"",s=this.options;return(s.useHash?i.replace(new RegExp("^#"+s.hashPrefix),""):s.base?a.replace(new RegExp("^"+s.base),""):a)+u}},{key:"matchUrl",value:function(t){return this.matchPath(this.urlToPath(t))}},{key:"_transition",value:function(t,e,n){var r=this;this.cancel(),this._invokeListeners("$$start",t,e);var a=i(this,t,e,function(a,i){return i=i||t,r._tr=null,a?(a.code===A.TRANSITION_CANCELLED?r._invokeListeners("$$cancel",t,e):r._invokeListeners("$$error",t,e,a),void(n&&n(a))):(r.lastKnownState=i,void(n&&n(null,i)))});return this._tr=a,function(){return!a||a()}}},{key:"cancel",value:function(){this._tr&&this._tr()}},{key:"navigate",value:function(t,e,n,r){void 0===e&&(e={});var a=this;if(void 0===n&&(n={}),!this.started)return void(r&&r({code:A.ROUTER_NOT_STARTED}));var i=this.buildPath(t,e);if(!i){var u={code:A.ROUTE_NOT_FOUND};return r&&r(u),void this._invokeListeners("$$error",null,this.lastKnownState,u)}var s=E(t,e,i);this.lastStateAttempt=s;var o=this.lastKnownState?this.areStatesEqual(this.lastKnownState,this.lastStateAttempt,!1):!1;if(o&&!n.reload){var u={code:A.SAME_STATES};return r&&r(u),void this._invokeListeners("$$error",s,this.lastKnownState,u)}var c=o?null:this.lastKnownState;return this._transition(s,o?null:this.lastKnownState,function(t,e){return t?void(r&&r(t)):(a._invokeListeners("$$success",s,c,n),void(r&&r(null,e)))})}}]),t}();return T.ERR=A,T.transitionPath=t,T.loggerPlugin=n,{RouteNode:y,Router5:T}}); \ No newline at end of file +define("router5",[],function(){"use strict";function t(t,e){function n(t){return t.split(".").reduce(function(t,e){return t.concat(t.length?t[t.length-1]+"."+e:e)},[])}var r=void 0,a=e?n(e.name):[],i=n(t.name),u=Math.min(a.length,i.length);if(e&&e.name===t.name)r=Math.max(u-1,0);else for(r=0;u>r&&a[r]===i[r];r+=1);var o=a.slice(r).reverse(),s=i.slice(r),c=e&&r>0?a[r-1]:"";return{intersection:c,toDeactivate:o,toActivate:s}}function e(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(){var t=function(){return console.group("Router transition")},e=function(){return console.groupEnd("Router transition")};return{name:"LOGGER",onStart:function(){console.info("Router started")},onStop:function(){console.info("Router stopped")},onTransitionStart:function(n,r){e(),t(),console.log("Transition started from state"),console.log(r),console.log("To state"),console.log(n)},onTransitionCancel:function(t,e){console.warn("Transition cancelled")},onTransitionError:function(t,n,r){console.warn("Transition error with code "+r.code),e()},onTransitionSuccess:function(t,n){console.log("Transition success"),e()}}}function r(t,e,n){var r=e.isCancelled,a=e.toState,i=e.fromState,u=e.context,o=e.additionalArgs,s=arguments.length<=3||void 0===arguments[3]?!0:arguments[3],c=Array.isArray(t)?t:Object.keys(t),l=(S({},i),function(t){return"object"==typeof t&&void 0!==t.name&&void 0!==t.params&&void 0!==t.path}),h=function(t){return t.name!==a.name||t.params!==a.params||t.path!==a.path},f=function(e){if(!c.length)return!0;var n="string"==typeof c[0],r=n?c[0]:{},l=n?t[c[0]]:c[0],h=l.apply(u||null,o.concat([a,i,e]));return s&&"boolean"==typeof h?e(h?null:r):h&&"function"==typeof h.then&&h.then(function(t){return e(null,t)},function(){return e(r)}),!1},m=function(t,e){t?n(t):(e&&l(e)&&(h(e)?console.error("[router5][transition] State values changed during transition process and ignored."):a=e),c=c.slice(1),p())},p=function(){if(r())n(null);else{var t=f(m);t&&n(null,a)}};p()}function a(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(e,n,i,u){var o=!1,s=e.getAdditionalArgs(),c=function(){return o},l=function(){return o=!0},h=function(t,r){t||c()||!e.options.autoCleanUp||!function(){var t=_(n.name);Object.keys(e._cmps).filter(function(n){-1===t.indexOf(n)&&e.deregisterComponent(n)})}(),u(c()?{code:A.TRANSITION_CANCELLED}:t,r||n)},f=t(n,i),m=f.toDeactivate,p=f.toActivate,g={isCancelled:c,toState:n,fromState:i,additionalArgs:[]},d=function(t,n,i){var u=m.filter(function(t){return e._cmps[t]&&e._cmps[t].canDeactivate}).reduce(function(t,n){return S({},t,a({},n,e._cmps[n].canDeactivate))},{});r(u,S({},g,{additionalArgs:s}),function(t){return i(t?{code:A.CANNOT_DEACTIVATE,segment:t}:null)})},v=function(t,n,i){var u=p.filter(function(t){return e._canAct[t]}).reduce(function(t,n){return S({},t,a({},n,e._canAct[n]))},{});r(u,S({},g,{additionalArgs:s}),function(t){return i(t?{code:A.CANNOT_ACTIVATE,segment:t}:null)})},y=e.mware,E=function(t,n,a){var i=Array.isArray(e.mware)?e.mware:[e.mware];r(i,S({},g,{context:{cancel:l,router:e}}),function(e,n){var r=e?"object"==typeof e?e:{error:e}:null;a(e?S({code:A.TRANSITION_ERR},r):null,n||t)})},T=(i?[d]:[]).concat(v).concat(y?E:[]);return r(T,g,h),l}var u=function(){function t(t,e){for(var n=0;n$)/g,""):"[a-zA-Z0-9-_.~]+")+")"},s=[{name:"url-parameter",pattern:/^:([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function(t){return new RegExp(o(t[2]))}},{name:"url-parameter-splat",pattern:/^\*([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/,regex:/([^\?]*)/},{name:"url-parameter-matrix",pattern:/^\;([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function(t){return new RegExp(";"+t[1]+"="+o(t[2]))}},{name:"query-parameter",pattern:/^(?:\?|&)(?:\:)?([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/},{name:"delimiter",pattern:/^(\/|\?)/,regex:function(t){return new RegExp("\\"+t[0])}},{name:"sub-delimiter",pattern:/^(\!|\&|\-|_|\.|;)/,regex:function(t){return new RegExp(t[0])}},{name:"fragment",pattern:/^([0-9a-zA-Z]+?)/,regex:function(t){return new RegExp(t[0])}}],c=function k(t){var e=arguments.length<=1||void 0===arguments[1]?[]:arguments[1],n=s.some(function(n){var r=t.match(n.pattern);return r?(e.push({type:n.name,match:r[0],val:r.slice(1,2),otherVal:r.slice(2),regex:n.regex instanceof Function?n.regex(r):n.regex}),r[0].length0,this.hasSpatParam=this.tokens.filter(function(t){return/splat$/.test(t.type)}).length>0,this.hasMatrixParams=this.tokens.filter(function(t){return/matrix$/.test(t.type)}).length>0,this.hasQueryParams=this.tokens.filter(function(t){return"query-parameter"===t.type}).length>0,this.urlParams=this.hasUrlParams?this.tokens.filter(function(t){return/^url-parameter/.test(t.type)}).map(function(t){return t.val.slice(0,1)}).reduce(function(t,e){return t.concat(e)}):[],this.queryParams=this.hasQueryParams?this.tokens.filter(function(t){return"query-parameter"===t.type}).map(function(t){return t.val}).reduce(function(t,e){return t.concat(e)}):[],this.params=this.urlParams.concat(this.queryParams),this.source=this.tokens.filter(function(t){return void 0!==t.regex}).map(function(t){return t.regex.source}).join("")}return u(t,null,[{key:"createPath",value:function(e){return new t(e)}},{key:"serialise",value:function(t,e){return p(t,e)}}]),u(t,[{key:"_urlMatch",value:function(t,e){var n=this,r=t.match(e);return r?this.urlParams.length?r.slice(1,this.urlParams.length+1).reduce(function(t,e,r){return t[n.urlParams[r]]=e,t},{}):{}:null}},{key:"match",value:function n(t){var e=this,r=arguments.length<=1||void 0===arguments[1]?0:arguments[1],a=l(this.source,r),n=this._urlMatch(t,new RegExp("^"+a+(this.hasQueryParams?"\\?.*$":"$")));if(!n||!this.hasQueryParams)return n;var i=f(t),u=Object.keys(i).filter(function(t){return-1===e.queryParams.indexOf(t)});return 0===u.length?(Object.keys(i).forEach(function(t){return n[t]=i[t]}),n):null}},{key:"partialMatch",value:function(t){var e=this,n=arguments.length<=1||void 0===arguments[1]?0:arguments[1],r=l(this.source,n),a=this._urlMatch(t,new RegExp("^"+r));if(!a)return a;if(!this.hasQueryParams)return a;var i=f(t);return Object.keys(i).filter(function(t){return e.queryParams.indexOf(t)>=0}).forEach(function(t){return h(a,t,i[t])}),a}},{key:"build",value:function(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=arguments.length<=1||void 0===arguments[1]?{ignoreConstraints:!1,ignoreSearch:!1}:arguments[1];if(this.urlParams.some(function(e){return void 0===t[e]}))throw new Error("Missing parameters");if(!e.ignoreConstraints){var n=this.tokens.filter(function(t){return/^url-parameter/.test(t.type)&&!/-splat$/.test(t.type)}).every(function(e){return new RegExp("^"+o(e.otherVal[0])+"$").test(t[e.val])});if(!n)throw new Error("Some parameters are of invalid format")}var r=this.tokens.filter(function(t){return"query-parameter"!==t.type}).map(function(e){return"url-parameter-matrix"===e.type?";"+e.val[0]+"="+t[e.val[0]]:/^url-parameter/.test(e.type)?t[e.val[0]]:e.match}).join("");if(e.ignoreSearch)return r;var a=this.queryParams.filter(function(e){return-1!==Object.keys(t).indexOf(e)}).map(function(e){return p(e,t[e])}).join("&");return r+(a?"?"+a:"")}}]),t}(),d=function(t){return void 0!==t&&null!==t&&""!==t},v=function(t,e){if(-1===t.indexOf("?"))return t;var n=t.split("?"),r=n[0],a=n[1],i=a.split("&").reduce(function(t,n){var r=n.split("="),a=r[0],i=decodeURIComponent(r[1]);return-1===e.indexOf(a)&&(t[a]=i||""),t},{}),u=Object.keys(i).map(function(t){return[t].concat(d(i[t])?encodeURIComponent(i[t]):[])}).map(function(t){return t.join("=")}).join("&");return r+(u?"?"+u:"")},y=function(){function t(){var n=arguments.length<=0||void 0===arguments[0]?"":arguments[0],r=arguments.length<=1||void 0===arguments[1]?"":arguments[1],a=arguments.length<=2||void 0===arguments[2]?[]:arguments[2];return e(this,t),this.name=n,this.path=r,this.parser=r?new g(r):null,this.children=[],this.add(a),this}return u(t,[{key:"add",value:function(e){var n=this;if(void 0!==e&&null!==e){if(e instanceof Array)return void e.forEach(function(t){return n.add(t)});if(!(e instanceof t||e instanceof Object))throw new Error("RouteNode.add() expects routes to be an Object or an instance of RouteNode.");if(e instanceof Object){if(!e.name||!e.path)throw new Error("RouteNode.add() expects routes to have a name and a path defined.");e=new t(e.name,e.path,e.children)}if(-1!==this.children.map(function(t){return t.name}).indexOf(e.name))throw new Error('Alias "'+e.name+'" is already defined in route node');if(-1!==this.children.map(function(t){return t.path}).indexOf(e.path))throw new Error('Path "'+e.path+'" is already defined in route node');var r=e.name.split(".");if(1===r.length)this.children.push(e),this.children.sort(function(t,e){if("/"===t.path)return 1;if("/"===e.path)return-1;var n=t.parser.hasUrlParams||t.parser.hasSpatParam,r=e.parser.hasUrlParams||e.parser.hasSpatParam;if(!n&&!r)return t.path&&e.path?t.path.lengtha?1:0});else{var a=this.getSegmentsByName(r.slice(0,-1).join("."));if(!a)throw new Error("Could not add route named '"+e.name+"', parent is missing.");a[a.length-1].add(new t(r[r.length-1],e.path,e.children))}return this}}},{key:"addNode",value:function(e,n){return this.add(new t(e,n)),this}},{key:"getSegmentsByName",value:function(t){var e=function(t,e){var n=e.filter(function(e){return e.name===t});return n.length?n[0]:void 0},n=[],r=t.split("."),a=this.children,i=r.every(function(t){var r=e(t,a);return r?(a=r.children,n.push(r),!0):!1});return i?n:null}},{key:"getSegmentsMatchingPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],n=function i(t,n,r){var a=function(a){var u=t[a],o=u.parser.partialMatch(n),s=void 0;if(!o&&e)o=u.parser.match(n,!0),s="";else if(o){var c=u.parser.build(o,{ignoreSearch:!0});s=v(n.replace(c,""),u.parser.queryParams),e&&"/"===s&&!/\/$/.test(c)&&(s="")}return o?(r.push(u),Object.keys(o).forEach(function(t){return r.params[t]=o[t]}),s.length?u.children.length?{v:i(u.children,s,r)}:{v:null}:{v:r}):void 0};for(var u in t){var o=a(u);if("object"==typeof o)return o.v}return null},r=this.parser?[this]:this.children,a=[];return a.params={},n(r,t,a)}},{key:"getPathFromSegments",value:function(t){return t?t.map(function(t){return t.path}).join(""):null}},{key:"getPath",value:function(t){return this.getPathFromSegments(this.getSegmentsByName(t))}},{key:"buildPathFromSegments",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if(!t)return null;var n=t.filter(function(t){return t.parser.hasQueryParams}).map(function(t){return t.parser.queryParams}),r=n.length?n.reduce(function(t,e){return t.concat(e)}).filter(function(t){return-1!==Object.keys(e).indexOf(t)}).map(function(t){return g.serialise(t,e[t])}).join("&"):null;return t.map(function(t){return t.parser.build(e,{ignoreSearch:!0})}).join("")+(r?"?"+r:"")}},{key:"buildPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return this.buildPathFromSegments(this.getSegmentsByName(t),e)}},{key:"getMatchPathFromSegments",value:function(t){if(!t||!t.length)return null;var e=t.map(function(t){return t.name}).join("."),n=t.params;return{name:e,params:n}}},{key:"matchPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];return this.getMatchPathFromSegments(this.getSegmentsMatchingPath(t,e))}}]),t}(),A={ROUTER_NOT_STARTED:"NOT_STARTED",ROUTER_ALREADY_STARTED:"ALREADY_STARTED",ROUTE_NOT_FOUND:"ROUTE_NOT_FOUND",SAME_STATES:"SAME_STATES",CANNOT_DEACTIVATE:"CANNOT_DEACTIVATE",CANNOT_ACTIVATE:"CANNOT_ACTIVATE",TRANSITION_ERR:"TRANSITION_ERR",TRANSITION_CANCELLED:"CANCELLED"},S=Object.assign||function(t){for(var e=1;e0&&("string"==typeof e[0]&&(a=e[0]),"object"==typeof e[0]&&(i=e[0]));var o=function(e,n){var a=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];r&&r(e,n),e||t._invokeListeners("$$success",n,null,{replace:!0}),e&&a&&t._invokeListeners("$$error",n,null,e)};return void 0===a&&void 0===i&&this.getLocation&&(a=this.getLocation()),i?(this.lastKnownState=i,o(null,i)):!function(){i=void 0===a?null:t.matchPath(a);var e=function(){return t.navigate(u.defaultRoute,u.defaultParams,{replace:!0},function(t,e){return o(t,e,!1)})};i?(t.lastStateAttempt=i,t._transition(t.lastStateAttempt,t.lastKnownState,function(t,n){t?u.defaultRoute?e():o(t,null,!1):o(null,n)})):u.defaultRoute?e():o({code:A.ROUTE_NOT_FOUND,path:a},null)}(),this}},{key:"stop",value:function(){return this.started?(this.lastKnownState=null,this.lastStateAttempt=null,this.started=!1,this._invokeListeners("$stop"),this):this}},{key:"getState",value:function(){return this.lastKnownState}},{key:"isActive",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],r=arguments.length<=3||void 0===arguments[3]?!0:arguments[3],a=this.getState();return a?n||a.name===t?this.areStatesEqual(E(t,e),a,r):this.areStatesDescendants(E(t,e),a):!1}},{key:"areStatesEqual",value:function(t,e){var n=this,r=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];if(t.name!==e.name)return!1;var a=function(t){return n.rootNode.getSegmentsByName(t).map(function(t){return t.parser[r?"urlParams":"params"]}).reduce(function(t,e){return t.concat(e)},[])},i=a(t.name),u=a(e.name);return i.length===u.length&&i.every(function(n){return t.params[n]===e.params[n]})}},{key:"areStatesDescendants",value:function(t,e){var n=new RegExp("^"+t.name+"\\.(.*)$");return n.test(e.name)?Object.keys(t.params).every(function(n){return t.params[n]===e.params[n]}):!1}},{key:"_invokeListeners",value:function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];(this._cbs[t]||[]).forEach(function(t){return t.apply(void 0,n)})}},{key:"_addListener",value:function(t,e,n){return this._cbs[t]=(this._cbs[t]||[]).concat(e),this}},{key:"registerComponent",value:function(t,e){var n=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];return this._cmps[t]&&n&&console.warn("A component was alread registered for route node "+t+"."),this._cmps[t]=e,this}},{key:"canDeactivate",value:function(t,e){if(!this.options.autoCleanUp)throw new Error('[router.canDeactivate()] Cannot be used if "autoCleanUp" is set to false');return this.registerComponent(t,{canDeactivate:function(t,n){return e}},!1),this}},{key:"deregisterComponent",value:function(t){this._cmps[t]=void 0}},{key:"canActivate",value:function(t,e){return this._canAct[t]=e,this}},{key:"buildUrl",value:function(t,e){return this._buildUrl(this.buildPath(t,e))}},{key:"_buildUrl",value:function(t){return(this.options.base||"")+(this.options.useHash?"#"+this.options.hashPrefix:"")+t}},{key:"buildPath",value:function(t,e){return this.rootNode.buildPath(t,e)}},{key:"matchPath",value:function(t){var e=this.rootNode.matchPath(t,this.options.trailingSlash);return e?E(e.name,e.params,t):null}},{key:"urlToPath",value:function(t){var e=t.match(/^(?:http|https)\:\/\/(?:[0-9a-z_\-\.\:]+?)(?=\/)(.*)$/),n=e?e[1]:t,r=n.match(/^(.+?)(#.+?)?(\?.+)?$/);if(!r)throw new Error("[router5] Could not parse url "+t);var a=r[1],i=r[2]||"",u=r[3]||"",o=this.options;return(o.useHash?i.replace(new RegExp("^#"+o.hashPrefix),""):o.base?a.replace(new RegExp("^"+o.base),""):a)+u}},{key:"matchUrl",value:function(t){return this.matchPath(this.urlToPath(t))}},{key:"_transition",value:function(t,e,n){var r=this;this.cancel(),this._invokeListeners("$$start",t,e);var a=i(this,t,e,function(a,i){return i=i||t,r._tr=null,a?(a.code===A.TRANSITION_CANCELLED?r._invokeListeners("$$cancel",t,e):r._invokeListeners("$$error",t,e,a),void(n&&n(a))):(r.lastKnownState=i,void(n&&n(null,i)))});return this._tr=a,function(){return!a||a()}}},{key:"cancel",value:function(){this._tr&&this._tr()}},{key:"navigate",value:function(t,e,n,r){void 0===e&&(e={});var a=this;if(void 0===n&&(n={}),!this.started)return void(r&&r({code:A.ROUTER_NOT_STARTED}));var i=this.buildPath(t,e);if(!i){var u={code:A.ROUTE_NOT_FOUND};return r&&r(u),void this._invokeListeners("$$error",null,this.lastKnownState,u)}var o=E(t,e,i);this.lastStateAttempt=o;var s=this.lastKnownState?this.areStatesEqual(this.lastKnownState,this.lastStateAttempt,!1):!1;if(s&&!n.reload){var u={code:A.SAME_STATES};return r&&r(u),void this._invokeListeners("$$error",o,this.lastKnownState,u)}var c=s?null:this.lastKnownState;return this._transition(o,s?null:this.lastKnownState,function(t,e){return t?void(r&&r(t)):(a._invokeListeners("$$success",o,c,n),void(r&&r(null,e)))})}}]),t}();return T.ERR=A,T.transitionPath=t,T.loggerPlugin=n,{RouteNode:y,Router5:T}}); \ No newline at end of file diff --git a/dist/browser/router5.js b/dist/browser/router5.js index b88e6d33..08dc8ac3 100644 --- a/dist/browser/router5.js +++ b/dist/browser/router5.js @@ -1,6 +1,6 @@ /** * @license - * @version 1.1.0 + * @version 1.1.1 * The MIT License (MIT) * * Copyright (c) 2015 Thomas Roch @@ -160,12 +160,12 @@ return searchPart.split('&').map(function (_) { return _.split('='); }).reduce(function (obj, m) { - return appendQueryParam(obj, m[0], m[1]); + return appendQueryParam(obj, m[0], m[1] ? decodeURIComponent(m[1]) : m[1]); }, {}); }; var toSerialisable = function toSerialisable(val) { - return val !== undefined && val !== null && val !== '' ? '=' + val : ''; + return val !== undefined && val !== null && val !== '' ? '=' + encodeURIComponent(val) : ''; }; var _serialise = function _serialise(key, val) { @@ -369,13 +369,13 @@ var remainingSearchParams = searchPart.split('&').reduce(function (obj, p) { var splitParam = p.split('='); var key = splitParam[0]; - var val = splitParam[1]; + var val = decodeURIComponent(splitParam[1]); if (params.indexOf(key) === -1) obj[key] = val || ''; return obj; }, {}); var remainingSearchPart = Object.keys(remainingSearchParams).map(function (p) { - return [p].concat(isSerialisable(remainingSearchParams[p]) ? remainingSearchParams[p] : []); + return [p].concat(isSerialisable(remainingSearchParams[p]) ? encodeURIComponent(remainingSearchParams[p]) : []); }).map(function (p) { return p.join('='); }).join('&'); diff --git a/dist/browser/router5.min.js b/dist/browser/router5.min.js index 6ce564c7..479d1e04 100644 --- a/dist/browser/router5.min.js +++ b/dist/browser/router5.min.js @@ -1 +1 @@ -!function(t){"use strict";function e(t,e){function n(t){return t.split(".").reduce(function(t,e){return t.concat(t.length?t[t.length-1]+"."+e:e)},[])}var r=void 0,a=e?n(e.name):[],i=n(t.name),u=Math.min(a.length,i.length);if(e&&e.name===t.name)r=Math.max(u-1,0);else for(r=0;u>r&&a[r]===i[r];r+=1);var s=a.slice(r).reverse(),o=i.slice(r),c=e&&r>0?a[r-1]:"";return{intersection:c,toDeactivate:s,toActivate:o}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(){var t=function(){return console.group("Router transition")},e=function(){return console.groupEnd("Router transition")};return{name:"LOGGER",onStart:function(){console.info("Router started")},onStop:function(){console.info("Router stopped")},onTransitionStart:function(n,r){e(),t(),console.log("Transition started from state"),console.log(r),console.log("To state"),console.log(n)},onTransitionCancel:function(t,e){console.warn("Transition cancelled")},onTransitionError:function(t,n,r){console.warn("Transition error with code "+r.code),e()},onTransitionSuccess:function(t,n){console.log("Transition success"),e()}}}function a(t,e,n){var r=e.isCancelled,a=e.toState,i=e.fromState,u=e.context,s=e.additionalArgs,o=arguments.length<=3||void 0===arguments[3]?!0:arguments[3],c=Array.isArray(t)?t:Object.keys(t),l=(_({},i),function(t){return"object"==typeof t&&void 0!==t.name&&void 0!==t.params&&void 0!==t.path}),h=function(t){return t.name!==a.name||t.params!==a.params||t.path!==a.path},f=function(e){if(!c.length)return!0;var n="string"==typeof c[0],r=n?c[0]:{},l=n?t[c[0]]:c[0],h=l.apply(u||null,s.concat([a,i,e]));return o&&"boolean"==typeof h?e(h?null:r):h&&"function"==typeof h.then&&h.then(function(t){return e(null,t)},function(){return e(r)}),!1},m=function(t,e){t?n(t):(e&&l(e)&&(h(e)?console.error("[router5][transition] State values changed during transition process and ignored."):a=e),c=c.slice(1),g())},g=function(){if(r())n(null);else{var t=f(m);t&&n(null,a)}};g()}function i(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function u(t,n,r,u){var s=!1,o=t.getAdditionalArgs(),c=function(){return s},l=function(){return s=!0},h=function(e,r){e||c()||!t.options.autoCleanUp||!function(){var e=E(n.name);Object.keys(t._cmps).filter(function(n){-1===e.indexOf(n)&&t.deregisterComponent(n)})}(),u(c()?{code:S.TRANSITION_CANCELLED}:e,r||n)},f=e(n,r),m=f.toDeactivate,g=f.toActivate,p={isCancelled:c,toState:n,fromState:r,additionalArgs:[]},d=function(e,n,r){var u=m.filter(function(e){return t._cmps[e]&&t._cmps[e].canDeactivate}).reduce(function(e,n){return _({},e,i({},n,t._cmps[n].canDeactivate))},{});a(u,_({},p,{additionalArgs:o}),function(t){return r(t?{code:S.CANNOT_DEACTIVATE,segment:t}:null)})},v=function(e,n,r){var u=g.filter(function(e){return t._canAct[e]}).reduce(function(e,n){return _({},e,i({},n,t._canAct[n]))},{});a(u,_({},p,{additionalArgs:o}),function(t){return r(t?{code:S.CANNOT_ACTIVATE,segment:t}:null)})},y=t.mware,A=function(e,n,r){var i=Array.isArray(t.mware)?t.mware:[t.mware];a(i,_({},p,{context:{cancel:l,router:t}}),function(t,n){var a=t?"object"==typeof t?t:{error:t}:null;r(t?_({code:S.TRANSITION_ERR},a):null,n||e)})},T=(r?[d]:[]).concat(v).concat(y?A:[]);return a(T,p,h),l}var s=function(){function t(t,e){for(var n=0;n$)/g,""):"[a-zA-Z0-9-_.~]+")+")"},c=[{name:"url-parameter",pattern:/^:([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function(t){return new RegExp(o(t[2]))}},{name:"url-parameter-splat",pattern:/^\*([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/,regex:/([^\?]*)/},{name:"url-parameter-matrix",pattern:/^\;([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function(t){return new RegExp(";"+t[1]+"="+o(t[2]))}},{name:"query-parameter",pattern:/^(?:\?|&)(?:\:)?([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/},{name:"delimiter",pattern:/^(\/|\?)/,regex:function(t){return new RegExp("\\"+t[0])}},{name:"sub-delimiter",pattern:/^(\!|\&|\-|_|\.|;)/,regex:function(t){return new RegExp(t[0])}},{name:"fragment",pattern:/^([0-9a-zA-Z]+?)/,regex:function(t){return new RegExp(t[0])}}],l=function w(t){var e=arguments.length<=1||void 0===arguments[1]?[]:arguments[1],n=c.some(function(n){var r=t.match(n.pattern);return r?(e.push({type:n.name,match:r[0],val:r.slice(1,2),otherVal:r.slice(2),regex:n.regex instanceof Function?n.regex(r):n.regex}),r[0].length0,this.hasSpatParam=this.tokens.filter(function(t){return/splat$/.test(t.type)}).length>0,this.hasMatrixParams=this.tokens.filter(function(t){return/matrix$/.test(t.type)}).length>0,this.hasQueryParams=this.tokens.filter(function(t){return"query-parameter"===t.type}).length>0,this.urlParams=this.hasUrlParams?this.tokens.filter(function(t){return/^url-parameter/.test(t.type)}).map(function(t){return t.val.slice(0,1)}).reduce(function(t,e){return t.concat(e)}):[],this.queryParams=this.hasQueryParams?this.tokens.filter(function(t){return"query-parameter"===t.type}).map(function(t){return t.val}).reduce(function(t,e){return t.concat(e)}):[],this.params=this.urlParams.concat(this.queryParams),this.source=this.tokens.filter(function(t){return void 0!==t.regex}).map(function(t){return t.regex.source}).join("")}return s(t,null,[{key:"createPath",value:function(e){return new t(e)}},{key:"serialise",value:function(t,e){return p(t,e)}}]),s(t,[{key:"_urlMatch",value:function(t,e){var n=this,r=t.match(e);return r?this.urlParams.length?r.slice(1,this.urlParams.length+1).reduce(function(t,e,r){return t[n.urlParams[r]]=e,t},{}):{}:null}},{key:"match",value:function e(t){var n=this,r=arguments.length<=1||void 0===arguments[1]?0:arguments[1],a=h(this.source,r),e=this._urlMatch(t,new RegExp("^"+a+(this.hasQueryParams?"\\?.*$":"$")));if(!e||!this.hasQueryParams)return e;var i=m(t),u=Object.keys(i).filter(function(t){return-1===n.queryParams.indexOf(t)});return 0===u.length?(Object.keys(i).forEach(function(t){return e[t]=i[t]}),e):null}},{key:"partialMatch",value:function(t){var e=this,n=arguments.length<=1||void 0===arguments[1]?0:arguments[1],r=h(this.source,n),a=this._urlMatch(t,new RegExp("^"+r));if(!a)return a;if(!this.hasQueryParams)return a;var i=m(t);return Object.keys(i).filter(function(t){return e.queryParams.indexOf(t)>=0}).forEach(function(t){return f(a,t,i[t])}),a}},{key:"build",value:function(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=arguments.length<=1||void 0===arguments[1]?{ignoreConstraints:!1,ignoreSearch:!1}:arguments[1];if(this.urlParams.some(function(e){return void 0===t[e]}))throw new Error("Missing parameters");if(!e.ignoreConstraints){var n=this.tokens.filter(function(t){return/^url-parameter/.test(t.type)&&!/-splat$/.test(t.type)}).every(function(e){return new RegExp("^"+o(e.otherVal[0])+"$").test(t[e.val])});if(!n)throw new Error("Some parameters are of invalid format")}var r=this.tokens.filter(function(t){return"query-parameter"!==t.type}).map(function(e){return"url-parameter-matrix"===e.type?";"+e.val[0]+"="+t[e.val[0]]:/^url-parameter/.test(e.type)?t[e.val[0]]:e.match}).join("");if(e.ignoreSearch)return r;var a=this.queryParams.filter(function(e){return-1!==Object.keys(t).indexOf(e)}).map(function(e){return p(e,t[e])}).join("&");return r+(a?"?"+a:"")}}]),t}(),v=function(t){return void 0!==t&&null!==t&&""!==t},y=function(t,e){if(-1===t.indexOf("?"))return t;var n=t.split("?"),r=n[0],a=n[1],i=a.split("&").reduce(function(t,n){var r=n.split("="),a=r[0],i=r[1];return-1===e.indexOf(a)&&(t[a]=i||""),t},{}),u=Object.keys(i).map(function(t){return[t].concat(v(i[t])?i[t]:[])}).map(function(t){return t.join("=")}).join("&");return r+(u?"?"+u:"")},A=function(){function t(){var e=arguments.length<=0||void 0===arguments[0]?"":arguments[0],r=arguments.length<=1||void 0===arguments[1]?"":arguments[1],a=arguments.length<=2||void 0===arguments[2]?[]:arguments[2];return n(this,t),this.name=e,this.path=r,this.parser=r?new d(r):null,this.children=[],this.add(a),this}return s(t,[{key:"add",value:function(e){var n=this;if(void 0!==e&&null!==e){if(e instanceof Array)return void e.forEach(function(t){return n.add(t)});if(!(e instanceof t||e instanceof Object))throw new Error("RouteNode.add() expects routes to be an Object or an instance of RouteNode.");if(e instanceof Object){if(!e.name||!e.path)throw new Error("RouteNode.add() expects routes to have a name and a path defined.");e=new t(e.name,e.path,e.children)}if(-1!==this.children.map(function(t){return t.name}).indexOf(e.name))throw new Error('Alias "'+e.name+'" is already defined in route node');if(-1!==this.children.map(function(t){return t.path}).indexOf(e.path))throw new Error('Path "'+e.path+'" is already defined in route node');var r=e.name.split(".");if(1===r.length)this.children.push(e),this.children.sort(function(t,e){if("/"===t.path)return 1;if("/"===e.path)return-1;var n=t.parser.hasUrlParams||t.parser.hasSpatParam,r=e.parser.hasUrlParams||e.parser.hasSpatParam;if(!n&&!r)return t.path&&e.path?t.path.lengtha?1:0});else{var a=this.getSegmentsByName(r.slice(0,-1).join("."));if(!a)throw new Error("Could not add route named '"+e.name+"', parent is missing.");a[a.length-1].add(new t(r[r.length-1],e.path,e.children))}return this}}},{key:"addNode",value:function(e,n){return this.add(new t(e,n)),this}},{key:"getSegmentsByName",value:function(t){var e=function(t,e){var n=e.filter(function(e){return e.name===t});return n.length?n[0]:void 0},n=[],r=t.split("."),a=this.children,i=r.every(function(t){var r=e(t,a);return r?(a=r.children,n.push(r),!0):!1});return i?n:null}},{key:"getSegmentsMatchingPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],n=function i(t,n,r){var a=function(a){var u=t[a],s=u.parser.partialMatch(n),o=void 0;if(!s&&e)s=u.parser.match(n,!0),o="";else if(s){var c=u.parser.build(s,{ignoreSearch:!0});o=y(n.replace(c,""),u.parser.queryParams),e&&"/"===o&&!/\/$/.test(c)&&(o="")}return s?(r.push(u),Object.keys(s).forEach(function(t){return r.params[t]=s[t]}),o.length?u.children.length?{v:i(u.children,o,r)}:{v:null}:{v:r}):void 0};for(var u in t){var s=a(u);if("object"==typeof s)return s.v}return null},r=this.parser?[this]:this.children,a=[];return a.params={},n(r,t,a)}},{key:"getPathFromSegments",value:function(t){return t?t.map(function(t){return t.path}).join(""):null}},{key:"getPath",value:function(t){return this.getPathFromSegments(this.getSegmentsByName(t))}},{key:"buildPathFromSegments",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if(!t)return null;var n=t.filter(function(t){return t.parser.hasQueryParams}).map(function(t){return t.parser.queryParams}),r=n.length?n.reduce(function(t,e){return t.concat(e)}).filter(function(t){return-1!==Object.keys(e).indexOf(t)}).map(function(t){return d.serialise(t,e[t])}).join("&"):null;return t.map(function(t){return t.parser.build(e,{ignoreSearch:!0})}).join("")+(r?"?"+r:"")}},{key:"buildPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return this.buildPathFromSegments(this.getSegmentsByName(t),e)}},{key:"getMatchPathFromSegments",value:function(t){if(!t||!t.length)return null;var e=t.map(function(t){return t.name}).join("."),n=t.params;return{name:e,params:n}}},{key:"matchPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];return this.getMatchPathFromSegments(this.getSegmentsMatchingPath(t,e))}}]),t}(),S={ROUTER_NOT_STARTED:"NOT_STARTED",ROUTER_ALREADY_STARTED:"ALREADY_STARTED",ROUTE_NOT_FOUND:"ROUTE_NOT_FOUND",SAME_STATES:"SAME_STATES",CANNOT_DEACTIVATE:"CANNOT_DEACTIVATE",CANNOT_ACTIVATE:"CANNOT_ACTIVATE",TRANSITION_ERR:"TRANSITION_ERR",TRANSITION_CANCELLED:"CANCELLED"},_=Object.assign||function(t){for(var e=1;e0&&("string"==typeof e[0]&&(a=e[0]),"object"==typeof e[0]&&(i=e[0]));var s=function(e,n){var a=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];r&&r(e,n),e||t._invokeListeners("$$success",n,null,{replace:!0}),e&&a&&t._invokeListeners("$$error",n,null,e)};return void 0===a&&void 0===i&&this.getLocation&&(a=this.getLocation()),i?(this.lastKnownState=i,s(null,i)):!function(){i=void 0===a?null:t.matchPath(a);var e=function(){return t.navigate(u.defaultRoute,u.defaultParams,{replace:!0},function(t,e){return s(t,e,!1)})};i?(t.lastStateAttempt=i,t._transition(t.lastStateAttempt,t.lastKnownState,function(t,n){t?u.defaultRoute?e():s(t,null,!1):s(null,n)})):u.defaultRoute?e():s({code:S.ROUTE_NOT_FOUND,path:a},null)}(),this}},{key:"stop",value:function(){return this.started?(this.lastKnownState=null,this.lastStateAttempt=null,this.started=!1,this._invokeListeners("$stop"),this):this}},{key:"getState",value:function(){return this.lastKnownState}},{key:"isActive",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],r=arguments.length<=3||void 0===arguments[3]?!0:arguments[3],a=this.getState();return a?n||a.name===t?this.areStatesEqual(T(t,e),a,r):this.areStatesDescendants(T(t,e),a):!1}},{key:"areStatesEqual",value:function(t,e){var n=this,r=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];if(t.name!==e.name)return!1;var a=function(t){return n.rootNode.getSegmentsByName(t).map(function(t){return t.parser[r?"urlParams":"params"]}).reduce(function(t,e){return t.concat(e)},[])},i=a(t.name),u=a(e.name);return i.length===u.length&&i.every(function(n){return t.params[n]===e.params[n]})}},{key:"areStatesDescendants",value:function(t,e){var n=new RegExp("^"+t.name+"\\.(.*)$");return n.test(e.name)?Object.keys(t.params).every(function(n){return t.params[n]===e.params[n]}):!1}},{key:"_invokeListeners",value:function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];(this._cbs[t]||[]).forEach(function(t){return t.apply(void 0,n)})}},{key:"_addListener",value:function(t,e,n){return this._cbs[t]=(this._cbs[t]||[]).concat(e),this}},{key:"registerComponent",value:function(t,e){var n=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];return this._cmps[t]&&n&&console.warn("A component was alread registered for route node "+t+"."),this._cmps[t]=e,this}},{key:"canDeactivate",value:function(t,e){if(!this.options.autoCleanUp)throw new Error('[router.canDeactivate()] Cannot be used if "autoCleanUp" is set to false');return this.registerComponent(t,{canDeactivate:function(t,n){return e}},!1),this}},{key:"deregisterComponent",value:function(t){this._cmps[t]=void 0}},{key:"canActivate",value:function(t,e){return this._canAct[t]=e,this}},{key:"buildUrl",value:function(t,e){return this._buildUrl(this.buildPath(t,e))}},{key:"_buildUrl",value:function(t){return(this.options.base||"")+(this.options.useHash?"#"+this.options.hashPrefix:"")+t}},{key:"buildPath",value:function(t,e){return this.rootNode.buildPath(t,e)}},{key:"matchPath",value:function(t){var e=this.rootNode.matchPath(t,this.options.trailingSlash);return e?T(e.name,e.params,t):null}},{key:"urlToPath",value:function(t){var e=t.match(/^(?:http|https)\:\/\/(?:[0-9a-z_\-\.\:]+?)(?=\/)(.*)$/),n=e?e[1]:t,r=n.match(/^(.+?)(#.+?)?(\?.+)?$/);if(!r)throw new Error("[router5] Could not parse url "+t);var a=r[1],i=r[2]||"",u=r[3]||"",s=this.options;return(s.useHash?i.replace(new RegExp("^#"+s.hashPrefix),""):s.base?a.replace(new RegExp("^"+s.base),""):a)+u}},{key:"matchUrl",value:function(t){return this.matchPath(this.urlToPath(t))}},{key:"_transition",value:function(t,e,n){var r=this;this.cancel(),this._invokeListeners("$$start",t,e);var a=u(this,t,e,function(a,i){return i=i||t,r._tr=null,a?(a.code===S.TRANSITION_CANCELLED?r._invokeListeners("$$cancel",t,e):r._invokeListeners("$$error",t,e,a),void(n&&n(a))):(r.lastKnownState=i,void(n&&n(null,i)))});return this._tr=a,function(){return!a||a()}}},{key:"cancel",value:function(){this._tr&&this._tr()}},{key:"navigate",value:function(t,e,n,r){void 0===e&&(e={});var a=this;if(void 0===n&&(n={}),!this.started)return void(r&&r({code:S.ROUTER_NOT_STARTED}));var i=this.buildPath(t,e);if(!i){var u={code:S.ROUTE_NOT_FOUND};return r&&r(u),void this._invokeListeners("$$error",null,this.lastKnownState,u)}var s=T(t,e,i);this.lastStateAttempt=s;var o=this.lastKnownState?this.areStatesEqual(this.lastKnownState,this.lastStateAttempt,!1):!1;if(o&&!n.reload){var u={code:S.SAME_STATES};return r&&r(u),void this._invokeListeners("$$error",s,this.lastKnownState,u)}var c=o?null:this.lastKnownState;return this._transition(s,o?null:this.lastKnownState,function(t,e){return t?void(r&&r(t)):(a._invokeListeners("$$success",s,c,n),void(r&&r(null,e)))})}}]),t}();k.ERR=S,k.transitionPath=e,k.loggerPlugin=r,t.RouteNode=A,t.Router5=k}(window); \ No newline at end of file +!function(t){"use strict";function e(t,e){function n(t){return t.split(".").reduce(function(t,e){return t.concat(t.length?t[t.length-1]+"."+e:e)},[])}var r=void 0,a=e?n(e.name):[],i=n(t.name),u=Math.min(a.length,i.length);if(e&&e.name===t.name)r=Math.max(u-1,0);else for(r=0;u>r&&a[r]===i[r];r+=1);var o=a.slice(r).reverse(),s=i.slice(r),c=e&&r>0?a[r-1]:"";return{intersection:c,toDeactivate:o,toActivate:s}}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(){var t=function(){return console.group("Router transition")},e=function(){return console.groupEnd("Router transition")};return{name:"LOGGER",onStart:function(){console.info("Router started")},onStop:function(){console.info("Router stopped")},onTransitionStart:function(n,r){e(),t(),console.log("Transition started from state"),console.log(r),console.log("To state"),console.log(n)},onTransitionCancel:function(t,e){console.warn("Transition cancelled")},onTransitionError:function(t,n,r){console.warn("Transition error with code "+r.code),e()},onTransitionSuccess:function(t,n){console.log("Transition success"),e()}}}function a(t,e,n){var r=e.isCancelled,a=e.toState,i=e.fromState,u=e.context,o=e.additionalArgs,s=arguments.length<=3||void 0===arguments[3]?!0:arguments[3],c=Array.isArray(t)?t:Object.keys(t),l=(_({},i),function(t){return"object"==typeof t&&void 0!==t.name&&void 0!==t.params&&void 0!==t.path}),h=function(t){return t.name!==a.name||t.params!==a.params||t.path!==a.path},f=function(e){if(!c.length)return!0;var n="string"==typeof c[0],r=n?c[0]:{},l=n?t[c[0]]:c[0],h=l.apply(u||null,o.concat([a,i,e]));return s&&"boolean"==typeof h?e(h?null:r):h&&"function"==typeof h.then&&h.then(function(t){return e(null,t)},function(){return e(r)}),!1},m=function(t,e){t?n(t):(e&&l(e)&&(h(e)?console.error("[router5][transition] State values changed during transition process and ignored."):a=e),c=c.slice(1),p())},p=function(){if(r())n(null);else{var t=f(m);t&&n(null,a)}};p()}function i(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function u(t,n,r,u){var o=!1,s=t.getAdditionalArgs(),c=function(){return o},l=function(){return o=!0},h=function(e,r){e||c()||!t.options.autoCleanUp||!function(){var e=E(n.name);Object.keys(t._cmps).filter(function(n){-1===e.indexOf(n)&&t.deregisterComponent(n)})}(),u(c()?{code:S.TRANSITION_CANCELLED}:e,r||n)},f=e(n,r),m=f.toDeactivate,p=f.toActivate,g={isCancelled:c,toState:n,fromState:r,additionalArgs:[]},d=function(e,n,r){var u=m.filter(function(e){return t._cmps[e]&&t._cmps[e].canDeactivate}).reduce(function(e,n){return _({},e,i({},n,t._cmps[n].canDeactivate))},{});a(u,_({},g,{additionalArgs:s}),function(t){return r(t?{code:S.CANNOT_DEACTIVATE,segment:t}:null)})},v=function(e,n,r){var u=p.filter(function(e){return t._canAct[e]}).reduce(function(e,n){return _({},e,i({},n,t._canAct[n]))},{});a(u,_({},g,{additionalArgs:s}),function(t){return r(t?{code:S.CANNOT_ACTIVATE,segment:t}:null)})},y=t.mware,A=function(e,n,r){var i=Array.isArray(t.mware)?t.mware:[t.mware];a(i,_({},g,{context:{cancel:l,router:t}}),function(t,n){var a=t?"object"==typeof t?t:{error:t}:null;r(t?_({code:S.TRANSITION_ERR},a):null,n||e)})},T=(r?[d]:[]).concat(v).concat(y?A:[]);return a(T,g,h),l}var o=function(){function t(t,e){for(var n=0;n$)/g,""):"[a-zA-Z0-9-_.~]+")+")"},c=[{name:"url-parameter",pattern:/^:([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function(t){return new RegExp(s(t[2]))}},{name:"url-parameter-splat",pattern:/^\*([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/,regex:/([^\?]*)/},{name:"url-parameter-matrix",pattern:/^\;([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function(t){return new RegExp(";"+t[1]+"="+s(t[2]))}},{name:"query-parameter",pattern:/^(?:\?|&)(?:\:)?([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/},{name:"delimiter",pattern:/^(\/|\?)/,regex:function(t){return new RegExp("\\"+t[0])}},{name:"sub-delimiter",pattern:/^(\!|\&|\-|_|\.|;)/,regex:function(t){return new RegExp(t[0])}},{name:"fragment",pattern:/^([0-9a-zA-Z]+?)/,regex:function(t){return new RegExp(t[0])}}],l=function w(t){var e=arguments.length<=1||void 0===arguments[1]?[]:arguments[1],n=c.some(function(n){var r=t.match(n.pattern);return r?(e.push({type:n.name,match:r[0],val:r.slice(1,2),otherVal:r.slice(2),regex:n.regex instanceof Function?n.regex(r):n.regex}),r[0].length0,this.hasSpatParam=this.tokens.filter(function(t){return/splat$/.test(t.type)}).length>0,this.hasMatrixParams=this.tokens.filter(function(t){return/matrix$/.test(t.type)}).length>0,this.hasQueryParams=this.tokens.filter(function(t){return"query-parameter"===t.type}).length>0,this.urlParams=this.hasUrlParams?this.tokens.filter(function(t){return/^url-parameter/.test(t.type)}).map(function(t){return t.val.slice(0,1)}).reduce(function(t,e){return t.concat(e)}):[],this.queryParams=this.hasQueryParams?this.tokens.filter(function(t){return"query-parameter"===t.type}).map(function(t){return t.val}).reduce(function(t,e){return t.concat(e)}):[],this.params=this.urlParams.concat(this.queryParams),this.source=this.tokens.filter(function(t){return void 0!==t.regex}).map(function(t){return t.regex.source}).join("")}return o(t,null,[{key:"createPath",value:function(e){return new t(e)}},{key:"serialise",value:function(t,e){return g(t,e)}}]),o(t,[{key:"_urlMatch",value:function(t,e){var n=this,r=t.match(e);return r?this.urlParams.length?r.slice(1,this.urlParams.length+1).reduce(function(t,e,r){return t[n.urlParams[r]]=e,t},{}):{}:null}},{key:"match",value:function e(t){var n=this,r=arguments.length<=1||void 0===arguments[1]?0:arguments[1],a=h(this.source,r),e=this._urlMatch(t,new RegExp("^"+a+(this.hasQueryParams?"\\?.*$":"$")));if(!e||!this.hasQueryParams)return e;var i=m(t),u=Object.keys(i).filter(function(t){return-1===n.queryParams.indexOf(t)});return 0===u.length?(Object.keys(i).forEach(function(t){return e[t]=i[t]}),e):null}},{key:"partialMatch",value:function(t){var e=this,n=arguments.length<=1||void 0===arguments[1]?0:arguments[1],r=h(this.source,n),a=this._urlMatch(t,new RegExp("^"+r));if(!a)return a;if(!this.hasQueryParams)return a;var i=m(t);return Object.keys(i).filter(function(t){return e.queryParams.indexOf(t)>=0}).forEach(function(t){return f(a,t,i[t])}),a}},{key:"build",value:function(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=arguments.length<=1||void 0===arguments[1]?{ignoreConstraints:!1,ignoreSearch:!1}:arguments[1];if(this.urlParams.some(function(e){return void 0===t[e]}))throw new Error("Missing parameters");if(!e.ignoreConstraints){var n=this.tokens.filter(function(t){return/^url-parameter/.test(t.type)&&!/-splat$/.test(t.type)}).every(function(e){return new RegExp("^"+s(e.otherVal[0])+"$").test(t[e.val])});if(!n)throw new Error("Some parameters are of invalid format")}var r=this.tokens.filter(function(t){return"query-parameter"!==t.type}).map(function(e){return"url-parameter-matrix"===e.type?";"+e.val[0]+"="+t[e.val[0]]:/^url-parameter/.test(e.type)?t[e.val[0]]:e.match}).join("");if(e.ignoreSearch)return r;var a=this.queryParams.filter(function(e){return-1!==Object.keys(t).indexOf(e)}).map(function(e){return g(e,t[e])}).join("&");return r+(a?"?"+a:"")}}]),t}(),v=function(t){return void 0!==t&&null!==t&&""!==t},y=function(t,e){if(-1===t.indexOf("?"))return t;var n=t.split("?"),r=n[0],a=n[1],i=a.split("&").reduce(function(t,n){var r=n.split("="),a=r[0],i=decodeURIComponent(r[1]);return-1===e.indexOf(a)&&(t[a]=i||""),t},{}),u=Object.keys(i).map(function(t){return[t].concat(v(i[t])?encodeURIComponent(i[t]):[])}).map(function(t){return t.join("=")}).join("&");return r+(u?"?"+u:"")},A=function(){function t(){var e=arguments.length<=0||void 0===arguments[0]?"":arguments[0],r=arguments.length<=1||void 0===arguments[1]?"":arguments[1],a=arguments.length<=2||void 0===arguments[2]?[]:arguments[2];return n(this,t),this.name=e,this.path=r,this.parser=r?new d(r):null,this.children=[],this.add(a),this}return o(t,[{key:"add",value:function(e){var n=this;if(void 0!==e&&null!==e){if(e instanceof Array)return void e.forEach(function(t){return n.add(t)});if(!(e instanceof t||e instanceof Object))throw new Error("RouteNode.add() expects routes to be an Object or an instance of RouteNode.");if(e instanceof Object){if(!e.name||!e.path)throw new Error("RouteNode.add() expects routes to have a name and a path defined.");e=new t(e.name,e.path,e.children)}if(-1!==this.children.map(function(t){return t.name}).indexOf(e.name))throw new Error('Alias "'+e.name+'" is already defined in route node');if(-1!==this.children.map(function(t){return t.path}).indexOf(e.path))throw new Error('Path "'+e.path+'" is already defined in route node');var r=e.name.split(".");if(1===r.length)this.children.push(e),this.children.sort(function(t,e){if("/"===t.path)return 1;if("/"===e.path)return-1;var n=t.parser.hasUrlParams||t.parser.hasSpatParam,r=e.parser.hasUrlParams||e.parser.hasSpatParam;if(!n&&!r)return t.path&&e.path?t.path.lengtha?1:0});else{var a=this.getSegmentsByName(r.slice(0,-1).join("."));if(!a)throw new Error("Could not add route named '"+e.name+"', parent is missing.");a[a.length-1].add(new t(r[r.length-1],e.path,e.children))}return this}}},{key:"addNode",value:function(e,n){return this.add(new t(e,n)),this}},{key:"getSegmentsByName",value:function(t){var e=function(t,e){var n=e.filter(function(e){return e.name===t});return n.length?n[0]:void 0},n=[],r=t.split("."),a=this.children,i=r.every(function(t){var r=e(t,a);return r?(a=r.children,n.push(r),!0):!1});return i?n:null}},{key:"getSegmentsMatchingPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],n=function i(t,n,r){var a=function(a){var u=t[a],o=u.parser.partialMatch(n),s=void 0;if(!o&&e)o=u.parser.match(n,!0),s="";else if(o){var c=u.parser.build(o,{ignoreSearch:!0});s=y(n.replace(c,""),u.parser.queryParams),e&&"/"===s&&!/\/$/.test(c)&&(s="")}return o?(r.push(u),Object.keys(o).forEach(function(t){return r.params[t]=o[t]}),s.length?u.children.length?{v:i(u.children,s,r)}:{v:null}:{v:r}):void 0};for(var u in t){var o=a(u);if("object"==typeof o)return o.v}return null},r=this.parser?[this]:this.children,a=[];return a.params={},n(r,t,a)}},{key:"getPathFromSegments",value:function(t){return t?t.map(function(t){return t.path}).join(""):null}},{key:"getPath",value:function(t){return this.getPathFromSegments(this.getSegmentsByName(t))}},{key:"buildPathFromSegments",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if(!t)return null;var n=t.filter(function(t){return t.parser.hasQueryParams}).map(function(t){return t.parser.queryParams}),r=n.length?n.reduce(function(t,e){return t.concat(e)}).filter(function(t){return-1!==Object.keys(e).indexOf(t)}).map(function(t){return d.serialise(t,e[t])}).join("&"):null;return t.map(function(t){return t.parser.build(e,{ignoreSearch:!0})}).join("")+(r?"?"+r:"")}},{key:"buildPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return this.buildPathFromSegments(this.getSegmentsByName(t),e)}},{key:"getMatchPathFromSegments",value:function(t){if(!t||!t.length)return null;var e=t.map(function(t){return t.name}).join("."),n=t.params;return{name:e,params:n}}},{key:"matchPath",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?!1:arguments[1];return this.getMatchPathFromSegments(this.getSegmentsMatchingPath(t,e))}}]),t}(),S={ROUTER_NOT_STARTED:"NOT_STARTED",ROUTER_ALREADY_STARTED:"ALREADY_STARTED",ROUTE_NOT_FOUND:"ROUTE_NOT_FOUND",SAME_STATES:"SAME_STATES",CANNOT_DEACTIVATE:"CANNOT_DEACTIVATE",CANNOT_ACTIVATE:"CANNOT_ACTIVATE",TRANSITION_ERR:"TRANSITION_ERR",TRANSITION_CANCELLED:"CANCELLED"},_=Object.assign||function(t){for(var e=1;e0&&("string"==typeof e[0]&&(a=e[0]),"object"==typeof e[0]&&(i=e[0]));var o=function(e,n){var a=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];r&&r(e,n),e||t._invokeListeners("$$success",n,null,{replace:!0}),e&&a&&t._invokeListeners("$$error",n,null,e)};return void 0===a&&void 0===i&&this.getLocation&&(a=this.getLocation()),i?(this.lastKnownState=i,o(null,i)):!function(){i=void 0===a?null:t.matchPath(a);var e=function(){return t.navigate(u.defaultRoute,u.defaultParams,{replace:!0},function(t,e){return o(t,e,!1)})};i?(t.lastStateAttempt=i,t._transition(t.lastStateAttempt,t.lastKnownState,function(t,n){t?u.defaultRoute?e():o(t,null,!1):o(null,n)})):u.defaultRoute?e():o({code:S.ROUTE_NOT_FOUND,path:a},null)}(),this}},{key:"stop",value:function(){return this.started?(this.lastKnownState=null,this.lastStateAttempt=null,this.started=!1,this._invokeListeners("$stop"),this):this}},{key:"getState",value:function(){return this.lastKnownState}},{key:"isActive",value:function(t){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],n=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],r=arguments.length<=3||void 0===arguments[3]?!0:arguments[3],a=this.getState();return a?n||a.name===t?this.areStatesEqual(T(t,e),a,r):this.areStatesDescendants(T(t,e),a):!1}},{key:"areStatesEqual",value:function(t,e){var n=this,r=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];if(t.name!==e.name)return!1;var a=function(t){return n.rootNode.getSegmentsByName(t).map(function(t){return t.parser[r?"urlParams":"params"]}).reduce(function(t,e){return t.concat(e)},[])},i=a(t.name),u=a(e.name);return i.length===u.length&&i.every(function(n){return t.params[n]===e.params[n]})}},{key:"areStatesDescendants",value:function(t,e){var n=new RegExp("^"+t.name+"\\.(.*)$");return n.test(e.name)?Object.keys(t.params).every(function(n){return t.params[n]===e.params[n]}):!1}},{key:"_invokeListeners",value:function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;e>r;r++)n[r-1]=arguments[r];(this._cbs[t]||[]).forEach(function(t){return t.apply(void 0,n)})}},{key:"_addListener",value:function(t,e,n){return this._cbs[t]=(this._cbs[t]||[]).concat(e),this}},{key:"registerComponent",value:function(t,e){var n=arguments.length<=2||void 0===arguments[2]?!0:arguments[2];return this._cmps[t]&&n&&console.warn("A component was alread registered for route node "+t+"."),this._cmps[t]=e,this}},{key:"canDeactivate",value:function(t,e){if(!this.options.autoCleanUp)throw new Error('[router.canDeactivate()] Cannot be used if "autoCleanUp" is set to false');return this.registerComponent(t,{canDeactivate:function(t,n){return e}},!1),this}},{key:"deregisterComponent",value:function(t){this._cmps[t]=void 0}},{key:"canActivate",value:function(t,e){return this._canAct[t]=e,this}},{key:"buildUrl",value:function(t,e){return this._buildUrl(this.buildPath(t,e))}},{key:"_buildUrl",value:function(t){return(this.options.base||"")+(this.options.useHash?"#"+this.options.hashPrefix:"")+t}},{key:"buildPath",value:function(t,e){return this.rootNode.buildPath(t,e)}},{key:"matchPath",value:function(t){var e=this.rootNode.matchPath(t,this.options.trailingSlash);return e?T(e.name,e.params,t):null}},{key:"urlToPath",value:function(t){var e=t.match(/^(?:http|https)\:\/\/(?:[0-9a-z_\-\.\:]+?)(?=\/)(.*)$/),n=e?e[1]:t,r=n.match(/^(.+?)(#.+?)?(\?.+)?$/);if(!r)throw new Error("[router5] Could not parse url "+t);var a=r[1],i=r[2]||"",u=r[3]||"",o=this.options;return(o.useHash?i.replace(new RegExp("^#"+o.hashPrefix),""):o.base?a.replace(new RegExp("^"+o.base),""):a)+u}},{key:"matchUrl",value:function(t){return this.matchPath(this.urlToPath(t))}},{key:"_transition",value:function(t,e,n){var r=this;this.cancel(),this._invokeListeners("$$start",t,e);var a=u(this,t,e,function(a,i){return i=i||t,r._tr=null,a?(a.code===S.TRANSITION_CANCELLED?r._invokeListeners("$$cancel",t,e):r._invokeListeners("$$error",t,e,a),void(n&&n(a))):(r.lastKnownState=i,void(n&&n(null,i)))});return this._tr=a,function(){return!a||a()}}},{key:"cancel",value:function(){this._tr&&this._tr()}},{key:"navigate",value:function(t,e,n,r){void 0===e&&(e={});var a=this;if(void 0===n&&(n={}),!this.started)return void(r&&r({code:S.ROUTER_NOT_STARTED}));var i=this.buildPath(t,e);if(!i){var u={code:S.ROUTE_NOT_FOUND};return r&&r(u),void this._invokeListeners("$$error",null,this.lastKnownState,u)}var o=T(t,e,i);this.lastStateAttempt=o;var s=this.lastKnownState?this.areStatesEqual(this.lastKnownState,this.lastStateAttempt,!1):!1;if(s&&!n.reload){var u={code:S.SAME_STATES};return r&&r(u),void this._invokeListeners("$$error",o,this.lastKnownState,u)}var c=s?null:this.lastKnownState;return this._transition(o,s?null:this.lastKnownState,function(t,e){return t?void(r&&r(t)):(a._invokeListeners("$$success",o,c,n),void(r&&r(null,e)))})}}]),t}();k.ERR=S,k.transitionPath=e,k.loggerPlugin=r,t.RouteNode=A,t.Router5=k}(window); \ No newline at end of file diff --git a/package.json b/package.json index 9bdbf074..00176473 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "router5", - "version": "1.1.0", + "version": "1.1.1", "description": "An HTML5 router, based on route-node and path-parser", "main": "dist/commonjs/index.js", "jsnext:main": "modules/index.js", @@ -29,7 +29,7 @@ }, "homepage": "http://router5.github.io", "dependencies": { - "route-node": "~0.4.2", + "route-node": "~0.4.3", "router5.transition-path": "^1.0.1" }, "devDependencies": {