@lwc/synthetic-shadow 6.3.3 → 6.4.0

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.js CHANGED
@@ -208,7 +208,7 @@ const KEY__LEGACY_SHADOW_TOKEN_PRIVATE = '$$LegacyShadowTokenKey$$';
208
208
  const KEY__SYNTHETIC_MODE = '$$lwc-synthetic-mode';
209
209
  const KEY__NATIVE_GET_ELEMENT_BY_ID = '$nativeGetElementById$';
210
210
  const KEY__NATIVE_QUERY_SELECTOR_ALL = '$nativeQuerySelectorAll$';
211
- /** version: 6.3.3 */
211
+ /** version: 6.4.0 */
212
212
 
213
213
  /**
214
214
  * Copyright (c) 2024 Salesforce, Inc.
@@ -216,7 +216,7 @@ const KEY__NATIVE_QUERY_SELECTOR_ALL = '$nativeQuerySelectorAll$';
216
216
  if (!globalThis.lwcRuntimeFlags) {
217
217
  Object.defineProperty(globalThis, 'lwcRuntimeFlags', { value: create(null) });
218
218
  }
219
- /** version: 6.3.3 */
219
+ /** version: 6.4.0 */
220
220
 
221
221
  /*
222
222
  * Copyright (c) 2018, salesforce.com, inc.
@@ -239,6 +239,7 @@ const ownerDocumentGetter = getOwnPropertyDescriptor(nodePrototype, 'ownerDocume
239
239
  const parentElementGetter = getOwnPropertyDescriptor(nodePrototype, 'parentElement').get;
240
240
  const textContextSetter = getOwnPropertyDescriptor(nodePrototype, 'textContent').set;
241
241
  const childNodesGetter = getOwnPropertyDescriptor(nodePrototype, 'childNodes').get;
242
+ const nextSiblingGetter = getOwnPropertyDescriptor(nodePrototype, 'nextSibling').get;
242
243
  const isConnected = hasOwnProperty.call(nodePrototype, 'isConnected')
243
244
  ? getOwnPropertyDescriptor(nodePrototype, 'isConnected').get
244
245
  : function () {
@@ -425,6 +426,8 @@ function getNodeNearestOwnerKey(node) {
425
426
  return hostKey;
426
427
  }
427
428
  host = parentNodeGetter.call(host);
429
+ // Elements slotted from top level light DOM into synthetic shadow
430
+ // reach the slot tag from the shadow element first
428
431
  if (!isNull(host) && isSyntheticSlotElement(host)) {
429
432
  return undefined;
430
433
  }
@@ -1225,7 +1228,11 @@ function cloneNodePatched(deep) {
1225
1228
  function childNodesGetterPatched() {
1226
1229
  if (isSyntheticShadowHost(this)) {
1227
1230
  const owner = getNodeOwner(this);
1228
- const childNodes = isNull(owner) ? [] : getAllMatches(owner, getFilteredChildNodes(this));
1231
+ const filteredChildNodes = getFilteredChildNodes(this);
1232
+ // No need to filter by owner for non-shadowed nodes
1233
+ const childNodes = isNull(owner)
1234
+ ? filteredChildNodes
1235
+ : getAllMatches(owner, filteredChildNodes);
1229
1236
  return createStaticNodeList(childNodes);
1230
1237
  }
1231
1238
  // nothing to do here since this does not have a synthetic shadow attached to it
@@ -3354,7 +3361,11 @@ function shadowRootGetterPatched() {
3354
3361
  }
3355
3362
  function childrenGetterPatched() {
3356
3363
  const owner = getNodeOwner(this);
3357
- const childNodes = isNull(owner) ? [] : getAllMatches(owner, getFilteredChildNodes(this));
3364
+ const filteredChildNodes = getFilteredChildNodes(this);
3365
+ // No need to filter by owner for non-shadowed nodes
3366
+ const childNodes = isNull(owner)
3367
+ ? filteredChildNodes
3368
+ : getAllMatches(owner, filteredChildNodes);
3358
3369
  return createStaticHTMLCollection(ArrayFilter.call(childNodes, (node) => node instanceof Element));
3359
3370
  }
3360
3371
  function childElementCountGetterPatched() {
@@ -4190,9 +4201,13 @@ defineProperty(Element.prototype, KEY__SHADOW_TOKEN, {
4190
4201
  });
4191
4202
  function recursivelySetShadowResolver(node, fn) {
4192
4203
  node[KEY__SHADOW_RESOLVER] = fn;
4193
- const childNodes = childNodesGetter.call(node);
4194
- for (let i = 0, n = childNodes.length; i < n; i++) {
4195
- recursivelySetShadowResolver(childNodes[i], fn);
4204
+ // Recurse using firstChild/nextSibling because browsers use a linked list under the hood to
4205
+ // represent the DOM, so childNodes/children would cause an unnecessary array allocation.
4206
+ // https://viethung.space/blog/2020/09/01/Browser-from-Scratch-DOM-API/#Choosing-DOM-tree-data-structure
4207
+ let child = firstChildGetter.call(node);
4208
+ while (!isNull(child)) {
4209
+ recursivelySetShadowResolver(child, fn);
4210
+ child = nextSiblingGetter.call(child);
4196
4211
  }
4197
4212
  }
4198
4213
  defineProperty(Element.prototype, KEY__SHADOW_STATIC, {
@@ -4361,6 +4376,6 @@ defineProperty(Element.prototype, '$domManual$', {
4361
4376
  },
4362
4377
  configurable: true,
4363
4378
  });
4364
- /** version: 6.3.3 */
4379
+ /** version: 6.4.0 */
4365
4380
  }
4366
4381
  //# sourceMappingURL=index.js.map