@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 +80 -74
- package/dist/index.iife.debug.js +80 -74
- package/dist/index.iife.prod.js +3 -3
- package/package.json +3 -3
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @salesforce/lightning-out v2.2.5-rc.
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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.
|
|
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):
|
|
1644
|
-
//
|
|
1645
|
-
// 2. sessionRefresh()-initiated reload (#promiseSessionRefresh set):
|
|
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
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
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
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
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
|
-
|
|
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();
|
package/dist/index.iife.debug.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @salesforce/lightning-out v2.2.5-rc.
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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.
|
|
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):
|
|
1647
|
-
//
|
|
1648
|
-
// 2. sessionRefresh()-initiated reload (#promiseSessionRefresh set):
|
|
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
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
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
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
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
|
-
|
|
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();
|
package/dist/index.iife.prod.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/*! @salesforce/lightning-out v2.2.5-rc.
|
|
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
|
|
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.
|
|
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.
|
|
26
|
-
"utils": "2.2.5-rc.
|
|
25
|
+
"core": "2.2.5-rc.4",
|
|
26
|
+
"utils": "2.2.5-rc.4"
|
|
27
27
|
},
|
|
28
28
|
"files": [
|
|
29
29
|
"dist/",
|