kdu-router 2.7.0 → 4.0.16-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +0,0 @@
1
- /**
2
- * Kdu-router v2.7.0
3
- * (c) 2022 NKDuy
4
- * @license MIT
5
- */
6
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.KduRouter=e()}(this,function(){"use strict";function t(t, e){}function e(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}function r(t, e){switch(typeof e){case"undefined":return;case"object":return e;case"function":return e(t);case"boolean":return e?t.params:void 0}}function n(t, e, r){void 0===e&&(e={});var n,i=r||o;try{n=i(t||"")}catch(t){n={}}for(var a in e){var u=e[a];n[a]=Array.isArray(u)?u.slice():u}return n}function o(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.split("&").forEach(function(t){var r=t.replace(/\+/g," ").split("="),n=$t(r.shift()),o=r.length>0?$t(r.join("=")):null;void 0===e[n]?e[n]=o:Array.isArray(e[n])?e[n].push(o):e[n]=[e[n],o]}),e):e}function i(t){var e=t?Object.keys(t).map(function(e){var r=t[e];if(void 0===r)return"";if(null===r)return Tt(e);if(Array.isArray(r)){var n=[];return r.forEach(function(t){void 0!==t&&(null===t?n.push(Tt(e)):n.push(Tt(e)+"="+Tt(t)))}),n.join("&")}return Tt(e)+"="+Tt(r)}).filter(function(t){return t.length>0}).join("&"):null;return e?"?"+e:""}function a(t, e, r, n){var o=n&&n.options.stringifyQuery,i={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:e.query||{},params:e.params||{},fullPath:c(e,o),matched:t?u(t):[]};return r&&(i.redirectedFrom=c(r,o)),Object.freeze(i)}function u(t){for(var e=[]; t;)e.unshift(t),t=t.parent;return e}function c(t, e){var r=t.path,n=t.query;void 0===n&&(n={});var o=t.hash;void 0===o&&(o="");var a=e||i;return(r||"/")+a(n)+o}function s(t, e){return e===qt?t===e:!!e&&(t.path&&e.path?t.path.replace(St,"")===e.path.replace(St,"")&&t.hash===e.hash&&p(t.query,e.query):!(!t.name||!e.name)&&(t.name===e.name&&t.hash===e.hash&&p(t.query,e.query)&&p(t.params,e.params)))}function p(t, e){void 0===t&&(t={}),void 0===e&&(e={});var r=Object.keys(t),n=Object.keys(e);return r.length===n.length&&r.every(function(r){var n=t[r],o=e[r];return"object"==typeof n&&"object"==typeof o?p(n,o):String(n)===String(o)})}function f(t, e){return 0===t.path.replace(St,"/").indexOf(e.path.replace(St,"/"))&&(!e.hash||t.hash===e.hash)&&h(t.query,e.query)}function h(t, e){for(var r in e)if(!(r in t))return!1;return!0}function l(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey||t.defaultPrevented||void 0!==t.button&&0!==t.button)){if(t.currentTarget&&t.currentTarget.getAttribute){var e=t.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function d(t){if(t)for(var e,r=0; r<t.length; r++){if("a"===(e=t[r]).tag)return e;if(e.children&&(e=d(e.children)))return e}}function y(t){if(!y.installed){y.installed=!0,Ot=t;var e=function(t){return void 0!==t},r=function(t, r){var n=t.$options._parentVnode;e(n)&&e(n=n.data)&&e(n=n.registerRouteInstance)&&n(t,r)};t.mixin({beforeCreate:function(){e(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("router-view",Ct),t.component("router-link",Ut);var n=t.config.optionMergeStrategies;n.beforeRouteEnter=n.beforeRouteLeave=n.beforeRouteUpdate=n.created}}function v(t, e, r){var n=t.charAt(0);if("/"===n)return t;if("?"===n||"#"===n)return e+t;var o=e.split("/");r&&o[o.length-1]||o.pop();for(var i=t.replace(/^\//,"").split("/"),a=0; a<i.length; a++){var u=i[a];".."===u?o.pop():"."!==u&&o.push(u)}return""!==o[0]&&o.unshift(""),o.join("/")}function m(t){var e="",r="",n=t.indexOf("#");n>=0&&(e=t.slice(n),t=t.slice(0,n));var o=t.indexOf("?");return o>=0&&(r=t.slice(o+1),t=t.slice(0,o)),{path:t,query:r,hash:e}}function g(t){return t.replace(/\/\//g,"/")}function b(t, e){for(var r,n=[],o=0,i=0,a="",u=e&&e.delimiter||"/"; null!=(r=Ft.exec(t));){var c=r[0],s=r[1],p=r.index;if(a+=t.slice(i,p),i=p+c.length,s)a+=s[1];else{var f=t[i],h=r[2],l=r[3],d=r[4],y=r[5],v=r[6],m=r[7];a&&(n.push(a),a="");var g=null!=h&&null!=f&&f!==h,b="+"===v||"*"===v,w="?"===v||"*"===v,x=r[2]||u,k=d||y;n.push({name:l||o++,prefix:h||"",delimiter:x,optional:w,repeat:b,partial:g,asterisk:!!m,pattern:k?E(k):m?".*":"[^"+R(x)+"]+?"})}}return i<t.length&&(a+=t.substr(i)),a&&n.push(a),n}function w(t){return encodeURI(t).replace(/[\/?#]/g,function(t){return"%"+t.charCodeAt(0).toString(16).toUpperCase()})}function x(t){return encodeURI(t).replace(/[?#]/g,function(t){return"%"+t.charCodeAt(0).toString(16).toUpperCase()})}function k(t){for(var e=new Array(t.length),r=0; r<t.length; r++)"object"==typeof t[r]&&(e[r]=new RegExp("^(?:"+t[r].pattern+")$"));return function(r, n){for(var o="",i=r||{},a=(n||{}).pretty?w:encodeURIComponent,u=0; u<t.length; u++){var c=t[u];if("string"!=typeof c){var s,p=i[c.name];if(null==p){if(c.optional){c.partial&&(o+=c.prefix);continue}throw new TypeError('Expected "'+c.name+'" to be defined')}if(It(p)){if(!c.repeat)throw new TypeError('Expected "'+c.name+'" to not repeat, but received `'+JSON.stringify(p)+"`");if(0===p.length){if(c.optional)continue;throw new TypeError('Expected "'+c.name+'" to not be empty')}for(var f=0; f<p.length; f++){if(s=a(p[f]),!e[u].test(s))throw new TypeError('Expected all "'+c.name+'" to match "'+c.pattern+'", but received `'+JSON.stringify(s)+"`");o+=(0===f?c.prefix:c.delimiter)+s}}else{if(s=c.asterisk?x(p):a(p),!e[u].test(s))throw new TypeError('Expected "'+c.name+'" to match "'+c.pattern+'", but received "'+s+'"');o+=c.prefix+s}}else o+=c}return o}}function R(t){return t.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function E(t){return t.replace(/([=!:$\/()])/g,"\\$1")}function O(t, e){return t.keys=e,t}function C(t){return t.sensitive?"":"i"}function A(t, e){var r=t.source.match(/\((?!\?)/g);if(r)for(var n=0; n<r.length; n++)e.push({name:n,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return O(t,e)}function j(t, e, r){for(var n=[],o=0; o<t.length; o++)n.push($(t[o],e,r).source);return O(new RegExp("(?:"+n.join("|")+")",C(r)),e)}function _(t, e, r){return T(b(t,r),e,r)}function T(t, e, r){It(e)||(r=e||r,e=[]);for(var n=(r=r||{}).strict,o=!1!==r.end,i="",a=0; a<t.length; a++){var u=t[a];if("string"==typeof u)i+=R(u);else{var c=R(u.prefix),s="(?:"+u.pattern+")";e.push(u),u.repeat&&(s+="(?:"+c+s+")*"),i+=s=u.optional?u.partial?c+"("+s+")?":"(?:"+c+"("+s+"))?":c+"("+s+")"}}var p=R(r.delimiter||"/"),f=i.slice(-p.length)===p;return n||(i=(f?i.slice(0,-p.length):i)+"(?:"+p+"(?=$))?"),i+=o?"$":n&&f?"":"(?="+p+"|$)",O(new RegExp("^"+i,C(r)),e)}function $(t, e, r){return It(e)||(r=e||r,e=[]),r=r||{},t instanceof RegExp?A(t,e):It(t)?j(t,e,r):_(t,e,r)}function S(t, e, r){try{return(Dt[t]||(Dt[t]=Mt.compile(t)))(e||{},{pretty:!0})}catch(t){return""}}function q(t, e, r, n){var o=e||[],i=r||Object.create(null),a=n||Object.create(null);t.forEach(function(t){L(o,i,a,t)});for(var u=0,c=o.length; u<c; u++)"*"===o[u]&&(o.push(o.splice(u,1)[0]),c--,u--);return{pathList:o,pathMap:i,nameMap:a}}function L(t, e, r, n, o, i){var a=n.path,u=n.name,c=U(a,o),s=n.pathToRegexpOptions||{};"boolean"==typeof n.caseSensitive&&(s.sensitive=n.caseSensitive);var p={path:c,regex:P(c,s),components:n.components||{default:n.component},instances:{},name:u,parent:o,matchAs:i,redirect:n.redirect,beforeEnter:n.beforeEnter,meta:n.meta||{},props:null==n.props?{}:n.components?n.props:{default:n.props}};n.children&&n.children.forEach(function(n){var o=i?g(i+"/"+n.path):void 0;L(t,e,r,n,p,o)}),void 0!==n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(function(i){var a={path:i,children:n.children};L(t,e,r,a,o,p.path||"/")}),e[p.path]||(t.push(p.path),e[p.path]=p),u&&(r[u]||(r[u]=p))}function P(t, e){return Mt(t,[],e)}function U(t, e){return t=t.replace(/\/$/,""),"/"===t[0]?t:null==e?t:g(e.path+"/"+t)}function H(t, e, r, o){var i="string"==typeof t?{path:t}:t;if(i.name||i._normalized)return i;if(!i.path&&i.params&&e){(i=I({},i))._normalized=!0;var a=I(I({},e.params),i.params);if(e.name)i.name=e.name,i.params=a;else if(e.matched.length){var u=e.matched[e.matched.length-1].path;i.path=S(u,a,"path "+e.path)}return i}var c=m(i.path||""),s=e&&e.path||"/",p=c.path?v(c.path,s,r||i.append):s,f=n(c.query,i.query,o&&o.options.parseQuery),h=i.hash||c.hash;return h&&"#"!==h.charAt(0)&&(h="#"+h),{_normalized:!0,path:p,query:f,hash:h}}function I(t, e){for(var r in e)t[r]=e[r];return t}function M(t, e){function r(t, r, n){var o=H(t,r,!1,e),a=o.name;if(a){var u=p[a];if(!u)return i(null,o);var f=u.regex.keys.filter(function(t){return!t.optional}).map(function(t){return t.name});if("object"!=typeof o.params&&(o.params={}),r&&"object"==typeof r.params)for(var h in r.params)!(h in o.params)&&f.indexOf(h)>-1&&(o.params[h]=r.params[h]);if(u)return o.path=S(u.path,o.params,'named route "'+a+'"'),i(u,o,n)}else if(o.path){o.params={};for(var l=0; l<c.length; l++){var d=c[l],y=s[d];if(V(y.regex,o.path,o.params))return i(y,o,n)}}return i(null,o)}function n(t, n){var o=t.redirect,u="function"==typeof o?o(a(t,n,null,e)):o;if("string"==typeof u&&(u={path:u}),!u||"object"!=typeof u)return i(null,n);var c=u,s=c.name,f=c.path,h=n.query,l=n.hash,d=n.params;if(h=c.hasOwnProperty("query")?c.query:h,l=c.hasOwnProperty("hash")?c.hash:l,d=c.hasOwnProperty("params")?c.params:d,s){p[s];return r({_normalized:!0,name:s,query:h,hash:l,params:d},void 0,n)}if(f){var y=z(f,t);return r({_normalized:!0,path:S(y,d,'redirect route with path "'+y+'"'),query:h,hash:l},void 0,n)}return i(null,n)}function o(t, e, n){var o=r({_normalized:!0,path:S(n,e.params,'aliased route with path "'+n+'"')});if(o){var a=o.matched,u=a[a.length-1];return e.params=o.params,i(u,e)}return i(null,e)}function i(t, r, i){return t&&t.redirect?n(t,i||r):t&&t.matchAs?o(t,r,t.matchAs):a(t,r,i,e)}var u=q(t),c=u.pathList,s=u.pathMap,p=u.nameMap;return{match:r,addRoutes:function(t){q(t,c,s,p)}}}function V(t, e, r){var n=e.match(t);if(!n)return!1;if(!r)return!0;for(var o=1,i=n.length; o<i; ++o){var a=t.keys[o-1],u="string"==typeof n[o]?decodeURIComponent(n[o]):n[o];a&&(r[a.name]=u)}return!0}function z(t, e){return v(t,e.parent?e.parent.path:"/",!0)}function B(){window.addEventListener("popstate",function(t){D(),t.state&&t.state.key&&Z(t.state.key)})}function F(t, e, r, n){if(t.app){var o=t.options.scrollBehavior;o&&t.app.$nextTick(function(){var t=K(),i=o(e,r,n?t:null);if(i){var a="object"==typeof i;if(a&&"string"==typeof i.selector){var u=document.querySelector(i.selector);if(u){var c=i.offset&&"object"==typeof i.offset?i.offset:{};t=J(u,c=X(c))}else N(i)&&(t=Q(i))}else a&&N(i)&&(t=Q(i));t&&window.scrollTo(t.x,t.y)}})}}function D(){var t=G();t&&(Kt[t]={x:window.pageXOffset,y:window.pageYOffset})}function K(){var t=G();if(t)return Kt[t]}function J(t, e){var r=document.documentElement.getBoundingClientRect(),n=t.getBoundingClientRect();return{x:n.left-r.left-e.x,y:n.top-r.top-e.y}}function N(t){return Y(t.x)||Y(t.y)}function Q(t){return{x:Y(t.x)?t.x:window.pageXOffset,y:Y(t.y)?t.y:window.pageYOffset}}function X(t){return{x:Y(t.x)?t.x:0,y:Y(t.y)?t.y:0}}function Y(t){return"number"==typeof t}function W(){return Nt.now().toFixed(3)}function G(){return Qt}function Z(t){Qt=t}function tt(t, e){D();var r=window.history;try{e?r.replaceState({key:Qt},"",t):(Qt=W(),r.pushState({key:Qt},"",t))}catch(r){window.location[e?"replace":"assign"](t)}}function et(t){tt(t,!0)}function rt(t, e, r){var n=function(o){o>=t.length?r():t[o]?e(t[o],function(){n(o+1)}):n(o+1)};n(0)}function nt(t){return function(r, n, o){var i=!1,a=0,u=null;ot(t,function(t, r, n, c){if("function"==typeof t&&void 0===t.cid){i=!0,a++;var s,p=at(function(e){e.__esModule&&e.default&&(e=e.default),t.resolved="function"==typeof e?e:Ot.extend(e),n.components[c]=e,--a<=0&&o()}),f=at(function(t){var r="Failed to resolve async component "+c+": "+t;u||(u=e(t)?t:new Error(r),o(u))});try{s=t(p,f)}catch(t){f(t)}if(s)if("function"==typeof s.then)s.then(p,f);else{var h=s.component;h&&"function"==typeof h.then&&h.then(p,f)}}}),i||o()}}function ot(t, e){return it(t.map(function(t){return Object.keys(t.components).map(function(r){return e(t.components[r],t.instances[r],t,r)})}))}function it(t){return Array.prototype.concat.apply([],t)}function at(t){var e=!1;return function(){for(var r=[],n=arguments.length; n--;)r[n]=arguments[n];if(!e)return e=!0,t.apply(this,r)}}function ut(t){if(!t)if(Ht){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";return"/"!==t.charAt(0)&&(t="/"+t),t.replace(/\/$/,"")}function ct(t, e){var r,n=Math.max(t.length,e.length);for(r=0; r<n&&t[r]===e[r]; r++);return{updated:e.slice(0,r),activated:e.slice(r),deactivated:t.slice(r)}}function st(t, e, r, n){var o=ot(t,function(t, n, o, i){var a=pt(t,e);if(a)return Array.isArray(a)?a.map(function(t){return r(t,n,o,i)}):r(a,n,o,i)});return it(n?o.reverse():o)}function pt(t, e){return"function"!=typeof t&&(t=Ot.extend(t)),t.options[e]}function ft(t){return st(t,"beforeRouteLeave",lt,!0)}function ht(t){return st(t,"beforeRouteUpdate",lt)}function lt(t, e){if(e)return function(){return t.apply(e,arguments)}}function dt(t, e, r){return st(t,"beforeRouteEnter",function(t, n, o, i){return yt(t,o,i,e,r)})}function yt(t, e, r, n, o){return function(i, a, u){return t(i,a,function(t){u(t),"function"==typeof t&&n.push(function(){vt(t,e.instances,r,o)})})}}function vt(t, e, r, n){e[r]?t(e[r]):n()&&setTimeout(function(){vt(t,e,r,n)},16)}function mt(t){var e=window.location.pathname;return t&&0===e.indexOf(t)&&(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}function gt(t){var e=mt(t);if(!/^\/#/.test(e))return window.location.replace(g(t+"/#"+e)),!0}function bt(){var t=wt();return"/"===t.charAt(0)||(kt("/"+t),!1)}function wt(){var t=window.location.href,e=t.indexOf("#");return-1===e?"":t.slice(e+1)}function xt(t){window.location.hash=t}function kt(t){var e=window.location.href,r=e.indexOf("#"),n=r>=0?e.slice(0,r):e;window.location.replace(n+"#"+t)}function Rt(t, e){return t.push(e),function(){var r=t.indexOf(e);r>-1&&t.splice(r,1)}}function Et(t, e, r){var n="hash"===r?"#"+e:e;return t?g(t+"/"+n):n}var Ot,Ct={name:"router-view",functional:!0,props:{name:{type:String,default:"default"}},render:function(t, e){var n=e.props,o=e.children,i=e.parent,a=e.data;a.routerView=!0;for(var u=i.$createElement,c=n.name,s=i.$route,p=i._routerViewCache||(i._routerViewCache={}),f=0,h=!1; i&&i._routerRoot!==i;)i.$vnode&&i.$vnode.data.routerView&&f++,i._inactive&&(h=!0),i=i.$parent;if(a.routerViewDepth=f,h)return u(p[c],a,o);var l=s.matched[f];if(!l)return p[c]=null,u();var d=p[c]=l.components[c];return a.registerRouteInstance=function(t, e){var r=l.instances[c];(e&&r!==t||!e&&r===t)&&(l.instances[c]=e)},(a.hook||(a.hook={})).prepatch=function(t, e){l.instances[c]=e.componentInstance},a.props=r(s,l.props&&l.props[c]),u(d,a,o)}},At=/[!'()*]/g,jt=function(t){return"%"+t.charCodeAt(0).toString(16)},_t=/%2C/g,Tt=function(t){return encodeURIComponent(t).replace(At,jt).replace(_t,",")},$t=decodeURIComponent,St=/\/?$/,qt=a(null,{path:"/"}),Lt=[String,Object],Pt=[String,Array],Ut={name:"router-link",props:{to:{type:Lt,required:!0},tag:{type:String,default:"a"},exact:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,event:{type:Pt,default:"click"}},render:function(t){var e=this,r=this.$router,n=this.$route,o=r.resolve(this.to,n,this.append),i=o.location,u=o.route,c=o.href,p={},h=r.options.linkActiveClass,y=r.options.linkExactActiveClass,v=null==h?"router-link-active":h,m=null==y?"router-link-exact-active":y,g=null==this.activeClass?v:this.activeClass,b=null==this.exactActiveClass?m:this.exactActiveClass,w=i.path?a(null,i,null,r):u;p[b]=s(n,w),p[g]=this.exact?p[b]:f(n,w);var x=function(t){l(t)&&(e.replace?r.replace(i):r.push(i))},k={click:l};Array.isArray(this.event)?this.event.forEach(function(t){k[t]=x}):k[this.event]=x;var R={class:p};if("a"===this.tag)R.on=k,R.attrs={href:c};else{var E=d(this.$slots.default);if(E){E.isStatic=!1;var O=Ot.util.extend;(E.data=O({},E.data)).on=k,(E.data.attrs=O({},E.data.attrs)).href=c}else R.on=k}return t(this.tag,R,this.$slots.default)}},Ht="undefined"!=typeof window,It=Array.isArray||function(t){return"[object Array]"==Object.prototype.toString.call(t)},Mt=$,Vt=b,zt=k,Bt=T,Ft=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");Mt.parse=Vt,Mt.compile=function(t, e){return k(b(t,e))},Mt.tokensToFunction=zt,Mt.tokensToRegExp=Bt;var Dt=Object.create(null),Kt=Object.create(null),Jt=Ht&&function(){var t=window.navigator.userAgent;return(-1===t.indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&(window.history&&"pushState"in window.history)}(),Nt=Ht&&window.performance&&window.performance.now?window.performance:Date,Qt=W(),Xt=function(t, e){this.router=t,this.base=ut(e),this.current=qt,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[]};Xt.prototype.listen=function(t){this.cb=t},Xt.prototype.onReady=function(t, e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},Xt.prototype.onError=function(t){this.errorCbs.push(t)},Xt.prototype.transitionTo=function(t, e, r){var n=this,o=this.router.match(t,this.current);this.confirmTransition(o,function(){n.updateRoute(o),e&&e(o),n.ensureURL(),n.ready||(n.ready=!0,n.readyCbs.forEach(function(t){t(o)}))},function(t){r&&r(t),t&&!n.ready&&(n.ready=!0,n.readyErrorCbs.forEach(function(e){e(t)}))})},Xt.prototype.confirmTransition=function(r, n, o){var i=this,a=this.current,u=function(r){e(r)&&(i.errorCbs.length?i.errorCbs.forEach(function(t){t(r)}):(t(!1,"uncaught error during route navigation:"),console.error(r))),o&&o(r)};if(s(r,a)&&r.matched.length===a.matched.length)return this.ensureURL(),u();var c=ct(this.current.matched,r.matched),p=c.updated,f=c.deactivated,h=c.activated,l=[].concat(ft(f),this.router.beforeHooks,ht(p),h.map(function(t){return t.beforeEnter}),nt(h));this.pending=r;var d=function(t, n){if(i.pending!==r)return u();try{t(r,a,function(t){!1===t||e(t)?(i.ensureURL(!0),u(t)):"string"==typeof t||"object"==typeof t&&("string"==typeof t.path||"string"==typeof t.name)?(u(),"object"==typeof t&&t.replace?i.replace(t):i.push(t)):n(t)})}catch(t){u(t)}};rt(l,d,function(){var t=[];rt(dt(h,t,function(){return i.current===r}).concat(i.router.resolveHooks),d,function(){if(i.pending!==r)return u();i.pending=null,n(r),i.router.app&&i.router.app.$nextTick(function(){t.forEach(function(t){t()})})})})},Xt.prototype.updateRoute=function(t){var e=this.current;this.current=t,this.cb&&this.cb(t),this.router.afterHooks.forEach(function(r){r&&r(t,e)})};var Yt=function(t){function e(e, r){var n=this;t.call(this,e,r);var o=e.options.scrollBehavior;o&&B(),window.addEventListener("popstate",function(t){var r=n.current;n.transitionTo(mt(n.base),function(t){o&&F(e,t,r,!0)})})}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t, e, r){var n=this,o=this.current;this.transitionTo(t,function(t){tt(g(n.base+t.fullPath)),F(n.router,t,o,!1),e&&e(t)},r)},e.prototype.replace=function(t, e, r){var n=this,o=this.current;this.transitionTo(t,function(t){et(g(n.base+t.fullPath)),F(n.router,t,o,!1),e&&e(t)},r)},e.prototype.ensureURL=function(t){if(mt(this.base)!==this.current.fullPath){var e=g(this.base+this.current.fullPath);t?tt(e):et(e)}},e.prototype.getCurrentLocation=function(){return mt(this.base)},e}(Xt),Wt=function(t){function e(e, r, n){t.call(this,e,r),n&&gt(this.base)||bt()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;window.addEventListener("hashchange",function(){bt()&&t.transitionTo(wt(),function(t){kt(t.fullPath)})})},e.prototype.push=function(t, e, r){this.transitionTo(t,function(t){xt(t.fullPath),e&&e(t)},r)},e.prototype.replace=function(t, e, r){this.transitionTo(t,function(t){kt(t.fullPath),e&&e(t)},r)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;wt()!==e&&(t?xt(e):kt(e))},e.prototype.getCurrentLocation=function(){return wt()},e}(Xt),Gt=function(t){function e(e, r){t.call(this,e,r),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t, e, r){var n=this;this.transitionTo(t,function(t){n.stack=n.stack.slice(0,n.index+1).concat(t),n.index++,e&&e(t)},r)},e.prototype.replace=function(t, e, r){var n=this;this.transitionTo(t,function(t){n.stack=n.stack.slice(0,n.index).concat(t),e&&e(t)},r)},e.prototype.go=function(t){var e=this,r=this.index+t;if(!(r<0||r>=this.stack.length)){var n=this.stack[r];this.confirmTransition(n,function(){e.index=r,e.updateRoute(n)})}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(Xt),Zt=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=M(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!Jt&&!1!==t.fallback,this.fallback&&(e="hash"),Ht||(e="abstract"),this.mode=e,e){case"history":this.history=new Yt(this,t.base);break;case"hash":this.history=new Wt(this,t.base,this.fallback);break;case"abstract":this.history=new Gt(this,t.base)}},te={currentRoute:{}};return Zt.prototype.match=function(t, e, r){return this.matcher.match(t,e,r)},te.currentRoute.get=function(){return this.history&&this.history.current},Zt.prototype.init=function(t){var e=this;if(this.apps.push(t),!this.app){this.app=t;var r=this.history;if(r instanceof Yt)r.transitionTo(r.getCurrentLocation());else if(r instanceof Wt){var n=function(){r.setupListeners()};r.transitionTo(r.getCurrentLocation(),n,n)}r.listen(function(t){e.apps.forEach(function(e){e._route=t})})}},Zt.prototype.beforeEach=function(t){return Rt(this.beforeHooks,t)},Zt.prototype.beforeResolve=function(t){return Rt(this.resolveHooks,t)},Zt.prototype.afterEach=function(t){return Rt(this.afterHooks,t)},Zt.prototype.onReady=function(t, e){this.history.onReady(t,e)},Zt.prototype.onError=function(t){this.history.onError(t)},Zt.prototype.push=function(t, e, r){this.history.push(t,e,r)},Zt.prototype.replace=function(t, e, r){this.history.replace(t,e,r)},Zt.prototype.go=function(t){this.history.go(t)},Zt.prototype.back=function(){this.go(-1)},Zt.prototype.forward=function(){this.go(1)},Zt.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map(function(t){return Object.keys(t.components).map(function(e){return t.components[e]})})):[]},Zt.prototype.resolve=function(t, e, r){var n=H(t,e||this.history.current,r,this),o=this.match(n,e),i=o.redirectedFrom||o.fullPath;return{location:n,route:o,href:Et(this.history.base,i,this.mode),normalizedTo:n,resolved:o}},Zt.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==qt&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Zt.prototype,te),Zt.install=y,Zt.version="2.7.0",Ht&&window.Kdu&&window.Kdu.use(Zt),Zt});
@@ -1,138 +0,0 @@
1
- /* @flow */
2
-
3
- import { createRoute, isSameRoute, isIncludedRoute } from '../util/route'
4
- import { _Kdu } from '../install'
5
-
6
- // work around weird flow bug
7
- const toTypes: Array<Function> = [String, Object]
8
- const eventTypes: Array<Function> = [String, Array]
9
-
10
- export default {
11
- name: 'router-link',
12
- props: {
13
- to: {
14
- type: toTypes,
15
- required: true
16
- },
17
- tag: {
18
- type: String,
19
- default: 'a'
20
- },
21
- exact: Boolean,
22
- append: Boolean,
23
- replace: Boolean,
24
- activeClass: String,
25
- exactActiveClass: String,
26
- event: {
27
- type: eventTypes,
28
- default: 'click'
29
- }
30
- },
31
- render (h: Function) {
32
- const router = this.$router
33
- const current = this.$route
34
- const { location, route, href } = router.resolve(this.to, current, this.append)
35
-
36
- const classes = {}
37
- const globalActiveClass = router.options.linkActiveClass
38
- const globalExactActiveClass = router.options.linkExactActiveClass
39
- // Support global empty active class
40
- const activeClassFallback = globalActiveClass == null
41
- ? 'router-link-active'
42
- : globalActiveClass
43
- const exactActiveClassFallback = globalExactActiveClass == null
44
- ? 'router-link-exact-active'
45
- : globalExactActiveClass
46
- const activeClass = this.activeClass == null
47
- ? activeClassFallback
48
- : this.activeClass
49
- const exactActiveClass = this.exactActiveClass == null
50
- ? exactActiveClassFallback
51
- : this.exactActiveClass
52
- const compareTarget = location.path
53
- ? createRoute(null, location, null, router)
54
- : route
55
-
56
- classes[exactActiveClass] = isSameRoute(current, compareTarget)
57
- classes[activeClass] = this.exact
58
- ? classes[exactActiveClass]
59
- : isIncludedRoute(current, compareTarget)
60
-
61
- const handler = e => {
62
- if (guardEvent(e)) {
63
- if (this.replace) {
64
- router.replace(location)
65
- } else {
66
- router.push(location)
67
- }
68
- }
69
- }
70
-
71
- const on = { click: guardEvent }
72
- if (Array.isArray(this.event)) {
73
- this.event.forEach(e => { on[e] = handler })
74
- } else {
75
- on[this.event] = handler
76
- }
77
-
78
- const data: any = {
79
- class: classes
80
- }
81
-
82
- if (this.tag === 'a') {
83
- data.on = on
84
- data.attrs = { href }
85
- } else {
86
- // find the first <a> child and apply listener and href
87
- const a = findAnchor(this.$slots.default)
88
- if (a) {
89
- // in case the <a> is a static node
90
- a.isStatic = false
91
- const extend = _Kdu.util.extend
92
- const aData = a.data = extend({}, a.data)
93
- aData.on = on
94
- const aAttrs = a.data.attrs = extend({}, a.data.attrs)
95
- aAttrs.href = href
96
- } else {
97
- // doesn't have <a> child, apply listener to self
98
- data.on = on
99
- }
100
- }
101
-
102
- return h(this.tag, data, this.$slots.default)
103
- }
104
- }
105
-
106
- function guardEvent (e) {
107
- // don't redirect with control keys
108
- if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) return
109
- // don't redirect when preventDefault called
110
- if (e.defaultPrevented) return
111
- // don't redirect on right click
112
- if (e.button !== undefined && e.button !== 0) return
113
- // don't redirect if `target="_blank"`
114
- if (e.currentTarget && e.currentTarget.getAttribute) {
115
- const target = e.currentTarget.getAttribute('target')
116
- if (/\b_blank\b/i.test(target)) return
117
- }
118
- // this may be a Weex event which doesn't have this method
119
- if (e.preventDefault) {
120
- e.preventDefault()
121
- }
122
- return true
123
- }
124
-
125
- function findAnchor (children) {
126
- if (children) {
127
- let child
128
- for (let i = 0; i < children.length; i++) {
129
- child = children[i]
130
- if (child.tag === 'a') {
131
- return child
132
- }
133
- if (child.children && (child = findAnchor(child.children))) {
134
- return child
135
- }
136
- }
137
- }
138
- }
@@ -1,96 +0,0 @@
1
- import { warn } from '../util/warn'
2
-
3
- export default {
4
- name: 'router-view',
5
- functional: true,
6
- props: {
7
- name: {
8
- type: String,
9
- default: 'default'
10
- }
11
- },
12
- render (_, { props, children, parent, data }) {
13
- data.routerView = true
14
-
15
- // directly use parent context's createElement() function
16
- // so that components rendered by router-view can resolve named slots
17
- const h = parent.$createElement
18
- const name = props.name
19
- const route = parent.$route
20
- const cache = parent._routerViewCache || (parent._routerViewCache = {})
21
-
22
- // determine current view depth, also check to see if the tree
23
- // has been toggled inactive but kept-alive.
24
- let depth = 0
25
- let inactive = false
26
- while (parent && parent._routerRoot !== parent) {
27
- if (parent.$vnode && parent.$vnode.data.routerView) {
28
- depth++
29
- }
30
- if (parent._inactive) {
31
- inactive = true
32
- }
33
- parent = parent.$parent
34
- }
35
- data.routerViewDepth = depth
36
-
37
- // render previous view if the tree is inactive and kept-alive
38
- if (inactive) {
39
- return h(cache[name], data, children)
40
- }
41
-
42
- const matched = route.matched[depth]
43
- // render empty node if no matched route
44
- if (!matched) {
45
- cache[name] = null
46
- return h()
47
- }
48
-
49
- const component = cache[name] = matched.components[name]
50
-
51
- // attach instance registration hook
52
- // this will be called in the instance's injected lifecycle hooks
53
- data.registerRouteInstance = (vm, val) => {
54
- // val could be undefined for unregistration
55
- const current = matched.instances[name]
56
- if (
57
- (val && current !== vm) ||
58
- (!val && current === vm)
59
- ) {
60
- matched.instances[name] = val
61
- }
62
- }
63
-
64
- // also regiseter instance in prepatch hook
65
- // in case the same component instance is reused across different routes
66
- ;(data.hook || (data.hook = {})).prepatch = (_, vnode) => {
67
- matched.instances[name] = vnode.componentInstance
68
- }
69
-
70
- // resolve props
71
- data.props = resolveProps(route, matched.props && matched.props[name])
72
-
73
- return h(component, data, children)
74
- }
75
- }
76
-
77
- function resolveProps (route, config) {
78
- switch (typeof config) {
79
- case 'undefined':
80
- return
81
- case 'object':
82
- return config
83
- case 'function':
84
- return config(route)
85
- case 'boolean':
86
- return config ? route.params : undefined
87
- default:
88
- if (process.env.NODE_ENV !== 'production') {
89
- warn(
90
- false,
91
- `props in "${route.path}" is a ${typeof config}, ` +
92
- `expecting an object, function or boolean.`
93
- )
94
- }
95
- }
96
- }
@@ -1,201 +0,0 @@
1
- /* @flow */
2
-
3
- import type KduRouter from './index'
4
- import { resolvePath } from './util/path'
5
- import { assert, warn } from './util/warn'
6
- import { createRoute } from './util/route'
7
- import { fillParams } from './util/params'
8
- import { createRouteMap } from './create-route-map'
9
- import { normalizeLocation } from './util/location'
10
-
11
- export type Matcher = {
12
- match: (raw: RawLocation, current?: Route, redirectedFrom?: Location) => Route;
13
- addRoutes: (routes: Array<RouteConfig>) => void;
14
- };
15
-
16
- export function createMatcher (
17
- routes: Array<RouteConfig>,
18
- router: KduRouter
19
- ): Matcher {
20
- const { pathList, pathMap, nameMap } = createRouteMap(routes)
21
-
22
- function addRoutes (routes) {
23
- createRouteMap(routes, pathList, pathMap, nameMap)
24
- }
25
-
26
- function match (
27
- raw: RawLocation,
28
- currentRoute?: Route,
29
- redirectedFrom?: Location
30
- ): Route {
31
- const location = normalizeLocation(raw, currentRoute, false, router)
32
- const { name } = location
33
-
34
- if (name) {
35
- const record = nameMap[name]
36
- if (process.env.NODE_ENV !== 'production') {
37
- warn(record, `Route with name '${name}' does not exist`)
38
- }
39
- if (!record) return _createRoute(null, location)
40
- const paramNames = record.regex.keys
41
- .filter(key => !key.optional)
42
- .map(key => key.name)
43
-
44
- if (typeof location.params !== 'object') {
45
- location.params = {}
46
- }
47
-
48
- if (currentRoute && typeof currentRoute.params === 'object') {
49
- for (const key in currentRoute.params) {
50
- if (!(key in location.params) && paramNames.indexOf(key) > -1) {
51
- location.params[key] = currentRoute.params[key]
52
- }
53
- }
54
- }
55
-
56
- if (record) {
57
- location.path = fillParams(record.path, location.params, `named route "${name}"`)
58
- return _createRoute(record, location, redirectedFrom)
59
- }
60
- } else if (location.path) {
61
- location.params = {}
62
- for (let i = 0; i < pathList.length; i++) {
63
- const path = pathList[i]
64
- const record = pathMap[path]
65
- if (matchRoute(record.regex, location.path, location.params)) {
66
- return _createRoute(record, location, redirectedFrom)
67
- }
68
- }
69
- }
70
- // no match
71
- return _createRoute(null, location)
72
- }
73
-
74
- function redirect (
75
- record: RouteRecord,
76
- location: Location
77
- ): Route {
78
- const originalRedirect = record.redirect
79
- let redirect = typeof originalRedirect === 'function'
80
- ? originalRedirect(createRoute(record, location, null, router))
81
- : originalRedirect
82
-
83
- if (typeof redirect === 'string') {
84
- redirect = { path: redirect }
85
- }
86
-
87
- if (!redirect || typeof redirect !== 'object') {
88
- if (process.env.NODE_ENV !== 'production') {
89
- warn(
90
- false, `invalid redirect option: ${JSON.stringify(redirect)}`
91
- )
92
- }
93
- return _createRoute(null, location)
94
- }
95
-
96
- const re: Object = redirect
97
- const { name, path } = re
98
- let { query, hash, params } = location
99
- query = re.hasOwnProperty('query') ? re.query : query
100
- hash = re.hasOwnProperty('hash') ? re.hash : hash
101
- params = re.hasOwnProperty('params') ? re.params : params
102
-
103
- if (name) {
104
- // resolved named direct
105
- const targetRecord = nameMap[name]
106
- if (process.env.NODE_ENV !== 'production') {
107
- assert(targetRecord, `redirect failed: named route "${name}" not found.`)
108
- }
109
- return match({
110
- _normalized: true,
111
- name,
112
- query,
113
- hash,
114
- params
115
- }, undefined, location)
116
- } else if (path) {
117
- // 1. resolve relative redirect
118
- const rawPath = resolveRecordPath(path, record)
119
- // 2. resolve params
120
- const resolvedPath = fillParams(rawPath, params, `redirect route with path "${rawPath}"`)
121
- // 3. rematch with existing query and hash
122
- return match({
123
- _normalized: true,
124
- path: resolvedPath,
125
- query,
126
- hash
127
- }, undefined, location)
128
- } else {
129
- if (process.env.NODE_ENV !== 'production') {
130
- warn(false, `invalid redirect option: ${JSON.stringify(redirect)}`)
131
- }
132
- return _createRoute(null, location)
133
- }
134
- }
135
-
136
- function alias (
137
- record: RouteRecord,
138
- location: Location,
139
- matchAs: string
140
- ): Route {
141
- const aliasedPath = fillParams(matchAs, location.params, `aliased route with path "${matchAs}"`)
142
- const aliasedMatch = match({
143
- _normalized: true,
144
- path: aliasedPath
145
- })
146
- if (aliasedMatch) {
147
- const matched = aliasedMatch.matched
148
- const aliasedRecord = matched[matched.length - 1]
149
- location.params = aliasedMatch.params
150
- return _createRoute(aliasedRecord, location)
151
- }
152
- return _createRoute(null, location)
153
- }
154
-
155
- function _createRoute (
156
- record: ?RouteRecord,
157
- location: Location,
158
- redirectedFrom?: Location
159
- ): Route {
160
- if (record && record.redirect) {
161
- return redirect(record, redirectedFrom || location)
162
- }
163
- if (record && record.matchAs) {
164
- return alias(record, location, record.matchAs)
165
- }
166
- return createRoute(record, location, redirectedFrom, router)
167
- }
168
-
169
- return {
170
- match,
171
- addRoutes
172
- }
173
- }
174
-
175
- function matchRoute (
176
- regex: RouteRegExp,
177
- path: string,
178
- params: Object
179
- ): boolean {
180
- const m = path.match(regex)
181
-
182
- if (!m) {
183
- return false
184
- } else if (!params) {
185
- return true
186
- }
187
-
188
- for (let i = 1, len = m.length; i < len; ++i) {
189
- const key = regex.keys[i - 1]
190
- const val = typeof m[i] === 'string' ? decodeURIComponent(m[i]) : m[i]
191
- if (key) {
192
- params[key.name] = val
193
- }
194
- }
195
-
196
- return true
197
- }
198
-
199
- function resolveRecordPath (path: string, record: RouteRecord): string {
200
- return resolvePath(path, record.parent ? record.parent.path : '/', true)
201
- }
@@ -1,165 +0,0 @@
1
- /* @flow */
2
-
3
- import Regexp from 'path-to-regexp'
4
- import { cleanPath } from './util/path'
5
- import { assert, warn } from './util/warn'
6
-
7
- export function createRouteMap (
8
- routes: Array<RouteConfig>,
9
- oldPathList?: Array<string>,
10
- oldPathMap?: Dictionary<RouteRecord>,
11
- oldNameMap?: Dictionary<RouteRecord>
12
- ): {
13
- pathList: Array<string>;
14
- pathMap: Dictionary<RouteRecord>;
15
- nameMap: Dictionary<RouteRecord>;
16
- } {
17
- // the path list is used to control path matching priority
18
- const pathList: Array<string> = oldPathList || []
19
- const pathMap: Dictionary<RouteRecord> = oldPathMap || Object.create(null)
20
- const nameMap: Dictionary<RouteRecord> = oldNameMap || Object.create(null)
21
-
22
- routes.forEach(route => {
23
- addRouteRecord(pathList, pathMap, nameMap, route)
24
- })
25
-
26
- // ensure wildcard routes are always at the end
27
- for (let i = 0, l = pathList.length; i < l; i++) {
28
- if (pathList[i] === '*') {
29
- pathList.push(pathList.splice(i, 1)[0])
30
- l--
31
- i--
32
- }
33
- }
34
-
35
- return {
36
- pathList,
37
- pathMap,
38
- nameMap
39
- }
40
- }
41
-
42
- function addRouteRecord (
43
- pathList: Array<string>,
44
- pathMap: Dictionary<RouteRecord>,
45
- nameMap: Dictionary<RouteRecord>,
46
- route: RouteConfig,
47
- parent?: RouteRecord,
48
- matchAs?: string
49
- ) {
50
- const { path, name } = route
51
- if (process.env.NODE_ENV !== 'production') {
52
- assert(path != null, `"path" is required in a route configuration.`)
53
- assert(
54
- typeof route.component !== 'string',
55
- `route config "component" for path: ${String(path || name)} cannot be a ` +
56
- `string id. Use an actual component instead.`
57
- )
58
- }
59
-
60
- const normalizedPath = normalizePath(path, parent)
61
- const pathToRegexpOptions: PathToRegexpOptions = route.pathToRegexpOptions || {}
62
-
63
- if (typeof route.caseSensitive === 'boolean') {
64
- pathToRegexpOptions.sensitive = route.caseSensitive
65
- }
66
-
67
- const record: RouteRecord = {
68
- path: normalizedPath,
69
- regex: compileRouteRegex(normalizedPath, pathToRegexpOptions),
70
- components: route.components || { default: route.component },
71
- instances: {},
72
- name,
73
- parent,
74
- matchAs,
75
- redirect: route.redirect,
76
- beforeEnter: route.beforeEnter,
77
- meta: route.meta || {},
78
- props: route.props == null
79
- ? {}
80
- : route.components
81
- ? route.props
82
- : { default: route.props }
83
- }
84
-
85
- if (route.children) {
86
- // Warn if route is named, does not redirect and has a default child route.
87
- // If users navigate to this route by name, the default child will
88
- // not be rendered (GH Issue #629)
89
- if (process.env.NODE_ENV !== 'production') {
90
- if (route.name && !route.redirect && route.children.some(child => /^\/?$/.test(child.path))) {
91
- warn(
92
- false,
93
- `Named Route '${route.name}' has a default child route. ` +
94
- `When navigating to this named route (:to="{name: '${route.name}'"), ` +
95
- `the default child route will not be rendered. Remove the name from ` +
96
- `this route and use the name of the default child route for named ` +
97
- `links instead.`
98
- )
99
- }
100
- }
101
- route.children.forEach(child => {
102
- const childMatchAs = matchAs
103
- ? cleanPath(`${matchAs}/${child.path}`)
104
- : undefined
105
- addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs)
106
- })
107
- }
108
-
109
- if (route.alias !== undefined) {
110
- const aliases = Array.isArray(route.alias)
111
- ? route.alias
112
- : [route.alias]
113
-
114
- aliases.forEach(alias => {
115
- const aliasRoute = {
116
- path: alias,
117
- children: route.children
118
- }
119
- addRouteRecord(
120
- pathList,
121
- pathMap,
122
- nameMap,
123
- aliasRoute,
124
- parent,
125
- record.path || '/' // matchAs
126
- )
127
- })
128
- }
129
-
130
- if (!pathMap[record.path]) {
131
- pathList.push(record.path)
132
- pathMap[record.path] = record
133
- }
134
-
135
- if (name) {
136
- if (!nameMap[name]) {
137
- nameMap[name] = record
138
- } else if (process.env.NODE_ENV !== 'production' && !matchAs) {
139
- warn(
140
- false,
141
- `Duplicate named routes definition: ` +
142
- `{ name: "${name}", path: "${record.path}" }`
143
- )
144
- }
145
- }
146
- }
147
-
148
- function compileRouteRegex (path: string, pathToRegexpOptions: PathToRegexpOptions): RouteRegExp {
149
- const regex = Regexp(path, [], pathToRegexpOptions)
150
- if (process.env.NODE_ENV !== 'production') {
151
- const keys: any = {}
152
- regex.keys.forEach(key => {
153
- warn(!keys[key.name], `Duplicate param keys in route with path: "${path}"`)
154
- keys[key.name] = true
155
- })
156
- }
157
- return regex
158
- }
159
-
160
- function normalizePath (path: string, parent?: RouteRecord): string {
161
- path = path.replace(/\/$/, '')
162
- if (path[0] === '/') return path
163
- if (parent == null) return path
164
- return cleanPath(`${parent.path}/${path}`)
165
- }