@salesforce/lightning-out 2.2.5-rc.2 → 2.2.5-rc.4

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.
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @salesforce/lightning-out v2.2.5-rc.2 (2026-07-14) */
1
+ /*! @salesforce/lightning-out v2.2.5-rc.4 (2026-08-10) */
2
2
  /**
3
3
  * Numeric ranks for {@link LogLevel}; lower values are more severe.
4
4
  */
@@ -182,11 +182,9 @@ const messages = {
182
182
  const logger$4 = new Logger("LightningOutError");
183
183
  const errorMessages = {
184
184
  sessionNotReady: "Session not ready",
185
- sessionRefreshSuperseded: "Session refresh superseded",
186
- sessionRefreshTimeout: "Session refresh timeout",
187
- sessionRefreshIframeError: "Session refresh failed: iframe error",
188
- sessionExpiryTimeout: "Session expiry timeout",
189
- sessionExpiryMalformedResponse: "Malformed sessionExpiry response",
185
+ sessionTimeout: "Session timeout",
186
+ sessionIframeError: "Session failed: iframe error",
187
+ sessionMalformedResponse: "Malformed sessionExpiry response",
190
188
  sessionTerminated: "Session terminated",
191
189
  notSupportedInOrgUrlMode: "Session APIs are not supported in org-url mode",
192
190
  };
@@ -411,6 +409,18 @@ function standardNameToElementName(standardName) {
411
409
  function isStandardName(name) {
412
410
  return name.includes("/") || name.includes(":");
413
411
  }
412
+ /**
413
+ * Returns true when `propName` is the `@lwc/synthetic-shadow` tag. The polyfill attaches
414
+ * `$$ShadowResolverKey$$` as a function-valued own-prop to every DOM node it touches, and
415
+ * structuredClone rejects it with DataCloneError when the observed property set is posted
416
+ * across the iframe boundary (W-23744109).
417
+ *
418
+ * @param propName - The property name to check
419
+ * @returns True if the property is the synthetic-shadow tag
420
+ */
421
+ function isSyntheticShadowKey(propName) {
422
+ return propName === "$$ShadowResolverKey$$";
423
+ }
414
424
  /**
415
425
  * Applies property transformations and validation callbacks to component
416
426
  * property changes before they are sent to Lightning components.
@@ -1297,7 +1307,7 @@ class LightningOutComponent extends HTMLElement {
1297
1307
  return false;
1298
1308
  }
1299
1309
  else {
1300
- return !attrName.startsWith("_");
1310
+ return !attrName.startsWith("_") && !isSyntheticShadowKey(attrOrPropName);
1301
1311
  }
1302
1312
  };
1303
1313
  addEventListener(eventName, listener, options) {
@@ -1488,7 +1498,7 @@ class LightningOutRouter {
1488
1498
  url.searchParams.set("parentElementId", parentElementId);
1489
1499
  url.searchParams.set("loAppOrigin", this.config.loAppOrigin);
1490
1500
  // This helps in general but also for cache busting
1491
- url.searchParams.set("loVersion", "2.2.5-rc.2");
1501
+ url.searchParams.set("loVersion", "2.2.5-rc.4");
1492
1502
  if (this.config.appId) {
1493
1503
  url.searchParams.set("appId", this.config.appId);
1494
1504
  }
@@ -1640,9 +1650,10 @@ class LightningOutApplication extends HTMLElement {
1640
1650
  return this.getRouter().getPageURL(pagePathname, this._uuid);
1641
1651
  }
1642
1652
  // Three paths reach #iframeLoaded:
1643
- // 1. frontdoor-url update (#isRefreshing=true): supersession in _propertyChanged_frontdoorUrl has already
1644
- // cleared #promiseSessionRefresh, so only #isRefreshing needs to be checked.
1645
- // 2. sessionRefresh()-initiated reload (#promiseSessionRefresh set): resolve and skip initial-auth bookkeeping.
1653
+ // 1. frontdoor-url update (#isRefreshing=true): _propertyChanged_frontdoorUrl has already failed any pending
1654
+ // sessionRefresh via #failAllPending, so only #isRefreshing needs to be checked here.
1655
+ // 2. sessionRefresh()-initiated reload (#promiseSessionRefresh set): coalesced callers share this slot;
1656
+ // resolve it and skip initial-auth bookkeeping.
1646
1657
  // 3. Initial auth (neither flag set): existing behavior.
1647
1658
  #iframeLoaded = (event) => {
1648
1659
  this.applicationReady = true;
@@ -1685,33 +1696,25 @@ class LightningOutApplication extends HTMLElement {
1685
1696
  if (!this.applicationReady) {
1686
1697
  return Promise.reject(this.#loError.create(errorMessages.sessionNotReady));
1687
1698
  }
1688
- if (this.#promiseSessionExpiry) {
1689
- // coalesce concurrent callers onto the same in-flight Promise
1690
- return new Promise((resolve, reject) => {
1691
- const slot = this.#promiseSessionExpiry;
1692
- const prevResolve = slot.resolve;
1693
- const prevReject = slot.reject;
1694
- slot.resolve = (n) => {
1695
- prevResolve(n);
1696
- resolve(n);
1697
- };
1698
- slot.reject = (e) => {
1699
- prevReject(e);
1700
- reject(e);
1701
- };
1702
- });
1703
- }
1704
- return new Promise((resolve, reject) => {
1705
- const timeoutId = window.setTimeout(() => {
1706
- // Read slot.reject (the chained wrapper) at fire time — the local `reject` only
1707
- // resolves the first caller, while coalesced callers are reachable via slot.reject.
1708
- const slot = this.#promiseSessionExpiry;
1709
- this.#promiseSessionExpiry = null;
1710
- slot?.reject(this.#loError.create(errorMessages.sessionExpiryTimeout));
1711
- }, 30_000);
1712
- this.#promiseSessionExpiry = { resolve, reject, timeoutId };
1713
- this.#loIFrame.postMessage({ type: messages.lo.sessionExpiry, id: this._uuid });
1699
+ if (this.#promiseSessionExpiry)
1700
+ return this.#promiseSessionExpiry.promise;
1701
+ let resolveFn;
1702
+ let rejectFn;
1703
+ const promise = new Promise((resolve, reject) => {
1704
+ resolveFn = resolve;
1705
+ rejectFn = reject;
1714
1706
  });
1707
+ // 30s covers a single postMessage round-trip to SessionTimeServlet via the auth iframe —
1708
+ // generous headroom for a stable channel; the paired sessionRefresh timeout is longer
1709
+ // because it drives a full SSO/IdP redirect chain (see #promiseSessionRefresh setTimeout).
1710
+ const timeoutId = window.setTimeout(() => {
1711
+ const slot = this.#promiseSessionExpiry;
1712
+ this.#promiseSessionExpiry = null;
1713
+ slot?.reject(this.#loError.create(errorMessages.sessionTimeout));
1714
+ }, 30_000);
1715
+ this.#promiseSessionExpiry = { promise, resolve: resolveFn, reject: rejectFn, timeoutId };
1716
+ this.#loIFrame.postMessage({ type: messages.lo.sessionExpiry, id: this._uuid });
1717
+ return promise;
1715
1718
  }
1716
1719
  sessionRefresh() {
1717
1720
  // org-url mode has no auth iframe to reload — fast-fail rather than hang.
@@ -1721,24 +1724,26 @@ class LightningOutApplication extends HTMLElement {
1721
1724
  if (!this.applicationReady) {
1722
1725
  return Promise.reject(this.#loError.create(errorMessages.sessionNotReady));
1723
1726
  }
1724
- // Supersede in-flight refresh (caller initiated a new one) — reuse the in-progress reload.
1725
- let shouldPostReload = true;
1726
- if (this.#promiseSessionRefresh) {
1727
- clearTimeout(this.#promiseSessionRefresh.timeoutId);
1728
- this.#promiseSessionRefresh.reject(this.#loError.create(errorMessages.sessionRefreshSuperseded));
1729
- this.#promiseSessionRefresh = null;
1730
- shouldPostReload = false;
1731
- }
1732
- return new Promise((resolve, reject) => {
1733
- const timeoutId = window.setTimeout(() => {
1734
- this.#promiseSessionRefresh = null;
1735
- reject(this.#loError.create(errorMessages.sessionRefreshTimeout));
1736
- }, 60_000);
1737
- this.#promiseSessionRefresh = { resolve, reject, timeoutId };
1738
- if (shouldPostReload) {
1739
- this.#loIFrame.postMessage({ type: messages.lo.authReload, id: this._uuid });
1740
- }
1727
+ if (this.#promiseSessionRefresh)
1728
+ return this.#promiseSessionRefresh.promise;
1729
+ let resolveFn;
1730
+ let rejectFn;
1731
+ const promise = new Promise((resolve, reject) => {
1732
+ resolveFn = resolve;
1733
+ rejectFn = reject;
1741
1734
  });
1735
+ // 60s reflects that this posts `lo.auth.reload` and waits for a full iframe
1736
+ // window.location.reload() → SSO redirect chain (frontdoor + IdP handshake + app bootstrap)
1737
+ // before `lo.loaded` returns — legitimately tens of seconds under IdP slowness. The
1738
+ // paired sessionExpiry timeout is shorter because it's a single servlet round-trip.
1739
+ const timeoutId = window.setTimeout(() => {
1740
+ const slot = this.#promiseSessionRefresh;
1741
+ this.#promiseSessionRefresh = null;
1742
+ slot?.reject(this.#loError.create(errorMessages.sessionTimeout));
1743
+ }, 60_000);
1744
+ this.#promiseSessionRefresh = { promise, resolve: resolveFn, reject: rejectFn, timeoutId };
1745
+ this.#loIFrame.postMessage({ type: messages.lo.authReload, id: this._uuid });
1746
+ return promise;
1742
1747
  }
1743
1748
  /**
1744
1749
  * @internal
@@ -1757,7 +1762,7 @@ class LightningOutApplication extends HTMLElement {
1757
1762
  if (msg.error !== undefined)
1758
1763
  slot.reject(this.#loError.create(msg.error));
1759
1764
  else if (msg.ttl === undefined)
1760
- slot.reject(this.#loError.create(errorMessages.sessionExpiryMalformedResponse));
1765
+ slot.reject(this.#loError.create(errorMessages.sessionMalformedResponse));
1761
1766
  else
1762
1767
  slot.resolve(msg.ttl);
1763
1768
  }
@@ -1769,12 +1774,25 @@ class LightningOutApplication extends HTMLElement {
1769
1774
  this.#promiseSessionRefresh = null;
1770
1775
  slot.reject(this.#loError.create(detail));
1771
1776
  }
1777
+ #failPendingExpiry(detail) {
1778
+ const slot = this.#promiseSessionExpiry;
1779
+ if (!slot)
1780
+ return;
1781
+ clearTimeout(slot.timeoutId);
1782
+ this.#promiseSessionExpiry = null;
1783
+ slot.reject(this.#loError.create(detail));
1784
+ }
1785
+ #failAllPending(reason) {
1786
+ this.#failPendingRefresh(reason);
1787
+ this.#failPendingExpiry(reason);
1788
+ }
1772
1789
  #iframeError = (event) => {
1773
1790
  // Reset #isRefreshing so a failed frontdoor-url refresh doesn't leave the flag stuck —
1774
1791
  // otherwise the NEXT successful #iframeLoaded would be misinterpreted as a refresh and
1775
1792
  // skip #initComponents() + lo.application.ready.
1776
1793
  this.#isRefreshing = false;
1777
- this.#failPendingRefresh(event.detail?.message ?? errorMessages.sessionRefreshIframeError);
1794
+ const detail = event.detail?.message;
1795
+ this.#failAllPending(detail ?? errorMessages.sessionIframeError);
1778
1796
  // Notify the user that the application session has failed
1779
1797
  this.#loError.dispatch(events.lo.application.error, event);
1780
1798
  };
@@ -1816,7 +1834,7 @@ class LightningOutApplication extends HTMLElement {
1816
1834
  return false;
1817
1835
  }
1818
1836
  else {
1819
- return !propName.startsWith("_");
1837
+ return !propName.startsWith("_") && !isSyntheticShadowKey(propName);
1820
1838
  }
1821
1839
  };
1822
1840
  _propertyChanged_lwrApplication = (lwrApplication) => {
@@ -1851,16 +1869,13 @@ class LightningOutApplication extends HTMLElement {
1851
1869
  throw this.#loError.create(`Can't set "frontdoor-url" because "org-url" is already set`);
1852
1870
  }
1853
1871
  if (frontdoorUrl === "") {
1872
+ this.#failAllPending(errorMessages.sessionTerminated);
1854
1873
  this.#logout();
1855
1874
  return;
1856
1875
  }
1857
- // Supersede any in-flight sessionRefresh()
1858
- if (this.#promiseSessionRefresh) {
1859
- clearTimeout(this.#promiseSessionRefresh.timeoutId);
1860
- this.#promiseSessionRefresh.reject(this.#loError.create(errorMessages.sessionRefreshSuperseded));
1861
- this.#promiseSessionRefresh = null;
1862
- }
1863
- this.#isRefreshing = this.applicationReady;
1876
+ const hadPendingRefresh = this.#promiseSessionRefresh !== null;
1877
+ this.#failAllPending(errorMessages.sessionTerminated);
1878
+ this.#isRefreshing = this.applicationReady && !hadPendingRefresh;
1864
1879
  this.#login(frontdoorUrl);
1865
1880
  };
1866
1881
  _propertyChanged_sitePrefix = (sitePrefix) => {
@@ -1982,16 +1997,7 @@ class LightningOutApplication extends HTMLElement {
1982
1997
  logger.trace("disconnectedCallback: called", `_uuid: ${this._uuid}`);
1983
1998
  // Reject pending session Promises before #logout() — the navigation it triggers would otherwise
1984
1999
  // resolve a pending refresh that should be terminated.
1985
- if (this.#promiseSessionExpiry) {
1986
- clearTimeout(this.#promiseSessionExpiry.timeoutId);
1987
- this.#promiseSessionExpiry.reject(this.#loError.create(errorMessages.sessionTerminated));
1988
- this.#promiseSessionExpiry = null;
1989
- }
1990
- if (this.#promiseSessionRefresh) {
1991
- clearTimeout(this.#promiseSessionRefresh.timeoutId);
1992
- this.#promiseSessionRefresh.reject(this.#loError.create(errorMessages.sessionTerminated));
1993
- this.#promiseSessionRefresh = null;
1994
- }
2000
+ this.#failAllPending(errorMessages.sessionTerminated);
1995
2001
  // Since disconnectedCallback is called after the DOM has been removed, calling logout and destroying the iframe
1996
2002
  // here may be a moot point, but doing it for completeness.
1997
2003
  this.#logout();
@@ -1,4 +1,4 @@
1
- /*! @salesforce/lightning-out v2.2.5-rc.2 (2026-07-14) */
1
+ /*! @salesforce/lightning-out v2.2.5-rc.4 (2026-08-10) */
2
2
  var LO2 = (function (exports) {
3
3
  'use strict';
4
4
 
@@ -185,11 +185,9 @@ var LO2 = (function (exports) {
185
185
  const logger$4 = new Logger("LightningOutError");
186
186
  const errorMessages = {
187
187
  sessionNotReady: "Session not ready",
188
- sessionRefreshSuperseded: "Session refresh superseded",
189
- sessionRefreshTimeout: "Session refresh timeout",
190
- sessionRefreshIframeError: "Session refresh failed: iframe error",
191
- sessionExpiryTimeout: "Session expiry timeout",
192
- sessionExpiryMalformedResponse: "Malformed sessionExpiry response",
188
+ sessionTimeout: "Session timeout",
189
+ sessionIframeError: "Session failed: iframe error",
190
+ sessionMalformedResponse: "Malformed sessionExpiry response",
193
191
  sessionTerminated: "Session terminated",
194
192
  notSupportedInOrgUrlMode: "Session APIs are not supported in org-url mode",
195
193
  };
@@ -414,6 +412,18 @@ var LO2 = (function (exports) {
414
412
  function isStandardName(name) {
415
413
  return name.includes("/") || name.includes(":");
416
414
  }
415
+ /**
416
+ * Returns true when `propName` is the `@lwc/synthetic-shadow` tag. The polyfill attaches
417
+ * `$$ShadowResolverKey$$` as a function-valued own-prop to every DOM node it touches, and
418
+ * structuredClone rejects it with DataCloneError when the observed property set is posted
419
+ * across the iframe boundary (W-23744109).
420
+ *
421
+ * @param propName - The property name to check
422
+ * @returns True if the property is the synthetic-shadow tag
423
+ */
424
+ function isSyntheticShadowKey(propName) {
425
+ return propName === "$$ShadowResolverKey$$";
426
+ }
417
427
  /**
418
428
  * Applies property transformations and validation callbacks to component
419
429
  * property changes before they are sent to Lightning components.
@@ -1300,7 +1310,7 @@ var LO2 = (function (exports) {
1300
1310
  return false;
1301
1311
  }
1302
1312
  else {
1303
- return !attrName.startsWith("_");
1313
+ return !attrName.startsWith("_") && !isSyntheticShadowKey(attrOrPropName);
1304
1314
  }
1305
1315
  };
1306
1316
  addEventListener(eventName, listener, options) {
@@ -1491,7 +1501,7 @@ var LO2 = (function (exports) {
1491
1501
  url.searchParams.set("parentElementId", parentElementId);
1492
1502
  url.searchParams.set("loAppOrigin", this.config.loAppOrigin);
1493
1503
  // This helps in general but also for cache busting
1494
- url.searchParams.set("loVersion", "2.2.5-rc.2");
1504
+ url.searchParams.set("loVersion", "2.2.5-rc.4");
1495
1505
  if (this.config.appId) {
1496
1506
  url.searchParams.set("appId", this.config.appId);
1497
1507
  }
@@ -1643,9 +1653,10 @@ var LO2 = (function (exports) {
1643
1653
  return this.getRouter().getPageURL(pagePathname, this._uuid);
1644
1654
  }
1645
1655
  // Three paths reach #iframeLoaded:
1646
- // 1. frontdoor-url update (#isRefreshing=true): supersession in _propertyChanged_frontdoorUrl has already
1647
- // cleared #promiseSessionRefresh, so only #isRefreshing needs to be checked.
1648
- // 2. sessionRefresh()-initiated reload (#promiseSessionRefresh set): resolve and skip initial-auth bookkeeping.
1656
+ // 1. frontdoor-url update (#isRefreshing=true): _propertyChanged_frontdoorUrl has already failed any pending
1657
+ // sessionRefresh via #failAllPending, so only #isRefreshing needs to be checked here.
1658
+ // 2. sessionRefresh()-initiated reload (#promiseSessionRefresh set): coalesced callers share this slot;
1659
+ // resolve it and skip initial-auth bookkeeping.
1649
1660
  // 3. Initial auth (neither flag set): existing behavior.
1650
1661
  #iframeLoaded = (event) => {
1651
1662
  this.applicationReady = true;
@@ -1688,33 +1699,25 @@ var LO2 = (function (exports) {
1688
1699
  if (!this.applicationReady) {
1689
1700
  return Promise.reject(this.#loError.create(errorMessages.sessionNotReady));
1690
1701
  }
1691
- if (this.#promiseSessionExpiry) {
1692
- // coalesce concurrent callers onto the same in-flight Promise
1693
- return new Promise((resolve, reject) => {
1694
- const slot = this.#promiseSessionExpiry;
1695
- const prevResolve = slot.resolve;
1696
- const prevReject = slot.reject;
1697
- slot.resolve = (n) => {
1698
- prevResolve(n);
1699
- resolve(n);
1700
- };
1701
- slot.reject = (e) => {
1702
- prevReject(e);
1703
- reject(e);
1704
- };
1705
- });
1706
- }
1707
- return new Promise((resolve, reject) => {
1708
- const timeoutId = window.setTimeout(() => {
1709
- // Read slot.reject (the chained wrapper) at fire time — the local `reject` only
1710
- // resolves the first caller, while coalesced callers are reachable via slot.reject.
1711
- const slot = this.#promiseSessionExpiry;
1712
- this.#promiseSessionExpiry = null;
1713
- slot?.reject(this.#loError.create(errorMessages.sessionExpiryTimeout));
1714
- }, 30_000);
1715
- this.#promiseSessionExpiry = { resolve, reject, timeoutId };
1716
- this.#loIFrame.postMessage({ type: messages.lo.sessionExpiry, id: this._uuid });
1702
+ if (this.#promiseSessionExpiry)
1703
+ return this.#promiseSessionExpiry.promise;
1704
+ let resolveFn;
1705
+ let rejectFn;
1706
+ const promise = new Promise((resolve, reject) => {
1707
+ resolveFn = resolve;
1708
+ rejectFn = reject;
1717
1709
  });
1710
+ // 30s covers a single postMessage round-trip to SessionTimeServlet via the auth iframe —
1711
+ // generous headroom for a stable channel; the paired sessionRefresh timeout is longer
1712
+ // because it drives a full SSO/IdP redirect chain (see #promiseSessionRefresh setTimeout).
1713
+ const timeoutId = window.setTimeout(() => {
1714
+ const slot = this.#promiseSessionExpiry;
1715
+ this.#promiseSessionExpiry = null;
1716
+ slot?.reject(this.#loError.create(errorMessages.sessionTimeout));
1717
+ }, 30_000);
1718
+ this.#promiseSessionExpiry = { promise, resolve: resolveFn, reject: rejectFn, timeoutId };
1719
+ this.#loIFrame.postMessage({ type: messages.lo.sessionExpiry, id: this._uuid });
1720
+ return promise;
1718
1721
  }
1719
1722
  sessionRefresh() {
1720
1723
  // org-url mode has no auth iframe to reload — fast-fail rather than hang.
@@ -1724,24 +1727,26 @@ var LO2 = (function (exports) {
1724
1727
  if (!this.applicationReady) {
1725
1728
  return Promise.reject(this.#loError.create(errorMessages.sessionNotReady));
1726
1729
  }
1727
- // Supersede in-flight refresh (caller initiated a new one) — reuse the in-progress reload.
1728
- let shouldPostReload = true;
1729
- if (this.#promiseSessionRefresh) {
1730
- clearTimeout(this.#promiseSessionRefresh.timeoutId);
1731
- this.#promiseSessionRefresh.reject(this.#loError.create(errorMessages.sessionRefreshSuperseded));
1732
- this.#promiseSessionRefresh = null;
1733
- shouldPostReload = false;
1734
- }
1735
- return new Promise((resolve, reject) => {
1736
- const timeoutId = window.setTimeout(() => {
1737
- this.#promiseSessionRefresh = null;
1738
- reject(this.#loError.create(errorMessages.sessionRefreshTimeout));
1739
- }, 60_000);
1740
- this.#promiseSessionRefresh = { resolve, reject, timeoutId };
1741
- if (shouldPostReload) {
1742
- this.#loIFrame.postMessage({ type: messages.lo.authReload, id: this._uuid });
1743
- }
1730
+ if (this.#promiseSessionRefresh)
1731
+ return this.#promiseSessionRefresh.promise;
1732
+ let resolveFn;
1733
+ let rejectFn;
1734
+ const promise = new Promise((resolve, reject) => {
1735
+ resolveFn = resolve;
1736
+ rejectFn = reject;
1744
1737
  });
1738
+ // 60s reflects that this posts `lo.auth.reload` and waits for a full iframe
1739
+ // window.location.reload() → SSO redirect chain (frontdoor + IdP handshake + app bootstrap)
1740
+ // before `lo.loaded` returns — legitimately tens of seconds under IdP slowness. The
1741
+ // paired sessionExpiry timeout is shorter because it's a single servlet round-trip.
1742
+ const timeoutId = window.setTimeout(() => {
1743
+ const slot = this.#promiseSessionRefresh;
1744
+ this.#promiseSessionRefresh = null;
1745
+ slot?.reject(this.#loError.create(errorMessages.sessionTimeout));
1746
+ }, 60_000);
1747
+ this.#promiseSessionRefresh = { promise, resolve: resolveFn, reject: rejectFn, timeoutId };
1748
+ this.#loIFrame.postMessage({ type: messages.lo.authReload, id: this._uuid });
1749
+ return promise;
1745
1750
  }
1746
1751
  /**
1747
1752
  * @internal
@@ -1760,7 +1765,7 @@ var LO2 = (function (exports) {
1760
1765
  if (msg.error !== undefined)
1761
1766
  slot.reject(this.#loError.create(msg.error));
1762
1767
  else if (msg.ttl === undefined)
1763
- slot.reject(this.#loError.create(errorMessages.sessionExpiryMalformedResponse));
1768
+ slot.reject(this.#loError.create(errorMessages.sessionMalformedResponse));
1764
1769
  else
1765
1770
  slot.resolve(msg.ttl);
1766
1771
  }
@@ -1772,12 +1777,25 @@ var LO2 = (function (exports) {
1772
1777
  this.#promiseSessionRefresh = null;
1773
1778
  slot.reject(this.#loError.create(detail));
1774
1779
  }
1780
+ #failPendingExpiry(detail) {
1781
+ const slot = this.#promiseSessionExpiry;
1782
+ if (!slot)
1783
+ return;
1784
+ clearTimeout(slot.timeoutId);
1785
+ this.#promiseSessionExpiry = null;
1786
+ slot.reject(this.#loError.create(detail));
1787
+ }
1788
+ #failAllPending(reason) {
1789
+ this.#failPendingRefresh(reason);
1790
+ this.#failPendingExpiry(reason);
1791
+ }
1775
1792
  #iframeError = (event) => {
1776
1793
  // Reset #isRefreshing so a failed frontdoor-url refresh doesn't leave the flag stuck —
1777
1794
  // otherwise the NEXT successful #iframeLoaded would be misinterpreted as a refresh and
1778
1795
  // skip #initComponents() + lo.application.ready.
1779
1796
  this.#isRefreshing = false;
1780
- this.#failPendingRefresh(event.detail?.message ?? errorMessages.sessionRefreshIframeError);
1797
+ const detail = event.detail?.message;
1798
+ this.#failAllPending(detail ?? errorMessages.sessionIframeError);
1781
1799
  // Notify the user that the application session has failed
1782
1800
  this.#loError.dispatch(events.lo.application.error, event);
1783
1801
  };
@@ -1819,7 +1837,7 @@ var LO2 = (function (exports) {
1819
1837
  return false;
1820
1838
  }
1821
1839
  else {
1822
- return !propName.startsWith("_");
1840
+ return !propName.startsWith("_") && !isSyntheticShadowKey(propName);
1823
1841
  }
1824
1842
  };
1825
1843
  _propertyChanged_lwrApplication = (lwrApplication) => {
@@ -1854,16 +1872,13 @@ var LO2 = (function (exports) {
1854
1872
  throw this.#loError.create(`Can't set "frontdoor-url" because "org-url" is already set`);
1855
1873
  }
1856
1874
  if (frontdoorUrl === "") {
1875
+ this.#failAllPending(errorMessages.sessionTerminated);
1857
1876
  this.#logout();
1858
1877
  return;
1859
1878
  }
1860
- // Supersede any in-flight sessionRefresh()
1861
- if (this.#promiseSessionRefresh) {
1862
- clearTimeout(this.#promiseSessionRefresh.timeoutId);
1863
- this.#promiseSessionRefresh.reject(this.#loError.create(errorMessages.sessionRefreshSuperseded));
1864
- this.#promiseSessionRefresh = null;
1865
- }
1866
- this.#isRefreshing = this.applicationReady;
1879
+ const hadPendingRefresh = this.#promiseSessionRefresh !== null;
1880
+ this.#failAllPending(errorMessages.sessionTerminated);
1881
+ this.#isRefreshing = this.applicationReady && !hadPendingRefresh;
1867
1882
  this.#login(frontdoorUrl);
1868
1883
  };
1869
1884
  _propertyChanged_sitePrefix = (sitePrefix) => {
@@ -1985,16 +2000,7 @@ var LO2 = (function (exports) {
1985
2000
  logger.trace("disconnectedCallback: called", `_uuid: ${this._uuid}`);
1986
2001
  // Reject pending session Promises before #logout() — the navigation it triggers would otherwise
1987
2002
  // resolve a pending refresh that should be terminated.
1988
- if (this.#promiseSessionExpiry) {
1989
- clearTimeout(this.#promiseSessionExpiry.timeoutId);
1990
- this.#promiseSessionExpiry.reject(this.#loError.create(errorMessages.sessionTerminated));
1991
- this.#promiseSessionExpiry = null;
1992
- }
1993
- if (this.#promiseSessionRefresh) {
1994
- clearTimeout(this.#promiseSessionRefresh.timeoutId);
1995
- this.#promiseSessionRefresh.reject(this.#loError.create(errorMessages.sessionTerminated));
1996
- this.#promiseSessionRefresh = null;
1997
- }
2003
+ this.#failAllPending(errorMessages.sessionTerminated);
1998
2004
  // Since disconnectedCallback is called after the DOM has been removed, calling logout and destroying the iframe
1999
2005
  // here may be a moot point, but doing it for completeness.
2000
2006
  this.#logout();
@@ -1,10 +1,10 @@
1
- /*! @salesforce/lightning-out v2.2.5-rc.2 (2026-07-14) */
2
- var LO2=function(e){"use strict";const t={error:0,warn:1,info:2,debug:3,trace:4};class r{static#e="LO2";static#t="error";#r;static set level(e){this.#t=e}static set prefix(e){this.#e=e}get brand(){return`${r.#e}:${this.#r}:`}constructor(e){this.#r="string"==typeof e?e:e.constructor?.name}error(...e){t.error<=t[r.#t]&&console.error(this.brand,...e)}warn(...e){t.warn<=t[r.#t]&&console.warn(this.brand,...e)}info(...e){t.info<=t[r.#t]&&console.info(this.brand,...e)}debug(...e){t.debug<=t[r.#t]&&console.debug(this.brand,...e)}trace(...e){t.trace<=t[r.#t]&&console.trace(this.brand,...e)}}function i(){return Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}const s={application:{ready:"lo.application.ready",error:"lo.application.error",logout:"lo.application.logout",auth:{redirect:"lo.application.auth.redirect"},session:{refresh:"lo.application.session.refresh"}},component:{ready:"lo.component.ready",error:"lo.component.error"},iframe:{load:"lo.iframe.load",error:"lo.iframe.error",logout:"lo.iframe.logout",auth:{redirect:"lo.iframe.auth.redirect"}}},o={addEventListener:"lo.addEventListener",authReload:"lo.auth.reload",dispatchEvent:"lo.dispatchEvent",error:"lo.error",getComponentData:"lo.getComponentData",loaded:"lo.loaded",logout:"lo.logout",ready:"lo.ready",redirect:"lo.redirect",removeEventListener:"lo.removeEventListener",resize:"lo.resize",sessionExpiry:"lo.sessionExpiry",sessionExpiryResponse:"lo.sessionExpiry.response",setComponentData:"lo.setComponentData",setComponentProps:"lo.setComponentProps"},n=new r("LightningOutError"),a="Session not ready",h="Session refresh superseded",l="Session refresh timeout",c="Session refresh failed: iframe error",p="Session expiry timeout",d="Malformed sessionExpiry response",m="Session terminated",u="Session APIs are not supported in org-url mode";class g{#i;#r;constructor(e){this.#r="string"==typeof e?e:e.constructor?.name,"function"==typeof e.dispatchEvent&&(this.#i=e)}#s(e){return`${this.#r}: ${e}`}create(e){const t="string"==typeof e?e:e.message;return new Error(this.#s(t))}dispatch(e,t){const r="string"==typeof t?t:t.message||t.detail?.message;if(this.#i){const i=t.detail||{message:this.#s(r),originalError:t},s=new CustomEvent(e,{detail:i});this.#i.dispatchEvent(s),n.error(`${this.#s("dispatched error")} -> ${e}: ${r}`)}else n.error(`${this.#s("unable to dispatch error on a non-EventTarget object")} -> ${e}: ${r}`)}}const f=new g("LightningOutUtils");function v(e){return e.replace(/([A-Z])/g,"-$1").toLowerCase()}function w(e,t=!1){if(/[A-Z]/.test(e))throw f.create(`elementNameToStandardName: "${e}" is not a valid custom element name - must be all lowercase.`);const r=e.indexOf("-");if(-1===r)throw f.create(`elementNameToStandardName: "${e}" is not a valid custom element name - missing hyphen character.`);return`${function(e){if(/[A-Z]/.test(e))throw f.create(`snakeToCamel: "${e}" is not valid snake_case - must be all lowercase.`);return e.replace(/_([a-z_])/g,(e,t)=>t.toUpperCase())}(e.slice(0,r))}${t?":":"/"}${function(e){if(/[A-Z]/.test(e))throw f.create(`kebabToCamel: "${e}" is not valid kebab-case - must be all lowercase.`);return e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}(e.slice(r+1))}`}function b(e,t){const r=Object.entries(t).map(t=>{let[r,i]=t;const s=r.split("dataMirror");2===s.length&&""===s[0]&&(r=s[1].charAt(0).toLowerCase()+s[1].slice(1));const o=`_propertyChanged_${r}`;if("function"==typeof e[o]){i=(0,e[o])(i)}return[r,i]});return Object.fromEntries(r)}const E=new r("LightningOutIFrame");class y{#o;#n;#a;#h="display:none";#l="border:0px; width:100%; height:100%; overflow:auto;";#c;#p;#d;#m;#u;#g;constructor(e){this.#o=e.parentElement,this.#n=e.parentElement instanceof $,this.#a=new g(e.parentElement)}get iframeReady(){return!!this.#d&&!!this.#m}get iframeElement(){return this.#p}#f(e,t){this.#d=e,this.#m=t}#v=e=>{if(e.data.id===this.#o._uuid)switch(E.debug("#messageListener:",`parentElement._uuid: ${this.#o._uuid}`,`parentElement.localName: ${this.#o.localName}`,JSON.stringify(e.data)),e.data.type){case o.loaded:{this.#g=clearTimeout(this.#g),this.#f(e.source,e.origin);const t=e.data.lightningDomain;this.#o.dispatchEvent(new CustomEvent(s.iframe.load,{detail:{origin:e.origin,lightningDomain:t}}));break}case o.logout:this.#g=clearTimeout(this.#g),this.#o.dispatchEvent(new CustomEvent(s.iframe.logout));break;case o.redirect:this.#g=clearTimeout(this.#g),this.#o.dispatchEvent(new CustomEvent(s.iframe.auth.redirect,{detail:{redirectUrl:e.data.redirectUrl,redirectOrigin:e.origin}}));break;case o.resize:break;case o.sessionExpiryResponse:this.#o instanceof k&&this.#o._handleSessionExpiryResponse(e.data)}};#w(e){this.#p&&this.#n&&(this.#p.style.height=`${e}px`,E.debug(`#handleResize: applied height ${e}px to iframe`))}#b(){if(!this.#p){const e=window.document.createElement("iframe");e.name="lightning_af",e.setAttribute("sandbox",["allow-downloads","allow-forms","allow-popups","allow-same-origin","allow-scripts","allow-top-navigation-by-user-activation"].join(" ")),e.style.cssText=this.#n?this.#l:this.#h,this.#p=e,this.#c=this.#o.attachShadow({mode:"closed"}),this.#c.appendChild(this.#p),e.addEventListener("load",this.#E),window.addEventListener("message",this.#v)}return this.#p}load(e){const t=this.#b();this.#u=new URL(e),E.debug("#loadIframe: endpoint =",function(e){const t={},r=e=>{const t={};for(const[r,i]of e.entries())t[r]=i;return t};if(t.url=e.origin+e.pathname,t.urlParams=r(e.searchParams),"/secur/frontdoor.jsp"===e.pathname){const e=t.urlParams.otp?"startURL":"retURL",i=new URL(t.urlParams[e],"http://dummy.com");t.urlParams[e]={url:i.pathname,urlParams:r(i.searchParams)}}return t}(this.#u)),this.#f(void 0,void 0),this.#n?t.src=e:localStorage.getItem("LightningOutIFrame:load:window.open")?window.open(e,`LO2 Hidden ${this.#o._uuid}`,"left=200,top=200,width=800,height=800"):t.src=e}#E=()=>{this.#g&&clearTimeout(this.#g),this.#g=setTimeout(()=>{if(!this.iframeReady){const e="Error: Unknown error, unable to load the iframe.";this.#a.dispatch(s.iframe.error,e),this.#y(e)}},6e4)};destroy(){this.#c&&(this.#c.innerHTML=""),this.#p&&this.#p.remove(),this.#c=void 0,this.#p=void 0,this.#f(void 0,void 0)}#y(e){if(this.#n&&this.#u){const t=new URL("/lightning/lightning.out.message.html",this.#u.origin);t.search=new URLSearchParams({loAppOrigin:window.location.origin,parentElementId:this.#o._uuid,message:e}).toString(),this.load(t.href)}}postMessage(e){if(!this.#d||!this.#m)throw this.#a.create("Error attempting to postMessage on an iframe that is not ready.");E.debug("postMessage:",`parentElement: ${this.#o._uuid}`,JSON.stringify(e));try{this.#d.postMessage(e,this.#m)}catch(e){const t=`postMessage error: ${e}`;throw this.#a.dispatch(s.iframe.error,t),this.#a.create(t)}}}
1
+ /*! @salesforce/lightning-out v2.2.5-rc.4 (2026-08-10) */
2
+ var LO2=function(e){"use strict";const t={error:0,warn:1,info:2,debug:3,trace:4};class r{static#e="LO2";static#t="error";#r;static set level(e){this.#t=e}static set prefix(e){this.#e=e}get brand(){return`${r.#e}:${this.#r}:`}constructor(e){this.#r="string"==typeof e?e:e.constructor?.name}error(...e){t.error<=t[r.#t]&&console.error(this.brand,...e)}warn(...e){t.warn<=t[r.#t]&&console.warn(this.brand,...e)}info(...e){t.info<=t[r.#t]&&console.info(this.brand,...e)}debug(...e){t.debug<=t[r.#t]&&console.debug(this.brand,...e)}trace(...e){t.trace<=t[r.#t]&&console.trace(this.brand,...e)}}function i(){return Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}const s={application:{ready:"lo.application.ready",error:"lo.application.error",logout:"lo.application.logout",auth:{redirect:"lo.application.auth.redirect"},session:{refresh:"lo.application.session.refresh"}},component:{ready:"lo.component.ready",error:"lo.component.error"},iframe:{load:"lo.iframe.load",error:"lo.iframe.error",logout:"lo.iframe.logout",auth:{redirect:"lo.iframe.auth.redirect"}}},o={addEventListener:"lo.addEventListener",authReload:"lo.auth.reload",dispatchEvent:"lo.dispatchEvent",error:"lo.error",getComponentData:"lo.getComponentData",loaded:"lo.loaded",logout:"lo.logout",ready:"lo.ready",redirect:"lo.redirect",removeEventListener:"lo.removeEventListener",resize:"lo.resize",sessionExpiry:"lo.sessionExpiry",sessionExpiryResponse:"lo.sessionExpiry.response",setComponentData:"lo.setComponentData",setComponentProps:"lo.setComponentProps"},n=new r("LightningOutError"),a="Session not ready",h="Session timeout",l="Session failed: iframe error",c="Malformed sessionExpiry response",d="Session terminated",p="Session APIs are not supported in org-url mode";class m{#i;#r;constructor(e){this.#r="string"==typeof e?e:e.constructor?.name,"function"==typeof e.dispatchEvent&&(this.#i=e)}#s(e){return`${this.#r}: ${e}`}create(e){const t="string"==typeof e?e:e.message;return new Error(this.#s(t))}dispatch(e,t){const r="string"==typeof t?t:t.message||t.detail?.message;if(this.#i){const i=t.detail||{message:this.#s(r),originalError:t},s=new CustomEvent(e,{detail:i});this.#i.dispatchEvent(s),n.error(`${this.#s("dispatched error")} -> ${e}: ${r}`)}else n.error(`${this.#s("unable to dispatch error on a non-EventTarget object")} -> ${e}: ${r}`)}}const u=new m("LightningOutUtils");function g(e){return e.replace(/([A-Z])/g,"-$1").toLowerCase()}function f(e,t=!1){if(/[A-Z]/.test(e))throw u.create(`elementNameToStandardName: "${e}" is not a valid custom element name - must be all lowercase.`);const r=e.indexOf("-");if(-1===r)throw u.create(`elementNameToStandardName: "${e}" is not a valid custom element name - missing hyphen character.`);return`${function(e){if(/[A-Z]/.test(e))throw u.create(`snakeToCamel: "${e}" is not valid snake_case - must be all lowercase.`);return e.replace(/_([a-z_])/g,(e,t)=>t.toUpperCase())}(e.slice(0,r))}${t?":":"/"}${function(e){if(/[A-Z]/.test(e))throw u.create(`kebabToCamel: "${e}" is not valid kebab-case - must be all lowercase.`);return e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}(e.slice(r+1))}`}function v(e){return"$$ShadowResolverKey$$"===e}function w(e,t){const r=Object.entries(t).map(t=>{let[r,i]=t;const s=r.split("dataMirror");2===s.length&&""===s[0]&&(r=s[1].charAt(0).toLowerCase()+s[1].slice(1));const o=`_propertyChanged_${r}`;if("function"==typeof e[o]){i=(0,e[o])(i)}return[r,i]});return Object.fromEntries(r)}const b=new r("LightningOutIFrame");class E{#o;#n;#a;#h="display:none";#l="border:0px; width:100%; height:100%; overflow:auto;";#c;#d;#p;#m;#u;#g;constructor(e){this.#o=e.parentElement,this.#n=e.parentElement instanceof O,this.#a=new m(e.parentElement)}get iframeReady(){return!!this.#p&&!!this.#m}get iframeElement(){return this.#d}#f(e,t){this.#p=e,this.#m=t}#v=e=>{if(e.data.id===this.#o._uuid)switch(b.debug("#messageListener:",`parentElement._uuid: ${this.#o._uuid}`,`parentElement.localName: ${this.#o.localName}`,JSON.stringify(e.data)),e.data.type){case o.loaded:{this.#g=clearTimeout(this.#g),this.#f(e.source,e.origin);const t=e.data.lightningDomain;this.#o.dispatchEvent(new CustomEvent(s.iframe.load,{detail:{origin:e.origin,lightningDomain:t}}));break}case o.logout:this.#g=clearTimeout(this.#g),this.#o.dispatchEvent(new CustomEvent(s.iframe.logout));break;case o.redirect:this.#g=clearTimeout(this.#g),this.#o.dispatchEvent(new CustomEvent(s.iframe.auth.redirect,{detail:{redirectUrl:e.data.redirectUrl,redirectOrigin:e.origin}}));break;case o.resize:break;case o.sessionExpiryResponse:this.#o instanceof k&&this.#o._handleSessionExpiryResponse(e.data)}};#w(e){this.#d&&this.#n&&(this.#d.style.height=`${e}px`,b.debug(`#handleResize: applied height ${e}px to iframe`))}#b(){if(!this.#d){const e=window.document.createElement("iframe");e.name="lightning_af",e.setAttribute("sandbox",["allow-downloads","allow-forms","allow-popups","allow-same-origin","allow-scripts","allow-top-navigation-by-user-activation"].join(" ")),e.style.cssText=this.#n?this.#l:this.#h,this.#d=e,this.#c=this.#o.attachShadow({mode:"closed"}),this.#c.appendChild(this.#d),e.addEventListener("load",this.#E),window.addEventListener("message",this.#v)}return this.#d}load(e){const t=this.#b();this.#u=new URL(e),b.debug("#loadIframe: endpoint =",function(e){const t={},r=e=>{const t={};for(const[r,i]of e.entries())t[r]=i;return t};if(t.url=e.origin+e.pathname,t.urlParams=r(e.searchParams),"/secur/frontdoor.jsp"===e.pathname){const e=t.urlParams.otp?"startURL":"retURL",i=new URL(t.urlParams[e],"http://dummy.com");t.urlParams[e]={url:i.pathname,urlParams:r(i.searchParams)}}return t}(this.#u)),this.#f(void 0,void 0),this.#n?t.src=e:localStorage.getItem("LightningOutIFrame:load:window.open")?window.open(e,`LO2 Hidden ${this.#o._uuid}`,"left=200,top=200,width=800,height=800"):t.src=e}#E=()=>{this.#g&&clearTimeout(this.#g),this.#g=setTimeout(()=>{if(!this.iframeReady){const e="Error: Unknown error, unable to load the iframe.";this.#a.dispatch(s.iframe.error,e),this.#y(e)}},6e4)};destroy(){this.#c&&(this.#c.innerHTML=""),this.#d&&this.#d.remove(),this.#c=void 0,this.#d=void 0,this.#f(void 0,void 0)}#y(e){if(this.#n&&this.#u){const t=new URL("/lightning/lightning.out.message.html",this.#u.origin);t.search=new URLSearchParams({loAppOrigin:window.location.origin,parentElementId:this.#o._uuid,message:e}).toString(),this.load(t.href)}}postMessage(e){if(!this.#p||!this.#m)throw this.#a.create("Error attempting to postMessage on an iframe that is not ready.");b.debug("postMessage:",`parentElement: ${this.#o._uuid}`,JSON.stringify(e));try{this.#p.postMessage(e,this.#m)}catch(e){const t=`postMessage error: ${e}`;throw this.#a.dispatch(s.iframe.error,t),this.#a.create(t)}}}
3
3
  /**
4
4
  * @file property-observer.ts
5
5
  * @author Caridy Patiño (2025)
6
6
  * @license MIT
7
7
  * @description Provides the PropertyObserver class, a utility to observe property and attribute
8
8
  * changes on any DOM element, with automatic getter/setter interception and batched notifications.
9
- */const _=new r("PropertyObserver");class C{_el;_cb;_cache;_shouldObserve;_interceptedProps;_originalDescriptors;_observer;_changesPending;_pendingChanges;_attributeExceptions=new Map([["for","htmlFor"],["class","className"],["formnovalidate","formNoValidate"],["readonly","readOnly"],["maxlength","maxLength"],["minlength","minLength"],["contenteditable","contentEditable"],["spellcheck","spellcheck"],["novalidate","noValidate"],["autofocus","autofocus"],["autocomplete","autocomplete"],["crossorigin","crossOrigin"]]);constructor(e,t,r){if(!(e instanceof Element))throw new TypeError("Target must be a DOM Element");if("function"!=typeof t)throw new TypeError("Callback must be a function");if(r&&"function"!=typeof r)throw new TypeError("shouldObserve callback must be a function");this._el=e,this._cb=t,this._cache=new Map,this._shouldObserve=r||((e,t)=>!1===t),this._interceptedProps=new Set,this._originalDescriptors=new Map,this._changesPending=!1,this._pendingChanges={},this._initialScan(),this._setupMutationObserver()}disconnect(){this._observer&&this._observer.disconnect();for(const[e,t]of this._originalDescriptors)Object.defineProperty(this._el,e,t);this._cache.clear(),this._interceptedProps.clear(),this._originalDescriptors.clear(),this._pendingChanges={},this._changesPending=!1}_initialScan(){const e={};for(const t of Array.from(this._el.attributes)){const r=t.name,i=this._isStandardAttribute(r);if(!this._shouldObserve(r,i))continue;const s=this._attributeNameToPropName(r),o=t.value;e[s]=o,this._cache.set(s,o),this._installPropertyInterceptor(s)}for(const t of Object.getOwnPropertyNames(this._el)){const r=this._isStandardProperty(t);if(this._cache.has(t)||!this._shouldObserve(t,r))continue;const i=this._el[t];e[t]=i,this._cache.set(t,i),this._installPropertyInterceptor(t)}if(Object.keys(e).length>0)try{this._cb(e)}catch(e){_.error("Error in initial PropertyObserver callback:",e)}}_setupMutationObserver(){this._observer=new MutationObserver(e=>{const t={};for(const r of e)if("attributes"===r.type&&r.attributeName){const e=r.attributeName,i=this._isStandardAttribute(e);if(!this._shouldObserve(e,i))continue;const s=this._attributeNameToPropName(e),o=this._el.getAttribute(e);o!==this._cache.get(s)&&(t[s]=o,this._cache.set(s,o),this._interceptedProps.has(s)||this._installPropertyInterceptor(s))}Object.keys(t).length>0&&this._batchChanges(t)}),this._observer.observe(this._el,{attributes:!0,attributeOldValue:!1})}_installPropertyInterceptor(e){if(this._interceptedProps.has(e))return;const t=Object.getOwnPropertyDescriptor(this._el,e)||{value:this._el[e],writable:!0,enumerable:!0,configurable:!0};this._originalDescriptors.set(e,t);const r={enumerable:t.enumerable,configurable:t.configurable,get:t.get||(()=>t.value),set:r=>{r!==this._cache.get(e)&&(t.set?t.set.call(this._el,r):t.value=r,this._cache.set(e,r),this._batchChanges({[e]:r}))}};Object.defineProperty(this._el,e,r),this._interceptedProps.add(e)}_batchChanges(e){Object.assign(this._pendingChanges,e),this._changesPending||(this._changesPending=!0,queueMicrotask(()=>{this._changesPending=!1;const e={...this._pendingChanges};this._pendingChanges={};try{this._cb(e)}catch(e){_.error("Error in PropertyObserver callback:",e)}}))}_attributeNameToPropName(e){return this._attributeExceptions.has(e)?this._attributeExceptions.get(e):e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}_isStandardAttribute(e){if(e.startsWith("data-")||e.startsWith("aria-")||e.startsWith("on"))return!0;const t=this._attributeNameToPropName(e);return this._isStandardProperty(t)}_isStandardProperty(e){return e in HTMLElement.prototype}}const R=new class{#_=new g("LightningOutRegistry");appToComps=new WeakMap;compToApp=new WeakMap;compNameToApp=new Map;registerApplication(e){this.appToComps.has(e)||this.appToComps.set(e,new Set)}registerComponentName(e,t){if(this.compNameToApp.has(e))throw this.#_.create(`"${e}" is already registered to another App.`);this.compNameToApp.set(e,t)}registerComponent(e,t){if(this.compToApp.has(e))throw this.#_.create("This Comp is already registered to another App.");let r=t;if(!r){const t=e.localName;if(r=this.compNameToApp.get(t),!r)throw this.#_.create(`Could not find a parent App for component "${e.localName}"`)}return this.appToComps.get(r).add(e),this.compToApp.set(e,r),r}unregisterComponent(e){const t=this.compToApp.get(e);if(!t)return!1;const r=this.appToComps.get(t);return r?.delete(e),this.compToApp.delete(e),!0}getComps(e){const t=this.appToComps.get(e);if(!t)throw this.#_.create("Unable to find set of LightningOutComponents");return t}},S=new r("LightningOutComponent"),L=new Set(["autocapitalize","autocorrect","dir","enterkeyhint","inputmode","lang","spellcheck","style","title","translate"]),P=new Set(["aria-disabled","aria-hidden","aria-label","aria-live","aria-modal","aria-pressed","aria-valuemax","aria-valuemin","aria-valuenow"]),A=new Set(["accesskey","autofocus","draggable","exportparts","hidden","inert","nonce","part","slot","tabindex"]),O=new Set(["aria-activedescendant","aria-controls","aria-describedby","aria-details","aria-errormessage","aria-flowto","aria-labelledby","aria-owns"]);class $ extends HTMLElement{_uuid=i();componentReady=!1;_standardName=w(this.localName);#C;#_=new g(this);#R=new y({parentElement:this});#S;#L=!0;#P=[];#A=new WeakMap;#O=0;constructor(){super(),S.trace("constructor: called",`_uuid: ${this._uuid}`)}_getComponentURL(){const e=this.#C;if(!e)throw this.#_.create("Undefined parent App!");return e._getComponentURL(this._standardName,this._uuid)}_init(){this.componentReady||this.#R.load(this._getComponentURL().href)}#v=e=>{if(e.data.id===this._uuid)switch(S.debug("#messageListener:",`this._uuid: ${this._uuid}`,`this._standardName: ${this._standardName}`,`event.data: ${JSON.stringify(e.data)}`),e.data.type){case o.ready:for(this.componentReady=!0;this.#P.length;){const e=this.#P.shift();e&&("add"===e.type?this.addEventListener(...e.args):"remove"===e.type?this.removeEventListener(...e.args):"dispatch"===e.type&&this.dispatchEvent(e.event))}super.dispatchEvent(new CustomEvent(s.component.ready));break;case o.getComponentData:this.#S=new C(this,this.#$,this.#U);break;case o.dispatchEvent:{const t=new CustomEvent(e.data.name,{detail:e.data.detail});super.dispatchEvent(t);break}case o.error:this.#_.dispatch(s.component.error,e.data.error);break;default:S.info("#messageListener:","Unknown message received:",{"event.data":e.data})}};_propertyChanged_style=e=>{const t=this.style,r=[];for(let e=0;e<t.length;e+=1){const i=t.item(e);i.startsWith("--")&&r.push(`${i}:${t.getPropertyValue(i)}`)}return r.join(";")};#$=e=>{const t=b(this,e);S.debug("#propObserverCallback:",{changes:e,propsToSend:t}),this.#L?(this.#L=!1,this.#R.postMessage({type:o.setComponentData,componentData:{id:this._uuid,name:this._standardName,props:t}})):this.#R.postMessage({type:o.setComponentProps,componentProps:t})};#U=(e,t)=>{const r=v(e);return S.debug("#shouldObserveCallback:",{attrOrPropName:e,attrName:r,isStandard:t}),t?!(!L.has(r)&&!P.has(r))||(A.has(r)||O.has(r)||r.startsWith("on")?(S.warn(`"${r}" will not be mirrored.`),!1):!!r.startsWith("data-mirror-")||(S.warn(`"${r}" will not be mirrored.`),!1)):!r.startsWith("_")};addEventListener(e,t,r){if(e===s.component.ready&&this.componentReady){const e=new CustomEvent(s.component.ready);queueMicrotask(()=>{"function"==typeof t?t.call(this,e):t.handleEvent(e)})}if(e.startsWith("lo."))return void super.addEventListener(e,t,r);let i=this.#A.get(t);i||(i=`${e}_${this.#O++}`,this.#A.set(t,i)),this.componentReady?(super.addEventListener(...arguments),this.#R.postMessage({name:e,options:r,listenerKey:i,type:o.addEventListener})):(this.#P.push({type:"add",args:[e,t,r]}),S.debug("addEventListener:","#eventQueue pushed add args:",[e,t,r]))}dispatchEvent(e){if(e.type.startsWith("lo."))return S.debug(`dispatchEvent: dispatching event "${e.type}" to this Element only`),super.dispatchEvent(e);if(this.componentReady){S.debug(`dispatchEvent: dispatching event "${e.type}" to this Element and embedded Element inside the iframe`);const t=super.dispatchEvent(e);return this.#R.postMessage({name:e.type,detail:e.detail||{},type:o.dispatchEvent}),t}return S.debug(`dispatchEvent: component not ready, queueing event "${e.type}"`),this.#P.push({type:"dispatch",event:e}),!0}removeEventListener(e,t,r){if(e.startsWith("lo."))return void super.removeEventListener(...arguments);const i=this.#A.get(t);this.componentReady?(super.removeEventListener(...arguments),this.#R.postMessage({name:e,options:r,listenerKey:i,type:o.removeEventListener})):(this.#P.push({type:"remove",args:[e,t,r]}),S.debug("removeEventListener:","#eventQueue pushed remove args:",[e,t,r])),i&&this.#A.delete(t)}adoptedCallback(){throw this.remove(),this.#_.create("This component cannot be rerendered for security reasons.")}connectedCallback(){if(S.trace("connectedCallback: called",`_uuid: ${this._uuid}`),window.addEventListener("message",this.#v),this.hasChildNodes())throw this.#_.create("Should not have child nodes");this.style.display||="block",this.style.width||="100%",this.style.height||="100%",this.#C=R.registerComponent(this),this._standardName=this.#C._getComponentStandardName(this),this.#C.applicationReady&&this._init()}disconnectedCallback(){S.trace("disconnectedCallback: called",`_uuid: ${this._uuid}`),this.#R.destroy(),window.removeEventListener("message",this.#v),R.unregisterComponent(this),this.#S?.disconnect()}connectedMoveCallback(){}}class U{config;errorHandler;constructor(e,t){if(this.config=e,this.errorHandler=t,!this.config.origin)throw this.errorHandler('Missing "frontdoor-url" or "org-url" attribute')}getComponentURL(e,t){let r;if(void 0===this.config.sitePrefix){let t=e.includes("/")?this.config.lwrAppComp:e.includes(":")?this.config.lwrAppAura:void 0;if(void 0===t)throw this.errorHandler(`Invalid componentName: ${e}`);t=t.replace("/","%2F");const i=this.config.lang?`l/${this.config.lang}/`:"";r=new URL(`lwr/application/amd/0/${i}ai/${t}`,this.config.origin)}else r=new URL(`${this.config.sitePrefix}/lightning-out`,this.config.origin);return r.searchParams.set("componentName",e),this.#I(r,t)}getAuthURL(e){let t;if(void 0===this.config.sitePrefix){const e=this.config.lwrAppAuth.replace("/","%2F");t=new URL(`lwr/application/amd/0/ai/${e}`,this.config.origin)}else t=new URL(this.config.lwrPageAuth,this.config.origin);return this.#I(t,e)}getPageURL(e,t){const r=new URL(e,this.config.origin);return this.#I(r,t)}#I(e,t){return e.searchParams.set("parentElementId",t),e.searchParams.set("loAppOrigin",this.config.loAppOrigin),e.searchParams.set("loVersion","2.2.5-rc.2"),this.config.appId&&e.searchParams.set("appId",this.config.appId),this.config.testMode&&e.searchParams.set("testMode","true"),this.config.designSystem&&e.searchParams.set("designSystem",this.config.designSystem),this.config.globalStyle&&e.searchParams.set("globalStyle",this.config.globalStyle),e}}const I=new r("LightningOutApplication"),N=new Set(["slds1","slds2","none"]),T=new Set(["frontdoorUrl","orgUrl"]);class k extends HTMLElement{_uuid=i();applicationReady=!1;#_=new g(this);#R=new y({parentElement:this});#N;#S;#T="";#k="lightningout/auth";#x="lightningout/container";#M="lightningout/auraContainer";#j="lightning/lightning.out.auth.html";#D="lightning/lightning.out.logout.html";#F="lightning/lightning.out.auth.error.html";#W="/secur/logout.jsp";lwrApplication;orgUrl;#z;frontdoorUrl;#H;appId;#K;components;#Q=new Map;sitePrefix;#Z;designSystem;#V;globalStyle;#q;#J=document.documentElement.lang??"";#G=!1;#X=null;#B=null;constructor(){super(),I.trace("constructor: called",`_uuid: ${this._uuid}`),R.registerApplication(this)}addEventListener(e,t,r){if(e===s.application.ready&&this.applicationReady){const e=new CustomEvent(s.application.ready);queueMicrotask(()=>{"function"==typeof t?t.call(this,e):t.handleEvent(e)})}super.addEventListener(e,t,r)}#Y(e){try{this.#z=new URL(e)}catch{throw this.#_.create(`Invalid org-url: ${e}`)}this.dispatchEvent(new CustomEvent(s.iframe.load,{detail:this.#z.origin}))}#ee(e){try{this.#H=new URL(e),this.#T=this.#H.origin;const t=this.#te(),r=this.#H.searchParams.has("otp")?"startURL":"retURL";this.#H.searchParams.set(r,t.pathname+t.search);const i=this.#re(this.#F);this.#H.searchParams.set("error-redirect-uri",i.pathname+i.search)}catch{throw this.#_.create(`Invalid frontdoor-url: ${e}`)}this.#R.load(this.#H.href)}#ie(){const e=new URL(this.#W,this.#T),t=this.#re(this.#D);e.searchParams.set("redirect-uri",t.pathname+t.search),this.#R.load(e.href)}getRouter(){if(void 0===this.#N){const e={origin:this.#T,lwrPageAuth:this.#j,lwrAppAuth:this.#k,lwrAppComp:this.#x,lwrAppAura:this.#M,sitePrefix:this.#Z,lang:this.#J,appId:this.#K,testMode:this.__testMode||!1,loAppOrigin:window.location.origin,designSystem:this.#V,globalStyle:this.#q};this.#N=new U(e,e=>this.#_.create(e))}return this.#N}_getComponentURL(e,t){return this.getRouter().getComponentURL(e,t)}#te(){return this.getRouter().getAuthURL(this._uuid)}#re(e){return this.getRouter().getPageURL(e,this._uuid)}#se=e=>{this.applicationReady=!0;const t=e.detail;return this.#T="string"==typeof t?t:t.lightningDomain||t.origin,this.#N=void 0,this.#G?(I.trace("#iframeLoaded: frontdoor-url refresh path"),this.#G=!1,void this.dispatchEvent(new CustomEvent(s.application.session.refresh))):this.#B?(I.trace("#iframeLoaded: sessionRefresh() reload path"),clearTimeout(this.#B.timeoutId),this.#B.resolve(),void(this.#B=null)):(I.trace("#iframeLoaded: initial-auth path"),this.#oe(),void this.dispatchEvent(new CustomEvent(s.application.ready)))};sessionExpiry(){return void 0!==this.#z?Promise.reject(this.#_.create(u)):this.applicationReady?this.#X?new Promise((e,t)=>{const r=this.#X,i=r.resolve,s=r.reject;r.resolve=t=>{i(t),e(t)},r.reject=e=>{s(e),t(e)}}):new Promise((e,t)=>{const r=window.setTimeout(()=>{const e=this.#X;this.#X=null,e?.reject(this.#_.create(p))},3e4);this.#X={resolve:e,reject:t,timeoutId:r},this.#R.postMessage({type:o.sessionExpiry,id:this._uuid})}):Promise.reject(this.#_.create(a))}sessionRefresh(){if(void 0!==this.#z)return Promise.reject(this.#_.create(u));if(!this.applicationReady)return Promise.reject(this.#_.create(a));let e=!0;return this.#B&&(clearTimeout(this.#B.timeoutId),this.#B.reject(this.#_.create(h)),this.#B=null,e=!1),new Promise((t,r)=>{const i=window.setTimeout(()=>{this.#B=null,r(this.#_.create(l))},6e4);this.#B={resolve:t,reject:r,timeoutId:i},e&&this.#R.postMessage({type:o.authReload,id:this._uuid})})}_handleSessionExpiryResponse(e){const t=this.#X;t&&(clearTimeout(t.timeoutId),this.#X=null,void 0!==e.error?t.reject(this.#_.create(e.error)):void 0===e.ttl?t.reject(this.#_.create(d)):t.resolve(e.ttl))}#ne(e){const t=this.#B;t&&(clearTimeout(t.timeoutId),this.#B=null,t.reject(this.#_.create(e)))}#ae=e=>{this.#G=!1,this.#ne(e.detail?.message??c),this.#_.dispatch(s.application.error,e)};#he=e=>{this.dispatchEvent(new CustomEvent(s.application.logout))};#le=e=>{this.dispatchEvent(new CustomEvent(s.application.auth.redirect,{detail:e.detail}))};#oe(){R.getComps(this).forEach(e=>{e._init()})}#$=e=>{const t={},r={};Object.keys(e).forEach(i=>{T.has(i)?r[i]=e[i]:t[i]=e[i]}),b(this,t),b(this,r)};#U=(e,t)=>t?"lang"===e:!e.startsWith("_");_propertyChanged_lwrApplication=e=>{if(void 0!==e){const t=e.split("/");if(2!==t.length||!t[0]||!t[1])throw this.#_.create(`"${e}" is not a valid lwr-application name, must be of the form 'namespace/name'`);this.#x=e}};_propertyChanged_lang=e=>{this.#J=e??""};_propertyChanged_orgUrl=e=>{if(void 0!==e){if(void 0!==this.#H)throw this.#_.create('Can\'t set "org-url" because "frontdoor-url" is already set');""===e?this.#ie():this.#Y(e)}};_propertyChanged_frontdoorUrl=e=>{if(void 0!==e){if(void 0!==this.#z)throw this.#_.create('Can\'t set "frontdoor-url" because "org-url" is already set');""!==e?(this.#B&&(clearTimeout(this.#B.timeoutId),this.#B.reject(this.#_.create(h)),this.#B=null),this.#G=this.applicationReady,this.#ee(e)):this.#ie()}};_propertyChanged_sitePrefix=e=>{void 0!==e&&(this.#Z=e)};_propertyChanged_appId=e=>{void 0!==e&&(this.#K=e)};_propertyChanged_globalStyle=e=>{if(void 0!==e){const t=e.split(";").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(const e of t){const[t,...i]=e.split(":"),s=t.trim();if(!s.startsWith("--"))throw this.#_.create(`Invalid global-style: "${s}" is not a CSS custom property. Only CSS custom properties (starting with --) are allowed.`);const o=i.join(":").trim();o&&r.push(`${s}:${o}`)}this.#q=r.join(";")+";"}};_propertyChanged_components=e=>{void 0!==e&&e.split(",").forEach(e=>{const[t,r]=e.split(" as ").map(e=>e.trim()),i=function(e){return e.includes("/")||e.includes(":")}(t);if(i&&t.includes(":"))throw this.#_.create(`"${t}" is not supported in components. Use kebab "namespace-name" in components and the "aura" attribute on the component element instead.`);const s=i?t:w(t),o=r||(i?function(e){const t=e.includes("/")?"/":":",r=e.indexOf(t);if(-1===r)throw f.create(`standardNameToElementName: "${e}" is not a valid component name - missing namespace separator.`);if(/-/.test(e))throw f.create(`standardNameToElementName: "${e}" is not a valid component name - must not contain hyphens.`);if(/^[A-Z]/.test(e))throw f.create(`standardNameToElementName: "${e}" is not a valid component name - first character must not be uppercase.`);const i=e.slice(0,r),s=e.slice(r+1);return`${i.replace(/([A-Z_])/g,"_$1").toLowerCase()}-${v(s)}`}(s):t);if(o&&!this.#Q.has(o)){this.#Q.set(o,s);try{R.registerComponentName(o,this),customElements.define(o,class extends ${})}catch(e){throw this.#_.create(`"${o}" is already registered. ${e}`)}}})};_propertyChanged_designSystem=e=>{if(void 0!==e&&!N.has(e))throw this.#_.create(`Invalid design-system: ${e}`);this.#V=e};_getComponentStandardName(e){const t=e.localName,r=e.hasAttribute("aura"),i=this.#Q.get(t);if(!i)throw this.#_.create(`"${t}" is not registered.`);return r&&i.includes("/")?i.replace("/",":"):i}get _compNames(){}connectedCallback(){if(I.trace("connectedCallback: called",`_uuid: ${this._uuid}`),this.hasChildNodes())throw this.#_.create("Should not have child nodes");this.style.display||="none",this.addEventListener(s.iframe.load,this.#se),this.addEventListener(s.iframe.error,this.#ae),this.addEventListener(s.iframe.logout,this.#he),this.addEventListener(s.iframe.auth.redirect,this.#le),this.#S=new C(this,this.#$,this.#U)}disconnectedCallback(){I.trace("disconnectedCallback: called",`_uuid: ${this._uuid}`),this.#X&&(clearTimeout(this.#X.timeoutId),this.#X.reject(this.#_.create(m)),this.#X=null),this.#B&&(clearTimeout(this.#B.timeoutId),this.#B.reject(this.#_.create(m)),this.#B=null),this.#ie(),this.#R.destroy(),this.removeEventListener(s.iframe.load,this.#se),this.removeEventListener(s.iframe.error,this.#ae),this.removeEventListener(s.iframe.logout,this.#he),this.removeEventListener(s.iframe.auth.redirect,this.#le),this.#S?.disconnect()}connectedMoveCallback(){}}return r.level="debug",window.customElements.define("lightning-out-application",k),e.LightningOutApplication=k,e}({});
9
+ */const y=new r("PropertyObserver");class _{_el;_cb;_cache;_shouldObserve;_interceptedProps;_originalDescriptors;_observer;_changesPending;_pendingChanges;_attributeExceptions=new Map([["for","htmlFor"],["class","className"],["formnovalidate","formNoValidate"],["readonly","readOnly"],["maxlength","maxLength"],["minlength","minLength"],["contenteditable","contentEditable"],["spellcheck","spellcheck"],["novalidate","noValidate"],["autofocus","autofocus"],["autocomplete","autocomplete"],["crossorigin","crossOrigin"]]);constructor(e,t,r){if(!(e instanceof Element))throw new TypeError("Target must be a DOM Element");if("function"!=typeof t)throw new TypeError("Callback must be a function");if(r&&"function"!=typeof r)throw new TypeError("shouldObserve callback must be a function");this._el=e,this._cb=t,this._cache=new Map,this._shouldObserve=r||((e,t)=>!1===t),this._interceptedProps=new Set,this._originalDescriptors=new Map,this._changesPending=!1,this._pendingChanges={},this._initialScan(),this._setupMutationObserver()}disconnect(){this._observer&&this._observer.disconnect();for(const[e,t]of this._originalDescriptors)Object.defineProperty(this._el,e,t);this._cache.clear(),this._interceptedProps.clear(),this._originalDescriptors.clear(),this._pendingChanges={},this._changesPending=!1}_initialScan(){const e={};for(const t of Array.from(this._el.attributes)){const r=t.name,i=this._isStandardAttribute(r);if(!this._shouldObserve(r,i))continue;const s=this._attributeNameToPropName(r),o=t.value;e[s]=o,this._cache.set(s,o),this._installPropertyInterceptor(s)}for(const t of Object.getOwnPropertyNames(this._el)){const r=this._isStandardProperty(t);if(this._cache.has(t)||!this._shouldObserve(t,r))continue;const i=this._el[t];e[t]=i,this._cache.set(t,i),this._installPropertyInterceptor(t)}if(Object.keys(e).length>0)try{this._cb(e)}catch(e){y.error("Error in initial PropertyObserver callback:",e)}}_setupMutationObserver(){this._observer=new MutationObserver(e=>{const t={};for(const r of e)if("attributes"===r.type&&r.attributeName){const e=r.attributeName,i=this._isStandardAttribute(e);if(!this._shouldObserve(e,i))continue;const s=this._attributeNameToPropName(e),o=this._el.getAttribute(e);o!==this._cache.get(s)&&(t[s]=o,this._cache.set(s,o),this._interceptedProps.has(s)||this._installPropertyInterceptor(s))}Object.keys(t).length>0&&this._batchChanges(t)}),this._observer.observe(this._el,{attributes:!0,attributeOldValue:!1})}_installPropertyInterceptor(e){if(this._interceptedProps.has(e))return;const t=Object.getOwnPropertyDescriptor(this._el,e)||{value:this._el[e],writable:!0,enumerable:!0,configurable:!0};this._originalDescriptors.set(e,t);const r={enumerable:t.enumerable,configurable:t.configurable,get:t.get||(()=>t.value),set:r=>{r!==this._cache.get(e)&&(t.set?t.set.call(this._el,r):t.value=r,this._cache.set(e,r),this._batchChanges({[e]:r}))}};Object.defineProperty(this._el,e,r),this._interceptedProps.add(e)}_batchChanges(e){Object.assign(this._pendingChanges,e),this._changesPending||(this._changesPending=!0,queueMicrotask(()=>{this._changesPending=!1;const e={...this._pendingChanges};this._pendingChanges={};try{this._cb(e)}catch(e){y.error("Error in PropertyObserver callback:",e)}}))}_attributeNameToPropName(e){return this._attributeExceptions.has(e)?this._attributeExceptions.get(e):e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}_isStandardAttribute(e){if(e.startsWith("data-")||e.startsWith("aria-")||e.startsWith("on"))return!0;const t=this._attributeNameToPropName(e);return this._isStandardProperty(t)}_isStandardProperty(e){return e in HTMLElement.prototype}}const C=new class{#_=new m("LightningOutRegistry");appToComps=new WeakMap;compToApp=new WeakMap;compNameToApp=new Map;registerApplication(e){this.appToComps.has(e)||this.appToComps.set(e,new Set)}registerComponentName(e,t){if(this.compNameToApp.has(e))throw this.#_.create(`"${e}" is already registered to another App.`);this.compNameToApp.set(e,t)}registerComponent(e,t){if(this.compToApp.has(e))throw this.#_.create("This Comp is already registered to another App.");let r=t;if(!r){const t=e.localName;if(r=this.compNameToApp.get(t),!r)throw this.#_.create(`Could not find a parent App for component "${e.localName}"`)}return this.appToComps.get(r).add(e),this.compToApp.set(e,r),r}unregisterComponent(e){const t=this.compToApp.get(e);if(!t)return!1;const r=this.appToComps.get(t);return r?.delete(e),this.compToApp.delete(e),!0}getComps(e){const t=this.appToComps.get(e);if(!t)throw this.#_.create("Unable to find set of LightningOutComponents");return t}},L=new r("LightningOutComponent"),R=new Set(["autocapitalize","autocorrect","dir","enterkeyhint","inputmode","lang","spellcheck","style","title","translate"]),P=new Set(["aria-disabled","aria-hidden","aria-label","aria-live","aria-modal","aria-pressed","aria-valuemax","aria-valuemin","aria-valuenow"]),S=new Set(["accesskey","autofocus","draggable","exportparts","hidden","inert","nonce","part","slot","tabindex"]),A=new Set(["aria-activedescendant","aria-controls","aria-describedby","aria-details","aria-errormessage","aria-flowto","aria-labelledby","aria-owns"]);class O extends HTMLElement{_uuid=i();componentReady=!1;_standardName=f(this.localName);#C;#_=new m(this);#L=new E({parentElement:this});#R;#P=!0;#S=[];#A=new WeakMap;#O=0;constructor(){super(),L.trace("constructor: called",`_uuid: ${this._uuid}`)}_getComponentURL(){const e=this.#C;if(!e)throw this.#_.create("Undefined parent App!");return e._getComponentURL(this._standardName,this._uuid)}_init(){this.componentReady||this.#L.load(this._getComponentURL().href)}#v=e=>{if(e.data.id===this._uuid)switch(L.debug("#messageListener:",`this._uuid: ${this._uuid}`,`this._standardName: ${this._standardName}`,`event.data: ${JSON.stringify(e.data)}`),e.data.type){case o.ready:for(this.componentReady=!0;this.#S.length;){const e=this.#S.shift();e&&("add"===e.type?this.addEventListener(...e.args):"remove"===e.type?this.removeEventListener(...e.args):"dispatch"===e.type&&this.dispatchEvent(e.event))}super.dispatchEvent(new CustomEvent(s.component.ready));break;case o.getComponentData:this.#R=new _(this,this.#$,this.#U);break;case o.dispatchEvent:{const t=new CustomEvent(e.data.name,{detail:e.data.detail});super.dispatchEvent(t);break}case o.error:this.#_.dispatch(s.component.error,e.data.error);break;default:L.info("#messageListener:","Unknown message received:",{"event.data":e.data})}};_propertyChanged_style=e=>{const t=this.style,r=[];for(let e=0;e<t.length;e+=1){const i=t.item(e);i.startsWith("--")&&r.push(`${i}:${t.getPropertyValue(i)}`)}return r.join(";")};#$=e=>{const t=w(this,e);L.debug("#propObserverCallback:",{changes:e,propsToSend:t}),this.#P?(this.#P=!1,this.#L.postMessage({type:o.setComponentData,componentData:{id:this._uuid,name:this._standardName,props:t}})):this.#L.postMessage({type:o.setComponentProps,componentProps:t})};#U=(e,t)=>{const r=g(e);return L.debug("#shouldObserveCallback:",{attrOrPropName:e,attrName:r,isStandard:t}),t?!(!R.has(r)&&!P.has(r))||(S.has(r)||A.has(r)||r.startsWith("on")?(L.warn(`"${r}" will not be mirrored.`),!1):!!r.startsWith("data-mirror-")||(L.warn(`"${r}" will not be mirrored.`),!1)):!r.startsWith("_")&&!v(e)};addEventListener(e,t,r){if(e===s.component.ready&&this.componentReady){const e=new CustomEvent(s.component.ready);queueMicrotask(()=>{"function"==typeof t?t.call(this,e):t.handleEvent(e)})}if(e.startsWith("lo."))return void super.addEventListener(e,t,r);let i=this.#A.get(t);i||(i=`${e}_${this.#O++}`,this.#A.set(t,i)),this.componentReady?(super.addEventListener(...arguments),this.#L.postMessage({name:e,options:r,listenerKey:i,type:o.addEventListener})):(this.#S.push({type:"add",args:[e,t,r]}),L.debug("addEventListener:","#eventQueue pushed add args:",[e,t,r]))}dispatchEvent(e){if(e.type.startsWith("lo."))return L.debug(`dispatchEvent: dispatching event "${e.type}" to this Element only`),super.dispatchEvent(e);if(this.componentReady){L.debug(`dispatchEvent: dispatching event "${e.type}" to this Element and embedded Element inside the iframe`);const t=super.dispatchEvent(e);return this.#L.postMessage({name:e.type,detail:e.detail||{},type:o.dispatchEvent}),t}return L.debug(`dispatchEvent: component not ready, queueing event "${e.type}"`),this.#S.push({type:"dispatch",event:e}),!0}removeEventListener(e,t,r){if(e.startsWith("lo."))return void super.removeEventListener(...arguments);const i=this.#A.get(t);this.componentReady?(super.removeEventListener(...arguments),this.#L.postMessage({name:e,options:r,listenerKey:i,type:o.removeEventListener})):(this.#S.push({type:"remove",args:[e,t,r]}),L.debug("removeEventListener:","#eventQueue pushed remove args:",[e,t,r])),i&&this.#A.delete(t)}adoptedCallback(){throw this.remove(),this.#_.create("This component cannot be rerendered for security reasons.")}connectedCallback(){if(L.trace("connectedCallback: called",`_uuid: ${this._uuid}`),window.addEventListener("message",this.#v),this.hasChildNodes())throw this.#_.create("Should not have child nodes");this.style.display||="block",this.style.width||="100%",this.style.height||="100%",this.#C=C.registerComponent(this),this._standardName=this.#C._getComponentStandardName(this),this.#C.applicationReady&&this._init()}disconnectedCallback(){L.trace("disconnectedCallback: called",`_uuid: ${this._uuid}`),this.#L.destroy(),window.removeEventListener("message",this.#v),C.unregisterComponent(this),this.#R?.disconnect()}connectedMoveCallback(){}}class ${config;errorHandler;constructor(e,t){if(this.config=e,this.errorHandler=t,!this.config.origin)throw this.errorHandler('Missing "frontdoor-url" or "org-url" attribute')}getComponentURL(e,t){let r;if(void 0===this.config.sitePrefix){let t=e.includes("/")?this.config.lwrAppComp:e.includes(":")?this.config.lwrAppAura:void 0;if(void 0===t)throw this.errorHandler(`Invalid componentName: ${e}`);t=t.replace("/","%2F");const i=this.config.lang?`l/${this.config.lang}/`:"";r=new URL(`lwr/application/amd/0/${i}ai/${t}`,this.config.origin)}else r=new URL(`${this.config.sitePrefix}/lightning-out`,this.config.origin);return r.searchParams.set("componentName",e),this.#N(r,t)}getAuthURL(e){let t;if(void 0===this.config.sitePrefix){const e=this.config.lwrAppAuth.replace("/","%2F");t=new URL(`lwr/application/amd/0/ai/${e}`,this.config.origin)}else t=new URL(this.config.lwrPageAuth,this.config.origin);return this.#N(t,e)}getPageURL(e,t){const r=new URL(e,this.config.origin);return this.#N(r,t)}#N(e,t){return e.searchParams.set("parentElementId",t),e.searchParams.set("loAppOrigin",this.config.loAppOrigin),e.searchParams.set("loVersion","2.2.5-rc.4"),this.config.appId&&e.searchParams.set("appId",this.config.appId),this.config.testMode&&e.searchParams.set("testMode","true"),this.config.designSystem&&e.searchParams.set("designSystem",this.config.designSystem),this.config.globalStyle&&e.searchParams.set("globalStyle",this.config.globalStyle),e}}const U=new r("LightningOutApplication"),N=new Set(["slds1","slds2","none"]),I=new Set(["frontdoorUrl","orgUrl"]);class k extends HTMLElement{_uuid=i();applicationReady=!1;#_=new m(this);#L=new E({parentElement:this});#I;#R;#k="";#T="lightningout/auth";#x="lightningout/container";#M="lightningout/auraContainer";#j="lightning/lightning.out.auth.html";#D="lightning/lightning.out.logout.html";#F="lightning/lightning.out.auth.error.html";#W="/secur/logout.jsp";lwrApplication;orgUrl;#K;frontdoorUrl;#z;appId;#H;components;#Q=new Map;sitePrefix;#Z;designSystem;#V;globalStyle;#q;#J=document.documentElement.lang??"";#G=!1;#X=null;#B=null;constructor(){super(),U.trace("constructor: called",`_uuid: ${this._uuid}`),C.registerApplication(this)}addEventListener(e,t,r){if(e===s.application.ready&&this.applicationReady){const e=new CustomEvent(s.application.ready);queueMicrotask(()=>{"function"==typeof t?t.call(this,e):t.handleEvent(e)})}super.addEventListener(e,t,r)}#Y(e){try{this.#K=new URL(e)}catch{throw this.#_.create(`Invalid org-url: ${e}`)}this.dispatchEvent(new CustomEvent(s.iframe.load,{detail:this.#K.origin}))}#ee(e){try{this.#z=new URL(e),this.#k=this.#z.origin;const t=this.#te(),r=this.#z.searchParams.has("otp")?"startURL":"retURL";this.#z.searchParams.set(r,t.pathname+t.search);const i=this.#re(this.#F);this.#z.searchParams.set("error-redirect-uri",i.pathname+i.search)}catch{throw this.#_.create(`Invalid frontdoor-url: ${e}`)}this.#L.load(this.#z.href)}#ie(){const e=new URL(this.#W,this.#k),t=this.#re(this.#D);e.searchParams.set("redirect-uri",t.pathname+t.search),this.#L.load(e.href)}getRouter(){if(void 0===this.#I){const e={origin:this.#k,lwrPageAuth:this.#j,lwrAppAuth:this.#T,lwrAppComp:this.#x,lwrAppAura:this.#M,sitePrefix:this.#Z,lang:this.#J,appId:this.#H,testMode:this.__testMode||!1,loAppOrigin:window.location.origin,designSystem:this.#V,globalStyle:this.#q};this.#I=new $(e,e=>this.#_.create(e))}return this.#I}_getComponentURL(e,t){return this.getRouter().getComponentURL(e,t)}#te(){return this.getRouter().getAuthURL(this._uuid)}#re(e){return this.getRouter().getPageURL(e,this._uuid)}#se=e=>{this.applicationReady=!0;const t=e.detail;return this.#k="string"==typeof t?t:t.lightningDomain||t.origin,this.#I=void 0,this.#G?(U.trace("#iframeLoaded: frontdoor-url refresh path"),this.#G=!1,void this.dispatchEvent(new CustomEvent(s.application.session.refresh))):this.#B?(U.trace("#iframeLoaded: sessionRefresh() reload path"),clearTimeout(this.#B.timeoutId),this.#B.resolve(),void(this.#B=null)):(U.trace("#iframeLoaded: initial-auth path"),this.#oe(),void this.dispatchEvent(new CustomEvent(s.application.ready)))};sessionExpiry(){if(void 0!==this.#K)return Promise.reject(this.#_.create(p));if(!this.applicationReady)return Promise.reject(this.#_.create(a));if(this.#X)return this.#X.promise;let e,t;const r=new Promise((r,i)=>{e=r,t=i}),i=window.setTimeout(()=>{const e=this.#X;this.#X=null,e?.reject(this.#_.create(h))},3e4);return this.#X={promise:r,resolve:e,reject:t,timeoutId:i},this.#L.postMessage({type:o.sessionExpiry,id:this._uuid}),r}sessionRefresh(){if(void 0!==this.#K)return Promise.reject(this.#_.create(p));if(!this.applicationReady)return Promise.reject(this.#_.create(a));if(this.#B)return this.#B.promise;let e,t;const r=new Promise((r,i)=>{e=r,t=i}),i=window.setTimeout(()=>{const e=this.#B;this.#B=null,e?.reject(this.#_.create(h))},6e4);return this.#B={promise:r,resolve:e,reject:t,timeoutId:i},this.#L.postMessage({type:o.authReload,id:this._uuid}),r}_handleSessionExpiryResponse(e){const t=this.#X;t&&(clearTimeout(t.timeoutId),this.#X=null,void 0!==e.error?t.reject(this.#_.create(e.error)):void 0===e.ttl?t.reject(this.#_.create(c)):t.resolve(e.ttl))}#ne(e){const t=this.#B;t&&(clearTimeout(t.timeoutId),this.#B=null,t.reject(this.#_.create(e)))}#ae(e){const t=this.#X;t&&(clearTimeout(t.timeoutId),this.#X=null,t.reject(this.#_.create(e)))}#he(e){this.#ne(e),this.#ae(e)}#le=e=>{this.#G=!1;const t=e.detail?.message;this.#he(t??l),this.#_.dispatch(s.application.error,e)};#ce=e=>{this.dispatchEvent(new CustomEvent(s.application.logout))};#de=e=>{this.dispatchEvent(new CustomEvent(s.application.auth.redirect,{detail:e.detail}))};#oe(){C.getComps(this).forEach(e=>{e._init()})}#$=e=>{const t={},r={};Object.keys(e).forEach(i=>{I.has(i)?r[i]=e[i]:t[i]=e[i]}),w(this,t),w(this,r)};#U=(e,t)=>t?"lang"===e:!e.startsWith("_")&&!v(e);_propertyChanged_lwrApplication=e=>{if(void 0!==e){const t=e.split("/");if(2!==t.length||!t[0]||!t[1])throw this.#_.create(`"${e}" is not a valid lwr-application name, must be of the form 'namespace/name'`);this.#x=e}};_propertyChanged_lang=e=>{this.#J=e??""};_propertyChanged_orgUrl=e=>{if(void 0!==e){if(void 0!==this.#z)throw this.#_.create('Can\'t set "org-url" because "frontdoor-url" is already set');""===e?this.#ie():this.#Y(e)}};_propertyChanged_frontdoorUrl=e=>{if(void 0===e)return;if(void 0!==this.#K)throw this.#_.create('Can\'t set "frontdoor-url" because "org-url" is already set');if(""===e)return this.#he(d),void this.#ie();const t=null!==this.#B;this.#he(d),this.#G=this.applicationReady&&!t,this.#ee(e)};_propertyChanged_sitePrefix=e=>{void 0!==e&&(this.#Z=e)};_propertyChanged_appId=e=>{void 0!==e&&(this.#H=e)};_propertyChanged_globalStyle=e=>{if(void 0!==e){const t=e.split(";").map(e=>e.trim()).filter(e=>e.length>0),r=[];for(const e of t){const[t,...i]=e.split(":"),s=t.trim();if(!s.startsWith("--"))throw this.#_.create(`Invalid global-style: "${s}" is not a CSS custom property. Only CSS custom properties (starting with --) are allowed.`);const o=i.join(":").trim();o&&r.push(`${s}:${o}`)}this.#q=r.join(";")+";"}};_propertyChanged_components=e=>{void 0!==e&&e.split(",").forEach(e=>{const[t,r]=e.split(" as ").map(e=>e.trim()),i=function(e){return e.includes("/")||e.includes(":")}(t);if(i&&t.includes(":"))throw this.#_.create(`"${t}" is not supported in components. Use kebab "namespace-name" in components and the "aura" attribute on the component element instead.`);const s=i?t:f(t),o=r||(i?function(e){const t=e.includes("/")?"/":":",r=e.indexOf(t);if(-1===r)throw u.create(`standardNameToElementName: "${e}" is not a valid component name - missing namespace separator.`);if(/-/.test(e))throw u.create(`standardNameToElementName: "${e}" is not a valid component name - must not contain hyphens.`);if(/^[A-Z]/.test(e))throw u.create(`standardNameToElementName: "${e}" is not a valid component name - first character must not be uppercase.`);const i=e.slice(0,r),s=e.slice(r+1);return`${i.replace(/([A-Z_])/g,"_$1").toLowerCase()}-${g(s)}`}(s):t);if(o&&!this.#Q.has(o)){this.#Q.set(o,s);try{C.registerComponentName(o,this),customElements.define(o,class extends O{})}catch(e){throw this.#_.create(`"${o}" is already registered. ${e}`)}}})};_propertyChanged_designSystem=e=>{if(void 0!==e&&!N.has(e))throw this.#_.create(`Invalid design-system: ${e}`);this.#V=e};_getComponentStandardName(e){const t=e.localName,r=e.hasAttribute("aura"),i=this.#Q.get(t);if(!i)throw this.#_.create(`"${t}" is not registered.`);return r&&i.includes("/")?i.replace("/",":"):i}get _compNames(){}connectedCallback(){if(U.trace("connectedCallback: called",`_uuid: ${this._uuid}`),this.hasChildNodes())throw this.#_.create("Should not have child nodes");this.style.display||="none",this.addEventListener(s.iframe.load,this.#se),this.addEventListener(s.iframe.error,this.#le),this.addEventListener(s.iframe.logout,this.#ce),this.addEventListener(s.iframe.auth.redirect,this.#de),this.#R=new _(this,this.#$,this.#U)}disconnectedCallback(){U.trace("disconnectedCallback: called",`_uuid: ${this._uuid}`),this.#he(d),this.#ie(),this.#L.destroy(),this.removeEventListener(s.iframe.load,this.#se),this.removeEventListener(s.iframe.error,this.#le),this.removeEventListener(s.iframe.logout,this.#ce),this.removeEventListener(s.iframe.auth.redirect,this.#de),this.#R?.disconnect()}connectedMoveCallback(){}}return r.level="debug",window.customElements.define("lightning-out-application",k),e.LightningOutApplication=k,e}({});
10
10
  //# sourceMappingURL=index.iife.prod.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/lightning-out",
3
- "version": "2.2.5-rc.2",
3
+ "version": "2.2.5-rc.4",
4
4
  "private": false,
5
5
  "description": "Lightning Out 2.0 for Salesforce",
6
6
  "license": "SEE LICENSE IN LICENSE.txt",
@@ -22,8 +22,8 @@
22
22
  },
23
23
  "dependencies": {},
24
24
  "devDependencies": {
25
- "core": "2.2.5-rc.2",
26
- "utils": "2.2.5-rc.2"
25
+ "core": "2.2.5-rc.4",
26
+ "utils": "2.2.5-rc.4"
27
27
  },
28
28
  "files": [
29
29
  "dist/",