web-mojo 2.2.68 → 2.2.70

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.
Files changed (153) hide show
  1. package/CHANGELOG.md +25 -9
  2. package/dist/admin.cjs.js +1 -1
  3. package/dist/admin.cjs.js.map +1 -1
  4. package/dist/admin.es.js +1 -1
  5. package/dist/admin.es.js.map +1 -1
  6. package/dist/auth.cjs.js +1 -1
  7. package/dist/auth.es.js +1 -1
  8. package/dist/charts.cjs.js +1 -1
  9. package/dist/charts.cjs.js.map +1 -1
  10. package/dist/charts.es.js +1 -1
  11. package/dist/charts.es.js.map +1 -1
  12. package/dist/chunks/ChatView-DH42WXgV.js +2 -0
  13. package/dist/chunks/ChatView-DH42WXgV.js.map +1 -0
  14. package/dist/chunks/ChatView-_8eQTETQ.js +2 -0
  15. package/dist/chunks/ChatView-_8eQTETQ.js.map +1 -0
  16. package/dist/chunks/Collection-BUv4E9op.js +2 -0
  17. package/dist/chunks/Collection-BUv4E9op.js.map +1 -0
  18. package/dist/chunks/Collection-r1ACzUeh.js +2 -0
  19. package/dist/chunks/Collection-r1ACzUeh.js.map +1 -0
  20. package/dist/chunks/ContextMenu-BFxliZ03.js +2 -0
  21. package/dist/chunks/{ContextMenu-8vTiZZQV.js.map → ContextMenu-BFxliZ03.js.map} +1 -1
  22. package/dist/chunks/ContextMenu-BwJJ4QJE.js +2 -0
  23. package/dist/chunks/{ContextMenu-DBw0WMTO.js.map → ContextMenu-BwJJ4QJE.js.map} +1 -1
  24. package/dist/chunks/DataView-DMpNXerv.js +2 -0
  25. package/dist/chunks/{DataView-DyJKgOn3.js.map → DataView-DMpNXerv.js.map} +1 -1
  26. package/dist/chunks/DataView-_CACqzRt.js +2 -0
  27. package/dist/chunks/{DataView-BEovBggn.js.map → DataView-_CACqzRt.js.map} +1 -1
  28. package/dist/chunks/Dialog-BVCCpLPw.js +3 -0
  29. package/dist/chunks/Dialog-BVCCpLPw.js.map +1 -0
  30. package/dist/chunks/Dialog-BYiynSW-.js +3 -0
  31. package/dist/chunks/Dialog-BYiynSW-.js.map +1 -0
  32. package/dist/chunks/FormView-Dw7HDwzy.js +3 -0
  33. package/dist/chunks/{FormView-Q_lFA0nr.js.map → FormView-Dw7HDwzy.js.map} +1 -1
  34. package/dist/chunks/FormView-OgrZ7x0z.js +3 -0
  35. package/dist/chunks/{FormView-EoB_ZdIB.js.map → FormView-OgrZ7x0z.js.map} +1 -1
  36. package/dist/chunks/ListView-2M4I8KHF.js +2 -0
  37. package/dist/chunks/{ListView-CMZpwyyC.js.map → ListView-2M4I8KHF.js.map} +1 -1
  38. package/dist/chunks/ListView-B0QbqSPv.js +2 -0
  39. package/dist/chunks/{ListView-BLFFK_Ir.js.map → ListView-B0QbqSPv.js.map} +1 -1
  40. package/dist/chunks/MetricsCountryMapView-DDdDJQFA.js +2 -0
  41. package/dist/chunks/{MetricsCountryMapView-B0kWK-Js.js.map → MetricsCountryMapView-DDdDJQFA.js.map} +1 -1
  42. package/dist/chunks/MetricsCountryMapView-DIlezla0.js +2 -0
  43. package/dist/chunks/{MetricsCountryMapView-DuBKO7gz.js.map → MetricsCountryMapView-DIlezla0.js.map} +1 -1
  44. package/dist/chunks/MetricsMiniChartWidget-Dt2V0eXP.js +2 -0
  45. package/dist/chunks/{MetricsMiniChartWidget-ukn-NRMR.js.map → MetricsMiniChartWidget-Dt2V0eXP.js.map} +1 -1
  46. package/dist/chunks/MetricsMiniChartWidget-_N4kzNY_.js +2 -0
  47. package/dist/chunks/{MetricsMiniChartWidget-lzq4lSTF.js.map → MetricsMiniChartWidget-_N4kzNY_.js.map} +1 -1
  48. package/dist/chunks/PDFViewer-BruR1RFn.js +2 -0
  49. package/dist/chunks/{PDFViewer-sFoyopz3.js.map → PDFViewer-BruR1RFn.js.map} +1 -1
  50. package/dist/chunks/PDFViewer-CyGFVcvX.js +2 -0
  51. package/dist/chunks/{PDFViewer-iOqYpg-6.js.map → PDFViewer-CyGFVcvX.js.map} +1 -1
  52. package/dist/chunks/TableView-CxYpxZvr.js +2 -0
  53. package/dist/chunks/TableView-CxYpxZvr.js.map +1 -0
  54. package/dist/chunks/TableView-DemRVhnX.js +2 -0
  55. package/dist/chunks/TableView-DemRVhnX.js.map +1 -0
  56. package/dist/chunks/TokenManager-BFaxNsXO.js +2 -0
  57. package/dist/chunks/{TokenManager-DKzxBt6g.js.map → TokenManager-BFaxNsXO.js.map} +1 -1
  58. package/dist/chunks/TokenManager-IlBEFXqZ.js +2 -0
  59. package/dist/chunks/{TokenManager-ChNOca0K.js.map → TokenManager-IlBEFXqZ.js.map} +1 -1
  60. package/dist/chunks/UserProfileView-9vkfCPsp.js +2 -0
  61. package/dist/chunks/UserProfileView-9vkfCPsp.js.map +1 -0
  62. package/dist/chunks/UserProfileView-tcBT6XcE.js +2 -0
  63. package/dist/chunks/UserProfileView-tcBT6XcE.js.map +1 -0
  64. package/dist/chunks/WebApp-BFR1zozS.js +2 -0
  65. package/dist/chunks/{WebApp-B0m6JCjO.js.map → WebApp-BFR1zozS.js.map} +1 -1
  66. package/dist/chunks/WebApp-C82womPC.js +2 -0
  67. package/dist/chunks/{WebApp-Bsic6FPo.js.map → WebApp-C82womPC.js.map} +1 -1
  68. package/dist/chunks/WebSocketClient-Ibi7mLQu.js +2 -0
  69. package/dist/chunks/{WebSocketClient-Bh0Mmtje.js.map → WebSocketClient-Ibi7mLQu.js.map} +1 -1
  70. package/dist/chunks/WebSocketClient-QaCUN3EQ.js +2 -0
  71. package/dist/chunks/{WebSocketClient-CLgYPxWX.js.map → WebSocketClient-QaCUN3EQ.js.map} +1 -1
  72. package/dist/chunks/index-BaPQHxbL.js +2 -0
  73. package/dist/chunks/index-BaPQHxbL.js.map +1 -0
  74. package/dist/chunks/index-BdfwxVMZ.js +2 -0
  75. package/dist/chunks/index-BdfwxVMZ.js.map +1 -0
  76. package/dist/chunks/{version-i7K_82Qy.js → version-C2yYRyPn.js} +2 -2
  77. package/dist/chunks/{version-i7K_82Qy.js.map → version-C2yYRyPn.js.map} +1 -1
  78. package/dist/chunks/{version-BmVUtM_7.js → version-CaiqhdME.js} +2 -2
  79. package/dist/chunks/{version-BmVUtM_7.js.map → version-CaiqhdME.js.map} +1 -1
  80. package/dist/css/web-mojo.css +1 -1
  81. package/dist/docit.cjs.js +1 -1
  82. package/dist/docit.cjs.js.map +1 -1
  83. package/dist/docit.es.js +1 -1
  84. package/dist/docit.es.js.map +1 -1
  85. package/dist/index.cjs.js +1 -1
  86. package/dist/index.cjs.js.map +1 -1
  87. package/dist/index.es.js +1 -1
  88. package/dist/index.es.js.map +1 -1
  89. package/dist/lightbox.cjs.js +1 -1
  90. package/dist/lightbox.cjs.js.map +1 -1
  91. package/dist/lightbox.es.js +1 -1
  92. package/dist/lightbox.es.js.map +1 -1
  93. package/dist/map.cjs.js +1 -1
  94. package/dist/map.cjs.js.map +1 -1
  95. package/dist/map.es.js +1 -1
  96. package/dist/map.es.js.map +1 -1
  97. package/dist/timeline.cjs.js +1 -1
  98. package/dist/timeline.cjs.js.map +1 -1
  99. package/dist/timeline.es.js +1 -1
  100. package/dist/timeline.es.js.map +1 -1
  101. package/dist/user-profile.cjs.js +2 -0
  102. package/dist/user-profile.cjs.js.map +1 -0
  103. package/dist/user-profile.es.js +2 -0
  104. package/dist/user-profile.es.js.map +1 -0
  105. package/dist/web-mojo.lite.iife.js +5436 -5433
  106. package/dist/web-mojo.lite.iife.js.map +1 -1
  107. package/dist/web-mojo.lite.iife.min.js +76 -76
  108. package/dist/web-mojo.lite.iife.min.js.map +1 -1
  109. package/package.json +5 -1
  110. package/dist/chunks/ChatView-Cfe0ZGvr.js +0 -2
  111. package/dist/chunks/ChatView-Cfe0ZGvr.js.map +0 -1
  112. package/dist/chunks/ChatView-DuQVFrCY.js +0 -2
  113. package/dist/chunks/ChatView-DuQVFrCY.js.map +0 -1
  114. package/dist/chunks/Collection-BWKmydl5.js +0 -2
  115. package/dist/chunks/Collection-BWKmydl5.js.map +0 -1
  116. package/dist/chunks/Collection-CmjTsmrP.js +0 -2
  117. package/dist/chunks/Collection-CmjTsmrP.js.map +0 -1
  118. package/dist/chunks/ContextMenu-8vTiZZQV.js +0 -2
  119. package/dist/chunks/ContextMenu-DBw0WMTO.js +0 -2
  120. package/dist/chunks/DataView-BEovBggn.js +0 -2
  121. package/dist/chunks/DataView-DyJKgOn3.js +0 -2
  122. package/dist/chunks/Dialog-DW7PHzUc.js +0 -2
  123. package/dist/chunks/Dialog-DW7PHzUc.js.map +0 -1
  124. package/dist/chunks/Dialog-jfBsXy5X.js +0 -2
  125. package/dist/chunks/Dialog-jfBsXy5X.js.map +0 -1
  126. package/dist/chunks/Files-C-ChBvr5.js +0 -2
  127. package/dist/chunks/Files-C-ChBvr5.js.map +0 -1
  128. package/dist/chunks/Files-DNbHDy43.js +0 -2
  129. package/dist/chunks/Files-DNbHDy43.js.map +0 -1
  130. package/dist/chunks/FormView-EoB_ZdIB.js +0 -3
  131. package/dist/chunks/FormView-Q_lFA0nr.js +0 -3
  132. package/dist/chunks/ListView-BLFFK_Ir.js +0 -2
  133. package/dist/chunks/ListView-CMZpwyyC.js +0 -2
  134. package/dist/chunks/MetricsCountryMapView-B0kWK-Js.js +0 -2
  135. package/dist/chunks/MetricsCountryMapView-DuBKO7gz.js +0 -2
  136. package/dist/chunks/MetricsMiniChartWidget-lzq4lSTF.js +0 -2
  137. package/dist/chunks/MetricsMiniChartWidget-ukn-NRMR.js +0 -2
  138. package/dist/chunks/PDFViewer-iOqYpg-6.js +0 -2
  139. package/dist/chunks/PDFViewer-sFoyopz3.js +0 -2
  140. package/dist/chunks/Rest-B1eUyLX5.js +0 -2
  141. package/dist/chunks/Rest-B1eUyLX5.js.map +0 -1
  142. package/dist/chunks/Rest-BJ3Mvx1L.js +0 -2
  143. package/dist/chunks/Rest-BJ3Mvx1L.js.map +0 -1
  144. package/dist/chunks/TokenManager-ChNOca0K.js +0 -2
  145. package/dist/chunks/TokenManager-DKzxBt6g.js +0 -2
  146. package/dist/chunks/User-BnlvMG5J.js +0 -3
  147. package/dist/chunks/User-BnlvMG5J.js.map +0 -1
  148. package/dist/chunks/User-DSqcOwPL.js +0 -3
  149. package/dist/chunks/User-DSqcOwPL.js.map +0 -1
  150. package/dist/chunks/WebApp-B0m6JCjO.js +0 -2
  151. package/dist/chunks/WebApp-Bsic6FPo.js +0 -2
  152. package/dist/chunks/WebSocketClient-Bh0Mmtje.js +0 -2
  153. package/dist/chunks/WebSocketClient-CLgYPxWX.js +0 -2
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("./Rest-B1eUyLX5.js");class Router{constructor(e={}){this.defaultRoute=e.defaultRoute||"home",this.routes=[],this.currentRoute=null,this.eventEmitter=e.eventEmitter||null,this.boundHandlePopState=this.handlePopState.bind(this)}start(){window.addEventListener("popstate",this.boundHandlePopState),this.handleCurrentLocation()}stop(){window.removeEventListener("popstate",this.boundHandlePopState)}addRoute(e,t){this.routes.push({pattern:this.normalizePattern(e),regex:this.patternToRegex(e),pageName:t,paramNames:this.extractParamNames(e)})}async navigate(e,t={}){const{replace:s=!1,state:r=null,trigger:i=!0}=t,{pageName:n,queryParams:o}=this.parseInput(e);i&&await this.handleRouteChange(n,o)}back(){window.history.back()}forward(){window.history.forward()}getCurrentRoute(){return this.currentRoute}getCurrentPath(){const{pageName:e,queryParams:t}=this.parseCurrentUrl();return this.buildPublicUrl(e,t)}handlePopState(e){this.allowPopState?this.handleCurrentLocation():console.warn("PopStateEvent is not allowed")}async handleCurrentLocation(){const{pageName:e,queryParams:t}=this.parseCurrentUrl();await this.handleRouteChange(e,t)}async handleRouteChange(e,t){const s="/"+e,r=this.matchRoute(s),i=this.buildPublicUrl(e,t);return r?(this.currentRoute=r,this.eventEmitter&&this.eventEmitter.emit("route:changed",{path:i,pageName:r.pageName,params:r.params,query:t,route:r}),r):(this.eventEmitter&&this.eventEmitter.emit("route:notfound",{path:i}),null)}matchRoute(e){for(const t of this.routes){const s=e.match(t.regex);if(s){const r={};return t.paramNames.forEach((e,t)=>{r[e]=s[t+1]}),{...t,params:r,path:e}}}return null}parseInput(e){let t=this.defaultRoute,s={};if(!e)return{pageName:t,queryParams:s};try{if(e.includes("?")){const[r,i]=e.split("?",2),n=new URLSearchParams(i);if(n.has("page")){t=n.get("page")||this.defaultRoute;for(const[e,t]of n)"page"!==e&&(s[e]=t)}else{t=r.startsWith("/")?r.substring(1)||this.defaultRoute:r||this.defaultRoute;for(const[e,t]of n)s[e]=t}}else t=e.startsWith("/")?e.substring(1)||this.defaultRoute:e}catch(r){console.warn("Failed to parse input:",e,r),t=this.defaultRoute,s={}}return{pageName:t,queryParams:s}}parseCurrentUrl(){const e=new URLSearchParams(window.location.search),t=e.get("page")||this.defaultRoute,s={};for(const[r,i]of e)"page"!==r&&(s[r]=i);return{pageName:t,queryParams:s}}buildPublicUrl(e,t={}){const s=new URLSearchParams;return s.set("page",e),Object.entries(t).forEach(([e,t])=>{null!=t&&""!==t&&s.set(e,String(t))}),"?"+s.toString()}updateBrowserUrl(e,t,s,r){const i=new URL(window.location.origin+window.location.pathname);i.searchParams.set("page",e),Object.entries(t).forEach(([e,t])=>{null!=t&&""!==t&&i.searchParams.set(e,String(t))});const n=i.toString();s?window.history.replaceState(r,"",n):window.history.pushState(r,"",n)}patternToRegex(e){let t=e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&").replace(/\/:([^/?]+)\?/g,"(?:/([^/]+))?").replace(/:([^/]+)/g,"([^/]+)");return new RegExp(`^${t}$`)}extractParamNames(e){return(e.match(/:([^/?]+)\??/g)||[]).map(e=>e.replace(/[:?]/g,""))}normalizePattern(e){return e.startsWith("/")?e:`/${e}`}updateUrl(e={},t={}){const{replace:s=!1}=t,{pageName:r}=this.parseCurrentUrl();this.updateBrowserUrl(r,e,s)}buildUrl(e,t={}){return this.buildPublicUrl(e,t)}doRoutesMatch(e,t){if(!e||!t)return!1;const{pageName:s}=this.parseInput(e),{pageName:r}=this.parseInput(t);return s===r}}class EventBus{constructor(){this.listeners={},this.onceListeners={},this.maxListeners=100,this.debugMode=!1,this.eventStats={}}on(e,t){if("function"!=typeof t)throw new Error("Callback must be a function");return Array.isArray(e)?(e.forEach(e=>this.on(e,t)),this):(this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].length>=this.maxListeners&&console.warn(`Max listeners (${this.maxListeners}) exceeded for event: ${e}`),this.listeners[e].push(t),this)}once(e,t){if("function"!=typeof t)throw new Error("Callback must be a function");return Array.isArray(e)?(e.forEach(e=>this.once(e,t)),this):(this.onceListeners[e]||(this.onceListeners[e]=[]),this.onceListeners[e].push(t),this)}off(e,t){if(Array.isArray(e))return e.forEach(e=>this.off(e,t)),this;if(!t)return delete this.listeners[e],delete this.onceListeners[e],this;if(this.listeners[e]){const s=this.listeners[e].indexOf(t);-1!==s&&(this.listeners[e].splice(s,1),0===this.listeners[e].length&&delete this.listeners[e])}if(this.onceListeners[e]){const s=this.onceListeners[e].indexOf(t);-1!==s&&(this.onceListeners[e].splice(s,1),0===this.onceListeners[e].length&&delete this.onceListeners[e])}return this}emit(e,t){this.updateEventStats(e),this.debugMode;const s=[];return this.listeners[e]&&s.push(...this.listeners[e]),this.listeners["*"]&&s.push(...this.listeners["*"]),this.onceListeners[e]&&(s.push(...this.onceListeners[e]),delete this.onceListeners[e]),this.onceListeners["*"]&&(s.push(...this.onceListeners["*"]),delete this.onceListeners["*"]),this.debugMode&&s.length>0&&s.length,s.forEach(s=>{try{s(t,e)&&(e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault())}catch(r){console.error(`Error in event listener for '${e}':`,r),this.emitError(r,e,s)}}),this}async emitAsync(e,t){const s=[];this.listeners[e]&&s.push(...this.listeners[e]),this.listeners["*"]&&s.push(...this.listeners["*"]),this.onceListeners[e]&&(s.push(...this.onceListeners[e]),delete this.onceListeners[e]),this.onceListeners["*"]&&(s.push(...this.onceListeners["*"]),delete this.onceListeners["*"]);const r=s.map(s=>new Promise(r=>{try{r(s(t,e))}catch(i){console.error(`Error in async event listener for '${e}':`,i),this.emitError(i,e,s),r()}}));return await Promise.all(r),this}removeAllListeners(){return this.listeners={},this.onceListeners={},this}listenerCount(e){return(this.listeners[e]?this.listeners[e].length:0)+(this.onceListeners[e]?this.onceListeners[e].length:0)}eventNames(){const e=Object.keys(this.listeners),t=Object.keys(this.onceListeners);return[.../* @__PURE__ */new Set([...e,...t])]}setMaxListeners(e){if("number"!=typeof e||e<0)throw new Error("Max listeners must be a non-negative number");return this.maxListeners=e,this}namespace(e){const t=t=>`${e}:${t}`;return{on:(e,s)=>this.on(t(e),s),once:(e,s)=>this.once(t(e),s),off:(e,s)=>this.off(t(e),s),emit:(e,s)=>this.emit(t(e),s),emitAsync:(e,s)=>this.emitAsync(t(e),s)}}use(e){if("function"!=typeof e)throw new Error("Middleware must be a function");const t=this.emit;return this.emit=(s,r)=>{try{const i=e(s,r);if(!1===i)return this;const n=void 0!==i?i:r;return t.call(this,s,n)}catch(i){return console.error("Error in event middleware:",i),t.call(this,s,r)}},this}emitError(e,t,s){"error"!==t&&setTimeout(()=>{this.emit("error",{error:e,originalEvent:t,callback:s.toString()})},0)}waitFor(e,t=null){return new Promise((s,r)=>{let i=null;const n=e=>{i&&clearTimeout(i),s(e)};this.once(e,n),t&&(i=setTimeout(()=>{this.off(e,n),r(new Error(`Timeout waiting for event: ${e}`))},t))})}debug(e=!0){return this.debugMode=e,this}getStats(){const e=this.eventNames(),t={totalEvents:e.length,totalListeners:0,events:{},emissions:{...this.eventStats}};return e.forEach(e=>{const s=this.listenerCount(e);t.events[e]=s,t.totalListeners+=s}),t}updateEventStats(e){this.eventStats[e]||(this.eventStats[e]={count:0,firstEmission:Date.now(),lastEmission:null}),this.eventStats[e].count++,this.eventStats[e].lastEmission=Date.now()}getEventStats(e){const t=this.eventStats[e];return t?{...t,listenerCount:this.listenerCount(e),avgEmissionsPerMinute:this.calculateEmissionRate(t)}:null}calculateEmissionRate(e){if(!e.firstEmission||!e.lastEmission)return 0;const t=e.lastEmission-e.firstEmission;if(0===t)return 0;const s=t/6e4;return Math.round(e.count/s*100)/100}resetStats(){return this.eventStats={},this}getTopEvents(e=10){return Object.entries(this.eventStats).map(([e,t])=>({event:e,count:t.count,rate:this.calculateEmissionRate(t),listeners:this.listenerCount(e)})).sort((e,t)=>t.count-e.count).slice(0,e)}debugInfo(){this.debugMode,this.maxListeners;const e=this.getStats();return e.totalEvents,e.totalListeners,Object.keys(this.eventStats).length>0&&this.getTopEvents(5),this}}class WebApp{constructor(t={}){this.config=t,this.initPluginRegistry(),this.name=t.name||"MOJO App",this.version=t.version||"1.0.0",this.debug=t.debug||!1,this.container=t.container||"#app",this.layoutType=t.layout||"portal",this.layoutConfig=t.layoutConfig||{},t.sidebar&&(this.layoutConfig.sidebarConfig=t.sidebar),t.topbar&&(this.layoutConfig.topbarConfig=t.topbar),this.layout=null,this.layoutConfig.containerId=this.container||this.containerId||"#app",this.pageContainer=t.pageContainer||"#page-container",this.basePath=t.basePath||"",this.routerMode=t.routerMode||t.router?.mode||"param",this.basePath=t.basePath||t.router?.base||"",this.defaultRoute=t.defaultRoute||"home",this.session=t.session||{},this.router=null,this.navigation=t.navigation||{},this.state={currentPage:null,previousPage:null,loading:!1},this.events=new EventBus,this.rest=e.rest,t.api&&this.rest.configure(t.api),this.router=new Router({mode:"param"===this.routerMode?"params":this.routerMode,basePath:this.basePath,defaultRoute:this.defaultRoute,eventEmitter:this.events}),this.events.on("route:changed",async e=>{const{pageName:t,params:s,query:r}=e;await this.showPage(t,r,s,{fromRouter:!0})}),"undefined"!=typeof window&&(window.MOJO=window.MOJO||{},window.MOJO.router=this.router),this.setupFocusTracking(),this.pageCache=/* @__PURE__ */new Map,this.pageClasses=/* @__PURE__ */new Map,this.componentClasses=/* @__PURE__ */new Map,this.modelClasses=/* @__PURE__ */new Map,this.currentPage=null,this.isStarted=!1,window.matchUUID?window[window.matchUUID]=this:window.MOJO?window.MOJO.app=this:window.__app__=this}async start(){if(this.isStarted)console.warn("WebApp already started");else try{this.setupPageContainer(),this.validateDefaultRoute(),await this.setupRouter(),this.isStarted=!0,this.router.allowPopState=!1,this.events.emit("app:ready",{app:this})}catch(e){throw console.error(`Failed to start ${this.name}:`,e),this.showError("Failed to start application"),e}}async setupRouter(){this.router?(this.events.on("route:notfound",async e=>{console.warn(`Route not found: ${e.path}`),this._show404(e.path)}),this.router.start(),this.routerMode):console.error("Router not initialized")}setupPageContainer(){const e="string"==typeof this.container?document.querySelector(this.container):this.container;e&&!e.querySelector("#page-container")&&(e.innerHTML='<div id="page-container"></div>'),this.pageContainer="#page-container"}registerPage(e,t,s={}){if("string"!=typeof e||!e)return console.error("registerPage: pageName must be a non-empty string"),this;if("function"!=typeof t)return console.error("registerPage: PageClass must be a constructor function"),this;if(s.containerId||(s.containerId=this.pageContainer),this.pageClasses.set(e,{PageClass:t,constructorOptions:s}),this.router){let t=s.route||`/${e}`;t.startsWith("/")||(t=`/${t}`),s.route=t,this.router.addRoute(t,e)}return this}getPage(e){return this.pageCache.get(e)}getPagePermissions(e){if(this.pageCache.has(e))return this.pageCache.get(e).permissions;const t=this.pageClasses.get(e);if(!t)return null;const{PageClass:s,constructorOptions:r}=t;return r?r.permissions:null}getOrCreatePage(e){if(this.pageCache.has(e))return this.pageCache.get(e);const t=this.pageClasses.get(e);if(!t)return console.error(`Page not registered: ${e}`),null;const{PageClass:s,constructorOptions:r}=t;try{const t=new s({pageName:e,...r,app:this});return r.route&&(t.route=r.route),this.pageCache.set(e,t),t.route,t}catch(i){return console.error(`Failed to create page ${e}:`,i),null}}async showPage(e,t={},s={},r={}){const{fromRouter:i=!1,replace:n=!1,force:o=!1}=r;try{let r,n;"string"==typeof e?(n=e,r=this.getOrCreatePage(e)):e&&"object"==typeof e&&(r=e,n=e.pageName);const o=this.currentPage;if(!r)return void this._show404(n,s,t,i);if(this.events.emit("page:showing",{page:r,pageName:r.pageName,params:s,query:t,fromRouter:i}),!r.canEnter())return void this._showDeniedPage(r,s,t,i);o&&o!==r&&await this._exitOldPage(o),await r.onParams(s,t),o!==r&&await r.onEnter(),r.syncUrl(),this.events.emit("page:show",{page:r,pageName:r.pageName,params:s,query:t,fromRouter:i}),await r.render(),this.currentPage=r,r.pageName}catch(a){console.error("Error in showPage:",a),this.showError(`Failed to load page: ${a.message}`),"error"!==e&&await this.showPage("error",{},{error:a,originalPage:e},{fromRouter:i})}}async _show404(e,t,s,r){const i=this.getOrCreatePage("404");i&&(i.setInfo&&i.setInfo(e),await this._exitOldPage(this.currentPage),await i.render(),this.currentPage=i,this.events.emit("page:404",{page:null,pageName:e,params:t,query:s,fromRouter:r}))}async _showDeniedPage(e,t,s,r){const i=this.getOrCreatePage("denied");i.setDeniedPage&&i.setDeniedPage(e),await this._exitOldPage(this.currentPage),await i.render(),this.currentPage=i,this.events.emit("page:denied",{page:e,pageName:e.pageName,params:t,query:s,fromRouter:r})}async _exitOldPage(e){if(e)try{await e.onExit(),await e.unmount(),this.events.emit("page:hide",{page:e})}catch(t){console.error(`Error exiting page ${e.pageName}:`,t)}}async navigate(e,t={},s={}){if(!this.router)return void console.error("Router not initialized");let r=e;if(Object.keys(t).length>0){const s=new URLSearchParams(t).toString();r+=(e.includes("?")?"&":"?")+s}return await this.router.navigate(r,s)}async navigateToDefault(e={}){return await this.showPage(this.defaultRoute,{},{},e)}back(){this.router?this.router.back():console.warn("Router not initialized")}forward(){this.router?this.router.forward():console.warn("Router not initialized")}getCurrentPage(){return this.currentPage}getPageContainer(){return this.layout&&this.layout.getPageContainer?this.layout.getPageContainer():"string"==typeof this.pageContainer?document.querySelector(this.pageContainer):this.pageContainer}async showError(e){try{const t=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;await t.alert(e,"Error",{size:"md",class:"text-danger"})}catch(t){this.events.emit("notification",{message:e,type:"error"}),"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showError fallback:",t),"undefined"!=typeof window&&alert(`Error: ${e}`)}}async showSuccess(e){try{const t=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;await t.alert(e,"Success",{size:"md",class:"text-success"})}catch(t){this.events.emit("notification",{message:e,type:"success"}),"undefined"!=typeof window&&window?.console&&console.warn("[WebApp] showSuccess fallback:",t),"undefined"!=typeof window&&alert(`Success: ${e}`)}}async showInfo(e){try{const t=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;await t.alert(e,"Information",{size:"md",class:"text-info"})}catch(t){this.events.emit("notification",{message:e,type:"info"}),"undefined"!=typeof window&&window,"undefined"!=typeof window&&alert(`Info: ${e}`)}}async showWarning(e){try{const t=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;await t.alert(e,"Warning",{size:"md",class:"text-warning"})}catch(t){this.events.emit("notification",{message:e,type:"warning"}),"undefined"!=typeof window&&window?.console&&console.warn("[WebApp] showWarning fallback:",t),"undefined"!=typeof window&&alert(`Warning: ${e}`)}}showNotification(e,t="info"){this.events.emit("notification",{message:e,type:t})}async showLoading(e={}){"string"==typeof e&&(e={message:e});try{(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default.showBusy(e)}catch(t){"undefined"!=typeof window&&window?.console&&console.warn("[WebApp] showLoading fallback:",t,e),this.events.emit("notification",{message:e.message||"Loading...",type:"info"})}}async hideLoading(){try{(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default.hideBusy()}catch(e){"undefined"!=typeof window&&window?.console&&console.warn("[WebApp] hideLoading fallback:",e)}}async showModelView(e,t={}){try{const s=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;return await s.showModelView(e,t)}catch(s){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showModelForm failed:",s),s}}async showModelForm(e={}){try{const t=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;return await t.showModelForm(e)}catch(t){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showModelForm failed:",t),t}}async showForm(e={}){try{const t=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;return await t.showForm(e)}catch(t){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showForm failed:",t),t}}async showDialog(e={}){try{const t=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;return await t.showDialog(e)}catch(t){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showDialog failed:",t),t}}async showAlert(e={}){try{const t=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;return await t.showDialog(e)}catch(t){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showDialog failed:",t),t}}async confirm(e,t="Confirm",s={}){const r=(await Promise.resolve().then(()=>require("./Dialog-DW7PHzUc.js"))).default;return await r.confirm(e,t,s)}setupFocusTracking(){if("undefined"==typeof window)return;this.isFocused=!document.hidden;const e=()=>{const e=this.isFocused;this.isFocused=!document.hidden,e!==this.isFocused&&(this.isFocused?this.events.emit("browser:focus"):this.events.emit("browser:blur"))},t=()=>{this.isFocused||(this.isFocused=!0,this.events.emit("browser:focus"))},s=()=>{this.isFocused&&(this.isFocused=!1,this.events.emit("browser:blur"))};document.addEventListener("visibilitychange",e),window.addEventListener("focus",t),window.addEventListener("blur",s),this._focusHandlers={visibilitychange:e,focus:t,blur:s}}setupErrorHandling(){window.addEventListener("error",e=>{console.error("Global error:",e.error),this.debug&&this.showError(`Error: ${e.error?.message||"Unknown error"}`)}),window.addEventListener("unhandledrejection",e=>{console.error("Unhandled promise rejection:",e.reason),this.debug&&this.showError(`Promise rejected: ${e.reason?.message||"Unknown error"}`)})}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}getState(e){return e?this.state[e]:this.state}setState(e){const t={...this.state};Object.assign(this.state,e),this.events.emit("state:changed",{oldState:t,newState:this.state,updates:e})}registerComponent(e,t){this.componentClasses.set(e,t)}getComponent(e){return this.componentClasses.get(e)}registerModel(e,t){this.modelClasses.set(e,t)}getModel(e){return this.modelClasses.get(e)}setupRest(){this.rest=e.rest,e.rest.configure(this.api)}async destroy(){this.router&&this.router.stop(),this._focusHandlers&&"undefined"!=typeof window&&(document.removeEventListener("visibilitychange",this._focusHandlers.visibilitychange),window.removeEventListener("focus",this._focusHandlers.focus),window.removeEventListener("blur",this._focusHandlers.blur));const e=Array.from(this.pageCache.values());if(await Promise.allSettled(e.map(async e=>{try{e.destroy&&await e.destroy()}catch(t){console.error("Error destroying page:",t)}})),this.layout&&this.layout.destroy)try{await this.layout.destroy()}catch(t){console.error("Error destroying layout:",t)}this.pageCache.clear(),this.pageClasses.clear(),this.componentClasses.clear(),this.modelClasses.clear(),"undefined"!=typeof window&&window.MOJO&&delete window.MOJO.router,this.isStarted=!1,this.name}buildPagePath(e,t,s){let r=e.route||`/${e.pageName.toLowerCase()}`;if(Object.keys(t).forEach(e=>{"string"!=typeof t[e]&&"number"!=typeof t[e]||(r=r.replace(`:${e}`,t[e]))}),s&&Object.keys(s).length>0){const e=new URLSearchParams(s).toString();r+=(r.includes("?")?"&":"?")+e}return r}validateDefaultRoute(){this.pageClasses.has(this.defaultRoute)?this.defaultRoute:(console.warn(`⚠️ Default route '${this.defaultRoute}' is not registered!`),console.warn(` Please register a page: app.registerPage('${this.defaultRoute}', YourPageClass);`),console.warn(" Or change default route: new WebApp({ defaultRoute: 'your-page' });"))}findFallbackPage(){const e=["404","error","denied"];for(const[t]of this.pageClasses.entries())if(!e.includes(t))return t;return null}static create(e={}){return new WebApp(e)}initPluginRegistry(){"undefined"!=typeof window&&(window.MOJO||(window.MOJO={}),window.MOJO.plugins||(window.MOJO.plugins={}),window.MOJO.app=this)}static registerPlugin(e,t){"undefined"!=typeof window&&(window.MOJO||(window.MOJO={}),window.MOJO.plugins||(window.MOJO.plugins={}),window.MOJO.plugins[e]=t)}}exports.EventBus=EventBus,exports.Router=Router,exports.WebApp=WebApp;
2
- //# sourceMappingURL=WebApp-B0m6JCjO.js.map
@@ -1,2 +0,0 @@
1
- import{r as e}from"./Rest-BJ3Mvx1L.js";class Router{constructor(e={}){this.defaultRoute=e.defaultRoute||"home",this.routes=[],this.currentRoute=null,this.eventEmitter=e.eventEmitter||null,this.boundHandlePopState=this.handlePopState.bind(this)}start(){window.addEventListener("popstate",this.boundHandlePopState),this.handleCurrentLocation()}stop(){window.removeEventListener("popstate",this.boundHandlePopState)}addRoute(e,t){this.routes.push({pattern:this.normalizePattern(e),regex:this.patternToRegex(e),pageName:t,paramNames:this.extractParamNames(e)})}async navigate(e,t={}){const{replace:s=!1,state:i=null,trigger:r=!0}=t,{pageName:n,queryParams:o}=this.parseInput(e);r&&await this.handleRouteChange(n,o)}back(){window.history.back()}forward(){window.history.forward()}getCurrentRoute(){return this.currentRoute}getCurrentPath(){const{pageName:e,queryParams:t}=this.parseCurrentUrl();return this.buildPublicUrl(e,t)}handlePopState(e){this.allowPopState?this.handleCurrentLocation():console.warn("PopStateEvent is not allowed")}async handleCurrentLocation(){const{pageName:e,queryParams:t}=this.parseCurrentUrl();await this.handleRouteChange(e,t)}async handleRouteChange(e,t){const s="/"+e,i=this.matchRoute(s),r=this.buildPublicUrl(e,t);return i?(this.currentRoute=i,this.eventEmitter&&this.eventEmitter.emit("route:changed",{path:r,pageName:i.pageName,params:i.params,query:t,route:i}),i):(this.eventEmitter&&this.eventEmitter.emit("route:notfound",{path:r}),null)}matchRoute(e){for(const t of this.routes){const s=e.match(t.regex);if(s){const i={};return t.paramNames.forEach((e,t)=>{i[e]=s[t+1]}),{...t,params:i,path:e}}}return null}parseInput(e){let t=this.defaultRoute,s={};if(!e)return{pageName:t,queryParams:s};try{if(e.includes("?")){const[i,r]=e.split("?",2),n=new URLSearchParams(r);if(n.has("page")){t=n.get("page")||this.defaultRoute;for(const[e,t]of n)"page"!==e&&(s[e]=t)}else{t=i.startsWith("/")?i.substring(1)||this.defaultRoute:i||this.defaultRoute;for(const[e,t]of n)s[e]=t}}else t=e.startsWith("/")?e.substring(1)||this.defaultRoute:e}catch(i){console.warn("Failed to parse input:",e,i),t=this.defaultRoute,s={}}return{pageName:t,queryParams:s}}parseCurrentUrl(){const e=new URLSearchParams(window.location.search),t=e.get("page")||this.defaultRoute,s={};for(const[i,r]of e)"page"!==i&&(s[i]=r);return{pageName:t,queryParams:s}}buildPublicUrl(e,t={}){const s=new URLSearchParams;return s.set("page",e),Object.entries(t).forEach(([e,t])=>{null!=t&&""!==t&&s.set(e,String(t))}),"?"+s.toString()}updateBrowserUrl(e,t,s,i){const r=new URL(window.location.origin+window.location.pathname);r.searchParams.set("page",e),Object.entries(t).forEach(([e,t])=>{null!=t&&""!==t&&r.searchParams.set(e,String(t))});const n=r.toString();s?window.history.replaceState(i,"",n):window.history.pushState(i,"",n)}patternToRegex(e){let t=e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&").replace(/\/:([^/?]+)\?/g,"(?:/([^/]+))?").replace(/:([^/]+)/g,"([^/]+)");return new RegExp(`^${t}$`)}extractParamNames(e){return(e.match(/:([^/?]+)\??/g)||[]).map(e=>e.replace(/[:?]/g,""))}normalizePattern(e){return e.startsWith("/")?e:`/${e}`}updateUrl(e={},t={}){const{replace:s=!1}=t,{pageName:i}=this.parseCurrentUrl();this.updateBrowserUrl(i,e,s)}buildUrl(e,t={}){return this.buildPublicUrl(e,t)}doRoutesMatch(e,t){if(!e||!t)return!1;const{pageName:s}=this.parseInput(e),{pageName:i}=this.parseInput(t);return s===i}}class EventBus{constructor(){this.listeners={},this.onceListeners={},this.maxListeners=100,this.debugMode=!1,this.eventStats={}}on(e,t){if("function"!=typeof t)throw new Error("Callback must be a function");return Array.isArray(e)?(e.forEach(e=>this.on(e,t)),this):(this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].length>=this.maxListeners&&console.warn(`Max listeners (${this.maxListeners}) exceeded for event: ${e}`),this.listeners[e].push(t),this)}once(e,t){if("function"!=typeof t)throw new Error("Callback must be a function");return Array.isArray(e)?(e.forEach(e=>this.once(e,t)),this):(this.onceListeners[e]||(this.onceListeners[e]=[]),this.onceListeners[e].push(t),this)}off(e,t){if(Array.isArray(e))return e.forEach(e=>this.off(e,t)),this;if(!t)return delete this.listeners[e],delete this.onceListeners[e],this;if(this.listeners[e]){const s=this.listeners[e].indexOf(t);-1!==s&&(this.listeners[e].splice(s,1),0===this.listeners[e].length&&delete this.listeners[e])}if(this.onceListeners[e]){const s=this.onceListeners[e].indexOf(t);-1!==s&&(this.onceListeners[e].splice(s,1),0===this.onceListeners[e].length&&delete this.onceListeners[e])}return this}emit(e,t){this.updateEventStats(e),this.debugMode;const s=[];return this.listeners[e]&&s.push(...this.listeners[e]),this.listeners["*"]&&s.push(...this.listeners["*"]),this.onceListeners[e]&&(s.push(...this.onceListeners[e]),delete this.onceListeners[e]),this.onceListeners["*"]&&(s.push(...this.onceListeners["*"]),delete this.onceListeners["*"]),this.debugMode&&s.length>0&&s.length,s.forEach(s=>{try{s(t,e)&&(e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault())}catch(i){console.error(`Error in event listener for '${e}':`,i),this.emitError(i,e,s)}}),this}async emitAsync(e,t){const s=[];this.listeners[e]&&s.push(...this.listeners[e]),this.listeners["*"]&&s.push(...this.listeners["*"]),this.onceListeners[e]&&(s.push(...this.onceListeners[e]),delete this.onceListeners[e]),this.onceListeners["*"]&&(s.push(...this.onceListeners["*"]),delete this.onceListeners["*"]);const i=s.map(s=>new Promise(i=>{try{i(s(t,e))}catch(r){console.error(`Error in async event listener for '${e}':`,r),this.emitError(r,e,s),i()}}));return await Promise.all(i),this}removeAllListeners(){return this.listeners={},this.onceListeners={},this}listenerCount(e){return(this.listeners[e]?this.listeners[e].length:0)+(this.onceListeners[e]?this.onceListeners[e].length:0)}eventNames(){const e=Object.keys(this.listeners),t=Object.keys(this.onceListeners);return[.../* @__PURE__ */new Set([...e,...t])]}setMaxListeners(e){if("number"!=typeof e||e<0)throw new Error("Max listeners must be a non-negative number");return this.maxListeners=e,this}namespace(e){const t=t=>`${e}:${t}`;return{on:(e,s)=>this.on(t(e),s),once:(e,s)=>this.once(t(e),s),off:(e,s)=>this.off(t(e),s),emit:(e,s)=>this.emit(t(e),s),emitAsync:(e,s)=>this.emitAsync(t(e),s)}}use(e){if("function"!=typeof e)throw new Error("Middleware must be a function");const t=this.emit;return this.emit=(s,i)=>{try{const r=e(s,i);if(!1===r)return this;const n=void 0!==r?r:i;return t.call(this,s,n)}catch(r){return console.error("Error in event middleware:",r),t.call(this,s,i)}},this}emitError(e,t,s){"error"!==t&&setTimeout(()=>{this.emit("error",{error:e,originalEvent:t,callback:s.toString()})},0)}waitFor(e,t=null){return new Promise((s,i)=>{let r=null;const n=e=>{r&&clearTimeout(r),s(e)};this.once(e,n),t&&(r=setTimeout(()=>{this.off(e,n),i(new Error(`Timeout waiting for event: ${e}`))},t))})}debug(e=!0){return this.debugMode=e,this}getStats(){const e=this.eventNames(),t={totalEvents:e.length,totalListeners:0,events:{},emissions:{...this.eventStats}};return e.forEach(e=>{const s=this.listenerCount(e);t.events[e]=s,t.totalListeners+=s}),t}updateEventStats(e){this.eventStats[e]||(this.eventStats[e]={count:0,firstEmission:Date.now(),lastEmission:null}),this.eventStats[e].count++,this.eventStats[e].lastEmission=Date.now()}getEventStats(e){const t=this.eventStats[e];return t?{...t,listenerCount:this.listenerCount(e),avgEmissionsPerMinute:this.calculateEmissionRate(t)}:null}calculateEmissionRate(e){if(!e.firstEmission||!e.lastEmission)return 0;const t=e.lastEmission-e.firstEmission;if(0===t)return 0;const s=t/6e4;return Math.round(e.count/s*100)/100}resetStats(){return this.eventStats={},this}getTopEvents(e=10){return Object.entries(this.eventStats).map(([e,t])=>({event:e,count:t.count,rate:this.calculateEmissionRate(t),listeners:this.listenerCount(e)})).sort((e,t)=>t.count-e.count).slice(0,e)}debugInfo(){this.debugMode,this.maxListeners;const e=this.getStats();return e.totalEvents,e.totalListeners,Object.keys(this.eventStats).length>0&&this.getTopEvents(5),this}}class WebApp{constructor(t={}){this.config=t,this.initPluginRegistry(),this.name=t.name||"MOJO App",this.version=t.version||"1.0.0",this.debug=t.debug||!1,this.container=t.container||"#app",this.layoutType=t.layout||"portal",this.layoutConfig=t.layoutConfig||{},t.sidebar&&(this.layoutConfig.sidebarConfig=t.sidebar),t.topbar&&(this.layoutConfig.topbarConfig=t.topbar),this.layout=null,this.layoutConfig.containerId=this.container||this.containerId||"#app",this.pageContainer=t.pageContainer||"#page-container",this.basePath=t.basePath||"",this.routerMode=t.routerMode||t.router?.mode||"param",this.basePath=t.basePath||t.router?.base||"",this.defaultRoute=t.defaultRoute||"home",this.session=t.session||{},this.router=null,this.navigation=t.navigation||{},this.state={currentPage:null,previousPage:null,loading:!1},this.events=new EventBus,this.rest=e,t.api&&this.rest.configure(t.api),this.router=new Router({mode:"param"===this.routerMode?"params":this.routerMode,basePath:this.basePath,defaultRoute:this.defaultRoute,eventEmitter:this.events}),this.events.on("route:changed",async e=>{const{pageName:t,params:s,query:i}=e;await this.showPage(t,i,s,{fromRouter:!0})}),"undefined"!=typeof window&&(window.MOJO=window.MOJO||{},window.MOJO.router=this.router),this.setupFocusTracking(),this.pageCache=/* @__PURE__ */new Map,this.pageClasses=/* @__PURE__ */new Map,this.componentClasses=/* @__PURE__ */new Map,this.modelClasses=/* @__PURE__ */new Map,this.currentPage=null,this.isStarted=!1,window.matchUUID?window[window.matchUUID]=this:window.MOJO?window.MOJO.app=this:window.__app__=this}async start(){if(this.isStarted)console.warn("WebApp already started");else try{this.setupPageContainer(),this.validateDefaultRoute(),await this.setupRouter(),this.isStarted=!0,this.router.allowPopState=!1,this.events.emit("app:ready",{app:this})}catch(e){throw console.error(`Failed to start ${this.name}:`,e),this.showError("Failed to start application"),e}}async setupRouter(){this.router?(this.events.on("route:notfound",async e=>{console.warn(`Route not found: ${e.path}`),this._show404(e.path)}),this.router.start(),this.routerMode):console.error("Router not initialized")}setupPageContainer(){const e="string"==typeof this.container?document.querySelector(this.container):this.container;e&&!e.querySelector("#page-container")&&(e.innerHTML='<div id="page-container"></div>'),this.pageContainer="#page-container"}registerPage(e,t,s={}){if("string"!=typeof e||!e)return console.error("registerPage: pageName must be a non-empty string"),this;if("function"!=typeof t)return console.error("registerPage: PageClass must be a constructor function"),this;if(s.containerId||(s.containerId=this.pageContainer),this.pageClasses.set(e,{PageClass:t,constructorOptions:s}),this.router){let t=s.route||`/${e}`;t.startsWith("/")||(t=`/${t}`),s.route=t,this.router.addRoute(t,e)}return this}getPage(e){return this.pageCache.get(e)}getPagePermissions(e){if(this.pageCache.has(e))return this.pageCache.get(e).permissions;const t=this.pageClasses.get(e);if(!t)return null;const{PageClass:s,constructorOptions:i}=t;return i?i.permissions:null}getOrCreatePage(e){if(this.pageCache.has(e))return this.pageCache.get(e);const t=this.pageClasses.get(e);if(!t)return console.error(`Page not registered: ${e}`),null;const{PageClass:s,constructorOptions:i}=t;try{const t=new s({pageName:e,...i,app:this});return i.route&&(t.route=i.route),this.pageCache.set(e,t),t.route,t}catch(r){return console.error(`Failed to create page ${e}:`,r),null}}async showPage(e,t={},s={},i={}){const{fromRouter:r=!1,replace:n=!1,force:o=!1}=i;try{let i,n;"string"==typeof e?(n=e,i=this.getOrCreatePage(e)):e&&"object"==typeof e&&(i=e,n=e.pageName);const o=this.currentPage;if(!i)return void this._show404(n,s,t,r);if(this.events.emit("page:showing",{page:i,pageName:i.pageName,params:s,query:t,fromRouter:r}),!i.canEnter())return void this._showDeniedPage(i,s,t,r);o&&o!==i&&await this._exitOldPage(o),await i.onParams(s,t),o!==i&&await i.onEnter(),i.syncUrl(),this.events.emit("page:show",{page:i,pageName:i.pageName,params:s,query:t,fromRouter:r}),await i.render(),this.currentPage=i,i.pageName}catch(a){console.error("Error in showPage:",a),this.showError(`Failed to load page: ${a.message}`),"error"!==e&&await this.showPage("error",{},{error:a,originalPage:e},{fromRouter:r})}}async _show404(e,t,s,i){const r=this.getOrCreatePage("404");r&&(r.setInfo&&r.setInfo(e),await this._exitOldPage(this.currentPage),await r.render(),this.currentPage=r,this.events.emit("page:404",{page:null,pageName:e,params:t,query:s,fromRouter:i}))}async _showDeniedPage(e,t,s,i){const r=this.getOrCreatePage("denied");r.setDeniedPage&&r.setDeniedPage(e),await this._exitOldPage(this.currentPage),await r.render(),this.currentPage=r,this.events.emit("page:denied",{page:e,pageName:e.pageName,params:t,query:s,fromRouter:i})}async _exitOldPage(e){if(e)try{await e.onExit(),await e.unmount(),this.events.emit("page:hide",{page:e})}catch(t){console.error(`Error exiting page ${e.pageName}:`,t)}}async navigate(e,t={},s={}){if(!this.router)return void console.error("Router not initialized");let i=e;if(Object.keys(t).length>0){const s=new URLSearchParams(t).toString();i+=(e.includes("?")?"&":"?")+s}return await this.router.navigate(i,s)}async navigateToDefault(e={}){return await this.showPage(this.defaultRoute,{},{},e)}back(){this.router?this.router.back():console.warn("Router not initialized")}forward(){this.router?this.router.forward():console.warn("Router not initialized")}getCurrentPage(){return this.currentPage}getPageContainer(){return this.layout&&this.layout.getPageContainer?this.layout.getPageContainer():"string"==typeof this.pageContainer?document.querySelector(this.pageContainer):this.pageContainer}async showError(e){try{const t=(await import("./Dialog-jfBsXy5X.js")).default;await t.alert(e,"Error",{size:"md",class:"text-danger"})}catch(t){this.events.emit("notification",{message:e,type:"error"}),"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showError fallback:",t),"undefined"!=typeof window&&alert(`Error: ${e}`)}}async showSuccess(e){try{const t=(await import("./Dialog-jfBsXy5X.js")).default;await t.alert(e,"Success",{size:"md",class:"text-success"})}catch(t){this.events.emit("notification",{message:e,type:"success"}),"undefined"!=typeof window&&window?.console&&console.warn("[WebApp] showSuccess fallback:",t),"undefined"!=typeof window&&alert(`Success: ${e}`)}}async showInfo(e){try{const t=(await import("./Dialog-jfBsXy5X.js")).default;await t.alert(e,"Information",{size:"md",class:"text-info"})}catch(t){this.events.emit("notification",{message:e,type:"info"}),"undefined"!=typeof window&&window,"undefined"!=typeof window&&alert(`Info: ${e}`)}}async showWarning(e){try{const t=(await import("./Dialog-jfBsXy5X.js")).default;await t.alert(e,"Warning",{size:"md",class:"text-warning"})}catch(t){this.events.emit("notification",{message:e,type:"warning"}),"undefined"!=typeof window&&window?.console&&console.warn("[WebApp] showWarning fallback:",t),"undefined"!=typeof window&&alert(`Warning: ${e}`)}}showNotification(e,t="info"){this.events.emit("notification",{message:e,type:t})}async showLoading(e={}){"string"==typeof e&&(e={message:e});try{(await import("./Dialog-jfBsXy5X.js")).default.showBusy(e)}catch(t){"undefined"!=typeof window&&window?.console&&console.warn("[WebApp] showLoading fallback:",t,e),this.events.emit("notification",{message:e.message||"Loading...",type:"info"})}}async hideLoading(){try{(await import("./Dialog-jfBsXy5X.js")).default.hideBusy()}catch(e){"undefined"!=typeof window&&window?.console&&console.warn("[WebApp] hideLoading fallback:",e)}}async showModelView(e,t={}){try{const s=(await import("./Dialog-jfBsXy5X.js")).default;return await s.showModelView(e,t)}catch(s){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showModelForm failed:",s),s}}async showModelForm(e={}){try{const t=(await import("./Dialog-jfBsXy5X.js")).default;return await t.showModelForm(e)}catch(t){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showModelForm failed:",t),t}}async showForm(e={}){try{const t=(await import("./Dialog-jfBsXy5X.js")).default;return await t.showForm(e)}catch(t){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showForm failed:",t),t}}async showDialog(e={}){try{const t=(await import("./Dialog-jfBsXy5X.js")).default;return await t.showDialog(e)}catch(t){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showDialog failed:",t),t}}async showAlert(e={}){try{const t=(await import("./Dialog-jfBsXy5X.js")).default;return await t.showDialog(e)}catch(t){throw"undefined"!=typeof window&&window?.console&&console.error("[WebApp] showDialog failed:",t),t}}async confirm(e,t="Confirm",s={}){const i=(await import("./Dialog-jfBsXy5X.js")).default;return await i.confirm(e,t,s)}setupFocusTracking(){if("undefined"==typeof window)return;this.isFocused=!document.hidden;const e=()=>{const e=this.isFocused;this.isFocused=!document.hidden,e!==this.isFocused&&(this.isFocused?this.events.emit("browser:focus"):this.events.emit("browser:blur"))},t=()=>{this.isFocused||(this.isFocused=!0,this.events.emit("browser:focus"))},s=()=>{this.isFocused&&(this.isFocused=!1,this.events.emit("browser:blur"))};document.addEventListener("visibilitychange",e),window.addEventListener("focus",t),window.addEventListener("blur",s),this._focusHandlers={visibilitychange:e,focus:t,blur:s}}setupErrorHandling(){window.addEventListener("error",e=>{console.error("Global error:",e.error),this.debug&&this.showError(`Error: ${e.error?.message||"Unknown error"}`)}),window.addEventListener("unhandledrejection",e=>{console.error("Unhandled promise rejection:",e.reason),this.debug&&this.showError(`Promise rejected: ${e.reason?.message||"Unknown error"}`)})}escapeHtml(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}getState(e){return e?this.state[e]:this.state}setState(e){const t={...this.state};Object.assign(this.state,e),this.events.emit("state:changed",{oldState:t,newState:this.state,updates:e})}registerComponent(e,t){this.componentClasses.set(e,t)}getComponent(e){return this.componentClasses.get(e)}registerModel(e,t){this.modelClasses.set(e,t)}getModel(e){return this.modelClasses.get(e)}setupRest(){this.rest=e,e.configure(this.api)}async destroy(){this.router&&this.router.stop(),this._focusHandlers&&"undefined"!=typeof window&&(document.removeEventListener("visibilitychange",this._focusHandlers.visibilitychange),window.removeEventListener("focus",this._focusHandlers.focus),window.removeEventListener("blur",this._focusHandlers.blur));const e=Array.from(this.pageCache.values());if(await Promise.allSettled(e.map(async e=>{try{e.destroy&&await e.destroy()}catch(t){console.error("Error destroying page:",t)}})),this.layout&&this.layout.destroy)try{await this.layout.destroy()}catch(t){console.error("Error destroying layout:",t)}this.pageCache.clear(),this.pageClasses.clear(),this.componentClasses.clear(),this.modelClasses.clear(),"undefined"!=typeof window&&window.MOJO&&delete window.MOJO.router,this.isStarted=!1,this.name}buildPagePath(e,t,s){let i=e.route||`/${e.pageName.toLowerCase()}`;if(Object.keys(t).forEach(e=>{"string"!=typeof t[e]&&"number"!=typeof t[e]||(i=i.replace(`:${e}`,t[e]))}),s&&Object.keys(s).length>0){const e=new URLSearchParams(s).toString();i+=(i.includes("?")?"&":"?")+e}return i}validateDefaultRoute(){this.pageClasses.has(this.defaultRoute)?this.defaultRoute:(console.warn(`⚠️ Default route '${this.defaultRoute}' is not registered!`),console.warn(` Please register a page: app.registerPage('${this.defaultRoute}', YourPageClass);`),console.warn(" Or change default route: new WebApp({ defaultRoute: 'your-page' });"))}findFallbackPage(){const e=["404","error","denied"];for(const[t]of this.pageClasses.entries())if(!e.includes(t))return t;return null}static create(e={}){return new WebApp(e)}initPluginRegistry(){"undefined"!=typeof window&&(window.MOJO||(window.MOJO={}),window.MOJO.plugins||(window.MOJO.plugins={}),window.MOJO.app=this)}static registerPlugin(e,t){"undefined"!=typeof window&&(window.MOJO||(window.MOJO={}),window.MOJO.plugins||(window.MOJO.plugins={}),window.MOJO.plugins[e]=t)}}export{EventBus as E,Router as R,WebApp as W};
2
- //# sourceMappingURL=WebApp-Bsic6FPo.js.map
@@ -1,2 +0,0 @@
1
- import{E as t}from"./Rest-BJ3Mvx1L.js";class WebSocketClient{constructor(t={}){this.url=t.url,this.socket=null,this.isConnected=!1,this.isConnecting=!1,this.getToken=t.getToken||null,this.tokenPrefix=t.tokenPrefix||"bearer",this.autoReconnect=!1!==t.autoReconnect,this._intentionalDisconnect=!1,this.reconnectInterval=t.reconnectInterval||2e3,this.reconnectBackoff=t.reconnectBackoff||1.5,this.maxReconnectDelay=t.maxReconnectDelay||3e4,this.reconnectJitter=!1!==t.reconnectJitter,this.reconnectAttempts=0,this.reconnectTimer=null,this.pingInterval=t.pingInterval||3e4,this.pongTimeout=t.pongTimeout||1e4,this.pingTimer=null,this.pongTimer=null,this._app=t.app||null,this.debug=t.debug||!1,this._onVisibilityChange=this._handleVisibilityChange.bind(this),this._onWindowFocus=this._handleWindowFocus.bind(this),this._setupVisibilityHandlers(),this._setupAppFocusHandler()}async connect(t=null){if(t&&(this.url=t),!this.url)throw new Error("WebSocket URL is required");if(this._intentionalDisconnect=!1,!this.isConnected&&!this.isConnecting)return this._doConnect()}disconnect(){this._intentionalDisconnect=!0,this._clearTimers(),this.socket&&(this._log("Disconnecting (intentional)"),this.socket.close(1e3,"Client disconnect"),this.socket=null),this.isConnected=!1,this.isConnecting=!1}send(t){if(!this.isConnected||!this.socket)throw new Error("WebSocket not connected");const e="string"==typeof t?t:JSON.stringify(t);this.socket.send(e),this._log("Sent:",e)}destroy(){this.disconnect(),this._teardownVisibilityHandlers(),this._teardownAppFocusHandler()}_doConnect(){return this.isConnected||this.isConnecting?Promise.resolve():(this.isConnecting=!0,this._log("Connecting to:",this.url),new Promise((t,e)=>{let n=!1;const i=(t,e)=>{n||(n=!0,t(e))};try{const n=new WebSocket(this.url);this.socket=n,n.onopen=()=>{this._log("Connected"),this.isConnected=!0,this.isConnecting=!1,this.reconnectAttempts=0,this._authenticate(),this._startHeartbeat(),this.emit("connected"),i(t,void 0)},n.onmessage=t=>this._handleMessage(t),n.onerror=t=>{this._log("Socket error:",t),this.emit("error",t),this.isConnected||i(e,new Error("WebSocket connection failed"))},n.onclose=t=>this._handleClose(t,i.bind(null,e))}catch(s){this.isConnecting=!1,this.socket=null,i(e,s),this._scheduleReconnect()}}))}_authenticate(){const t=this.getToken?this.getToken():null;t?this.send({type:"authenticate",token:t,prefix:this.tokenPrefix}):console.warn("[WebSocket] No token available — skipping authentication")}_handleMessage(t){let e;this._log("Received:",t.data);try{e=JSON.parse(t.data)}catch{e=t.data}"pong"!==e?.type?(e?.type&&this.emit(`message:${e.type}`,e),this.emit("message",e)):this._clearPongTimeout()}_handleClose(t,e){this._log("Closed:",t.code,t.reason);const n=this.isConnecting;this.isConnected=!1,this.isConnecting=!1,this._clearTimers(),this.socket=null,this.emit("disconnected",{code:t.code,reason:t.reason,wasClean:t.wasClean}),n&&"function"==typeof e&&e(new Error(`WebSocket closed before connecting (code ${t.code})`)),!this._intentionalDisconnect&&this.autoReconnect&&this._scheduleReconnect()}_scheduleReconnect(){if(this._intentionalDisconnect||!this.autoReconnect)return;if(null!==this.reconnectTimer)return;this.reconnectAttempts++;let t=Math.min(this.reconnectInterval*Math.pow(this.reconnectBackoff,this.reconnectAttempts-1),this.maxReconnectDelay);this.reconnectJitter&&(t*=.8+.4*Math.random()),t=Math.round(t),this._log(`Reconnecting in ${t}ms (attempt ${this.reconnectAttempts})`),this.emit("reconnecting",{attempt:this.reconnectAttempts,delay:t}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,!this._intentionalDisconnect&&this.autoReconnect&&this._doConnect().catch(t=>{this._log("Reconnect attempt failed:",t.message),null!==this.reconnectTimer||this._intentionalDisconnect||this._scheduleReconnect()})},t)}_nudgeReconnect(){!this._intentionalDisconnect&&this.autoReconnect&&(this.isConnected||this.isConnecting||(this._log("Focus/visibility restored — nudging reconnect immediately"),null!==this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),setTimeout(()=>{if(this._intentionalDisconnect||this.isConnected||this.isConnecting)return;const t=this.reconnectAttempts;this._doConnect().catch(e=>{this._log("Nudge reconnect failed:",e.message),this.reconnectAttempts=t})},200)))}_startHeartbeat(){this.pingInterval&&(this.pingTimer=setInterval(()=>{if(this.isConnected)try{this.send({action:"ping"}),this._startPongTimeout()}catch(t){this._log("Ping send failed:",t.message)}},this.pingInterval))}_startPongTimeout(){this._clearPongTimeout(),this.pongTimer=setTimeout(()=>{console.warn("[WebSocket] Pong timeout — forcing reconnect"),this.emit("pong-timeout"),this.socket&&this.socket.close(4001,"Pong timeout")},this.pongTimeout)}_clearPongTimeout(){null!==this.pongTimer&&(clearTimeout(this.pongTimer),this.pongTimer=null)}_clearTimers(){null!==this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),null!==this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null),this._clearPongTimeout()}_setupVisibilityHandlers(){"undefined"!=typeof document&&(document.addEventListener("visibilitychange",this._onVisibilityChange),"undefined"!=typeof window&&window.addEventListener("focus",this._onWindowFocus))}_teardownVisibilityHandlers(){"undefined"!=typeof document&&(document.removeEventListener("visibilitychange",this._onVisibilityChange),"undefined"!=typeof window&&window.removeEventListener("focus",this._onWindowFocus))}_handleVisibilityChange(){document.hidden||this._nudgeReconnect()}_handleWindowFocus(){this._nudgeReconnect()}_setupAppFocusHandler(){this._app?.events&&(this._appFocusHandler=()=>this._nudgeReconnect(),this._app.events.on("browser:focus",this._appFocusHandler))}_teardownAppFocusHandler(){this._app?.events&&this._appFocusHandler&&(this._app.events.off("browser:focus",this._appFocusHandler),this._appFocusHandler=null)}_log(...t){this.debug}static deriveURL(t,e="/ws/realtime/"){if(!t)throw new Error("baseURL is required");const n=new URL(t);return n.protocol="https:"===n.protocol?"wss:":"ws:",n.pathname=e.startsWith("/")?e:`/${e}`,n.toString()}}Object.assign(WebSocketClient.prototype,t);export{WebSocketClient as W};
2
- //# sourceMappingURL=WebSocketClient-Bh0Mmtje.js.map
@@ -1,2 +0,0 @@
1
- "use strict";const t=require("./Rest-B1eUyLX5.js");class WebSocketClient{constructor(t={}){this.url=t.url,this.socket=null,this.isConnected=!1,this.isConnecting=!1,this.getToken=t.getToken||null,this.tokenPrefix=t.tokenPrefix||"bearer",this.autoReconnect=!1!==t.autoReconnect,this._intentionalDisconnect=!1,this.reconnectInterval=t.reconnectInterval||2e3,this.reconnectBackoff=t.reconnectBackoff||1.5,this.maxReconnectDelay=t.maxReconnectDelay||3e4,this.reconnectJitter=!1!==t.reconnectJitter,this.reconnectAttempts=0,this.reconnectTimer=null,this.pingInterval=t.pingInterval||3e4,this.pongTimeout=t.pongTimeout||1e4,this.pingTimer=null,this.pongTimer=null,this._app=t.app||null,this.debug=t.debug||!1,this._onVisibilityChange=this._handleVisibilityChange.bind(this),this._onWindowFocus=this._handleWindowFocus.bind(this),this._setupVisibilityHandlers(),this._setupAppFocusHandler()}async connect(t=null){if(t&&(this.url=t),!this.url)throw new Error("WebSocket URL is required");if(this._intentionalDisconnect=!1,!this.isConnected&&!this.isConnecting)return this._doConnect()}disconnect(){this._intentionalDisconnect=!0,this._clearTimers(),this.socket&&(this._log("Disconnecting (intentional)"),this.socket.close(1e3,"Client disconnect"),this.socket=null),this.isConnected=!1,this.isConnecting=!1}send(t){if(!this.isConnected||!this.socket)throw new Error("WebSocket not connected");const e="string"==typeof t?t:JSON.stringify(t);this.socket.send(e),this._log("Sent:",e)}destroy(){this.disconnect(),this._teardownVisibilityHandlers(),this._teardownAppFocusHandler()}_doConnect(){return this.isConnected||this.isConnecting?Promise.resolve():(this.isConnecting=!0,this._log("Connecting to:",this.url),new Promise((t,e)=>{let n=!1;const i=(t,e)=>{n||(n=!0,t(e))};try{const n=new WebSocket(this.url);this.socket=n,n.onopen=()=>{this._log("Connected"),this.isConnected=!0,this.isConnecting=!1,this.reconnectAttempts=0,this._authenticate(),this._startHeartbeat(),this.emit("connected"),i(t,void 0)},n.onmessage=t=>this._handleMessage(t),n.onerror=t=>{this._log("Socket error:",t),this.emit("error",t),this.isConnected||i(e,new Error("WebSocket connection failed"))},n.onclose=t=>this._handleClose(t,i.bind(null,e))}catch(s){this.isConnecting=!1,this.socket=null,i(e,s),this._scheduleReconnect()}}))}_authenticate(){const t=this.getToken?this.getToken():null;t?this.send({type:"authenticate",token:t,prefix:this.tokenPrefix}):console.warn("[WebSocket] No token available — skipping authentication")}_handleMessage(t){let e;this._log("Received:",t.data);try{e=JSON.parse(t.data)}catch{e=t.data}"pong"!==e?.type?(e?.type&&this.emit(`message:${e.type}`,e),this.emit("message",e)):this._clearPongTimeout()}_handleClose(t,e){this._log("Closed:",t.code,t.reason);const n=this.isConnecting;this.isConnected=!1,this.isConnecting=!1,this._clearTimers(),this.socket=null,this.emit("disconnected",{code:t.code,reason:t.reason,wasClean:t.wasClean}),n&&"function"==typeof e&&e(new Error(`WebSocket closed before connecting (code ${t.code})`)),!this._intentionalDisconnect&&this.autoReconnect&&this._scheduleReconnect()}_scheduleReconnect(){if(this._intentionalDisconnect||!this.autoReconnect)return;if(null!==this.reconnectTimer)return;this.reconnectAttempts++;let t=Math.min(this.reconnectInterval*Math.pow(this.reconnectBackoff,this.reconnectAttempts-1),this.maxReconnectDelay);this.reconnectJitter&&(t*=.8+.4*Math.random()),t=Math.round(t),this._log(`Reconnecting in ${t}ms (attempt ${this.reconnectAttempts})`),this.emit("reconnecting",{attempt:this.reconnectAttempts,delay:t}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,!this._intentionalDisconnect&&this.autoReconnect&&this._doConnect().catch(t=>{this._log("Reconnect attempt failed:",t.message),null!==this.reconnectTimer||this._intentionalDisconnect||this._scheduleReconnect()})},t)}_nudgeReconnect(){!this._intentionalDisconnect&&this.autoReconnect&&(this.isConnected||this.isConnecting||(this._log("Focus/visibility restored — nudging reconnect immediately"),null!==this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),setTimeout(()=>{if(this._intentionalDisconnect||this.isConnected||this.isConnecting)return;const t=this.reconnectAttempts;this._doConnect().catch(e=>{this._log("Nudge reconnect failed:",e.message),this.reconnectAttempts=t})},200)))}_startHeartbeat(){this.pingInterval&&(this.pingTimer=setInterval(()=>{if(this.isConnected)try{this.send({action:"ping"}),this._startPongTimeout()}catch(t){this._log("Ping send failed:",t.message)}},this.pingInterval))}_startPongTimeout(){this._clearPongTimeout(),this.pongTimer=setTimeout(()=>{console.warn("[WebSocket] Pong timeout — forcing reconnect"),this.emit("pong-timeout"),this.socket&&this.socket.close(4001,"Pong timeout")},this.pongTimeout)}_clearPongTimeout(){null!==this.pongTimer&&(clearTimeout(this.pongTimer),this.pongTimer=null)}_clearTimers(){null!==this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),null!==this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null),this._clearPongTimeout()}_setupVisibilityHandlers(){"undefined"!=typeof document&&(document.addEventListener("visibilitychange",this._onVisibilityChange),"undefined"!=typeof window&&window.addEventListener("focus",this._onWindowFocus))}_teardownVisibilityHandlers(){"undefined"!=typeof document&&(document.removeEventListener("visibilitychange",this._onVisibilityChange),"undefined"!=typeof window&&window.removeEventListener("focus",this._onWindowFocus))}_handleVisibilityChange(){document.hidden||this._nudgeReconnect()}_handleWindowFocus(){this._nudgeReconnect()}_setupAppFocusHandler(){this._app?.events&&(this._appFocusHandler=()=>this._nudgeReconnect(),this._app.events.on("browser:focus",this._appFocusHandler))}_teardownAppFocusHandler(){this._app?.events&&this._appFocusHandler&&(this._app.events.off("browser:focus",this._appFocusHandler),this._appFocusHandler=null)}_log(...t){this.debug}static deriveURL(t,e="/ws/realtime/"){if(!t)throw new Error("baseURL is required");const n=new URL(t);return n.protocol="https:"===n.protocol?"wss:":"ws:",n.pathname=e.startsWith("/")?e:`/${e}`,n.toString()}}Object.assign(WebSocketClient.prototype,t.EventEmitter),exports.WebSocketClient=WebSocketClient;
2
- //# sourceMappingURL=WebSocketClient-CLgYPxWX.js.map