@lwrjs/everywhere 0.13.0-alpha.0 → 0.13.0-alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (24) hide show
  1. package/build/__generated_site_amd_modules__/1/application/amd/l/en-US/ai/amd-bootstrap/configuration/ci/-/-/s/86e5b35c91b01b4b7df42aded40a3e5d/config.js +12 -0
  2. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/@lwrjs/app-service/amd-bootstrap/module/amd/v/0_13_0-alpha_2/s/8bce578258518655194bd71d1d72aad5/@lwrjs_app-service_amd-bootstrap_module_amd.js +14 -0
  3. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/lwc/v/{6_3_4/s/5c26ade60a97bb24c64d3829320b13f6 → 6_6_1/s/eeee3bb1f188f86a6a28e9d5c983706c}/lwc.js +959 -579
  4. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/lwr/everywhereAmd/v/{0_13_0-alpha_0 → 0_13_0-alpha_2}/s/cb931ebef2b89dcf8ab51456e3a68864/lwr_everywhereAmd.js +3 -3
  5. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/lwr/init/v/{0_13_0-alpha_0 → 0_13_0-alpha_2}/s/f30361ad8ff7af505bf4d465c8499181/lwr_init.js +21 -21
  6. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/lwr/loader/v/{0_13_0-alpha_0/s/589732f011b79219a57c1f4a08038efe → 0_13_0-alpha_2/s/e307ee0231427b79178dc8789d2591fc}/lwr_loader.js +4 -4
  7. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/lwr/metrics/v/{0_13_0-alpha_0 → 0_13_0-alpha_2}/s/274c8343f810353bbad085a79709395f/lwr_metrics.js +1 -1
  8. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/lwr/preInit/v/{0_13_0-alpha_0 → 0_13_0-alpha_2}/s/ec0fad0e38a96bb0b88c9f4553460347/lwr_preInit.js +1 -1
  9. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/lwr/profiler/v/{0_13_0-alpha_0 → 0_13_0-alpha_2}/s/a152b8d35f12ca1b5147c5cd1ee155fb/lwr_profiler.js +1 -1
  10. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/lwr/vault/v/{0_13_0-alpha_0 → 0_13_0-alpha_2}/s/c92abd8c1fec2d7eff62e4b097abbe14/lwr_vault.js +1 -1
  11. package/build/__generated_site_amd_modules__/1/resource/amd/lwr-error-shim.js/v/{0_13_0-alpha_0 → 0_13_0-alpha_2}/lwr-error-shim.js +1 -1
  12. package/build/__generated_site_amd_modules__/1/resource/amd/lwr-loader-shim.bundle.js/v/{0_13_0-alpha_0 → 0_13_0-alpha_2}/lwr-loader-shim.bundle.js +7 -7
  13. package/build/assets/amd/lwr-everywhere-debug.js +9 -9
  14. package/build/assets/amd/lwr-everywhere-min.js +2 -2
  15. package/build/assets/amd/lwr-everywhere.js +9 -9
  16. package/build/assets/core/lwr-everywhere-debug.js +5 -5
  17. package/build/assets/core/lwr-everywhere-min.js +1 -1
  18. package/build/assets/core/lwr-everywhere.js +5 -5
  19. package/build/assets/esm/lwr-everywhere-debug.js +1 -1
  20. package/build/assets/esm/lwr-everywhere-min.js +1 -1
  21. package/build/assets/esm/lwr-everywhere.js +1 -1
  22. package/package.json +9 -9
  23. package/build/__generated_site_amd_modules__/1/application/amd/l/en-US/ai/amd-bootstrap/configuration/ci/-/-/s/063276514e896851bb9af991a41a6bd4/config.js +0 -12
  24. package/build/__generated_site_amd_modules__/1/module/amd/1/l/en-US/mi/@lwrjs/app-service/amd-bootstrap/module/amd/v/0_13_0-alpha_0/s/8bce578258518655194bd71d1d72aad5/@lwrjs_app-service_amd-bootstrap_module_amd.js +0 -14
@@ -1,4 +1,4 @@
1
- LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
1
+ LWR.define('lwc/v/6_6_1', ['exports'], (function (exports) { 'use strict';
2
2
 
3
3
  /**
4
4
  * Copyright (c) 2024 Salesforce, Inc.
@@ -148,6 +148,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
148
148
  } = String;
149
149
  // No JSDocs here - see comment for Array.prototype
150
150
  const {
151
+ charAt: StringCharAt,
151
152
  charCodeAt: StringCharCodeAt,
152
153
  replace: StringReplace,
153
154
  split: StringSplit,
@@ -291,7 +292,8 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
291
292
  // These must be updated when the enum is updated.
292
293
  // It's a bit annoying to do have to do this manually, but this makes the file tree-shakeable,
293
294
  // passing the `verify-treeshakeable.js` test.
294
- const LOWEST_API_VERSION = 58 /* APIVersion.V58_244_SUMMER_23 */;
295
+ const allVersions = [58 /* APIVersion.V58_244_SUMMER_23 */, 59 /* APIVersion.V59_246_WINTER_24 */, 60 /* APIVersion.V60_248_SPRING_24 */, 61 /* APIVersion.V61_250_SUMMER_24 */, 62 /* APIVersion.V62_252_WINTER_25 */];
296
+ const LOWEST_API_VERSION = allVersions[0];
295
297
  /**
296
298
  *
297
299
  * @param apiVersionFeature
@@ -440,9 +442,9 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
440
442
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
441
443
  */
442
444
  // Increment whenever the LWC template compiler changes
443
- const LWC_VERSION = "6.3.4";
445
+ const LWC_VERSION = "6.6.1";
444
446
  const LWC_VERSION_COMMENT_REGEX = /\/\*LWC compiler v([\d.]+)\*\/\s*}/;
445
- /** version: 6.3.4 */
447
+ /** version: 6.6.1 */
446
448
 
447
449
  /**
448
450
  * Copyright (c) 2024 Salesforce, Inc.
@@ -528,7 +530,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
528
530
  setFeatureFlag(name, value);
529
531
  }
530
532
  }
531
- /** version: 6.3.4 */
533
+ /** version: 6.6.1 */
532
534
 
533
535
  /**
534
536
  * Copyright (c) 2024 Salesforce, Inc.
@@ -783,15 +785,17 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
783
785
  if (len > 0) {
784
786
  for (let i = 0; i < len; i++) {
785
787
  const set = listeners[i];
786
- if (set.length === 1) {
787
- // Perf optimization for the common case - the length is usually 1, so avoid the indexOf+splice.
788
- // If the length is 1, we can also be sure that `this` is the first item in the array.
789
- set.length = 0;
790
- } else {
791
- // Slow case
792
- const pos = ArrayIndexOf.call(set, this);
793
- ArraySplice.call(set, pos, 1);
788
+ const setLength = set.length;
789
+ // The length is usually 1, so avoid doing an indexOf when we know for certain
790
+ // that `this` is the first item in the array.
791
+ if (setLength > 1) {
792
+ // Swap with the last item before removal.
793
+ // (Avoiding splice here is a perf optimization, and the order doesn't matter.)
794
+ const index = ArrayIndexOf.call(set, this);
795
+ set[index] = set[setLength - 1];
794
796
  }
797
+ // Remove the last item
798
+ ArrayPop.call(set);
795
799
  }
796
800
  listeners.length = 0;
797
801
  }
@@ -1718,7 +1722,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
1718
1722
  valueMutated(originalTarget, key);
1719
1723
  return true;
1720
1724
  }
1721
- /*LWC compiler v6.3.4*/
1725
+ /*LWC compiler v6.6.1*/
1722
1726
  }
1723
1727
  const getterMap = new WeakMap();
1724
1728
  const setterMap = new WeakMap();
@@ -1811,7 +1815,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
1811
1815
  /* istanbul ignore next */
1812
1816
  return false;
1813
1817
  }
1814
- /*LWC compiler v6.3.4*/
1818
+ /*LWC compiler v6.6.1*/
1815
1819
  }
1816
1820
  function extract(objectOrArray) {
1817
1821
  if (isArray(objectOrArray)) {
@@ -2739,7 +2743,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
2739
2743
  }
2740
2744
 
2741
2745
  /*
2742
- * Copyright (c) 2023, salesforce.com, inc.
2746
+ * Copyright (c) 2024, Salesforce, Inc.
2743
2747
  * All rights reserved.
2744
2748
  * SPDX-License-Identifier: MIT
2745
2749
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
@@ -3428,7 +3432,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
3428
3432
  }
3429
3433
 
3430
3434
  /*
3431
- * Copyright (c) 2018, salesforce.com, inc.
3435
+ * Copyright (c) 2024, Salesforce, Inc.
3432
3436
  * All rights reserved.
3433
3437
  * SPDX-License-Identifier: MIT
3434
3438
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
@@ -3518,7 +3522,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
3518
3522
  }
3519
3523
  function HTMLBridgeElementFactory(SuperClass, publicProperties, methods, observedFields, proto, hasCustomSuperClass) {
3520
3524
  const HTMLBridgeElement = class extends SuperClass {
3521
- /*LWC compiler v6.3.4*/
3525
+ /*LWC compiler v6.6.1*/
3522
3526
  };
3523
3527
  // generating the hash table for attributes to avoid duplicate fields and facilitate validation
3524
3528
  // and false positives in case of inheritance.
@@ -3630,125 +3634,448 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
3630
3634
  seal(BaseBridgeElement.prototype);
3631
3635
 
3632
3636
  /*
3633
- * Copyright (c) 2023, salesforce.com, inc.
3637
+ * Copyright (c) 2018, salesforce.com, inc.
3634
3638
  * All rights reserved.
3635
3639
  * SPDX-License-Identifier: MIT
3636
3640
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3637
3641
  */
