UNPKG

@ionic/core

Version:
4 lines • 17.5 kB
import{__awaiter,__generator,__spreadArray}from"tslib"; /*! * (C) Ionic http://ionicframework.com - MIT License */import{r as registerInstance,c as createEvent,f as getElement,h,e as Host}from"./index-527b9e34.js";import{c as componentOnReady,p as debounce}from"./helpers-78efeec3.js";import{o as openURL,c as createColorClasses}from"./theme-01f3f29c.js";import{b as getIonMode}from"./ionic-global-ca86cf32.js";var Route=function(){function r(r){registerInstance(this,r);this.ionRouteDataChanged=createEvent(this,"ionRouteDataChanged",7);this.url="";this.component=undefined;this.componentProps=undefined;this.beforeLeave=undefined;this.beforeEnter=undefined}r.prototype.onUpdate=function(r){this.ionRouteDataChanged.emit(r)};r.prototype.onComponentProps=function(r,e){if(r===e){return}var t=r?Object.keys(r):[];var n=e?Object.keys(e):[];if(t.length!==n.length){this.onUpdate(r);return}for(var i=0,a=t;i<a.length;i++){var o=a[i];if(r[o]!==e[o]){this.onUpdate(r);return}}};r.prototype.connectedCallback=function(){this.ionRouteDataChanged.emit()};Object.defineProperty(r,"watchers",{get:function(){return{url:["onUpdate"],component:["onUpdate"],componentProps:["onComponentProps"]}},enumerable:false,configurable:true});return r}();var RouteRedirect=function(){function r(r){registerInstance(this,r);this.ionRouteRedirectChanged=createEvent(this,"ionRouteRedirectChanged",7);this.from=undefined;this.to=undefined}r.prototype.propDidChange=function(){this.ionRouteRedirectChanged.emit()};r.prototype.connectedCallback=function(){this.ionRouteRedirectChanged.emit()};Object.defineProperty(r,"watchers",{get:function(){return{from:["propDidChange"],to:["propDidChange"]}},enumerable:false,configurable:true});return r}();var ROUTER_INTENT_NONE="root";var ROUTER_INTENT_FORWARD="forward";var ROUTER_INTENT_BACK="back";var generatePath=function(r){var e=r.filter((function(r){return r.length>0})).join("/");return"/"+e};var generateUrl=function(r,e,t){var n=generatePath(r);if(e){n="#"+n}if(t!==undefined){n+="?"+t}return n};var writeSegments=function(r,e,t,n,i,a,o){var u=generateUrl(__spreadArray(__spreadArray([],parsePath(e).segments,true),n,true),t,o);if(i===ROUTER_INTENT_FORWARD){r.pushState(a,"",u)}else{r.replaceState(a,"",u)}};var chainToSegments=function(r){var e=[];for(var t=0,n=r;t<n.length;t++){var i=n[t];for(var a=0,o=i.segments;a<o.length;a++){var u=o[a];if(u[0]===":"){var s=i.params&&i.params[u.slice(1)];if(!s){return null}e.push(s)}else if(u!==""){e.push(u)}}}return e};var removePrefix=function(r,e){if(r.length>e.length){return null}if(r.length<=1&&r[0]===""){return e}for(var t=0;t<r.length;t++){if(r[t]!==e[t]){return null}}if(e.length===r.length){return[""]}return e.slice(r.length)};var readSegments=function(r,e,t){var n=parsePath(e).segments;var i=t?r.hash.slice(1):r.pathname;var a=parsePath(i).segments;return removePrefix(n,a)};var parsePath=function(r){var e=[""];var t;if(r!=null){var n=r.indexOf("?");if(n>-1){t=r.substring(n+1);r=r.substring(0,n)}e=r.split("/").map((function(r){return r.trim()})).filter((function(r){return r.length>0}));if(e.length===0){e=[""]}}return{segments:e,queryString:t}};var printRoutes=function(r){console.group("[ion-core] ROUTES[".concat(r.length,"]"));var e=function(r){var e=[];r.forEach((function(r){return e.push.apply(e,r.segments)}));var t=r.map((function(r){return r.id}));console.debug("%c ".concat(generatePath(e)),"font-weight: bold; padding-left: 20px","=>\t","(".concat(t.join(", "),")"))};for(var t=0,n=r;t<n.length;t++){var i=n[t];e(i)}console.groupEnd()};var printRedirects=function(r){console.group("[ion-core] REDIRECTS[".concat(r.length,"]"));for(var e=0,t=r;e<t.length;e++){var n=t[e];if(n.to){console.debug("FROM: ","$c ".concat(generatePath(n.from)),"font-weight: bold"," TO: ","$c ".concat(generatePath(n.to.segments)),"font-weight: bold")}}console.groupEnd()};var writeNavState=function(r,e,t,n){var i=[];for(var a=4;a<arguments.length;a++){i[a-4]=arguments[a]}return __awaiter(void 0,__spreadArray([r,e,t,n],i,true),void 0,(function(r,e,t,n,i,a){var o,u,s,f;if(i===void 0){i=false}return __generator(this,(function(c){switch(c.label){case 0:c.trys.push([0,6,,7]);o=searchNavNode(r);if(n>=e.length||!o){return[2,i]}return[4,new Promise((function(r){return componentOnReady(o,r)}))];case 1:c.sent();u=e[n];return[4,o.setRouteId(u.id,u.params,t,a)];case 2:s=c.sent();if(s.changed){t=ROUTER_INTENT_NONE;i=true}return[4,writeNavState(s.element,e,t,n+1,i,a)];case 3:i=c.sent();if(!s.markVisible)return[3,5];return[4,s.markVisible()];case 4:c.sent();c.label=5;case 5:return[2,i];case 6:f=c.sent();console.error(f);return[2,false];case 7:return[2]}}))}))};var readNavState=function(r){return __awaiter(void 0,void 0,void 0,(function(){var e,t,n,i;return __generator(this,(function(a){switch(a.label){case 0:e=[];n=r;a.label=1;case 1:if(!(t=searchNavNode(n)))return[3,3];return[4,t.getRouteId()];case 2:i=a.sent();if(i){n=i.element;i.element=undefined;e.push(i)}else{return[3,3]}return[3,1];case 3:return[2,{ids:e,outlet:t}]}}))}))};var waitUntilNavNode=function(){if(searchNavNode(document.body)){return Promise.resolve()}return new Promise((function(r){window.addEventListener("ionNavWillLoad",(function(){return r()}),{once:true})}))};var OUTLET_SELECTOR=":not([no-router]) ion-nav, :not([no-router]) ion-tabs, :not([no-router]) ion-router-outlet";var searchNavNode=function(r){if(!r){return undefined}if(r.matches(OUTLET_SELECTOR)){return r}var e=r.querySelector(OUTLET_SELECTOR);return e!==null&&e!==void 0?e:undefined};var matchesRedirect=function(r,e){var t=e.from,n=e.to;if(n===undefined){return false}if(t.length>r.length){return false}for(var i=0;i<t.length;i++){var a=t[i];if(a==="*"){return true}if(a!==r[i]){return false}}return t.length===r.length};var findRouteRedirect=function(r,e){return e.find((function(e){return matchesRedirect(r,e)}))};var matchesIDs=function(r,e){var t=Math.min(r.length,e.length);var n=0;for(var i=0;i<t;i++){var a=r[i];var o=e[i];if(a.id.toLowerCase()!==o.id){break}if(a.params){var u=Object.keys(a.params);if(u.length===o.segments.length){var s=u.map((function(r){return":".concat(r)}));for(var f=0;f<s.length;f++){if(s[f].toLowerCase()!==o.segments[f]){break}n++}}}n++}return n};var matchesSegments=function(r,e){var t=new RouterSegments(r);var n=false;var i;for(var a=0;a<e.length;a++){var o=e[a].segments;if(o[0]===""){n=true}else{for(var u=0,s=o;u<s.length;u++){var f=s[u];var c=t.next();if(f[0]===":"){if(c===""){return null}i=i||[];var h=i[a]||(i[a]={});h[f.slice(1)]=c}else if(c!==f){return null}}n=false}}var v=n?n===(t.next()===""):true;if(!v){return null}if(i){return e.map((function(r,e){return{id:r.id,segments:r.segments,params:mergeParams(r.params,i[e]),beforeEnter:r.beforeEnter,beforeLeave:r.beforeLeave}}))}return e};var mergeParams=function(r,e){return r||e?Object.assign(Object.assign({},r),e):undefined};var findChainForIDs=function(r,e){var t=null;var n=0;for(var i=0,a=e;i<a.length;i++){var o=a[i];var u=matchesIDs(r,o);if(u>n){t=o;n=u}}if(t){return t.map((function(e,t){var n;return{id:e.id,segments:e.segments,params:mergeParams(e.params,(n=r[t])===null||n===void 0?void 0:n.params)}}))}return null};var findChainForSegments=function(r,e){var t=null;var n=0;for(var i=0,a=e;i<a.length;i++){var o=a[i];var u=matchesSegments(r,o);if(u!==null){var s=computePriority(u);if(s>n){n=s;t=u}}}return t};var computePriority=function(r){var e=1;var t=1;for(var n=0,i=r;n<i.length;n++){var a=i[n];for(var o=0,u=a.segments;o<u.length;o++){var s=u[o];if(s[0]===":"){e+=Math.pow(1,t)}else if(s!==""){e+=Math.pow(2,t)}t++}}return e};var RouterSegments=function(){function r(r){this.segments=r.slice()}r.prototype.next=function(){if(this.segments.length>0){return this.segments.shift()}return""};return r}();var readProp=function(r,e){if(e in r){return r[e]}if(r.hasAttribute(e)){return r.getAttribute(e)}return null};var readRedirects=function(r){return Array.from(r.children).filter((function(r){return r.tagName==="ION-ROUTE-REDIRECT"})).map((function(r){var e=readProp(r,"to");return{from:parsePath(readProp(r,"from")).segments,to:e==null?undefined:parsePath(e)}}))};var readRoutes=function(r){return flattenRouterTree(readRouteNodes(r))};var readRouteNodes=function(r){return Array.from(r.children).filter((function(r){return r.tagName==="ION-ROUTE"&&r.component})).map((function(r){var e=readProp(r,"component");return{segments:parsePath(readProp(r,"url")).segments,id:e.toLowerCase(),params:r.componentProps,beforeLeave:r.beforeLeave,beforeEnter:r.beforeEnter,children:readRouteNodes(r)}}))};var flattenRouterTree=function(r){var e=[];for(var t=0,n=r;t<n.length;t++){var i=n[t];flattenNode([],e,i)}return e};var flattenNode=function(r,e,t){r=__spreadArray(__spreadArray([],r,true),[{id:t.id,segments:t.segments,params:t.params,beforeLeave:t.beforeLeave,beforeEnter:t.beforeEnter}],false);if(t.children.length===0){e.push(r);return}for(var n=0,i=t.children;n<i.length;n++){var a=i[n];flattenNode(r,e,a)}};var Router=function(){function r(r){registerInstance(this,r);this.ionRouteWillChange=createEvent(this,"ionRouteWillChange",7);this.ionRouteDidChange=createEvent(this,"ionRouteDidChange",7);this.previousPath=null;this.busy=false;this.state=0;this.lastState=0;this.root="/";this.useHash=true}r.prototype.componentWillLoad=function(){return __awaiter(this,void 0,void 0,(function(){var r,e,t;return __generator(this,(function(n){switch(n.label){case 0:return[4,waitUntilNavNode()];case 1:n.sent();return[4,this.runGuards(this.getSegments())];case 2:r=n.sent();if(!(r!==true))return[3,5];if(!(typeof r==="object"))return[3,4];e=r.redirect;t=parsePath(e);this.setSegments(t.segments,ROUTER_INTENT_NONE,t.queryString);return[4,this.writeNavStateRoot(t.segments,ROUTER_INTENT_NONE)];case 3:n.sent();n.label=4;case 4:return[3,7];case 5:return[4,this.onRoutesChanged()];case 6:n.sent();n.label=7;case 7:return[2]}}))}))};r.prototype.componentDidLoad=function(){window.addEventListener("ionRouteRedirectChanged",debounce(this.onRedirectChanged.bind(this),10));window.addEventListener("ionRouteDataChanged",debounce(this.onRoutesChanged.bind(this),100))};r.prototype.onPopState=function(){return __awaiter(this,void 0,void 0,(function(){var r,e,t;return __generator(this,(function(n){switch(n.label){case 0:r=this.historyDirection();e=this.getSegments();return[4,this.runGuards(e)];case 1:t=n.sent();if(t!==true){if(typeof t==="object"){e=parsePath(t.redirect).segments}else{return[2,false]}}return[2,this.writeNavStateRoot(e,r)]}}))}))};r.prototype.onBackButton=function(r){var e=this;r.detail.register(0,(function(r){e.back();r()}))};r.prototype.canTransition=function(){return __awaiter(this,void 0,void 0,(function(){var r;return __generator(this,(function(e){switch(e.label){case 0:return[4,this.runGuards()];case 1:r=e.sent();if(r!==true){if(typeof r==="object"){return[2,r.redirect]}else{return[2,false]}}return[2,true]}}))}))};r.prototype.push=function(r){return __awaiter(this,arguments,void 0,(function(r,e,t){var n,i,a,o,u;if(e===void 0){e="forward"}return __generator(this,(function(s){switch(s.label){case 0:if(r.startsWith(".")){i=(n=this.previousPath)!==null&&n!==void 0?n:"/";a=new URL(r,"https://host/".concat(i));r=a.pathname+a.search}o=parsePath(r);return[4,this.runGuards(o.segments)];case 1:u=s.sent();if(u!==true){if(typeof u==="object"){o=parsePath(u.redirect)}else{return[2,false]}}this.setSegments(o.segments,e,o.queryString);return[2,this.writeNavStateRoot(o.segments,e,t)]}}))}))};r.prototype.back=function(){window.history.back();return Promise.resolve(this.waitPromise)};r.prototype.printDebug=function(){return __awaiter(this,void 0,void 0,(function(){return __generator(this,(function(r){printRoutes(readRoutes(this.el));printRedirects(readRedirects(this.el));return[2]}))}))};r.prototype.navChanged=function(r){return __awaiter(this,void 0,void 0,(function(){var e,t,n,i,a,o;return __generator(this,(function(u){switch(u.label){case 0:if(this.busy){console.warn("[ion-router] router is busy, navChanged was cancelled");return[2,false]}return[4,readNavState(window.document.body)];case 1:e=u.sent(),t=e.ids,n=e.outlet;i=readRoutes(this.el);a=findChainForIDs(t,i);if(!a){console.warn("[ion-router] no matching URL for ",t.map((function(r){return r.id})));return[2,false]}o=chainToSegments(a);if(!o){console.warn("[ion-router] router could not match path because some required param is missing");return[2,false]}this.setSegments(o,r);return[4,this.safeWriteNavState(n,a,ROUTER_INTENT_NONE,o,null,t.length)];case 2:u.sent();return[2,true]}}))}))};r.prototype.onRedirectChanged=function(){var r=this.getSegments();if(r&&findRouteRedirect(r,readRedirects(this.el))){this.writeNavStateRoot(r,ROUTER_INTENT_NONE)}};r.prototype.onRoutesChanged=function(){return this.writeNavStateRoot(this.getSegments(),ROUTER_INTENT_NONE)};r.prototype.historyDirection=function(){var r;var e=window;if(e.history.state===null){this.state++;e.history.replaceState(this.state,e.document.title,(r=e.document.location)===null||r===void 0?void 0:r.href)}var t=e.history.state;var n=this.lastState;this.lastState=t;if(t>n||t>=n&&n>0){return ROUTER_INTENT_FORWARD}if(t<n){return ROUTER_INTENT_BACK}return ROUTER_INTENT_NONE};r.prototype.writeNavStateRoot=function(r,e,t){return __awaiter(this,void 0,void 0,(function(){var n,i,a,o,u,s,f,c;return __generator(this,(function(h){if(!r){console.error("[ion-router] URL is not part of the routing set");return[2,false]}n=readRedirects(this.el);i=findRouteRedirect(r,n);a=null;if(i){o=i.to,u=o.segments,s=o.queryString;this.setSegments(u,e,s);a=i.from;r=u}f=readRoutes(this.el);c=findChainForSegments(r,f);if(!c){console.error("[ion-router] the path does not match any route");return[2,false]}return[2,this.safeWriteNavState(document.body,c,e,r,a,0,t)]}))}))};r.prototype.safeWriteNavState=function(r,e,t,n,i){return __awaiter(this,arguments,void 0,(function(r,e,t,n,i,a,o){var u,s,f;if(a===void 0){a=0}return __generator(this,(function(c){switch(c.label){case 0:return[4,this.lock()];case 1:u=c.sent();s=false;c.label=2;case 2:c.trys.push([2,4,,5]);return[4,this.writeNavState(r,e,t,n,i,a,o)];case 3:s=c.sent();return[3,5];case 4:f=c.sent();console.error(f);return[3,5];case 5:u();return[2,s]}}))}))};r.prototype.lock=function(){return __awaiter(this,void 0,void 0,(function(){var r,e;return __generator(this,(function(t){switch(t.label){case 0:r=this.waitPromise;this.waitPromise=new Promise((function(r){return e=r}));if(!(r!==undefined))return[3,2];return[4,r];case 1:t.sent();t.label=2;case 2:return[2,e]}}))}))};r.prototype.runGuards=function(){return __awaiter(this,arguments,void 0,(function(r,e){var t,n,i,a,o,u,s;if(r===void 0){r=this.getSegments()}return __generator(this,(function(f){switch(f.label){case 0:if(e===undefined){e=parsePath(this.previousPath).segments}if(!r||!e){return[2,true]}t=readRoutes(this.el);n=findChainForSegments(e,t);i=n&&n[n.length-1].beforeLeave;if(!i)return[3,2];return[4,i()];case 1:o=f.sent();return[3,3];case 2:o=true;f.label=3;case 3:a=o;if(a===false||typeof a==="object"){return[2,a]}u=findChainForSegments(r,t);s=u&&u[u.length-1].beforeEnter;return[2,s?s():true]}}))}))};r.prototype.writeNavState=function(r,e,t,n,i){return __awaiter(this,arguments,void 0,(function(r,e,t,n,i,a,o){var u,s;if(a===void 0){a=0}return __generator(this,(function(f){switch(f.label){case 0:if(this.busy){console.warn("[ion-router] router is busy, transition was cancelled");return[2,false]}this.busy=true;u=this.routeChangeEvent(n,i);if(u){this.ionRouteWillChange.emit(u)}return[4,writeNavState(r,e,t,a,false,o)];case 1:s=f.sent();this.busy=false;if(u){this.ionRouteDidChange.emit(u)}return[2,s]}}))}))};r.prototype.setSegments=function(r,e,t){this.state++;writeSegments(window.history,this.root,this.useHash,r,e,this.state,t)};r.prototype.getSegments=function(){return readSegments(window.location,this.root,this.useHash)};r.prototype.routeChangeEvent=function(r,e){var t=this.previousPath;var n=generatePath(r);this.previousPath=n;if(n===t){return null}var i=e?generatePath(e):null;return{from:t,redirectedFrom:i,to:n}};Object.defineProperty(r.prototype,"el",{get:function(){return getElement(this)},enumerable:false,configurable:true});return r}();var routerLinkCss=":host{--background:transparent;--color:var(--ion-color-primary, #0054e9);background:var(--background);color:var(--color)}:host(.ion-color){color:var(--ion-color-base)}a{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;text-decoration:inherit;text-indent:inherit;text-overflow:inherit;text-transform:inherit;text-align:inherit;white-space:inherit;color:inherit}";var IonRouterLinkStyle0=routerLinkCss;var RouterLink=function(){function r(r){var e=this;registerInstance(this,r);this.onClick=function(r){openURL(e.href,r,e.routerDirection,e.routerAnimation)};this.color=undefined;this.href=undefined;this.rel=undefined;this.routerDirection="forward";this.routerAnimation=undefined;this.target=undefined}r.prototype.render=function(){var r;var e=getIonMode(this);var t={href:this.href,rel:this.rel,target:this.target};return h(Host,{key:"11183264fb6ae0db9a7a47c71b6862d60001b834",onClick:this.onClick,class:createColorClasses(this.color,(r={},r[e]=true,r["ion-activatable"]=true,r))},h("a",Object.assign({key:"3e0e5242161cb0df593d6d573e51b8ba750065a1"},t),h("slot",{key:"5bd808e98a4627bb1236f0d955f4b32971355417"})))};return r}();RouterLink.style=IonRouterLinkStyle0;export{Route as ion_route,RouteRedirect as ion_route_redirect,Router as ion_router,RouterLink as ion_router_link};