diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c96dbb3..2d1d2c04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ + +# 0.7.0 (2015-10-11) + + +### Features + +* support arrays in query parameters (route-node v0.4.0) ([12a2ac8](https://github.com/router5/router5/commit/12a2ac8)) + + + ## 0.6.4 (2015-09-15) diff --git a/dist/amd/router5.js b/dist/amd/router5.js index 5f3d718a..d6a4cf08 100644 --- a/dist/amd/router5.js +++ b/dist/amd/router5.js @@ -1,6 +1,6 @@ /** * @license - * @version 0.6.4 + * @version 0.7.0 * The MIT License (MIT) * * Copyright (c) 2015 Thomas Roch @@ -113,22 +113,44 @@ define('router5', [], function () { return source.replace(/\\\/$/, '') + '(?:\\/)?'; }; + var appendQueryParam = function appendQueryParam(params, param) { + var val = arguments.length <= 2 || arguments[2] === undefined ? '' : arguments[2]; + + var existingVal = params[param]; + + if (existingVal === undefined) params[param] = val;else params[param] = Array.isArray(existingVal) ? existingVal.concat(val) : [existingVal, val]; + + return params; + }; + var parseQueryParams = function parseQueryParams(path) { var searchPart = path.split('?')[1]; if (!searchPart) return {}; return searchPart.split('&').map(function (_) { return _.split('='); }).reduce(function (obj, m) { - obj[m[0]] = m[1] === undefined ? '' : m[1]; - return obj; + return appendQueryParam(obj, m[0], m[1]); }, {}); }; - var isSerialisable = function isSerialisable(val) { - return val !== undefined && val !== null && val !== ''; + var toSerialisable = function toSerialisable(val) { + return val !== undefined && val !== null && val !== '' ? '=' + val : ''; + }; + + var serialise = function serialise(key, val) { + return Array.isArray(val) ? val.map(function (v) { + return serialise(key, v); + }).join('&') : key + toSerialisable(val); }; var Path = (function () { + _createClass(Path, null, [{ + key: 'createPath', + value: function createPath(path) { + return new Path(path); + } + }]); + function Path(path) { _classCallCheck(this, Path); @@ -246,7 +268,7 @@ define('router5', [], function () { Object.keys(queryParams).filter(function (p) { return _this3.queryParams.indexOf(p) >= 0; }).forEach(function (p) { - return match[p] = queryParams[p]; + return appendQueryParam(match, p, queryParams[p]); }); return match; @@ -287,7 +309,7 @@ define('router5', [], function () { var searchPart = this.queryParams.filter(function (p) { return Object.keys(params).indexOf(p) !== -1; }).map(function (p) { - return p + (isSerialisable(params[p]) ? '=' + params[p] : ''); + return serialise(p, params[p]); }).join('&'); return base + (searchPart ? '?' + searchPart : ''); @@ -553,7 +575,7 @@ define('router5', [], function () { }).filter(function (p) { return Object.keys(params).indexOf(p) !== -1; }).map(function (p) { - return p + '=' + params[p]; + return Path.serialise(p, params[p]); }).join('&'); return segments.map(function (segment) { diff --git a/dist/amd/router5.min.js b/dist/amd/router5.min.js index db798082..06b47624 100644 --- a/dist/amd/router5.min.js +++ b/dist/amd/router5.min.js @@ -1,6 +1,6 @@ /** * @license - * @version 0.6.4 + * @version 0.7.0 * The MIT License (MIT) * * Copyright (c) 2015 Thomas Roch @@ -23,4 +23,4 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -define("router5",[],function(){var e=function(){function e(e,t){for(var r=0;r$)/g,""):"[a-zA-Z0-9-_.~]+")+")"};var n=[{name:"url-parameter",pattern:/^:([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function a(e){return new RegExp(r(e[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 a(e){return new RegExp(";"+e[1]+"="+r(e[2]))}},{name:"query-parameter",pattern:/^(?:\?|&)(?:\:)?([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/},{name:"delimiter",pattern:/^(\/|\?)/,regex:function a(e){return new RegExp("\\"+e[0])}},{name:"sub-delimiter",pattern:/^(\!|\&|\-|_|\.|;)/,regex:function a(e){return new RegExp(e[0])}},{name:"fragment",pattern:/^([0-9a-zA-Z]+?)/,regex:function a(e){return new RegExp(e[0])}}];var i=function i(e){var t=arguments.length<=1||arguments[1]===undefined?[]:arguments[1];var r=n.some(function(r){var n=e.match(r.pattern);if(!n)return false;t.push({type:r.name,match:n[0],val:n.slice(1,2),otherVal:n.slice(2),regex:r.regex instanceof Function?r.regex(n):r.regex});if(n[0].length0;this.hasSpatParam=this.tokens.filter(function(e){return/splat$/.test(e.type)}).length>0;this.hasMatrixParams=this.tokens.filter(function(e){return/matrix$/.test(e.type)}).length>0;this.hasQueryParams=this.tokens.filter(function(e){return e.type==="query-parameter"}).length>0;this.urlParams=!this.hasUrlParams?[]:this.tokens.filter(function(e){return/^url-parameter/.test(e.type)}).map(function(e){return e.val.slice(0,1)}).reduce(function(e,t){return e.concat(t)});this.queryParams=!this.hasQueryParams?[]:this.tokens.filter(function(e){return e.type==="query-parameter"}).map(function(e){return e.val}).reduce(function(e,t){return e.concat(t)});this.params=this.urlParams.concat(this.queryParams);this.source=this.tokens.filter(function(e){return e.regex!==undefined}).map(function(e){return e.regex.source}).join("")}e(n,[{key:"_urlMatch",value:function a(e,t){var r=this;var n=e.match(t);if(!n)return null;else if(!this.urlParams.length)return{};return n.slice(1,this.urlParams.length+1).reduce(function(e,t,n){e[r.urlParams[n]]=t;return e},{})}},{key:"match",value:function l(e){var t=this;var r=arguments.length<=1||arguments[1]===undefined?0:arguments[1];var n=u(this.source,r);var a=this._urlMatch(e,new RegExp("^"+n+(this.hasQueryParams?"\\?.*$":"$")));if(!a||!this.hasQueryParams)return a;var i=s(e);var o=Object.keys(i).filter(function(e){return t.queryParams.indexOf(e)===-1});if(o.length===0){Object.keys(i).forEach(function(e){return a[e]=i[e]});return a}return null}},{key:"partialMatch",value:function f(e){var t=this;var r=arguments.length<=1||arguments[1]===undefined?0:arguments[1];var n=u(this.source,r);var a=this._urlMatch(e,new RegExp("^"+n));if(!a)return a;if(!this.hasQueryParams)return a;var i=s(e);Object.keys(i).filter(function(e){return t.queryParams.indexOf(e)>=0}).forEach(function(e){return a[e]=i[e]});return a}},{key:"build",value:function c(){var e=arguments.length<=0||arguments[0]===undefined?{}:arguments[0];var t=arguments.length<=1||arguments[1]===undefined?{ignoreConstraints:false,ignoreSearch:false}:arguments[1];if(this.urlParams.some(function(t){return e[t]===undefined}))throw new Error("Missing parameters");if(!t.ignoreConstraints){var n=this.tokens.filter(function(e){return/^url-parameter/.test(e.type)&&!/-splat$/.test(e.type)}).every(function(t){return new RegExp("^"+r(t.otherVal[0])+"$").test(e[t.val])});if(!n)throw new Error("Some parameters are of invalid format")}var a=this.tokens.filter(function(e){return e.type!=="query-parameter"}).map(function(t){if(t.type==="url-parameter-matrix")return";"+t.val[0]+"="+e[t.val[0]];return/^url-parameter/.test(t.type)?e[t.val[0]]:t.match}).join("");if(t.ignoreSearch)return a;var i=this.queryParams.filter(function(t){return Object.keys(e).indexOf(t)!==-1}).map(function(t){return t+(o(e[t])?"="+e[t]:"")}).join("&");return a+(i?"?"+i:"")}}]);return n}();var f=function(){function e(e,t){var r=[];var n=true;var a=false;var i=undefined;try{for(var u=e[Symbol.iterator](),s;!(n=(s=u.next()).done);n=true){r.push(s.value);if(t&&r.length===t)break}}catch(o){a=true;i=o}finally{try{if(!n&&u["return"])u["return"]()}finally{if(a)throw i}}return r}return function(t,r){if(Array.isArray(t)){return t}else if(Symbol.iterator in Object(t)){return e(t,r)}else{throw new TypeError("Invalid attempt to destructure non-iterable instance")}}}();var o=function o(e){return e!==undefined&&e!==null&&e!==""};var c=function c(e,t){if(e.indexOf("?")===-1)return e;var r=e.split("?");var n=f(r,2);var a=n[0];var i=n[1];var u=i.split("&").reduce(function(e,r){var n=r.split("=");var a=f(n,2);var i=a[0];var u=a[1];if(t.indexOf(i)===-1)e[i]=u||"";return e},{});var s=Object.keys(u).map(function(e){return[e].concat(o(u[e])?u[e]:[])}).map(function(e){return e.join("=")}).join("&");return a+(s?"?"+s:"")};var h=function(){function r(){var e=arguments.length<=0||arguments[0]===undefined?"":arguments[0];var n=arguments.length<=1||arguments[1]===undefined?"":arguments[1];var a=arguments.length<=2||arguments[2]===undefined?[]:arguments[2];t(this,r);this.name=e;this.path=n;this.parser=n?new l(n):null;this.children=[];this.add(a);return this}e(r,[{key:"add",value:function n(e){var t=this;if(e===undefined||e===null)return;if(e instanceof Array){e.forEach(function(e){return t.add(e)});return}if(!(e instanceof r)&&!(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 r(e.name,e.path,e.children)}if(this.children.map(function(e){return e.name}).indexOf(e.name)!==-1){throw new Error('Alias "'+e.name+'" is already defined in route node')}if(this.children.map(function(e){return e.path}).indexOf(e.path)!==-1){throw new Error('Path "'+e.path+'" is already defined in route node')}var n=e.name.split(".");if(n.length===1){this.children.push(e);this.children.sort(function(e,t){if(e.path==="/")return 1;if(t.path==="/")return-1;var r=e.parser.hasUrlParams||e.parser.hasSpatParam;var n=t.parser.hasUrlParams||t.parser.hasSpatParam;if(!r&&!n){return e.path&&t.path?e.path.length0?a[n-1]:"";return{intersection:l,toDeactivate:s,toActivate:o}}function P(e,t,r,n){var a=false;var i=function i(){return a};var u=function u(){return a=true};var s=function s(e){return n(a?v.TRANSITION_CANCELLED:e)};var o=b(t,r);var l=o.intersection;var f=o.toDeactivate;var c=o.toActivate;var h=function h(t,r,n){var a=f.map(function(t){return e._cmps[t]}).filter(function(e){return e&&e.canDeactivate}).map(function(e){return e.canDeactivate});A(i,a,t,r,function(e){return n(e?v.CANNOT_DEACTIVATE:null)})};var m=function m(t,r,n){var a=c.map(function(t){return e._canAct[t]}).filter(function(e){return e});A(i,a,t,r,function(e){return n(e?v.CANNOT_ACTIVATE:null)})};var p=e._onTr;var d=function d(e,t,r){var n=[p];A(i,n,e,t,function(e){return r(e?v.TRANSITION_ERR:null)})};var g=e._cbs["^"+l];var y=function y(e,t,r){var n=g;A(i,n,e,t,function(e){return r(e?v.NODE_LISTENER_ERR:null)},true)};var S=(r?[h]:[]).concat(m).concat(p?d:[]).concat(g&&g.length?y:[]);A(i,S,t,r,s);return u}var f=function(){function e(e,t){var r=[];var n=true;var a=false;var i=undefined;try{for(var u=e[Symbol.iterator](),s;!(n=(s=u.next()).done);n=true){r.push(s.value);if(t&&r.length===t)break}}catch(o){a=true;i=o}finally{try{if(!n&&u["return"])u["return"]()}finally{if(a)throw i}}return r}return function(t,r){if(Array.isArray(t)){return t}else if(Symbol.iterator in Object(t)){return e(t,r)}else{throw new TypeError("Invalid attempt to destructure non-iterable instance")}}}();var N=Array.prototype.slice;var e=function(){function e(e,t){for(var r=0;r0){if(typeof t[0]==="string")a=t[0];if(typeof t[0]==="object")i=t[0]}this.started=true;var u=this.options;var s=function s(t,r){var a=arguments.length<=2||arguments[2]===undefined?true:arguments[2];T.addPopstateListener(e.boundOnPopState);if(n)n(t,r);if(t&&a)e._invokeListeners("$error",r,null,t)};if(!a&&!i)a=this.getLocation();if(!i){(function(){i=e.matchPath(a);var t=function t(){return e.navigate(u.defaultRoute,u.defaultParams,{replace:true},function(e,t){return s(e,t,false)})};if(i){e.lastStateAttempt=i;e._transition(e.lastStateAttempt,e.lastKnownState,function(r,n){if(!r){T.replaceState(e.lastKnownState,"",e.buildUrl(i.name,i.params));s(null,n)}else if(u.defaultRoute)t();else s(r,null,false)})}else if(u.defaultRoute){t()}else{s(v.ROUTE_NOT_FOUND,null)}})()}else{this.lastKnownState=i;T.replaceState(this.lastKnownState,"",this.buildUrl(i.name,i.params));s(null,i)}return this}},{key:"stop",value:function c(){if(!this.started)return this;this.lastKnownState=null;this.lastStateAttempt=null;this.started=false;T.removePopstateListener(this.boundOnPopState);return this}},{key:"getState",value:function m(){return this.lastKnownState}},{key:"isActive",value:function p(e){var t=arguments.length<=1||arguments[1]===undefined?{}:arguments[1];var r=arguments.length<=2||arguments[2]===undefined?false:arguments[2];var n=this.getState();if(!n)return false;if(r||n.name===e){return this.areStatesEqual(O(e,t),n)}return this.areStatesDescendants(O(e,t),n)}},{key:"areStatesEqual",value:function d(e,t){return e.name===t.name&&Object.keys(e.params).length===Object.keys(t.params).length&&Object.keys(e.params).every(function(r){return e.params[r]===t.params[r]})}},{key:"areStatesDescendants",value:function g(e,t){var r=new RegExp("^"+e.name+"\\.(.*)$");if(!r.test(t.name))return false;return Object.keys(e.params).every(function(r){return e.params[r]===t.params[r]})}},{key:"_invokeListeners",value:function y(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n$)/g,""):"[a-zA-Z0-9-_.~]+")+")"};var n=[{name:"url-parameter",pattern:/^:([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function a(e){return new RegExp(r(e[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 a(e){return new RegExp(";"+e[1]+"="+r(e[2]))}},{name:"query-parameter",pattern:/^(?:\?|&)(?:\:)?([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/},{name:"delimiter",pattern:/^(\/|\?)/,regex:function a(e){return new RegExp("\\"+e[0])}},{name:"sub-delimiter",pattern:/^(\!|\&|\-|_|\.|;)/,regex:function a(e){return new RegExp(e[0])}},{name:"fragment",pattern:/^([0-9a-zA-Z]+?)/,regex:function a(e){return new RegExp(e[0])}}];var i=function i(e){var t=arguments.length<=1||arguments[1]===undefined?[]:arguments[1];var r=n.some(function(r){var n=e.match(r.pattern);if(!n)return false;t.push({type:r.name,match:n[0],val:n.slice(1,2),otherVal:n.slice(2),regex:r.regex instanceof Function?r.regex(n):r.regex});if(n[0].length0;this.hasSpatParam=this.tokens.filter(function(e){return/splat$/.test(e.type)}).length>0;this.hasMatrixParams=this.tokens.filter(function(e){return/matrix$/.test(e.type)}).length>0;this.hasQueryParams=this.tokens.filter(function(e){return e.type==="query-parameter"}).length>0;this.urlParams=!this.hasUrlParams?[]:this.tokens.filter(function(e){return/^url-parameter/.test(e.type)}).map(function(e){return e.val.slice(0,1)}).reduce(function(e,t){return e.concat(t)});this.queryParams=!this.hasQueryParams?[]:this.tokens.filter(function(e){return e.type==="query-parameter"}).map(function(e){return e.val}).reduce(function(e,t){return e.concat(t)});this.params=this.urlParams.concat(this.queryParams);this.source=this.tokens.filter(function(e){return e.regex!==undefined}).map(function(e){return e.regex.source}).join("")}e(a,[{key:"_urlMatch",value:function l(e,t){var r=this;var n=e.match(t);if(!n)return null;else if(!this.urlParams.length)return{};return n.slice(1,this.urlParams.length+1).reduce(function(e,t,n){e[r.urlParams[n]]=t;return e},{})}},{key:"match",value:function c(e){var t=this;var r=arguments.length<=1||arguments[1]===undefined?0:arguments[1];var n=u(this.source,r);var a=this._urlMatch(e,new RegExp("^"+n+(this.hasQueryParams?"\\?.*$":"$")));if(!a||!this.hasQueryParams)return a;var i=o(e);var s=Object.keys(i).filter(function(e){return t.queryParams.indexOf(e)===-1});if(s.length===0){Object.keys(i).forEach(function(e){return a[e]=i[e]});return a}return null}},{key:"partialMatch",value:function h(e){var t=this;var r=arguments.length<=1||arguments[1]===undefined?0:arguments[1];var n=u(this.source,r);var a=this._urlMatch(e,new RegExp("^"+n));if(!a)return a;if(!this.hasQueryParams)return a;var i=o(e);Object.keys(i).filter(function(e){return t.queryParams.indexOf(e)>=0}).forEach(function(e){return s(a,e,i[e])});return a}},{key:"build",value:function v(){var e=arguments.length<=0||arguments[0]===undefined?{}:arguments[0];var t=arguments.length<=1||arguments[1]===undefined?{ignoreConstraints:false,ignoreSearch:false}:arguments[1];if(this.urlParams.some(function(t){return e[t]===undefined}))throw new Error("Missing parameters");if(!t.ignoreConstraints){var n=this.tokens.filter(function(e){return/^url-parameter/.test(e.type)&&!/-splat$/.test(e.type)}).every(function(t){return new RegExp("^"+r(t.otherVal[0])+"$").test(e[t.val])});if(!n)throw new Error("Some parameters are of invalid format")}var a=this.tokens.filter(function(e){return e.type!=="query-parameter"}).map(function(t){if(t.type==="url-parameter-matrix")return";"+t.val[0]+"="+e[t.val[0]];return/^url-parameter/.test(t.type)?e[t.val[0]]:t.match}).join("");if(t.ignoreSearch)return a;var i=this.queryParams.filter(function(t){return Object.keys(e).indexOf(t)!==-1}).map(function(t){return f(t,e[t])}).join("&");return a+(i?"?"+i:"")}}]);return a}();var h=function(){function e(e,t){var r=[];var n=true;var a=false;var i=undefined;try{for(var u=e[Symbol.iterator](),s;!(n=(s=u.next()).done);n=true){r.push(s.value);if(t&&r.length===t)break}}catch(o){a=true;i=o}finally{try{if(!n&&u["return"])u["return"]()}finally{if(a)throw i}}return r}return function(t,r){if(Array.isArray(t)){return t}else if(Symbol.iterator in Object(t)){return e(t,r)}else{throw new TypeError("Invalid attempt to destructure non-iterable instance")}}}();var v=function v(e){return e!==undefined&&e!==null&&e!==""};var m=function m(e,t){if(e.indexOf("?")===-1)return e;var r=e.split("?");var n=h(r,2);var a=n[0];var i=n[1];var u=i.split("&").reduce(function(e,r){var n=r.split("=");var a=h(n,2);var i=a[0];var u=a[1];if(t.indexOf(i)===-1)e[i]=u||"";return e},{});var s=Object.keys(u).map(function(e){return[e].concat(v(u[e])?u[e]:[])}).map(function(e){return e.join("=")}).join("&");return a+(s?"?"+s:"")};var p=function(){function r(){var e=arguments.length<=0||arguments[0]===undefined?"":arguments[0];var n=arguments.length<=1||arguments[1]===undefined?"":arguments[1];var a=arguments.length<=2||arguments[2]===undefined?[]:arguments[2];t(this,r);this.name=e;this.path=n;this.parser=n?new c(n):null;this.children=[];this.add(a);return this}e(r,[{key:"add",value:function n(e){var t=this;if(e===undefined||e===null)return;if(e instanceof Array){e.forEach(function(e){return t.add(e)});return}if(!(e instanceof r)&&!(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 r(e.name,e.path,e.children)}if(this.children.map(function(e){return e.name}).indexOf(e.name)!==-1){throw new Error('Alias "'+e.name+'" is already defined in route node')}if(this.children.map(function(e){return e.path}).indexOf(e.path)!==-1){throw new Error('Path "'+e.path+'" is already defined in route node')}var n=e.name.split(".");if(n.length===1){this.children.push(e);this.children.sort(function(e,t){if(e.path==="/")return 1;if(t.path==="/")return-1;var r=e.parser.hasUrlParams||e.parser.hasSpatParam;var n=t.parser.hasUrlParams||t.parser.hasSpatParam;if(!r&&!n){return e.path&&t.path?e.path.length0?a[n-1]:"";return{intersection:l,toDeactivate:s,toActivate:o}}function R(e,t,r,n){var a=false;var i=function i(){return a};var u=function u(){return a=true};var s=function s(e){return n(a?d.TRANSITION_CANCELLED:e)};var o=O(t,r);var l=o.intersection;var f=o.toDeactivate;var c=o.toActivate;var h=function h(t,r,n){var a=f.map(function(t){return e._cmps[t]}).filter(function(e){return e&&e.canDeactivate}).map(function(e){return e.canDeactivate});N(i,a,t,r,function(e){return n(e?d.CANNOT_DEACTIVATE:null)})};var v=function v(t,r,n){var a=c.map(function(t){return e._canAct[t]}).filter(function(e){return e});N(i,a,t,r,function(e){return n(e?d.CANNOT_ACTIVATE:null)})};var m=e._onTr;var p=function p(e,t,r){var n=[m];N(i,n,e,t,function(e){return r(e?d.TRANSITION_ERR:null)})};var g=e._cbs["^"+l];var y=function y(e,t,r){var n=g;N(i,n,e,t,function(e){return r(e?d.NODE_LISTENER_ERR:null)},true)};var S=(r?[h]:[]).concat(v).concat(m?p:[]).concat(g&&g.length?y:[]);N(i,S,t,r,s);return u}var h=function(){function e(e,t){var r=[];var n=true;var a=false;var i=undefined;try{for(var u=e[Symbol.iterator](),s;!(n=(s=u.next()).done);n=true){r.push(s.value);if(t&&r.length===t)break}}catch(o){a=true;i=o}finally{try{if(!n&&u["return"])u["return"]()}finally{if(a)throw i}}return r}return function(t,r){if(Array.isArray(t)){return t}else if(Symbol.iterator in Object(t)){return e(t,r)}else{throw new TypeError("Invalid attempt to destructure non-iterable instance")}}}();var L=Array.prototype.slice;var e=function(){function e(e,t){for(var r=0;r0){if(typeof t[0]==="string")a=t[0];if(typeof t[0]==="object")i=t[0]}this.started=true;var u=this.options;var s=function s(t,r){var a=arguments.length<=2||arguments[2]===undefined?true:arguments[2];P.addPopstateListener(e.boundOnPopState);if(n)n(t,r);if(t&&a)e._invokeListeners("$error",r,null,t)};if(!a&&!i)a=this.getLocation();if(!i){(function(){i=e.matchPath(a);var t=function t(){return e.navigate(u.defaultRoute,u.defaultParams,{replace:true},function(e,t){return s(e,t,false)})};if(i){e.lastStateAttempt=i;e._transition(e.lastStateAttempt,e.lastKnownState,function(r,n){if(!r){P.replaceState(e.lastKnownState,"",e.buildUrl(i.name,i.params));s(null,n)}else if(u.defaultRoute)t();else s(r,null,false)})}else if(u.defaultRoute){t()}else{s(d.ROUTE_NOT_FOUND,null)}})()}else{this.lastKnownState=i;P.replaceState(this.lastKnownState,"",this.buildUrl(i.name,i.params));s(null,i)}return this}},{key:"stop",value:function f(){if(!this.started)return this;this.lastKnownState=null;this.lastStateAttempt=null;this.started=false;P.removePopstateListener(this.boundOnPopState);return this}},{key:"getState",value:function c(){return this.lastKnownState}},{key:"isActive",value:function v(e){var t=arguments.length<=1||arguments[1]===undefined?{}:arguments[1];var r=arguments.length<=2||arguments[2]===undefined?false:arguments[2];var n=this.getState();if(!n)return false;if(r||n.name===e){return this.areStatesEqual(x(e,t),n)}return this.areStatesDescendants(x(e,t),n)}},{key:"areStatesEqual",value:function m(e,t){return e.name===t.name&&Object.keys(e.params).length===Object.keys(t.params).length&&Object.keys(e.params).every(function(r){return e.params[r]===t.params[r]})}},{key:"areStatesDescendants",value:function g(e,t){var r=new RegExp("^"+e.name+"\\.(.*)$");if(!r.test(t.name))return false;return Object.keys(e.params).every(function(r){return e.params[r]===t.params[r]})}},{key:"_invokeListeners",value:function y(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n= 0; }).forEach(function (p) { - return match[p] = queryParams[p]; + return appendQueryParam(match, p, queryParams[p]); }); return match; @@ -287,7 +309,7 @@ var searchPart = this.queryParams.filter(function (p) { return Object.keys(params).indexOf(p) !== -1; }).map(function (p) { - return p + (isSerialisable(params[p]) ? '=' + params[p] : ''); + return serialise(p, params[p]); }).join('&'); return base + (searchPart ? '?' + searchPart : ''); @@ -553,7 +575,7 @@ }).filter(function (p) { return Object.keys(params).indexOf(p) !== -1; }).map(function (p) { - return p + '=' + params[p]; + return Path.serialise(p, params[p]); }).join('&'); return segments.map(function (segment) { diff --git a/dist/browser/router5.min.js b/dist/browser/router5.min.js index 4153a6e9..199d7855 100644 --- a/dist/browser/router5.min.js +++ b/dist/browser/router5.min.js @@ -1,6 +1,6 @@ /** * @license - * @version 0.6.4 + * @version 0.7.0 * The MIT License (MIT) * * Copyright (c) 2015 Thomas Roch @@ -23,4 +23,4 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -(function(e){var t=function(){function e(e,t){for(var r=0;r$)/g,""):"[a-zA-Z0-9-_.~]+")+")"};var a=[{name:"url-parameter",pattern:/^:([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function i(e){return new RegExp(n(e[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 i(e){return new RegExp(";"+e[1]+"="+n(e[2]))}},{name:"query-parameter",pattern:/^(?:\?|&)(?:\:)?([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/},{name:"delimiter",pattern:/^(\/|\?)/,regex:function i(e){return new RegExp("\\"+e[0])}},{name:"sub-delimiter",pattern:/^(\!|\&|\-|_|\.|;)/,regex:function i(e){return new RegExp(e[0])}},{name:"fragment",pattern:/^([0-9a-zA-Z]+?)/,regex:function i(e){return new RegExp(e[0])}}];var u=function u(e){var t=arguments.length<=1||arguments[1]===undefined?[]:arguments[1];var r=a.some(function(r){var n=e.match(r.pattern);if(!n)return false;t.push({type:r.name,match:n[0],val:n.slice(1,2),otherVal:n.slice(2),regex:r.regex instanceof Function?r.regex(n):r.regex});if(n[0].length0;this.hasSpatParam=this.tokens.filter(function(e){return/splat$/.test(e.type)}).length>0;this.hasMatrixParams=this.tokens.filter(function(e){return/matrix$/.test(e.type)}).length>0;this.hasQueryParams=this.tokens.filter(function(e){return e.type==="query-parameter"}).length>0;this.urlParams=!this.hasUrlParams?[]:this.tokens.filter(function(e){return/^url-parameter/.test(e.type)}).map(function(e){return e.val.slice(0,1)}).reduce(function(e,t){return e.concat(t)});this.queryParams=!this.hasQueryParams?[]:this.tokens.filter(function(e){return e.type==="query-parameter"}).map(function(e){return e.val}).reduce(function(e,t){return e.concat(t)});this.params=this.urlParams.concat(this.queryParams);this.source=this.tokens.filter(function(e){return e.regex!==undefined}).map(function(e){return e.regex.source}).join("")}t(e,[{key:"_urlMatch",value:function a(e,t){var r=this;var n=e.match(t);if(!n)return null;else if(!this.urlParams.length)return{};return n.slice(1,this.urlParams.length+1).reduce(function(e,t,n){e[r.urlParams[n]]=t;return e},{})}},{key:"match",value:function i(e){var t=this;var r=arguments.length<=1||arguments[1]===undefined?0:arguments[1];var n=s(this.source,r);var a=this._urlMatch(e,new RegExp("^"+n+(this.hasQueryParams?"\\?.*$":"$")));if(!a||!this.hasQueryParams)return a;var i=o(e);var u=Object.keys(i).filter(function(e){return t.queryParams.indexOf(e)===-1});if(u.length===0){Object.keys(i).forEach(function(e){return a[e]=i[e]});return a}return null}},{key:"partialMatch",value:function f(e){var t=this;var r=arguments.length<=1||arguments[1]===undefined?0:arguments[1];var n=s(this.source,r);var a=this._urlMatch(e,new RegExp("^"+n));if(!a)return a;if(!this.hasQueryParams)return a;var i=o(e);Object.keys(i).filter(function(e){return t.queryParams.indexOf(e)>=0}).forEach(function(e){return a[e]=i[e]});return a}},{key:"build",value:function c(){var e=arguments.length<=0||arguments[0]===undefined?{}:arguments[0];var t=arguments.length<=1||arguments[1]===undefined?{ignoreConstraints:false,ignoreSearch:false}:arguments[1];if(this.urlParams.some(function(t){return e[t]===undefined}))throw new Error("Missing parameters");if(!t.ignoreConstraints){var r=this.tokens.filter(function(e){return/^url-parameter/.test(e.type)&&!/-splat$/.test(e.type)}).every(function(t){return new RegExp("^"+n(t.otherVal[0])+"$").test(e[t.val])});if(!r)throw new Error("Some parameters are of invalid format")}var a=this.tokens.filter(function(e){return e.type!=="query-parameter"}).map(function(t){if(t.type==="url-parameter-matrix")return";"+t.val[0]+"="+e[t.val[0]];return/^url-parameter/.test(t.type)?e[t.val[0]]:t.match}).join("");if(t.ignoreSearch)return a;var i=this.queryParams.filter(function(t){return Object.keys(e).indexOf(t)!==-1}).map(function(t){return t+(l(e[t])?"="+e[t]:"")}).join("&");return a+(i?"?"+i:"")}}]);return e}();var c=function(){function e(e,t){var r=[];var n=true;var a=false;var i=undefined;try{for(var u=e[Symbol.iterator](),s;!(n=(s=u.next()).done);n=true){r.push(s.value);if(t&&r.length===t)break}}catch(o){a=true;i=o}finally{try{if(!n&&u["return"])u["return"]()}finally{if(a)throw i}}return r}return function(t,r){if(Array.isArray(t)){return t}else if(Symbol.iterator in Object(t)){return e(t,r)}else{throw new TypeError("Invalid attempt to destructure non-iterable instance")}}}();var l=function l(e){return e!==undefined&&e!==null&&e!==""};var h=function h(e,t){if(e.indexOf("?")===-1)return e;var r=e.split("?");var n=c(r,2);var a=n[0];var i=n[1];var u=i.split("&").reduce(function(e,r){var n=r.split("=");var a=c(n,2);var i=a[0];var u=a[1];if(t.indexOf(i)===-1)e[i]=u||"";return e},{});var s=Object.keys(u).map(function(e){return[e].concat(l(u[e])?u[e]:[])}).map(function(e){return e.join("=")}).join("&");return a+(s?"?"+s:"")};var v=function(){function e(){var t=arguments.length<=0||arguments[0]===undefined?"":arguments[0];var n=arguments.length<=1||arguments[1]===undefined?"":arguments[1];var a=arguments.length<=2||arguments[2]===undefined?[]:arguments[2];r(this,e);this.name=t;this.path=n;this.parser=n?new f(n):null;this.children=[];this.add(a);return this}t(e,[{key:"add",value:function n(t){var r=this;if(t===undefined||t===null)return;if(t instanceof Array){t.forEach(function(e){return r.add(e)});return}if(!(t instanceof e)&&!(t instanceof Object)){throw new Error("RouteNode.add() expects routes to be an Object or an instance of RouteNode.")}if(t instanceof Object){if(!t.name||!t.path){throw new Error("RouteNode.add() expects routes to have a name and a path defined.")}t=new e(t.name,t.path,t.children)}if(this.children.map(function(e){return e.name}).indexOf(t.name)!==-1){throw new Error('Alias "'+t.name+'" is already defined in route node')}if(this.children.map(function(e){return e.path}).indexOf(t.path)!==-1){throw new Error('Path "'+t.path+'" is already defined in route node')}var n=t.name.split(".");if(n.length===1){this.children.push(t);this.children.sort(function(e,t){if(e.path==="/")return 1;if(t.path==="/")return-1;var r=e.parser.hasUrlParams||e.parser.hasSpatParam;var n=t.parser.hasUrlParams||t.parser.hasSpatParam;if(!r&&!n){return e.path&&t.path?e.path.length0?a[n-1]:"";return{intersection:l,toDeactivate:s,toActivate:o}}function N(e,t,r,n){var a=false;var i=function i(){return a};var u=function u(){return a=true};var s=function s(e){return n(a?m.TRANSITION_CANCELLED:e)};var o=w(t,r);var l=o.intersection;var f=o.toDeactivate;var c=o.toActivate;var h=function h(t,r,n){var a=f.map(function(t){return e._cmps[t]}).filter(function(e){return e&&e.canDeactivate}).map(function(e){return e.canDeactivate});P(i,a,t,r,function(e){return n(e?m.CANNOT_DEACTIVATE:null)})};var v=function v(t,r,n){var a=c.map(function(t){return e._canAct[t]}).filter(function(e){return e});P(i,a,t,r,function(e){return n(e?m.CANNOT_ACTIVATE:null)})};var p=e._onTr;var d=function d(e,t,r){var n=[p];P(i,n,e,t,function(e){return r(e?m.TRANSITION_ERR:null)})};var g=e._cbs["^"+l];var y=function y(e,t,r){var n=g;P(i,n,e,t,function(e){return r(e?m.NODE_LISTENER_ERR:null)},true)};var S=(r?[h]:[]).concat(v).concat(p?d:[]).concat(g&&g.length?y:[]);P(i,S,t,r,s);return u}var c=function(){function e(e,t){var r=[];var n=true;var a=false;var i=undefined;try{for(var u=e[Symbol.iterator](),s;!(n=(s=u.next()).done);n=true){r.push(s.value);if(t&&r.length===t)break}}catch(o){a=true;i=o}finally{try{if(!n&&u["return"])u["return"]()}finally{if(a)throw i}}return r}return function(t,r){if(Array.isArray(t)){return t}else if(Symbol.iterator in Object(t)){return e(t,r)}else{throw new TypeError("Invalid attempt to destructure non-iterable instance")}}}();var O=Array.prototype.slice;var t=function(){function e(e,t){for(var r=0;r0){if(typeof t[0]==="string")a=t[0];if(typeof t[0]==="object")i=t[0]}this.started=true;var u=this.options;var s=function s(t,r){var a=arguments.length<=2||arguments[2]===undefined?true:arguments[2];b.addPopstateListener(e.boundOnPopState);if(n)n(t,r);if(t&&a)e._invokeListeners("$error",r,null,t)};if(!a&&!i)a=this.getLocation();if(!i){(function(){i=e.matchPath(a);var t=function t(){return e.navigate(u.defaultRoute,u.defaultParams,{replace:true},function(e,t){return s(e,t,false)})};if(i){e.lastStateAttempt=i;e._transition(e.lastStateAttempt,e.lastKnownState,function(r,n){if(!r){b.replaceState(e.lastKnownState,"",e.buildUrl(i.name,i.params));s(null,n)}else if(u.defaultRoute)t();else s(r,null,false)})}else if(u.defaultRoute){t()}else{s(m.ROUTE_NOT_FOUND,null)}})()}else{this.lastKnownState=i;b.replaceState(this.lastKnownState,"",this.buildUrl(i.name,i.params));s(null,i)}return this}},{key:"stop",value:function f(){if(!this.started)return this;this.lastKnownState=null;this.lastStateAttempt=null;this.started=false;b.removePopstateListener(this.boundOnPopState);return this}},{key:"getState",value:function h(){return this.lastKnownState}},{key:"isActive",value:function p(e){var t=arguments.length<=1||arguments[1]===undefined?{}:arguments[1];var r=arguments.length<=2||arguments[2]===undefined?false:arguments[2];var n=this.getState();if(!n)return false;if(r||n.name===e){return this.areStatesEqual(R(e,t),n)}return this.areStatesDescendants(R(e,t),n)}},{key:"areStatesEqual",value:function d(e,t){return e.name===t.name&&Object.keys(e.params).length===Object.keys(t.params).length&&Object.keys(e.params).every(function(r){return e.params[r]===t.params[r]})}},{key:"areStatesDescendants",value:function g(e,t){var r=new RegExp("^"+e.name+"\\.(.*)$");if(!r.test(t.name))return false;return Object.keys(e.params).every(function(r){return e.params[r]===t.params[r]})}},{key:"_invokeListeners",value:function y(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n$)/g,""):"[a-zA-Z0-9-_.~]+")+")"};var a=[{name:"url-parameter",pattern:/^:([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})(<(.+?)>)?/,regex:function i(e){return new RegExp(n(e[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 i(e){return new RegExp(";"+e[1]+"="+n(e[2]))}},{name:"query-parameter",pattern:/^(?:\?|&)(?:\:)?([a-zA-Z0-9-_]*[a-zA-Z0-9]{1})/},{name:"delimiter",pattern:/^(\/|\?)/,regex:function i(e){return new RegExp("\\"+e[0])}},{name:"sub-delimiter",pattern:/^(\!|\&|\-|_|\.|;)/,regex:function i(e){return new RegExp(e[0])}},{name:"fragment",pattern:/^([0-9a-zA-Z]+?)/,regex:function i(e){return new RegExp(e[0])}}];var u=function u(e){var t=arguments.length<=1||arguments[1]===undefined?[]:arguments[1];var r=a.some(function(r){var n=e.match(r.pattern);if(!n)return false;t.push({type:r.name,match:n[0],val:n.slice(1,2),otherVal:n.slice(2),regex:r.regex instanceof Function?r.regex(n):r.regex});if(n[0].length0;this.hasSpatParam=this.tokens.filter(function(e){return/splat$/.test(e.type)}).length>0;this.hasMatrixParams=this.tokens.filter(function(e){return/matrix$/.test(e.type)}).length>0;this.hasQueryParams=this.tokens.filter(function(e){return e.type==="query-parameter"}).length>0;this.urlParams=!this.hasUrlParams?[]:this.tokens.filter(function(e){return/^url-parameter/.test(e.type)}).map(function(e){return e.val.slice(0,1)}).reduce(function(e,t){return e.concat(t)});this.queryParams=!this.hasQueryParams?[]:this.tokens.filter(function(e){return e.type==="query-parameter"}).map(function(e){return e.val}).reduce(function(e,t){return e.concat(t)});this.params=this.urlParams.concat(this.queryParams);this.source=this.tokens.filter(function(e){return e.regex!==undefined}).map(function(e){return e.regex.source}).join("")}t(a,[{key:"_urlMatch",value:function i(e,t){var r=this;var n=e.match(t);if(!n)return null;else if(!this.urlParams.length)return{};return n.slice(1,this.urlParams.length+1).reduce(function(e,t,n){e[r.urlParams[n]]=t;return e},{})}},{key:"match",value:function f(e){var t=this;var r=arguments.length<=1||arguments[1]===undefined?0:arguments[1];var n=s(this.source,r);var a=this._urlMatch(e,new RegExp("^"+n+(this.hasQueryParams?"\\?.*$":"$")));if(!a||!this.hasQueryParams)return a;var i=l(e);var u=Object.keys(i).filter(function(e){return t.queryParams.indexOf(e)===-1});if(u.length===0){Object.keys(i).forEach(function(e){return a[e]=i[e]});return a}return null}},{key:"partialMatch",value:function h(e){var t=this;var r=arguments.length<=1||arguments[1]===undefined?0:arguments[1];var n=s(this.source,r);var a=this._urlMatch(e,new RegExp("^"+n));if(!a)return a;if(!this.hasQueryParams)return a;var i=l(e);Object.keys(i).filter(function(e){return t.queryParams.indexOf(e)>=0}).forEach(function(e){return o(a,e,i[e])});return a}},{key:"build",value:function v(){var e=arguments.length<=0||arguments[0]===undefined?{}:arguments[0];var t=arguments.length<=1||arguments[1]===undefined?{ignoreConstraints:false,ignoreSearch:false}:arguments[1];if(this.urlParams.some(function(t){return e[t]===undefined}))throw new Error("Missing parameters");if(!t.ignoreConstraints){var r=this.tokens.filter(function(e){return/^url-parameter/.test(e.type)&&!/-splat$/.test(e.type)}).every(function(t){return new RegExp("^"+n(t.otherVal[0])+"$").test(e[t.val])});if(!r)throw new Error("Some parameters are of invalid format")}var a=this.tokens.filter(function(e){return e.type!=="query-parameter"}).map(function(t){if(t.type==="url-parameter-matrix")return";"+t.val[0]+"="+e[t.val[0]];return/^url-parameter/.test(t.type)?e[t.val[0]]:t.match}).join("");if(t.ignoreSearch)return a;var i=this.queryParams.filter(function(t){return Object.keys(e).indexOf(t)!==-1}).map(function(t){return c(t,e[t])}).join("&");return a+(i?"?"+i:"")}}]);return a}();var v=function(){function e(e,t){var r=[];var n=true;var a=false;var i=undefined;try{for(var u=e[Symbol.iterator](),s;!(n=(s=u.next()).done);n=true){r.push(s.value);if(t&&r.length===t)break}}catch(o){a=true;i=o}finally{try{if(!n&&u["return"])u["return"]()}finally{if(a)throw i}}return r}return function(t,r){if(Array.isArray(t)){return t}else if(Symbol.iterator in Object(t)){return e(t,r)}else{throw new TypeError("Invalid attempt to destructure non-iterable instance")}}}();var m=function m(e){return e!==undefined&&e!==null&&e!==""};var p=function p(e,t){if(e.indexOf("?")===-1)return e;var r=e.split("?");var n=v(r,2);var a=n[0];var i=n[1];var u=i.split("&").reduce(function(e,r){var n=r.split("=");var a=v(n,2);var i=a[0];var u=a[1];if(t.indexOf(i)===-1)e[i]=u||"";return e},{});var s=Object.keys(u).map(function(e){return[e].concat(m(u[e])?u[e]:[])}).map(function(e){return e.join("=")}).join("&");return a+(s?"?"+s:"")};var d=function(){function e(){var t=arguments.length<=0||arguments[0]===undefined?"":arguments[0];var n=arguments.length<=1||arguments[1]===undefined?"":arguments[1];var a=arguments.length<=2||arguments[2]===undefined?[]:arguments[2];r(this,e);this.name=t;this.path=n;this.parser=n?new h(n):null;this.children=[];this.add(a);return this}t(e,[{key:"add",value:function n(t){var r=this;if(t===undefined||t===null)return;if(t instanceof Array){t.forEach(function(e){return r.add(e)});return}if(!(t instanceof e)&&!(t instanceof Object)){throw new Error("RouteNode.add() expects routes to be an Object or an instance of RouteNode.")}if(t instanceof Object){if(!t.name||!t.path){throw new Error("RouteNode.add() expects routes to have a name and a path defined.")}t=new e(t.name,t.path,t.children)}if(this.children.map(function(e){return e.name}).indexOf(t.name)!==-1){throw new Error('Alias "'+t.name+'" is already defined in route node')}if(this.children.map(function(e){return e.path}).indexOf(t.path)!==-1){throw new Error('Path "'+t.path+'" is already defined in route node')}var n=t.name.split(".");if(n.length===1){this.children.push(t);this.children.sort(function(e,t){if(e.path==="/")return 1;if(t.path==="/")return-1;var r=e.parser.hasUrlParams||e.parser.hasSpatParam;var n=t.parser.hasUrlParams||t.parser.hasSpatParam;if(!r&&!n){return e.path&&t.path?e.path.length0?a[n-1]:"";return{intersection:l,toDeactivate:s,toActivate:o}}function L(e,t,r,n){var a=false;var i=function i(){return a};var u=function u(){return a=true};var s=function s(e){return n(a?g.TRANSITION_CANCELLED:e)};var o=R(t,r);var l=o.intersection;var f=o.toDeactivate;var c=o.toActivate;var h=function h(t,r,n){var a=f.map(function(t){return e._cmps[t]}).filter(function(e){return e&&e.canDeactivate}).map(function(e){return e.canDeactivate});O(i,a,t,r,function(e){return n(e?g.CANNOT_DEACTIVATE:null)})};var v=function v(t,r,n){var a=c.map(function(t){return e._canAct[t]}).filter(function(e){return e});O(i,a,t,r,function(e){return n(e?g.CANNOT_ACTIVATE:null)})};var m=e._onTr;var p=function p(e,t,r){var n=[m];O(i,n,e,t,function(e){return r(e?g.TRANSITION_ERR:null)})};var d=e._cbs["^"+l];var y=function y(e,t,r){var n=d;O(i,n,e,t,function(e){return r(e?g.NODE_LISTENER_ERR:null)},true)};var S=(r?[h]:[]).concat(v).concat(m?p:[]).concat(d&&d.length?y:[]);O(i,S,t,r,s);return u}var v=function(){function e(e,t){var r=[];var n=true;var a=false;var i=undefined;try{for(var u=e[Symbol.iterator](),s;!(n=(s=u.next()).done);n=true){r.push(s.value);if(t&&r.length===t)break}}catch(o){a=true;i=o}finally{try{if(!n&&u["return"])u["return"]()}finally{if(a)throw i}}return r}return function(t,r){if(Array.isArray(t)){return t}else if(Symbol.iterator in Object(t)){return e(t,r)}else{throw new TypeError("Invalid attempt to destructure non-iterable instance")}}}();var x=Array.prototype.slice;var t=function(){function e(e,t){for(var r=0;r0){if(typeof t[0]==="string")a=t[0];if(typeof t[0]==="object")i=t[0]}this.started=true;var u=this.options;var s=function s(t,r){var a=arguments.length<=2||arguments[2]===undefined?true:arguments[2];N.addPopstateListener(e.boundOnPopState);if(n)n(t,r);if(t&&a)e._invokeListeners("$error",r,null,t)};if(!a&&!i)a=this.getLocation();if(!i){(function(){i=e.matchPath(a);var t=function t(){return e.navigate(u.defaultRoute,u.defaultParams,{replace:true},function(e,t){return s(e,t,false)})};if(i){e.lastStateAttempt=i;e._transition(e.lastStateAttempt,e.lastKnownState,function(r,n){if(!r){N.replaceState(e.lastKnownState,"",e.buildUrl(i.name,i.params));s(null,n)}else if(u.defaultRoute)t();else s(r,null,false)})}else if(u.defaultRoute){t()}else{s(g.ROUTE_NOT_FOUND,null)}})()}else{this.lastKnownState=i;N.replaceState(this.lastKnownState,"",this.buildUrl(i.name,i.params));s(null,i)}return this}},{key:"stop",value:function f(){if(!this.started)return this;this.lastKnownState=null;this.lastStateAttempt=null;this.started=false;N.removePopstateListener(this.boundOnPopState);return this}},{key:"getState",value:function c(){return this.lastKnownState}},{key:"isActive",value:function h(e){var t=arguments.length<=1||arguments[1]===undefined?{}:arguments[1];var r=arguments.length<=2||arguments[2]===undefined?false:arguments[2];var n=this.getState();if(!n)return false;if(r||n.name===e){return this.areStatesEqual(C(e,t),n)}return this.areStatesDescendants(C(e,t),n)}},{key:"areStatesEqual",value:function m(e,t){return e.name===t.name&&Object.keys(e.params).length===Object.keys(t.params).length&&Object.keys(e.params).every(function(r){return e.params[r]===t.params[r]})}},{key:"areStatesDescendants",value:function p(e,t){var r=new RegExp("^"+e.name+"\\.(.*)$");if(!r.test(t.name))return false;return Object.keys(e.params).every(function(r){return e.params[r]===t.params[r]})}},{key:"_invokeListeners",value:function y(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n