@luigi-project/client 2.26.1-dev.20251280038 → 2.26.1-dev.202601100039

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 +1 @@
1
- {"version":3,"file":"luigi-client.js","mappings":"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","sources":["webpack://LuigiClient/webpack/universalModuleDefinition","webpack://LuigiClient/webpack/bootstrap","webpack://LuigiClient/webpack/runtime/define property getters","webpack://LuigiClient/webpack/runtime/hasOwnProperty shorthand","webpack://LuigiClient/./src/baseClass.js","webpack://LuigiClient/./src/helpers.js","webpack://LuigiClient/./src/lifecycleManager.js","webpack://LuigiClient/./src/splitViewHandle.js","webpack://LuigiClient/./src/linkManager.js","webpack://LuigiClient/./src/uxManager.js","webpack://LuigiClient/./src/storageManager.js","webpack://LuigiClient/./src/luigi-client.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"LuigiClient\"] = factory();\n\telse\n\t\troot[\"LuigiClient\"] = factory();\n})(self, () => {\nreturn ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**\n * @private\n * @abstract\n */\nexport class LuigiClientBase {\n /**\n * @private\n */\n constructor() {\n this.promises = {};\n }\n /**\n * Returns the promises object\n * @private\n */\n setPromise(name, value) {\n this.promises[name] = value;\n }\n /**\n * Sets the promises object\n * @private\n */\n getPromise(name) {\n return this.promises[name];\n }\n}\n","/** @private */\nclass Helpers {\n /** @private */\n constructor() {\n this.listeners = [];\n this.origin = '';\n\n const helperListener = function(evt) {\n if (!evt.data.msg) {\n return;\n }\n if (evt.data.msg === 'custom') {\n const message = this.convertCustomMessageInternalToUser(evt.data);\n this.listeners\n .filter(listener => listener.name === message.id)\n .map(listener => listener.eventFn(message, listener.listenerId));\n } else {\n this.listeners\n .filter(listener => listener.name === evt.data.msg)\n .map(listener => listener.eventFn(evt, listener.listenerId));\n }\n }.bind(this);\n\n window.addEventListener('message', helperListener);\n }\n\n convertCustomMessageInternalToUser(internalMessage) {\n return internalMessage.data;\n }\n\n convertCustomMessageUserToInternal(message) {\n return {\n msg: 'custom',\n data: message\n };\n }\n\n convertStorageMessageToInternal(message) {\n return {\n msg: 'storage',\n data: message\n };\n }\n\n /**\n * Registers a post message listener\n * Don't forget to remove the event listener at the end of\n * your eventFn if you do not need it anymore.\n * @private\n * @param {string} name event name\n * @param {function} eventFn callback function\n * @returns {string} listener id\n */\n addEventListener(name, eventFn) {\n const listenerId = this.getRandomId();\n this.listeners.push({\n name,\n eventFn,\n listenerId\n });\n return listenerId;\n }\n\n /**\n * Removes a post message listener\n * @private\n * @param {string} id listenerId\n */\n removeEventListener(id) {\n const listenerExists = Boolean(this.listeners.find(l => l.listenerId === id));\n if (listenerExists) {\n this.listeners = this.listeners.filter(l => l.listenerId !== id);\n return true;\n }\n return false;\n }\n\n /**\n * Creates a random Id\n * @private\n */\n getRandomId() {\n return window.crypto.getRandomValues(new Uint32Array(1))[0];\n }\n\n /**\n * Simple function check.\n * @private\n * @param {function} item\n * @returns {boolean}\n */\n isFunction(item) {\n return typeof item === 'function';\n }\n\n /**\n * Simple object check.\n * @private\n * @param {Object} item\n * @returns {boolean}\n */\n isObject(item) {\n return Object.prototype.toString.call(item) === '[object Object]';\n }\n\n getLuigiCoreDomain() {\n return this.origin;\n }\n\n setLuigiCoreDomain(origin) {\n // protect against \"null\" string set by at least Chrome browser when file protocol used\n if (origin && origin !== 'null') {\n this.origin = origin;\n }\n }\n\n setTargetOrigin(origin) {\n this.setLuigiCoreDomain(origin);\n }\n\n sendPostMessageToLuigiCore(msg) {\n if (this.origin) {\n // protect against potential postMessage problems, since origin value may be set incorrectly\n try {\n window.parent.postMessage(msg, this.origin);\n } catch (error) {\n console.warn('Unable to post message ' + msg + ' to Luigi Core from origin ' + this.origin + ': ' + error);\n }\n } else {\n console.warn(\n 'There is no target origin set. You can specify the target origin by calling LuigiClient.setTargetOrigin(\"targetorigin\") in your micro frontend.'\n );\n }\n }\n\n /**\n * Checks if given path contains intent navigation special syntax\n * @param {string} path to check\n */\n hasIntent(path) {\n return !!path && path.toLowerCase().includes('#?intent=');\n }\n\n deSanitizeParamsMap(paramsMap) {\n return Object.entries(paramsMap).reduce((sanitizedMap, paramPair) => {\n sanitizedMap[this.deSanitizeParam(paramPair[0])] = this.deSanitizeParam(paramPair[1]);\n return sanitizedMap;\n }, {});\n }\n\n deSanitizeParam(param = '') {\n return String(param)\n .replaceAll('&lt;', '<')\n .replaceAll('&gt;', '>')\n .replaceAll('&quot;', '\"')\n .replaceAll('&#39;', \"'\")\n .replaceAll('&sol;', '/');\n }\n}\n\nexport const helpers = new Helpers();\n","import { LuigiClientBase } from './baseClass';\nimport { helpers } from './helpers';\n\n/**\n * Use the functions and parameters to define the Lifecycle of listeners, navigation nodes, and Event data.\n * @name Lifecycle\n */\nclass LifecycleManager extends LuigiClientBase {\n /** @private */\n constructor() {\n super();\n this.luigiInitialized = false;\n this.defaultContextKeys = ['context', 'internal', 'nodeParams', 'pathParams', 'searchParams'];\n this.setCurrentContext(\n this.defaultContextKeys.reduce(function (acc, key) {\n acc[key] = {};\n return acc;\n }, {})\n );\n\n this._onContextUpdatedFns = {};\n this._onInactiveFns = {};\n this._onInitFns = {};\n this.authData = {};\n\n if (!this._isDeferInitDefined()) {\n this.luigiClientInit();\n }\n }\n\n /**\n * Check if the html head element contains the attribute \"defer-luigi-init\"\n * @private\n * @memberof Lifecycle\n */\n _isDeferInitDefined() {\n return window.document.head.hasAttribute('defer-luigi-init');\n }\n\n /**\n * Check if the html head element contains the attribute \"disable-tpc-check\"\n * @private\n * @memberof Lifecycle\n */\n _isTpcCheckDisabled() {\n return (\n window.document.head.hasAttribute('disable-tpc-check') ||\n this.currentContext?.internal?.thirdPartyCookieCheck?.disabled\n );\n }\n\n /**\n * Check if LuigiClient is initialized\n * @returns {boolean} client initialized state\n * @since 1.12.0\n * @memberof Lifecycle\n * @example\n * const init = LuigiClient.isLuigiClientInitialized()\n */\n isLuigiClientInitialized() {\n return this.luigiInitialized;\n }\n\n /**\n * Starts the handshake with Luigi Core and thereafter results in initialization of Luigi Client. It is always ran by default when importing the Luigi Client package in your micro frontend. Note that when using `defer-luigi-init` to defer default initialization, you will need to initialize the handshake using this function manually wherever needed.\n * @since 1.12.0\n * @memberof Lifecycle\n * @example\n * LuigiClient.luigiClientInit()\n */\n luigiClientInit() {\n if (this.luigiInitialized) {\n console.warn('Luigi Client has been already initialized');\n return;\n }\n /**\n * Save context data every time navigation to a different node happens\n * @private\n */\n const setContext = (rawData) => {\n for (let index = 0; index < this.defaultContextKeys.length; index++) {\n let key = this.defaultContextKeys[index];\n try {\n if (typeof rawData[key] === 'string') {\n rawData[key] = JSON.parse(rawData[key]);\n }\n } catch (e) {\n console.info('unable to parse luigi context data for', key, rawData[key], e);\n }\n }\n this.setCurrentContext(rawData);\n };\n\n const setAuthData = (eventPayload) => {\n if (eventPayload) {\n this.authData = eventPayload;\n }\n };\n\n helpers.addEventListener('luigi.init', (e) => {\n setContext(e.data);\n setAuthData(e.data.authData);\n helpers.setLuigiCoreDomain(e.origin);\n this.luigiInitialized = true;\n this._notifyInit(e.origin);\n this._tpcCheck();\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.init.ok' });\n });\n\n helpers.addEventListener('luigi-client.inactive-microfrontend', (e) => {\n this._notifyInactive(e.origin);\n });\n\n helpers.addEventListener('luigi.auth.tokenIssued', (e) => {\n setAuthData(e.data.authData);\n });\n\n helpers.addEventListener('luigi.navigate', (e) => {\n setContext(e.data);\n if (!this.currentContext.internal.isNavigateBack && !this.currentContext.withoutSync) {\n const previousHash = window.location.hash;\n history.replaceState({ luigiInduced: true }, '', e.data.viewUrl);\n window.dispatchEvent(new PopStateEvent('popstate', { state: 'luiginavigation' }));\n if (window.location.hash !== previousHash) {\n window.dispatchEvent(new HashChangeEvent('hashchange'));\n }\n }\n // pass additional data to context to enable micro frontend developer to act on internal routing change\n if (this.currentContext.withoutSync) {\n Object.assign(this.currentContext.context, {\n viewUrl: e.data.viewUrl ? e.data.viewUrl : undefined,\n pathParams: e.data.pathParams ? e.data.pathParams : undefined\n });\n }\n // execute the context change listener if set by the micro frontend\n this._notifyUpdate();\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.navigate.ok' });\n });\n\n /**\n * Get context once initially\n * @private\n */\n window.parent.postMessage(\n {\n msg: 'luigi.get-context',\n clientVersion: require('../public/package.json').version\n },\n '*'\n );\n }\n\n _tpcCheck() {\n if (this._isTpcCheckDisabled()) {\n return;\n }\n\n let tpc = 'enabled';\n let cookies = document.cookie;\n let luigiCookie;\n if (cookies) {\n luigiCookie = cookies\n .split(';')\n .map((cookie) => cookie.trim())\n .find((cookie) => cookie === 'luigiCookie=true');\n }\n if (luigiCookie === 'luigiCookie=true') {\n document.cookie = 'luigiCookie=; Max-Age=-99999999; SameSite=None; Secure';\n }\n document.cookie = 'luigiCookie=true; SameSite=None; Secure';\n cookies = document.cookie;\n if (cookies) {\n luigiCookie = cookies\n .split(';')\n .map((cookie) => cookie.trim())\n .find((cookie) => cookie === 'luigiCookie=true');\n }\n if (luigiCookie === 'luigiCookie=true') {\n document.cookie = 'luigiCookie=; Max-Age=-99999999; SameSite=None; Secure';\n window.parent.postMessage({ msg: 'luigi.third-party-cookie', tpc }, '*');\n } else {\n tpc = 'disabled';\n window.parent.postMessage({ msg: 'luigi.third-party-cookie', tpc }, '*');\n console.warn('Third party cookies are not supported!');\n }\n }\n\n /**\n * Iterates over an object and executes all top-level functions\n * with a given payload.\n * @private\n * @memberof Lifecycle\n */\n _callAllFns(objWithFns, payload, origin) {\n for (let id in objWithFns) {\n if (objWithFns.hasOwnProperty(id) && helpers.isFunction(objWithFns[id])) {\n objWithFns[id](payload, origin);\n }\n }\n }\n\n /**\n * Notifies all context init listeners.\n * @private\n * @memberof Lifecycle\n */\n _notifyInit(origin) {\n this._callAllFns(this._onInitFns, this.currentContext.context, origin);\n }\n\n /**\n * Notifies all context update listeners.\n * @private\n * @memberof Lifecycle\n */\n _notifyUpdate() {\n this._callAllFns(this._onContextUpdatedFns, this.currentContext.context);\n }\n\n /**\n * Notifies all inactive listeners.\n * @private\n * @memberof Lifecycle\n */\n _notifyInactive() {\n this._callAllFns(this._onInactiveFns);\n }\n\n /**\n * @private\n * @memberof Lifecycle\n */\n setCurrentContext(value) {\n this.currentContext = value;\n }\n\n /**\n * Registers a listener called with the context object and the Luigi Core domain as soon as Luigi is instantiated. Defer your application bootstrap if you depend on authentication data coming from Luigi.\n * @param {Lifecycle~initListenerCallback} initFn the function that is called once Luigi is initialized, receives current context and origin as parameters\n * @param {boolean} disableTpcCheck if set to `true` third party cookie check will be disabled via LuigiClient.\n * @memberof Lifecycle\n * @example\n * const initListenerId = LuigiClient.addInitListener((context) => storeContextToMF(context))\n */\n addInitListener(initFn, disableTpcCheck) {\n const id = helpers.getRandomId();\n this._onInitFns[id] = initFn;\n if (disableTpcCheck) {\n document.head.setAttribute('disable-tpc-check', '');\n }\n if (this.luigiInitialized && helpers.isFunction(initFn)) {\n initFn(this.currentContext.context, helpers.getLuigiCoreDomain());\n }\n return id;\n }\n\n /**\n * Callback of the addInitListener\n * @callback Lifecycle~initListenerCallback\n * @param {Object} context current context data\n * @param {string} origin Luigi Core URL\n */\n /**\n * Removes an init listener.\n * @param {string} id the id that was returned by the `addInitListener` function.\n * @memberof Lifecycle\n * @example\n * LuigiClient.removeInitListener(initListenerId)\n */\n removeInitListener(id) {\n if (this._onInitFns[id]) {\n this._onInitFns[id] = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Registers a listener called with the context object when the URL is changed. For example, you can use this when changing environments in a context switcher in order for the micro frontend to do an API call to the environment picked.\n * @param {function} contextUpdatedFn the listener function called each time Luigi context changes\n * @memberof Lifecycle\n * @example\n * const updateListenerId = LuigiClient.addContextUpdateListener((context) => storeContextToMF(context))\n */\n addContextUpdateListener(contextUpdatedFn) {\n const id = helpers.getRandomId();\n this._onContextUpdatedFns[id] = contextUpdatedFn;\n if (this.luigiInitialized && helpers.isFunction(contextUpdatedFn)) {\n contextUpdatedFn(this.currentContext.context);\n }\n return id;\n }\n\n /**\n * Removes a context update listener.\n * @param {string} id the id that was returned by the `addContextUpdateListener` function\n * @memberof Lifecycle\n * @example\n * LuigiClient.removeContextUpdateListener(updateListenerId)\n */\n removeContextUpdateListener(id) {\n if (this._onContextUpdatedFns[id]) {\n this._onContextUpdatedFns[id] = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Registers a listener called upon micro frontend inactivity. This happens when a new micro frontend gets shown while keeping the old one cached.\n * Gets called when:\n * - navigating with **preserveView**\n * - navigating from or to a **viewGroup**\n *\n * Does not get called when navigating normally, or when `openAsModal` or `openAsSplitView` are used.\n * Once the micro frontend turns back into active state, the `addContextUpdateListener` receives an updated context.\n * @param {function} inactiveFn the listener function called each time a micro frontend turns into an inactive state\n * @memberof Lifecycle\n * @example\n * LuigiClient.addInactiveListener(() => mfIsInactive = true)\n * const inactiveListenerId = LuigiClient.addInactiveListener(() => mfIsInactive = true)\n */\n addInactiveListener(inactiveFn) {\n const id = helpers.getRandomId();\n this._onInactiveFns[id] = inactiveFn;\n return id;\n }\n\n /**\n * Removes a listener for inactive micro frontends.\n * @param {string} id the id that was returned by the `addInactiveListener` function\n * @memberof Lifecycle\n * @example\n * LuigiClient.removeInactiveListener(inactiveListenerId)\n */\n removeInactiveListener(id) {\n if (this._onInactiveFns[id]) {\n this._onInactiveFns[id] = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Registers a listener called when the micro frontend receives a custom message.\n * @param {string} customMessageId the custom message id\n * @param {Lifecycle~customMessageListenerCallback} customMessageListener the function that is called when the micro frontend receives the corresponding event\n * @memberof Lifecycle\n * @since 0.6.2\n * @example\n * const customMsgId = LuigiClient.addCustomMessageListener('myapp.project-updated', (data) => doSomething(data))\n */\n addCustomMessageListener(customMessageId, customMessageListener) {\n return helpers.addEventListener(customMessageId, (customMessage, listenerId) => {\n return customMessageListener(customMessage, listenerId);\n });\n }\n\n /**\n * Callback of the customMessageListener\n * @callback Lifecycle~customMessageListenerCallback\n * @param {Object} customMessage custom message object\n * @param {string} customMessage.id message id\n * @param {*} customMessage.MY_DATA_FIELD any other message data field\n * @param {string} listenerId custom message listener id to be used for unsubscription\n */\n /**\n * Removes a custom message listener.\n * @param {string} id the id that was returned by the `addInitListener` function\n * @memberof Lifecycle\n * @since 0.6.2\n * @example\n * LuigiClient.removeCustomMessageListener(customMsgId)\n */\n removeCustomMessageListener(id) {\n return helpers.removeEventListener(id);\n }\n\n /**\n * Returns the currently valid access token.\n * @returns {string} current access token\n * @memberof Lifecycle\n * @example\n * const accessToken = LuigiClient.getToken()\n */\n getToken() {\n return this.authData.accessToken;\n }\n\n /**\n * Returns the context object. Typically it is not required as the {@link #addContextUpdateListener addContextUpdateListener()} receives the same values.\n * @returns {Object} current context data\n * @memberof Lifecycle\n * @example\n * const context = LuigiClient.getContext()\n */\n getContext() {\n return this.getEventData();\n }\n\n /**\n * Returns the context object. It is an alias function for getContext().\n * @returns {Object} current context data\n * @memberof Lifecycle\n * @deprecated\n */\n getEventData() {\n return this.currentContext.context;\n }\n\n /**\n * Returns a list of active feature toggles\n * @returns {Array} a list of feature toggle names\n * @memberof Lifecycle\n * @since 1.4.0\n * @example\n * const activeFeatureToggleList = LuigiClient.getActiveFeatureToggles()\n */\n getActiveFeatureToggles() {\n return this.currentContext.internal.activeFeatureToggleList ?? [];\n }\n\n /**\n * Sets node parameters in Luigi Core. The parameters will be added to the URL.\n * @param {Object} params\n * @param {boolean} keepBrowserHistory\n * @memberof Lifecycle\n * @example\n * LuigiClient.addNodeParams({luigi:'rocks'}, true);\n */\n addNodeParams(params, keepBrowserHistory = true) {\n if (params) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.addNodeParams',\n data: params,\n keepBrowserHistory\n });\n }\n }\n\n /**\n * Returns the node parameters of the active URL.\n * Node parameters are defined like URL query parameters but with a specific prefix allowing Luigi to pass them to the micro frontend view. The default prefix is **~** and you can use it in the following way: `https://my.luigi.app/home/products?~sort=asc&~page=3`.\n * <!-- add-attribute:class:warning -->\n * > **NOTE:** some special characters (`<`, `>`, `\"`, `'`, `/`) in node parameters are HTML-encoded.\n * @param {boolean} shouldDesanitise defines whether the specially encoded characters should be desanitised\n * @returns {Object} node parameters, where the object property name is the node parameter name without the prefix, and its value is the value of the node parameter. For example `{sort: 'asc', page: 3}`\n * @memberof Lifecycle\n * @example\n * const nodeParams = LuigiClient.getNodeParams()\n * const nodeParams = LuigiClient.getNodeParams(true)\n */\n getNodeParams(shouldDesanitise = false) {\n return shouldDesanitise\n ? helpers.deSanitizeParamsMap(this.currentContext.nodeParams)\n : this.currentContext.nodeParams;\n }\n\n /**\n * Returns the dynamic path parameters of the active URL.\n * Path parameters are defined by navigation nodes with a dynamic **pathSegment** value starting with **:**, such as **productId**.\n * All path parameters in the current navigation path (as defined by the active URL) are returned.\n * <!-- add-attribute:class:warning -->\n * > **NOTE:** some special characters (`<`, `>`, `\"`, `'`, `/`) in path parameters are HTML-encoded.\n * @returns {Object} path parameters, where the object property name is the path parameter name without the prefix, and its value is the actual value of the path parameter. For example ` {productId: 1234, ...}`\n * @memberof Lifecycle\n * @example\n * const pathParams = LuigiClient.getPathParams()\n */\n getPathParams() {\n return this.currentContext.pathParams;\n }\n\n /**\n * Read search query parameters which are sent from Luigi Core\n * @memberof Lifecycle\n * @returns Core search query parameters\n * @example\n * LuigiClient.getCoreSearchParams();\n */\n getCoreSearchParams() {\n return this.currentContext.searchParams || {};\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Sends search query parameters to Luigi Core. The search parameters will be added to the URL if they are first allowed on a node level using {@link navigation-parameters-reference.md#clientpermissionsurlparameters clientPermissions.urlParameters}.\n\n * @param {Object} searchParams\n * @param {boolean} keepBrowserHistory\n * @memberof Lifecycle\n * @example\n * LuigiClient.addCoreSearchParams({luigi:'rocks'}, false);\n */\n addCoreSearchParams(searchParams, keepBrowserHistory = true) {\n if (searchParams) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.addSearchParams',\n data: searchParams,\n keepBrowserHistory\n });\n }\n }\n\n /**\n * Returns the current client permissions as specified in the navigation node or an empty object. For details, see [Node parameters](navigation-parameters-reference.md).\n * @returns {Object} client permissions as specified in the navigation node\n * @memberof Lifecycle\n * @example\n * const permissions = LuigiClient.getClientPermissions()\n */\n getClientPermissions() {\n return this.currentContext.internal.clientPermissions || {};\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * When the micro frontend is not embedded in the Luigi Core application and there is no init handshake you can set the target origin that is used in postMessage function calls by Luigi Client. Typically used only in custom micro-frontend frameworks that are compatible with LuigiClient API.\n * @param {string} origin target origin\n * @memberof Lifecycle\n * @since 0.7.3\n * @example\n * LuigiClient.setTargetOrigin(window.location.origin)\n */\n setTargetOrigin(origin) {\n helpers.setTargetOrigin(origin);\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Sends a custom message to the Luigi Core application.\n * @param {Object} message an object containing data to be sent to the Luigi Core to process it further. This object is set as an input parameter of the custom message listener on the Luigi Core side\n * @param {string} message.id a string containing the message id\n * @param {*} message.MY_DATA_FIELD any other message data field\n * @example\n * LuigiClient.sendCustomMessage({id: 'environment.created', production: false})\n * LuigiClient.sendCustomMessage({id: 'environment.created', data: environmentDataObj})\n * @memberof Lifecycle\n * @since 0.6.2\n */\n sendCustomMessage(message) {\n const customMessageInternal = helpers.convertCustomMessageUserToInternal(message);\n helpers.sendPostMessageToLuigiCore(customMessageInternal);\n }\n\n /**\n * Returns the current user settings based on the selected node.\n * @returns {Object} current user settings\n * @since 1.7.1\n * @memberof Lifecycle\n * @example\n * const userSettings = LuigiClient.getUserSettings()\n */\n getUserSettings() {\n return this.currentContext.internal.userSettings;\n }\n\n /**\n * Returns the current anchor based on active URL.\n * @memberof Lifecycle\n * @since 1.21.0\n * @returns anchor of URL\n * @example\n * LuigiClient.getAnchor();\n */\n getAnchor() {\n return this.currentContext.internal.anchor || '';\n }\n\n /**\n * Sends anchor to Luigi Core. The anchor will be added to the URL.\n * @param {string} anchor\n * @since 1.21.0\n * @memberof Lifecycle\n * @example\n * LuigiClient.setAnchor('luigi');\n */\n setAnchor(anchor) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.setAnchor',\n anchor\n });\n }\n\n /**\n * This function allows you to change node labels within the same {@link navigation-advanced.md#view-groups view group}, e.g. in your node config: `label: 'my Node {viewGroupData.vg1}'`.\n * @since 2.2.0\n * @param {Object} data a data object containing the view group name and desired label\n * @memberof Lifecycle\n * @example LuigiClient.setViewGroupData({'vg1':' Luigi rocks!'})\n */\n setViewGroupData(data) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.setVGData',\n data\n });\n }\n}\nexport const lifecycleManager = new LifecycleManager();\n","import { LuigiClientBase } from './baseClass';\nimport { helpers } from './helpers';\n\n/**\n * Split view \n Allows to open a micro frontend in a split screen in the lower part of the content area. Open it by calling `const splitViewHandle = LuigiClient.linkManager().openAsSplitView`. \n At a given time, you can open only one split view. It closes automatically when you navigate to a different route.\n When you call `handle.collapse()`, the split view gets destroyed. It recreates when you use `handle.expand()`.\n `openAsSplitView` returns an instance of the split view handle. The functions, actions, and event handlers listed below allow you to control and manage the split view.\n * @name splitView\n * @since 0.6.0\n */\nexport class splitViewHandle extends LuigiClientBase {\n /**\n * @private\n */\n constructor(settings) {\n super();\n\n this.validSplitViewEvents = ['expand', 'collapse', 'resize', 'close'];\n\n this.splitView = {\n exists: true,\n size: 40,\n collapsed: false\n };\n\n Object.assign(this.splitView, settings);\n\n const removeSplitViewListeners = () => {\n this.splitView.listeners.forEach(id => helpers.removeEventListener(id));\n };\n\n this.splitView.listeners = [\n helpers.addEventListener(`luigi.navigation.splitview.internal`, e => {\n Object.assign(this.splitView, e.data.data);\n })\n ];\n this.on('resize', newSize => {\n this.splitView.size = newSize;\n });\n this.on('close', removeSplitViewListeners);\n }\n /*\n * @private\n */\n sendSplitViewEvent(action, data) {\n helpers.sendPostMessageToLuigiCore({\n msg: `luigi.navigation.splitview.${action}`,\n data\n });\n }\n\n /**\n * Collapses the split view\n * @memberof splitView\n * @since 0.6.0\n * @example\n * splitViewHandle.collapse();\n */\n collapse() {\n this.sendSplitViewEvent('collapse');\n }\n /**\n * Expands the split view\n * @memberof splitView\n * @since 0.6.0\n * @example\n * splitViewHandle.expand();\n */\n expand() {\n this.sendSplitViewEvent('expand');\n }\n\n /**\n * Closes and destroys the split view\n * @memberof splitView\n * @since 0.6.0\n * @example\n * splitViewHandle.close();\n */\n close() {\n this.sendSplitViewEvent('close');\n }\n /**\n * Sets the height of the split view\n * @memberof splitView\n * @param {number} value lower height in percent\n * @since 0.6.0\n * @example\n * splitViewHandle.setSize(60);\n */\n setSize(value) {\n this.sendSplitViewEvent('resize', value);\n }\n /**\n * Registers a listener for split view events\n * @memberof splitView\n * @param {('expand'|'collapse'|'resize'|'close')} name event name\n * @param {function} callback gets called when this event gets triggered by Luigi\n * @returns {string} listener id\n * @since 0.6.0\n * @example\n * const listenerId = splitViewHandle.on('expand', () => {});\n * const listenerId = splitViewHandle.on('collapse', () => {});\n * const listenerId = splitViewHandle.on('resize', () => {});\n * const listenerId = splitViewHandle.on('close', () => {});\n **/\n on(name, callback) {\n if (!this.validSplitViewEvents.includes(name)) {\n console.warn(name + ' is not a valid split view event');\n return false;\n }\n const id = helpers.addEventListener(`luigi.navigation.splitview.${name}.ok`, e => {\n const filterParam = typeof e.data.data == 'number' ? e.data.data : undefined;\n callback(filterParam);\n });\n this.splitView.listeners.push(id);\n return id;\n }\n /**\n * Unregisters a split view listener\n * @memberof splitView\n * @param {string} id listener id\n * @since 0.6.0\n * @example\n * splitViewHandle.removeEventListener(listenerId);\n */\n removeEventListener(id) {\n return helpers.removeEventListener(id);\n }\n\n /**\n * Gets the split view status\n * @memberof splitView\n * @returns {boolean} true if a split view is loaded\n * @since 0.6.0\n * @example\n * splitViewHandle.exists();\n */\n exists() {\n return this.splitView.exists;\n }\n /**\n * Reads the size of the split view\n * @memberof splitView\n * @returns {number} height in percent\n * @since 0.6.0\n * @example\n * splitViewHandle.getSize();\n */\n getSize() {\n return this.splitView.size;\n }\n /**\n * Reads the collapse status\n * @memberof splitView\n * @returns {boolean} true if the split view is currently collapsed\n * @since 0.6.0\n * @example\n * splitViewHandle.isCollapsed();\n */\n isCollapsed() {\n return this.splitView.collapsed;\n }\n /**\n * Reads the expand status\n * @memberof splitView\n * @returns {boolean} true if the split view is currently expanded\n * @since 0.6.0\n * @example\n * splitViewHandle.isExpanded();\n */\n isExpanded() {\n return !this.splitView.collapsed;\n }\n}\n","import { LuigiClientBase } from './baseClass';\nimport { helpers } from './helpers';\nimport { splitViewHandle } from './splitViewHandle';\n\n/**\n * The Link Manager allows you to navigate to another route. Use it instead of an internal router to:\n - Provide routing inside micro frontends.\n - Reflect the route.\n - Keep the navigation state in Luigi.\n * @name linkManager\n */\nexport class linkManager extends LuigiClientBase {\n /**\n * @private\n */\n constructor(values) {\n super();\n Object.assign(this, values);\n\n this.options = {\n preserveView: false,\n nodeParams: {},\n errorSkipNavigation: false,\n fromContext: null,\n fromClosestContext: false,\n fromVirtualTreeRoot: false,\n fromParent: false,\n relative: false,\n link: '',\n newTab: false,\n preserveQueryParams: false,\n anchor: '',\n preventContextUpdate: false,\n preventHistoryEntry: false\n };\n }\n\n /**\n * Navigates to the given path in the application hosted by Luigi. It contains either a full absolute path or a relative path without a leading slash that uses the active route as a base. This is the standard navigation.\n * @memberof linkManager\n * @param {string} path path to be navigated to\n * @param {string} sessionId current Luigi **sessionId**\n * @param {boolean} preserveView preserve a view by setting it to `true`. It keeps the current view opened in the background and opens the new route in a new frame. Use the {@link #goBack goBack()} function to navigate back. You can use this feature across different levels. Preserved views are discarded as soon as you use the standard {@link #navigate navigate()} function instead of {@link #goBack goBack()}\n * @param {Object} modalSettings opens a view in a modal. Use these settings to configure the modal's title and size\n * @param {string} modalSettings.title modal title. By default, it is the node label. If there is no label, it is left empty\n * @param {('fullscreen'|'l'|'m'|'s')} [modalSettings.size=\"l\"] size of the modal\n * @param {string} modalSettings.width updates the `width` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'.\n * @param {string} modalSettings.height updates the `height` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'.\n * @param {boolean} modalSettings.keepPrevious Lets you open multiple modals. Keeps the previously opened modal and allows to open another modal on top of the previous one. By default the previous modals are discarded.\n * @param {string} modalSettings.closebtn_data_testid lets you specify a `data_testid` for the close button. Default value is `lui-modal-index-0`. If multiple modals are opened the index will be increased per modal.\n * @param {Object} splitViewSettings opens a view in a split view. Use these settings to configure the split view's behaviour\n * @param {string} splitViewSettings.title split view title. By default, it is the node label. If there is no label, it is left empty\n * @param {number} [splitViewSettings.size=40] height of the split view in percent\n * @param {boolean} [splitViewSettings.collapsed=false] creates split view but leaves it closed initially\n * @param {Object} drawerSettings opens a view in a drawer. Use these settings to configure if the drawer has a header, backdrop and size.\n * @param {any} drawerSettings.header By default, the header is visible. The default title is the node label, but the header could also be an object with a `title` attribute allowing you to specify your own title. An 'x' icon is displayed to close the drawer view.\n * @param {boolean} drawerSettings.backdrop By default, it is set to `false`. If it is set to `true` the rest of the screen has a backdrop.\n * @param {('l'|'m'|'s'|'xs')} [drawerSettings.size=\"s\"] size of the drawer\n * @example\n * LuigiClient.linkManager().navigate('/overview')\n * LuigiClient.linkManager().navigate('users/groups/stakeholders')\n * LuigiClient.linkManager().navigate('/settings', null, true) // preserve view\n * LuigiClient.linkManager().navigate('#?Intent=Sales-order?id=13') // intent navigation\n */\n navigate(path, sessionId, preserveView, modalSettings, splitViewSettings, drawerSettings) {\n if (this.options.errorSkipNavigation) {\n this.options.errorSkipNavigation = false;\n return;\n }\n if (modalSettings && splitViewSettings && drawerSettings) {\n console.warn(\n 'modalSettings, splitViewSettings and drawerSettings cannot be used together. Only modal setting will be taken into account.'\n );\n }\n\n this.options.preserveView = preserveView;\n const relativePath = path[0] !== '/';\n\n if (path === '/' && (modalSettings || splitViewSettings || drawerSettings)) {\n console.warn('Navigation with an absolute path prevented.');\n return;\n }\n const navigationOpenMsg = {\n msg: 'luigi.navigation.open',\n sessionId: sessionId,\n params: Object.assign(this.options, {\n link: path,\n relative: relativePath,\n intent: helpers.hasIntent(path),\n modal: modalSettings,\n splitView: splitViewSettings,\n drawer: drawerSettings\n })\n };\n helpers.sendPostMessageToLuigiCore(navigationOpenMsg);\n }\n\n /**\n * Updates path of the modalPathParam when internal navigation occurs.\n * @memberof linkManager\n * @param {string} path\n * @param {boolean} addHistoryEntry adds an entry in the history\n * @param {Object} [modalSettings] opens a view in a modal. Use these settings to configure the modal's title and size\n * @since 1.21.0\n * @example\n * LuigiClient.linkManager().updateModalPathInternalNavigation('microfrontend')\n */\n updateModalPathInternalNavigation(path, modalSettings = {}, addHistoryEntry = false) {\n if (!path) {\n console.warn('Updating path of the modal upon internal navigation prevented. No path specified.');\n return;\n }\n\n const navigationOpenMsg = {\n msg: 'luigi.navigation.updateModalDataPath',\n params: Object.assign(this.options, {\n link: path,\n modal: modalSettings,\n history: addHistoryEntry\n })\n };\n helpers.sendPostMessageToLuigiCore(navigationOpenMsg);\n }\n\n /**\n * Offers an alternative way of navigating with intents. This involves specifying a semanticSlug and an object containing\n * parameters.\n * This method internally generates a URL of the form `#?intent=<semantic object>-<action>?<param_name>=<param_value>` through the given\n * input arguments. This then follows a call to the original `linkManager.navigate(...)` function.\n * Consequently, the following calls shall have the exact same effect:\n * - linkManager().navigateToIntent('Sales-settings', {project: 'pr2', user: 'john'})\n * - linkManager().navigate('/#?intent=Sales-settings?project=pr2&user=john')\n * @param {string} semanticSlug concatenation of semantic object and action connected with a dash (-), i.e.: `<semanticObject>-<action>`\n * @param {Object} params an object representing all the parameters passed, i.e.: `{param1: '1', param2: 2, param3: 'value3'}`.\n * @example\n * LuigiClient.linkManager().navigateToIntent('Sales-settings', {project: 'pr2', user: 'john'})\n * LuigiClient.linkManager().navigateToIntent('Sales-settings')\n */\n navigateToIntent(semanticSlug, params = {}) {\n let newPath = '#?intent=';\n newPath += semanticSlug;\n if (params && Object.keys(params)?.length) {\n const paramList = Object.entries(params);\n // append parameters to the path if any\n if (paramList.length > 0) {\n newPath += '?';\n for (const [key, value] of paramList) {\n newPath += key + '=' + value + '&';\n }\n // trim potential excessive ampersand & at the end\n newPath = newPath.slice(0, -1);\n }\n }\n this.navigate(newPath);\n }\n\n /**\n * Opens a view in a modal. You can specify the modal's title and size. If you don't specify the title, it is the node label. If there is no node label, the title remains empty. The default size of the modal is `l`, which means 80%. You can also use `m` (60%) and `s` (40%) to set the modal size. Optionally, use it in combination with any of the navigation functions.\n * @memberof linkManager\n * @param {string} path navigation path\n * @param {Object} [modalSettings] opens a view in a modal. Use these settings to configure the modal's title and size\n * @param {string} modalSettings.title modal title. By default, it is the node label. If there is no label, it is left empty\n * @param {('fullscreen'|'l'|'m'|'s')} [modalSettings.size=\"l\"] size of the modal\n * @param {string} modalSettings.width updates the `width` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'.\n * @param {string} modalSettings.height updates the `height` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'.\n * @param {boolean} modalSettings.keepPrevious Lets you open multiple modals. Keeps the previously opened modal and allows to open another modal on top of the previous one. By default the previous modals are discarded.\n * @param {string} modalSettings.closebtn_data_testid lets you specify a `data_testid` for the close button. Default value is `lui-modal-index-0`. If multiple modals are opened the index will be increased per modal.\n * @returns {promise} which is resolved when closing the modal. By using LuigiClient.linkManager().goBack({ foo: 'bar' }) to close the modal you have access to the `goBackContext` when the promise will be resolved.\n * @example\n * LuigiClient.linkManager().openAsModal('projects/pr1/users', {title:'Users', size:'m'}).then((res) => {\n * // Logic to execute when the modal will be closed\n * console.log(res.data) //=> {foo: 'bar'}\n * });\n */\n openAsModal(path, modalSettings = {}) {\n helpers.addEventListener('luigi.navigation.modal.close', (e, listenerId) => {\n const promise = this.getPromise('modal');\n if (promise) {\n promise.resolveFn(e.data);\n this.setPromise('modal', undefined);\n }\n helpers.removeEventListener(listenerId);\n });\n const modalPromise = {};\n modalPromise.promise = new Promise((resolve, reject) => {\n modalPromise.resolveFn = resolve;\n modalPromise.rejectFn = reject;\n });\n this.setPromise('modal', modalPromise);\n this.navigate(path, 0, true, modalSettings);\n return modalPromise.promise;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Updates the current title and size of a modal. If `routing.showModalPathInUrl` is set to `true`, the URL will be updated with the modal settings data.\n * In addition, you can specify if a new history entry will be created with the updated URL.\n * @memberof linkManager\n * @param {Object} updatedModalSettings possibility to update the active modal.\n * @param {Object} updatedModalSettings.title update the `title` of the active modal.\n * @param {Object} updatedModalSettings.size update the `size` of the active modal.\n * @param {string} updatedModalSettings.width updates the `width` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'.\n * @param {string} updatedModalSettings.height updates the `height` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'.\n * @param {boolean} addHistoryEntry adds an entry in the history, by default it's `false`.\n * @example\n * LuigiClient.linkManager().updateModalSettings({title:'LuigiModal', size:'l'});\n */\n updateModalSettings(updatedModalSettings = {}, addHistoryEntry = false) {\n const message = {\n msg: 'luigi.navigation.updateModalSettings',\n updatedModalSettings,\n addHistoryEntry\n };\n helpers.sendPostMessageToLuigiCore(message);\n }\n\n /**\n * Opens a view in a split view. You can specify the split view's title and size. If you don't specify the title, it is the node label. If there is no node label, the title remains empty. The default size of the split view is `40`, which means 40% height of the split view.\n * @memberof linkManager\n * @param {string} path navigation path\n * @param {Object} splitViewSettings opens a view in a split view. Use these settings to configure the split view's behaviour\n * @param {string} splitViewSettings.title split view title. By default, it is the node label. If there is no label, it is left empty\n * @param {number} [splitViewSettings.size=40] height of the split view in percent\n * @param {boolean} [splitViewSettings.collapsed=false] opens split view in collapsed state\n * @returns {Object} instance of the SplitView. It provides Event listeners and you can use the available functions to control its behavior.\n * @see {@link splitView} for further documentation about the returned instance\n * @since 0.6.0\n * @example\n * const splitViewHandle = LuigiClient.linkManager().openAsSplitView('projects/pr1/logs', {title: 'Logs', size: 40, collapsed: true});\n */\n openAsSplitView(path, splitViewSettings = {}) {\n this.navigate(path, 0, true, undefined, splitViewSettings);\n return new splitViewHandle(splitViewSettings);\n }\n\n /**\n * Opens a view in a drawer. You can specify the size of the drawer, whether the drawer has a header, and whether a backdrop is active in the background. By default, the header is shown. The backdrop is not visible and has to be activated. The size of the drawer is set to `s` by default, which means 25% of the micro frontend size. You can also use `l`(75%), `m`(50%) or `xs`(15.5%). Optionally, use it in combination with any of the navigation functions.\n * @memberof linkManager\n * @param {string} path navigation path\n * @param {Object} drawerSettings opens a view in a drawer. Use these settings to configure if the drawer has a header, backdrop and size.\n * @param {any} drawerSettings.header By default, the header is visible. The default title is the node label, but the header could also be an object with a `title` attribute allowing you to specify your own title. An 'x' icon is displayed to close the drawer view.\n * @param {boolean} drawerSettings.backdrop By default, it is set to `false`. If it is set to `true` the rest of the screen has a backdrop.\n * @param {('l'|'m'|'s'|'xs')} [drawerSettings.size=\"s\"] size of the drawer\n * @param {boolean} [drawerSettings.overlap=true] enable resizing of main microfrontend iFrame after drawer open\n * @since 1.6.0\n * @example\n * LuigiClient.linkManager().openAsDrawer('projects/pr1/drawer', {header:true, backdrop:true, size:'s'});\n * LuigiClient.linkManager().openAsDrawer('projects/pr1/drawer', {header:{title:'My drawer component'}, backdrop:true, size:'xs'});\n */\n openAsDrawer(path, drawerSettings = {}) {\n this.navigate(path, 0, true, undefined, undefined, drawerSettings);\n }\n\n /**\n * Sets the current navigation context to that of a specific parent node which has the {@link navigation-configuration.md navigationContext} field declared in the navigation configuration. This navigation context is then used by the `navigate` function.\n * @memberof linkManager\n * @param {string} navigationContext\n * @returns {linkManager} link manager instance\n * @example\n * LuigiClient.linkManager().fromContext('project').navigate('/settings')\n */\n fromContext(navigationContext) {\n const navigationContextInParent =\n this.currentContext.context.parentNavigationContexts &&\n this.currentContext.context.parentNavigationContexts.indexOf(navigationContext) !== -1;\n if (navigationContextInParent) {\n this.options.fromContext = navigationContext;\n } else {\n this.options.errorSkipNavigation = true;\n console.error('Navigation not possible, navigationContext ' + navigationContext + ' not found.');\n }\n return this;\n }\n\n /**\n * Sets the current navigation context which is then used by the `navigate` function. This has to be a parent navigation context, it is not possible to use the child navigation contexts.\n * @memberof linkManager\n * @returns {linkManager} link manager instance\n * @example\n * LuigiClient.linkManager().fromClosestContext().navigate('/users/groups/stakeholders')\n */\n fromClosestContext() {\n const hasParentNavigationContext = this.currentContext?.context.parentNavigationContexts.length > 0;\n if (hasParentNavigationContext) {\n this.options.fromContext = null;\n this.options.fromClosestContext = true;\n } else {\n console.error('Navigation not possible, no parent navigationContext found.');\n }\n return this;\n }\n\n /**\n * Sets the current navigation base to the parent node that is defined as virtualTree. This method works only when the currently active micro frontend is inside a virtualTree.\n * @memberof linkManager\n * @returns {linkManager} link manager instance\n * @since 1.0.1\n * @example\n * LuigiClient.linkManager().fromVirtualTreeRoot().navigate('/users/groups/stakeholders')\n */\n fromVirtualTreeRoot() {\n this.options.fromContext = null;\n this.options.fromClosestContext = false;\n this.options.fromVirtualTreeRoot = true;\n return this;\n }\n\n /**\n * Enables navigating to sibling nodes without knowing the absolute path.\n * @memberof linkManager\n * @returns {linkManager} link manager instance\n * @since 1.0.1\n * @example\n * LuigiClient.linkManager().fromParent().navigate('/sibling')\n */\n fromParent() {\n this.options.fromParent = true;\n return this;\n }\n\n /**\n * Sends node parameters to the route. The parameters are used by the `navigate` function. Use it optionally in combination with any of the navigation functions and receive it as part of the context object in Luigi Client.\n * @memberof linkManager\n * @param {Object} nodeParams\n * @returns {linkManager} link manager instance\n * @example\n * LuigiClient.linkManager().withParams({foo: \"bar\"}).navigate(\"path\")\n *\n * // Can be chained with context setting functions such as:\n * LuigiClient.linkManager().fromContext(\"currentTeam\").withParams({foo: \"bar\"}).navigate(\"path\")\n */\n withParams(nodeParams) {\n if (nodeParams) {\n Object.assign(this.options.nodeParams, nodeParams);\n }\n return this;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Sets options to customise route changing behaviour. The parameters are used by the `navigate` function. Use it optionally in combination with any of the navigation functions and receive it as part of the context object in Luigi Client.\n * @memberof linkManager\n * @param {Object} options navigation options\n * @param {boolean} options.preventHistoryEntry By default, it is set to `false`. If it is set to `true`, there is no browser history being kept.\n * @param {boolean} options.preventContextUpdate By default, it is set to `false`. If it is set to `true`, there is no context update being triggered.\n * @returns {linkManager} link manager instance\n * @since 1.25.0\n * @example\n * LuigiClient.linkManager().withOptions(\n * { preventContextUpdate:true, preventHistoryEntry: true }\n * ).navigate('/overview')\n */\n withOptions(options) {\n if (!helpers.isObject(options)) return this;\n\n if (options['preventHistoryEntry'] !== undefined) {\n this.options.preventHistoryEntry = options['preventHistoryEntry'];\n }\n\n if (options['preventContextUpdate'] !== undefined) {\n this.options.preventContextUpdate = options['preventContextUpdate'];\n }\n\n return this;\n }\n\n /** @lends linkManager */\n /**\n * Checks if the path you can navigate to exists in the main application. For example, you can use this helper method conditionally to display a DOM element like a button.\n * @memberof linkManager\n * @param {string} path path which existence you want to check\n * @returns {promise} a promise which resolves to a Boolean variable specifying whether the path exists or not\n * @example\n * let pathExists;\n * LuigiClient\n * .linkManager()\n * .pathExists('projects/pr2')\n * .then(\n * (pathExists) => { }\n * );\n */\n pathExists(path) {\n const currentId = helpers.getRandomId();\n const pathExistsPromises = this.getPromise('pathExistsPromises') || {};\n pathExistsPromises[currentId] = {\n resolveFn: function () {},\n then: function (resolveFn) {\n this.resolveFn = resolveFn;\n }\n };\n this.setPromise('pathExistsPromises', pathExistsPromises);\n\n // register event listener, which will be cleaned up after this usage\n helpers.addEventListener(\n 'luigi.navigation.pathExists.answer',\n function (e, listenerId) {\n const data = e.data.data;\n const pathExistsPromises = this.getPromise('pathExistsPromises') || {};\n if (data.correlationId === currentId) {\n if (pathExistsPromises[data.correlationId]) {\n pathExistsPromises[data.correlationId].resolveFn(data.pathExists);\n delete pathExistsPromises[data.correlationId];\n this.setPromise('pathExistsPromises', pathExistsPromises);\n }\n helpers.removeEventListener(listenerId);\n }\n }.bind(this)\n );\n\n const pathExistsMsg = {\n msg: 'luigi.navigation.pathExists',\n data: Object.assign(this.options, {\n id: currentId,\n link: path,\n intent: helpers.hasIntent(path),\n relative: path[0] !== '/'\n })\n };\n helpers.sendPostMessageToLuigiCore(pathExistsMsg);\n return pathExistsPromises[currentId];\n }\n\n /**\n * Checks if there is one or more preserved views. You can use it to show a **back** button.\n * @memberof linkManager\n * @returns {boolean} indicating if there is a preserved view you can return to\n */\n hasBack() {\n return !!this.currentContext.internal.modal || this.currentContext.internal.viewStackSize !== 0;\n }\n\n /**\n * Discards the active view and navigates back to the last visited view. Works with preserved views, and also acts as the substitute of the browser **back** button. **goBackContext** is only available when using preserved views.\n * @memberof linkManager\n * @param {any} goBackValue data that is passed in the **goBackContext** field to the last visited view when using preserved views\n * @example\n * LuigiClient.linkManager().goBack({ foo: 'bar' });\n * LuigiClient.linkManager().goBack(true);\n */\n goBack(goBackValue) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.navigation.back',\n goBackContext: goBackValue && JSON.stringify(goBackValue)\n });\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Disables the navigation handling for a single navigation request.\n * It prevents Luigi Core from handling the URL change after `navigate()`.\n * Used for auto-navigation.\n * @since 0.7.7\n * @example\n * LuigiClient.linkManager().withoutSync().navigate('/projects/xy/foobar');\n * LuigiClient.linkManager().withoutSync().fromClosestContext().navigate('settings');\n */\n withoutSync() {\n this.options.withoutSync = true;\n return this;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Enables navigating to a new tab.\n * @since 1.16.0\n * @example\n * LuigiClient.linkManager().newTab().navigate('/projects/xy/foobar');\n */\n newTab() {\n this.options.newTab = true;\n return this;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Keeps the URL's query parameters for a navigation request.\n * @param {boolean} preserve By default, it is set to `false`. If it is set to `true`, the URL's query parameters will be kept after navigation.\n * @since 1.19.0\n * @example\n * LuigiClient.linkManager().preserveQueryParams(true).navigate('/projects/xy/foobar');\n * LuigiClient.linkManager().preserveQueryParams(false).navigate('/projects/xy/foobar');\n */\n preserveQueryParams(preserve = false) {\n this.options.preserveQueryParams = preserve;\n return this;\n }\n\n /**\n * Gets the luigi route associated with the current micro frontend.\n * @returns {promise} a promise which resolves to a String value specifying the current luigi route\n * @since 1.23.0\n * @example\n * LuigiClient.linkManager().getCurrentRoute();\n * LuigiClient.linkManager().fromContext('project').getCurrentRoute();\n * LuigiClient.linkManager().fromVirtualTreeRoot().getCurrentRoute();\n */\n getCurrentRoute() {\n const currentId = helpers.getRandomId();\n\n const currentRoutePromise = this.getPromise('getCurrentRoute') || {};\n currentRoutePromise[currentId] = {\n resolveFn: function () {},\n then: function (resolveFn) {\n this.resolveFn = resolveFn;\n }\n };\n\n this.setPromise('getCurrentRoute', currentRoutePromise);\n\n helpers.addEventListener('luigi.navigation.currentRoute.answer', (e, listenerId) => {\n const data = e.data.data;\n const currentRoutePromise = this.getPromise('getCurrentRoute') || {};\n\n if (data.correlationId === currentId) {\n if (currentRoutePromise[data.correlationId]) {\n currentRoutePromise[data.correlationId].resolveFn(data.route);\n delete currentRoutePromise[data.correlationId];\n this.setPromise('getCurrentRoute', currentRoutePromise);\n }\n helpers.removeEventListener(listenerId);\n }\n helpers.removeEventListener(listenerId);\n });\n\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.navigation.currentRoute',\n data: Object.assign(this.options, {\n id: currentId\n })\n });\n\n return currentRoutePromise[currentId];\n }\n}\n","import { LuigiClientBase } from './baseClass';\nimport { lifecycleManager } from './lifecycleManager';\nimport { helpers } from './helpers';\n\n/**\n * Use the UX Manager to manage the appearance features in Luigi.\n * @name uxManager\n */\nclass UxManager extends LuigiClientBase {\n /** @private */\n constructor() {\n super();\n helpers.addEventListener('luigi.current-locale-changed', (e) => {\n if (e.data.currentLocale && lifecycleManager.currentContext?.internal) {\n lifecycleManager.currentContext.internal.currentLocale = e.data.currentLocale;\n lifecycleManager._notifyUpdate();\n }\n });\n }\n\n /**\n * Adds a backdrop with a loading indicator for the micro frontend frame. This overrides the {@link navigation-parameters-reference.md#node-parameters loadingIndicator.enabled} setting.\n * @memberof uxManager\n */\n showLoadingIndicator() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.show-loading-indicator' });\n }\n\n /**\n * Removes the loading indicator. Use it after calling {@link #showLoadingIndicator showLoadingIndicator()} or to hide the indicator when you use the {@link navigation-parameters-reference.md#node-parameters loadingIndicator.hideAutomatically: false} node configuration.\n * @memberof uxManager\n */\n hideLoadingIndicator() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.hide-loading-indicator' });\n }\n\n /**\n * Closes the currently opened micro frontend modal.\n * @memberof uxManager\n */\n closeCurrentModal() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.close-modal' });\n }\n\n /**\n * Adds a backdrop to block the top and side navigation. It is based on the Fundamental UI Modal, which you can use in your micro frontend to achieve the same behavior.\n * @memberof uxManager\n */\n addBackdrop() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.add-backdrop' });\n }\n\n /**\n * Removes the backdrop.\n * @memberof uxManager\n */\n removeBackdrop() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.remove-backdrop' });\n }\n\n /**\n * This method informs the main application that there are unsaved changes in the current view in the iframe. It can be used to prevent navigation away from the current view, for example with form fields which were edited but not submitted. However, this functionality is not restricted to forms. If you use `withoutSync()` together with `setDirtyStatus()`, this is a special case in which the dirty state logic needs to be handled by the micro frontend. For example, if the user navigates with an Angular router, which would trigger `withoutSync()`, Angular needs to take care about dirty state, prevent the navigation and ask for permission to navigate away, through `uxManager().showConfirmationModal(settings)`.\n * @param {boolean} isDirty indicates if there are any unsaved changes on the current page or in the component\n * @memberof uxManager\n */\n setDirtyStatus(isDirty) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.set-page-dirty',\n dirty: isDirty\n });\n }\n\n /**\n * Shows a confirmation modal.\n * @memberof uxManager\n * @param {Object} settings the settings of the confirmation modal. If you don't provide any value for any of the fields, a default value is used\n * @param {('confirmation'|'success'|'warning'|'error'|'information')} settings.type the content of the modal type. (Optional)\n * @param {string} [settings.header=\"Confirmation\"] the content of the modal header\n * @param {string} [settings.body=\"Are you sure you want to do this?\"] the content of the modal body. It supports HTML formatting elements such as `<br>`, `<b>`, `<strong>`, `<i>`, `<em>`, `<mark>`, `<small>`, `<del>`, `<ins>`, `<sub>`, `<sup>`.\n * @param {string|false} [settings.buttonConfirm=\"Yes\"] the label for the modal confirmation button. If set to `false`, the button will not be shown.\n * @param {string} [settings.buttonDismiss=\"No\"] the label for the modal dismiss button\n * @returns {promise} which is resolved when accepting the confirmation modal and rejected when dismissing it\n * @example\n * import LuigiClient from '@luigi-project/client';\n * const settings = {\n * type: \"confirmation\",\n * header: \"Confirmation\",\n * body: \"Are you sure you want to do this?\",\n * buttonConfirm: \"Yes\",\n * buttonDismiss: \"No\"\n * }\n * LuigiClient\n * .uxManager()\n * .showConfirmationModal(settings)\n * .then(() => {\n * // Logic to execute when the confirmation modal is dismissed\n * });\n */\n showConfirmationModal(settings) {\n helpers.addEventListener('luigi.ux.confirmationModal.hide', (e, listenerId) => {\n this.hideConfirmationModal(e.data.data);\n helpers.removeEventListener(listenerId);\n });\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.ux.confirmationModal.show',\n data: { settings }\n });\n\n const confirmationModalPromise = {};\n confirmationModalPromise.promise = new Promise((resolve, reject) => {\n confirmationModalPromise.resolveFn = resolve;\n confirmationModalPromise.rejectFn = reject;\n });\n this.setPromise('confirmationModal', confirmationModalPromise);\n return confirmationModalPromise.promise;\n }\n\n /**\n * @private\n * @memberof uxManager\n * @param {Object} modal confirmed boolean value if ok or cancel has been pressed\n */\n hideConfirmationModal(modal) {\n const promise = this.getPromise('confirmationModal');\n if (promise) {\n modal.confirmed ? promise.resolveFn() : promise.rejectFn();\n this.setPromise('confirmationModal', undefined);\n }\n }\n\n /**\n * Shows an alert.\n * @memberof uxManager\n * @param {Object} settings the settings for the alert\n * @param {string} settings.text the content of the alert. To add a link to the content, you have to set up the link in the `links` object. The key(s) in the `links` object must be used in the text to reference the links, wrapped in curly brackets with no spaces. If you don't specify any text, the alert is not displayed\n * @param {('info'|'success'|'warning'|'error')} settings.type sets the type of alert\n * @param {Object} settings.links provides links data\n * @param {Object} settings.links.LINK_KEY object containing the data for a particular link. To properly render the link in the alert message refer to the description of the **settings.text** parameter\n * @param {string} settings.links.LINK_KEY.text text which replaces the link identifier in the alert content\n * @param {string} settings.links.LINK_KEY.url URL to navigate when you click the link. Currently, only internal links are supported in the form of relative or absolute paths\n * @param {string} settings.links.LINK_KEY.dismissKey dismissKey which represents the key of the link.\n * @param {number} settings.closeAfter (optional) time in milliseconds that tells Luigi when to close the Alert automatically. If not provided, the Alert will stay on until closed manually. It has to be greater than `100`\n * @returns {promise} which is resolved when the alert is dismissed\n * @example\n * import LuigiClient from '@luigi-project/client';\n * const settings = {\n * text: \"Ut enim ad minim veniam, {goToHome} quis nostrud exercitation ullamco {relativePath}. Duis aute irure dolor {goToOtherProject} or {neverShowItAgain}\",\n * type: 'info',\n * links: {\n * goToHome: { text: 'homepage', url: '/overview' },\n * goToOtherProject: { text: 'other project', url: '/projects/pr2' },\n * relativePath: { text: 'relative hide side nav', url: 'hideSideNav' },\n * neverShowItAgain: { text: 'Never show it again', dismissKey: 'neverShowItAgain' }\n * },\n * closeAfter: 3000\n * }\n * LuigiClient\n * .uxManager()\n * .showAlert(settings)\n * .then(() => {\n * // Logic to execute when the alert is dismissed\n * });\n */\n showAlert(settings) {\n //generate random ID\n settings.id = helpers.getRandomId();\n\n helpers.addEventListener('luigi.ux.alert.hide', (e, listenerId) => {\n if (e.data.id === settings.id) {\n this.hideAlert(e.data);\n helpers.removeEventListener(listenerId);\n }\n });\n\n if (settings?.closeAfter < 100) {\n console.warn(`Message with id='${settings.id}' has too small 'closeAfter' value. It needs to be at least 100ms.`);\n settings.closeAfter = undefined;\n }\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.ux.alert.show',\n data: { settings }\n });\n\n const alertPromises = this.getPromise('alerts') || {};\n alertPromises[settings.id] = {};\n alertPromises[settings.id].promise = new Promise((resolve) => {\n alertPromises[settings.id].resolveFn = resolve;\n });\n this.setPromise('alerts', alertPromises);\n return alertPromises[settings.id].promise;\n }\n\n /**\n * @private\n * @memberof uxManager\n * @param {Object} alertObj\n * @param {string} alertObj.id alert id\n * @param {string} alertObj.dismissKey key of the link\n */\n hideAlert({ id, dismissKey }) {\n const alerts = this.getPromise('alerts');\n if (id && alerts[id]) {\n alerts[id].resolveFn(dismissKey ? dismissKey : id);\n delete alerts[id];\n this.setPromise('alerts', alerts);\n }\n }\n\n /**\n * Gets the current locale.\n * @returns {string} current locale\n * @memberof uxManager\n */\n getCurrentLocale() {\n return lifecycleManager.currentContext?.internal?.currentLocale;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Sets current locale to the specified one.\n *\n * **NOTE:** this must be explicitly allowed on the navigation node level by setting `clientPermissions.changeCurrentLocale` to `true`. (See {@link navigation-parameters-reference.md Node parameters}.)\n *\n * @param {string} locale locale to be set as the current locale\n * @memberof uxManager\n */\n setCurrentLocale(locale) {\n if (locale) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.ux.set-current-locale',\n data: {\n currentLocale: locale\n }\n });\n }\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Checks if the current micro frontend is displayed inside a split view\n * @returns {boolean} indicating if it is loaded inside a split view\n * @memberof uxManager\n * @since 0.6.0\n */\n isSplitView() {\n return lifecycleManager.currentContext?.internal?.splitView;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Checks if the current micro frontend is displayed inside a modal\n * @returns {boolean} indicating if it is loaded inside a modal\n * @memberof uxManager\n * @since 0.6.0\n */\n isModal() {\n return lifecycleManager.currentContext?.internal?.modal;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Checks if the current micro frontend is displayed inside a drawer\n * @returns {boolean} indicating if it is loaded inside a drawer\n * @memberof uxManager\n * @since 1.26.0\n */\n isDrawer() {\n return lifecycleManager.currentContext?.internal?.drawer;\n }\n\n /**\n * Gets the current theme.\n * @returns {*} current themeObj\n * @memberof uxManager\n */\n getCurrentTheme() {\n return lifecycleManager.currentContext?.internal?.currentTheme;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Gets the CSS variables from Luigi Core with their key and value.\n * @returns {Object} CSS variables with their key and value.\n * @memberof uxManager\n * @since 2.3.0\n * @example LuigiClient.uxManager().getCSSVariables();\n */\n getCSSVariables() {\n return lifecycleManager.currentContext?.internal?.cssVariables || {};\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Adds the CSS variables from Luigi Core in a <style> tag to the document <head> section.\n * @memberof uxManager\n * @since 2.3.0\n * @example LuigiClient.uxManager().applyCSS();\n */\n applyCSS() {\n document.querySelectorAll('head style[luigi-injected]').forEach((luigiInjectedStyleTag) => {\n luigiInjectedStyleTag.remove();\n });\n const vars = lifecycleManager.currentContext?.internal?.cssVariables;\n if (vars) {\n let cssString = ':root {\\n';\n Object.keys(vars).forEach((key) => {\n const val = vars[key];\n cssString += (key.startsWith('--') ? '' : '--') + key + ':' + val + ';\\n';\n });\n cssString += '}';\n const themeStyle = document.createElement('style');\n themeStyle.setAttribute('luigi-injected', true);\n themeStyle.innerHTML = cssString;\n document.head.appendChild(themeStyle);\n }\n }\n}\nexport const uxManager = new UxManager();\n","import { LuigiClientBase } from './baseClass';\nimport { helpers } from './helpers';\n\nconst pendingOperation = new Map();\n\n/**\n * <!-- label-success: Web App API only -->\n * StorageManager allows you to use browser local storage of key/values. Every storage operation is sent to be managed by Luigi Core.\n * The idea is that different micro frontends can share or persist items using local storage, as long as they come from the same domain and follow the [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy).\n * Since all storage operations are asynchronous (sending an event to Luigi Core that will reply once operation is finished), all the methods return Promises.\n * @name storageManager\n */\nclass StorageManager extends LuigiClientBase {\n /** @private */\n constructor() {\n super();\n this.storageEventProcessor = new StorageEventProcessor();\n helpers.addEventListener('storage', (evt, listenerId) => this.storageEventProcessor.processEvent(evt, listenerId));\n }\n\n /**\n * Stores an item for a specific key.\n * @memberof storageManager\n * @param {string} key key used to identify the value\n * @param {Object} value item to store; object must be stringifyable\n * @returns {Promise<void>} resolves an empty value when the storage operation is over. It will launch an error if storage is not supported, the value cannot be stringified, or if you are using a Luigi reserved key.\n * @example\n * LuigiClient.storageManager().setItem('keyExample','valueExample').then(() => console.log('Value stored'))\n * @since 1.6.0\n */\n setItem(key, value) {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'setItem', {\n key,\n value\n });\n });\n }\n\n /**\n * Retrieves an item for a specific key.\n * @memberof storageManager\n * @param {string} key used to identify the value\n * @returns {Promise<Object>} resolves an item retrieved from storage. It will launch an error if storage is not supported.\n * @example\n * LuigiClient.storageManager().getItem('keyExample').then((value) => console.log);\n * @since 1.6.0\n */\n getItem(key) {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'getItem', { key });\n });\n }\n\n /**\n * Removes an item for a specific key.\n * @memberof storageManager\n * @param {string} key used to identify the value\n * @returns {Promise<Object>} resolves an item just removed from storage. It will launch an error if storage is not supported or if you are using a Luigi reserved key.\n * @example\n * LuigiClient.storageManager().removeItem('keyExample').then((value) => console.log(value + ' just removed')\n * @since 1.6.0\n */\n removeItem(key) {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'removeItem', {\n key\n });\n });\n }\n\n /**\n * Clears all the storage key/values.\n * @memberof storageManager\n * @returns {Promise<void>} resolves when storage clear is over.\n * @example\n * LuigiClient.storageManager().clear().then(() => console.log('storage cleared'))\n * @since 1.6.0\n */\n clear() {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'clear', {});\n });\n }\n\n /**\n * Checks if a key is present in storage.\n * @memberof storageManager\n * @param {string} key key in the storage\n * @returns {Promise<boolean>} `true` if key is present, `false` if it is not\n * @example\n * LuigiClient.storageManager().has(key).then((present) => console.log('item is present '+present))\n * @since 1.6.0\n */\n has(key) {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'has', { key });\n });\n }\n\n /**\n * Gets all the keys used in the storage.\n * @memberof storageManager\n * @returns {Promise<string[]>} keys currently present in the storage\n * @example\n * LuigiClient.storageManager().getAllKeys().then((keys) => console.log('keys are '+keys))\n * @since 1.6.0\n */\n getAllKeys() {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'getAllKeys', {});\n });\n }\n}\n\nclass StorageEventProcessor {\n processEvent(evt, listenerId) {\n try {\n const data = evt.data.data;\n if (!pendingOperation.has(data.id)) {\n console.log('Impossible to find Promise method for message ' + data.id);\n return;\n }\n const promiseOperations = pendingOperation.get(data.id);\n if (data.status === 'ERROR') {\n promiseOperations.reject(data.result);\n } else {\n promiseOperations.resolve(data.result);\n }\n pendingOperation.delete(data.id);\n } catch (e) {\n console.error(e);\n }\n }\n\n waitForSyncResult(id) {\n let start = new Date().getTime();\n while (!syncOperation.has(id)) {\n let exec = new Date().getTime() - start;\n if (exec > 10000) {\n throw 'Storage operation is taking more than 1 second...Some problem with Luigi Core communication';\n }\n }\n const result = syncOperation.get(id);\n pendingOperation.delete(id);\n return result;\n }\n\n execute(resolve, reject, operation, params) {\n let id = helpers.getRandomId();\n this.createPendingOperation(id, resolve, reject);\n this.sendMessage(id, operation, params);\n }\n\n createPendingOperation(id, resolve, reject) {\n pendingOperation.set(id, {\n resolve,\n reject\n });\n }\n sendMessage(id, operation, params) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'storage',\n data: {\n id,\n operation,\n params\n }\n });\n }\n}\n\nexport const storageManager = new StorageManager();\n","import { lifecycleManager } from './lifecycleManager';\nimport { linkManager } from './linkManager';\nimport { uxManager } from './uxManager';\nimport { storageManager } from './storageManager';\nimport { helpers } from './helpers';\n\n/**\n * @name LuigiClient\n * @private\n */\nclass LuigiClient {\n constructor() {\n if (window !== window.top) {\n if (window.document.head.getAttribute('disable-luigi-history-handling') !== 'true') {\n history.pushState = history.replaceState.bind(history);\n }\n if (window.document.head.getAttribute('disable-luigi-runtime-error-handling') !== 'true') {\n window.addEventListener('error', ({ filename, message, lineno, colno, error }) => {\n const msg = {\n msg: 'luigi-runtime-error-handling',\n errorObj: { filename, message, lineno, colno, error }\n };\n helpers.sendPostMessageToLuigiCore(msg);\n });\n }\n }\n }\n\n addInitListener(initFn, disableTpcCheck) {\n return lifecycleManager.addInitListener(initFn, disableTpcCheck);\n }\n removeInitListener(id) {\n return lifecycleManager.removeInitListener(id);\n }\n addContextUpdateListener(contextUpdatedFn) {\n return lifecycleManager.addContextUpdateListener(contextUpdatedFn);\n }\n removeContextUpdateListener(id) {\n return lifecycleManager.removeContextUpdateListener(id);\n }\n getToken() {\n return lifecycleManager.getToken();\n }\n getEventData() {\n return lifecycleManager.getEventData();\n }\n getContext() {\n return lifecycleManager.getContext();\n }\n addNodeParams(params, keepBrowserHistory) {\n return lifecycleManager.addNodeParams(params, keepBrowserHistory);\n }\n getNodeParams(shouldDesanitise) {\n return lifecycleManager.getNodeParams(shouldDesanitise);\n }\n getActiveFeatureToggles() {\n return lifecycleManager.getActiveFeatureToggles();\n }\n getPathParams() {\n return lifecycleManager.getPathParams();\n }\n getCoreSearchParams() {\n return lifecycleManager.getCoreSearchParams();\n }\n addCoreSearchParams(searchParams, keepBrowserHistory) {\n return lifecycleManager.addCoreSearchParams(searchParams, keepBrowserHistory);\n }\n getClientPermissions() {\n return lifecycleManager.getClientPermissions();\n }\n sendCustomMessage(message) {\n return lifecycleManager.sendCustomMessage(message);\n }\n addCustomMessageListener(messageId, listener) {\n return lifecycleManager.addCustomMessageListener(messageId, listener);\n }\n removeCustomMessageListener(listenerId) {\n return lifecycleManager.removeCustomMessageListener(listenerId);\n }\n addInactiveListener(messageId, listener) {\n return lifecycleManager.addInactiveListener(messageId, listener);\n }\n removeInactiveListener(listenerId) {\n return lifecycleManager.removeInactiveListener(listenerId);\n }\n setTargetOrigin(origin) {\n return lifecycleManager.setTargetOrigin(origin);\n }\n getUserSettings() {\n return lifecycleManager.getUserSettings();\n }\n isLuigiClientInitialized() {\n return lifecycleManager.isLuigiClientInitialized();\n }\n luigiClientInit() {\n return lifecycleManager.luigiClientInit();\n }\n getAnchor() {\n return lifecycleManager.getAnchor();\n }\n setAnchor(value) {\n return lifecycleManager.setAnchor(value);\n }\n setViewGroupData(value) {\n return lifecycleManager.setViewGroupData(value);\n }\n\n /**\n * @private\n */\n linkManager() {\n return new linkManager({\n currentContext: lifecycleManager.currentContext\n });\n }\n /**\n * @private\n */\n uxManager() {\n return uxManager;\n }\n /**\n * @private\n */\n lifecycleManager() {\n return lifecycleManager;\n }\n /**\n * @private\n */\n storageManager() {\n return storageManager;\n }\n}\nexport default LuigiClient = new LuigiClient();\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","LuigiClientBase","_classCallCheck","this","promises","value","name","helpers","Helpers","listeners","origin","helperListener","evt","data","msg","message","convertCustomMessageInternalToUser","filter","listener","id","map","eventFn","listenerId","bind","window","addEventListener","internalMessage","getRandomId","push","Boolean","find","l","crypto","getRandomValues","Uint32Array","item","toString","setLuigiCoreDomain","parent","postMessage","error","console","warn","path","toLowerCase","includes","paramsMap","_this","entries","reduce","sanitizedMap","paramPair","deSanitizeParam","String","arguments","length","replaceAll","lifecycleManager","_LuigiClientBase","LifecycleManager","_callSuper","luigiInitialized","defaultContextKeys","setCurrentContext","acc","_onContextUpdatedFns","_onInactiveFns","_onInitFns","authData","_isDeferInitDefined","luigiClientInit","_inherits","document","head","hasAttribute","_this$currentContext","_this$currentContext$","_this$currentContext$2","currentContext","internal","thirdPartyCookieCheck","disabled","_this2","setContext","rawData","index","JSON","parse","e","info","setAuthData","eventPayload","_notifyInit","_tpcCheck","sendPostMessageToLuigiCore","_notifyInactive","isNavigateBack","withoutSync","previousHash","location","hash","history","replaceState","luigiInduced","viewUrl","dispatchEvent","PopStateEvent","state","HashChangeEvent","assign","context","pathParams","_notifyUpdate","clientVersion","require","_isTpcCheckDisabled","luigiCookie","tpc","cookies","cookie","split","trim","objWithFns","payload","isFunction","_callAllFns","initFn","disableTpcCheck","setAttribute","getLuigiCoreDomain","contextUpdatedFn","inactiveFn","customMessageId","customMessageListener","customMessage","removeEventListener","accessToken","getEventData","_this$currentContext$3","activeFeatureToggleList","params","keepBrowserHistory","deSanitizeParamsMap","nodeParams","searchParams","clientPermissions","setTargetOrigin","customMessageInternal","convertCustomMessageUserToInternal","userSettings","anchor","splitViewHandle","settings","validSplitViewEvents","splitView","exists","size","collapsed","on","newSize","forEach","action","concat","sendSplitViewEvent","callback","filterParam","linkManager","values","options","preserveView","errorSkipNavigation","fromContext","fromClosestContext","fromVirtualTreeRoot","fromParent","relative","link","newTab","preserveQueryParams","preventContextUpdate","preventHistoryEntry","sessionId","modalSettings","splitViewSettings","drawerSettings","relativePath","navigationOpenMsg","intent","hasIntent","modal","drawer","addHistoryEntry","semanticSlug","_Object$keys","newPath","keys","paramList","_step","_iterator","_createForOfIteratorHelper","s","n","done","_step$value","_slicedToArray","err","f","slice","navigate","promise","getPromise","resolveFn","setPromise","modalPromise","Promise","resolve","reject","rejectFn","updatedModalSettings","navigationContext","parentNavigationContexts","indexOf","isObject","currentId","pathExistsPromises","then","correlationId","pathExists","pathExistsMsg","viewStackSize","goBackValue","goBackContext","stringify","preserve","_this3","currentRoutePromise","route","uxManager","UxManager","_lifecycleManager$cur","currentLocale","isDirty","dirty","hideConfirmationModal","confirmationModalPromise","confirmed","hideAlert","closeAfter","alertPromises","_ref","dismissKey","alerts","_lifecycleManager$cur2","_lifecycleManager$cur3","locale","_lifecycleManager$cur4","_lifecycleManager$cur5","_lifecycleManager$cur6","_lifecycleManager$cur7","_lifecycleManager$cur8","_lifecycleManager$cur9","_lifecycleManager$cur10","_lifecycleManager$cur11","currentTheme","_lifecycleManager$cur12","_lifecycleManager$cur13","cssVariables","_lifecycleManager$cur14","_lifecycleManager$cur15","querySelectorAll","luigiInjectedStyleTag","remove","vars","cssString","val","startsWith","themeStyle","createElement","innerHTML","appendChild","pendingOperation","Map","StorageManager","storageEventProcessor","StorageEventProcessor","processEvent","_createClass","execute","_this4","_this5","_this6","_this7","has","log","promiseOperations","status","result","start","Date","getTime","syncOperation","operation","createPendingOperation","sendMessage","set","storageManager","LuigiClient","top","getAttribute","pushState","errorObj","filename","lineno","colno","addInitListener","removeInitListener","addContextUpdateListener","removeContextUpdateListener","getToken","getContext","addNodeParams","shouldDesanitise","getNodeParams","getActiveFeatureToggles","getPathParams","getCoreSearchParams","addCoreSearchParams","getClientPermissions","sendCustomMessage","messageId","addCustomMessageListener","removeCustomMessageListener","addInactiveListener","removeInactiveListener","getUserSettings","isLuigiClientInitialized","getAnchor","setAnchor","setViewGroupData"],"sourceRoot":""}
1
+ {"version":3,"file":"luigi-client.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAqB,YAAID,IAEzBD,EAAkB,YAAIC,GACvB,CATD,CASGK,MAAM,I,4DCRLC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaR,QAGrB,IAAIC,EAASI,EAAyBE,GAAY,CAGjDP,QAAS,CAAC,GAOX,OAHAU,EAAoBH,GAAUN,EAAQA,EAAOD,QAASM,GAG/CL,EAAOD,OACf,CCrBAM,EAAoBK,EAAI,CAACX,EAASY,KACjC,IAAI,IAAIC,KAAOD,EACXN,EAAoBQ,EAAEF,EAAYC,KAASP,EAAoBQ,EAAEd,EAASa,IAC5EE,OAAOC,eAAehB,EAASa,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDP,EAAoBQ,EAAI,CAACK,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,G,msBCI3E,IAAMI,EAAe,WAO1B,O,EAHA,SAAAA,K,4FAAcC,CAAA,KAAAD,GACZE,KAAKC,SAAW,CAAC,CACnB,G,EACA,EAAAd,IAAA,aAAAe,MAIA,SAAWC,EAAMD,GACfF,KAAKC,SAASE,GAAQD,CACxB,GACA,CAAAf,IAAA,aAAAe,MAIA,SAAWC,GACT,OAAOH,KAAKC,SAASE,EACvB,M,6EAAC,CApByB,G,kqBCJ5B,IAgKaC,EAAU,IA/JV,WAuBV,O,EArBD,SAAAC,K,4FAAcN,CAAA,KAAAM,GACZL,KAAKM,UAAY,GACjBN,KAAKO,OAAS,GAEd,IAAMC,EAAiB,SAAUC,GAC/B,GAAKA,EAAIC,KAAKC,IAGd,GAAqB,WAAjBF,EAAIC,KAAKC,IAAkB,CAC7B,IAAMC,EAAUZ,KAAKa,mCAAmCJ,EAAIC,MAC5DV,KAAKM,UACFQ,QAAO,SAACC,GAAQ,OAAKA,EAASZ,OAASS,EAAQI,EAAE,IACjDC,KAAI,SAACF,GAAQ,OAAKA,EAASG,QAAQN,EAASG,EAASI,WAAW,GACrE,MACEnB,KAAKM,UACFQ,QAAO,SAACC,GAAQ,OAAKA,EAASZ,OAASM,EAAIC,KAAKC,GAAG,IACnDM,KAAI,SAACF,GAAQ,OAAKA,EAASG,QAAQT,EAAKM,EAASI,WAAW,GAEnE,EAAEC,KAAKpB,MAEPqB,OAAOC,iBAAiB,UAAWd,EACrC,E,EAAC,EAAArB,IAAA,qCAAAe,MAED,SAAmCqB,GACjC,OAAOA,EAAgBb,IACzB,GAAC,CAAAvB,IAAA,qCAAAe,MAED,SAAmCU,GACjC,MAAO,CACLD,IAAK,SACLD,KAAME,EAEV,GAAC,CAAAzB,IAAA,kCAAAe,MAED,SAAgCU,GAC9B,MAAO,CACLD,IAAK,UACLD,KAAME,EAEV,GAEA,CAAAzB,IAAA,mBAAAe,MASA,SAAiBC,EAAMe,GACrB,IAAMC,EAAanB,KAAKwB,cAMxB,OALAxB,KAAKM,UAAUmB,KAAK,CAClBtB,KAAAA,EACAe,QAAAA,EACAC,WAAAA,IAEKA,CACT,GAEA,CAAAhC,IAAA,sBAAAe,MAKA,SAAoBc,GAElB,QADuBU,QAAQ1B,KAAKM,UAAUqB,MAAK,SAACC,GAAC,OAAKA,EAAET,aAAeH,CAAE,OAE3EhB,KAAKM,UAAYN,KAAKM,UAAUQ,QAAO,SAACc,GAAC,OAAKA,EAAET,aAAeH,CAAE,KAC1D,EAGX,GAEA,CAAA7B,IAAA,cAAAe,MAIA,WACE,OAAOmB,OAAOQ,OAAOC,gBAAgB,IAAIC,YAAY,IAAI,EAC3D,GAEA,CAAA5C,IAAA,aAAAe,MAMA,SAAW8B,GACT,MAAuB,mBAATA,CAChB,GAEA,CAAA7C,IAAA,WAAAe,MAMA,SAAS8B,GACP,MAAgD,oBAAzC3C,OAAOM,UAAUsC,SAASpC,KAAKmC,EACxC,GAAC,CAAA7C,IAAA,qBAAAe,MAED,WACE,OAAOF,KAAKO,MACd,GAAC,CAAApB,IAAA,qBAAAe,MAED,SAAmBK,GAEbA,GAAqB,SAAXA,IACZP,KAAKO,OAASA,EAElB,GAAC,CAAApB,IAAA,kBAAAe,MAED,SAAgBK,GACdP,KAAKkC,mBAAmB3B,EAC1B,GAAC,CAAApB,IAAA,6BAAAe,MAED,SAA2BS,GACzB,GAAIX,KAAKO,OAEP,IACEc,OAAOc,OAAOC,YAAYzB,EAAKX,KAAKO,OACtC,CAAE,MAAO8B,GACPC,QAAQC,KAAK,0BAA4B5B,EAAM,8BAAgCX,KAAKO,OAAS,KAAO8B,EACtG,MAEAC,QAAQC,KACN,kJAGN,GAEA,CAAApD,IAAA,YAAAe,MAIA,SAAUsC,GACR,QAASA,GAAQA,EAAKC,cAAcC,SAAS,YAC/C,GAAC,CAAAvD,IAAA,sBAAAe,MAED,SAAoByC,GAAW,IAAAC,EAAA,KAC7B,OAAOvD,OAAOwD,QAAQF,GAAWG,QAAO,SAACC,EAAcC,GAErD,OADAD,EAAaH,EAAKK,gBAAgBD,EAAU,KAAOJ,EAAKK,gBAAgBD,EAAU,IAC3ED,CACT,GAAG,CAAC,EACN,GAAC,CAAA5D,IAAA,kBAAAe,MAED,WACE,OAAOgD,OADYC,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,GAAAA,UAAA,GAAG,IAEnBE,WAAW,OAAQ,KACnBA,WAAW,OAAQ,KACnBA,WAAW,SAAU,KACrBA,WAAW,QAAS,KACpBA,WAAW,QAAS,IACzB,I,gFAAC,CA5JU,I,qjCCEb,IAylBaC,EAAmB,IAnlBV,SAAAC,GAEpB,SAAAC,IAAc,IAAAZ,EAkBX,O,4FAlBW7C,CAAA,KAAAyD,IACZZ,E,qYAAAa,CAAA,KAAAD,IACKE,kBAAmB,EACxBd,EAAKe,mBAAqB,CAAC,UAAW,WAAY,aAAc,aAAc,gBAC9Ef,EAAKgB,kBACHhB,EAAKe,mBAAmBb,QAAO,SAAUe,EAAK1E,GAE5C,OADA0E,EAAI1E,GAAO,CAAC,EACL0E,CACT,GAAG,CAAC,IAGNjB,EAAKkB,qBAAuB,CAAC,EAC7BlB,EAAKmB,eAAiB,CAAC,EACvBnB,EAAKoB,WAAa,CAAC,EACnBpB,EAAKqB,SAAW,CAAC,EAEZrB,EAAKsB,uBACRtB,EAAKuB,kBACNvB,CACH,CAEA,O,qRAAAwB,CAAAZ,EAAAD,G,EAAAC,E,EAAA,EAAArE,IAAA,sBAAAe,MAKA,WACE,OAAOmB,OAAOgD,SAASC,KAAKC,aAAa,mBAC3C,GAEA,CAAApF,IAAA,sBAAAe,MAKA,WAAsB,IAAAsE,EAAAC,EAAAC,EACpB,OACErD,OAAOgD,SAASC,KAAKC,aAAa,uBACf,QADmCC,EACtDxE,KAAK2E,sBAAc,IAAAH,GAAU,QAAVC,EAAnBD,EAAqBI,gBAAQ,IAAAH,GAAuB,QAAvBC,EAA7BD,EAA+BI,6BAAqB,IAAAH,OAAjC,EAAnBA,EAAsDI,SAE1D,GAEA,CAAA3F,IAAA,2BAAAe,MAQA,WACE,OAAOF,KAAK0D,gBACd,GAEA,CAAAvE,IAAA,kBAAAe,MAOA,WAAkB,IAAA6E,EAAA,KAChB,GAAI/E,KAAK0D,iBACPpB,QAAQC,KAAK,iDADf,CAQA,IAAMyC,EAAa,SAACC,GAClB,IAAK,IAAIC,EAAQ,EAAGA,EAAQH,EAAKpB,mBAAmBP,OAAQ8B,IAAS,CACnE,IAAI/F,EAAM4F,EAAKpB,mBAAmBuB,GAClC,IAC8B,iBAAjBD,EAAQ9F,KACjB8F,EAAQ9F,GAAOgG,KAAKC,MAAMH,EAAQ9F,IAEtC,CAAE,MAAOkG,GACP/C,QAAQgD,KAAK,yCAA0CnG,EAAK8F,EAAQ9F,GAAMkG,EAC5E,CACF,CACAN,EAAKnB,kBAAkBqB,EACzB,EAEMM,EAAc,SAACC,GACfA,IACFT,EAAKd,SAAWuB,EAEpB,EAEApF,EAAQkB,iBAAiB,cAAc,SAAC+D,GACtCL,EAAWK,EAAE3E,MACb6E,EAAYF,EAAE3E,KAAKuD,UACnB7D,EAAQ8B,mBAAmBmD,EAAE9E,QAC7BwE,EAAKrB,kBAAmB,EACxBqB,EAAKU,YAAYJ,EAAE9E,QACnBwE,EAAKW,YACLtF,EAAQuF,2BAA2B,CAAEhF,IAAK,iBAC5C,IAEAP,EAAQkB,iBAAiB,uCAAuC,SAAC+D,GAC/DN,EAAKa,gBAAgBP,EAAE9E,OACzB,IAEAH,EAAQkB,iBAAiB,0BAA0B,SAAC+D,GAClDE,EAAYF,EAAE3E,KAAKuD,SACrB,IAEA7D,EAAQkB,iBAAiB,kBAAkB,SAAC+D,GAE1C,GADAL,EAAWK,EAAE3E,OACRqE,EAAKJ,eAAeC,SAASiB,iBAAmBd,EAAKJ,eAAemB,YAAa,CACpF,IAAMC,EAAe1E,OAAO2E,SAASC,KACrCC,QAAQC,aAAa,CAAEC,cAAc,GAAQ,GAAIf,EAAE3E,KAAK2F,SACxDhF,OAAOiF,cAAc,IAAIC,cAAc,WAAY,CAAEC,MAAO,qBACxDnF,OAAO2E,SAASC,OAASF,GAC3B1E,OAAOiF,cAAc,IAAIG,gBAAgB,cAE7C,CAEI1B,EAAKJ,eAAemB,aACtBzG,OAAOqH,OAAO3B,EAAKJ,eAAegC,QAAS,CACzCN,QAAShB,EAAE3E,KAAK2F,QAAUhB,EAAE3E,KAAK2F,aAAUtH,EAC3C6H,WAAYvB,EAAE3E,KAAKkG,WAAavB,EAAE3E,KAAKkG,gBAAa7H,IAIxDgG,EAAK8B,gBACLzG,EAAQuF,2BAA2B,CAAEhF,IAAK,qBAC5C,IAMAU,OAAOc,OAAOC,YACZ,CACEzB,IAAK,oBACLmG,cAAeC,EAAAA,KAAAA,IAEjB,IA1EF,CA4EF,GAAC,CAAA5H,IAAA,YAAAe,MAED,WACE,IAAIF,KAAKgH,sBAAT,CAIA,IAEIC,EAFAC,EAAM,UACNC,EAAU9C,SAAS+C,OAEnBD,IACFF,EAAcE,EACXE,MAAM,KACNpG,KAAI,SAACmG,GAAM,OAAKA,EAAOE,MAAM,IAC7B3F,MAAK,SAACyF,GAAM,MAAgB,qBAAXA,CAA6B,KAE/B,qBAAhBH,IACF5C,SAAS+C,OAAS,0DAEpB/C,SAAS+C,OAAS,2CAClBD,EAAU9C,SAAS+C,UAEjBH,EAAcE,EACXE,MAAM,KACNpG,KAAI,SAACmG,GAAM,OAAKA,EAAOE,MAAM,IAC7B3F,MAAK,SAACyF,GAAM,MAAgB,qBAAXA,CAA6B,KAE/B,qBAAhBH,GACF5C,SAAS+C,OAAS,yDAClB/F,OAAOc,OAAOC,YAAY,CAAEzB,IAAK,2BAA4BuG,IAAAA,GAAO,OAEpEA,EAAM,WACN7F,OAAOc,OAAOC,YAAY,CAAEzB,IAAK,2BAA4BuG,IAAAA,GAAO,KACpE5E,QAAQC,KAAK,0CA5Bf,CA8BF,GAEA,CAAApD,IAAA,cAAAe,MAMA,SAAYqH,EAAYC,EAASjH,GAC/B,IAAK,IAAIS,KAAMuG,EACTA,EAAW3H,eAAeoB,IAAOZ,EAAQqH,WAAWF,EAAWvG,KACjEuG,EAAWvG,GAAIwG,EAASjH,EAG9B,GAEA,CAAApB,IAAA,cAAAe,MAKA,SAAYK,GACVP,KAAK0H,YAAY1H,KAAKgE,WAAYhE,KAAK2E,eAAegC,QAASpG,EACjE,GAEA,CAAApB,IAAA,gBAAAe,MAKA,WACEF,KAAK0H,YAAY1H,KAAK8D,qBAAsB9D,KAAK2E,eAAegC,QAClE,GAEA,CAAAxH,IAAA,kBAAAe,MAKA,WACEF,KAAK0H,YAAY1H,KAAK+D,eACxB,GAEA,CAAA5E,IAAA,oBAAAe,MAIA,SAAkBA,GAChBF,KAAK2E,eAAiBzE,CACxB,GAEA,CAAAf,IAAA,kBAAAe,MAQA,SAAgByH,EAAQC,GACtB,IAAM5G,EAAKZ,EAAQoB,cAQnB,OAPAxB,KAAKgE,WAAWhD,GAAM2G,EAClBC,GACFvD,SAASC,KAAKuD,aAAa,oBAAqB,IAE9C7H,KAAK0D,kBAAoBtD,EAAQqH,WAAWE,IAC9CA,EAAO3H,KAAK2E,eAAegC,QAASvG,EAAQ0H,sBAEvC9G,CACT,GAUA,CAAA7B,IAAA,qBAAAe,MAOA,SAAmBc,GACjB,QAAIhB,KAAKgE,WAAWhD,KAClBhB,KAAKgE,WAAWhD,QAAMjC,GACf,EAGX,GAEA,CAAAI,IAAA,2BAAAe,MAOA,SAAyB6H,GACvB,IAAM/G,EAAKZ,EAAQoB,cAKnB,OAJAxB,KAAK8D,qBAAqB9C,GAAM+G,EAC5B/H,KAAK0D,kBAAoBtD,EAAQqH,WAAWM,IAC9CA,EAAiB/H,KAAK2E,eAAegC,SAEhC3F,CACT,GAEA,CAAA7B,IAAA,8BAAAe,MAOA,SAA4Bc,GAC1B,QAAIhB,KAAK8D,qBAAqB9C,KAC5BhB,KAAK8D,qBAAqB9C,QAAMjC,GACzB,EAGX,GAEA,CAAAI,IAAA,sBAAAe,MAcA,SAAoB8H,GAClB,IAAMhH,EAAKZ,EAAQoB,cAEnB,OADAxB,KAAK+D,eAAe/C,GAAMgH,EACnBhH,CACT,GAEA,CAAA7B,IAAA,yBAAAe,MAOA,SAAuBc,GACrB,QAAIhB,KAAK+D,eAAe/C,KACtBhB,KAAK+D,eAAe/C,QAAMjC,GACnB,EAGX,GAEA,CAAAI,IAAA,2BAAAe,MASA,SAAyB+H,EAAiBC,GACxC,OAAO9H,EAAQkB,iBAAiB2G,GAAiB,SAACE,EAAehH,GAC/D,OAAO+G,EAAsBC,EAAehH,EAC9C,GACF,GAYA,CAAAhC,IAAA,8BAAAe,MAQA,SAA4Bc,GAC1B,OAAOZ,EAAQgI,oBAAoBpH,EACrC,GAEA,CAAA7B,IAAA,WAAAe,MAOA,WACE,OAAOF,KAAKiE,SAASoE,WACvB,GAEA,CAAAlJ,IAAA,aAAAe,MAOA,WACE,OAAOF,KAAKsI,cACd,GAEA,CAAAnJ,IAAA,eAAAe,MAMA,WACE,OAAOF,KAAK2E,eAAegC,OAC7B,GAEA,CAAAxH,IAAA,0BAAAe,MAQA,WAA0B,IAAAqI,EACxB,OAA2D,QAA3DA,EAAOvI,KAAK2E,eAAeC,SAAS4D,+BAAuB,IAAAD,EAAAA,EAAI,EACjE,GAEA,CAAApJ,IAAA,gBAAAe,MAQA,SAAcuI,GAAmC,IAA3BC,IAAkBvF,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,KAAAA,UAAA,GAClCsF,GACFrI,EAAQuF,2BAA2B,CACjChF,IAAK,sBACLD,KAAM+H,EACNC,mBAAAA,GAGN,GAEA,CAAAvJ,IAAA,gBAAAe,MAYA,WACE,OAD4BiD,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,IAAAA,UAAA,GAExB/C,EAAQuI,oBAAoB3I,KAAK2E,eAAeiE,YAChD5I,KAAK2E,eAAeiE,UAC1B,GAEA,CAAAzJ,IAAA,gBAAAe,MAWA,WACE,OAAOF,KAAK2E,eAAeiC,UAC7B,GAEA,CAAAzH,IAAA,sBAAAe,MAOA,WACE,OAAOF,KAAK2E,eAAekE,cAAgB,CAAC,CAC9C,GAEA,CAAA1J,IAAA,sBAAAe,MAUA,SAAoB2I,GAAyC,IAA3BH,IAAkBvF,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,KAAAA,UAAA,GAC9C0F,GACFzI,EAAQuF,2BAA2B,CACjChF,IAAK,wBACLD,KAAMmI,EACNH,mBAAAA,GAGN,GAEA,CAAAvJ,IAAA,uBAAAe,MAOA,WACE,OAAOF,KAAK2E,eAAeC,SAASkE,mBAAqB,CAAC,CAC5D,GAEA,CAAA3J,IAAA,kBAAAe,MASA,SAAgBK,GACdH,EAAQ2I,gBAAgBxI,EAC1B,GAEA,CAAApB,IAAA,oBAAAe,MAYA,SAAkBU,GAChB,IAAMoI,EAAwB5I,EAAQ6I,mCAAmCrI,GACzER,EAAQuF,2BAA2BqD,EACrC,GAEA,CAAA7J,IAAA,kBAAAe,MAQA,WACE,OAAOF,KAAK2E,eAAeC,SAASsE,YACtC,GAEA,CAAA/J,IAAA,YAAAe,MAQA,WACE,OAAOF,KAAK2E,eAAeC,SAASuE,QAAU,EAChD,GAEA,CAAAhK,IAAA,YAAAe,MAQA,SAAUiJ,GACR/I,EAAQuF,2BAA2B,CACjChF,IAAK,kBACLwI,OAAAA,GAEJ,GAEA,CAAAhK,IAAA,mBAAAe,MAOA,SAAiBQ,GACfN,EAAQuF,2BAA2B,CACjChF,IAAK,kBACLD,KAAAA,GAEJ,I,gFAAC,CAjlBmB,CAASZ,I,qjCCCxB,IAAMsJ,EAAe,SAAA7F,GAI1B,SAAA6F,EAAYC,GAAU,IAAAzG,EAyBuB,O,4FAzBvB7C,CAAA,KAAAqJ,IACpBxG,E,qYAAAa,CAAA,KAAA2F,IAEKE,qBAAuB,CAAC,SAAU,WAAY,SAAU,SAE7D1G,EAAK2G,UAAY,CACfC,QAAQ,EACRC,KAAM,GACNC,WAAW,GAGbrK,OAAOqH,OAAO9D,EAAK2G,UAAWF,GAM9BzG,EAAK2G,UAAUjJ,UAAY,CACzBF,EAAQkB,iBAAiB,uCAAuC,SAAC+D,GAC/DhG,OAAOqH,OAAO9D,EAAK2G,UAAWlE,EAAE3E,KAAKA,KACvC,KAEFkC,EAAK+G,GAAG,UAAU,SAACC,GACjBhH,EAAK2G,UAAUE,KAAOG,CACxB,IACAhH,EAAK+G,GAAG,SAZyB,WAC/B/G,EAAK2G,UAAUjJ,UAAUuJ,SAAQ,SAAC7I,GAAE,OAAKZ,EAAQgI,oBAAoBpH,EAAG,GAC1E,IAU2C4B,CAC7C,CACA,O,qRAAAwB,CAAAgF,EAAA7F,G,EAAA6F,E,EAAA,EAAAjK,IAAA,qBAAAe,MAGA,SAAmB4J,EAAQpJ,GACzBN,EAAQuF,2BAA2B,CACjChF,IAAK,8BAAFoJ,OAAgCD,GACnCpJ,KAAAA,GAEJ,GAEA,CAAAvB,IAAA,WAAAe,MAOA,WACEF,KAAKgK,mBAAmB,WAC1B,GACA,CAAA7K,IAAA,SAAAe,MAOA,WACEF,KAAKgK,mBAAmB,SAC1B,GAEA,CAAA7K,IAAA,QAAAe,MAOA,WACEF,KAAKgK,mBAAmB,QAC1B,GACA,CAAA7K,IAAA,UAAAe,MAQA,SAAQA,GACNF,KAAKgK,mBAAmB,SAAU9J,EACpC,GACA,CAAAf,IAAA,KAAAe,MAaA,SAAGC,EAAM8J,GACP,IAAKjK,KAAKsJ,qBAAqB5G,SAASvC,GAEtC,OADAmC,QAAQC,KAAKpC,EAAO,qCACb,EAET,IAAMa,EAAKZ,EAAQkB,iBAAiB,8BAADyI,OAA+B5J,EAAI,QAAO,SAACkF,GAC5E,IAAM6E,EAAoC,iBAAf7E,EAAE3E,KAAKA,KAAmB2E,EAAE3E,KAAKA,UAAO3B,EACnEkL,EAASC,EACX,IAEA,OADAlK,KAAKuJ,UAAUjJ,UAAUmB,KAAKT,GACvBA,CACT,GACA,CAAA7B,IAAA,sBAAAe,MAQA,SAAoBc,GAClB,OAAOZ,EAAQgI,oBAAoBpH,EACrC,GAEA,CAAA7B,IAAA,SAAAe,MAQA,WACE,OAAOF,KAAKuJ,UAAUC,MACxB,GACA,CAAArK,IAAA,UAAAe,MAQA,WACE,OAAOF,KAAKuJ,UAAUE,IACxB,GACA,CAAAtK,IAAA,cAAAe,MAQA,WACE,OAAOF,KAAKuJ,UAAUG,SACxB,GACA,CAAAvK,IAAA,aAAAe,MAQA,WACE,OAAQF,KAAKuJ,UAAUG,SACzB,I,gFAAC,CAnKyB,CAAS5J,G,wjECG9B,IAAMqK,EAAW,SAAA5G,GAItB,SAAA4G,EAAYC,GAAQ,IAAAxH,EAmBhB,O,4FAnBgB7C,CAAA,KAAAoK,GAClBvH,E,qYAAAa,CAAA,KAAA0G,GACA9K,OAAOqH,OAAM9D,EAAOwH,GAEpBxH,EAAKyH,QAAU,CACbC,cAAc,EACd1B,WAAY,CAAC,EACb2B,qBAAqB,EACrBC,YAAa,KACbC,oBAAoB,EACpBC,qBAAqB,EACrBC,YAAY,EACZC,UAAU,EACVC,KAAM,GACNC,QAAQ,EACRC,qBAAqB,EACrB5B,OAAQ,GACR6B,sBAAsB,EACtBC,qBAAqB,GACrBrI,CACJ,CAEA,O,qRAAAwB,CAAA+F,EAAA5G,G,EAAA4G,E,EAAA,EAAAhL,IAAA,WAAAe,MA2BA,SAASsC,EAAM0I,EAAWZ,EAAca,EAAeC,EAAmBC,GACxE,GAAIrL,KAAKqK,QAAQE,oBACfvK,KAAKqK,QAAQE,qBAAsB,MADrC,CAIIY,GAAiBC,GAAqBC,GACxC/I,QAAQC,KACN,+HAIJvC,KAAKqK,QAAQC,aAAeA,EAC5B,IAAMgB,EAA2B,MAAZ9I,EAAK,GAE1B,GAAa,MAATA,IAAiB2I,GAAiBC,GAAqBC,GACzD/I,QAAQC,KAAK,mDADf,CAIA,IAAMgJ,EAAoB,CACxB5K,IAAK,wBACLuK,UAAWA,EACXzC,OAAQpJ,OAAOqH,OAAO1G,KAAKqK,QAAS,CAClCQ,KAAMrI,EACNoI,SAAUU,EACVE,OAAQpL,EAAQqL,UAAUjJ,GAC1BkJ,MAAOP,EACP5B,UAAW6B,EACXO,OAAQN,KAGZjL,EAAQuF,2BAA2B4F,EAbnC,CAbA,CA2BF,GAEA,CAAApM,IAAA,oCAAAe,MAUA,SAAkCsC,GAAmD,IAA7C2I,EAAahI,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,GAAAA,UAAA,GAAG,CAAC,EAAGyI,EAAezI,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,IAAAA,UAAA,GACzE,GAAKX,EAAL,CAKA,IAAM+I,EAAoB,CACxB5K,IAAK,uCACL8H,OAAQpJ,OAAOqH,OAAO1G,KAAKqK,QAAS,CAClCQ,KAAMrI,EACNkJ,MAAOP,EACPjF,QAAS0F,KAGbxL,EAAQuF,2BAA2B4F,EAVnC,MAFEjJ,QAAQC,KAAK,oFAajB,GAEA,CAAApD,IAAA,mBAAAe,MAcA,SAAiB2L,GAA2B,IAAAC,EAAbrD,EAAMtF,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,GAAAA,UAAA,GAAG,CAAC,EACnC4I,EAAU,YAEd,GADAA,GAAWF,EACPpD,GAA6B,QAAvBqD,EAAIzM,OAAO2M,KAAKvD,UAAO,IAAAqD,GAAnBA,EAAqB1I,OAAQ,CACzC,IAAM6I,EAAY5M,OAAOwD,QAAQ4F,GAEjC,GAAIwD,EAAU7I,OAAS,EAAG,CACxB2I,GAAW,IAAI,IACqBG,EADrBC,E,6lBAAAC,CACYH,GAAS,IAApC,IAAAE,EAAAE,MAAAH,EAAAC,EAAAG,KAAAC,MAAsC,KAAAC,EAAAC,EAAAP,EAAAhM,MAAA,GACpC6L,GADaS,EAAA,GACI,IADGA,EAAA,GACW,GACjC,CACA,OAAAE,GAAAP,EAAA9G,EAAAqH,EAAA,SAAAP,EAAAQ,GAAA,CACAZ,EAAUA,EAAQa,MAAM,GAAI,EAC9B,CACF,CACA5M,KAAK6M,SAASd,EAChB,GAEA,CAAA5M,IAAA,cAAAe,MAkBA,SAAYsC,GAA0B,IAAAuC,EAAA,KAApBoG,EAAahI,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,GAAAA,UAAA,GAAG,CAAC,EACjC/C,EAAQkB,iBAAiB,gCAAgC,SAAC+D,EAAGlE,GAC3D,IAAM2L,EAAU/H,EAAKgI,WAAW,SAC5BD,IACFA,EAAQE,UAAU3H,EAAE3E,MACpBqE,EAAKkI,WAAW,aAASlO,IAE3BqB,EAAQgI,oBAAoBjH,EAC9B,IACA,IAAM+L,EAAe,CAAC,EAOtB,OANAA,EAAaJ,QAAU,IAAIK,SAAQ,SAACC,EAASC,GAC3CH,EAAaF,UAAYI,EACzBF,EAAaI,SAAWD,CAC1B,IACArN,KAAKiN,WAAW,QAASC,GACzBlN,KAAK6M,SAASrK,EAAM,GAAG,EAAM2I,GACtB+B,EAAaJ,OACtB,GAEA,CAAA3N,IAAA,sBAAAe,MAcA,WAAwE,IAChEU,EAAU,CACdD,IAAK,uCACL4M,qBAHoCpK,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,GAAAA,UAAA,GAAG,CAAC,EAIxCyI,gBAJ0DzI,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,IAAAA,UAAA,IAM5D/C,EAAQuF,2BAA2B/E,EACrC,GAEA,CAAAzB,IAAA,kBAAAe,MAcA,SAAgBsC,GAA8B,IAAxB4I,EAAiBjI,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,GAAAA,UAAA,GAAG,CAAC,EAEzC,OADAnD,KAAK6M,SAASrK,EAAM,GAAG,OAAMzD,EAAWqM,GACjC,IAAIhC,EAAgBgC,EAC7B,GAEA,CAAAjM,IAAA,eAAAe,MAcA,SAAasC,GAA2B,IAArB6I,EAAclI,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,GAAAA,UAAA,GAAG,CAAC,EACnCnD,KAAK6M,SAASrK,EAAM,GAAG,OAAMzD,OAAWA,EAAWsM,EACrD,GAEA,CAAAlM,IAAA,cAAAe,MAQA,SAAYsN,GAUV,OARExN,KAAK2E,eAAegC,QAAQ8G,2BACyD,IAArFzN,KAAK2E,eAAegC,QAAQ8G,yBAAyBC,QAAQF,GAE7DxN,KAAKqK,QAAQG,YAAcgD,GAE3BxN,KAAKqK,QAAQE,qBAAsB,EACnCjI,QAAQD,MAAM,8CAAgDmL,EAAoB,gBAE7ExN,IACT,GAEA,CAAAb,IAAA,qBAAAe,MAOA,WAAqB,IAAAsE,EAQnB,OAPsD,QAAnBA,EAAAxE,KAAK2E,sBAAc,IAAAH,OAAA,EAAnBA,EAAqBmC,QAAQ8G,yBAAyBrK,QAAS,GAEhGpD,KAAKqK,QAAQG,YAAc,KAC3BxK,KAAKqK,QAAQI,oBAAqB,GAElCnI,QAAQD,MAAM,+DAETrC,IACT,GAEA,CAAAb,IAAA,sBAAAe,MAQA,WAIE,OAHAF,KAAKqK,QAAQG,YAAc,KAC3BxK,KAAKqK,QAAQI,oBAAqB,EAClCzK,KAAKqK,QAAQK,qBAAsB,EAC5B1K,IACT,GAEA,CAAAb,IAAA,aAAAe,MAQA,WAEE,OADAF,KAAKqK,QAAQM,YAAa,EACnB3K,IACT,GAEA,CAAAb,IAAA,aAAAe,MAWA,SAAW0I,GAIT,OAHIA,GACFvJ,OAAOqH,OAAO1G,KAAKqK,QAAQzB,WAAYA,GAElC5I,IACT,GAEA,CAAAb,IAAA,cAAAe,MAcA,SAAYmK,GACV,OAAKjK,EAAQuN,SAAStD,SAEiBtL,IAAnCsL,EAA6B,sBAC/BrK,KAAKqK,QAAQY,oBAAsBZ,EAA6B,0BAG1BtL,IAApCsL,EAA8B,uBAChCrK,KAAKqK,QAAQW,qBAAuBX,EAA8B,sBAG7DrK,MAVgCA,IAWzC,GAGA,CAAAb,IAAA,aAAAe,MAcA,SAAWsC,GACT,IAAMoL,EAAYxN,EAAQoB,cACpBqM,EAAqB7N,KAAK+M,WAAW,uBAAyB,CAAC,EACrEc,EAAmBD,GAAa,CAC9BZ,UAAW,WAAa,EACxBc,KAAM,SAAUd,GACdhN,KAAKgN,UAAYA,CACnB,GAEFhN,KAAKiN,WAAW,qBAAsBY,GAGtCzN,EAAQkB,iBACN,qCACA,SAAU+D,EAAGlE,GACX,IAAMT,EAAO2E,EAAE3E,KAAKA,KACdmN,EAAqB7N,KAAK+M,WAAW,uBAAyB,CAAC,EACjErM,EAAKqN,gBAAkBH,IACrBC,EAAmBnN,EAAKqN,iBAC1BF,EAAmBnN,EAAKqN,eAAef,UAAUtM,EAAKsN,mBAC/CH,EAAmBnN,EAAKqN,eAC/B/N,KAAKiN,WAAW,qBAAsBY,IAExCzN,EAAQgI,oBAAoBjH,GAEhC,EAAEC,KAAKpB,OAGT,IAAMiO,EAAgB,CACpBtN,IAAK,8BACLD,KAAMrB,OAAOqH,OAAO1G,KAAKqK,QAAS,CAChCrJ,GAAI4M,EACJ/C,KAAMrI,EACNgJ,OAAQpL,EAAQqL,UAAUjJ,GAC1BoI,SAAsB,MAAZpI,EAAK,MAInB,OADApC,EAAQuF,2BAA2BsI,GAC5BJ,EAAmBD,EAC5B,GAEA,CAAAzO,IAAA,UAAAe,MAKA,WACE,QAASF,KAAK2E,eAAeC,SAAS8G,OAAwD,IAA/C1L,KAAK2E,eAAeC,SAASsJ,aAC9E,GAEA,CAAA/O,IAAA,SAAAe,MAQA,SAAOiO,GACL/N,EAAQuF,2BAA2B,CACjChF,IAAK,wBACLyN,cAAeD,GAAehJ,KAAKkJ,UAAUF,IAEjD,GAEA,CAAAhP,IAAA,cAAAe,MAUA,WAEE,OADAF,KAAKqK,QAAQvE,aAAc,EACpB9F,IACT,GAEA,CAAAb,IAAA,SAAAe,MAOA,WAEE,OADAF,KAAKqK,QAAQS,QAAS,EACf9K,IACT,GAEA,CAAAb,IAAA,sBAAAe,MASA,WAAsC,IAAlBoO,EAAQnL,UAAAC,OAAA,QAAArE,IAAAoE,UAAA,IAAAA,UAAA,GAE1B,OADAnD,KAAKqK,QAAQU,oBAAsBuD,EAC5BtO,IACT,GAEA,CAAAb,IAAA,kBAAAe,MASA,WAAkB,IAAAqO,EAAA,KACVX,EAAYxN,EAAQoB,cAEpBgN,EAAsBxO,KAAK+M,WAAW,oBAAsB,CAAC,EAgCnE,OA/BAyB,EAAoBZ,GAAa,CAC/BZ,UAAW,WAAa,EACxBc,KAAM,SAAUd,GACdhN,KAAKgN,UAAYA,CACnB,GAGFhN,KAAKiN,WAAW,kBAAmBuB,GAEnCpO,EAAQkB,iBAAiB,wCAAwC,SAAC+D,EAAGlE,GACnE,IAAMT,EAAO2E,EAAE3E,KAAKA,KACd8N,EAAsBD,EAAKxB,WAAW,oBAAsB,CAAC,EAE/DrM,EAAKqN,gBAAkBH,IACrBY,EAAoB9N,EAAKqN,iBAC3BS,EAAoB9N,EAAKqN,eAAef,UAAUtM,EAAK+N,cAChDD,EAAoB9N,EAAKqN,eAChCQ,EAAKtB,WAAW,kBAAmBuB,IAErCpO,EAAQgI,oBAAoBjH,IAE9Bf,EAAQgI,oBAAoBjH,EAC9B,IAEAf,EAAQuF,2BAA2B,CACjChF,IAAK,gCACLD,KAAMrB,OAAOqH,OAAO1G,KAAKqK,QAAS,CAChCrJ,GAAI4M,MAIDY,EAAoBZ,EAC7B,I,gFAAC,CAzgBqB,CAAS9N,G,qjCCTjC,IA2Ta4O,EAAY,IArTV,SAAAnL,GAEb,SAAAoL,IAAc,IAAA/L,EAOT,O,4FAPS7C,CAAA,KAAA4O,GACZ/L,E,qYAAAa,CAAA,KAAAkL,GACAvO,EAAQkB,iBAAiB,gCAAgC,SAAC+D,GAAM,IAAAuJ,EAC1DvJ,EAAE3E,KAAKmO,eAAgD,QAAnCD,EAAItL,EAAiBqB,sBAAc,IAAAiK,GAA/BA,EAAiChK,WAC3DtB,EAAiBqB,eAAeC,SAASiK,cAAgBxJ,EAAE3E,KAAKmO,cAChEvL,EAAiBuD,gBAErB,IAAGjE,CACL,CAEA,O,qRAAAwB,CAAAuK,EAAApL,G,EAAAoL,E,EAAA,EAAAxP,IAAA,uBAAAe,MAIA,WACEE,EAAQuF,2BAA2B,CAAEhF,IAAK,gCAC5C,GAEA,CAAAxB,IAAA,uBAAAe,MAIA,WACEE,EAAQuF,2BAA2B,CAAEhF,IAAK,gCAC5C,GAEA,CAAAxB,IAAA,oBAAAe,MAIA,WACEE,EAAQuF,2BAA2B,CAAEhF,IAAK,qBAC5C,GAEA,CAAAxB,IAAA,cAAAe,MAIA,WACEE,EAAQuF,2BAA2B,CAAEhF,IAAK,sBAC5C,GAEA,CAAAxB,IAAA,iBAAAe,MAIA,WACEE,EAAQuF,2BAA2B,CAAEhF,IAAK,yBAC5C,GAEA,CAAAxB,IAAA,iBAAAe,MAKA,SAAe4O,GACb1O,EAAQuF,2BAA2B,CACjChF,IAAK,uBACLoO,MAAOD,GAEX,GAEA,CAAA3P,IAAA,wBAAAe,MA0BA,SAAsBmJ,GAAU,IAAAtE,EAAA,KAC9B3E,EAAQkB,iBAAiB,mCAAmC,SAAC+D,EAAGlE,GAC9D4D,EAAKiK,sBAAsB3J,EAAE3E,KAAKA,MAClCN,EAAQgI,oBAAoBjH,EAC9B,IACAf,EAAQuF,2BAA2B,CACjChF,IAAK,kCACLD,KAAM,CAAE2I,SAAAA,KAGV,IAAM4F,EAA2B,CAAC,EAMlC,OALAA,EAAyBnC,QAAU,IAAIK,SAAQ,SAACC,EAASC,GACvD4B,EAAyBjC,UAAYI,EACrC6B,EAAyB3B,SAAWD,CACtC,IACArN,KAAKiN,WAAW,oBAAqBgC,GAC9BA,EAAyBnC,OAClC,GAEA,CAAA3N,IAAA,wBAAAe,MAKA,SAAsBwL,GACpB,IAAMoB,EAAU9M,KAAK+M,WAAW,qBAC5BD,IACFpB,EAAMwD,UAAYpC,EAAQE,YAAcF,EAAQQ,WAChDtN,KAAKiN,WAAW,yBAAqBlO,GAEzC,GAEA,CAAAI,IAAA,YAAAe,MAiCA,SAAUmJ,GAAU,IAAAkF,EAAA,KAElBlF,EAASrI,GAAKZ,EAAQoB,cAEtBpB,EAAQkB,iBAAiB,uBAAuB,SAAC+D,EAAGlE,GAC9CkE,EAAE3E,KAAKM,KAAOqI,EAASrI,KACzBuN,EAAKY,UAAU9J,EAAE3E,MACjBN,EAAQgI,oBAAoBjH,GAEhC,KAEIkI,aAAQ,EAARA,EAAU+F,YAAa,MACzB9M,QAAQC,KAAK,oBAADwH,OAAqBV,EAASrI,GAAE,uEAC5CqI,EAAS+F,gBAAarQ,GAExBqB,EAAQuF,2BAA2B,CACjChF,IAAK,sBACLD,KAAM,CAAE2I,SAAAA,KAGV,IAAMgG,EAAgBrP,KAAK+M,WAAW,WAAa,CAAC,EAMpD,OALAsC,EAAchG,EAASrI,IAAM,CAAC,EAC9BqO,EAAchG,EAASrI,IAAI8L,QAAU,IAAIK,SAAQ,SAACC,GAChDiC,EAAchG,EAASrI,IAAIgM,UAAYI,CACzC,IACApN,KAAKiN,WAAW,SAAUoC,GACnBA,EAAchG,EAASrI,IAAI8L,OACpC,GAEA,CAAA3N,IAAA,YAAAe,MAOA,SAASoP,GAAqB,IAAlBtO,EAAEsO,EAAFtO,GAAIuO,EAAUD,EAAVC,WACRC,EAASxP,KAAK+M,WAAW,UAC3B/L,GAAMwO,EAAOxO,KACfwO,EAAOxO,GAAIgM,UAAUuC,GAA0BvO,UACxCwO,EAAOxO,GACdhB,KAAKiN,WAAW,SAAUuC,GAE9B,GAEA,CAAArQ,IAAA,mBAAAe,MAKA,WAAmB,IAAAuP,EAAAC,EACjB,OAAsC,QAAtCD,EAAOnM,EAAiBqB,sBAAc,IAAA8K,GAAU,QAAVC,EAA/BD,EAAiC7K,gBAAQ,IAAA8K,OAAV,EAA/BA,EAA2Cb,aACpD,GAEA,CAAA1P,IAAA,mBAAAe,MASA,SAAiByP,GACXA,GACFvP,EAAQuF,2BAA2B,CACjChF,IAAK,8BACLD,KAAM,CACJmO,cAAec,IAIvB,GAEA,CAAAxQ,IAAA,cAAAe,MAOA,WAAc,IAAA0P,EAAAC,EACZ,OAAsC,QAAtCD,EAAOtM,EAAiBqB,sBAAc,IAAAiL,GAAU,QAAVC,EAA/BD,EAAiChL,gBAAQ,IAAAiL,OAAV,EAA/BA,EAA2CtG,SACpD,GAEA,CAAApK,IAAA,UAAAe,MAOA,WAAU,IAAA4P,EAAAC,EACR,OAAsC,QAAtCD,EAAOxM,EAAiBqB,sBAAc,IAAAmL,GAAU,QAAVC,EAA/BD,EAAiClL,gBAAQ,IAAAmL,OAAV,EAA/BA,EAA2CrE,KACpD,GAEA,CAAAvM,IAAA,WAAAe,MAOA,WAAW,IAAA8P,EAAAC,EACT,OAAsC,QAAtCD,EAAO1M,EAAiBqB,sBAAc,IAAAqL,GAAU,QAAVC,EAA/BD,EAAiCpL,gBAAQ,IAAAqL,OAAV,EAA/BA,EAA2CtE,MACpD,GAEA,CAAAxM,IAAA,kBAAAe,MAKA,WAAkB,IAAAgQ,EAAAC,EAChB,OAAsC,QAAtCD,EAAO5M,EAAiBqB,sBAAc,IAAAuL,GAAU,QAAVC,EAA/BD,EAAiCtL,gBAAQ,IAAAuL,OAAV,EAA/BA,EAA2CC,YACpD,GAEA,CAAAjR,IAAA,kBAAAe,MAQA,WAAkB,IAAAmQ,EAAAC,EAChB,OAAsC,QAA/BD,EAAA/M,EAAiBqB,sBAAc,IAAA0L,GAAU,QAAVC,EAA/BD,EAAiCzL,gBAAQ,IAAA0L,OAAV,EAA/BA,EAA2CC,eAAgB,CAAC,CACrE,GAEA,CAAApR,IAAA,WAAAe,MAOA,WAAW,IAAAsQ,EAAAC,EACTpM,SAASqM,iBAAiB,8BAA8B7G,SAAQ,SAAC8G,GAC/DA,EAAsBC,QACxB,IACA,IAAMC,EAAsC,QAAlCL,EAAGlN,EAAiBqB,sBAAc,IAAA6L,GAAU,QAAVC,EAA/BD,EAAiC5L,gBAAQ,IAAA6L,OAAV,EAA/BA,EAA2CF,aACxD,GAAIM,EAAM,CACR,IAAIC,EAAY,YAChBzR,OAAO2M,KAAK6E,GAAMhH,SAAQ,SAAC1K,GACzB,IAAM4R,EAAMF,EAAK1R,GACjB2R,IAAc3R,EAAI6R,WAAW,MAAQ,GAAK,MAAQ7R,EAAM,IAAM4R,EAAM,KACtE,IACAD,GAAa,IACb,IAAMG,EAAa5M,SAAS6M,cAAc,SAC1CD,EAAWpJ,aAAa,kBAAkB,GAC1CoJ,EAAWE,UAAYL,EACvBzM,SAASC,KAAK8M,YAAYH,EAC5B,CACF,I,gFAAC,CAnTY,CAASnR,I,+vCCPxB,IAAMuR,EAAmB,IAAIC,IAWvBC,EAAc,SAAAhO,GAElB,SAAAgO,IAAc,IAAA3O,E,MAGuG,OAHvG7C,EAAA,KAAAwR,I,EACZ,K,EAAAA,E,OAAA3O,E,wWACK4O,sBAAwB,IAAIC,EACjCrR,EAAQkB,iBAAiB,WAAW,SAACb,EAAKU,GAAU,OAAKyB,EAAK4O,sBAAsBE,aAAajR,EAAKU,EAAW,IAAEyB,CACrH,CAEA,O,qRAAAwB,CAAAmN,EAAAhO,GAAAoO,EAAAJ,EAAA,EAAApS,IAAA,UAAAe,MAUA,SAAQf,EAAKe,GAAO,IAAA6E,EAAA,KAClB,OAAO,IAAIoI,SAAQ,SAACC,EAASC,GAC3BtI,EAAKyM,sBAAsBI,QAAQxE,EAASC,EAAQ,UAAW,CAC7DlO,IAAAA,EACAe,MAAAA,GAEJ,GACF,GAEA,CAAAf,IAAA,UAAAe,MASA,SAAQf,GAAK,IAAAoP,EAAA,KACX,OAAO,IAAIpB,SAAQ,SAACC,EAASC,GAC3BkB,EAAKiD,sBAAsBI,QAAQxE,EAASC,EAAQ,UAAW,CAAElO,IAAAA,GACnE,GACF,GAEA,CAAAA,IAAA,aAAAe,MASA,SAAWf,GAAK,IAAA0S,EAAA,KACd,OAAO,IAAI1E,SAAQ,SAACC,EAASC,GAC3BwE,EAAKL,sBAAsBI,QAAQxE,EAASC,EAAQ,aAAc,CAChElO,IAAAA,GAEJ,GACF,GAEA,CAAAA,IAAA,QAAAe,MAQA,WAAQ,IAAA4R,EAAA,KACN,OAAO,IAAI3E,SAAQ,SAACC,EAASC,GAC3ByE,EAAKN,sBAAsBI,QAAQxE,EAASC,EAAQ,QAAS,CAAC,EAChE,GACF,GAEA,CAAAlO,IAAA,MAAAe,MASA,SAAIf,GAAK,IAAA4S,EAAA,KACP,OAAO,IAAI5E,SAAQ,SAACC,EAASC,GAC3B0E,EAAKP,sBAAsBI,QAAQxE,EAASC,EAAQ,MAAO,CAAElO,IAAAA,GAC/D,GACF,GAEA,CAAAA,IAAA,aAAAe,MAQA,WAAa,IAAA8R,EAAA,KACX,OAAO,IAAI7E,SAAQ,SAACC,EAASC,GAC3B2E,EAAKR,sBAAsBI,QAAQxE,EAASC,EAAQ,aAAc,CAAC,EACrE,GACF,IAAC,CApGiB,CAASvN,GAuGvB2R,EAAqB,kBAAAE,GAAA,SAAAF,IAAA1R,EAAA,KAAA0R,EAAA,KAAAtS,IAAA,eAAAe,MACzB,SAAaO,EAAKU,GAChB,IACE,IAAMT,EAAOD,EAAIC,KAAKA,KACtB,IAAK2Q,EAAiBY,IAAIvR,EAAKM,IAE7B,YADAsB,QAAQ4P,IAAI,iDAAmDxR,EAAKM,IAGtE,IAAMmR,EAAoBd,EAAiB7R,IAAIkB,EAAKM,IAChC,UAAhBN,EAAK0R,OACPD,EAAkB9E,OAAO3M,EAAK2R,QAE9BF,EAAkB/E,QAAQ1M,EAAK2R,QAEjChB,EAAgB,OAAQ3Q,EAAKM,GAC/B,CAAE,MAAOqE,GACP/C,QAAQD,MAAMgD,EAChB,CACF,GAAC,CAAAlG,IAAA,oBAAAe,MAED,SAAkBc,GAEhB,IADA,IAAIsR,GAAQ,IAAIC,MAAOC,WACfC,cAAcR,IAAIjR,IAExB,IADW,IAAIuR,MAAOC,UAAYF,EACvB,IACT,KAAM,8FAGV,IAAMD,EAASI,cAAcjT,IAAIwB,GAEjC,OADAqQ,EAAgB,OAAQrQ,GACjBqR,CACT,GAAC,CAAAlT,IAAA,UAAAe,MAED,SAAQkN,EAASC,EAAQqF,EAAWjK,GAClC,IAAIzH,EAAKZ,EAAQoB,cACjBxB,KAAK2S,uBAAuB3R,EAAIoM,EAASC,GACzCrN,KAAK4S,YAAY5R,EAAI0R,EAAWjK,EAClC,GAAC,CAAAtJ,IAAA,yBAAAe,MAED,SAAuBc,EAAIoM,EAASC,GAClCgE,EAAiBwB,IAAI7R,EAAI,CACvBoM,QAAAA,EACAC,OAAAA,GAEJ,GAAC,CAAAlO,IAAA,cAAAe,MACD,SAAYc,EAAI0R,EAAWjK,GACzBrI,EAAQuF,2BAA2B,CACjChF,IAAK,UACLD,KAAM,CACJM,GAAAA,EACA0R,UAAAA,EACAjK,OAAAA,IAGN,IAAC,CAtDwB,GAyDdqK,GAAiB,IAAIvB,E,2qBCxKlC,IAIMwB,GAAW,WAgBd,O,EAfD,SAAAA,K,4FAAchT,CAAA,KAAAgT,GACR1R,SAAWA,OAAO2R,MACwD,SAAxE3R,OAAOgD,SAASC,KAAK2O,aAAa,oCACpC/M,QAAQgN,UAAYhN,QAAQC,aAAa/E,KAAK8E,UAEkC,SAA9E7E,OAAOgD,SAASC,KAAK2O,aAAa,yCACpC5R,OAAOC,iBAAiB,SAAS,SAAAgO,GAAiD,IAC1E3O,EAAM,CACVA,IAAK,+BACLwS,SAAU,CAAEC,SAH4B9D,EAAR8D,SAGVxS,QAH2B0O,EAAP1O,QAGXyS,OAH0B/D,EAAN+D,OAGZC,MAHyBhE,EAALgE,MAGbjR,MAHyBiN,EAALjN,QAKpEjC,EAAQuF,2BAA2BhF,EACrC,IAGN,G,EAAC,EAAAxB,IAAA,kBAAAe,MAED,SAAgByH,EAAQC,GACtB,OAAOtE,EAAiBiQ,gBAAgB5L,EAAQC,EAClD,GAAC,CAAAzI,IAAA,qBAAAe,MACD,SAAmBc,GACjB,OAAOsC,EAAiBkQ,mBAAmBxS,EAC7C,GAAC,CAAA7B,IAAA,2BAAAe,MACD,SAAyB6H,GACvB,OAAOzE,EAAiBmQ,yBAAyB1L,EACnD,GAAC,CAAA5I,IAAA,8BAAAe,MACD,SAA4Bc,GAC1B,OAAOsC,EAAiBoQ,4BAA4B1S,EACtD,GAAC,CAAA7B,IAAA,WAAAe,MACD,WACE,OAAOoD,EAAiBqQ,UAC1B,GAAC,CAAAxU,IAAA,eAAAe,MACD,WACE,OAAOoD,EAAiBgF,cAC1B,GAAC,CAAAnJ,IAAA,aAAAe,MACD,WACE,OAAOoD,EAAiBsQ,YAC1B,GAAC,CAAAzU,IAAA,gBAAAe,MACD,SAAcuI,EAAQC,GACpB,OAAOpF,EAAiBuQ,cAAcpL,EAAQC,EAChD,GAAC,CAAAvJ,IAAA,gBAAAe,MACD,SAAc4T,GACZ,OAAOxQ,EAAiByQ,cAAcD,EACxC,GAAC,CAAA3U,IAAA,0BAAAe,MACD,WACE,OAAOoD,EAAiB0Q,yBAC1B,GAAC,CAAA7U,IAAA,gBAAAe,MACD,WACE,OAAOoD,EAAiB2Q,eAC1B,GAAC,CAAA9U,IAAA,sBAAAe,MACD,WACE,OAAOoD,EAAiB4Q,qBAC1B,GAAC,CAAA/U,IAAA,sBAAAe,MACD,SAAoB2I,EAAcH,GAChC,OAAOpF,EAAiB6Q,oBAAoBtL,EAAcH,EAC5D,GAAC,CAAAvJ,IAAA,uBAAAe,MACD,WACE,OAAOoD,EAAiB8Q,sBAC1B,GAAC,CAAAjV,IAAA,oBAAAe,MACD,SAAkBU,GAChB,OAAO0C,EAAiB+Q,kBAAkBzT,EAC5C,GAAC,CAAAzB,IAAA,2BAAAe,MACD,SAAyBoU,EAAWvT,GAClC,OAAOuC,EAAiBiR,yBAAyBD,EAAWvT,EAC9D,GAAC,CAAA5B,IAAA,8BAAAe,MACD,SAA4BiB,GAC1B,OAAOmC,EAAiBkR,4BAA4BrT,EACtD,GAAC,CAAAhC,IAAA,sBAAAe,MACD,SAAoBoU,EAAWvT,GAC7B,OAAOuC,EAAiBmR,oBAAoBH,EAAWvT,EACzD,GAAC,CAAA5B,IAAA,yBAAAe,MACD,SAAuBiB,GACrB,OAAOmC,EAAiBoR,uBAAuBvT,EACjD,GAAC,CAAAhC,IAAA,kBAAAe,MACD,SAAgBK,GACd,OAAO+C,EAAiByF,gBAAgBxI,EAC1C,GAAC,CAAApB,IAAA,kBAAAe,MACD,WACE,OAAOoD,EAAiBqR,iBAC1B,GAAC,CAAAxV,IAAA,2BAAAe,MACD,WACE,OAAOoD,EAAiBsR,0BAC1B,GAAC,CAAAzV,IAAA,kBAAAe,MACD,WACE,OAAOoD,EAAiBa,iBAC1B,GAAC,CAAAhF,IAAA,YAAAe,MACD,WACE,OAAOoD,EAAiBuR,WAC1B,GAAC,CAAA1V,IAAA,YAAAe,MACD,SAAUA,GACR,OAAOoD,EAAiBwR,UAAU5U,EACpC,GAAC,CAAAf,IAAA,mBAAAe,MACD,SAAiBA,GACf,OAAOoD,EAAiByR,iBAAiB7U,EAC3C,GAEA,CAAAf,IAAA,cAAAe,MAGA,WACE,OAAO,IAAIiK,EAAY,CACrBxF,eAAgBrB,EAAiBqB,gBAErC,GACA,CAAAxF,IAAA,YAAAe,MAGA,WACE,OAAOwO,CACT,GACA,CAAAvP,IAAA,mBAAAe,MAGA,WACE,OAAOoD,CACT,GACA,CAAAnE,IAAA,iBAAAe,MAGA,WACE,OAAO4S,EACT,M,8EAAC,CA1Hc,GA4HjB,SAAeC,GAAc,IAAIA,G","sources":["webpack://LuigiClient/webpack/universalModuleDefinition","webpack://LuigiClient/webpack/bootstrap","webpack://LuigiClient/webpack/runtime/define property getters","webpack://LuigiClient/webpack/runtime/hasOwnProperty shorthand","webpack://LuigiClient/./src/baseClass.js","webpack://LuigiClient/./src/helpers.js","webpack://LuigiClient/./src/lifecycleManager.js","webpack://LuigiClient/./src/splitViewHandle.js","webpack://LuigiClient/./src/linkManager.js","webpack://LuigiClient/./src/uxManager.js","webpack://LuigiClient/./src/storageManager.js","webpack://LuigiClient/./src/luigi-client.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"LuigiClient\"] = factory();\n\telse\n\t\troot[\"LuigiClient\"] = factory();\n})(self, () => {\nreturn ","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/**\n * @private\n * @abstract\n */\nexport class LuigiClientBase {\n /**\n * @private\n */\n constructor() {\n this.promises = {};\n }\n /**\n * Returns the promises object\n * @private\n */\n setPromise(name, value) {\n this.promises[name] = value;\n }\n /**\n * Sets the promises object\n * @private\n */\n getPromise(name) {\n return this.promises[name];\n }\n}\n","/** @private */\nclass Helpers {\n /** @private */\n constructor() {\n this.listeners = [];\n this.origin = '';\n\n const helperListener = function (evt) {\n if (!evt.data.msg) {\n return;\n }\n if (evt.data.msg === 'custom') {\n const message = this.convertCustomMessageInternalToUser(evt.data);\n this.listeners\n .filter((listener) => listener.name === message.id)\n .map((listener) => listener.eventFn(message, listener.listenerId));\n } else {\n this.listeners\n .filter((listener) => listener.name === evt.data.msg)\n .map((listener) => listener.eventFn(evt, listener.listenerId));\n }\n }.bind(this);\n\n window.addEventListener('message', helperListener);\n }\n\n convertCustomMessageInternalToUser(internalMessage) {\n return internalMessage.data;\n }\n\n convertCustomMessageUserToInternal(message) {\n return {\n msg: 'custom',\n data: message\n };\n }\n\n convertStorageMessageToInternal(message) {\n return {\n msg: 'storage',\n data: message\n };\n }\n\n /**\n * Registers a post message listener\n * Don't forget to remove the event listener at the end of\n * your eventFn if you do not need it anymore.\n * @private\n * @param {string} name - event name\n * @param {function} eventFn - callback function\n * @returns {string} listener id\n */\n addEventListener(name, eventFn) {\n const listenerId = this.getRandomId();\n this.listeners.push({\n name,\n eventFn,\n listenerId\n });\n return listenerId;\n }\n\n /**\n * Removes a post message listener\n * @private\n * @param {string} id - listenerId\n */\n removeEventListener(id) {\n const listenerExists = Boolean(this.listeners.find((l) => l.listenerId === id));\n if (listenerExists) {\n this.listeners = this.listeners.filter((l) => l.listenerId !== id);\n return true;\n }\n return false;\n }\n\n /**\n * Creates a random Id\n * @private\n */\n getRandomId() {\n return window.crypto.getRandomValues(new Uint32Array(1))[0];\n }\n\n /**\n * Simple function check.\n * @private\n * @param {function} item\n * @returns {boolean}\n */\n isFunction(item) {\n return typeof item === 'function';\n }\n\n /**\n * Simple object check.\n * @private\n * @param {Object} item\n * @returns {boolean}\n */\n isObject(item) {\n return Object.prototype.toString.call(item) === '[object Object]';\n }\n\n getLuigiCoreDomain() {\n return this.origin;\n }\n\n setLuigiCoreDomain(origin) {\n // protect against \"null\" string set by at least Chrome browser when file protocol used\n if (origin && origin !== 'null') {\n this.origin = origin;\n }\n }\n\n setTargetOrigin(origin) {\n this.setLuigiCoreDomain(origin);\n }\n\n sendPostMessageToLuigiCore(msg) {\n if (this.origin) {\n // protect against potential postMessage problems, since origin value may be set incorrectly\n try {\n window.parent.postMessage(msg, this.origin);\n } catch (error) {\n console.warn('Unable to post message ' + msg + ' to Luigi Core from origin ' + this.origin + ': ' + error);\n }\n } else {\n console.warn(\n 'There is no target origin set. You can specify the target origin by calling LuigiClient.setTargetOrigin(\"targetorigin\") in your micro frontend.'\n );\n }\n }\n\n /**\n * Checks if given path contains intent navigation special syntax\n * @param {string} path - path to be checked\n */\n hasIntent(path) {\n return !!path && path.toLowerCase().includes('#?intent=');\n }\n\n deSanitizeParamsMap(paramsMap) {\n return Object.entries(paramsMap).reduce((sanitizedMap, paramPair) => {\n sanitizedMap[this.deSanitizeParam(paramPair[0])] = this.deSanitizeParam(paramPair[1]);\n return sanitizedMap;\n }, {});\n }\n\n deSanitizeParam(param = '') {\n return String(param)\n .replaceAll('&lt;', '<')\n .replaceAll('&gt;', '>')\n .replaceAll('&quot;', '\"')\n .replaceAll('&#39;', \"'\")\n .replaceAll('&sol;', '/');\n }\n}\n\nexport const helpers = new Helpers();\n","import { LuigiClientBase } from './baseClass';\nimport { helpers } from './helpers';\n\n/**\n * @summary Use the functions and parameters to define the Lifecycle of listeners, navigation nodes, and Event data.\n * @augments LuigiClientBase\n * @name Lifecycle\n * @class\n */\nclass LifecycleManager extends LuigiClientBase {\n /** @private */\n constructor() {\n super();\n this.luigiInitialized = false;\n this.defaultContextKeys = ['context', 'internal', 'nodeParams', 'pathParams', 'searchParams'];\n this.setCurrentContext(\n this.defaultContextKeys.reduce(function (acc, key) {\n acc[key] = {};\n return acc;\n }, {})\n );\n\n this._onContextUpdatedFns = {};\n this._onInactiveFns = {};\n this._onInitFns = {};\n this.authData = {};\n\n if (!this._isDeferInitDefined()) {\n this.luigiClientInit();\n }\n }\n\n /**\n * Check if the html head element contains the attribute \"defer-luigi-init\"\n * @private\n * @memberof Lifecycle\n */\n _isDeferInitDefined() {\n return window.document.head.hasAttribute('defer-luigi-init');\n }\n\n /**\n * Check if the html head element contains the attribute \"disable-tpc-check\"\n * @private\n * @memberof Lifecycle\n */\n _isTpcCheckDisabled() {\n return (\n window.document.head.hasAttribute('disable-tpc-check') ||\n this.currentContext?.internal?.thirdPartyCookieCheck?.disabled\n );\n }\n\n /**\n * Check if LuigiClient is initialized\n * @returns {boolean} client initialized state\n * @since 1.12.0\n * @memberof Lifecycle\n * @example\n * const init = LuigiClient.isLuigiClientInitialized()\n */\n isLuigiClientInitialized() {\n return this.luigiInitialized;\n }\n\n /**\n * Starts the handshake with Luigi Core and thereafter results in initialization of Luigi Client. It is always ran by default when importing the Luigi Client package in your micro frontend. Note that when using `defer-luigi-init` to defer default initialization, you will need to initialize the handshake using this function manually wherever needed.\n * @since 1.12.0\n * @memberof Lifecycle\n * @example\n * LuigiClient.luigiClientInit()\n */\n luigiClientInit() {\n if (this.luigiInitialized) {\n console.warn('Luigi Client has been already initialized');\n return;\n }\n /**\n * Save context data every time navigation to a different node happens\n * @private\n */\n const setContext = (rawData) => {\n for (let index = 0; index < this.defaultContextKeys.length; index++) {\n let key = this.defaultContextKeys[index];\n try {\n if (typeof rawData[key] === 'string') {\n rawData[key] = JSON.parse(rawData[key]);\n }\n } catch (e) {\n console.info('unable to parse luigi context data for', key, rawData[key], e);\n }\n }\n this.setCurrentContext(rawData);\n };\n\n const setAuthData = (eventPayload) => {\n if (eventPayload) {\n this.authData = eventPayload;\n }\n };\n\n helpers.addEventListener('luigi.init', (e) => {\n setContext(e.data);\n setAuthData(e.data.authData);\n helpers.setLuigiCoreDomain(e.origin);\n this.luigiInitialized = true;\n this._notifyInit(e.origin);\n this._tpcCheck();\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.init.ok' });\n });\n\n helpers.addEventListener('luigi-client.inactive-microfrontend', (e) => {\n this._notifyInactive(e.origin);\n });\n\n helpers.addEventListener('luigi.auth.tokenIssued', (e) => {\n setAuthData(e.data.authData);\n });\n\n helpers.addEventListener('luigi.navigate', (e) => {\n setContext(e.data);\n if (!this.currentContext.internal.isNavigateBack && !this.currentContext.withoutSync) {\n const previousHash = window.location.hash;\n history.replaceState({ luigiInduced: true }, '', e.data.viewUrl);\n window.dispatchEvent(new PopStateEvent('popstate', { state: 'luiginavigation' }));\n if (window.location.hash !== previousHash) {\n window.dispatchEvent(new HashChangeEvent('hashchange'));\n }\n }\n // pass additional data to context to enable micro frontend developer to act on internal routing change\n if (this.currentContext.withoutSync) {\n Object.assign(this.currentContext.context, {\n viewUrl: e.data.viewUrl ? e.data.viewUrl : undefined,\n pathParams: e.data.pathParams ? e.data.pathParams : undefined\n });\n }\n // execute the context change listener if set by the micro frontend\n this._notifyUpdate();\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.navigate.ok' });\n });\n\n /**\n * Get context once initially\n * @private\n */\n window.parent.postMessage(\n {\n msg: 'luigi.get-context',\n clientVersion: require('../public/package.json').version\n },\n '*'\n );\n }\n\n _tpcCheck() {\n if (this._isTpcCheckDisabled()) {\n return;\n }\n\n let tpc = 'enabled';\n let cookies = document.cookie;\n let luigiCookie;\n if (cookies) {\n luigiCookie = cookies\n .split(';')\n .map((cookie) => cookie.trim())\n .find((cookie) => cookie === 'luigiCookie=true');\n }\n if (luigiCookie === 'luigiCookie=true') {\n document.cookie = 'luigiCookie=; Max-Age=-99999999; SameSite=None; Secure';\n }\n document.cookie = 'luigiCookie=true; SameSite=None; Secure';\n cookies = document.cookie;\n if (cookies) {\n luigiCookie = cookies\n .split(';')\n .map((cookie) => cookie.trim())\n .find((cookie) => cookie === 'luigiCookie=true');\n }\n if (luigiCookie === 'luigiCookie=true') {\n document.cookie = 'luigiCookie=; Max-Age=-99999999; SameSite=None; Secure';\n window.parent.postMessage({ msg: 'luigi.third-party-cookie', tpc }, '*');\n } else {\n tpc = 'disabled';\n window.parent.postMessage({ msg: 'luigi.third-party-cookie', tpc }, '*');\n console.warn('Third party cookies are not supported!');\n }\n }\n\n /**\n * Iterates over an object and executes all top-level functions\n * with a given payload.\n * @private\n * @memberof Lifecycle\n */\n _callAllFns(objWithFns, payload, origin) {\n for (let id in objWithFns) {\n if (objWithFns.hasOwnProperty(id) && helpers.isFunction(objWithFns[id])) {\n objWithFns[id](payload, origin);\n }\n }\n }\n\n /**\n * Notifies all context init listeners.\n * @private\n * @memberof Lifecycle\n */\n _notifyInit(origin) {\n this._callAllFns(this._onInitFns, this.currentContext.context, origin);\n }\n\n /**\n * Notifies all context update listeners.\n * @private\n * @memberof Lifecycle\n */\n _notifyUpdate() {\n this._callAllFns(this._onContextUpdatedFns, this.currentContext.context);\n }\n\n /**\n * Notifies all inactive listeners.\n * @private\n * @memberof Lifecycle\n */\n _notifyInactive() {\n this._callAllFns(this._onInactiveFns);\n }\n\n /**\n * @private\n * @memberof Lifecycle\n */\n setCurrentContext(value) {\n this.currentContext = value;\n }\n\n /**\n * Registers a listener called with the context object and the Luigi Core domain as soon as Luigi is instantiated. Defer your application bootstrap if you depend on authentication data coming from Luigi.\n * @param {Lifecycle~initListenerCallback} initFn - the function that is called once Luigi is initialized, receives current context and origin as parameters\n * @param {boolean} disableTpcCheck - if set to `true` third party cookie check will be disabled via LuigiClient.\n * @memberof Lifecycle\n * @example\n * const initListenerId = LuigiClient.addInitListener((context) => storeContextToMF(context))\n */\n addInitListener(initFn, disableTpcCheck) {\n const id = helpers.getRandomId();\n this._onInitFns[id] = initFn;\n if (disableTpcCheck) {\n document.head.setAttribute('disable-tpc-check', '');\n }\n if (this.luigiInitialized && helpers.isFunction(initFn)) {\n initFn(this.currentContext.context, helpers.getLuigiCoreDomain());\n }\n return id;\n }\n\n /**\n * Callback of the addInitListener <br><br>\n * Type: [Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)\n * @callback Lifecycle~initListenerCallback\n * @kind function\n * @param {Object} context - current context data\n * @param {string} origin - Luigi Core URL\n */\n /**\n * Removes an init listener.\n * @param {string} id - the id that was returned by the `addInitListener` function\n * @memberof Lifecycle\n * @example\n * LuigiClient.removeInitListener(initListenerId)\n */\n removeInitListener(id) {\n if (this._onInitFns[id]) {\n this._onInitFns[id] = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Registers a listener called with the context object when the URL is changed. For example, you can use this when changing environments in a context switcher in order for the micro frontend to do an API call to the environment picked.\n * @param {function} contextUpdatedFn - the listener function called each time Luigi context changes\n * @memberof Lifecycle\n * @example\n * const updateListenerId = LuigiClient.addContextUpdateListener((context) => storeContextToMF(context))\n */\n addContextUpdateListener(contextUpdatedFn) {\n const id = helpers.getRandomId();\n this._onContextUpdatedFns[id] = contextUpdatedFn;\n if (this.luigiInitialized && helpers.isFunction(contextUpdatedFn)) {\n contextUpdatedFn(this.currentContext.context);\n }\n return id;\n }\n\n /**\n * Removes a context update listener.\n * @param {string} id - the id that was returned by the `addContextUpdateListener` function\n * @memberof Lifecycle\n * @example\n * LuigiClient.removeContextUpdateListener(updateListenerId)\n */\n removeContextUpdateListener(id) {\n if (this._onContextUpdatedFns[id]) {\n this._onContextUpdatedFns[id] = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Registers a listener called upon micro frontend inactivity. This happens when a new micro frontend gets shown while keeping the old one cached.\n * Gets called when:\n * - navigating with **preserveView**\n * - navigating from or to a **viewGroup**\n *\n * Does not get called when navigating normally, or when `openAsModal` or `openAsSplitView` are used.\n * Once the micro frontend turns back into active state, the `addContextUpdateListener` receives an updated context.\n * @param {function} inactiveFn - the listener function called each time a micro frontend turns into an inactive state\n * @memberof Lifecycle\n * @example\n * LuigiClient.addInactiveListener(() => mfIsInactive = true)\n * const inactiveListenerId = LuigiClient.addInactiveListener(() => mfIsInactive = true)\n */\n addInactiveListener(inactiveFn) {\n const id = helpers.getRandomId();\n this._onInactiveFns[id] = inactiveFn;\n return id;\n }\n\n /**\n * Removes a listener for inactive micro frontends.\n * @param {string} id - the id that was returned by the `addInactiveListener` function\n * @memberof Lifecycle\n * @example\n * LuigiClient.removeInactiveListener(inactiveListenerId)\n */\n removeInactiveListener(id) {\n if (this._onInactiveFns[id]) {\n this._onInactiveFns[id] = undefined;\n return true;\n }\n return false;\n }\n\n /**\n * Registers a listener called when the micro frontend receives a custom message.\n * @param {string} customMessageId - the custom message id\n * @param {Lifecycle~customMessageListenerCallback} customMessageListener - the function that is called when the micro frontend receives the corresponding event\n * @memberof Lifecycle\n * @since 0.6.2\n * @example\n * const customMsgId = LuigiClient.addCustomMessageListener('myapp.project-updated', (data) => doSomething(data))\n */\n addCustomMessageListener(customMessageId, customMessageListener) {\n return helpers.addEventListener(customMessageId, (customMessage, listenerId) => {\n return customMessageListener(customMessage, listenerId);\n });\n }\n\n /**\n * Callback of the customMessageListener <br><br>\n * Type: [Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)\n * @callback Lifecycle~customMessageListenerCallback\n * @kind function\n * @param {Object} customMessage - custom message object\n * @param {string} customMessage.id - message id\n * @param {*} customMessage.MY_DATA_FIELD - any other message data field\n * @param {string} listenerId - custom message listener id to be used for unsubscription\n */\n /**\n * Removes a custom message listener.\n * @param {string} id - the id that was returned by the `addInitListener` function\n * @memberof Lifecycle\n * @since 0.6.2\n * @example\n * LuigiClient.removeCustomMessageListener(customMsgId)\n */\n removeCustomMessageListener(id) {\n return helpers.removeEventListener(id);\n }\n\n /**\n * Returns the currently valid access token.\n * @returns {string} current access token\n * @memberof Lifecycle\n * @example\n * const accessToken = LuigiClient.getToken()\n */\n getToken() {\n return this.authData.accessToken;\n }\n\n /**\n * Returns the context object. Typically it is not required as the {@link #addContextUpdateListener addContextUpdateListener()} receives the same values.\n * @returns {Object} current context data\n * @memberof Lifecycle\n * @example\n * const context = LuigiClient.getContext()\n */\n getContext() {\n return this.getEventData();\n }\n\n /**\n * Returns the context object. It is an alias function for getContext().\n * @returns {Object} current context data\n * @memberof Lifecycle\n * @deprecated\n */\n getEventData() {\n return this.currentContext.context;\n }\n\n /**\n * Returns a list of active feature toggles\n * @returns {Array} a list of feature toggle names\n * @memberof Lifecycle\n * @since 1.4.0\n * @example\n * const activeFeatureToggleList = LuigiClient.getActiveFeatureToggles()\n */\n getActiveFeatureToggles() {\n return this.currentContext.internal.activeFeatureToggleList ?? [];\n }\n\n /**\n * Sets node parameters in Luigi Core. The parameters will be added to the URL.\n * @param {Object} params\n * @param {boolean} keepBrowserHistory\n * @memberof Lifecycle\n * @example\n * LuigiClient.addNodeParams({luigi:'rocks'}, true);\n */\n addNodeParams(params, keepBrowserHistory = true) {\n if (params) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.addNodeParams',\n data: params,\n keepBrowserHistory\n });\n }\n }\n\n /**\n * Returns the node parameters of the active URL.\n * Node parameters are defined like URL query parameters but with a specific prefix allowing Luigi to pass them to the micro frontend view. The default prefix is **~** and you can use it in the following way: `https://my.luigi.app/home/products?~sort=asc&~page=3`.\n * <!-- add-attribute:class:warning -->\n * > **NOTE:** some special characters (`<`, `>`, `\"`, `'`, `/`) in node parameters are HTML-encoded.\n * @param {boolean} shouldDesanitise - defines whether the specially encoded characters should be desanitised\n * @returns {Object} node parameters, where the object property name is the node parameter name without the prefix, and its value is the value of the node parameter. For example `{sort: 'asc', page: 3}`\n * @memberof Lifecycle\n * @example\n * const nodeParams = LuigiClient.getNodeParams()\n * const nodeParams = LuigiClient.getNodeParams(true)\n */\n getNodeParams(shouldDesanitise = false) {\n return shouldDesanitise\n ? helpers.deSanitizeParamsMap(this.currentContext.nodeParams)\n : this.currentContext.nodeParams;\n }\n\n /**\n * Returns the dynamic path parameters of the active URL.\n * Path parameters are defined by navigation nodes with a dynamic **pathSegment** value starting with **:**, such as **productId**.\n * All path parameters in the current navigation path (as defined by the active URL) are returned.\n * <!-- add-attribute:class:warning -->\n * > **NOTE:** some special characters (`<`, `>`, `\"`, `'`, `/`) in path parameters are HTML-encoded.\n * @returns {Object} path parameters, where the object property name is the path parameter name without the prefix, and its value is the actual value of the path parameter. For example ` {productId: 1234, ...}`\n * @memberof Lifecycle\n * @example\n * const pathParams = LuigiClient.getPathParams()\n */\n getPathParams() {\n return this.currentContext.pathParams;\n }\n\n /**\n * Read search query parameters which are sent from Luigi Core\n * @memberof Lifecycle\n * @returns Core search query parameters\n * @example\n * LuigiClient.getCoreSearchParams();\n */\n getCoreSearchParams() {\n return this.currentContext.searchParams || {};\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Sends search query parameters to Luigi Core. The search parameters will be added to the URL if they are first allowed on a node level using {@link navigation-parameters-reference.md#clientpermissionsurlparameters clientPermissions.urlParameters}.\n\n * @param {Object} searchParams\n * @param {boolean} keepBrowserHistory\n * @memberof Lifecycle\n * @example\n * LuigiClient.addCoreSearchParams({luigi:'rocks'}, false);\n */\n addCoreSearchParams(searchParams, keepBrowserHistory = true) {\n if (searchParams) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.addSearchParams',\n data: searchParams,\n keepBrowserHistory\n });\n }\n }\n\n /**\n * Returns the current client permissions as specified in the navigation node or an empty object. For details, see [Node parameters](navigation-parameters-reference.md).\n * @returns {Object} client permissions as specified in the navigation node\n * @memberof Lifecycle\n * @example\n * const permissions = LuigiClient.getClientPermissions()\n */\n getClientPermissions() {\n return this.currentContext.internal.clientPermissions || {};\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * When the micro frontend is not embedded in the Luigi Core application and there is no init handshake you can set the target origin that is used in postMessage function calls by Luigi Client. Typically used only in custom micro-frontend frameworks that are compatible with LuigiClient API.\n * @param {string} origin - target origin\n * @memberof Lifecycle\n * @since 0.7.3\n * @example\n * LuigiClient.setTargetOrigin(window.location.origin)\n */\n setTargetOrigin(origin) {\n helpers.setTargetOrigin(origin);\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Sends a custom message to the Luigi Core application.\n * @param {Object} message - an object containing data to be sent to the Luigi Core to process it further. This object is set as an input parameter of the custom message listener on the Luigi Core side\n * @param {string} message.id - a string containing the message id\n * @param {*} message.MY_DATA_FIELD - any other message data field\n * @example\n * LuigiClient.sendCustomMessage({id: 'environment.created', production: false})\n * LuigiClient.sendCustomMessage({id: 'environment.created', data: environmentDataObj})\n * @memberof Lifecycle\n * @since 0.6.2\n */\n sendCustomMessage(message) {\n const customMessageInternal = helpers.convertCustomMessageUserToInternal(message);\n helpers.sendPostMessageToLuigiCore(customMessageInternal);\n }\n\n /**\n * Returns the current user settings based on the selected node.\n * @returns {Object} current user settings\n * @since 1.7.1\n * @memberof Lifecycle\n * @example\n * const userSettings = LuigiClient.getUserSettings()\n */\n getUserSettings() {\n return this.currentContext.internal.userSettings;\n }\n\n /**\n * Returns the current anchor based on active URL.\n * @memberof Lifecycle\n * @since 1.21.0\n * @returns anchor of URL\n * @example\n * LuigiClient.getAnchor();\n */\n getAnchor() {\n return this.currentContext.internal.anchor || '';\n }\n\n /**\n * Sends anchor to Luigi Core. The anchor will be added to the URL.\n * @param {string} anchor\n * @since 1.21.0\n * @memberof Lifecycle\n * @example\n * LuigiClient.setAnchor('luigi');\n */\n setAnchor(anchor) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.setAnchor',\n anchor\n });\n }\n\n /**\n * This function allows you to change node labels within the same {@link navigation-advanced.md#view-groups view group}, e.g. in your node config: `label: 'my Node {viewGroupData.vg1}'`.\n * @since 2.2.0\n * @param {Object} data - a data object containing the view group name and desired label\n * @memberof Lifecycle\n * @example LuigiClient.setViewGroupData({'vg1':' Luigi rocks!'})\n */\n setViewGroupData(data) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.setVGData',\n data\n });\n }\n}\nexport const lifecycleManager = new LifecycleManager();\n","import { LuigiClientBase } from './baseClass';\nimport { helpers } from './helpers';\n\n/**\n * @summary Split view allows to open a micro frontend in a split screen in the lower part of the content area. Open it by calling `const splitViewHandle = LuigiClient.linkManager().openAsSplitView`. At a given time, you can open only one split view. It closes automatically when you navigate to a different route. When you call `handle.collapse()`, the split view gets destroyed. It recreates when you use `handle.expand()`. `openAsSplitView` returns an instance of the split view handle. The functions, actions, and event handlers listed below allow you to control and manage the split view.\n * @augments LuigiClientBase\n * @name splitView\n * @since 0.6.0\n * @class\n */\nexport class splitViewHandle extends LuigiClientBase {\n /**\n * @private\n */\n constructor(settings) {\n super();\n\n this.validSplitViewEvents = ['expand', 'collapse', 'resize', 'close'];\n\n this.splitView = {\n exists: true,\n size: 40,\n collapsed: false\n };\n\n Object.assign(this.splitView, settings);\n\n const removeSplitViewListeners = () => {\n this.splitView.listeners.forEach((id) => helpers.removeEventListener(id));\n };\n\n this.splitView.listeners = [\n helpers.addEventListener(`luigi.navigation.splitview.internal`, (e) => {\n Object.assign(this.splitView, e.data.data);\n })\n ];\n this.on('resize', (newSize) => {\n this.splitView.size = newSize;\n });\n this.on('close', removeSplitViewListeners);\n }\n /*\n * @private\n */\n sendSplitViewEvent(action, data) {\n helpers.sendPostMessageToLuigiCore({\n msg: `luigi.navigation.splitview.${action}`,\n data\n });\n }\n\n /**\n * Collapses the split view\n * @memberof splitView\n * @since 0.6.0\n * @example\n * splitViewHandle.collapse();\n */\n collapse() {\n this.sendSplitViewEvent('collapse');\n }\n /**\n * Expands the split view\n * @memberof splitView\n * @since 0.6.0\n * @example\n * splitViewHandle.expand();\n */\n expand() {\n this.sendSplitViewEvent('expand');\n }\n\n /**\n * Closes and destroys the split view\n * @memberof splitView\n * @since 0.6.0\n * @example\n * splitViewHandle.close();\n */\n close() {\n this.sendSplitViewEvent('close');\n }\n /**\n * Sets the height of the split view\n * @memberof splitView\n * @param {number} value - lower height in percent\n * @since 0.6.0\n * @example\n * splitViewHandle.setSize(60);\n */\n setSize(value) {\n this.sendSplitViewEvent('resize', value);\n }\n /**\n * Registers a listener for split view events\n * @memberof splitView\n * @param {('expand'|'collapse'|'resize'|'close')} name - event name\n * @param {function} callback - gets called when this event gets triggered by Luigi\n * @returns {string} listener id\n * @since 0.6.0\n * @example\n * const listenerId = splitViewHandle.on('expand', () => {});\n * const listenerId = splitViewHandle.on('collapse', () => {});\n * const listenerId = splitViewHandle.on('resize', () => {});\n * const listenerId = splitViewHandle.on('close', () => {});\n **/\n on(name, callback) {\n if (!this.validSplitViewEvents.includes(name)) {\n console.warn(name + ' is not a valid split view event');\n return false;\n }\n const id = helpers.addEventListener(`luigi.navigation.splitview.${name}.ok`, (e) => {\n const filterParam = typeof e.data.data == 'number' ? e.data.data : undefined;\n callback(filterParam);\n });\n this.splitView.listeners.push(id);\n return id;\n }\n /**\n * Unregisters a split view listener\n * @memberof splitView\n * @param {string} id - listener id\n * @since 0.6.0\n * @example\n * splitViewHandle.removeEventListener(listenerId);\n */\n removeEventListener(id) {\n return helpers.removeEventListener(id);\n }\n\n /**\n * Gets the split view status\n * @memberof splitView\n * @returns {boolean} true if a split view is loaded\n * @since 0.6.0\n * @example\n * splitViewHandle.exists();\n */\n exists() {\n return this.splitView.exists;\n }\n /**\n * Reads the size of the split view\n * @memberof splitView\n * @returns {number} height in percent\n * @since 0.6.0\n * @example\n * splitViewHandle.getSize();\n */\n getSize() {\n return this.splitView.size;\n }\n /**\n * Reads the collapse status\n * @memberof splitView\n * @returns {boolean} true if the split view is currently collapsed\n * @since 0.6.0\n * @example\n * splitViewHandle.isCollapsed();\n */\n isCollapsed() {\n return this.splitView.collapsed;\n }\n /**\n * Reads the expand status\n * @memberof splitView\n * @returns {boolean} true if the split view is currently expanded\n * @since 0.6.0\n * @example\n * splitViewHandle.isExpanded();\n */\n isExpanded() {\n return !this.splitView.collapsed;\n }\n}\n","import { LuigiClientBase } from './baseClass';\nimport { helpers } from './helpers';\nimport { splitViewHandle } from './splitViewHandle';\n\n/**\n * @summary The Link Manager allows you to navigate to another route. Use it instead of an internal router to:\n - Provide routing inside micro frontends.\n - Reflect the route.\n - Keep the navigation state in Luigi.\n * @augments LuigiClientBase\n * @name linkManager\n * @class\n */\nexport class linkManager extends LuigiClientBase {\n /**\n * @private\n */\n constructor(values) {\n super();\n Object.assign(this, values);\n\n this.options = {\n preserveView: false,\n nodeParams: {},\n errorSkipNavigation: false,\n fromContext: null,\n fromClosestContext: false,\n fromVirtualTreeRoot: false,\n fromParent: false,\n relative: false,\n link: '',\n newTab: false,\n preserveQueryParams: false,\n anchor: '',\n preventContextUpdate: false,\n preventHistoryEntry: false\n };\n }\n\n /**\n * Navigates to the given path in the application hosted by Luigi. It contains either a full absolute path or a relative path without a leading slash that uses the active route as a base. This is the standard navigation.\n * @memberof linkManager\n * @param {string} path - path to be navigated to\n * @param {string} sessionId - current Luigi **sessionId**\n * @param {boolean} preserveView - preserve a view by setting it to `true`. It keeps the current view opened in the background and opens the new route in a new frame. Use the {@link #goBack goBack()} function to navigate back. You can use this feature across different levels. Preserved views are discarded as soon as you use the standard {@link #navigate navigate()} function instead of {@link #goBack goBack()}\n * @param {Object} modalSettings - opens a view in a modal. Use these settings to configure the modal's title and size\n * @param {string} modalSettings.title - modal title. By default, it is the node label. If there is no label, it is left empty\n * @param {('fullscreen'|'l'|'m'|'s')} [modalSettings.size=\"l\"] - size of the modal\n * @param {string} modalSettings.width - updates the `width` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'.\n * @param {string} modalSettings.height - updates the `height` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'.\n * @param {boolean} modalSettings.keepPrevious - lets you open multiple modals. Keeps the previously opened modal and allows to open another modal on top of the previous one. By default the previous modals are discarded.\n * @param {string} modalSettings.closebtn_data_testid - lets you specify a `data_testid` for the close button. Default value is `lui-modal-index-0`. If multiple modals are opened the index will be increased per modal.\n * @param {Object} splitViewSettings - opens a view in a split view. Use these settings to configure the split view's behaviour\n * @param {string} splitViewSettings.title - split view title. By default, it is the node label. If there is no label, it is left empty\n * @param {number} [splitViewSettings.size=40] - height of the split view in percent\n * @param {boolean} [splitViewSettings.collapsed=false] - creates split view but leaves it closed initially\n * @param {Object} drawerSettings - opens a view in a drawer. Use these settings to configure if the drawer has a header, backdrop and size\n * @param {any} drawerSettings.header - by default, the header is visible. The default title is the node label, but the header could also be an object with a `title` attribute allowing you to specify your own title. An 'x' icon is displayed to close the drawer view\n * @param {boolean} drawerSettings.backdrop - by default, it is set to `false`. If it is set to `true` the rest of the screen has a backdrop\n * @param {('l'|'m'|'s'|'xs')} [drawerSettings.size=\"s\"] - size of the drawer\n * @example\n * LuigiClient.linkManager().navigate('/overview')\n * LuigiClient.linkManager().navigate('users/groups/stakeholders')\n * LuigiClient.linkManager().navigate('/settings', null, true) // preserve view\n * LuigiClient.linkManager().navigate('#?Intent=Sales-order?id=13') // intent navigation\n */\n navigate(path, sessionId, preserveView, modalSettings, splitViewSettings, drawerSettings) {\n if (this.options.errorSkipNavigation) {\n this.options.errorSkipNavigation = false;\n return;\n }\n if (modalSettings && splitViewSettings && drawerSettings) {\n console.warn(\n 'modalSettings, splitViewSettings and drawerSettings cannot be used together. Only modal setting will be taken into account.'\n );\n }\n\n this.options.preserveView = preserveView;\n const relativePath = path[0] !== '/';\n\n if (path === '/' && (modalSettings || splitViewSettings || drawerSettings)) {\n console.warn('Navigation with an absolute path prevented.');\n return;\n }\n const navigationOpenMsg = {\n msg: 'luigi.navigation.open',\n sessionId: sessionId,\n params: Object.assign(this.options, {\n link: path,\n relative: relativePath,\n intent: helpers.hasIntent(path),\n modal: modalSettings,\n splitView: splitViewSettings,\n drawer: drawerSettings\n })\n };\n helpers.sendPostMessageToLuigiCore(navigationOpenMsg);\n }\n\n /**\n * Updates path of the modalPathParam when internal navigation occurs.\n * @memberof linkManager\n * @param {string} path\n * @param {boolean} addHistoryEntry - adds an entry in the history\n * @param {Object} [modalSettings] - opens a view in a modal. Use these settings to configure the modal's title and size\n * @since 1.21.0\n * @example\n * LuigiClient.linkManager().updateModalPathInternalNavigation('microfrontend')\n */\n updateModalPathInternalNavigation(path, modalSettings = {}, addHistoryEntry = false) {\n if (!path) {\n console.warn('Updating path of the modal upon internal navigation prevented. No path specified.');\n return;\n }\n\n const navigationOpenMsg = {\n msg: 'luigi.navigation.updateModalDataPath',\n params: Object.assign(this.options, {\n link: path,\n modal: modalSettings,\n history: addHistoryEntry\n })\n };\n helpers.sendPostMessageToLuigiCore(navigationOpenMsg);\n }\n\n /**\n * Offers an alternative way of navigating with intents. This involves specifying a semanticSlug and an object containing\n * parameters.\n * This method internally generates a URL of the form `#?intent=<semantic object>-<action>?<param_name>=<param_value>` through the given\n * input arguments. This then follows a call to the original `linkManager.navigate(...)` function.\n * Consequently, the following calls shall have the exact same effect:\n * - linkManager().navigateToIntent('Sales-settings', {project: 'pr2', user: 'john'})\n * - linkManager().navigate('/#?intent=Sales-settings?project=pr2&user=john')\n * @param {string} semanticSlug - concatenation of semantic object and action connected with a dash (-), i.e.: `<semanticObject>-<action>`\n * @param {Object} params - an object representing all the parameters passed, i.e.: `{param1: '1', param2: 2, param3: 'value3'}`\n * @example\n * LuigiClient.linkManager().navigateToIntent('Sales-settings', {project: 'pr2', user: 'john'})\n * LuigiClient.linkManager().navigateToIntent('Sales-settings')\n */\n navigateToIntent(semanticSlug, params = {}) {\n let newPath = '#?intent=';\n newPath += semanticSlug;\n if (params && Object.keys(params)?.length) {\n const paramList = Object.entries(params);\n // append parameters to the path if any\n if (paramList.length > 0) {\n newPath += '?';\n for (const [key, value] of paramList) {\n newPath += key + '=' + value + '&';\n }\n // trim potential excessive ampersand & at the end\n newPath = newPath.slice(0, -1);\n }\n }\n this.navigate(newPath);\n }\n\n /**\n * Opens a view in a modal. You can specify the modal's title and size. If you don't specify the title, it is the node label. If there is no node label, the title remains empty. The default size of the modal is `l`, which means 80%. You can also use `m` (60%) and `s` (40%) to set the modal size. Optionally, use it in combination with any of the navigation functions.\n * @memberof linkManager\n * @param {string} path - navigation path\n * @param {Object} [modalSettings] - opens a view in a modal. Use these settings to configure the modal's title and size\n * @param {string} modalSettings.title - modal title. By default, it is the node label. If there is no label, it is left empty\n * @param {('fullscreen'|'l'|'m'|'s')} [modalSettings.size=\"l\"] - size of the modal\n * @param {string} modalSettings.width - updates the `width` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'\n * @param {string} modalSettings.height - updates the `height` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'\n * @param {boolean} modalSettings.keepPrevious - lets you open multiple modals. Keeps the previously opened modal and allows to open another modal on top of the previous one. By default the previous modals are discarded\n * @param {string} modalSettings.closebtn_data_testid - lets you specify a `data_testid` for the close button. Default value is `lui-modal-index-0`. If multiple modals are opened the index will be increased per modal\n * @returns {promise} which is resolved when closing the modal. By using LuigiClient.linkManager().goBack({ foo: 'bar' }) to close the modal you have access to the `goBackContext` when the promise will be resolved.\n * @example\n * LuigiClient.linkManager().openAsModal('projects/pr1/users', {title:'Users', size:'m'}).then((res) => {\n * // Logic to execute when the modal will be closed\n * console.log(res.data) //=> {foo: 'bar'}\n * });\n */\n openAsModal(path, modalSettings = {}) {\n helpers.addEventListener('luigi.navigation.modal.close', (e, listenerId) => {\n const promise = this.getPromise('modal');\n if (promise) {\n promise.resolveFn(e.data);\n this.setPromise('modal', undefined);\n }\n helpers.removeEventListener(listenerId);\n });\n const modalPromise = {};\n modalPromise.promise = new Promise((resolve, reject) => {\n modalPromise.resolveFn = resolve;\n modalPromise.rejectFn = reject;\n });\n this.setPromise('modal', modalPromise);\n this.navigate(path, 0, true, modalSettings);\n return modalPromise.promise;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Updates the current title and size of a modal. If `routing.showModalPathInUrl` is set to `true`, the URL will be updated with the modal settings data.\n * In addition, you can specify if a new history entry will be created with the updated URL.\n * @memberof linkManager\n * @param {Object} updatedModalSettings - possibility to update the active modal\n * @param {Object} updatedModalSettings.title - update the `title` of the active modal\n * @param {Object} updatedModalSettings.size - update the `size` of the active modal\n * @param {string} updatedModalSettings.width - updates the `width` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'\n * @param {string} updatedModalSettings.height - updates the `height` of the modal. Allowed units are 'px', '%', 'rem', 'em', 'vh' and 'vw'\n * @param {boolean} addHistoryEntry - adds an entry in the history, by default it's `false`.\n * @example\n * LuigiClient.linkManager().updateModalSettings({title:'LuigiModal', size:'l'});\n */\n updateModalSettings(updatedModalSettings = {}, addHistoryEntry = false) {\n const message = {\n msg: 'luigi.navigation.updateModalSettings',\n updatedModalSettings,\n addHistoryEntry\n };\n helpers.sendPostMessageToLuigiCore(message);\n }\n\n /**\n * Opens a view in a split view. You can specify the split view's title and size. If you don't specify the title, it is the node label. If there is no node label, the title remains empty. The default size of the split view is `40`, which means 40% height of the split view.\n * @memberof linkManager\n * @param {string} path - navigation path\n * @param {Object} splitViewSettings - opens a view in a split view. Use these settings to configure the split view's behaviour\n * @param {string} splitViewSettings.title - split view title. By default, it is the node label. If there is no label, it is left empty\n * @param {number} [splitViewSettings.size=40] - height of the split view in percent\n * @param {boolean} [splitViewSettings.collapsed=false] - opens split view in collapsed state\n * @returns {Object} instance of the SplitView. It provides Event listeners and you can use the available functions to control its behavior.\n * @see {@link splitView} for further documentation about the returned instance\n * @since 0.6.0\n * @example\n * const splitViewHandle = LuigiClient.linkManager().openAsSplitView('projects/pr1/logs', {title: 'Logs', size: 40, collapsed: true});\n */\n openAsSplitView(path, splitViewSettings = {}) {\n this.navigate(path, 0, true, undefined, splitViewSettings);\n return new splitViewHandle(splitViewSettings);\n }\n\n /**\n * Opens a view in a drawer. You can specify the size of the drawer, whether the drawer has a header, and whether a backdrop is active in the background. By default, the header is shown. The backdrop is not visible and has to be activated. The size of the drawer is set to `s` by default, which means 25% of the micro frontend size. You can also use `l`(75%), `m`(50%) or `xs`(15.5%). Optionally, use it in combination with any of the navigation functions.\n * @memberof linkManager\n * @param {string} path - navigation path\n * @param {Object} drawerSettings - opens a view in a drawer. Use these settings to configure if the drawer has a header, backdrop and size.\n * @param {any} drawerSettings.header - by default, the header is visible. The default title is the node label, but the header could also be an object with a `title` attribute allowing you to specify your own title. An 'x' icon is displayed to close the drawer view.\n * @param {boolean} drawerSettings.backdrop - by default, it is set to `false`. If it is set to `true` the rest of the screen has a backdrop.\n * @param {('l'|'m'|'s'|'xs')} [drawerSettings.size=\"s\"] - size of the drawer\n * @param {boolean} [drawerSettings.overlap=true] - enable resizing of main microfrontend iFrame after drawer open\n * @since 1.6.0\n * @example\n * LuigiClient.linkManager().openAsDrawer('projects/pr1/drawer', {header:true, backdrop:true, size:'s'});\n * LuigiClient.linkManager().openAsDrawer('projects/pr1/drawer', {header:{title:'My drawer component'}, backdrop:true, size:'xs'});\n */\n openAsDrawer(path, drawerSettings = {}) {\n this.navigate(path, 0, true, undefined, undefined, drawerSettings);\n }\n\n /**\n * Sets the current navigation context to that of a specific parent node which has the {@link navigation-configuration.md navigationContext} field declared in the navigation configuration. This navigation context is then used by the `navigate` function.\n * @memberof linkManager\n * @param {string} navigationContext\n * @returns {linkManager} link manager instance\n * @example\n * LuigiClient.linkManager().fromContext('project').navigate('/settings')\n */\n fromContext(navigationContext) {\n const navigationContextInParent =\n this.currentContext.context.parentNavigationContexts &&\n this.currentContext.context.parentNavigationContexts.indexOf(navigationContext) !== -1;\n if (navigationContextInParent) {\n this.options.fromContext = navigationContext;\n } else {\n this.options.errorSkipNavigation = true;\n console.error('Navigation not possible, navigationContext ' + navigationContext + ' not found.');\n }\n return this;\n }\n\n /**\n * Sets the current navigation context which is then used by the `navigate` function. This has to be a parent navigation context, it is not possible to use the child navigation contexts.\n * @memberof linkManager\n * @returns {linkManager} link manager instance\n * @example\n * LuigiClient.linkManager().fromClosestContext().navigate('/users/groups/stakeholders')\n */\n fromClosestContext() {\n const hasParentNavigationContext = this.currentContext?.context.parentNavigationContexts.length > 0;\n if (hasParentNavigationContext) {\n this.options.fromContext = null;\n this.options.fromClosestContext = true;\n } else {\n console.error('Navigation not possible, no parent navigationContext found.');\n }\n return this;\n }\n\n /**\n * Sets the current navigation base to the parent node that is defined as virtualTree. This method works only when the currently active micro frontend is inside a virtualTree.\n * @memberof linkManager\n * @returns {linkManager} link manager instance\n * @since 1.0.1\n * @example\n * LuigiClient.linkManager().fromVirtualTreeRoot().navigate('/users/groups/stakeholders')\n */\n fromVirtualTreeRoot() {\n this.options.fromContext = null;\n this.options.fromClosestContext = false;\n this.options.fromVirtualTreeRoot = true;\n return this;\n }\n\n /**\n * Enables navigating to sibling nodes without knowing the absolute path.\n * @memberof linkManager\n * @returns {linkManager} link manager instance\n * @since 1.0.1\n * @example\n * LuigiClient.linkManager().fromParent().navigate('/sibling')\n */\n fromParent() {\n this.options.fromParent = true;\n return this;\n }\n\n /**\n * Sends node parameters to the route. The parameters are used by the `navigate` function. Use it optionally in combination with any of the navigation functions and receive it as part of the context object in Luigi Client.\n * @memberof linkManager\n * @param {Object} nodeParams\n * @returns {linkManager} link manager instance\n * @example\n * LuigiClient.linkManager().withParams({foo: \"bar\"}).navigate(\"path\")\n *\n * // Can be chained with context setting functions such as:\n * LuigiClient.linkManager().fromContext(\"currentTeam\").withParams({foo: \"bar\"}).navigate(\"path\")\n */\n withParams(nodeParams) {\n if (nodeParams) {\n Object.assign(this.options.nodeParams, nodeParams);\n }\n return this;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Sets options to customise route changing behaviour. The parameters are used by the `navigate` function. Use it optionally in combination with any of the navigation functions and receive it as part of the context object in Luigi Client.\n * @memberof linkManager\n * @param {Object} options - navigation options\n * @param {boolean} options.preventHistoryEntry - by default, it is set to `false`. If it is set to `true`, there is no browser history being kept.\n * @param {boolean} options.preventContextUpdate - by default, it is set to `false`. If it is set to `true`, there is no context update being triggered.\n * @returns {linkManager} link manager instance\n * @since 1.25.0\n * @example\n * LuigiClient.linkManager().withOptions(\n * { preventContextUpdate:true, preventHistoryEntry: true }\n * ).navigate('/overview')\n */\n withOptions(options) {\n if (!helpers.isObject(options)) return this;\n\n if (options['preventHistoryEntry'] !== undefined) {\n this.options.preventHistoryEntry = options['preventHistoryEntry'];\n }\n\n if (options['preventContextUpdate'] !== undefined) {\n this.options.preventContextUpdate = options['preventContextUpdate'];\n }\n\n return this;\n }\n\n /** @lends linkManager */\n /**\n * Checks if the path you can navigate to exists in the main application. For example, you can use this helper method conditionally to display a DOM element like a button.\n * @memberof linkManager\n * @param {string} path - path which existence you want to check\n * @returns {promise} a promise which resolves to a Boolean variable specifying whether the path exists or not\n * @example\n * let pathExists;\n * LuigiClient\n * .linkManager()\n * .pathExists('projects/pr2')\n * .then(\n * (pathExists) => { }\n * );\n */\n pathExists(path) {\n const currentId = helpers.getRandomId();\n const pathExistsPromises = this.getPromise('pathExistsPromises') || {};\n pathExistsPromises[currentId] = {\n resolveFn: function () {},\n then: function (resolveFn) {\n this.resolveFn = resolveFn;\n }\n };\n this.setPromise('pathExistsPromises', pathExistsPromises);\n\n // register event listener, which will be cleaned up after this usage\n helpers.addEventListener(\n 'luigi.navigation.pathExists.answer',\n function (e, listenerId) {\n const data = e.data.data;\n const pathExistsPromises = this.getPromise('pathExistsPromises') || {};\n if (data.correlationId === currentId) {\n if (pathExistsPromises[data.correlationId]) {\n pathExistsPromises[data.correlationId].resolveFn(data.pathExists);\n delete pathExistsPromises[data.correlationId];\n this.setPromise('pathExistsPromises', pathExistsPromises);\n }\n helpers.removeEventListener(listenerId);\n }\n }.bind(this)\n );\n\n const pathExistsMsg = {\n msg: 'luigi.navigation.pathExists',\n data: Object.assign(this.options, {\n id: currentId,\n link: path,\n intent: helpers.hasIntent(path),\n relative: path[0] !== '/'\n })\n };\n helpers.sendPostMessageToLuigiCore(pathExistsMsg);\n return pathExistsPromises[currentId];\n }\n\n /**\n * Checks if there is one or more preserved views. You can use it to show a **back** button.\n * @memberof linkManager\n * @returns {boolean} indicating if there is a preserved view you can return to\n */\n hasBack() {\n return !!this.currentContext.internal.modal || this.currentContext.internal.viewStackSize !== 0;\n }\n\n /**\n * Discards the active view and navigates back to the last visited view. Works with preserved views, and also acts as the substitute of the browser **back** button. **goBackContext** is only available when using preserved views.\n * @memberof linkManager\n * @param {any} goBackValue - data that is passed in the **goBackContext** field to the last visited view when using preserved views\n * @example\n * LuigiClient.linkManager().goBack({ foo: 'bar' });\n * LuigiClient.linkManager().goBack(true);\n */\n goBack(goBackValue) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.navigation.back',\n goBackContext: goBackValue && JSON.stringify(goBackValue)\n });\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Disables the navigation handling for a single navigation request.\n * It prevents Luigi Core from handling the URL change after `navigate()`.\n * Used for auto-navigation.\n * @since 0.7.7\n * @example\n * LuigiClient.linkManager().withoutSync().navigate('/projects/xy/foobar');\n * LuigiClient.linkManager().withoutSync().fromClosestContext().navigate('settings');\n */\n withoutSync() {\n this.options.withoutSync = true;\n return this;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Enables navigating to a new tab.\n * @since 1.16.0\n * @example\n * LuigiClient.linkManager().newTab().navigate('/projects/xy/foobar');\n */\n newTab() {\n this.options.newTab = true;\n return this;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Keeps the URL's query parameters for a navigation request.\n * @param {boolean} preserve - by default, it is set to `false`. If it is set to `true`, the URL's query parameters will be kept after navigation.\n * @since 1.19.0\n * @example\n * LuigiClient.linkManager().preserveQueryParams(true).navigate('/projects/xy/foobar');\n * LuigiClient.linkManager().preserveQueryParams(false).navigate('/projects/xy/foobar');\n */\n preserveQueryParams(preserve = false) {\n this.options.preserveQueryParams = preserve;\n return this;\n }\n\n /**\n * Gets the luigi route associated with the current micro frontend.\n * @returns {promise} a promise which resolves to a String value specifying the current luigi route\n * @since 1.23.0\n * @example\n * LuigiClient.linkManager().getCurrentRoute();\n * LuigiClient.linkManager().fromContext('project').getCurrentRoute();\n * LuigiClient.linkManager().fromVirtualTreeRoot().getCurrentRoute();\n */\n getCurrentRoute() {\n const currentId = helpers.getRandomId();\n\n const currentRoutePromise = this.getPromise('getCurrentRoute') || {};\n currentRoutePromise[currentId] = {\n resolveFn: function () {},\n then: function (resolveFn) {\n this.resolveFn = resolveFn;\n }\n };\n\n this.setPromise('getCurrentRoute', currentRoutePromise);\n\n helpers.addEventListener('luigi.navigation.currentRoute.answer', (e, listenerId) => {\n const data = e.data.data;\n const currentRoutePromise = this.getPromise('getCurrentRoute') || {};\n\n if (data.correlationId === currentId) {\n if (currentRoutePromise[data.correlationId]) {\n currentRoutePromise[data.correlationId].resolveFn(data.route);\n delete currentRoutePromise[data.correlationId];\n this.setPromise('getCurrentRoute', currentRoutePromise);\n }\n helpers.removeEventListener(listenerId);\n }\n helpers.removeEventListener(listenerId);\n });\n\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.navigation.currentRoute',\n data: Object.assign(this.options, {\n id: currentId\n })\n });\n\n return currentRoutePromise[currentId];\n }\n}\n","import { LuigiClientBase } from './baseClass';\nimport { lifecycleManager } from './lifecycleManager';\nimport { helpers } from './helpers';\n\n/**\n * @summary Use the UX Manager to manage the appearance features in Luigi.\n * @augments LuigiClientBase\n * @name uxManager\n * @class\n */\nclass UxManager extends LuigiClientBase {\n /** @private */\n constructor() {\n super();\n helpers.addEventListener('luigi.current-locale-changed', (e) => {\n if (e.data.currentLocale && lifecycleManager.currentContext?.internal) {\n lifecycleManager.currentContext.internal.currentLocale = e.data.currentLocale;\n lifecycleManager._notifyUpdate();\n }\n });\n }\n\n /**\n * Adds a backdrop with a loading indicator for the micro frontend frame. This overrides the {@link navigation-parameters-reference.md#node-parameters loadingIndicator.enabled} setting.\n * @memberof uxManager\n */\n showLoadingIndicator() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.show-loading-indicator' });\n }\n\n /**\n * Removes the loading indicator. Use it after calling {@link #showLoadingIndicator showLoadingIndicator()} or to hide the indicator when you use the {@link navigation-parameters-reference.md#node-parameters loadingIndicator.hideAutomatically: false} node configuration.\n * @memberof uxManager\n */\n hideLoadingIndicator() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.hide-loading-indicator' });\n }\n\n /**\n * Closes the currently opened micro frontend modal.\n * @memberof uxManager\n */\n closeCurrentModal() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.close-modal' });\n }\n\n /**\n * Adds a backdrop to block the top and side navigation. It is based on the Fundamental UI Modal, which you can use in your micro frontend to achieve the same behavior.\n * @memberof uxManager\n */\n addBackdrop() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.add-backdrop' });\n }\n\n /**\n * Removes the backdrop.\n * @memberof uxManager\n */\n removeBackdrop() {\n helpers.sendPostMessageToLuigiCore({ msg: 'luigi.remove-backdrop' });\n }\n\n /**\n * This method informs the main application that there are unsaved changes in the current view in the iframe. It can be used to prevent navigation away from the current view, for example with form fields which were edited but not submitted. However, this functionality is not restricted to forms. If you use `withoutSync()` together with `setDirtyStatus()`, this is a special case in which the dirty state logic needs to be handled by the micro frontend. For example, if the user navigates with an Angular router, which would trigger `withoutSync()`, Angular needs to take care about dirty state, prevent the navigation and ask for permission to navigate away, through `uxManager().showConfirmationModal(settings)`.\n * @param {boolean} isDirty - indicates if there are any unsaved changes on the current page or in the component\n * @memberof uxManager\n */\n setDirtyStatus(isDirty) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.set-page-dirty',\n dirty: isDirty\n });\n }\n\n /**\n * Shows a confirmation modal.\n * @memberof uxManager\n * @param {Object} settings - the settings of the confirmation modal. If you don't provide any value for any of the fields, a default value is used\n * @param {('confirmation'|'success'|'warning'|'error'|'information')} settings.type - the content of the modal type. (Optional)\n * @param {string} [settings.header=\"Confirmation\"] - the content of the modal header\n * @param {string} [settings.body=\"Are you sure you want to do this?\"] - the content of the modal body. It supports HTML formatting elements such as `<br>`, `<b>`, `<strong>`, `<i>`, `<em>`, `<mark>`, `<small>`, `<del>`, `<ins>`, `<sub>`, `<sup>`.\n * @param {string|false} [settings.buttonConfirm=\"Yes\"] - the label for the modal confirmation button. If set to `false`, the button will not be shown.\n * @param {string} [settings.buttonDismiss=\"No\"] - the label for the modal dismiss button\n * @returns {promise} which is resolved when accepting the confirmation modal and rejected when dismissing it\n * @example\n * import LuigiClient from '@luigi-project/client';\n * const settings = {\n * type: \"confirmation\",\n * header: \"Confirmation\",\n * body: \"Are you sure you want to do this?\",\n * buttonConfirm: \"Yes\",\n * buttonDismiss: \"No\"\n * }\n * LuigiClient\n * .uxManager()\n * .showConfirmationModal(settings)\n * .then(() => {\n * // Logic to execute when the confirmation modal is dismissed\n * });\n */\n showConfirmationModal(settings) {\n helpers.addEventListener('luigi.ux.confirmationModal.hide', (e, listenerId) => {\n this.hideConfirmationModal(e.data.data);\n helpers.removeEventListener(listenerId);\n });\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.ux.confirmationModal.show',\n data: { settings }\n });\n\n const confirmationModalPromise = {};\n confirmationModalPromise.promise = new Promise((resolve, reject) => {\n confirmationModalPromise.resolveFn = resolve;\n confirmationModalPromise.rejectFn = reject;\n });\n this.setPromise('confirmationModal', confirmationModalPromise);\n return confirmationModalPromise.promise;\n }\n\n /**\n * @private\n * @memberof uxManager\n * @param {Object} modal - confirmed boolean value if ok or cancel has been pressed\n */\n hideConfirmationModal(modal) {\n const promise = this.getPromise('confirmationModal');\n if (promise) {\n modal.confirmed ? promise.resolveFn() : promise.rejectFn();\n this.setPromise('confirmationModal', undefined);\n }\n }\n\n /**\n * Shows an alert.\n * @memberof uxManager\n * @param {Object} settings - the settings for the alert\n * @param {string} settings.text - the content of the alert. To add a link to the content, you have to set up the link in the `links` object. The key(s) in the `links` object must be used in the text to reference the links, wrapped in curly brackets with no spaces. If you don't specify any text, the alert is not displayed\n * @param {('info'|'success'|'warning'|'error')} settings.type - sets the type of alert\n * @param {Object} settings.links - provides links data\n * @param {Object} settings.links.LINK_KEY - object containing the data for a particular link. To properly render the link in the alert message refer to the description of the **settings.text** parameter\n * @param {string} settings.links.LINK_KEY.text - text which replaces the link identifier in the alert content\n * @param {string} settings.links.LINK_KEY.url - URL to navigate when you click the link. Currently, only internal links are supported in the form of relative or absolute paths\n * @param {string} settings.links.LINK_KEY.dismissKey - dismissKey which represents the key of the link\n * @param {number} settings.closeAfter - (optional) time in milliseconds that tells Luigi when to close the Alert automatically. If not provided, the Alert will stay on until closed manually. It has to be greater than `100`\n * @returns {promise} which is resolved when the alert is dismissed\n * @example\n * import LuigiClient from '@luigi-project/client';\n * const settings = {\n * text: \"Ut enim ad minim veniam, {goToHome} quis nostrud exercitation ullamco {relativePath}. Duis aute irure dolor {goToOtherProject} or {neverShowItAgain}\",\n * type: 'info',\n * links: {\n * goToHome: { text: 'homepage', url: '/overview' },\n * goToOtherProject: { text: 'other project', url: '/projects/pr2' },\n * relativePath: { text: 'relative hide side nav', url: 'hideSideNav' },\n * neverShowItAgain: { text: 'Never show it again', dismissKey: 'neverShowItAgain' }\n * },\n * closeAfter: 3000\n * }\n * LuigiClient\n * .uxManager()\n * .showAlert(settings)\n * .then(() => {\n * // Logic to execute when the alert is dismissed\n * });\n */\n showAlert(settings) {\n //generate random ID\n settings.id = helpers.getRandomId();\n\n helpers.addEventListener('luigi.ux.alert.hide', (e, listenerId) => {\n if (e.data.id === settings.id) {\n this.hideAlert(e.data);\n helpers.removeEventListener(listenerId);\n }\n });\n\n if (settings?.closeAfter < 100) {\n console.warn(`Message with id='${settings.id}' has too small 'closeAfter' value. It needs to be at least 100ms.`);\n settings.closeAfter = undefined;\n }\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.ux.alert.show',\n data: { settings }\n });\n\n const alertPromises = this.getPromise('alerts') || {};\n alertPromises[settings.id] = {};\n alertPromises[settings.id].promise = new Promise((resolve) => {\n alertPromises[settings.id].resolveFn = resolve;\n });\n this.setPromise('alerts', alertPromises);\n return alertPromises[settings.id].promise;\n }\n\n /**\n * @private\n * @memberof uxManager\n * @param {Object} alertObj\n * @param {string} alertObj.id - alert id\n * @param {string} alertObj.dismissKey - key of the link\n */\n hideAlert({ id, dismissKey }) {\n const alerts = this.getPromise('alerts');\n if (id && alerts[id]) {\n alerts[id].resolveFn(dismissKey ? dismissKey : id);\n delete alerts[id];\n this.setPromise('alerts', alerts);\n }\n }\n\n /**\n * Gets the current locale.\n * @returns {string} current locale\n * @memberof uxManager\n */\n getCurrentLocale() {\n return lifecycleManager.currentContext?.internal?.currentLocale;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Sets current locale to the specified one.\n *\n * **NOTE:** this must be explicitly allowed on the navigation node level by setting `clientPermissions.changeCurrentLocale` to `true`. (See {@link navigation-parameters-reference.md Node parameters}.)\n *\n * @param {string} locale - locale to be set as the current locale\n * @memberof uxManager\n */\n setCurrentLocale(locale) {\n if (locale) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'luigi.ux.set-current-locale',\n data: {\n currentLocale: locale\n }\n });\n }\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Checks if the current micro frontend is displayed inside a split view\n * @returns {boolean} indicating if it is loaded inside a split view\n * @memberof uxManager\n * @since 0.6.0\n */\n isSplitView() {\n return lifecycleManager.currentContext?.internal?.splitView;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Checks if the current micro frontend is displayed inside a modal\n * @returns {boolean} indicating if it is loaded inside a modal\n * @memberof uxManager\n * @since 0.6.0\n */\n isModal() {\n return lifecycleManager.currentContext?.internal?.modal;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Checks if the current micro frontend is displayed inside a drawer\n * @returns {boolean} indicating if it is loaded inside a drawer\n * @memberof uxManager\n * @since 1.26.0\n */\n isDrawer() {\n return lifecycleManager.currentContext?.internal?.drawer;\n }\n\n /**\n * Gets the current theme.\n * @returns {*} current themeObj\n * @memberof uxManager\n */\n getCurrentTheme() {\n return lifecycleManager.currentContext?.internal?.currentTheme;\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Gets the CSS variables from Luigi Core with their key and value.\n * @returns {Object} CSS variables with their key and value.\n * @memberof uxManager\n * @since 2.3.0\n * @example LuigiClient.uxManager().getCSSVariables();\n */\n getCSSVariables() {\n return lifecycleManager.currentContext?.internal?.cssVariables || {};\n }\n\n /**\n * <!-- label-success: Web App API only -->\n * Adds the CSS variables from Luigi Core in a <style> tag to the document <head> section.\n * @memberof uxManager\n * @since 2.3.0\n * @example LuigiClient.uxManager().applyCSS();\n */\n applyCSS() {\n document.querySelectorAll('head style[luigi-injected]').forEach((luigiInjectedStyleTag) => {\n luigiInjectedStyleTag.remove();\n });\n const vars = lifecycleManager.currentContext?.internal?.cssVariables;\n if (vars) {\n let cssString = ':root {\\n';\n Object.keys(vars).forEach((key) => {\n const val = vars[key];\n cssString += (key.startsWith('--') ? '' : '--') + key + ':' + val + ';\\n';\n });\n cssString += '}';\n const themeStyle = document.createElement('style');\n themeStyle.setAttribute('luigi-injected', true);\n themeStyle.innerHTML = cssString;\n document.head.appendChild(themeStyle);\n }\n }\n}\nexport const uxManager = new UxManager();\n","import { LuigiClientBase } from './baseClass';\nimport { helpers } from './helpers';\n\nconst pendingOperation = new Map();\n\n/**\n * <!-- label-success: Web App API only -->\n * StorageManager allows you to use browser local storage of key/values. Every storage operation is sent to be managed by Luigi Core.\n * The idea is that different micro frontends can share or persist items using local storage, as long as they come from the same domain and follow the [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy).\n * Since all storage operations are asynchronous (sending an event to Luigi Core that will reply once operation is finished), all the methods return Promises.\n * @augments LuigiClientBase\n * @name storageManager\n * @class\n */\nclass StorageManager extends LuigiClientBase {\n /** @private */\n constructor() {\n super();\n this.storageEventProcessor = new StorageEventProcessor();\n helpers.addEventListener('storage', (evt, listenerId) => this.storageEventProcessor.processEvent(evt, listenerId));\n }\n\n /**\n * Stores an item for a specific key.\n * @memberof storageManager\n * @param {string} key - key used to identify the value\n * @param {Object} value - item to store; object must be stringifyable\n * @returns {Promise<void>} resolves an empty value when the storage operation is over. It will launch an error if storage is not supported, the value cannot be stringified, or if you are using a Luigi reserved key.\n * @example\n * LuigiClient.storageManager().setItem('keyExample','valueExample').then(() => console.log('Value stored'))\n * @since 1.6.0\n */\n setItem(key, value) {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'setItem', {\n key,\n value\n });\n });\n }\n\n /**\n * Retrieves an item for a specific key.\n * @memberof storageManager\n * @param {string} key - used to identify the value\n * @returns {Promise<Object>} resolves an item retrieved from storage. It will launch an error if storage is not supported.\n * @example\n * LuigiClient.storageManager().getItem('keyExample').then((value) => console.log);\n * @since 1.6.0\n */\n getItem(key) {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'getItem', { key });\n });\n }\n\n /**\n * Removes an item for a specific key.\n * @memberof storageManager\n * @param {string} key - used to identify the value\n * @returns {Promise<Object>} resolves an item just removed from storage. It will launch an error if storage is not supported or if you are using a Luigi reserved key.\n * @example\n * LuigiClient.storageManager().removeItem('keyExample').then((value) => console.log(value + ' just removed')\n * @since 1.6.0\n */\n removeItem(key) {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'removeItem', {\n key\n });\n });\n }\n\n /**\n * Clears all the storage key/values.\n * @memberof storageManager\n * @returns {Promise<void>} resolves when storage clear is over.\n * @example\n * LuigiClient.storageManager().clear().then(() => console.log('storage cleared'))\n * @since 1.6.0\n */\n clear() {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'clear', {});\n });\n }\n\n /**\n * Checks if a key is present in storage.\n * @memberof storageManager\n * @param {string} key - key in the storage\n * @returns {Promise<boolean>} `true` if key is present, `false` if it is not\n * @example\n * LuigiClient.storageManager().has(key).then((present) => console.log('item is present '+present))\n * @since 1.6.0\n */\n has(key) {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'has', { key });\n });\n }\n\n /**\n * Gets all the keys used in the storage.\n * @memberof storageManager\n * @returns {Promise<string[]>} keys currently present in the storage\n * @example\n * LuigiClient.storageManager().getAllKeys().then((keys) => console.log('keys are '+keys))\n * @since 1.6.0\n */\n getAllKeys() {\n return new Promise((resolve, reject) => {\n this.storageEventProcessor.execute(resolve, reject, 'getAllKeys', {});\n });\n }\n}\n\nclass StorageEventProcessor {\n processEvent(evt, listenerId) {\n try {\n const data = evt.data.data;\n if (!pendingOperation.has(data.id)) {\n console.log('Impossible to find Promise method for message ' + data.id);\n return;\n }\n const promiseOperations = pendingOperation.get(data.id);\n if (data.status === 'ERROR') {\n promiseOperations.reject(data.result);\n } else {\n promiseOperations.resolve(data.result);\n }\n pendingOperation.delete(data.id);\n } catch (e) {\n console.error(e);\n }\n }\n\n waitForSyncResult(id) {\n let start = new Date().getTime();\n while (!syncOperation.has(id)) {\n let exec = new Date().getTime() - start;\n if (exec > 10000) {\n throw 'Storage operation is taking more than 1 second...Some problem with Luigi Core communication';\n }\n }\n const result = syncOperation.get(id);\n pendingOperation.delete(id);\n return result;\n }\n\n execute(resolve, reject, operation, params) {\n let id = helpers.getRandomId();\n this.createPendingOperation(id, resolve, reject);\n this.sendMessage(id, operation, params);\n }\n\n createPendingOperation(id, resolve, reject) {\n pendingOperation.set(id, {\n resolve,\n reject\n });\n }\n sendMessage(id, operation, params) {\n helpers.sendPostMessageToLuigiCore({\n msg: 'storage',\n data: {\n id,\n operation,\n params\n }\n });\n }\n}\n\nexport const storageManager = new StorageManager();\n","import { lifecycleManager } from './lifecycleManager';\nimport { linkManager } from './linkManager';\nimport { uxManager } from './uxManager';\nimport { storageManager } from './storageManager';\nimport { helpers } from './helpers';\n\n/**\n * @name LuigiClient\n * @private\n */\nclass LuigiClient {\n constructor() {\n if (window !== window.top) {\n if (window.document.head.getAttribute('disable-luigi-history-handling') !== 'true') {\n history.pushState = history.replaceState.bind(history);\n }\n if (window.document.head.getAttribute('disable-luigi-runtime-error-handling') !== 'true') {\n window.addEventListener('error', ({ filename, message, lineno, colno, error }) => {\n const msg = {\n msg: 'luigi-runtime-error-handling',\n errorObj: { filename, message, lineno, colno, error }\n };\n helpers.sendPostMessageToLuigiCore(msg);\n });\n }\n }\n }\n\n addInitListener(initFn, disableTpcCheck) {\n return lifecycleManager.addInitListener(initFn, disableTpcCheck);\n }\n removeInitListener(id) {\n return lifecycleManager.removeInitListener(id);\n }\n addContextUpdateListener(contextUpdatedFn) {\n return lifecycleManager.addContextUpdateListener(contextUpdatedFn);\n }\n removeContextUpdateListener(id) {\n return lifecycleManager.removeContextUpdateListener(id);\n }\n getToken() {\n return lifecycleManager.getToken();\n }\n getEventData() {\n return lifecycleManager.getEventData();\n }\n getContext() {\n return lifecycleManager.getContext();\n }\n addNodeParams(params, keepBrowserHistory) {\n return lifecycleManager.addNodeParams(params, keepBrowserHistory);\n }\n getNodeParams(shouldDesanitise) {\n return lifecycleManager.getNodeParams(shouldDesanitise);\n }\n getActiveFeatureToggles() {\n return lifecycleManager.getActiveFeatureToggles();\n }\n getPathParams() {\n return lifecycleManager.getPathParams();\n }\n getCoreSearchParams() {\n return lifecycleManager.getCoreSearchParams();\n }\n addCoreSearchParams(searchParams, keepBrowserHistory) {\n return lifecycleManager.addCoreSearchParams(searchParams, keepBrowserHistory);\n }\n getClientPermissions() {\n return lifecycleManager.getClientPermissions();\n }\n sendCustomMessage(message) {\n return lifecycleManager.sendCustomMessage(message);\n }\n addCustomMessageListener(messageId, listener) {\n return lifecycleManager.addCustomMessageListener(messageId, listener);\n }\n removeCustomMessageListener(listenerId) {\n return lifecycleManager.removeCustomMessageListener(listenerId);\n }\n addInactiveListener(messageId, listener) {\n return lifecycleManager.addInactiveListener(messageId, listener);\n }\n removeInactiveListener(listenerId) {\n return lifecycleManager.removeInactiveListener(listenerId);\n }\n setTargetOrigin(origin) {\n return lifecycleManager.setTargetOrigin(origin);\n }\n getUserSettings() {\n return lifecycleManager.getUserSettings();\n }\n isLuigiClientInitialized() {\n return lifecycleManager.isLuigiClientInitialized();\n }\n luigiClientInit() {\n return lifecycleManager.luigiClientInit();\n }\n getAnchor() {\n return lifecycleManager.getAnchor();\n }\n setAnchor(value) {\n return lifecycleManager.setAnchor(value);\n }\n setViewGroupData(value) {\n return lifecycleManager.setViewGroupData(value);\n }\n\n /**\n * @private\n */\n linkManager() {\n return new linkManager({\n currentContext: lifecycleManager.currentContext\n });\n }\n /**\n * @private\n */\n uxManager() {\n return uxManager;\n }\n /**\n * @private\n */\n lifecycleManager() {\n return lifecycleManager;\n }\n /**\n * @private\n */\n storageManager() {\n return storageManager;\n }\n}\nexport default LuigiClient = new LuigiClient();\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","LuigiClientBase","_classCallCheck","this","promises","value","name","helpers","Helpers","listeners","origin","helperListener","evt","data","msg","message","convertCustomMessageInternalToUser","filter","listener","id","map","eventFn","listenerId","bind","window","addEventListener","internalMessage","getRandomId","push","Boolean","find","l","crypto","getRandomValues","Uint32Array","item","toString","setLuigiCoreDomain","parent","postMessage","error","console","warn","path","toLowerCase","includes","paramsMap","_this","entries","reduce","sanitizedMap","paramPair","deSanitizeParam","String","arguments","length","replaceAll","lifecycleManager","_LuigiClientBase","LifecycleManager","_callSuper","luigiInitialized","defaultContextKeys","setCurrentContext","acc","_onContextUpdatedFns","_onInactiveFns","_onInitFns","authData","_isDeferInitDefined","luigiClientInit","_inherits","document","head","hasAttribute","_this$currentContext","_this$currentContext$","_this$currentContext$2","currentContext","internal","thirdPartyCookieCheck","disabled","_this2","setContext","rawData","index","JSON","parse","e","info","setAuthData","eventPayload","_notifyInit","_tpcCheck","sendPostMessageToLuigiCore","_notifyInactive","isNavigateBack","withoutSync","previousHash","location","hash","history","replaceState","luigiInduced","viewUrl","dispatchEvent","PopStateEvent","state","HashChangeEvent","assign","context","pathParams","_notifyUpdate","clientVersion","require","_isTpcCheckDisabled","luigiCookie","tpc","cookies","cookie","split","trim","objWithFns","payload","isFunction","_callAllFns","initFn","disableTpcCheck","setAttribute","getLuigiCoreDomain","contextUpdatedFn","inactiveFn","customMessageId","customMessageListener","customMessage","removeEventListener","accessToken","getEventData","_this$currentContext$3","activeFeatureToggleList","params","keepBrowserHistory","deSanitizeParamsMap","nodeParams","searchParams","clientPermissions","setTargetOrigin","customMessageInternal","convertCustomMessageUserToInternal","userSettings","anchor","splitViewHandle","settings","validSplitViewEvents","splitView","exists","size","collapsed","on","newSize","forEach","action","concat","sendSplitViewEvent","callback","filterParam","linkManager","values","options","preserveView","errorSkipNavigation","fromContext","fromClosestContext","fromVirtualTreeRoot","fromParent","relative","link","newTab","preserveQueryParams","preventContextUpdate","preventHistoryEntry","sessionId","modalSettings","splitViewSettings","drawerSettings","relativePath","navigationOpenMsg","intent","hasIntent","modal","drawer","addHistoryEntry","semanticSlug","_Object$keys","newPath","keys","paramList","_step","_iterator","_createForOfIteratorHelper","s","n","done","_step$value","_slicedToArray","err","f","slice","navigate","promise","getPromise","resolveFn","setPromise","modalPromise","Promise","resolve","reject","rejectFn","updatedModalSettings","navigationContext","parentNavigationContexts","indexOf","isObject","currentId","pathExistsPromises","then","correlationId","pathExists","pathExistsMsg","viewStackSize","goBackValue","goBackContext","stringify","preserve","_this3","currentRoutePromise","route","uxManager","UxManager","_lifecycleManager$cur","currentLocale","isDirty","dirty","hideConfirmationModal","confirmationModalPromise","confirmed","hideAlert","closeAfter","alertPromises","_ref","dismissKey","alerts","_lifecycleManager$cur2","_lifecycleManager$cur3","locale","_lifecycleManager$cur4","_lifecycleManager$cur5","_lifecycleManager$cur6","_lifecycleManager$cur7","_lifecycleManager$cur8","_lifecycleManager$cur9","_lifecycleManager$cur10","_lifecycleManager$cur11","currentTheme","_lifecycleManager$cur12","_lifecycleManager$cur13","cssVariables","_lifecycleManager$cur14","_lifecycleManager$cur15","querySelectorAll","luigiInjectedStyleTag","remove","vars","cssString","val","startsWith","themeStyle","createElement","innerHTML","appendChild","pendingOperation","Map","StorageManager","storageEventProcessor","StorageEventProcessor","processEvent","_createClass","execute","_this4","_this5","_this6","_this7","has","log","promiseOperations","status","result","start","Date","getTime","syncOperation","operation","createPendingOperation","sendMessage","set","storageManager","LuigiClient","top","getAttribute","pushState","errorObj","filename","lineno","colno","addInitListener","removeInitListener","addContextUpdateListener","removeContextUpdateListener","getToken","getContext","addNodeParams","shouldDesanitise","getNodeParams","getActiveFeatureToggles","getPathParams","getCoreSearchParams","addCoreSearchParams","getClientPermissions","sendCustomMessage","messageId","addCustomMessageListener","removeCustomMessageListener","addInactiveListener","removeInactiveListener","getUserSettings","isLuigiClientInitialized","getAnchor","setAnchor","setViewGroupData"],"sourceRoot":""}
package/package.json CHANGED
@@ -17,5 +17,5 @@
17
17
  "micro-frontends",
18
18
  "microfrontends"
19
19
  ],
20
- "version": "2.26.1-dev.20251280038"
20
+ "version": "2.26.1-dev.202601100039"
21
21
  }