3638
- const supportsWeakRefs = typeof WeakRef === 'function' && typeof FinalizationRegistry === 'function';
3639
- // In browsers that doesn't support WeakRefs, the values will still leak, but at least the keys won't
3640
- class LegacyWeakMultiMap {
3641
- constructor() {
3642
- this._map = new WeakMap();
3642
+ // These are only used for HMR in dev mode
3643
+ // The "pure" annotations are so that Rollup knows for sure it can remove these from prod mode
3644
+ let stylesheetsToCssContent = /*@__PURE__@*/new WeakMap();
3645
+ let cssContentToAbortControllers = /*@__PURE__@*/new Map();
3646
+ // Only used in LWC's Karma tests
3647
+ if (process.env.NODE_ENV === 'test-karma-lwc') {
3648
+ // Used to reset the global state between test runs
3649
+ window.__lwcResetStylesheetCache = () => {
3650
+ stylesheetsToCssContent = new WeakMap();
3651
+ cssContentToAbortControllers = new Map();
3652
+ };
3653
+ }
3654
+ function linkStylesheetToCssContentInDevMode(stylesheet, cssContent) {
3655
+ // Should never leak to prod; only used for HMR
3656
+ assertNotProd();
3657
+ let cssContents = stylesheetsToCssContent.get(stylesheet);
3658
+ if (isUndefined$1(cssContents)) {
3659
+ cssContents = new Set();
3660
+ stylesheetsToCssContent.set(stylesheet, cssContents);
3643
3661
  }
3644
- _getValues(key) {
3645
- let values = this._map.get(key);
3646
- if (isUndefined$1(values)) {
3647
- values = new Set();
3648
- this._map.set(key, values);
3662
+ cssContents.add(cssContent);
3663
+ }
3664
+ function getOrCreateAbortControllerInDevMode(cssContent) {
3665
+ // Should never leak to prod; only used for HMR
3666
+ assertNotProd();
3667
+ let abortController = cssContentToAbortControllers.get(cssContent);
3668
+ if (isUndefined$1(abortController)) {
3669
+ abortController = new AbortController();
3670
+ cssContentToAbortControllers.set(cssContent, abortController);
3671
+ }
3672
+ return abortController;
3673
+ }
3674
+ function getOrCreateAbortSignal(cssContent) {
3675
+ // abort controller/signal is only used for HMR in development
3676
+ if (process.env.NODE_ENV !== 'production') {
3677
+ return getOrCreateAbortControllerInDevMode(cssContent).signal;
3678
+ }
3679
+ return undefined;
3680
+ }
3681
+ function makeHostToken(token) {
3682
+ // Note: if this ever changes, update the `cssScopeTokens` returned by `@lwc/compiler`
3683
+ return `${token}-host`;
3684
+ }
3685
+ function createInlineStyleVNode(content) {
3686
+ return api.h('style', {
3687
+ key: 'style',
3688
+ // special key
3689
+ attrs: {
3690
+ type: 'text/css'
3649
3691
  }
3650
- return values;
3692
+ }, [api.t(content)]);
3693
+ }
3694
+ // TODO [#3733]: remove support for legacy scope tokens
3695
+ function updateStylesheetToken(vm, template, legacy) {
3696
+ const {
3697
+ elm,
3698
+ context,
3699
+ renderMode,
3700
+ shadowMode,
3701
+ renderer: {
3702
+ getClassList,
3703
+ removeAttribute,
3704
+ setAttribute
3705
+ }
3706
+ } = vm;
3707
+ const {
3708
+ stylesheets: newStylesheets
3709
+ } = template;
3710
+ const newStylesheetToken = legacy ? template.legacyStylesheetToken : template.stylesheetToken;
3711
+ const {
3712
+ stylesheets: newVmStylesheets
3713
+ } = vm;
3714
+ const isSyntheticShadow = renderMode === 1 /* RenderMode.Shadow */ && shadowMode === 1 /* ShadowMode.Synthetic */;
3715
+ const {
3716
+ hasScopedStyles
3717
+ } = context;
3718
+ let newToken;
3719
+ let newHasTokenInClass;
3720
+ let newHasTokenInAttribute;
3721
+ // Reset the styling token applied to the host element.
3722
+ let oldToken;
3723
+ let oldHasTokenInClass;
3724
+ let oldHasTokenInAttribute;
3725
+ if (legacy) {
3726
+ oldToken = context.legacyStylesheetToken;
3727
+ oldHasTokenInClass = context.hasLegacyTokenInClass;
3728
+ oldHasTokenInAttribute = context.hasLegacyTokenInAttribute;
3729
+ } else {
3730
+ oldToken = context.stylesheetToken;
3731
+ oldHasTokenInClass = context.hasTokenInClass;
3732
+ oldHasTokenInAttribute = context.hasTokenInAttribute;
3651
3733
  }
3652
- get(key) {
3653
- return this._getValues(key);
3734
+ if (!isUndefined$1(oldToken)) {
3735
+ if (oldHasTokenInClass) {
3736
+ getClassList(elm).remove(makeHostToken(oldToken));
3737
+ }
3738
+ if (oldHasTokenInAttribute) {
3739
+ removeAttribute(elm, makeHostToken(oldToken));
3740
+ }
3654
3741
  }
3655
- add(key, vm) {
3656
- const set = this._getValues(key);
3657
- set.add(vm);
3742
+ // Apply the new template styling token to the host element, if the new template has any
3743
+ // associated stylesheets. In the case of light DOM, also ensure there is at least one scoped stylesheet.
3744
+ const hasNewStylesheets = hasStyles(newStylesheets);
3745
+ const hasNewVmStylesheets = hasStyles(newVmStylesheets);
3746
+ if (hasNewStylesheets || hasNewVmStylesheets) {
3747
+ newToken = newStylesheetToken;
3658
3748
  }
3659
- delete(key) {
3660
- this._map.delete(key);
3749
+ // Set the new styling token on the host element
3750
+ if (!isUndefined$1(newToken)) {
3751
+ if (hasScopedStyles) {
3752
+ getClassList(elm).add(makeHostToken(newToken));
3753
+ newHasTokenInClass = true;
3754
+ }
3755
+ if (isSyntheticShadow) {
3756
+ setAttribute(elm, makeHostToken(newToken), '');
3757
+ newHasTokenInAttribute = true;
3758
+ }
3759
+ }
3760
+ // Update the styling tokens present on the context object.
3761
+ if (legacy) {
3762
+ context.legacyStylesheetToken = newToken;
3763
+ context.hasLegacyTokenInClass = newHasTokenInClass;
3764
+ context.hasLegacyTokenInAttribute = newHasTokenInAttribute;
3765
+ } else {
3766
+ context.stylesheetToken = newToken;
3767
+ context.hasTokenInClass = newHasTokenInClass;
3768
+ context.hasTokenInAttribute = newHasTokenInAttribute;
3661
3769
  }
3662
3770
  }
3663
- // This implementation relies on the WeakRef/FinalizationRegistry proposal.
3664
- // For some background, see: https://github.com/tc39/proposal-weakrefs
3665
- class ModernWeakMultiMap {
3666
- constructor() {
3667
- this._map = new WeakMap();
3668
- this._registry = new FinalizationRegistry(weakRefs => {
3669
- // This should be considered an optional cleanup method to remove GC'ed values from their respective arrays.
3670
- // JS VMs are not obligated to call FinalizationRegistry callbacks.
3671
- // Work backwards, removing stale VMs
3672
- for (let i = weakRefs.length - 1; i >= 0; i--) {
3673
- const vm = weakRefs[i].deref();
3674
- if (isUndefined$1(vm)) {
3675
- ArraySplice.call(weakRefs, i, 1); // remove
3771
+ function evaluateStylesheetsContent(stylesheets, stylesheetToken, vm) {
3772
+ const content = [];
3773
+ let root;
3774
+ for (let i = 0; i < stylesheets.length; i++) {
3775
+ let stylesheet = stylesheets[i];
3776
+ if (isArray$1(stylesheet)) {
3777
+ ArrayPush$1.apply(content, evaluateStylesheetsContent(stylesheet, stylesheetToken, vm));
3778
+ } else {
3779
+ if (process.env.NODE_ENV !== 'production') {
3780
+ // Check for compiler version mismatch in dev mode only
3781
+ checkVersionMismatch(stylesheet, 'stylesheet');
3782
+ // in dev-mode, we support hot swapping of stylesheet, which means that
3783
+ // the component instance might be attempting to use an old version of
3784
+ // the stylesheet, while internally, we have a replacement for it.
3785
+ stylesheet = getStyleOrSwappedStyle(stylesheet);
3786
+ }
3787
+ const isScopedCss = stylesheet[KEY__SCOPED_CSS];
3788
+ if (lwcRuntimeFlags.DISABLE_LIGHT_DOM_UNSCOPED_CSS && !isScopedCss && vm.renderMode === 0 /* RenderMode.Light */) {
3789
+ logError('Unscoped CSS is not supported in Light DOM in this environment. Please use scoped CSS ' + '(*.scoped.css) instead of unscoped CSS (*.css). See also: https://sfdc.co/scoped-styles-light-dom');
3790
+ continue;
3791
+ }
3792
+ // Apply the scope token only if the stylesheet itself is scoped, or if we're rendering synthetic shadow.
3793
+ const scopeToken = isScopedCss || vm.shadowMode === 1 /* ShadowMode.Synthetic */ && vm.renderMode === 1 /* RenderMode.Shadow */ ? stylesheetToken : undefined;
3794
+ // Use the actual `:host` selector if we're rendering global CSS for light DOM, or if we're rendering
3795
+ // native shadow DOM. Synthetic shadow DOM never uses `:host`.
3796
+ const useActualHostSelector = vm.renderMode === 0 /* RenderMode.Light */ ? !isScopedCss : vm.shadowMode === 0 /* ShadowMode.Native */;
3797
+ // Use the native :dir() pseudoclass only in native shadow DOM. Otherwise, in synthetic shadow,
3798
+ // we use an attribute selector on the host to simulate :dir().
3799
+ let useNativeDirPseudoclass;
3800
+ if (vm.renderMode === 1 /* RenderMode.Shadow */) {
3801
+ useNativeDirPseudoclass = vm.shadowMode === 0 /* ShadowMode.Native */;
3802
+ } else {
3803
+ // Light DOM components should only render `[dir]` if they're inside of a synthetic shadow root.
3804
+ // At the top level (root is null) or inside of a native shadow root, they should use `:dir()`.
3805
+ if (isUndefined$1(root)) {
3806
+ // Only calculate the root once as necessary
3807
+ root = getNearestShadowComponent(vm);
3676
3808
  }
3809
+ useNativeDirPseudoclass = isNull(root) || root.shadowMode === 0 /* ShadowMode.Native */;
3677
3810
  }
3678
- });
3679
- }
3680
- _getWeakRefs(key) {
3681
- let weakRefs = this._map.get(key);
3682
- if (isUndefined$1(weakRefs)) {
3683
- weakRefs = [];
3684
- this._map.set(key, weakRefs);
3685
- }
3686
- return weakRefs;
3687
- }
3688
- get(key) {
3689
- const weakRefs = this._getWeakRefs(key);
3690
- const result = new Set();
3691
- for (const weakRef of weakRefs) {
3692
- const vm = weakRef.deref();
3693
- if (!isUndefined$1(vm)) {
3694
- result.add(vm);
3811
+ const cssContent = stylesheet(scopeToken, useActualHostSelector, useNativeDirPseudoclass);
3812
+ if (process.env.NODE_ENV !== 'production') {
3813
+ linkStylesheetToCssContentInDevMode(stylesheet, cssContent);
3695
3814
  }
3815
+ ArrayPush$1.call(content, cssContent);
3696
3816
  }
3697
- return result;
3698
3817
  }
3699
- add(key, value) {
3700
- const weakRefs = this._getWeakRefs(key);
3701
- // We could check for duplicate values here, but it doesn't seem worth it.
3702
- // We transform the output into a Set anyway
3703
- ArrayPush$1.call(weakRefs, new WeakRef(value));
3704
- // It's important here not to leak the second argument, which is the "held value." The FinalizationRegistry
3705
- // effectively creates a strong reference between the first argument (the "target") and the held value. When
3706
- // the target is GC'ed, the callback is called, and then the held value is GC'ed.
3707
- // Putting the key here would mean the key is not GC'ed until the value is GC'ed, which defeats the purpose
3708
- // of the WeakMap. Whereas putting the weakRefs array here is fine, because it doesn't have a strong reference
3709
- // to anything. See also this example:
3710
- // https://gist.github.com/nolanlawson/79a3d36e8e6cc25c5048bb17c1795aea
3711
- this._registry.register(value, weakRefs);
3818
+ return content;
3819
+ }
3820
+ function getStylesheetsContent(vm, template) {
3821
+ const {
3822
+ stylesheets,
3823
+ stylesheetToken
3824
+ } = template;
3825
+ const {
3826
+ stylesheets: vmStylesheets
3827
+ } = vm;
3828
+ let content = [];
3829
+ if (hasStyles(stylesheets)) {
3830
+ content = evaluateStylesheetsContent(stylesheets, stylesheetToken, vm);
3712
3831
  }
3713
- delete(key) {
3714
- this._map.delete(key);
3832
+ // VM (component) stylesheets apply after template stylesheets
3833
+ if (hasStyles(vmStylesheets)) {
3834
+ ArrayPush$1.apply(content, evaluateStylesheetsContent(vmStylesheets, stylesheetToken, vm));
3715
3835
  }
3836
+ return content;
3716
3837
  }
3717
- const WeakMultiMap = supportsWeakRefs ? ModernWeakMultiMap : LegacyWeakMultiMap;
3718
-
3719
- /*
3720
- * Copyright (c) 2020, salesforce.com, inc.
3721
- * All rights reserved.
3722
- * SPDX-License-Identifier: MIT
3723
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3724
- */
3725
- const swappedTemplateMap = new WeakMap();
3726
- const swappedComponentMap = new WeakMap();
3727
- const swappedStyleMap = new WeakMap();
3728
- // The important thing here is the weak values – VMs are transient (one per component instance) and should be GC'ed,
3729
- // so we don't want to create strong references to them.
3730
- // The weak keys are kind of useless, because Templates, LightningElementConstructors, and StylesheetFactories are
3731
- // never GC'ed. But maybe they will be someday, so we may as well use weak keys too.
3732
- const activeTemplates = new WeakMultiMap();
3733
- const activeComponents = new WeakMultiMap();
3734
- const activeStyles = new WeakMultiMap();
3735
- function rehydrateHotTemplate(tpl) {
3736
- const list = activeTemplates.get(tpl);
3737
- for (const vm of list) {
3738
- if (isFalse(vm.isDirty)) {
3739
- // forcing the vm to rehydrate in the micro-task:
3740
- markComponentAsDirty(vm);
3741
- scheduleRehydration(vm);
3838
+ // It might be worth caching this to avoid doing the lookup repeatedly, but
3839
+ // perf testing has not shown it to be a huge improvement yet:
3840
+ // https://github.com/salesforce/lwc/pull/2460#discussion_r691208892
3841
+ function getNearestShadowComponent(vm) {
3842
+ let owner = vm;
3843
+ while (!isNull(owner)) {
3844
+ if (owner.renderMode === 1 /* RenderMode.Shadow */) {
3845
+ return owner;
3742
3846
  }
3847
+ owner = owner.owner;
3743
3848
  }
3744
- // Resetting the Set since these VMs are no longer related to this template, instead
3745
- // they will get re-associated once these instances are rehydrated.
3746
- activeTemplates.delete(tpl);
3747
- return true;
3849
+ return owner;
3748
3850
  }
3749
- function rehydrateHotStyle(style) {
3750
- const list = activeStyles.get(style);
3751
- for (const vm of list) {
3851
+ /**
3852
+ * If the component that is currently being rendered uses scoped styles,
3853
+ * this returns the unique token for that scoped stylesheet. Otherwise
3854
+ * it returns null.
3855
+ * @param owner
3856
+ * @param legacy
3857
+ */
3858
+ // TODO [#3733]: remove support for legacy scope tokens
3859
+ function getScopeTokenClass(owner, legacy) {
3860
+ const {
3861
+ cmpTemplate,
3862
+ context
3863
+ } = owner;
3864
+ return context.hasScopedStyles && (legacy ? cmpTemplate?.legacyStylesheetToken : cmpTemplate?.stylesheetToken) || null;
3865
+ }
3866
+ /**
3867
+ * This function returns the host style token for a custom element if it
3868
+ * exists. Otherwise it returns null.
3869
+ *
3870
+ * A host style token is applied to the component if scoped styles are used.
3871
+ * @param vnode
3872
+ */
3873
+ function getStylesheetTokenHost(vnode) {
3874
+ const {
3875
+ template
3876
+ } = getComponentInternalDef(vnode.ctor);
3877
+ const {
3878
+ vm
3879
+ } = vnode;
3880
+ const {
3881
+ stylesheetToken
3882
+ } = template;
3883
+ return !isUndefined$1(stylesheetToken) && computeHasScopedStyles(template, vm) ? makeHostToken(stylesheetToken) : null;
3884
+ }
3885
+ function getNearestNativeShadowComponent(vm) {
3886
+ const owner = getNearestShadowComponent(vm);
3887
+ if (!isNull(owner) && owner.shadowMode === 1 /* ShadowMode.Synthetic */) {
3888
+ // Synthetic-within-native is impossible. So if the nearest shadow component is
3889
+ // synthetic, we know we won't find a native component if we go any further.
3890
+ return null;
3891
+ }
3892
+ return owner;
3893
+ }
3894
+ function createStylesheet(vm, stylesheets) {
3895
+ const {
3896
+ renderMode,
3897
+ shadowMode,
3898
+ renderer: {
3899
+ insertStylesheet
3900
+ }
3901
+ } = vm;
3902
+ if (renderMode === 1 /* RenderMode.Shadow */ && shadowMode === 1 /* ShadowMode.Synthetic */) {
3903
+ for (let i = 0; i < stylesheets.length; i++) {
3904
+ const stylesheet = stylesheets[i];
3905
+ insertStylesheet(stylesheet, undefined, getOrCreateAbortSignal(stylesheet));
3906
+ }
3907
+ } else if (vm.hydrated) {
3908
+ // Note: We need to ensure that during hydration, the stylesheets method is the same as those in ssr.
3909
+ // This works in the client, because the stylesheets are created, and cached in the VM
3910
+ // the first time the VM renders.
3911
+ // native shadow or light DOM, SSR
3912
+ return ArrayMap.call(stylesheets, createInlineStyleVNode);
3913
+ } else {
3914
+ // native shadow or light DOM, DOM renderer
3915
+ const root = getNearestNativeShadowComponent(vm);
3916
+ // null root means a global style
3917
+ const target = isNull(root) ? undefined : root.shadowRoot;
3918
+ for (let i = 0; i < stylesheets.length; i++) {
3919
+ const stylesheet = stylesheets[i];
3920
+ insertStylesheet(stylesheet, target, getOrCreateAbortSignal(stylesheet));
3921
+ }
3922
+ }
3923
+ return null;
3924
+ }
3925
+ function unrenderStylesheet(stylesheet) {
3926
+ // should never leak to prod; only used for HMR
3927
+ assertNotProd();
3928
+ const cssContents = stylesheetsToCssContent.get(stylesheet);
3929
+ /* istanbul ignore if */
3930
+ if (isUndefined$1(cssContents)) {
3931
+ throw new Error('Cannot unrender stylesheet which was never rendered');
3932
+ }
3933
+ for (const cssContent of cssContents) {
3934
+ const abortController = cssContentToAbortControllers.get(cssContent);
3935
+ /* istanbul ignore if */
3936
+ if (isUndefined$1(abortController)) {
3937
+ throw new Error('Cannot find AbortController for CSS content');
3938
+ }
3939
+ abortController.abort();
3940
+ // remove association with AbortController in case stylesheet is rendered again
3941
+ cssContentToAbortControllers.delete(cssContent);
3942
+ }
3943
+ }
3944
+
3945
+ /*
3946
+ * Copyright (c) 2023, salesforce.com, inc.
3947
+ * All rights reserved.
3948
+ * SPDX-License-Identifier: MIT
3949
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
3950
+ */
3951
+ const supportsWeakRefs = typeof WeakRef === 'function' && typeof FinalizationRegistry === 'function';
3952
+ // In browsers that doesn't support WeakRefs, the values will still leak, but at least the keys won't
3953
+ class LegacyWeakMultiMap {
3954
+ constructor() {
3955
+ this._map = new WeakMap();
3956
+ }
3957
+ _getValues(key) {
3958
+ let values = this._map.get(key);
3959
+ if (isUndefined$1(values)) {
3960
+ values = new Set();
3961
+ this._map.set(key, values);
3962
+ }
3963
+ return values;
3964
+ }
3965
+ get(key) {
3966
+ return this._getValues(key);
3967
+ }
3968
+ add(key, vm) {
3969
+ const set = this._getValues(key);
3970
+ set.add(vm);
3971
+ }
3972
+ delete(key) {
3973
+ this._map.delete(key);
3974
+ }
3975
+ }
3976
+ // This implementation relies on the WeakRef/FinalizationRegistry proposal.
3977
+ // For some background, see: https://github.com/tc39/proposal-weakrefs
3978
+ class ModernWeakMultiMap {
3979
+ constructor() {
3980
+ this._map = new WeakMap();
3981
+ this._registry = new FinalizationRegistry(weakRefs => {
3982
+ // This should be considered an optional cleanup method to remove GC'ed values from their respective arrays.
3983
+ // JS VMs are not obligated to call FinalizationRegistry callbacks.
3984
+ // Work backwards, removing stale VMs
3985
+ for (let i = weakRefs.length - 1; i >= 0; i--) {
3986
+ const vm = weakRefs[i].deref();
3987
+ if (isUndefined$1(vm)) {
3988
+ ArraySplice.call(weakRefs, i, 1); // remove
3989
+ }
3990
+ }
3991
+ });
3992
+ }
3993
+ _getWeakRefs(key) {
3994
+ let weakRefs = this._map.get(key);
3995
+ if (isUndefined$1(weakRefs)) {
3996
+ weakRefs = [];
3997
+ this._map.set(key, weakRefs);
3998
+ }
3999
+ return weakRefs;
4000
+ }
4001
+ get(key) {
4002
+ const weakRefs = this._getWeakRefs(key);
4003
+ const result = new Set();
4004
+ for (const weakRef of weakRefs) {
4005
+ const vm = weakRef.deref();
4006
+ if (!isUndefined$1(vm)) {
4007
+ result.add(vm);
4008
+ }
4009
+ }
4010
+ return result;
4011
+ }
4012
+ add(key, value) {
4013
+ const weakRefs = this._getWeakRefs(key);
4014
+ // We could check for duplicate values here, but it doesn't seem worth it.
4015
+ // We transform the output into a Set anyway
4016
+ ArrayPush$1.call(weakRefs, new WeakRef(value));
4017
+ // It's important here not to leak the second argument, which is the "held value." The FinalizationRegistry
4018
+ // effectively creates a strong reference between the first argument (the "target") and the held value. When
4019
+ // the target is GC'ed, the callback is called, and then the held value is GC'ed.
4020
+ // Putting the key here would mean the key is not GC'ed until the value is GC'ed, which defeats the purpose
4021
+ // of the WeakMap. Whereas putting the weakRefs array here is fine, because it doesn't have a strong reference
4022
+ // to anything. See also this example:
4023
+ // https://gist.github.com/nolanlawson/79a3d36e8e6cc25c5048bb17c1795aea
4024
+ this._registry.register(value, weakRefs);
4025
+ }
4026
+ delete(key) {
4027
+ this._map.delete(key);
4028
+ }
4029
+ }
4030
+ const WeakMultiMap = supportsWeakRefs ? ModernWeakMultiMap : LegacyWeakMultiMap;
4031
+
4032
+ /*
4033
+ * Copyright (c) 2020, salesforce.com, inc.
4034
+ * All rights reserved.
4035
+ * SPDX-License-Identifier: MIT
4036
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4037
+ */
4038
+ let swappedTemplateMap = /*@__PURE__@*/new WeakMap();
4039
+ let swappedComponentMap = /*@__PURE__@*/new WeakMap();
4040
+ let swappedStyleMap = /*@__PURE__@*/new WeakMap();
4041
+ // The important thing here is the weak values – VMs are transient (one per component instance) and should be GC'ed,
4042
+ // so we don't want to create strong references to them.
4043
+ // The weak keys are kind of useless, because Templates, LightningElementConstructors, and StylesheetFactories are
4044
+ // never GC'ed. But maybe they will be someday, so we may as well use weak keys too.
4045
+ // The "pure" annotations are so that Rollup knows for sure it can remove these from prod mode
4046
+ let activeTemplates = /*@__PURE__@*/new WeakMultiMap();
4047
+ let activeComponents = /*@__PURE__@*/new WeakMultiMap();
4048
+ let activeStyles = /*@__PURE__@*/new WeakMultiMap();
4049
+ // Only used in LWC's Karma tests
4050
+ if (process.env.NODE_ENV === 'test-karma-lwc') {
4051
+ // Used to reset the global state between test runs
4052
+ window.__lwcResetHotSwaps = () => {
4053
+ swappedTemplateMap = new WeakMap();
4054
+ swappedComponentMap = new WeakMap();
4055
+ swappedStyleMap = new WeakMap();
4056
+ activeTemplates = new WeakMultiMap();
4057
+ activeComponents = new WeakMultiMap();
4058
+ activeStyles = new WeakMultiMap();
4059
+ };
4060
+ }
4061
+ function rehydrateHotTemplate(tpl) {
4062
+ const list = activeTemplates.get(tpl);
4063
+ for (const vm of list) {
4064
+ if (isFalse(vm.isDirty)) {
4065
+ // forcing the vm to rehydrate in the micro-task:
4066
+ markComponentAsDirty(vm);
4067
+ scheduleRehydration(vm);
4068
+ }
4069
+ }
4070
+ // Resetting the Set since these VMs are no longer related to this template, instead
4071
+ // they will get re-associated once these instances are rehydrated.
4072
+ activeTemplates.delete(tpl);
4073
+ return true;
4074
+ }
4075
+ function rehydrateHotStyle(style) {
4076
+ const activeVMs = activeStyles.get(style);
4077
+ unrenderStylesheet(style);
4078
+ for (const vm of activeVMs) {
3752
4079
  // if a style definition is swapped, we must reset
3753
4080
  // vm's template content in the next micro-task:
3754
4081
  forceRehydration(vm);
@@ -3786,6 +4113,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
3786
4113
  }
3787
4114
  function getTemplateOrSwappedTemplate(tpl) {
3788
4115
  assertNotProd(); // this method should never leak to prod
4116
+ // TODO [#4154]: shows stale content when swapping content back and forth multiple times
3789
4117
  const visited = new Set();
3790
4118
  while (swappedTemplateMap.has(tpl) && !visited.has(tpl)) {
3791
4119
  visited.add(tpl);
@@ -3795,6 +4123,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
3795
4123
  }
3796
4124
  function getComponentOrSwappedComponent(Ctor) {
3797
4125
  assertNotProd(); // this method should never leak to prod
4126
+ // TODO [#4154]: shows stale content when swapping content back and forth multiple times
3798
4127
  const visited = new Set();
3799
4128
  while (swappedComponentMap.has(Ctor) && !visited.has(Ctor)) {
3800
4129
  visited.add(Ctor);
@@ -3804,6 +4133,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
3804
4133
  }
3805
4134
  function getStyleOrSwappedStyle(style) {
3806
4135
  assertNotProd(); // this method should never leak to prod
4136
+ // TODO [#4154]: shows stale content when swapping content back and forth multiple times
3807
4137
  const visited = new Set();
3808
4138
  while (swappedStyleMap.has(style) && !visited.has(style)) {
3809
4139
  visited.add(style);
@@ -3811,6 +4141,22 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
3811
4141
  }
3812
4142
  return style;
3813
4143
  }
4144
+ function addActiveStylesheets(stylesheets, vm) {
4145
+ if (isUndefined$1(stylesheets) || isNull(stylesheets)) {
4146
+ // Ignore non-existent stylesheets
4147
+ return;
4148
+ }
4149
+ for (const stylesheet of flattenStylesheets(stylesheets)) {
4150
+ // this is necessary because we don't hold the list of styles
4151
+ // in the vm, we only hold the selected (already swapped template)
4152
+ // but the styles attached to the template might not be the actual
4153
+ // active ones, but the swapped versions of those.
4154
+ const swappedStylesheet = getStyleOrSwappedStyle(stylesheet);
4155
+ // this will allow us to keep track of the stylesheet that are
4156
+ // being used by a hot component
4157
+ activeStyles.add(swappedStylesheet, vm);
4158
+ }
4159
+ }
3814
4160
  function setActiveVM(vm) {
3815
4161
  assertNotProd(); // this method should never leak to prod
3816
4162
  // tracking active component
@@ -3818,25 +4164,15 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
3818
4164
  // this will allow us to keep track of the hot components
3819
4165
  activeComponents.add(Ctor, vm);
3820
4166
  // tracking active template
3821
- const tpl = vm.cmpTemplate;
3822
- if (tpl) {
4167
+ const template = vm.cmpTemplate;
4168
+ if (!isNull(template)) {
3823
4169
  // this will allow us to keep track of the templates that are
3824
4170
  // being used by a hot component
3825
- activeTemplates.add(tpl, vm);
3826
- // tracking active styles associated to template
3827
- const stylesheets = tpl.stylesheets;
3828
- if (!isUndefined$1(stylesheets)) {
3829
- for (const stylesheet of flattenStylesheets(stylesheets)) {
3830
- // this is necessary because we don't hold the list of styles
3831
- // in the vm, we only hold the selected (already swapped template)
3832
- // but the styles attached to the template might not be the actual
3833
- // active ones, but the swapped versions of those.
3834
- const swappedStylesheet = getStyleOrSwappedStyle(stylesheet);
3835
- // this will allow us to keep track of the stylesheet that are
3836
- // being used by a hot component
3837
- activeStyles.add(swappedStylesheet, vm);
3838
- }
3839
- }
4171
+ activeTemplates.add(template, vm);
4172
+ // Tracking active styles from the template or the VM. `template.stylesheets` are implicitly associated
4173
+ // (e.g. `foo.css` associated with `foo.html`), whereas `vm.stylesheets` are from `static stylesheets`.
4174
+ addActiveStylesheets(template.stylesheets, vm);
4175
+ addActiveStylesheets(vm.stylesheets, vm);
3840
4176
  }
3841
4177
  }
3842
4178
  function swapTemplate(oldTpl, newTpl) {
@@ -4107,284 +4443,39 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4107
4443
  // for some external services, e.g.: Locker Service, usually, all they care
4108
4444
  // is about the shape of the constructor, the internals of it are not relevant
4109
4445
  // because they don't have a way to mess with that.
4110
- const {
4111
- ctor,
4112
- name,
4113
- props,
4114
- propsConfig,
4115
- methods
4116
- } = def;
4117
- const publicProps = {};
4118
- for (const key in props) {
4119
- // avoid leaking the reference to the public props descriptors
4120
- publicProps[key] = {
4121
- config: propsConfig[key] || 0,
4122
- // a property by default
4123
- type: "any" /* PropDefType.any */,
4124
- // no type inference for public services
4125
- attr: htmlPropertyToAttribute(key)
4126
- };
4127
- }
4128
- const publicMethods = {};
4129
- for (const key in methods) {
4130
- // avoid leaking the reference to the public method descriptors
4131
- publicMethods[key] = methods[key].value;
4132
- }
4133
- return {
4134
- ctor,
4135
- name,
4136
- props: publicProps,
4137
- methods: publicMethods
4138
- };
4139
- }
4140
-
4141
- /*
4142
- * Copyright (c) 2018, salesforce.com, inc.
4143
- * All rights reserved.
4144
- * SPDX-License-Identifier: MIT
4145
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4146
- */
4147
- function makeHostToken(token) {
4148
- // Note: if this ever changes, update the `cssScopeTokens` returned by `@lwc/compiler`
4149
- return `${token}-host`;
4150
- }
4151
- function createInlineStyleVNode(content) {
4152
- return api.h('style', {
4153
- key: 'style',
4154
- // special key
4155
- attrs: {
4156
- type: 'text/css'
4157
- }
4158
- }, [api.t(content)]);
4159
- }
4160
- // TODO [#3733]: remove support for legacy scope tokens
4161
- function updateStylesheetToken(vm, template, legacy) {
4162
- const {
4163
- elm,
4164
- context,
4165
- renderMode,
4166
- shadowMode,
4167
- renderer: {
4168
- getClassList,
4169
- removeAttribute,
4170
- setAttribute
4171
- }
4172
- } = vm;
4173
- const {
4174
- stylesheets: newStylesheets
4175
- } = template;
4176
- const newStylesheetToken = legacy ? template.legacyStylesheetToken : template.stylesheetToken;
4177
- const {
4178
- stylesheets: newVmStylesheets
4179
- } = vm;
4180
- const isSyntheticShadow = renderMode === 1 /* RenderMode.Shadow */ && shadowMode === 1 /* ShadowMode.Synthetic */;
4181
- const {
4182
- hasScopedStyles
4183
- } = context;
4184
- let newToken;
4185
- let newHasTokenInClass;
4186
- let newHasTokenInAttribute;
4187
- // Reset the styling token applied to the host element.
4188
- let oldToken;
4189
- let oldHasTokenInClass;
4190
- let oldHasTokenInAttribute;
4191
- if (legacy) {
4192
- oldToken = context.legacyStylesheetToken;
4193
- oldHasTokenInClass = context.hasLegacyTokenInClass;
4194
- oldHasTokenInAttribute = context.hasLegacyTokenInAttribute;
4195
- } else {
4196
- oldToken = context.stylesheetToken;
4197
- oldHasTokenInClass = context.hasTokenInClass;
4198
- oldHasTokenInAttribute = context.hasTokenInAttribute;
4199
- }
4200
- if (!isUndefined$1(oldToken)) {
4201
- if (oldHasTokenInClass) {
4202
- getClassList(elm).remove(makeHostToken(oldToken));
4203
- }
4204
- if (oldHasTokenInAttribute) {
4205
- removeAttribute(elm, makeHostToken(oldToken));
4206
- }
4207
- }
4208
- // Apply the new template styling token to the host element, if the new template has any
4209
- // associated stylesheets. In the case of light DOM, also ensure there is at least one scoped stylesheet.
4210
- const hasNewStylesheets = hasStyles(newStylesheets);
4211
- const hasNewVmStylesheets = hasStyles(newVmStylesheets);
4212
- if (hasNewStylesheets || hasNewVmStylesheets) {
4213
- newToken = newStylesheetToken;
4214
- }
4215
- // Set the new styling token on the host element
4216
- if (!isUndefined$1(newToken)) {
4217
- if (hasScopedStyles) {
4218
- getClassList(elm).add(makeHostToken(newToken));
4219
- newHasTokenInClass = true;
4220
- }
4221
- if (isSyntheticShadow) {
4222
- setAttribute(elm, makeHostToken(newToken), '');
4223
- newHasTokenInAttribute = true;
4224
- }
4225
- }
4226
- // Update the styling tokens present on the context object.
4227
- if (legacy) {
4228
- context.legacyStylesheetToken = newToken;
4229
- context.hasLegacyTokenInClass = newHasTokenInClass;
4230
- context.hasLegacyTokenInAttribute = newHasTokenInAttribute;
4231
- } else {
4232
- context.stylesheetToken = newToken;
4233
- context.hasTokenInClass = newHasTokenInClass;
4234
- context.hasTokenInAttribute = newHasTokenInAttribute;
4235
- }
4236
- }
4237
- function evaluateStylesheetsContent(stylesheets, stylesheetToken, vm) {
4238
- const content = [];
4239
- let root;
4240
- for (let i = 0; i < stylesheets.length; i++) {
4241
- let stylesheet = stylesheets[i];
4242
- if (isArray$1(stylesheet)) {
4243
- ArrayPush$1.apply(content, evaluateStylesheetsContent(stylesheet, stylesheetToken, vm));
4244
- } else {
4245
- if (process.env.NODE_ENV !== 'production') {
4246
- // Check for compiler version mismatch in dev mode only
4247
- checkVersionMismatch(stylesheet, 'stylesheet');
4248
- // in dev-mode, we support hot swapping of stylesheet, which means that
4249
- // the component instance might be attempting to use an old version of
4250
- // the stylesheet, while internally, we have a replacement for it.
4251
- stylesheet = getStyleOrSwappedStyle(stylesheet);
4252
- }
4253
- const isScopedCss = stylesheet[KEY__SCOPED_CSS];
4254
- if (lwcRuntimeFlags.DISABLE_LIGHT_DOM_UNSCOPED_CSS && !isScopedCss && vm.renderMode === 0 /* RenderMode.Light */) {
4255
- logError('Unscoped CSS is not supported in Light DOM in this environment. Please use scoped CSS ' + '(*.scoped.css) instead of unscoped CSS (*.css). See also: https://sfdc.co/scoped-styles-light-dom');
4256
- continue;
4257
- }
4258
- // Apply the scope token only if the stylesheet itself is scoped, or if we're rendering synthetic shadow.
4259
- const scopeToken = isScopedCss || vm.shadowMode === 1 /* ShadowMode.Synthetic */ && vm.renderMode === 1 /* RenderMode.Shadow */ ? stylesheetToken : undefined;
4260
- // Use the actual `:host` selector if we're rendering global CSS for light DOM, or if we're rendering
4261
- // native shadow DOM. Synthetic shadow DOM never uses `:host`.
4262
- const useActualHostSelector = vm.renderMode === 0 /* RenderMode.Light */ ? !isScopedCss : vm.shadowMode === 0 /* ShadowMode.Native */;
4263
- // Use the native :dir() pseudoclass only in native shadow DOM. Otherwise, in synthetic shadow,
4264
- // we use an attribute selector on the host to simulate :dir().
4265
- let useNativeDirPseudoclass;
4266
- if (vm.renderMode === 1 /* RenderMode.Shadow */) {
4267
- useNativeDirPseudoclass = vm.shadowMode === 0 /* ShadowMode.Native */;
4268
- } else {
4269
- // Light DOM components should only render `[dir]` if they're inside of a synthetic shadow root.
4270
- // At the top level (root is null) or inside of a native shadow root, they should use `:dir()`.
4271
- if (isUndefined$1(root)) {
4272
- // Only calculate the root once as necessary
4273
- root = getNearestShadowComponent(vm);
4274
- }
4275
- useNativeDirPseudoclass = isNull(root) || root.shadowMode === 0 /* ShadowMode.Native */;
4276
- }
4277
- ArrayPush$1.call(content, stylesheet(scopeToken, useActualHostSelector, useNativeDirPseudoclass));
4278
- }
4279
- }
4280
- return content;
4281
- }
4282
- function getStylesheetsContent(vm, template) {
4283
- const {
4284
- stylesheets,
4285
- stylesheetToken
4286
- } = template;
4287
- const {
4288
- stylesheets: vmStylesheets
4289
- } = vm;
4290
- let content = [];
4291
- if (hasStyles(stylesheets)) {
4292
- content = evaluateStylesheetsContent(stylesheets, stylesheetToken, vm);
4293
- }
4294
- // VM (component) stylesheets apply after template stylesheets
4295
- if (hasStyles(vmStylesheets)) {
4296
- ArrayPush$1.apply(content, evaluateStylesheetsContent(vmStylesheets, stylesheetToken, vm));
4297
- }
4298
- return content;
4299
- }
4300
- // It might be worth caching this to avoid doing the lookup repeatedly, but
4301
- // perf testing has not shown it to be a huge improvement yet:
4302
- // https://github.com/salesforce/lwc/pull/2460#discussion_r691208892
4303
- function getNearestShadowComponent(vm) {
4304
- let owner = vm;
4305
- while (!isNull(owner)) {
4306
- if (owner.renderMode === 1 /* RenderMode.Shadow */) {
4307
- return owner;
4308
- }
4309
- owner = owner.owner;
4310
- }
4311
- return owner;
4312
- }
4313
- /**
4314
- * If the component that is currently being rendered uses scoped styles,
4315
- * this returns the unique token for that scoped stylesheet. Otherwise
4316
- * it returns null.
4317
- * @param owner
4318
- * @param legacy
4319
- */
4320
- // TODO [#3733]: remove support for legacy scope tokens
4321
- function getScopeTokenClass(owner, legacy) {
4322
- const {
4323
- cmpTemplate,
4324
- context
4325
- } = owner;
4326
- return context.hasScopedStyles && (legacy ? cmpTemplate?.legacyStylesheetToken : cmpTemplate?.stylesheetToken) || null;
4327
- }
4328
- /**
4329
- * This function returns the host style token for a custom element if it
4330
- * exists. Otherwise it returns null.
4331
- *
4332
- * A host style token is applied to the component if scoped styles are used.
4333
- * @param vnode
4334
- */
4335
- function getStylesheetTokenHost(vnode) {
4336
- const {
4337
- template
4338
- } = getComponentInternalDef(vnode.ctor);
4339
- const {
4340
- vm
4341
- } = vnode;
4342
- const {
4343
- stylesheetToken
4344
- } = template;
4345
- return !isUndefined$1(stylesheetToken) && computeHasScopedStyles(template, vm) ? makeHostToken(stylesheetToken) : null;
4346
- }
4347
- function getNearestNativeShadowComponent(vm) {
4348
- const owner = getNearestShadowComponent(vm);
4349
- if (!isNull(owner) && owner.shadowMode === 1 /* ShadowMode.Synthetic */) {
4350
- // Synthetic-within-native is impossible. So if the nearest shadow component is
4351
- // synthetic, we know we won't find a native component if we go any further.
4352
- return null;
4353
- }
4354
- return owner;
4355
- }
4356
- function createStylesheet(vm, stylesheets) {
4357
- const {
4358
- renderMode,
4359
- shadowMode,
4360
- renderer: {
4361
- insertStylesheet
4362
- }
4363
- } = vm;
4364
- if (renderMode === 1 /* RenderMode.Shadow */ && shadowMode === 1 /* ShadowMode.Synthetic */) {
4365
- for (let i = 0; i < stylesheets.length; i++) {
4366
- insertStylesheet(stylesheets[i]);
4367
- }
4368
- } else if (vm.hydrated) {
4369
- // Note: We need to ensure that during hydration, the stylesheets method is the same as those in ssr.
4370
- // This works in the client, because the stylesheets are created, and cached in the VM
4371
- // the first time the VM renders.
4372
- // native shadow or light DOM, SSR
4373
- return ArrayMap.call(stylesheets, createInlineStyleVNode);
4374
- } else {
4375
- // native shadow or light DOM, DOM renderer
4376
- const root = getNearestNativeShadowComponent(vm);
4377
- // null root means a global style
4378
- const target = isNull(root) ? undefined : root.shadowRoot;
4379
- for (let i = 0; i < stylesheets.length; i++) {
4380
- insertStylesheet(stylesheets[i], target);
4381
- }
4446
+ const {
4447
+ ctor,
4448
+ name,
4449
+ props,
4450
+ propsConfig,
4451
+ methods
4452
+ } = def;
4453
+ const publicProps = {};
4454
+ for (const key in props) {
4455
+ // avoid leaking the reference to the public props descriptors
4456
+ publicProps[key] = {
4457
+ config: propsConfig[key] || 0,
4458
+ // a property by default
4459
+ type: "any" /* PropDefType.any */,
4460
+ // no type inference for public services
4461
+ attr: htmlPropertyToAttribute(key)
4462
+ };
4382
4463
  }
4383
- return null;
4464
+ const publicMethods = {};
4465
+ for (const key in methods) {
4466
+ // avoid leaking the reference to the public method descriptors
4467
+ publicMethods[key] = methods[key].value;
4468
+ }
4469
+ return {
4470
+ ctor,
4471
+ name,
4472
+ props: publicProps,
4473
+ methods: publicMethods
4474
+ };
4384
4475
  }
4385
4476
 
4386
4477
  /*
4387
- * Copyright (c) 2018, salesforce.com, inc.
4478
+ * Copyright (c) 2024, Salesforce, Inc.
4388
4479
  * All rights reserved.
4389
4480
  * SPDX-License-Identifier: MIT
4390
4481
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
@@ -4410,6 +4501,12 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4410
4501
  function isVStatic(vnode) {
4411
4502
  return vnode.type === 4 /* VNodeType.Static */;
4412
4503
  }
4504
+ function isVStaticPartElement(vnode) {
4505
+ return vnode.type === 1 /* VStaticPartType.Element */;
4506
+ }
4507
+ function isVStaticPartText(vnode) {
4508
+ return vnode.type === 0 /* VStaticPartType.Text */;
4509
+ }
4413
4510
 
4414
4511
  /*
4415
4512
  * Copyright (c) 2018, salesforce.com, inc.
@@ -4420,9 +4517,12 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4420
4517
  const ColonCharCode = 58;
4421
4518
  function patchAttributes(oldVnode, vnode, renderer) {
4422
4519
  const {
4423
- attrs,
4424
- external
4425
- } = vnode.data;
4520
+ data,
4521
+ elm
4522
+ } = vnode;
4523
+ const {
4524
+ attrs
4525
+ } = data;
4426
4526
  if (isUndefined$1(attrs)) {
4427
4527
  return;
4428
4528
  }
@@ -4431,9 +4531,8 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4431
4531
  if (oldAttrs === attrs) {
4432
4532
  return;
4433
4533
  }
4434
- const {
4435
- elm
4436
- } = vnode;
4534
+ // Note VStaticPartData does not contain the external property so it will always default to false.
4535
+ const external = 'external' in data ? data.external : false;
4437
4536
  const {
4438
4537
  setAttribute,
4439
4538
  removeAttribute,
@@ -4549,8 +4648,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4549
4648
  */
4550
4649
  const classNameToClassMap = create(null);
4551
4650
  function getMapFromClassName(className) {
4552
- // Intentionally using == to match undefined and null values from computed style attribute
4553
- if (className == null) {
4651
+ if (isUndefined$1(className) || isNull(className) || className === '') {
4554
4652
  return EmptyObject;
4555
4653
  }
4556
4654
  // computed class names must be string
@@ -4594,12 +4692,18 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4594
4692
  if (oldClass === newClass) {
4595
4693
  return;
4596
4694
  }
4695
+ const newClassMap = getMapFromClassName(newClass);
4696
+ const oldClassMap = getMapFromClassName(oldClass);
4697
+ if (oldClassMap === newClassMap) {
4698
+ // These objects are cached by className string (`classNameToClassMap`), so we can only get here if there is
4699
+ // a key collision due to types, e.g. oldClass is `undefined` and newClass is `""` (empty string), or oldClass
4700
+ // is `1` (number) and newClass is `"1"` (string).
4701
+ return;
4702
+ }
4597
4703
  const {
4598
4704
  getClassList
4599
4705
  } = renderer;
4600
4706
  const classList = getClassList(elm);
4601
- const newClassMap = getMapFromClassName(newClass);
4602
- const oldClassMap = getMapFromClassName(oldClass);
4603
4707
  let name;
4604
4708
  for (name in oldClassMap) {
4605
4709
  // remove only if it is not in the new class collection and it is not set from within the instance
@@ -4621,13 +4725,18 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4621
4725
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4622
4726
  */
4623
4727
  // The style property is a string when defined via an expression in the template.
4624
- function patchStyleAttribute(oldVnode, vnode, renderer) {
4728
+ function patchStyleAttribute(oldVnode, vnode, renderer, owner) {
4625
4729
  const {
4626
4730
  elm,
4627
4731
  data: {
4628
4732
  style: newStyle
4629
4733
  }
4630
4734
  } = vnode;
4735
+ if (process.env.NODE_ENV !== 'production') {
4736
+ if (!isNull(newStyle) && !isUndefined$1(newStyle) && !isString(newStyle)) {
4737
+ logError(`Invalid 'style' attribute passed to <${elm.tagName.toLowerCase()}> is ignored. This attribute must be a string value.`, owner);
4738
+ }
4739
+ }
4631
4740
  const oldStyle = isNull(oldVnode) ? undefined : oldVnode.data.style;
4632
4741
  if (oldStyle === newStyle) {
4633
4742
  return;
@@ -4651,9 +4760,12 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4651
4760
  */
4652
4761
  function applyEventListeners(vnode, renderer) {
4653
4762
  const {
4654
- elm
4763
+ elm,
4764
+ data
4655
4765
  } = vnode;
4656
- const on = vnode.data?.on;
4766
+ const {
4767
+ on
4768
+ } = data;
4657
4769
  if (isUndefined$1(on)) {
4658
4770
  return;
4659
4771
  }
@@ -4751,11 +4863,51 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4751
4863
  }
4752
4864
 
4753
4865
  /*
4754
- * Copyright (c) 2023, salesforce.com, inc.
4866
+ * Copyright (c) 2024, salesforce.com, inc.
4867
+ * All rights reserved.
4868
+ * SPDX-License-Identifier: MIT
4869
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4870
+ */
4871
+ function patchTextVNode(n1, n2, renderer) {
4872
+ n2.elm = n1.elm;
4873
+ if (n2.text !== n1.text) {
4874
+ updateTextContent$1(n2, renderer);
4875
+ }
4876
+ }
4877
+ function patchTextVStaticPart(n1, n2, renderer) {
4878
+ if (isNull(n1) || n2.text !== n1.text) {
4879
+ updateTextContent$1(n2, renderer);
4880
+ }
4881
+ }
4882
+ function updateTextContent$1(vnode, renderer) {
4883
+ const {
4884
+ elm,
4885
+ text
4886
+ } = vnode;
4887
+ const {
4888
+ setText
4889
+ } = renderer;
4890
+ if (process.env.NODE_ENV !== 'production') {
4891
+ unlockDomMutation();
4892
+ }
4893
+ setText(elm, text);
4894
+ if (process.env.NODE_ENV !== 'production') {
4895
+ lockDomMutation();
4896
+ }
4897
+ }
4898
+
4899
+ /*
4900
+ * Copyright (c) 2024, Salesforce, Inc.
4755
4901
  * All rights reserved.
4756
4902
  * SPDX-License-Identifier: MIT
4757
4903
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
4758
4904
  */
4905
+ /**
4906
+ * Given an array of static parts, mounts the DOM element to the part based on the staticPartId
4907
+ * @param root the root element
4908
+ * @param parts an array of VStaticParts
4909
+ * @param renderer the renderer to use
4910
+ */
4759
4911
  function traverseAndSetElements(root, parts, renderer) {
4760
4912
  const numParts = parts.length;
4761
4913
  // Optimization given that, in most cases, there will be one part, and it's just the root
@@ -4771,34 +4923,59 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4771
4923
  for (const staticPart of parts) {
4772
4924
  partIdsToParts.set(staticPart.partId, staticPart);
4773
4925
  }
4774
- let numFoundParts = 0;
4926
+ // Note that we traverse using `*Child`/`*Sibling` rather than `children` because the browser uses a linked
4927
+ // list under the hood to represent the DOM tree, so it's faster to do this than to create an underlying array
4928
+ // by calling `children`.
4775
4929
  const {
4776
- previousSibling,
4777
- getLastChild
4930
+ nextSibling,
4931
+ getFirstChild,
4932
+ getParentNode
4778
4933
  } = renderer;
4779
- const stack = [root];
4934
+ let numFoundParts = 0;
4780
4935
  let partId = -1;
4936
+ // We should never traverse up to the root. We should exit early due to numFoundParts === numParts.
4937
+ // This is just a sanity check, in case the static parts generated by @lwc/template-compiler are wrong.
4938
+ function assertNotRoot(node) {
4939
+ if (process.env.NODE_ENV !== 'production') {
4940
+ assert.isFalse(node === root, `Reached the root without finding all parts. Found ${numFoundParts}, needed ${numParts}.`);
4941
+ }
4942
+ }
4781
4943
  // Depth-first traversal. We assign a partId to each element, which is an integer based on traversal order.
4782
- while (stack.length > 0) {
4783
- const elm = ArrayShift.call(stack);
4944
+ // This function is very hot, which is why it's micro-optimized. Note we don't use a stack at all; we traverse
4945
+ // using an algorithm that relies on the parentNode getter: https://stackoverflow.com/a/5285417
4946
+ // This is very slightly faster than a TreeWalker (~0.5% on js-framework-benchmark create-10k), but basically
4947
+ // the same idea.
4948
+ let node = root;
4949
+ while (!isNull(node)) {
4950
+ // visit node
4784
4951
  partId++;
4785
4952
  const part = partIdsToParts.get(partId);
4786
4953
  if (!isUndefined$1(part)) {
4787
- part.elm = elm;
4788
- if (++numFoundParts === numParts) {
4954
+ part.elm = node;
4955
+ numFoundParts++;
4956
+ if (numFoundParts === numParts) {
4789
4957
  return; // perf optimization - stop traversing once we've found everything we need
4790
4958
  }
4791
4959
  }
4792
- // For depth-first traversal, prepend to the stack in reverse order
4793
- // Note that we traverse using `*Child`/`*Sibling` rather than `children` because the browser uses a linked
4794
- // list under the hood to represent the DOM tree, so it's faster to do this than to create an underlying array
4795
- // by calling `children`.
4796
- let child = getLastChild(elm);
4797
- while (!isNull(child)) {
4798
- ArrayUnshift.call(stack, child);
4799
- child = previousSibling(child);
4960
+ const child = getFirstChild(node);
4961
+ if (!isNull(child)) {
4962
+ // walk down
4963
+ node = child;
4964
+ } else {
4965
+ let sibling;
4966
+ while (isNull(sibling = nextSibling(node))) {
4967
+ // we never want to walk up from the root
4968
+ assertNotRoot(node);
4969
+ // walk up
4970
+ node = getParentNode(node);
4971
+ }
4972
+ // we never want to walk right from the root
4973
+ assertNotRoot(node);
4974
+ // walk right
4975
+ node = sibling;
4800
4976
  }
4801
4977
  }
4978
+ /* istanbul ignore next */
4802
4979
  if (process.env.NODE_ENV !== 'production') {
4803
4980
  assert.isTrue(numFoundParts === numParts, `Should have found all parts by now. Found ${numFoundParts}, needed ${numParts}.`);
4804
4981
  }
@@ -4822,18 +4999,29 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4822
4999
  traverseAndSetElements(root, parts, renderer);
4823
5000
  // Currently only event listeners and refs are supported for static vnodes
4824
5001
  for (const part of parts) {
4825
- // Event listeners only need to be applied once when mounting
4826
- applyEventListeners(part, renderer);
4827
- // Refs must be updated after every render due to refVNodes getting reset before every render
4828
- applyRefs(part, owner);
5002
+ if (isVStaticPartElement(part)) {
5003
+ // Event listeners only need to be applied once when mounting
5004
+ applyEventListeners(part, renderer);
5005
+ // Refs must be updated after every render due to refVNodes getting reset before every render
5006
+ applyRefs(part, owner);
5007
+ patchAttributes(null, part, renderer);
5008
+ patchClassAttribute(null, part, renderer);
5009
+ patchStyleAttribute(null, part, renderer, owner);
5010
+ } else {
5011
+ if (process.env.NODE_ENV !== 'production' && !isVStaticPartText(part)) {
5012
+ throw new Error(`LWC internal error, encountered unknown static part type: ${part.type}`);
5013
+ }
5014
+ patchTextVStaticPart(null, part, renderer);
5015
+ }
4829
5016
  }
4830
5017
  }
4831
5018
  /**
4832
- * Mounts elements to the newly generated VStatic node
5019
+ * Updates the static elements based on the content of the VStaticParts
4833
5020
  * @param n1 the previous VStatic vnode
4834
5021
  * @param n2 the current VStatic vnode
5022
+ * @param renderer the renderer to use
4835
5023
  */
4836
- function patchStaticParts(n1, n2) {
5024
+ function patchStaticParts(n1, n2, renderer) {
4837
5025
  const {
4838
5026
  parts: currParts,
4839
5027
  owner: currPartsOwner
@@ -4848,17 +5036,53 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4848
5036
  assert.isTrue(currParts.length === prevParts?.length, 'Expected static parts to be the same for the same element. This is an error with the LWC framework itself.');
4849
5037
  }
4850
5038
  for (let i = 0; i < currParts.length; i++) {
5039
+ const prevPart = prevParts[i];
4851
5040
  const part = currParts[i];
4852
5041
  // Patch only occurs if the vnode is newly generated, which means the part.elm is always undefined
4853
5042
  // Since the vnode and elements are the same we can safely assume that prevParts[i].elm is defined.
4854
- part.elm = prevParts[i].elm;
4855
- // Refs must be updated after every render due to refVNodes getting reset before every render
4856
- applyRefs(part, currPartsOwner);
5043
+ part.elm = prevPart.elm;
5044
+ if (process.env.NODE_ENV !== 'production' && prevPart.type !== part.type) {
5045
+ throw new Error(`LWC internal error, static part types do not match. Previous type was ${prevPart.type} and current type is ${part.type}`);
5046
+ }
5047
+ if (isVStaticPartElement(part)) {
5048
+ // Refs must be updated after every render due to refVNodes getting reset before every render
5049
+ applyRefs(part, currPartsOwner);
5050
+ patchAttributes(prevPart, part, renderer);
5051
+ patchClassAttribute(prevPart, part, renderer);
5052
+ patchStyleAttribute(prevPart, part, renderer, currPartsOwner);
5053
+ } else {
5054
+ patchTextVStaticPart(null, part, renderer);
5055
+ }
5056
+ }
5057
+ }
5058
+ /**
5059
+ * Mounts the hydration specific attributes
5060
+ * @param vnode the parent VStatic node
5061
+ * @param renderer the renderer to use
5062
+ */
5063
+ function hydrateStaticParts(vnode, renderer) {
5064
+ const {
5065
+ parts,
5066
+ owner
5067
+ } = vnode;
5068
+ if (isUndefined$1(parts)) {
5069
+ return;
5070
+ }
5071
+ // Note, hydration doesn't patch attributes because hydration validation occurs before this routine
5072
+ // which guarantees that the elements are the same.
5073
+ // We only need to apply the parts for things that cannot be done on the server.
5074
+ for (const part of parts) {
5075
+ if (isVStaticPartElement(part)) {
5076
+ // Event listeners only need to be applied once when mounting
5077
+ applyEventListeners(part, renderer);
5078
+ // Refs must be updated after every render due to refVNodes getting reset before every render
5079
+ applyRefs(part, owner);
5080
+ }
4857
5081
  }
4858
5082
  }
4859
5083
 
4860
5084
  /*
4861
- * Copyright (c) 2018, salesforce.com, inc.
5085
+ * Copyright (c) 2024, Salesforce, Inc.
4862
5086
  * All rights reserved.
4863
5087
  * SPDX-License-Identifier: MIT
4864
5088
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
@@ -4893,7 +5117,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4893
5117
  switch (n2.type) {
4894
5118
  case 0 /* VNodeType.Text */:
4895
5119
  // VText has no special capability, fallback to the owner's renderer
4896
- patchText(n1, n2, renderer);
5120
+ patchTextVNode(n1, n2, renderer);
4897
5121
  break;
4898
5122
  case 1 /* VNodeType.Comment */:
4899
5123
  // VComment has no special capability, fallback to the owner's renderer
@@ -4940,12 +5164,6 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4940
5164
  break;
4941
5165
  }
4942
5166
  }
4943
- function patchText(n1, n2, renderer) {
4944
- n2.elm = n1.elm;
4945
- if (n2.text !== n1.text) {
4946
- updateTextContent(n2, renderer);
4947
- }
4948
- }
4949
5167
  function mountText(vnode, parent, anchor, renderer) {
4950
5168
  const {
4951
5169
  owner
@@ -4962,7 +5180,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
4962
5180
  // FIXME: Comment nodes should be static, we shouldn't need to diff them together. However
4963
5181
  // it is the case today.
4964
5182
  if (n2.text !== n1.text) {
4965
- updateTextContent(n2, renderer);
5183
+ updateTextContent$1(n2, renderer);
4966
5184
  }
4967
5185
  }
4968
5186
  function mountComment(vnode, parent, anchor, renderer) {
@@ -5022,7 +5240,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5022
5240
  // slotAssignments can only apply to the top level element, never to a static part.
5023
5241
  patchSlotAssignment(n1, n2, renderer);
5024
5242
  // The `refs` object is blown away in every re-render, so we always need to re-apply them
5025
- patchStaticParts(n1, n2);
5243
+ patchStaticParts(n1, n2, renderer);
5026
5244
  }
5027
5245
  function patchElement(n1, n2, renderer) {
5028
5246
  const elm = n2.elm = n1.elm;
@@ -5038,22 +5256,23 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5038
5256
  isSyntheticShadowDefined
5039
5257
  } = renderer;
5040
5258
  const elm = vnode.elm = cloneNode(vnode.fragment, true);
5259
+ // Define the root node shadow resolver
5041
5260
  linkNodeToShadow(elm, owner, renderer);
5042
5261
  applyElementRestrictions(elm, vnode);
5043
- // Marks this node as Static to propagate the shadow resolver. must happen after elm is assigned to the proper shadow
5044
5262
  const {
5045
5263
  renderMode,
5046
5264
  shadowMode
5047
5265
  } = owner;
5048
5266
  if (isSyntheticShadowDefined) {
5267
+ // Marks this node as Static to propagate the shadow resolver. must happen after elm is assigned to the proper shadow
5049
5268
  if (shadowMode === 1 /* ShadowMode.Synthetic */ || renderMode === 0 /* RenderMode.Light */) {
5050
5269
  elm[KEY__SHADOW_STATIC] = true;
5051
5270
  }
5052
5271
  }
5053
5272
  // slotAssignments can only apply to the top level element, never to a static part.
5054
5273
  patchSlotAssignment(null, vnode, renderer);
5055
- insertNode(elm, parent, anchor, renderer);
5056
5274
  mountStaticParts(elm, vnode, renderer);
5275
+ insertNode(elm, parent, anchor, renderer);
5057
5276
  }
5058
5277
  function mountCustomElement(vnode, parent, anchor, renderer) {
5059
5278
  const {
@@ -5234,22 +5453,6 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5234
5453
  }
5235
5454
  }
5236
5455
  }
5237
- function updateTextContent(vnode, renderer) {
5238
- const {
5239
- elm,
5240
- text
5241
- } = vnode;
5242
- const {
5243
- setText
5244
- } = renderer;
5245
- if (process.env.NODE_ENV !== 'production') {
5246
- unlockDomMutation();
5247
- }
5248
- setText(elm, text);
5249
- if (process.env.NODE_ENV !== 'production') {
5250
- lockDomMutation();
5251
- }
5252
- }
5253
5456
  function insertFragmentOrNode(vnode, parent, anchor, renderer) {
5254
5457
  if (process.env.NODE_ENV !== 'production') {
5255
5458
  unlockDomMutation();
@@ -5293,15 +5496,18 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5293
5496
  applyStaticClassAttribute(vnode, renderer);
5294
5497
  applyStaticStyleAttribute(vnode, renderer);
5295
5498
  }
5499
+ const {
5500
+ owner
5501
+ } = vnode;
5296
5502
  // Attrs need to be applied to element before props IE11 will wipe out value on radio inputs if
5297
5503
  // value is set before type=radio.
5298
5504
  patchClassAttribute(oldVnode, vnode, renderer);
5299
- patchStyleAttribute(oldVnode, vnode, renderer);
5505
+ patchStyleAttribute(oldVnode, vnode, renderer, owner);
5300
5506
  patchAttributes(oldVnode, vnode, renderer);
5301
5507
  patchProps(oldVnode, vnode, renderer);
5302
5508
  patchSlotAssignment(oldVnode, vnode, renderer);
5303
5509
  // The `refs` object is blown away in every re-render, so we always need to re-apply them
5304
- applyRefs(vnode, vnode.owner);
5510
+ applyRefs(vnode, owner);
5305
5511
  }
5306
5512
  function applyStyleScoping(elm, owner, renderer) {
5307
5513
  const {
@@ -5699,7 +5905,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5699
5905
  }
5700
5906
 
5701
5907
  /*
5702
- * Copyright (c) 2018, salesforce.com, inc.
5908
+ * Copyright (c) 2024, Salesforce, Inc.
5703
5909
  * All rights reserved.
5704
5910
  * SPDX-License-Identifier: MIT
5705
5911
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
@@ -5709,10 +5915,14 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5709
5915
  ArrayPush$1.call(getVMBeingRendered().velements, vnode);
5710
5916
  }
5711
5917
  // [s]tatic [p]art
5712
- function sp(partId, data) {
5918
+ function sp(partId, data, text) {
5919
+ // Static part will always have either text or data, it's guaranteed by the compiler.
5920
+ const type = isNull(text) ? 1 /* VStaticPartType.Element */ : 0 /* VStaticPartType.Text */;
5713
5921
  return {
5922
+ type,
5714
5923
  partId,
5715
5924
  data,
5925
+ text,
5716
5926
  elm: undefined // elm is defined later
5717
5927
  };
5718
5928
  }
@@ -5729,8 +5939,9 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5729
5939
  };
5730
5940
  }
5731
5941
  // [st]atic node
5732
- function st(fragment, key, parts) {
5942
+ function st(fragmentFactory, key, parts) {
5733
5943
  const owner = getVMBeingRendered();
5944
+ const fragment = fragmentFactory(parts);
5734
5945
  const vnode = {
5735
5946
  type: 4 /* VNodeType.Static */,
5736
5947
  sel: undefined,
@@ -5772,9 +5983,6 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5772
5983
  // checking reserved internal data properties
5773
5984
  assert.isFalse(data.className && data.classMap, `vnode.data.className and vnode.data.classMap ambiguous declaration.`);
5774
5985
  assert.isFalse(data.styleDecls && data.style, `vnode.data.styleDecls and vnode.data.style ambiguous declaration.`);
5775
- if (data.style && !isString(data.style)) {
5776
- logError(`Invalid 'style' attribute passed to <${sel}> is ignored. This attribute must be a string value.`, vmBeingRendered);
5777
- }
5778
5986
  forEach.call(children, childVnode => {
5779
5987
  if (childVnode != null) {
5780
5988
  assert.isTrue('type' in childVnode && 'sel' in childVnode && 'elm' in childVnode && 'key' in childVnode, `${childVnode} is not a vnode.`);
@@ -5984,22 +6192,28 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
5984
6192
  if (isArray$1(vnode)) {
5985
6193
  ArrayPush$1.apply(list, vnode);
5986
6194
  } else {
6195
+ // `isArray` doesn't narrow this block properly...
5987
6196
  ArrayPush$1.call(list, vnode);
5988
6197
  }
5989
6198
  if (process.env.NODE_ENV !== 'production') {
5990
6199
  const vnodes = isArray$1(vnode) ? vnode : [vnode];
5991
6200
  forEach.call(vnodes, childVnode => {
5992
- if (!isNull(childVnode) && isObject(childVnode) && !isUndefined$1(childVnode.sel)) {
6201
+ // Check that the child vnode is either an element or VStatic
6202
+ if (!isNull(childVnode) && (isVBaseElement(childVnode) || isVStatic(childVnode))) {
5993
6203
  const {
5994
6204
  key
5995
6205
  } = childVnode;
6206
+ // In @lwc/engine-server the fragment doesn't have a tagName, default to the VM's tagName.
6207
+ const {
6208
+ tagName
6209
+ } = vmBeingRendered;
5996
6210
  if (isString(key) || isNumber(key)) {
5997
6211
  if (keyMap[key] === 1 && isUndefined$1(iterationError)) {
5998
- iterationError = `Duplicated "key" attribute value for "<${childVnode.sel}>" in ${vmBeingRendered} for item number ${j}. A key with value "${childVnode.key}" appears more than once in the iteration. Key values must be unique numbers or strings.`;
6212
+ iterationError = `Duplicated "key" attribute value in "<${tagName}>" for item number ${j}. A key with value "${key}" appears more than once in the iteration. Key values must be unique numbers or strings.`;
5999
6213
  }
6000
6214
  keyMap[key] = 1;
6001
6215
  } else if (isUndefined$1(iterationError)) {
6002
- iterationError = `Invalid "key" attribute value in "<${childVnode.sel}>" in ${vmBeingRendered} for item number ${j}. Set a unique "key" value on all iterated child elements.`;
6216
+ iterationError = `Invalid "key" attribute value in "<${tagName}>" for item number ${j}. Set a unique "key" value on all iterated child elements.`;
6003
6217
  }
6004
6218
  }
6005
6219
  });
@@ -6032,6 +6246,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
6032
6246
  if (isArray$1(item)) {
6033
6247
  ArrayPush$1.apply(flattened, item);
6034
6248
  } else {
6249
+ // `isArray` doesn't narrow this block properly...
6035
6250
  ArrayPush$1.call(flattened, item);
6036
6251
  }
6037
6252
  }
@@ -6349,7 +6564,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
6349
6564
  }
6350
6565
 
6351
6566
  /*
6352
- * Copyright (c) 2018, salesforce.com, inc.
6567
+ * Copyright (c) 2024, Salesforce, Inc.
6353
6568
  * All rights reserved.
6354
6569
  * SPDX-License-Identifier: MIT
6355
6570
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
@@ -6386,6 +6601,28 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
6386
6601
  }
6387
6602
  }
6388
6603
  }
6604
+ const browserExpressionSerializer = (partToken, classAttrToken) => {
6605
+ // This will insert the scoped style token as a static class attribute in the fragment
6606
+ // bypassing the need to call applyStyleScoping when mounting static parts.
6607
+ const type = StringCharAt.call(partToken, 0);
6608
+ switch (type) {
6609
+ case "c" /* STATIC_PART_TOKEN_ID.CLASS */:
6610
+ return classAttrToken;
6611
+ case "t" /* STATIC_PART_TOKEN_ID.TEXT */:
6612
+ // Using a single space here gives us a single empty text node
6613
+ return ' ';
6614
+ default:
6615
+ return '';
6616
+ }
6617
+ };
6618
+ // This function serializes the expressions generated by static content optimization.
6619
+ // Currently this is only needed for SSR.
6620
+ // TODO [#4078]: Split the implementation between @lwc/engine-dom and @lwc/engine-server
6621
+ function buildSerializeExpressionFn(parts) {
6622
+ {
6623
+ return browserExpressionSerializer;
6624
+ }
6625
+ }
6389
6626
  // This should be a no-op outside of LWC's Karma tests, where it's not needed
6390
6627
  let registerFragmentCache = noop;
6391
6628
  // Only used in LWC's Karma tests
@@ -6407,7 +6644,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
6407
6644
  return (strings, ...keys) => {
6408
6645
  const cache = create(null);
6409
6646
  registerFragmentCache(cache);
6410
- return function () {
6647
+ return function (parts) {
6411
6648
  const {
6412
6649
  context: {
6413
6650
  hasScopedStyles,
@@ -6427,14 +6664,27 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
6427
6664
  if (hasStyleToken && isSyntheticShadow) {
6428
6665
  cacheKey |= 2 /* FragmentCache.SHADOW_MODE_SYNTHETIC */;
6429
6666
  }
6430
- if (!isUndefined$1(cache[cacheKey])) {
6431
- return cache[cacheKey];
6667
+ // Cache is only here to prevent calling innerHTML multiple times which doesn't happen on the server.
6668
+ {
6669
+ // Disable this on the server to prevent cache poisoning when expressions are used.
6670
+ const cached = cache[cacheKey];
6671
+ if (!isUndefined$1(cached)) {
6672
+ return cached;
6673
+ }
6432
6674
  }
6433
6675
  // If legacy stylesheet tokens are required, then add them to the rendered string
6434
6676
  const stylesheetTokenToRender = stylesheetToken + (hasLegacyToken ? ` ${legacyStylesheetToken}` : '');
6435
6677
  const classToken = hasScopedStyles && hasStyleToken ? ' ' + stylesheetTokenToRender : '';
6436
6678
  const classAttrToken = hasScopedStyles && hasStyleToken ? ` class="${stylesheetTokenToRender}"` : '';
6437
6679
  const attrToken = hasStyleToken && isSyntheticShadow ? ' ' + stylesheetTokenToRender : '';
6680
+ // In the browser, we provide the entire class attribute as a perf optimization to avoid applying it on mount.
6681
+ // The remaining class expression will be applied when the static parts are mounted.
6682
+ // In SSR, the entire class attribute (expression included) is assembled along with the fragment.
6683
+ // This is why in the browser we provide the entire class attribute and in SSR we only provide the class token.
6684
+ const exprClassToken = classAttrToken;
6685
+ // TODO [#3624]: The implementation of this function should be specific to @lwc/engine-dom and @lwc/engine-server.
6686
+ // Find a way to split this in a future refactor.
6687
+ const serializeExpression = buildSerializeExpressionFn();
6438
6688
  let htmlFragment = '';
6439
6689
  for (let i = 0, n = keys.length; i < n; i++) {
6440
6690
  switch (keys[i]) {
@@ -6454,6 +6704,10 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
6454
6704
  // ${1}${2}
6455
6705
  htmlFragment += strings[i] + classAttrToken + attrToken;
6456
6706
  break;
6707
+ default:
6708
+ // expressions ${partId:attributeName/textId}
6709
+ htmlFragment += strings[i] + serializeExpression(keys[i], exprClassToken);
6710
+ break;
6457
6711
  }
6458
6712
  }
6459
6713
  htmlFragment += strings[strings.length - 1];
@@ -7387,7 +7641,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
7387
7641
  scheduleRehydration(vm);
7388
7642
  }
7389
7643
  }
7390
- function runFormAssociatedCustomElementCallback(vm, faceCb) {
7644
+ function runFormAssociatedCustomElementCallback(vm, faceCb, args) {
7391
7645
  const {
7392
7646
  renderMode,
7393
7647
  shadowMode
@@ -7395,24 +7649,24 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
7395
7649
  if (shadowMode === 1 /* ShadowMode.Synthetic */ && renderMode !== 0 /* RenderMode.Light */) {
7396
7650
  throw new Error('Form associated lifecycle methods are not available in synthetic shadow. Please use native shadow or light DOM.');
7397
7651
  }
7398
- invokeComponentCallback(vm, faceCb);
7652
+ invokeComponentCallback(vm, faceCb, args);
7399
7653
  }
7400
- function runFormAssociatedCallback(elm) {
7654
+ function runFormAssociatedCallback(elm, form) {
7401
7655
  const vm = getAssociatedVM(elm);
7402
7656
  const {
7403
7657
  formAssociatedCallback
7404
7658
  } = vm.def;
7405
7659
  if (!isUndefined$1(formAssociatedCallback)) {
7406
- runFormAssociatedCustomElementCallback(vm, formAssociatedCallback);
7660
+ runFormAssociatedCustomElementCallback(vm, formAssociatedCallback, [form]);
7407
7661
  }
7408
7662
  }
7409
- function runFormDisabledCallback(elm) {
7663
+ function runFormDisabledCallback(elm, disabled) {
7410
7664
  const vm = getAssociatedVM(elm);
7411
7665
  const {
7412
7666
  formDisabledCallback
7413
7667
  } = vm.def;
7414
7668
  if (!isUndefined$1(formDisabledCallback)) {
7415
- runFormAssociatedCustomElementCallback(vm, formDisabledCallback);
7669
+ runFormAssociatedCustomElementCallback(vm, formDisabledCallback, [disabled]);
7416
7670
  }
7417
7671
  }
7418
7672
  function runFormResetCallback(elm) {
@@ -7424,13 +7678,13 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
7424
7678
  runFormAssociatedCustomElementCallback(vm, formResetCallback);
7425
7679
  }
7426
7680
  }
7427
- function runFormStateRestoreCallback(elm) {
7681
+ function runFormStateRestoreCallback(elm, state, reason) {
7428
7682
  const vm = getAssociatedVM(elm);
7429
7683
  const {
7430
7684
  formStateRestoreCallback
7431
7685
  } = vm.def;
7432
7686
  if (!isUndefined$1(formStateRestoreCallback)) {
7433
- runFormAssociatedCustomElementCallback(vm, formStateRestoreCallback);
7687
+ runFormAssociatedCustomElementCallback(vm, formStateRestoreCallback, [state, reason]);
7434
7688
  }
7435
7689
  }
7436
7690
  function resetRefVNodes(vm) {
@@ -7800,9 +8054,12 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
7800
8054
  if (!hasCorrectNodeType(vnode, node, 3 /* EnvNodeTypes.TEXT */, renderer)) {
7801
8055
  return handleMismatch(node, vnode, renderer);
7802
8056
  }
8057
+ return updateTextContent(node, vnode, vnode.owner, renderer);
8058
+ }
8059
+ function updateTextContent(node, vnode, owner, renderer) {
7803
8060
  if (process.env.NODE_ENV !== 'production') {
7804
8061
  if (!textNodeContentsAreEqual(node, vnode, renderer)) {
7805
- logWarn('Hydration mismatch: text values do not match, will recover from the difference', vnode.owner);
8062
+ logWarn('Hydration mismatch: text values do not match, will recover from the difference', owner);
7806
8063
  }
7807
8064
  }
7808
8065
  const {
@@ -7833,11 +8090,26 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
7833
8090
  return node;
7834
8091
  }
7835
8092
  function hydrateStaticElement(elm, vnode, renderer) {
7836
- if (!hasCorrectNodeType(vnode, elm, 1 /* EnvNodeTypes.ELEMENT */, renderer) || !areCompatibleNodes(vnode.fragment, elm, vnode, renderer)) {
8093
+ if (!hasCorrectNodeType(vnode, elm, 1 /* EnvNodeTypes.ELEMENT */, renderer) || !areCompatibleStaticNodes(vnode.fragment, elm, vnode, renderer)) {
8094
+ return handleMismatch(elm, vnode, renderer);
8095
+ }
8096
+ return hydrateStaticElementParts(elm, vnode, renderer);
8097
+ }
8098
+ function hydrateStaticElementParts(elm, vnode, renderer) {
8099
+ const {
8100
+ parts
8101
+ } = vnode;
8102
+ if (!isUndefined$1(parts)) {
8103
+ // Elements must first be set on the static part to validate against.
8104
+ traverseAndSetElements(elm, parts, renderer);
8105
+ }
8106
+ if (!haveCompatibleStaticParts(vnode, renderer)) {
7837
8107
  return handleMismatch(elm, vnode, renderer);
7838
8108
  }
7839
8109
  vnode.elm = elm;
7840
- mountStaticParts(elm, vnode, renderer);
8110
+ // Hydration only requires applying event listeners and refs.
8111
+ // All other expressions should be applied during SSR or through the handleMismatch routine.
8112
+ hydrateStaticParts(vnode, renderer);
7841
8113
  return elm;
7842
8114
  }
7843
8115
  function hydrateFragment(elm, vnode, renderer) {
@@ -8045,9 +8317,12 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8045
8317
  }
8046
8318
  return false;
8047
8319
  }
8048
- const hasCompatibleAttrs = validateAttrs(vnode, elm, renderer, shouldValidateAttr);
8049
- const hasCompatibleClass = shouldValidateAttr('class') ? validateClassAttr(vnode, elm, renderer) : true;
8050
- const hasCompatibleStyle = shouldValidateAttr('style') ? validateStyleAttr(vnode, elm, renderer) : true;
8320
+ const {
8321
+ data
8322
+ } = vnode;
8323
+ const hasCompatibleAttrs = validateAttrs(vnode, elm, data, renderer, shouldValidateAttr);
8324
+ const hasCompatibleClass = shouldValidateAttr('class') ? validateClassAttr(vnode, elm, data, renderer) : true;
8325
+ const hasCompatibleStyle = shouldValidateAttr('style') ? validateStyleAttr(vnode, elm, data, renderer) : true;
8051
8326
  return hasCompatibleAttrs && hasCompatibleClass && hasCompatibleStyle;
8052
8327
  }
8053
8328
  function attributeValuesAreEqual(vnodeValue, value) {
@@ -8063,12 +8338,10 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8063
8338
  // In all other cases, the two values are not considered equal
8064
8339
  return false;
8065
8340
  }
8066
- function validateAttrs(vnode, elm, renderer, shouldValidateAttr) {
8341
+ function validateAttrs(vnode, elm, data, renderer, shouldValidateAttr) {
8067
8342
  const {
8068
- data: {
8069
- attrs = {}
8070
- }
8071
- } = vnode;
8343
+ attrs = {}
8344
+ } = data;
8072
8345
  let nodesAreCompatible = true;
8073
8346
  // Validate attributes, though we could always recovery from those by running the update mods.
8074
8347
  // Note: intentionally ONLY matching vnodes.attrs to elm.attrs, in case SSR is adding extra attributes.
@@ -8076,9 +8349,6 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8076
8349
  if (!shouldValidateAttr(attrName)) {
8077
8350
  continue;
8078
8351
  }
8079
- const {
8080
- owner
8081
- } = vnode;
8082
8352
  const {
8083
8353
  getAttribute
8084
8354
  } = renderer;
@@ -8088,18 +8358,19 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8088
8358
  const {
8089
8359
  getProperty
8090
8360
  } = renderer;
8091
- logError(`Mismatch hydrating element <${getProperty(elm, 'tagName').toLowerCase()}>: attribute "${attrName}" has different values, expected "${attrValue}" but found ${isNull(elmAttrValue) ? 'null' : `"${elmAttrValue}"`}`, owner);
8361
+ logError(`Mismatch hydrating element <${getProperty(elm, 'tagName').toLowerCase()}>: attribute "${attrName}" has different values, expected "${attrValue}" but found ${isNull(elmAttrValue) ? 'null' : `"${elmAttrValue}"`}`, vnode.owner);
8092
8362
  }
8093
8363
  nodesAreCompatible = false;
8094
8364
  }
8095
8365
  }
8096
8366
  return nodesAreCompatible;
8097
8367
  }
8098
- function validateClassAttr(vnode, elm, renderer) {
8368
+ function validateClassAttr(vnode, elm, data, renderer) {
8099
8369
  const {
8100
- data,
8101
8370
  owner
8102
8371
  } = vnode;
8372
+ // classMap is never available on VStaticPartData so it can default to undefined
8373
+ // casting to prevent TS error.
8103
8374
  let {
8104
8375
  className,
8105
8376
  classMap
@@ -8179,13 +8450,12 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8179
8450
  }
8180
8451
  return nodesAreCompatible;
8181
8452
  }
8182
- function validateStyleAttr(vnode, elm, renderer) {
8453
+ function validateStyleAttr(vnode, elm, data, renderer) {
8454
+ // Note styleDecls is always undefined for VStaticPartData, casting here to default it to undefined
8183
8455
  const {
8184
- data: {
8185
- style,
8186
- styleDecls
8187
- }
8188
- } = vnode;
8456
+ style,
8457
+ styleDecls
8458
+ } = data;
8189
8459
  const {
8190
8460
  getAttribute
8191
8461
  } = renderer;
@@ -8226,7 +8496,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8226
8496
  }
8227
8497
  return nodesAreCompatible;
8228
8498
  }
8229
- function areCompatibleNodes(client, ssr, vnode, renderer) {
8499
+ function areCompatibleStaticNodes(client, ssr, vnode, renderer) {
8230
8500
  const {
8231
8501
  getProperty,
8232
8502
  getAttribute
@@ -8246,24 +8516,72 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8246
8516
  if (!hasCorrectNodeType(vnode, ssr, 1 /* EnvNodeTypes.ELEMENT */, renderer)) {
8247
8517
  return false;
8248
8518
  }
8519
+ const {
8520
+ owner,
8521
+ parts
8522
+ } = vnode;
8249
8523
  let isCompatibleElements = true;
8250
8524
  if (getProperty(client, 'tagName') !== getProperty(ssr, 'tagName')) {
8251
8525
  if (process.env.NODE_ENV !== 'production') {
8252
- logError(`Hydration mismatch: expecting element with tag "${getProperty(client, 'tagName').toLowerCase()}" but found "${getProperty(ssr, 'tagName').toLowerCase()}".`, vnode.owner);
8526
+ logError(`Hydration mismatch: expecting element with tag "${getProperty(client, 'tagName').toLowerCase()}" but found "${getProperty(ssr, 'tagName').toLowerCase()}".`, owner);
8253
8527
  }
8254
8528
  return false;
8255
8529
  }
8256
8530
  const clientAttrsNames = getProperty(client, 'getAttributeNames').call(client);
8257
8531
  clientAttrsNames.forEach(attrName => {
8258
8532
  if (getAttribute(client, attrName) !== getAttribute(ssr, attrName)) {
8259
- if (process.env.NODE_ENV !== 'production') {
8260
- logError(`Mismatch hydrating element <${getProperty(client, 'tagName').toLowerCase()}>: attribute "${attrName}" has different values, expected "${getAttribute(client, attrName)}" but found "${getAttribute(ssr, attrName)}"`, vnode.owner);
8533
+ // Check if the root element attributes have expressions, if it does then we need to delegate hydration
8534
+ // validation to haveCompatibleStaticParts.
8535
+ // Note if there are no parts then it is a fully static fragment.
8536
+ // partId === 0 will always refer to the root element, this is guaranteed by the compiler.
8537
+ if (parts?.[0].partId !== 0) {
8538
+ if (process.env.NODE_ENV !== 'production') {
8539
+ logError(`Mismatch hydrating element <${getProperty(client, 'tagName').toLowerCase()}>: attribute "${attrName}" has different values, expected "${getAttribute(client, attrName)}" but found "${getAttribute(ssr, attrName)}"`, owner);
8540
+ }
8541
+ isCompatibleElements = false;
8261
8542
  }
8262
- isCompatibleElements = false;
8263
8543
  }
8264
8544
  });
8265
8545
  return isCompatibleElements;
8266
8546
  }
8547
+ function haveCompatibleStaticParts(vnode, renderer) {
8548
+ const {
8549
+ parts,
8550
+ owner
8551
+ } = vnode;
8552
+ if (isUndefined$1(parts)) {
8553
+ return true;
8554
+ }
8555
+ // The validation here relies on 2 key invariants:
8556
+ // 1. It's never the case that `parts` is undefined on the server but defined on the client (or vice-versa)
8557
+ // 2. It's never the case that `parts` has one length on the server but another on the client
8558
+ for (const part of parts) {
8559
+ const {
8560
+ elm
8561
+ } = part;
8562
+ if (isVStaticPartElement(part)) {
8563
+ if (!hasCorrectNodeType(vnode, elm, 1 /* EnvNodeTypes.ELEMENT */, renderer)) {
8564
+ return false;
8565
+ }
8566
+ const {
8567
+ data
8568
+ } = part;
8569
+ const hasMatchingAttrs = validateAttrs(vnode, elm, data, renderer, () => true);
8570
+ const hasMatchingStyleAttr = validateStyleAttr(vnode, elm, data, renderer);
8571
+ const hasMatchingClass = validateClassAttr(vnode, elm, data, renderer);
8572
+ if (isFalse(hasMatchingAttrs && hasMatchingStyleAttr && hasMatchingClass)) {
8573
+ return false;
8574
+ }
8575
+ } else {
8576
+ // VStaticPartText
8577
+ if (!hasCorrectNodeType(vnode, elm, 3 /* EnvNodeTypes.TEXT */, renderer)) {
8578
+ return false;
8579
+ }
8580
+ updateTextContent(elm, part, owner, renderer);
8581
+ }
8582
+ }
8583
+ return true;
8584
+ }
8267
8585
 
8268
8586
  /*
8269
8587
  * Copyright (c) 2018, salesforce.com, inc.
@@ -8279,7 +8597,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8279
8597
  }
8280
8598
 
8281
8599
  /*
8282
- * Copyright (c) 2018, salesforce.com, inc.
8600
+ * Copyright (c) 2024, Salesforce, Inc.
8283
8601
  * All rights reserved.
8284
8602
  * SPDX-License-Identifier: MIT
8285
8603
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
@@ -8336,9 +8654,9 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8336
8654
  // we can at least warn when they use the most common mutation methods.
8337
8655
  for (const prop of ARRAY_MUTATION_METHODS) {
8338
8656
  const originalArrayMethod = getOriginalArrayMethod(prop);
8657
+ // Assertions used here because TypeScript can't handle mapping over our types
8339
8658
  stylesheets[prop] = function arrayMutationWarningWrapper() {
8340
8659
  reportTemplateViolation('stylesheets');
8341
- // @ts-expect-error can't properly determine the right `this`
8342
8660
  return originalArrayMethod.apply(this, arguments);
8343
8661
  };
8344
8662
  }
@@ -8520,7 +8838,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8520
8838
  }
8521
8839
  return getReadOnlyProxy(obj);
8522
8840
  }
8523
- /** version: 6.3.4 */
8841
+ /** version: 6.6.1 */
8524
8842
 
8525
8843
  /*
8526
8844
  * Copyright (c) 2018, salesforce.com, inc.
@@ -8650,7 +8968,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8650
8968
  stylesheet.replaceSync(content);
8651
8969
  return stylesheet;
8652
8970
  }
8653
- function insertConstructableStylesheet(content, target, cacheData) {
8971
+ function insertConstructableStylesheet(content, target, cacheData, signal) {
8654
8972
  const {
8655
8973
  adoptedStyleSheets
8656
8974
  } = target;
@@ -8659,10 +8977,32 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8659
8977
  } = cacheData;
8660
8978
  // The reason we prefer .push() rather than reassignment is for perf: https://github.com/salesforce/lwc/pull/2683
8661
8979
  adoptedStyleSheets.push(stylesheet);
8980
+ if (process.env.NODE_ENV !== 'production') {
8981
+ /* istanbul ignore if */
8982
+ if (isUndefined$1(signal)) {
8983
+ throw new Error('Expected AbortSignal to be defined in dev mode');
8984
+ }
8985
+ // TODO [#4155]: unrendering should account for stylesheet content collisions
8986
+ signal.addEventListener('abort', () => {
8987
+ adoptedStyleSheets.splice(adoptedStyleSheets.indexOf(stylesheet), 1);
8988
+ stylesheetCache.delete(content);
8989
+ });
8990
+ }
8662
8991
  }
8663
- function insertStyleElement(content, target, cacheData) {
8992
+ function insertStyleElement(content, target, cacheData, signal) {
8664
8993
  const elm = createStyleElement(content, cacheData);
8665
8994
  target.appendChild(elm);
8995
+ if (process.env.NODE_ENV !== 'production') {
8996
+ /* istanbul ignore if */
8997
+ if (isUndefined$1(signal)) {
8998
+ throw new Error('Expected AbortSignal to be defined in dev mode');
8999
+ }
9000
+ // TODO [#4155]: unrendering should account for stylesheet content collisions
9001
+ signal.addEventListener('abort', () => {
9002
+ target.removeChild(elm);
9003
+ stylesheetCache.delete(content);
9004
+ });
9005
+ }
8666
9006
  }
8667
9007
  function getCacheData(content, useConstructableStylesheet) {
8668
9008
  let cacheData = stylesheetCache.get(content);
@@ -8684,7 +9024,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8684
9024
  }
8685
9025
  return cacheData;
8686
9026
  }
8687
- function insertGlobalStylesheet(content) {
9027
+ function insertGlobalStylesheet(content, signal) {
8688
9028
  // Force a <style> element for global stylesheets. See comment below.
8689
9029
  const cacheData = getCacheData(content, false);
8690
9030
  if (cacheData.global) {
@@ -8693,9 +9033,9 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8693
9033
  }
8694
9034
  cacheData.global = true; // mark inserted
8695
9035
  // TODO [#2922]: use document.adoptedStyleSheets in supported browsers. Currently we can't, due to backwards compat.
8696
- insertStyleElement(content, document.head, cacheData);
9036
+ insertStyleElement(content, document.head, cacheData, signal);
8697
9037
  }
8698
- function insertLocalStylesheet(content, target) {
9038
+ function insertLocalStylesheet(content, target, signal) {
8699
9039
  const cacheData = getCacheData(content, supportsConstructableStylesheets);
8700
9040
  let {
8701
9041
  roots
@@ -8711,19 +9051,25 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8711
9051
  // https://caniuse.com/mdn-api_document_adoptedstylesheets
8712
9052
  // The reason we use it is for perf: https://github.com/salesforce/lwc/pull/2460
8713
9053
  if (supportsConstructableStylesheets) {
8714
- insertConstructableStylesheet(content, target, cacheData);
9054
+ insertConstructableStylesheet(content, target, cacheData, signal);
8715
9055
  } else {
8716
9056
  // Fall back to <style> element
8717
- insertStyleElement(content, target, cacheData);
9057
+ insertStyleElement(content, target, cacheData, signal);
8718
9058
  }
8719
9059
  }
8720
- function insertStylesheet(content, target) {
9060
+ /**
9061
+ * Injects a stylesheet into the global (document) level or inside a shadow root.
9062
+ * @param content CSS content to insert
9063
+ * @param target ShadowRoot to insert into, or undefined if global (document) level
9064
+ * @param signal AbortSignal for aborting the stylesheet render. Used in dev mode for HMR to unrender stylesheets.
9065
+ */
9066
+ function insertStylesheet(content, target, signal) {
8721
9067
  if (isUndefined$1(target)) {
8722
9068
  // global
8723
- insertGlobalStylesheet(content);
9069
+ insertGlobalStylesheet(content, signal);
8724
9070
  } else {
8725
9071
  // local
8726
- insertLocalStylesheet(content, target);
9072
+ insertLocalStylesheet(content, target, signal);
8727
9073
  }
8728
9074
  }
8729
9075
 
@@ -8733,25 +9079,19 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8733
9079
  * SPDX-License-Identifier: MIT
8734
9080
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
8735
9081
  */
8736
- const LIFECYCLE_CALLBACKS = {
8737
- connectedCallback: connectRootElement,
8738
- disconnectedCallback: disconnectRootElement,
8739
- formAssociatedCallback: runFormAssociatedCallback,
8740
- formDisabledCallback: runFormDisabledCallback,
8741
- formResetCallback: runFormResetCallback,
8742
- formStateRestoreCallback: runFormStateRestoreCallback
8743
- };
8744
9082
  const cachedConstructors = new Map();
8745
9083
  const nativeLifecycleElementsToUpgradedByLWC = new WeakMap();
8746
9084
  let elementBeingUpgradedByLWC = false;
8747
- // Creates a constructor that is intended to be used directly as a custom element, except that the upgradeCallback is
8748
- // passed in to the constructor so LWC can reuse the same custom element constructor for multiple components.
8749
- // Another benefit is that only LWC can create components that actually do anything – if you do
8750
- // `customElements.define('x-foo')`, then you don't have access to the upgradeCallback, so it's a dummy custom element.
8751
- // This class should be created once per tag name.
8752
- const createUpgradableConstructor = isFormAssociated => {
9085
+ let BaseUpgradableConstructor;
9086
+ let BaseHTMLElement;
9087
+ function createBaseUpgradableConstructor() {
9088
+ // Creates a constructor that is intended to be used directly as a custom element, except that the upgradeCallback is
9089
+ // passed in to the constructor so LWC can reuse the same custom element constructor for multiple components.
9090
+ // Another benefit is that only LWC can create components that actually do anything – if you do
9091
+ // `customElements.define('x-foo')`, then you don't have access to the upgradeCallback, so it's a dummy custom element.
9092
+ // This class should be created once per tag name.
8753
9093
  // TODO [#2972]: this class should expose observedAttributes as necessary
8754
- class UpgradableConstructor extends HTMLElement {
9094
+ BaseUpgradableConstructor = class TheBaseUpgradableConstructor extends HTMLElement {
8755
9095
  constructor(upgradeCallback, useNativeLifecycle) {
8756
9096
  super();
8757
9097
  if (useNativeLifecycle) {
@@ -8768,17 +9108,57 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8768
9108
  // TODO [#2970]: LWC elements cannot be upgraded via new Ctor()
8769
9109
  // Do we want to support this? Throw an error? Currently for backwards compat it's a no-op.
8770
9110
  }
8771
- /*LWC compiler v6.3.4*/
8772
- }
8773
- UpgradableConstructor.formAssociated = isFormAssociated;
8774
- for (const [propName, callback] of entries(LIFECYCLE_CALLBACKS)) {
8775
- UpgradableConstructor.prototype[propName] = function () {
8776
- // If the element is in the WeakMap (i.e. it's marked as native lifecycle), and if it was upgraded by LWC,
8777
- // then it can use native lifecycle
9111
+ connectedCallback() {
8778
9112
  if (isTrue(nativeLifecycleElementsToUpgradedByLWC.get(this))) {
8779
- callback(this);
9113
+ connectRootElement(this);
8780
9114
  }
8781
- };
9115
+ }
9116
+ disconnectedCallback() {
9117
+ if (isTrue(nativeLifecycleElementsToUpgradedByLWC.get(this))) {
9118
+ disconnectRootElement(this);
9119
+ }
9120
+ }
9121
+ formAssociatedCallback(form) {
9122
+ if (isTrue(nativeLifecycleElementsToUpgradedByLWC.get(this))) {
9123
+ runFormAssociatedCallback(this, form);
9124
+ }
9125
+ }
9126
+ formDisabledCallback(disabled) {
9127
+ if (isTrue(nativeLifecycleElementsToUpgradedByLWC.get(this))) {
9128
+ runFormDisabledCallback(this, disabled);
9129
+ }
9130
+ }
9131
+ formResetCallback() {
9132
+ if (isTrue(nativeLifecycleElementsToUpgradedByLWC.get(this))) {
9133
+ runFormResetCallback(this);
9134
+ }
9135
+ }
9136
+ formStateRestoreCallback(state, reason) {
9137
+ if (isTrue(nativeLifecycleElementsToUpgradedByLWC.get(this))) {
9138
+ runFormStateRestoreCallback(this, state, reason);
9139
+ }
9140
+ }
9141
+ /*LWC compiler v6.6.1*/
9142
+ };
9143
+ BaseHTMLElement = HTMLElement; // cache to track if it changes
9144
+ }
9145
+ const createUpgradableConstructor = isFormAssociated => {
9146
+ if (HTMLElement !== BaseHTMLElement) {
9147
+ // If the global HTMLElement changes out from under our feet, then we need to create a new
9148
+ // BaseUpgradableConstructor from scratch (since it extends from HTMLElement). This can occur if
9149
+ // polyfills are in play, e.g. a polyfill for scoped custom element registries.
9150
+ // This workaround can potentially be removed when W-15361244 is resolved.
9151
+ createBaseUpgradableConstructor();
9152
+ }
9153
+ // Using a BaseUpgradableConstructor superclass here is a perf optimization to avoid
9154
+ // re-defining the same logic (connectedCallback, disconnectedCallback, etc.) over and over.
9155
+ class UpgradableConstructor extends BaseUpgradableConstructor {
9156
+ /*LWC compiler v6.6.1*/
9157
+ }
9158
+ if (isFormAssociated) {
9159
+ // Perf optimization - the vast majority of components have formAssociated=false,
9160
+ // so we can skip the setter in those cases, since undefined works the same as false.
9161
+ UpgradableConstructor.formAssociated = isFormAssociated;
8782
9162
  }
8783
9163
  return UpgradableConstructor;
8784
9164
  };
@@ -8796,11 +9176,11 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8796
9176
  }
8797
9177
  const createCustomElement = (tagName, upgradeCallback, useNativeLifecycle, isFormAssociated) => {
8798
9178
  const UpgradableConstructor = getUpgradableConstructor(tagName, isFormAssociated);
9179
+ if (Boolean(UpgradableConstructor.formAssociated) !== isFormAssociated) {
9180
+ throw new Error(`<${tagName}> was already registered with formAssociated=${UpgradableConstructor.formAssociated}. It cannot be re-registered with formAssociated=${isFormAssociated}. Please rename your component to have a different name than <${tagName}>`);
9181
+ }
8799
9182
  elementBeingUpgradedByLWC = true;
8800
9183
  try {
8801
- if (UpgradableConstructor.formAssociated !== isFormAssociated) {
8802
- throw new Error(`<${tagName}> was already registered with formAssociated=${UpgradableConstructor.formAssociated}. It cannot be re-registered with formAssociated=${isFormAssociated}. Please rename your component to have a different name than <${tagName}>`);
8803
- }
8804
9184
  return new UpgradableConstructor(upgradeCallback, useNativeLifecycle);
8805
9185
  } finally {
8806
9186
  elementBeingUpgradedByLWC = false;
@@ -8896,7 +9276,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8896
9276
  function isNull(obj) {
8897
9277
  return obj === null;
8898
9278
  }
8899
- /** version: 6.3.4 */
9279
+ /** version: 6.6.1 */
8900
9280
 
8901
9281
  /*
8902
9282
  * Copyright (c) 2023, salesforce.com, inc.
@@ -8916,7 +9296,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8916
9296
  this.setNewContext = setNewContext;
8917
9297
  this.setDisconnectedCallback = setDisconnectedCallback;
8918
9298
  }
8919
- /*LWC compiler v6.3.4*/
9299
+ /*LWC compiler v6.6.1*/
8920
9300
  }
8921
9301
  function registerContextConsumer(elm, adapterContextToken, subscriptionPayload) {
8922
9302
  dispatchEvent(elm, new WireContextSubscriptionEvent(adapterContextToken, subscriptionPayload));
@@ -8971,6 +9351,9 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
8971
9351
  function previousSibling(node) {
8972
9352
  return node.previousSibling;
8973
9353
  }
9354
+ function getParentNode(node) {
9355
+ return node.parentNode;
9356
+ }
8974
9357
  function attachShadow(element, options) {
8975
9358
  // `shadowRoot` will be non-null in two cases:
8976
9359
  // 1. upon initial load with an SSR-generated DOM, while in Shadow render mode
@@ -9095,6 +9478,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
9095
9478
  exports.getFirstElementChild = getFirstElementChild;
9096
9479
  exports.getLastChild = getLastChild;
9097
9480
  exports.getLastElementChild = getLastElementChild;
9481
+ exports.getParentNode = getParentNode;
9098
9482
  exports.getProperty = getProperty;
9099
9483
  exports.getTagName = getTagName;
9100
9484
  exports.insert = insert;
@@ -9314,19 +9698,19 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
9314
9698
  attributeChangedCallback(name, oldValue, newValue) {
9315
9699
  attributeChangedCallback.call(this, name, oldValue, newValue);
9316
9700
  }
9317
- formAssociatedCallback() {
9318
- runFormAssociatedCallback(this);
9701
+ formAssociatedCallback(form) {
9702
+ runFormAssociatedCallback(this, form);
9319
9703
  }
9320
- formDisabledCallback() {
9321
- runFormDisabledCallback(this);
9704
+ formDisabledCallback(disabled) {
9705
+ runFormDisabledCallback(this, disabled);
9322
9706
  }
9323
9707
  formResetCallback() {
9324
9708
  runFormResetCallback(this);
9325
9709
  }
9326
- formStateRestoreCallback() {
9327
- runFormStateRestoreCallback(this);
9710
+ formStateRestoreCallback(state, reason) {
9711
+ runFormStateRestoreCallback(this, state, reason);
9328
9712
  }
9329
- /*LWC compiler v6.3.4*/
9713
+ /*LWC compiler v6.6.1*/
9330
9714
  }, _a.observedAttributes = observedAttributes,
9331
9715
  // Note CustomElementConstructor is not upgraded by LWC and inherits directly from HTMLElement which means it calls the native
9332
9716
  // attachInternals API.
@@ -9390,9 +9774,6 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
9390
9774
  }
9391
9775
  });
9392
9776
  }
9393
- // For some reason, JSDOC says "options.is" is a syntax error. And we can't disable the rule using
9394
- // `eslint-disable-next-line` because that gets included in the JSDOC, so we need this workaround.
9395
- /* eslint-disable jsdoc/valid-types */
9396
9777
  /**
9397
9778
  * EXPERIMENTAL: This function is almost identical to document.createElement with the slightly
9398
9779
  * difference that in the options, you can pass the `is` property set to a Constructor instead of
@@ -9407,8 +9788,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
9407
9788
  * @example
9408
9789
  * const el = createElement('x-foo', { is: FooCtor });
9409
9790
  */
9410
- function createElement( /* eslint-enable jsdoc/valid-types */
9411
- sel, options) {
9791
+ function createElement(sel, options) {
9412
9792
  if (!isObject(options) || isNull(options)) {
9413
9793
  throw new TypeError(`"createElement" function expects an object as second parameter but received "${toString$1(options)}".`);
9414
9794
  }
@@ -9559,7 +9939,7 @@ LWR.define('lwc/v/6_3_4', ['exports'], (function (exports) { 'use strict';
9559
9939
  });
9560
9940
  });
9561
9941
  }
9562
- /** version: 6.3.4 */
9942
+ /** version: 6.6.1 */
9563
9943
 
9564
9944
  exports.LightningElement = LightningElement;
9565
9945
  exports.__unstable__ProfilerControl = profilerControl;