@lwc/ssr-runtime 8.11.0 → 8.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -316,6 +316,14 @@ function isUndefined$1(obj) {
316
316
  function isNull(obj) {
317
317
  return obj === null;
318
318
  }
319
+ /**
320
+ * Determines whether the argument is an object or null.
321
+ * @param obj Value to test
322
+ * @returns `true` if the value is an object or null.
323
+ */
324
+ function isObject(obj) {
325
+ return typeof obj === 'object';
326
+ }
319
327
  /**
320
328
  * Determines whether the argument is a string.
321
329
  * @param obj Value to test
@@ -324,14 +332,14 @@ function isNull(obj) {
324
332
  function isString(obj) {
325
333
  return typeof obj === 'string';
326
334
  }
327
- const OtS$1 = {}.toString;
335
+ const OtS = {}.toString;
328
336
  /**
329
337
  * Converts the argument to a string, safely accounting for objects with "null" prototype.
330
338
  * Note that `toString(null)` returns `"[object Null]"` rather than `"null"`.
331
339
  * @param obj Value to convert to a string.
332
340
  * @returns String representation of the value.
333
341
  */
334
- function toString$1(obj) {
342
+ function toString(obj) {
335
343
  if (obj?.toString) {
336
344
  // Arrays might hold objects with "null" prototype So using
337
345
  // Array.prototype.toString directly will cause an error Iterate through
@@ -347,13 +355,13 @@ function toString$1(obj) {
347
355
  // 4. Array#toString converts recursive references to arrays to ''
348
356
  // Ex: arr = [1]; arr.push(arr, 2); arr.toString() === '1,,2'; toString(arr) throws
349
357
  // Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString
350
- return ArrayJoin.call(ArrayMap.call(obj, toString$1), ',');
358
+ return ArrayJoin.call(ArrayMap.call(obj, toString), ',');
351
359
  }
352
360
  return obj.toString();
353
361
  }
354
362
  else if (typeof obj === 'object') {
355
363
  // This catches null and returns "[object Null]". Weird, but kept for backwards compatibility.
356
- return OtS$1.call(obj);
364
+ return OtS.call(obj);
357
365
  }
358
366
  else {
359
367
  return String(obj);
@@ -569,6 +577,52 @@ function htmlEscape(str, attrMode = false) {
569
577
  return str.replace(searchValue, (char) => ESCAPED_CHARS[char]);
570
578
  }
571
579
 
580
+ /*
581
+ * Copyright (c) 2020, salesforce.com, inc.
582
+ * All rights reserved.
583
+ * SPDX-License-Identifier: MIT
584
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
585
+ */
586
+ /**
587
+ * [ncls] - Normalize class name attribute.
588
+ *
589
+ * Transforms the provided class property value from an object/string into a string the diffing algo
590
+ * can operate on.
591
+ *
592
+ * This implementation is borrowed from Vue:
593
+ * https://github.com/vuejs/core/blob/e790e1bdd7df7be39e14780529db86e4da47a3db/packages/shared/src/normalizeProp.ts#L63-L82
594
+ */
595
+ function normalizeClass(value) {
596
+ if (isUndefined$1(value) || isNull(value)) {
597
+ // Returning undefined here improves initial render cost, because the old vnode's class will be considered
598
+ // undefined in the `patchClassAttribute` routine, so `oldClass === newClass` will be true so we return early
599
+ return undefined;
600
+ }
601
+ let res = '';
602
+ if (isString(value)) {
603
+ res = value;
604
+ }
605
+ else if (isArray$1(value)) {
606
+ for (let i = 0; i < value.length; i++) {
607
+ const normalized = normalizeClass(value[i]);
608
+ if (normalized) {
609
+ res += normalized + ' ';
610
+ }
611
+ }
612
+ }
613
+ else if (isObject(value) && !isNull(value)) {
614
+ // Iterate own enumerable keys of the object
615
+ const _keys = keys(value);
616
+ for (let i = 0; i < _keys.length; i += 1) {
617
+ const key = _keys[i];
618
+ if (value[key]) {
619
+ res += key + ' ';
620
+ }
621
+ }
622
+ }
623
+ return StringTrim.call(res);
624
+ }
625
+
572
626
  /*
573
627
  * Copyright (c) 2024, Salesforce, Inc.
574
628
  * All rights reserved.
@@ -599,7 +653,7 @@ function setHooks(hooks) {
599
653
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
600
654
  */
601
655
  const DEFAULT_SSR_MODE = 'sync';
602
- /** version: 8.11.0 */
656
+ /** version: 8.12.1 */
603
657
 
604
658
  /*
605
659
  * Copyright (c) 2024, Salesforce, Inc.
@@ -677,444 +731,418 @@ class ClassList {
677
731
  }
678
732
  }
679
733
 
680
- /******************************************************************************
681
- Copyright (c) Microsoft Corporation.
682
-
683
- Permission to use, copy, modify, and/or distribute this software for any
684
- purpose with or without fee is hereby granted.
685
-
686
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
687
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
688
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
689
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
690
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
691
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
692
- PERFORMANCE OF THIS SOFTWARE.
693
- ***************************************************************************** */
694
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
695
-
696
-
697
- function __classPrivateFieldGet(receiver, state, kind, f) {
698
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
699
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
700
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
701
- }
702
-
703
- function __classPrivateFieldSet(receiver, state, value, kind, f) {
704
- if (kind === "m") throw new TypeError("Private method is not writable");
705
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
706
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
707
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
708
- }
709
-
710
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
711
- var e = new Error(message);
712
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
713
- };
714
-
715
- /*
716
- * Copyright (c) 2024, Salesforce, Inc.
717
- * All rights reserved.
718
- * SPDX-License-Identifier: MIT
719
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
734
+ /**
735
+ * Copyright (C) 2017 salesforce.com, inc.
720
736
  */
721
- var _MutationTracker_enabledSet, _MutationTracker_mutationMap;
722
- class MutationTracker {
723
- constructor() {
724
- _MutationTracker_enabledSet.set(this, new WeakSet());
725
- _MutationTracker_mutationMap.set(this, new WeakMap());
737
+ const { isArray } = Array;
738
+ const { prototype: ObjectDotPrototype, getPrototypeOf, create: ObjectCreate, defineProperty: ObjectDefineProperty, isExtensible, getOwnPropertyDescriptor, getOwnPropertyNames, getOwnPropertySymbols, preventExtensions, hasOwnProperty, } = Object;
739
+ const { push: ArrayPush, concat: ArrayConcat } = Array.prototype;
740
+ function isUndefined(obj) {
741
+ return obj === undefined;
742
+ }
743
+ function isFunction(obj) {
744
+ return typeof obj === 'function';
745
+ }
746
+ const proxyToValueMap = new WeakMap();
747
+ function registerProxy(proxy, value) {
748
+ proxyToValueMap.set(proxy, value);
749
+ }
750
+ const unwrap = (replicaOrAny) => proxyToValueMap.get(replicaOrAny) || replicaOrAny;
751
+
752
+ class BaseProxyHandler {
753
+ constructor(membrane, value) {
754
+ this.originalTarget = value;
755
+ this.membrane = membrane;
726
756
  }
727
- add(instance, attrName) {
728
- if (__classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").has(instance)) {
729
- let mutatedAttrs = __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").get(instance);
730
- if (!mutatedAttrs) {
731
- mutatedAttrs = new Set();
732
- __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").set(instance, mutatedAttrs);
757
+ // Shared utility methods
758
+ wrapDescriptor(descriptor) {
759
+ if (hasOwnProperty.call(descriptor, 'value')) {
760
+ descriptor.value = this.wrapValue(descriptor.value);
761
+ }
762
+ else {
763
+ const { set: originalSet, get: originalGet } = descriptor;
764
+ if (!isUndefined(originalGet)) {
765
+ descriptor.get = this.wrapGetter(originalGet);
766
+ }
767
+ if (!isUndefined(originalSet)) {
768
+ descriptor.set = this.wrapSetter(originalSet);
733
769
  }
734
- mutatedAttrs.add(attrName.toLowerCase());
735
770
  }
771
+ return descriptor;
736
772
  }
737
- enable(instance) {
738
- __classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").add(instance);
773
+ copyDescriptorIntoShadowTarget(shadowTarget, key) {
774
+ const { originalTarget } = this;
775
+ // Note: a property might get defined multiple times in the shadowTarget
776
+ // but it will always be compatible with the previous descriptor
777
+ // to preserve the object invariants, which makes these lines safe.
778
+ const originalDescriptor = getOwnPropertyDescriptor(originalTarget, key);
779
+ // TODO: it should be impossible for the originalDescriptor to ever be undefined, this `if` can be removed
780
+ /* istanbul ignore else */
781
+ if (!isUndefined(originalDescriptor)) {
782
+ const wrappedDesc = this.wrapDescriptor(originalDescriptor);
783
+ ObjectDefineProperty(shadowTarget, key, wrappedDesc);
784
+ }
739
785
  }
740
- disable(instance) {
741
- __classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").delete(instance);
786
+ lockShadowTarget(shadowTarget) {
787
+ const { originalTarget } = this;
788
+ const targetKeys = ArrayConcat.call(getOwnPropertyNames(originalTarget), getOwnPropertySymbols(originalTarget));
789
+ targetKeys.forEach((key) => {
790
+ this.copyDescriptorIntoShadowTarget(shadowTarget, key);
791
+ });
792
+ const { membrane: { tagPropertyKey }, } = this;
793
+ if (!isUndefined(tagPropertyKey) && !hasOwnProperty.call(shadowTarget, tagPropertyKey)) {
794
+ ObjectDefineProperty(shadowTarget, tagPropertyKey, ObjectCreate(null));
795
+ }
796
+ preventExtensions(shadowTarget);
742
797
  }
743
- renderMutatedAttrs(instance) {
744
- const mutatedAttrs = __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").get(instance);
745
- if (mutatedAttrs) {
746
- return ` data-lwc-host-mutated="${[...mutatedAttrs].sort().join(' ')}"`;
798
+ // Shared Traps
799
+ // TODO: apply() is never called
800
+ /* istanbul ignore next */
801
+ apply(shadowTarget, thisArg, argArray) {
802
+ /* No op */
803
+ }
804
+ // TODO: construct() is never called
805
+ /* istanbul ignore next */
806
+ construct(shadowTarget, argArray, newTarget) {
807
+ /* No op */
808
+ }
809
+ get(shadowTarget, key) {
810
+ const { originalTarget, membrane: { valueObserved }, } = this;
811
+ const value = originalTarget[key];
812
+ valueObserved(originalTarget, key);
813
+ return this.wrapValue(value);
814
+ }
815
+ has(shadowTarget, key) {
816
+ const { originalTarget, membrane: { tagPropertyKey, valueObserved }, } = this;
817
+ valueObserved(originalTarget, key);
818
+ // since key is never going to be undefined, and tagPropertyKey might be undefined
819
+ // we can simply compare them as the second part of the condition.
820
+ return key in originalTarget || key === tagPropertyKey;
821
+ }
822
+ ownKeys(shadowTarget) {
823
+ const { originalTarget, membrane: { tagPropertyKey }, } = this;
824
+ // if the membrane tag key exists and it is not in the original target, we add it to the keys.
825
+ const keys = isUndefined(tagPropertyKey) || hasOwnProperty.call(originalTarget, tagPropertyKey)
826
+ ? []
827
+ : [tagPropertyKey];
828
+ // small perf optimization using push instead of concat to avoid creating an extra array
829
+ ArrayPush.apply(keys, getOwnPropertyNames(originalTarget));
830
+ ArrayPush.apply(keys, getOwnPropertySymbols(originalTarget));
831
+ return keys;
832
+ }
833
+ isExtensible(shadowTarget) {
834
+ const { originalTarget } = this;
835
+ // optimization to avoid attempting to lock down the shadowTarget multiple times
836
+ if (!isExtensible(shadowTarget)) {
837
+ return false; // was already locked down
747
838
  }
748
- else {
749
- return '';
839
+ if (!isExtensible(originalTarget)) {
840
+ this.lockShadowTarget(shadowTarget);
841
+ return false;
842
+ }
843
+ return true;
844
+ }
845
+ getPrototypeOf(shadowTarget) {
846
+ const { originalTarget } = this;
847
+ return getPrototypeOf(originalTarget);
848
+ }
849
+ getOwnPropertyDescriptor(shadowTarget, key) {
850
+ const { originalTarget, membrane: { valueObserved, tagPropertyKey }, } = this;
851
+ // keys looked up via getOwnPropertyDescriptor need to be reactive
852
+ valueObserved(originalTarget, key);
853
+ let desc = getOwnPropertyDescriptor(originalTarget, key);
854
+ if (isUndefined(desc)) {
855
+ if (key !== tagPropertyKey) {
856
+ return undefined;
857
+ }
858
+ // if the key is the membrane tag key, and is not in the original target,
859
+ // we produce a synthetic descriptor and install it on the shadow target
860
+ desc = { value: undefined, writable: false, configurable: false, enumerable: false };
861
+ ObjectDefineProperty(shadowTarget, tagPropertyKey, desc);
862
+ return desc;
750
863
  }
864
+ if (desc.configurable === false) {
865
+ // updating the descriptor to non-configurable on the shadow
866
+ this.copyDescriptorIntoShadowTarget(shadowTarget, key);
867
+ }
868
+ // Note: by accessing the descriptor, the key is marked as observed
869
+ // but access to the value, setter or getter (if available) cannot observe
870
+ // mutations, just like regular methods, in which case we just do nothing.
871
+ return this.wrapDescriptor(desc);
751
872
  }
752
873
  }
753
- _MutationTracker_enabledSet = new WeakMap(), _MutationTracker_mutationMap = new WeakMap();
754
- const mutationTracker = new MutationTracker();
755
874
 
756
- /*
757
- * Copyright (c) 2024, Salesforce, Inc.
758
- * All rights reserved.
759
- * SPDX-License-Identifier: MIT
760
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
761
- */
762
- /**
763
- * Filters out the following types of properties that should not be set.
764
- * - Properties that are not public.
765
- * - Properties that are not global.
766
- * - Properties that are global but are internally overridden.
767
- */
768
- function filterProperties(props, publicFields, privateFields) {
769
- const propsToAssign = create(null);
770
- const publicFieldSet = new Set(publicFields);
771
- const privateFieldSet = new Set(privateFields);
772
- keys(props).forEach((propName) => {
773
- const attrName = htmlPropertyToAttribute(propName);
774
- if (publicFieldSet.has(propName) ||
775
- ((isGlobalHtmlAttribute(attrName) || isAriaAttribute(attrName)) &&
776
- !privateFieldSet.has(propName))) {
777
- propsToAssign[propName] = props[propName];
875
+ const getterMap$1 = new WeakMap();
876
+ const setterMap$1 = new WeakMap();
877
+ const reverseGetterMap = new WeakMap();
878
+ const reverseSetterMap = new WeakMap();
879
+ class ReactiveProxyHandler extends BaseProxyHandler {
880
+ wrapValue(value) {
881
+ return this.membrane.getProxy(value);
882
+ }
883
+ wrapGetter(originalGet) {
884
+ const wrappedGetter = getterMap$1.get(originalGet);
885
+ if (!isUndefined(wrappedGetter)) {
886
+ return wrappedGetter;
778
887
  }
779
- });
780
- return propsToAssign;
781
- }
782
- /**
783
- * Descriptor for IDL attribute reflections that merely reflect the string, e.g. `title`.
784
- */
785
- const stringDescriptor = (attrName) => ({
786
- configurable: true,
787
- enumerable: true,
788
- get() {
789
- return this.getAttribute(attrName);
790
- },
791
- set(newValue) {
792
- const currentValue = this.getAttribute(attrName);
793
- const normalizedValue = String(newValue);
794
- if (normalizedValue !== currentValue) {
795
- this.setAttribute(attrName, normalizedValue);
796
- }
797
- },
798
- });
799
- /** Descriptor for a boolean that checks for `attr="true"` or `attr="false"`, e.g. `spellcheck` and `draggable`. */
800
- const explicitBooleanDescriptor = (attrName, defaultValue) => ({
801
- configurable: true,
802
- enumerable: true,
803
- get() {
804
- const value = this.getAttribute(attrName);
805
- if (value === null)
806
- return defaultValue;
807
- // spellcheck=false => false, everything else => true
808
- // draggable=true => true, everything else => false
809
- return value.toLowerCase() === String(defaultValue) ? defaultValue : !defaultValue;
810
- },
811
- set(newValue) {
812
- const currentValue = this.getAttribute(attrName);
813
- const normalizedValue = String(Boolean(newValue));
814
- if (normalizedValue !== currentValue) {
815
- this.setAttribute(attrName, normalizedValue);
888
+ const handler = this;
889
+ const get = function () {
890
+ // invoking the original getter with the original target
891
+ return handler.wrapValue(originalGet.call(unwrap(this)));
892
+ };
893
+ getterMap$1.set(originalGet, get);
894
+ reverseGetterMap.set(get, originalGet);
895
+ return get;
896
+ }
897
+ wrapSetter(originalSet) {
898
+ const wrappedSetter = setterMap$1.get(originalSet);
899
+ if (!isUndefined(wrappedSetter)) {
900
+ return wrappedSetter;
816
901
  }
817
- },
818
- });
819
- /**
820
- * Descriptor for a "true" boolean attribute that checks solely for presence, e.g. `hidden`.
821
- */
822
- const booleanAttributeDescriptor = (attrName) => ({
823
- configurable: true,
824
- enumerable: true,
825
- get() {
826
- return this.hasAttribute(attrName);
827
- },
828
- set(newValue) {
829
- const hasAttribute = this.hasAttribute(attrName);
830
- if (newValue) {
831
- if (!hasAttribute) {
832
- this.setAttribute(attrName, '');
833
- }
902
+ const set = function (v) {
903
+ // invoking the original setter with the original target
904
+ originalSet.call(unwrap(this), unwrap(v));
905
+ };
906
+ setterMap$1.set(originalSet, set);
907
+ reverseSetterMap.set(set, originalSet);
908
+ return set;
909
+ }
910
+ unwrapDescriptor(descriptor) {
911
+ if (hasOwnProperty.call(descriptor, 'value')) {
912
+ // dealing with a data descriptor
913
+ descriptor.value = unwrap(descriptor.value);
834
914
  }
835
915
  else {
836
- if (hasAttribute) {
837
- this.removeAttribute(attrName);
838
- }
839
- }
840
- },
841
- });
842
- /**
843
- * Descriptor for ARIA reflections, e.g. `ariaLabel` and `role`.
844
- */
845
- const ariaDescriptor = (attrName) => ({
846
- configurable: true,
847
- enumerable: true,
848
- get() {
849
- return this.getAttribute(attrName);
850
- },
851
- set(newValue) {
852
- const currentValue = this.getAttribute(attrName);
853
- if (newValue !== currentValue) {
854
- // TODO [#3284]: According to the spec, IDL nullable type values
855
- // (null and undefined) should remove the attribute; however, we
856
- // only do so in the case of null for historical reasons.
857
- if (isNull(newValue)) {
858
- this.removeAttribute(attrName);
916
+ const { set, get } = descriptor;
917
+ if (!isUndefined(get)) {
918
+ descriptor.get = this.unwrapGetter(get);
859
919
  }
860
- else {
861
- this.setAttribute(attrName, toString$1(newValue));
920
+ if (!isUndefined(set)) {
921
+ descriptor.set = this.unwrapSetter(set);
862
922
  }
863
923
  }
864
- },
865
- });
866
- const tabIndexDescriptor = () => ({
867
- configurable: true,
868
- enumerable: true,
869
- get() {
870
- const str = this.getAttribute('tabindex');
871
- const num = Number(str);
872
- return isFinite(num) ? Math.trunc(num) : -1;
873
- },
874
- set(newValue) {
875
- const currentValue = this.getAttribute('tabindex');
876
- const num = Number(newValue);
877
- const normalizedValue = isFinite(num) ? String(Math.trunc(num)) : '0';
878
- if (normalizedValue !== currentValue) {
879
- this.setAttribute('tabindex', toString$1(newValue));
880
- }
881
- },
882
- });
883
- const descriptors = {
884
- accessKey: stringDescriptor('accesskey'),
885
- dir: stringDescriptor('dir'),
886
- draggable: explicitBooleanDescriptor('draggable', true),
887
- hidden: booleanAttributeDescriptor('hidden'),
888
- id: stringDescriptor('id'),
889
- lang: stringDescriptor('lang'),
890
- spellcheck: explicitBooleanDescriptor('spellcheck', false),
891
- tabIndex: tabIndexDescriptor(),
892
- title: stringDescriptor('title'),
893
- };
894
- // Add descriptors for ARIA attributes
895
- for (const [attrName, propName] of entries(AriaAttrNameToPropNameMap)) {
896
- descriptors[propName] = ariaDescriptor(attrName);
897
- }
898
-
899
- /*
900
- * Copyright (c) 2024, salesforce.com, inc.
901
- * All rights reserved.
902
- * SPDX-License-Identifier: MIT
903
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
904
- */
905
- var _LightningElement_attrs, _LightningElement_classList;
906
- const SYMBOL__SET_INTERNALS = Symbol('set-internals');
907
- const SYMBOL__GENERATE_MARKUP = Symbol('generate-markup');
908
- const SYMBOL__DEFAULT_TEMPLATE = Symbol('default-template');
909
- class LightningElement {
910
- constructor(propsAvailableAtConstruction) {
911
- this.isConnected = false;
912
- this.className = '';
913
- _LightningElement_attrs.set(this, void 0);
914
- _LightningElement_classList.set(this, null);
915
- assign(this, propsAvailableAtConstruction);
916
- }
917
- [(_LightningElement_attrs = new WeakMap(), _LightningElement_classList = new WeakMap(), SYMBOL__SET_INTERNALS)](props, attrs) {
918
- __classPrivateFieldSet(this, _LightningElement_attrs, attrs, "f");
919
- assign(this, props);
920
- defineProperty(this, 'className', {
921
- get() {
922
- return props.class ?? '';
923
- },
924
- set(newVal) {
925
- props.class = newVal;
926
- attrs.class = newVal;
927
- mutationTracker.add(this, 'class');
928
- },
929
- });
924
+ return descriptor;
930
925
  }
931
- get classList() {
932
- if (__classPrivateFieldGet(this, _LightningElement_classList, "f")) {
933
- return __classPrivateFieldGet(this, _LightningElement_classList, "f");
926
+ unwrapGetter(redGet) {
927
+ const reverseGetter = reverseGetterMap.get(redGet);
928
+ if (!isUndefined(reverseGetter)) {
929
+ return reverseGetter;
934
930
  }
935
- return (__classPrivateFieldSet(this, _LightningElement_classList, new ClassList(this), "f"));
936
- }
937
- setAttribute(attrName, attrValue) {
938
- const normalizedName = StringToLowerCase.call(toString$1(attrName));
939
- const normalizedValue = String(attrValue);
940
- __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName] = normalizedValue;
941
- mutationTracker.add(this, normalizedName);
931
+ const handler = this;
932
+ const get = function () {
933
+ // invoking the red getter with the proxy of this
934
+ return unwrap(redGet.call(handler.wrapValue(this)));
935
+ };
936
+ getterMap$1.set(get, redGet);
937
+ reverseGetterMap.set(redGet, get);
938
+ return get;
942
939
  }
943
- getAttribute(attrName) {
944
- const normalizedName = StringToLowerCase.call(toString$1(attrName));
945
- if (hasOwnProperty$1.call(__classPrivateFieldGet(this, _LightningElement_attrs, "f"), normalizedName)) {
946
- return __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName];
940
+ unwrapSetter(redSet) {
941
+ const reverseSetter = reverseSetterMap.get(redSet);
942
+ if (!isUndefined(reverseSetter)) {
943
+ return reverseSetter;
947
944
  }
948
- return null;
949
- }
950
- hasAttribute(attrName) {
951
- const normalizedName = StringToLowerCase.call(toString$1(attrName));
952
- return hasOwnProperty$1.call(__classPrivateFieldGet(this, _LightningElement_attrs, "f"), normalizedName);
953
- }
954
- removeAttribute(attrName) {
955
- const normalizedName = StringToLowerCase.call(toString$1(attrName));
956
- delete __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName];
957
- // Track mutations for removal of non-existing attributes
958
- mutationTracker.add(this, normalizedName);
959
- }
960
- addEventListener(_type, _listener, _options) {
961
- // noop
962
- }
963
- removeEventListener(_type, _listener, _options) {
964
- // noop
965
- }
966
- // ----------------------------------------------------------- //
967
- // Props/methods explicitly not available in this environment //
968
- // Getters are named "get*" for parity with @lwc/engine-server //
969
- // ----------------------------------------------------------- //
970
- get children() {
971
- throw new TypeError('"getChildren" is not supported in this environment');
972
- }
973
- get childNodes() {
974
- throw new TypeError('"getChildNodes" is not supported in this environment');
975
- }
976
- get firstChild() {
977
- throw new TypeError('"getFirstChild" is not supported in this environment');
978
- }
979
- get firstElementChild() {
980
- throw new TypeError('"getFirstElementChild" is not supported in this environment');
981
- }
982
- get hostElement() {
983
- // Intentionally different to match @lwc/engine-*core*
984
- throw new TypeError('this.hostElement is not supported in this environment');
985
- }
986
- get lastChild() {
987
- throw new TypeError('"getLastChild" is not supported in this environment');
988
- }
989
- get lastElementChild() {
990
- throw new TypeError('"getLastElementChild" is not supported in this environment');
945
+ const handler = this;
946
+ const set = function (v) {
947
+ // invoking the red setter with the proxy of this
948
+ redSet.call(handler.wrapValue(this), handler.wrapValue(v));
949
+ };
950
+ setterMap$1.set(set, redSet);
951
+ reverseSetterMap.set(redSet, set);
952
+ return set;
991
953
  }
992
- get ownerDocument() {
993
- // Intentionally not "get*" to match @lwc/engine-server
994
- throw new TypeError('"ownerDocument" is not supported in this environment');
954
+ set(shadowTarget, key, value) {
955
+ const { originalTarget, membrane: { valueMutated }, } = this;
956
+ const oldValue = originalTarget[key];
957
+ if (oldValue !== value) {
958
+ originalTarget[key] = value;
959
+ valueMutated(originalTarget, key);
960
+ }
961
+ else if (key === 'length' && isArray(originalTarget)) {
962
+ // fix for issue #236: push will add the new index, and by the time length
963
+ // is updated, the internal length is already equal to the new length value
964
+ // therefore, the oldValue is equal to the value. This is the forking logic
965
+ // to support this use case.
966
+ valueMutated(originalTarget, key);
967
+ }
968
+ return true;
995
969
  }
996
- get style() {
997
- // Intentionally not "get*" to match @lwc/engine-server
998
- throw new TypeError('"style" is not supported in this environment');
970
+ deleteProperty(shadowTarget, key) {
971
+ const { originalTarget, membrane: { valueMutated }, } = this;
972
+ delete originalTarget[key];
973
+ valueMutated(originalTarget, key);
974
+ return true;
999
975
  }
1000
- attachInternals() {
1001
- throw new TypeError('"attachInternals" is not supported in this environment');
976
+ setPrototypeOf(shadowTarget, prototype) {
1002
977
  }
1003
- dispatchEvent(_event) {
1004
- throw new TypeError('"dispatchEvent" is not supported in this environment');
978
+ preventExtensions(shadowTarget) {
979
+ if (isExtensible(shadowTarget)) {
980
+ const { originalTarget } = this;
981
+ preventExtensions(originalTarget);
982
+ // if the originalTarget is a proxy itself, it might reject
983
+ // the preventExtension call, in which case we should not attempt to lock down
984
+ // the shadow target.
985
+ // TODO: It should not actually be possible to reach this `if` statement.
986
+ // If a proxy rejects extensions, then calling preventExtensions will throw an error:
987
+ // https://codepen.io/nolanlawson-the-selector/pen/QWMOjbY
988
+ /* istanbul ignore if */
989
+ if (isExtensible(originalTarget)) {
990
+ return false;
991
+ }
992
+ this.lockShadowTarget(shadowTarget);
993
+ }
994
+ return true;
1005
995
  }
1006
- getBoundingClientRect() {
1007
- throw new TypeError('"getBoundingClientRect" is not supported in this environment');
996
+ defineProperty(shadowTarget, key, descriptor) {
997
+ const { originalTarget, membrane: { valueMutated, tagPropertyKey }, } = this;
998
+ if (key === tagPropertyKey && !hasOwnProperty.call(originalTarget, key)) {
999
+ // To avoid leaking the membrane tag property into the original target, we must
1000
+ // be sure that the original target doesn't have yet.
1001
+ // NOTE: we do not return false here because Object.freeze and equivalent operations
1002
+ // will attempt to set the descriptor to the same value, and expect no to throw. This
1003
+ // is an small compromise for the sake of not having to diff the descriptors.
1004
+ return true;
1005
+ }
1006
+ ObjectDefineProperty(originalTarget, key, this.unwrapDescriptor(descriptor));
1007
+ // intentionally testing if false since it could be undefined as well
1008
+ if (descriptor.configurable === false) {
1009
+ this.copyDescriptorIntoShadowTarget(shadowTarget, key);
1010
+ }
1011
+ valueMutated(originalTarget, key);
1012
+ return true;
1008
1013
  }
1009
- getElementsByClassName(_classNames) {
1010
- throw new TypeError('"getElementsByClassName" is not supported in this environment');
1014
+ }
1015
+
1016
+ const getterMap = new WeakMap();
1017
+ const setterMap = new WeakMap();
1018
+ class ReadOnlyHandler extends BaseProxyHandler {
1019
+ wrapValue(value) {
1020
+ return this.membrane.getReadOnlyProxy(value);
1011
1021
  }
1012
- getElementsByTagName(_qualifiedName) {
1013
- throw new TypeError('"getElementsByTagName" is not supported in this environment');
1022
+ wrapGetter(originalGet) {
1023
+ const wrappedGetter = getterMap.get(originalGet);
1024
+ if (!isUndefined(wrappedGetter)) {
1025
+ return wrappedGetter;
1026
+ }
1027
+ const handler = this;
1028
+ const get = function () {
1029
+ // invoking the original getter with the original target
1030
+ return handler.wrapValue(originalGet.call(unwrap(this)));
1031
+ };
1032
+ getterMap.set(originalGet, get);
1033
+ return get;
1014
1034
  }
1015
- querySelector(_selectors) {
1016
- throw new TypeError('"querySelector" is not supported in this environment');
1035
+ wrapSetter(originalSet) {
1036
+ const wrappedSetter = setterMap.get(originalSet);
1037
+ if (!isUndefined(wrappedSetter)) {
1038
+ return wrappedSetter;
1039
+ }
1040
+ const set = function (v) {
1041
+ };
1042
+ setterMap.set(originalSet, set);
1043
+ return set;
1017
1044
  }
1018
- querySelectorAll(_selectors) {
1019
- throw new TypeError('"querySelectorAll" is not supported in this environment');
1045
+ set(shadowTarget, key, value) {
1046
+ /* istanbul ignore next */
1047
+ return false;
1020
1048
  }
1021
- getAttributeNS(_namespace, _localName) {
1022
- throw new Error('Method "getAttributeNS" not implemented.');
1049
+ deleteProperty(shadowTarget, key) {
1050
+ /* istanbul ignore next */
1051
+ return false;
1023
1052
  }
1024
- hasAttributeNS(_namespace, _localName) {
1025
- throw new Error('Method "hasAttributeNS" not implemented.');
1053
+ setPrototypeOf(shadowTarget, prototype) {
1026
1054
  }
1027
- removeAttributeNS(_namespace, _localName) {
1028
- throw new Error('Method "removeAttributeNS" not implemented.');
1055
+ preventExtensions(shadowTarget) {
1056
+ /* istanbul ignore next */
1057
+ return false;
1029
1058
  }
1030
- setAttributeNS(_namespace, _qualifiedName, _value) {
1031
- throw new Error('Method "setAttributeNS" not implemented.');
1059
+ defineProperty(shadowTarget, key, descriptor) {
1060
+ /* istanbul ignore next */
1061
+ return false;
1032
1062
  }
1033
1063
  }
1034
- defineProperties(LightningElement.prototype, descriptors);
1035
1064
 
1036
- /*
1037
- * Copyright (c) 2024, salesforce.com, inc.
1038
- * All rights reserved.
1039
- * SPDX-License-Identifier: MIT
1040
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1041
- */
1042
- const escapeAttrVal = (attrValue) => attrValue.replaceAll('&', '&amp;').replaceAll('"', '&quot;');
1043
- function renderAttrsPrivate(instance, attrs, hostScopeToken, scopeToken) {
1044
- // The scopeToken is e.g. `lwc-xyz123` which is the token our parent gives us.
1045
- // The hostScopeToken is e.g. `lwc-abc456-host` which is the token for our own component.
1046
- // It's possible to have both, one, the other, or neither.
1047
- const combinedScopeToken = scopeToken && hostScopeToken
1048
- ? `${scopeToken} ${hostScopeToken}`
1049
- : scopeToken || hostScopeToken || '';
1050
- let result = '';
1051
- let hasClassAttribute = false;
1052
- for (const attrName of getOwnPropertyNames$1(attrs)) {
1053
- let attrValue = attrs[attrName];
1054
- if (isNull(attrValue) || isUndefined$1(attrValue)) {
1055
- attrValue = '';
1056
- }
1057
- else if (!isString(attrValue)) {
1058
- attrValue = String(attrValue);
1059
- }
1060
- if (combinedScopeToken && attrName === 'class') {
1061
- attrValue += ' ' + combinedScopeToken;
1062
- hasClassAttribute = true;
1063
- }
1064
- result += attrValue === '' ? ` ${attrName}` : ` ${attrName}="${escapeAttrVal(attrValue)}"`;
1065
+ function defaultValueIsObservable(value) {
1066
+ // intentionally checking for null
1067
+ if (value === null) {
1068
+ return false;
1065
1069
  }
1066
- // If we didn't render any `class` attribute, render one for the scope token(s)
1067
- if (!hasClassAttribute && combinedScopeToken) {
1068
- result += ` class="${combinedScopeToken}"`;
1070
+ // treat all non-object types, including undefined, as non-observable values
1071
+ if (typeof value !== 'object') {
1072
+ return false;
1069
1073
  }
1070
- // For the host scope token only, we encode a special attribute for hydration
1071
- if (hostScopeToken) {
1072
- result += ` data-lwc-host-scope-token="${hostScopeToken}"`;
1074
+ if (isArray(value)) {
1075
+ return true;
1073
1076
  }
1074
- result += mutationTracker.renderMutatedAttrs(instance);
1075
- return result;
1076
- }
1077
- function* renderAttrs(instance, attrs, hostScopeToken, scopeToken) {
1078
- yield renderAttrsPrivate(instance, attrs, hostScopeToken, scopeToken);
1079
- }
1080
- function renderAttrsNoYield(emit, instance, attrs, hostScopeToken, scopeToken) {
1081
- emit(renderAttrsPrivate(instance, attrs, hostScopeToken, scopeToken));
1077
+ const proto = getPrototypeOf(value);
1078
+ return proto === ObjectDotPrototype || proto === null || getPrototypeOf(proto) === null;
1082
1079
  }
1083
- function* fallbackTmpl(_props, _attrs, _shadowSlottedContent, _lightSlottedContent, Cmp, _instance) {
1084
- if (Cmp.renderMode !== 'light') {
1085
- yield '<template shadowrootmode="open"></template>';
1086
- }
1080
+ const defaultValueObserved = (obj, key) => {
1081
+ /* do nothing */
1082
+ };
1083
+ const defaultValueMutated = (obj, key) => {
1084
+ /* do nothing */
1085
+ };
1086
+ function createShadowTarget(value) {
1087
+ return isArray(value) ? [] : {};
1087
1088
  }
1088
- function fallbackTmplNoYield(emit, _props, _attrs, _shadowSlottedContent, _lightSlottedContent, Cmp, _instance) {
1089
- if (Cmp.renderMode !== 'light') {
1090
- emit('<template shadowrootmode="open"></template>');
1089
+ class ObservableMembrane {
1090
+ constructor(options = {}) {
1091
+ this.readOnlyObjectGraph = new WeakMap();
1092
+ this.reactiveObjectGraph = new WeakMap();
1093
+ const { valueMutated, valueObserved, valueIsObservable, tagPropertyKey } = options;
1094
+ this.valueMutated = isFunction(valueMutated) ? valueMutated : defaultValueMutated;
1095
+ this.valueObserved = isFunction(valueObserved) ? valueObserved : defaultValueObserved;
1096
+ this.valueIsObservable = isFunction(valueIsObservable)
1097
+ ? valueIsObservable
1098
+ : defaultValueIsObservable;
1099
+ this.tagPropertyKey = tagPropertyKey;
1091
1100
  }
1092
- }
1093
- async function serverSideRenderComponent(tagName, Component, props = {}, mode = DEFAULT_SSR_MODE) {
1094
- if (typeof tagName !== 'string') {
1095
- throw new Error(`tagName must be a string, found: ${tagName}`);
1101
+ getProxy(value) {
1102
+ const unwrappedValue = unwrap(value);
1103
+ if (this.valueIsObservable(unwrappedValue)) {
1104
+ // When trying to extract the writable version of a readonly we return the readonly.
1105
+ if (this.readOnlyObjectGraph.get(unwrappedValue) === value) {
1106
+ return value;
1107
+ }
1108
+ return this.getReactiveHandler(unwrappedValue);
1109
+ }
1110
+ return unwrappedValue;
1096
1111
  }
1097
- const generateMarkup = Component[SYMBOL__GENERATE_MARKUP];
1098
- let markup = '';
1099
- const emit = (segment) => {
1100
- markup += segment;
1101
- };
1102
- if (mode === 'asyncYield') {
1103
- for await (const segment of generateMarkup(tagName, props, null, null, null)) {
1104
- markup += segment;
1112
+ getReadOnlyProxy(value) {
1113
+ value = unwrap(value);
1114
+ if (this.valueIsObservable(value)) {
1115
+ return this.getReadOnlyHandler(value);
1105
1116
  }
1117
+ return value;
1106
1118
  }
1107
- else if (mode === 'async') {
1108
- await generateMarkup(emit, tagName, props, null, null, null);
1119
+ unwrapProxy(p) {
1120
+ return unwrap(p);
1109
1121
  }
1110
- else if (mode === 'sync') {
1111
- generateMarkup(emit, tagName, props, null, null, null);
1122
+ getReactiveHandler(value) {
1123
+ let proxy = this.reactiveObjectGraph.get(value);
1124
+ if (isUndefined(proxy)) {
1125
+ // caching the proxy after the first time it is accessed
1126
+ const handler = new ReactiveProxyHandler(this, value);
1127
+ proxy = new Proxy(createShadowTarget(value), handler);
1128
+ registerProxy(proxy, value);
1129
+ this.reactiveObjectGraph.set(value, proxy);
1130
+ }
1131
+ return proxy;
1112
1132
  }
1113
- else {
1114
- throw new Error(`Invalid mode: ${mode}`);
1133
+ getReadOnlyHandler(value) {
1134
+ let proxy = this.readOnlyObjectGraph.get(value);
1135
+ if (isUndefined(proxy)) {
1136
+ // caching the proxy after the first time it is accessed
1137
+ const handler = new ReadOnlyHandler(this, value);
1138
+ proxy = new Proxy(createShadowTarget(value), handler);
1139
+ registerProxy(proxy, value);
1140
+ this.readOnlyObjectGraph.set(value, proxy);
1141
+ }
1142
+ return proxy;
1115
1143
  }
1116
- return markup;
1117
1144
  }
1145
+ /** version: 2.0.0 */
1118
1146
 
1119
1147
  /*
1120
1148
  * Copyright (c) 2024, Salesforce, Inc.
@@ -1122,90 +1150,231 @@ async function serverSideRenderComponent(tagName, Component, props = {}, mode =
1122
1150
  * SPDX-License-Identifier: MIT
1123
1151
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1124
1152
  */
1125
- /**
1126
- * Per the HTML spec on restrictions for "raw text elements" like `<style>`:
1127
- *
1128
- * > The text in raw text and escapable raw text elements must not contain any occurrences of the string
1129
- * > "</" (U+003C LESS-THAN SIGN, U+002F SOLIDUS) followed by characters that case-insensitively match the tag name of
1130
- * > the element followed by one of:
1131
- * > - U+0009 CHARACTER TABULATION (tab)
1132
- * > - U+000A LINE FEED (LF)
1133
- * > - U+000C FORM FEED (FF)
1134
- * > - U+000D CARRIAGE RETURN (CR)
1135
- * > - U+0020 SPACE
1136
- * > - U+003E GREATER-THAN SIGN (>), or
1137
- * > - U+002F SOLIDUS (/)
1138
- * @see https://html.spec.whatwg.org/multipage/syntax.html#cdata-rcdata-restrictions
1139
- */
1140
- const INVALID_STYLE_CONTENT = /<\/style[\t\n\f\r >/]/i;
1141
- /**
1142
- * The text content inside `<style>` is a special case. It is _only_ rendered by the LWC engine itself; `<style>` tags
1143
- * are disallowed inside of HTML templates.
1144
- *
1145
- * The `<style>` tag is unusual in how it's defined in HTML. Like `<script>`, it is considered a "raw text element,"
1146
- * which means that it is parsed as raw text, but certain character sequences are disallowed, namely to avoid XSS
1147
- * attacks like `</style><script>alert("pwned")</script>`.
1148
- *
1149
- * This also means that we cannot use "normal" HTML escaping inside `<style>` tags, e.g. we cannot use `&lt;`,
1150
- * `&gt;`, etc., because these are treated as-is by the HTML parser.
1151
- *
1152
- *
1153
- * @param contents CSS source to validate
1154
- * @throws Throws if the contents provided are not valid.
1155
- * @see https://html.spec.whatwg.org/multipage/syntax.html#raw-text-elements
1156
- * @see https://github.com/salesforce/lwc/issues/3439
1157
- * @example
1158
- * validateStyleTextContents('div { color: red }') // Ok
1159
- * validateStyleTextContents('</style><script>alert("pwned")</script>') // Throws
1160
- */
1161
- function validateStyleTextContents(contents) {
1162
- if (INVALID_STYLE_CONTENT.test(contents)) {
1163
- throw new Error('CSS contains unsafe characters and cannot be serialized inside a style element');
1164
- }
1153
+ const reactiveMembrane = new ObservableMembrane();
1154
+ // Modeled after `getReadOnlyProxy` in `membrane.ts` in `engine-core`
1155
+ // Return a proxy over the given object so that access is immutable
1156
+ // https://github.com/salesforce/lwc/blob/e9db491/packages/%40lwc/engine-core/src/framework/membrane.ts#L29-L33
1157
+ function getReadOnlyProxy(value) {
1158
+ return reactiveMembrane.getReadOnlyProxy(value);
1165
1159
  }
1166
1160
 
1161
+ /******************************************************************************
1162
+ Copyright (c) Microsoft Corporation.
1163
+
1164
+ Permission to use, copy, modify, and/or distribute this software for any
1165
+ purpose with or without fee is hereby granted.
1166
+
1167
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
1168
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1169
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1170
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1171
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1172
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1173
+ PERFORMANCE OF THIS SOFTWARE.
1174
+ ***************************************************************************** */
1175
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
1176
+
1177
+
1178
+ function __classPrivateFieldGet(receiver, state, kind, f) {
1179
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
1180
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
1181
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
1182
+ }
1183
+
1184
+ function __classPrivateFieldSet(receiver, state, value, kind, f) {
1185
+ if (kind === "m") throw new TypeError("Private method is not writable");
1186
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
1187
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
1188
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
1189
+ }
1190
+
1191
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1192
+ var e = new Error(message);
1193
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
1194
+ };
1195
+
1167
1196
  /*
1168
1197
  * Copyright (c) 2024, Salesforce, Inc.
1169
1198
  * All rights reserved.
1170
1199
  * SPDX-License-Identifier: MIT
1171
1200
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1172
1201
  */
1173
- // Traverse in the same order as `flattenStylesheets` but without creating unnecessary additional arrays
1174
- function traverseStylesheets(stylesheets, callback) {
1175
- if (isArray$1(stylesheets)) {
1176
- for (let i = 0; i < stylesheets.length; i++) {
1177
- traverseStylesheets(stylesheets[i], callback);
1202
+ var _MutationTracker_enabledSet, _MutationTracker_mutationMap;
1203
+ class MutationTracker {
1204
+ constructor() {
1205
+ _MutationTracker_enabledSet.set(this, new WeakSet());
1206
+ _MutationTracker_mutationMap.set(this, new WeakMap());
1207
+ }
1208
+ add(instance, attrName) {
1209
+ if (__classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").has(instance)) {
1210
+ let mutatedAttrs = __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").get(instance);
1211
+ if (!mutatedAttrs) {
1212
+ mutatedAttrs = new Set();
1213
+ __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").set(instance, mutatedAttrs);
1214
+ }
1215
+ mutatedAttrs.add(attrName.toLowerCase());
1178
1216
  }
1179
1217
  }
1180
- else if (stylesheets) {
1181
- callback(stylesheets);
1218
+ enable(instance) {
1219
+ __classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").add(instance);
1220
+ }
1221
+ disable(instance) {
1222
+ __classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").delete(instance);
1223
+ }
1224
+ renderMutatedAttrs(instance) {
1225
+ const mutatedAttrs = __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").get(instance);
1226
+ if (mutatedAttrs) {
1227
+ return ` data-lwc-host-mutated="${[...mutatedAttrs].sort().join(' ')}"`;
1228
+ }
1229
+ else {
1230
+ return '';
1231
+ }
1182
1232
  }
1183
1233
  }
1184
- function hasScopedStaticStylesheets(Component) {
1185
- let scoped = false;
1186
- traverseStylesheets(Component.stylesheets, (stylesheet) => {
1187
- scoped ||= !!stylesheet.$scoped$;
1234
+ _MutationTracker_enabledSet = new WeakMap(), _MutationTracker_mutationMap = new WeakMap();
1235
+ const mutationTracker = new MutationTracker();
1236
+
1237
+ /*
1238
+ * Copyright (c) 2024, Salesforce, Inc.
1239
+ * All rights reserved.
1240
+ * SPDX-License-Identifier: MIT
1241
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1242
+ */
1243
+ /**
1244
+ * Filters out the following types of properties that should not be set.
1245
+ * - Properties that are not public.
1246
+ * - Properties that are not global.
1247
+ * - Properties that are global but are internally overridden.
1248
+ */
1249
+ function filterProperties(props, publicFields, privateFields) {
1250
+ const propsToAssign = create(null);
1251
+ const publicFieldSet = new Set(publicFields);
1252
+ const privateFieldSet = new Set(privateFields);
1253
+ keys(props).forEach((propName) => {
1254
+ const attrName = htmlPropertyToAttribute(propName);
1255
+ if (publicFieldSet.has(propName) ||
1256
+ ((isGlobalHtmlAttribute(attrName) || isAriaAttribute(attrName)) &&
1257
+ !privateFieldSet.has(propName))) {
1258
+ propsToAssign[propName] = props[propName];
1259
+ }
1188
1260
  });
1189
- return scoped;
1261
+ return propsToAssign;
1190
1262
  }
1191
- function renderStylesheets(defaultStylesheets, defaultScopedStylesheets, staticStylesheets, scopeToken, Component, hasScopedTemplateStyles) {
1192
- const hasAnyScopedStyles = hasScopedTemplateStyles || hasScopedStaticStylesheets(Component);
1193
- const { renderMode } = Component;
1194
- let result = '';
1195
- const renderStylesheet = (stylesheet) => {
1196
- const { $scoped$: scoped } = stylesheet;
1197
- const token = scoped ? scopeToken : undefined;
1198
- const useActualHostSelector = !scoped || renderMode !== 'light';
1199
- const useNativeDirPseudoclass = true;
1200
- const styleContents = stylesheet(token, useActualHostSelector, useNativeDirPseudoclass);
1201
- validateStyleTextContents(styleContents);
1202
- // TODO [#2869]: `<style>`s should not have scope token classes
1203
- result += `<style${hasAnyScopedStyles ? ` class="${scopeToken}"` : ''} type="text/css">${styleContents}</style>`;
1204
- };
1205
- traverseStylesheets(defaultStylesheets, renderStylesheet);
1206
- traverseStylesheets(defaultScopedStylesheets, renderStylesheet);
1207
- traverseStylesheets(staticStylesheets, renderStylesheet);
1208
- return result;
1263
+ /**
1264
+ * Descriptor for IDL attribute reflections that merely reflect the string, e.g. `title`.
1265
+ */
1266
+ const stringDescriptor = (attrName) => ({
1267
+ configurable: true,
1268
+ enumerable: true,
1269
+ get() {
1270
+ return this.getAttribute(attrName);
1271
+ },
1272
+ set(newValue) {
1273
+ const currentValue = this.getAttribute(attrName);
1274
+ const normalizedValue = String(newValue);
1275
+ if (normalizedValue !== currentValue) {
1276
+ this.setAttribute(attrName, normalizedValue);
1277
+ }
1278
+ },
1279
+ });
1280
+ /** Descriptor for a boolean that checks for `attr="true"` or `attr="false"`, e.g. `spellcheck` and `draggable`. */
1281
+ const explicitBooleanDescriptor = (attrName, defaultValue) => ({
1282
+ configurable: true,
1283
+ enumerable: true,
1284
+ get() {
1285
+ const value = this.getAttribute(attrName);
1286
+ if (value === null)
1287
+ return defaultValue;
1288
+ // spellcheck=false => false, everything else => true
1289
+ // draggable=true => true, everything else => false
1290
+ return value.toLowerCase() === String(defaultValue) ? defaultValue : !defaultValue;
1291
+ },
1292
+ set(newValue) {
1293
+ const currentValue = this.getAttribute(attrName);
1294
+ const normalizedValue = String(Boolean(newValue));
1295
+ if (normalizedValue !== currentValue) {
1296
+ this.setAttribute(attrName, normalizedValue);
1297
+ }
1298
+ },
1299
+ });
1300
+ /**
1301
+ * Descriptor for a "true" boolean attribute that checks solely for presence, e.g. `hidden`.
1302
+ */
1303
+ const booleanAttributeDescriptor = (attrName) => ({
1304
+ configurable: true,
1305
+ enumerable: true,
1306
+ get() {
1307
+ return this.hasAttribute(attrName);
1308
+ },
1309
+ set(newValue) {
1310
+ const hasAttribute = this.hasAttribute(attrName);
1311
+ if (newValue) {
1312
+ if (!hasAttribute) {
1313
+ this.setAttribute(attrName, '');
1314
+ }
1315
+ }
1316
+ else {
1317
+ if (hasAttribute) {
1318
+ this.removeAttribute(attrName);
1319
+ }
1320
+ }
1321
+ },
1322
+ });
1323
+ /**
1324
+ * Descriptor for ARIA reflections, e.g. `ariaLabel` and `role`.
1325
+ */
1326
+ const ariaDescriptor = (attrName) => ({
1327
+ configurable: true,
1328
+ enumerable: true,
1329
+ get() {
1330
+ return this.getAttribute(attrName);
1331
+ },
1332
+ set(newValue) {
1333
+ const currentValue = this.getAttribute(attrName);
1334
+ if (newValue !== currentValue) {
1335
+ // TODO [#3284]: According to the spec, IDL nullable type values
1336
+ // (null and undefined) should remove the attribute; however, we
1337
+ // only do so in the case of null for historical reasons.
1338
+ if (isNull(newValue)) {
1339
+ this.removeAttribute(attrName);
1340
+ }
1341
+ else {
1342
+ this.setAttribute(attrName, toString(newValue));
1343
+ }
1344
+ }
1345
+ },
1346
+ });
1347
+ const tabIndexDescriptor = () => ({
1348
+ configurable: true,
1349
+ enumerable: true,
1350
+ get() {
1351
+ const str = this.getAttribute('tabindex');
1352
+ const num = Number(str);
1353
+ return isFinite(num) ? Math.trunc(num) : -1;
1354
+ },
1355
+ set(newValue) {
1356
+ const currentValue = this.getAttribute('tabindex');
1357
+ const num = Number(newValue);
1358
+ const normalizedValue = isFinite(num) ? String(Math.trunc(num)) : '0';
1359
+ if (normalizedValue !== currentValue) {
1360
+ this.setAttribute('tabindex', toString(newValue));
1361
+ }
1362
+ },
1363
+ });
1364
+ const descriptors = {
1365
+ accessKey: stringDescriptor('accesskey'),
1366
+ dir: stringDescriptor('dir'),
1367
+ draggable: explicitBooleanDescriptor('draggable', true),
1368
+ hidden: booleanAttributeDescriptor('hidden'),
1369
+ id: stringDescriptor('id'),
1370
+ lang: stringDescriptor('lang'),
1371
+ spellcheck: explicitBooleanDescriptor('spellcheck', false),
1372
+ tabIndex: tabIndexDescriptor(),
1373
+ title: stringDescriptor('title'),
1374
+ };
1375
+ // Add descriptors for ARIA attributes
1376
+ for (const [attrName, propName] of entries(AriaAttrNameToPropNameMap)) {
1377
+ descriptors[propName] = ariaDescriptor(attrName);
1209
1378
  }
1210
1379
 
1211
1380
  /*
@@ -1214,581 +1383,225 @@ function renderStylesheets(defaultStylesheets, defaultScopedStylesheets, staticS
1214
1383
  * SPDX-License-Identifier: MIT
1215
1384
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1216
1385
  */
1217
- /**
1218
- * Converts an iterable into one that emits the object used by the [`iterator` directive](
1219
- * https://lwc.dev/guide/html_templates#iterator).
1220
- */
1221
- function* toIteratorDirective(iterable) {
1222
- if (iterable === undefined || iterable === null)
1223
- return;
1224
- if (!iterable[Symbol.iterator]) {
1225
- throw new Error(
1226
- // Mimic error message from "[i]terable node" in engine-core's api.ts
1227
- `Invalid template iteration for value \`${iterable}\`. It must be an array-like object.`);
1228
- }
1229
- const iterator = iterable[Symbol.iterator]();
1230
- let next = iterator.next();
1231
- let index = 0;
1232
- let { value, done: last = false } = next;
1233
- while (last === false) {
1234
- // using a look-back approach because we need to know if the element is the last
1235
- next = iterator.next();
1236
- last = next.done ?? false;
1237
- yield {
1238
- value,
1239
- index,
1240
- first: index === 0,
1241
- last,
1242
- };
1243
- index += 1;
1244
- value = next.value;
1245
- }
1246
- }
1247
-
1248
- /**
1249
- * Copyright (C) 2017 salesforce.com, inc.
1250
- */
1251
- const { isArray } = Array;
1252
- const { prototype: ObjectDotPrototype, getPrototypeOf, create: ObjectCreate, defineProperty: ObjectDefineProperty, isExtensible, getOwnPropertyDescriptor, getOwnPropertyNames, getOwnPropertySymbols, preventExtensions, hasOwnProperty, } = Object;
1253
- const { push: ArrayPush, concat: ArrayConcat } = Array.prototype;
1254
- const OtS = {}.toString;
1255
- function toString(obj) {
1256
- if (obj && obj.toString) {
1257
- return obj.toString();
1258
- }
1259
- else if (typeof obj === 'object') {
1260
- return OtS.call(obj);
1261
- }
1262
- else {
1263
- return obj + '';
1386
+ var _LightningElement_attrs, _LightningElement_classList;
1387
+ const SYMBOL__SET_INTERNALS = Symbol('set-internals');
1388
+ const SYMBOL__GENERATE_MARKUP = Symbol('generate-markup');
1389
+ const SYMBOL__DEFAULT_TEMPLATE = Symbol('default-template');
1390
+ class LightningElement {
1391
+ constructor(propsAvailableAtConstruction) {
1392
+ this.isConnected = false;
1393
+ this.className = '';
1394
+ _LightningElement_attrs.set(this, void 0);
1395
+ _LightningElement_classList.set(this, null);
1396
+ assign(this, propsAvailableAtConstruction);
1264
1397
  }
1265
- }
1266
- function isUndefined(obj) {
1267
- return obj === undefined;
1268
- }
1269
- function isFunction(obj) {
1270
- return typeof obj === 'function';
1271
- }
1272
- const proxyToValueMap = new WeakMap();
1273
- function registerProxy(proxy, value) {
1274
- proxyToValueMap.set(proxy, value);
1275
- }
1276
- const unwrap = (replicaOrAny) => proxyToValueMap.get(replicaOrAny) || replicaOrAny;
1277
-
1278
- class BaseProxyHandler {
1279
- constructor(membrane, value) {
1280
- this.originalTarget = value;
1281
- this.membrane = membrane;
1398
+ [(_LightningElement_attrs = new WeakMap(), _LightningElement_classList = new WeakMap(), SYMBOL__SET_INTERNALS)](props, attrs) {
1399
+ __classPrivateFieldSet(this, _LightningElement_attrs, attrs, "f");
1400
+ assign(this, props);
1401
+ defineProperty(this, 'className', {
1402
+ get() {
1403
+ return props.class ?? '';
1404
+ },
1405
+ set(newVal) {
1406
+ props.class = newVal;
1407
+ attrs.class = newVal;
1408
+ mutationTracker.add(this, 'class');
1409
+ },
1410
+ });
1282
1411
  }
1283
- // Shared utility methods
1284
- wrapDescriptor(descriptor) {
1285
- if (hasOwnProperty.call(descriptor, 'value')) {
1286
- descriptor.value = this.wrapValue(descriptor.value);
1287
- }
1288
- else {
1289
- const { set: originalSet, get: originalGet } = descriptor;
1290
- if (!isUndefined(originalGet)) {
1291
- descriptor.get = this.wrapGetter(originalGet);
1292
- }
1293
- if (!isUndefined(originalSet)) {
1294
- descriptor.set = this.wrapSetter(originalSet);
1295
- }
1412
+ get classList() {
1413
+ if (__classPrivateFieldGet(this, _LightningElement_classList, "f")) {
1414
+ return __classPrivateFieldGet(this, _LightningElement_classList, "f");
1296
1415
  }
1297
- return descriptor;
1416
+ return (__classPrivateFieldSet(this, _LightningElement_classList, new ClassList(this), "f"));
1298
1417
  }
1299
- copyDescriptorIntoShadowTarget(shadowTarget, key) {
1300
- const { originalTarget } = this;
1301
- // Note: a property might get defined multiple times in the shadowTarget
1302
- // but it will always be compatible with the previous descriptor
1303
- // to preserve the object invariants, which makes these lines safe.
1304
- const originalDescriptor = getOwnPropertyDescriptor(originalTarget, key);
1305
- // TODO: it should be impossible for the originalDescriptor to ever be undefined, this `if` can be removed
1306
- /* istanbul ignore else */
1307
- if (!isUndefined(originalDescriptor)) {
1308
- const wrappedDesc = this.wrapDescriptor(originalDescriptor);
1309
- ObjectDefineProperty(shadowTarget, key, wrappedDesc);
1310
- }
1418
+ setAttribute(attrName, attrValue) {
1419
+ const normalizedName = StringToLowerCase.call(toString(attrName));
1420
+ const normalizedValue = String(attrValue);
1421
+ __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName] = normalizedValue;
1422
+ mutationTracker.add(this, normalizedName);
1311
1423
  }
1312
- lockShadowTarget(shadowTarget) {
1313
- const { originalTarget } = this;
1314
- const targetKeys = ArrayConcat.call(getOwnPropertyNames(originalTarget), getOwnPropertySymbols(originalTarget));
1315
- targetKeys.forEach((key) => {
1316
- this.copyDescriptorIntoShadowTarget(shadowTarget, key);
1317
- });
1318
- const { membrane: { tagPropertyKey }, } = this;
1319
- if (!isUndefined(tagPropertyKey) && !hasOwnProperty.call(shadowTarget, tagPropertyKey)) {
1320
- ObjectDefineProperty(shadowTarget, tagPropertyKey, ObjectCreate(null));
1424
+ getAttribute(attrName) {
1425
+ const normalizedName = StringToLowerCase.call(toString(attrName));
1426
+ if (hasOwnProperty$1.call(__classPrivateFieldGet(this, _LightningElement_attrs, "f"), normalizedName)) {
1427
+ return __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName];
1321
1428
  }
1322
- preventExtensions(shadowTarget);
1323
- }
1324
- // Shared Traps
1325
- // TODO: apply() is never called
1326
- /* istanbul ignore next */
1327
- apply(shadowTarget, thisArg, argArray) {
1328
- /* No op */
1329
- }
1330
- // TODO: construct() is never called
1331
- /* istanbul ignore next */
1332
- construct(shadowTarget, argArray, newTarget) {
1333
- /* No op */
1334
- }
1335
- get(shadowTarget, key) {
1336
- const { originalTarget, membrane: { valueObserved }, } = this;
1337
- const value = originalTarget[key];
1338
- valueObserved(originalTarget, key);
1339
- return this.wrapValue(value);
1340
- }
1341
- has(shadowTarget, key) {
1342
- const { originalTarget, membrane: { tagPropertyKey, valueObserved }, } = this;
1343
- valueObserved(originalTarget, key);
1344
- // since key is never going to be undefined, and tagPropertyKey might be undefined
1345
- // we can simply compare them as the second part of the condition.
1346
- return key in originalTarget || key === tagPropertyKey;
1347
- }
1348
- ownKeys(shadowTarget) {
1349
- const { originalTarget, membrane: { tagPropertyKey }, } = this;
1350
- // if the membrane tag key exists and it is not in the original target, we add it to the keys.
1351
- const keys = isUndefined(tagPropertyKey) || hasOwnProperty.call(originalTarget, tagPropertyKey)
1352
- ? []
1353
- : [tagPropertyKey];
1354
- // small perf optimization using push instead of concat to avoid creating an extra array
1355
- ArrayPush.apply(keys, getOwnPropertyNames(originalTarget));
1356
- ArrayPush.apply(keys, getOwnPropertySymbols(originalTarget));
1357
- return keys;
1429
+ return null;
1358
1430
  }
1359
- isExtensible(shadowTarget) {
1360
- const { originalTarget } = this;
1361
- // optimization to avoid attempting to lock down the shadowTarget multiple times
1362
- if (!isExtensible(shadowTarget)) {
1363
- return false; // was already locked down
1364
- }
1365
- if (!isExtensible(originalTarget)) {
1366
- this.lockShadowTarget(shadowTarget);
1367
- return false;
1368
- }
1369
- return true;
1431
+ hasAttribute(attrName) {
1432
+ const normalizedName = StringToLowerCase.call(toString(attrName));
1433
+ return hasOwnProperty$1.call(__classPrivateFieldGet(this, _LightningElement_attrs, "f"), normalizedName);
1370
1434
  }
1371
- getPrototypeOf(shadowTarget) {
1372
- const { originalTarget } = this;
1373
- return getPrototypeOf(originalTarget);
1435
+ removeAttribute(attrName) {
1436
+ const normalizedName = StringToLowerCase.call(toString(attrName));
1437
+ delete __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName];
1438
+ // Track mutations for removal of non-existing attributes
1439
+ mutationTracker.add(this, normalizedName);
1374
1440
  }
1375
- getOwnPropertyDescriptor(shadowTarget, key) {
1376
- const { originalTarget, membrane: { valueObserved, tagPropertyKey }, } = this;
1377
- // keys looked up via getOwnPropertyDescriptor need to be reactive
1378
- valueObserved(originalTarget, key);
1379
- let desc = getOwnPropertyDescriptor(originalTarget, key);
1380
- if (isUndefined(desc)) {
1381
- if (key !== tagPropertyKey) {
1382
- return undefined;
1383
- }
1384
- // if the key is the membrane tag key, and is not in the original target,
1385
- // we produce a synthetic descriptor and install it on the shadow target
1386
- desc = { value: undefined, writable: false, configurable: false, enumerable: false };
1387
- ObjectDefineProperty(shadowTarget, tagPropertyKey, desc);
1388
- return desc;
1389
- }
1390
- if (desc.configurable === false) {
1391
- // updating the descriptor to non-configurable on the shadow
1392
- this.copyDescriptorIntoShadowTarget(shadowTarget, key);
1393
- }
1394
- // Note: by accessing the descriptor, the key is marked as observed
1395
- // but access to the value, setter or getter (if available) cannot observe
1396
- // mutations, just like regular methods, in which case we just do nothing.
1397
- return this.wrapDescriptor(desc);
1441
+ addEventListener(_type, _listener, _options) {
1442
+ // noop
1398
1443
  }
1399
- }
1400
-
1401
- const getterMap$1 = new WeakMap();
1402
- const setterMap$1 = new WeakMap();
1403
- const reverseGetterMap = new WeakMap();
1404
- const reverseSetterMap = new WeakMap();
1405
- class ReactiveProxyHandler extends BaseProxyHandler {
1406
- wrapValue(value) {
1407
- return this.membrane.getProxy(value);
1444
+ removeEventListener(_type, _listener, _options) {
1445
+ // noop
1408
1446
  }
1409
- wrapGetter(originalGet) {
1410
- const wrappedGetter = getterMap$1.get(originalGet);
1411
- if (!isUndefined(wrappedGetter)) {
1412
- return wrappedGetter;
1413
- }
1414
- const handler = this;
1415
- const get = function () {
1416
- // invoking the original getter with the original target
1417
- return handler.wrapValue(originalGet.call(unwrap(this)));
1418
- };
1419
- getterMap$1.set(originalGet, get);
1420
- reverseGetterMap.set(get, originalGet);
1421
- return get;
1447
+ // ----------------------------------------------------------- //
1448
+ // Props/methods explicitly not available in this environment //
1449
+ // Getters are named "get*" for parity with @lwc/engine-server //
1450
+ // ----------------------------------------------------------- //
1451
+ get children() {
1452
+ throw new TypeError('"getChildren" is not supported in this environment');
1422
1453
  }
1423
- wrapSetter(originalSet) {
1424
- const wrappedSetter = setterMap$1.get(originalSet);
1425
- if (!isUndefined(wrappedSetter)) {
1426
- return wrappedSetter;
1427
- }
1428
- const set = function (v) {
1429
- // invoking the original setter with the original target
1430
- originalSet.call(unwrap(this), unwrap(v));
1431
- };
1432
- setterMap$1.set(originalSet, set);
1433
- reverseSetterMap.set(set, originalSet);
1434
- return set;
1454
+ get childNodes() {
1455
+ throw new TypeError('"getChildNodes" is not supported in this environment');
1435
1456
  }
1436
- unwrapDescriptor(descriptor) {
1437
- if (hasOwnProperty.call(descriptor, 'value')) {
1438
- // dealing with a data descriptor
1439
- descriptor.value = unwrap(descriptor.value);
1440
- }
1441
- else {
1442
- const { set, get } = descriptor;
1443
- if (!isUndefined(get)) {
1444
- descriptor.get = this.unwrapGetter(get);
1445
- }
1446
- if (!isUndefined(set)) {
1447
- descriptor.set = this.unwrapSetter(set);
1448
- }
1449
- }
1450
- return descriptor;
1457
+ get firstChild() {
1458
+ throw new TypeError('"getFirstChild" is not supported in this environment');
1451
1459
  }
1452
- unwrapGetter(redGet) {
1453
- const reverseGetter = reverseGetterMap.get(redGet);
1454
- if (!isUndefined(reverseGetter)) {
1455
- return reverseGetter;
1456
- }
1457
- const handler = this;
1458
- const get = function () {
1459
- // invoking the red getter with the proxy of this
1460
- return unwrap(redGet.call(handler.wrapValue(this)));
1461
- };
1462
- getterMap$1.set(get, redGet);
1463
- reverseGetterMap.set(redGet, get);
1464
- return get;
1460
+ get firstElementChild() {
1461
+ throw new TypeError('"getFirstElementChild" is not supported in this environment');
1465
1462
  }
1466
- unwrapSetter(redSet) {
1467
- const reverseSetter = reverseSetterMap.get(redSet);
1468
- if (!isUndefined(reverseSetter)) {
1469
- return reverseSetter;
1470
- }
1471
- const handler = this;
1472
- const set = function (v) {
1473
- // invoking the red setter with the proxy of this
1474
- redSet.call(handler.wrapValue(this), handler.wrapValue(v));
1475
- };
1476
- setterMap$1.set(set, redSet);
1477
- reverseSetterMap.set(redSet, set);
1478
- return set;
1463
+ get hostElement() {
1464
+ // Intentionally different to match @lwc/engine-*core*
1465
+ throw new TypeError('this.hostElement is not supported in this environment');
1479
1466
  }
1480
- set(shadowTarget, key, value) {
1481
- const { originalTarget, membrane: { valueMutated }, } = this;
1482
- const oldValue = originalTarget[key];
1483
- if (oldValue !== value) {
1484
- originalTarget[key] = value;
1485
- valueMutated(originalTarget, key);
1486
- }
1487
- else if (key === 'length' && isArray(originalTarget)) {
1488
- // fix for issue #236: push will add the new index, and by the time length
1489
- // is updated, the internal length is already equal to the new length value
1490
- // therefore, the oldValue is equal to the value. This is the forking logic
1491
- // to support this use case.
1492
- valueMutated(originalTarget, key);
1493
- }
1494
- return true;
1467
+ get lastChild() {
1468
+ throw new TypeError('"getLastChild" is not supported in this environment');
1495
1469
  }
1496
- deleteProperty(shadowTarget, key) {
1497
- const { originalTarget, membrane: { valueMutated }, } = this;
1498
- delete originalTarget[key];
1499
- valueMutated(originalTarget, key);
1500
- return true;
1470
+ get lastElementChild() {
1471
+ throw new TypeError('"getLastElementChild" is not supported in this environment');
1501
1472
  }
1502
- setPrototypeOf(shadowTarget, prototype) {
1503
- /* istanbul ignore else */
1504
- if (process.env.NODE_ENV !== 'production') {
1505
- throw new Error(`Invalid setPrototypeOf invocation for reactive proxy ${toString(this.originalTarget)}. Prototype of reactive objects cannot be changed.`);
1506
- }
1473
+ get ownerDocument() {
1474
+ // Intentionally not "get*" to match @lwc/engine-server
1475
+ throw new TypeError('"ownerDocument" is not supported in this environment');
1507
1476
  }
1508
- preventExtensions(shadowTarget) {
1509
- if (isExtensible(shadowTarget)) {
1510
- const { originalTarget } = this;
1511
- preventExtensions(originalTarget);
1512
- // if the originalTarget is a proxy itself, it might reject
1513
- // the preventExtension call, in which case we should not attempt to lock down
1514
- // the shadow target.
1515
- // TODO: It should not actually be possible to reach this `if` statement.
1516
- // If a proxy rejects extensions, then calling preventExtensions will throw an error:
1517
- // https://codepen.io/nolanlawson-the-selector/pen/QWMOjbY
1518
- /* istanbul ignore if */
1519
- if (isExtensible(originalTarget)) {
1520
- return false;
1521
- }
1522
- this.lockShadowTarget(shadowTarget);
1523
- }
1524
- return true;
1477
+ get style() {
1478
+ // Intentionally not "get*" to match @lwc/engine-server
1479
+ throw new TypeError('"style" is not supported in this environment');
1525
1480
  }
1526
- defineProperty(shadowTarget, key, descriptor) {
1527
- const { originalTarget, membrane: { valueMutated, tagPropertyKey }, } = this;
1528
- if (key === tagPropertyKey && !hasOwnProperty.call(originalTarget, key)) {
1529
- // To avoid leaking the membrane tag property into the original target, we must
1530
- // be sure that the original target doesn't have yet.
1531
- // NOTE: we do not return false here because Object.freeze and equivalent operations
1532
- // will attempt to set the descriptor to the same value, and expect no to throw. This
1533
- // is an small compromise for the sake of not having to diff the descriptors.
1534
- return true;
1535
- }
1536
- ObjectDefineProperty(originalTarget, key, this.unwrapDescriptor(descriptor));
1537
- // intentionally testing if false since it could be undefined as well
1538
- if (descriptor.configurable === false) {
1539
- this.copyDescriptorIntoShadowTarget(shadowTarget, key);
1540
- }
1541
- valueMutated(originalTarget, key);
1542
- return true;
1481
+ attachInternals() {
1482
+ throw new TypeError('"attachInternals" is not supported in this environment');
1543
1483
  }
1544
- }
1545
-
1546
- const getterMap = new WeakMap();
1547
- const setterMap = new WeakMap();
1548
- class ReadOnlyHandler extends BaseProxyHandler {
1549
- wrapValue(value) {
1550
- return this.membrane.getReadOnlyProxy(value);
1484
+ dispatchEvent(_event) {
1485
+ throw new TypeError('"dispatchEvent" is not supported in this environment');
1551
1486
  }
1552
- wrapGetter(originalGet) {
1553
- const wrappedGetter = getterMap.get(originalGet);
1554
- if (!isUndefined(wrappedGetter)) {
1555
- return wrappedGetter;
1556
- }
1557
- const handler = this;
1558
- const get = function () {
1559
- // invoking the original getter with the original target
1560
- return handler.wrapValue(originalGet.call(unwrap(this)));
1561
- };
1562
- getterMap.set(originalGet, get);
1563
- return get;
1487
+ getBoundingClientRect() {
1488
+ throw new TypeError('"getBoundingClientRect" is not supported in this environment');
1564
1489
  }
1565
- wrapSetter(originalSet) {
1566
- const wrappedSetter = setterMap.get(originalSet);
1567
- if (!isUndefined(wrappedSetter)) {
1568
- return wrappedSetter;
1569
- }
1570
- const handler = this;
1571
- const set = function (v) {
1572
- /* istanbul ignore else */
1573
- if (process.env.NODE_ENV !== 'production') {
1574
- const { originalTarget } = handler;
1575
- throw new Error(`Invalid mutation: Cannot invoke a setter on "${originalTarget}". "${originalTarget}" is read-only.`);
1576
- }
1577
- };
1578
- setterMap.set(originalSet, set);
1579
- return set;
1490
+ getElementsByClassName(_classNames) {
1491
+ throw new TypeError('"getElementsByClassName" is not supported in this environment');
1580
1492
  }
1581
- set(shadowTarget, key, value) {
1582
- /* istanbul ignore else */
1583
- if (process.env.NODE_ENV !== 'production') {
1584
- const { originalTarget } = this;
1585
- const msg = isArray(originalTarget)
1586
- ? `Invalid mutation: Cannot mutate array at index ${key.toString()}. Array is read-only.`
1587
- : `Invalid mutation: Cannot set "${key.toString()}" on "${originalTarget}". "${originalTarget}" is read-only.`;
1588
- throw new Error(msg);
1589
- }
1590
- /* istanbul ignore next */
1591
- return false;
1493
+ getElementsByTagName(_qualifiedName) {
1494
+ throw new TypeError('"getElementsByTagName" is not supported in this environment');
1592
1495
  }
1593
- deleteProperty(shadowTarget, key) {
1594
- /* istanbul ignore else */
1595
- if (process.env.NODE_ENV !== 'production') {
1596
- const { originalTarget } = this;
1597
- throw new Error(`Invalid mutation: Cannot delete "${key.toString()}" on "${originalTarget}". "${originalTarget}" is read-only.`);
1598
- }
1599
- /* istanbul ignore next */
1600
- return false;
1496
+ querySelector(_selectors) {
1497
+ throw new TypeError('"querySelector" is not supported in this environment');
1601
1498
  }
1602
- setPrototypeOf(shadowTarget, prototype) {
1603
- /* istanbul ignore else */
1604
- if (process.env.NODE_ENV !== 'production') {
1605
- const { originalTarget } = this;
1606
- throw new Error(`Invalid prototype mutation: Cannot set prototype on "${originalTarget}". "${originalTarget}" prototype is read-only.`);
1607
- }
1499
+ querySelectorAll(_selectors) {
1500
+ throw new TypeError('"querySelectorAll" is not supported in this environment');
1608
1501
  }
1609
- preventExtensions(shadowTarget) {
1610
- /* istanbul ignore else */
1611
- if (process.env.NODE_ENV !== 'production') {
1612
- const { originalTarget } = this;
1613
- throw new Error(`Invalid mutation: Cannot preventExtensions on ${originalTarget}". "${originalTarget} is read-only.`);
1614
- }
1615
- /* istanbul ignore next */
1616
- return false;
1502
+ getAttributeNS(_namespace, _localName) {
1503
+ throw new Error('Method "getAttributeNS" not implemented.');
1617
1504
  }
1618
- defineProperty(shadowTarget, key, descriptor) {
1619
- /* istanbul ignore else */
1620
- if (process.env.NODE_ENV !== 'production') {
1621
- const { originalTarget } = this;
1622
- throw new Error(`Invalid mutation: Cannot defineProperty "${key.toString()}" on "${originalTarget}". "${originalTarget}" is read-only.`);
1623
- }
1624
- /* istanbul ignore next */
1625
- return false;
1505
+ hasAttributeNS(_namespace, _localName) {
1506
+ throw new Error('Method "hasAttributeNS" not implemented.');
1507
+ }
1508
+ removeAttributeNS(_namespace, _localName) {
1509
+ throw new Error('Method "removeAttributeNS" not implemented.');
1510
+ }
1511
+ setAttributeNS(_namespace, _qualifiedName, _value) {
1512
+ throw new Error('Method "setAttributeNS" not implemented.');
1626
1513
  }
1627
1514
  }
1515
+ defineProperties(LightningElement.prototype, descriptors);
1628
1516
 
1629
- function extract(objectOrArray) {
1630
- if (isArray(objectOrArray)) {
1631
- return objectOrArray.map((item) => {
1632
- const original = unwrap(item);
1633
- if (original !== item) {
1634
- return extract(original);
1635
- }
1636
- return item;
1637
- });
1638
- }
1639
- const obj = ObjectCreate(getPrototypeOf(objectOrArray));
1640
- const names = getOwnPropertyNames(objectOrArray);
1641
- return ArrayConcat.call(names, getOwnPropertySymbols(objectOrArray)).reduce((seed, key) => {
1642
- const item = objectOrArray[key];
1643
- const original = unwrap(item);
1644
- if (original !== item) {
1645
- seed[key] = extract(original);
1517
+ /*
1518
+ * Copyright (c) 2024, salesforce.com, inc.
1519
+ * All rights reserved.
1520
+ * SPDX-License-Identifier: MIT
1521
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1522
+ */
1523
+ const escapeAttrVal = (attrValue) => attrValue.replaceAll('&', '&amp;').replaceAll('"', '&quot;');
1524
+ function renderAttrsPrivate(instance, attrs, hostScopeToken, scopeToken) {
1525
+ // The scopeToken is e.g. `lwc-xyz123` which is the token our parent gives us.
1526
+ // The hostScopeToken is e.g. `lwc-abc456-host` which is the token for our own component.
1527
+ // It's possible to have both, one, the other, or neither.
1528
+ const combinedScopeToken = scopeToken && hostScopeToken
1529
+ ? `${scopeToken} ${hostScopeToken}`
1530
+ : scopeToken || hostScopeToken || '';
1531
+ let result = '';
1532
+ let hasClassAttribute = false;
1533
+ for (const attrName of getOwnPropertyNames$1(attrs)) {
1534
+ let attrValue = attrs[attrName];
1535
+ if (isNull(attrValue) || isUndefined$1(attrValue)) {
1536
+ attrValue = '';
1646
1537
  }
1647
- else {
1648
- seed[key] = item;
1538
+ else if (!isString(attrValue)) {
1539
+ attrValue = String(attrValue);
1649
1540
  }
1650
- return seed;
1651
- }, obj);
1652
- }
1653
- const formatter = {
1654
- header: (plainOrProxy) => {
1655
- const originalTarget = unwrap(plainOrProxy);
1656
- // if originalTarget is falsy or not unwrappable, exit
1657
- if (!originalTarget || originalTarget === plainOrProxy) {
1658
- return null;
1541
+ if (attrName === 'class') {
1542
+ if (attrValue === '') {
1543
+ // If the class attribute is empty, we don't render it.
1544
+ continue;
1545
+ }
1546
+ if (combinedScopeToken) {
1547
+ attrValue += ' ' + combinedScopeToken;
1548
+ hasClassAttribute = true;
1549
+ }
1659
1550
  }
1660
- const obj = extract(plainOrProxy);
1661
- return ['object', { object: obj }];
1662
- },
1663
- hasBody: () => {
1664
- return false;
1665
- },
1666
- body: () => {
1667
- return null;
1668
- },
1669
- };
1670
- // Inspired from paulmillr/es6-shim
1671
- // https://github.com/paulmillr/es6-shim/blob/master/es6-shim.js#L176-L185
1672
- /* istanbul ignore next */
1673
- function getGlobal() {
1674
- // the only reliable means to get the global object is `Function('return this')()`
1675
- // However, this causes CSP violations in Chrome apps.
1676
- if (typeof globalThis !== 'undefined') {
1677
- return globalThis;
1678
- }
1679
- if (typeof self !== 'undefined') {
1680
- return self;
1681
- }
1682
- if (typeof window !== 'undefined') {
1683
- return window;
1684
- }
1685
- if (typeof global !== 'undefined') {
1686
- return global;
1687
- }
1688
- // Gracefully degrade if not able to locate the global object
1689
- return {};
1690
- }
1691
- function init() {
1692
- /* istanbul ignore if */
1693
- if (process.env.NODE_ENV === 'production') {
1694
- // this method should never leak to prod
1695
- throw new ReferenceError();
1696
- }
1697
- const global = getGlobal();
1698
- // Custom Formatter for Dev Tools. To enable this, open Chrome Dev Tools
1699
- // - Go to Settings,
1700
- // - Under console, select "Enable custom formatters"
1701
- // For more information, https://docs.google.com/document/d/1FTascZXT9cxfetuPRT2eXPQKXui4nWFivUnS_335T3U/preview
1702
- const devtoolsFormatters = global.devtoolsFormatters || [];
1703
- ArrayPush.call(devtoolsFormatters, formatter);
1704
- global.devtoolsFormatters = devtoolsFormatters;
1705
- }
1706
-
1707
- /* istanbul ignore else */
1708
- if (process.env.NODE_ENV !== 'production') {
1709
- init();
1710
- }
1711
- function defaultValueIsObservable(value) {
1712
- // intentionally checking for null
1713
- if (value === null) {
1714
- return false;
1551
+ result += attrValue === '' ? ` ${attrName}` : ` ${attrName}="${escapeAttrVal(attrValue)}"`;
1715
1552
  }
1716
- // treat all non-object types, including undefined, as non-observable values
1717
- if (typeof value !== 'object') {
1718
- return false;
1553
+ // If we didn't render any `class` attribute, render one for the scope token(s)
1554
+ if (!hasClassAttribute && combinedScopeToken) {
1555
+ result += ` class="${combinedScopeToken}"`;
1719
1556
  }
1720
- if (isArray(value)) {
1721
- return true;
1557
+ // For the host scope token only, we encode a special attribute for hydration
1558
+ if (hostScopeToken) {
1559
+ result += ` data-lwc-host-scope-token="${hostScopeToken}"`;
1722
1560
  }
1723
- const proto = getPrototypeOf(value);
1724
- return proto === ObjectDotPrototype || proto === null || getPrototypeOf(proto) === null;
1561
+ result += mutationTracker.renderMutatedAttrs(instance);
1562
+ return result;
1725
1563
  }
1726
- const defaultValueObserved = (obj, key) => {
1727
- /* do nothing */
1728
- };
1729
- const defaultValueMutated = (obj, key) => {
1730
- /* do nothing */
1731
- };
1732
- function createShadowTarget(value) {
1733
- return isArray(value) ? [] : {};
1564
+ function* renderAttrs(instance, attrs, hostScopeToken, scopeToken) {
1565
+ yield renderAttrsPrivate(instance, attrs, hostScopeToken, scopeToken);
1734
1566
  }
1735
- class ObservableMembrane {
1736
- constructor(options = {}) {
1737
- this.readOnlyObjectGraph = new WeakMap();
1738
- this.reactiveObjectGraph = new WeakMap();
1739
- const { valueMutated, valueObserved, valueIsObservable, tagPropertyKey } = options;
1740
- this.valueMutated = isFunction(valueMutated) ? valueMutated : defaultValueMutated;
1741
- this.valueObserved = isFunction(valueObserved) ? valueObserved : defaultValueObserved;
1742
- this.valueIsObservable = isFunction(valueIsObservable)
1743
- ? valueIsObservable
1744
- : defaultValueIsObservable;
1745
- this.tagPropertyKey = tagPropertyKey;
1567
+ function renderAttrsNoYield(emit, instance, attrs, hostScopeToken, scopeToken) {
1568
+ emit(renderAttrsPrivate(instance, attrs, hostScopeToken, scopeToken));
1569
+ }
1570
+ function* fallbackTmpl(_props, _attrs, _shadowSlottedContent, _lightSlottedContent, Cmp, _instance) {
1571
+ if (Cmp.renderMode !== 'light') {
1572
+ yield '<template shadowrootmode="open"></template>';
1746
1573
  }
1747
- getProxy(value) {
1748
- const unwrappedValue = unwrap(value);
1749
- if (this.valueIsObservable(unwrappedValue)) {
1750
- // When trying to extract the writable version of a readonly we return the readonly.
1751
- if (this.readOnlyObjectGraph.get(unwrappedValue) === value) {
1752
- return value;
1753
- }
1754
- return this.getReactiveHandler(unwrappedValue);
1755
- }
1756
- return unwrappedValue;
1574
+ }
1575
+ function fallbackTmplNoYield(emit, _props, _attrs, _shadowSlottedContent, _lightSlottedContent, Cmp, _instance) {
1576
+ if (Cmp.renderMode !== 'light') {
1577
+ emit('<template shadowrootmode="open"></template>');
1757
1578
  }
1758
- getReadOnlyProxy(value) {
1759
- value = unwrap(value);
1760
- if (this.valueIsObservable(value)) {
1761
- return this.getReadOnlyHandler(value);
1579
+ }
1580
+ async function serverSideRenderComponent(tagName, Component, props = {}, mode = DEFAULT_SSR_MODE) {
1581
+ if (typeof tagName !== 'string') {
1582
+ throw new Error(`tagName must be a string, found: ${tagName}`);
1583
+ }
1584
+ const generateMarkup = Component[SYMBOL__GENERATE_MARKUP];
1585
+ let markup = '';
1586
+ const emit = (segment) => {
1587
+ markup += segment;
1588
+ };
1589
+ if (mode === 'asyncYield') {
1590
+ for await (const segment of generateMarkup(tagName, props, null, null, null, null, null, null)) {
1591
+ markup += segment;
1762
1592
  }
1763
- return value;
1764
1593
  }
1765
- unwrapProxy(p) {
1766
- return unwrap(p);
1594
+ else if (mode === 'async') {
1595
+ await generateMarkup(emit, tagName, props, null, null, null, null, null, null);
1767
1596
  }
1768
- getReactiveHandler(value) {
1769
- let proxy = this.reactiveObjectGraph.get(value);
1770
- if (isUndefined(proxy)) {
1771
- // caching the proxy after the first time it is accessed
1772
- const handler = new ReactiveProxyHandler(this, value);
1773
- proxy = new Proxy(createShadowTarget(value), handler);
1774
- registerProxy(proxy, value);
1775
- this.reactiveObjectGraph.set(value, proxy);
1776
- }
1777
- return proxy;
1597
+ else if (mode === 'sync') {
1598
+ generateMarkup(emit, tagName, props, null, null, null, null, null, null);
1778
1599
  }
1779
- getReadOnlyHandler(value) {
1780
- let proxy = this.readOnlyObjectGraph.get(value);
1781
- if (isUndefined(proxy)) {
1782
- // caching the proxy after the first time it is accessed
1783
- const handler = new ReadOnlyHandler(this, value);
1784
- proxy = new Proxy(createShadowTarget(value), handler);
1785
- registerProxy(proxy, value);
1786
- this.readOnlyObjectGraph.set(value, proxy);
1787
- }
1788
- return proxy;
1600
+ else {
1601
+ throw new Error(`Invalid mode: ${mode}`);
1789
1602
  }
1603
+ return markup;
1790
1604
  }
1791
- /** version: 2.0.0 */
1792
1605
 
1793
1606
  /*
1794
1607
  * Copyright (c) 2024, Salesforce, Inc.
@@ -1796,12 +1609,143 @@ class ObservableMembrane {
1796
1609
  * SPDX-License-Identifier: MIT
1797
1610
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1798
1611
  */
1799
- const reactiveMembrane = new ObservableMembrane();
1800
- // Modeled after `getReadOnlyProxy` in `membrane.ts` in `engine-core`
1801
- // Return a proxy over the given object so that access is immutable
1802
- // https://github.com/salesforce/lwc/blob/e9db491/packages/%40lwc/engine-core/src/framework/membrane.ts#L29-L33
1803
- function getReadOnlyProxy(value) {
1804
- return reactiveMembrane.getReadOnlyProxy(value);
1612
+ /**
1613
+ * Given an object, render it for use as a text content node.
1614
+ * @param value
1615
+ */
1616
+ function massageTextContent(value) {
1617
+ // Using non strict equality to align with original implementation (ex. undefined == null)
1618
+ // See: https://github.com/salesforce/lwc/blob/348130f/packages/%40lwc/engine-core/src/framework/api.ts#L548
1619
+ return value == null ? '' : String(value);
1620
+ }
1621
+
1622
+ /*
1623
+ * Copyright (c) 2024, Salesforce, Inc.
1624
+ * All rights reserved.
1625
+ * SPDX-License-Identifier: MIT
1626
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1627
+ */
1628
+ /**
1629
+ * Per the HTML spec on restrictions for "raw text elements" like `<style>`:
1630
+ *
1631
+ * > The text in raw text and escapable raw text elements must not contain any occurrences of the string
1632
+ * > "</" (U+003C LESS-THAN SIGN, U+002F SOLIDUS) followed by characters that case-insensitively match the tag name of
1633
+ * > the element followed by one of:
1634
+ * > - U+0009 CHARACTER TABULATION (tab)
1635
+ * > - U+000A LINE FEED (LF)
1636
+ * > - U+000C FORM FEED (FF)
1637
+ * > - U+000D CARRIAGE RETURN (CR)
1638
+ * > - U+0020 SPACE
1639
+ * > - U+003E GREATER-THAN SIGN (>), or
1640
+ * > - U+002F SOLIDUS (/)
1641
+ * @see https://html.spec.whatwg.org/multipage/syntax.html#cdata-rcdata-restrictions
1642
+ */
1643
+ const INVALID_STYLE_CONTENT = /<\/style[\t\n\f\r >/]/i;
1644
+ /**
1645
+ * The text content inside `<style>` is a special case. It is _only_ rendered by the LWC engine itself; `<style>` tags
1646
+ * are disallowed inside of HTML templates.
1647
+ *
1648
+ * The `<style>` tag is unusual in how it's defined in HTML. Like `<script>`, it is considered a "raw text element,"
1649
+ * which means that it is parsed as raw text, but certain character sequences are disallowed, namely to avoid XSS
1650
+ * attacks like `</style><script>alert("pwned")</script>`.
1651
+ *
1652
+ * This also means that we cannot use "normal" HTML escaping inside `<style>` tags, e.g. we cannot use `&lt;`,
1653
+ * `&gt;`, etc., because these are treated as-is by the HTML parser.
1654
+ *
1655
+ *
1656
+ * @param contents CSS source to validate
1657
+ * @throws Throws if the contents provided are not valid.
1658
+ * @see https://html.spec.whatwg.org/multipage/syntax.html#raw-text-elements
1659
+ * @see https://github.com/salesforce/lwc/issues/3439
1660
+ * @example
1661
+ * validateStyleTextContents('div { color: red }') // Ok
1662
+ * validateStyleTextContents('</style><script>alert("pwned")</script>') // Throws
1663
+ */
1664
+ function validateStyleTextContents(contents) {
1665
+ if (INVALID_STYLE_CONTENT.test(contents)) {
1666
+ throw new Error('CSS contains unsafe characters and cannot be serialized inside a style element');
1667
+ }
1668
+ }
1669
+
1670
+ /*
1671
+ * Copyright (c) 2024, Salesforce, Inc.
1672
+ * All rights reserved.
1673
+ * SPDX-License-Identifier: MIT
1674
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1675
+ */
1676
+ // Traverse in the same order as `flattenStylesheets` but without creating unnecessary additional arrays
1677
+ function traverseStylesheets(stylesheets, callback) {
1678
+ if (isArray$1(stylesheets)) {
1679
+ for (let i = 0; i < stylesheets.length; i++) {
1680
+ traverseStylesheets(stylesheets[i], callback);
1681
+ }
1682
+ }
1683
+ else if (stylesheets) {
1684
+ callback(stylesheets);
1685
+ }
1686
+ }
1687
+ function hasScopedStaticStylesheets(Component) {
1688
+ let scoped = false;
1689
+ traverseStylesheets(Component.stylesheets, (stylesheet) => {
1690
+ scoped ||= !!stylesheet.$scoped$;
1691
+ });
1692
+ return scoped;
1693
+ }
1694
+ function renderStylesheets(defaultStylesheets, defaultScopedStylesheets, staticStylesheets, scopeToken, Component, hasScopedTemplateStyles) {
1695
+ const hasAnyScopedStyles = hasScopedTemplateStyles || hasScopedStaticStylesheets(Component);
1696
+ const { renderMode } = Component;
1697
+ let result = '';
1698
+ const renderStylesheet = (stylesheet) => {
1699
+ const { $scoped$: scoped } = stylesheet;
1700
+ const token = scoped ? scopeToken : undefined;
1701
+ const useActualHostSelector = !scoped || renderMode !== 'light';
1702
+ const useNativeDirPseudoclass = true;
1703
+ const styleContents = stylesheet(token, useActualHostSelector, useNativeDirPseudoclass);
1704
+ validateStyleTextContents(styleContents);
1705
+ // TODO [#2869]: `<style>`s should not have scope token classes
1706
+ result += `<style${hasAnyScopedStyles ? ` class="${scopeToken}"` : ''} type="text/css">${styleContents}</style>`;
1707
+ };
1708
+ traverseStylesheets(defaultStylesheets, renderStylesheet);
1709
+ traverseStylesheets(defaultScopedStylesheets, renderStylesheet);
1710
+ traverseStylesheets(staticStylesheets, renderStylesheet);
1711
+ return result;
1712
+ }
1713
+
1714
+ /*
1715
+ * Copyright (c) 2024, salesforce.com, inc.
1716
+ * All rights reserved.
1717
+ * SPDX-License-Identifier: MIT
1718
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1719
+ */
1720
+ /**
1721
+ * Converts an iterable into one that emits the object used by the [`iterator` directive](
1722
+ * https://lwc.dev/guide/html_templates#iterator).
1723
+ */
1724
+ function* toIteratorDirective(iterable) {
1725
+ if (iterable === undefined || iterable === null)
1726
+ return;
1727
+ if (!iterable[Symbol.iterator]) {
1728
+ throw new Error(
1729
+ // Mimic error message from "[i]terable node" in engine-core's api.ts
1730
+ `Invalid template iteration for value \`${iterable}\`. It must be an array-like object.`);
1731
+ }
1732
+ const iterator = iterable[Symbol.iterator]();
1733
+ let next = iterator.next();
1734
+ let index = 0;
1735
+ let { value, done: last = false } = next;
1736
+ while (last === false) {
1737
+ // using a look-back approach because we need to know if the element is the last
1738
+ next = iterator.next();
1739
+ last = next.done ?? false;
1740
+ yield {
1741
+ value,
1742
+ index,
1743
+ first: index === 0,
1744
+ last,
1745
+ };
1746
+ index += 1;
1747
+ value = next.value;
1748
+ }
1805
1749
  }
1806
1750
 
1807
1751
  /*
@@ -1881,7 +1825,9 @@ exports.hasScopedStaticStylesheets = hasScopedStaticStylesheets;
1881
1825
  exports.hot = hot;
1882
1826
  exports.htmlEscape = htmlEscape;
1883
1827
  exports.isComponentConstructor = isComponentConstructor;
1828
+ exports.massageTextContent = massageTextContent;
1884
1829
  exports.mutationTracker = mutationTracker;
1830
+ exports.normalizeClass = normalizeClass;
1885
1831
  exports.parseFragment = parseFragment;
1886
1832
  exports.parseSVGFragment = parseSVGFragment;
1887
1833
  exports.readonly = readonly;
@@ -1906,5 +1852,5 @@ exports.track = track;
1906
1852
  exports.unwrap = unwrap$1;
1907
1853
  exports.validateStyleTextContents = validateStyleTextContents;
1908
1854
  exports.wire = wire;
1909
- /** version: 8.11.0 */
1855
+ /** version: 8.12.1 */
1910
1856
  //# sourceMappingURL=index.cjs.js.map