@lwc/ssr-runtime 8.5.0 → 8.7.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.cjs.js CHANGED
@@ -11,110 +11,217 @@ Object.defineProperty(exports, '__esModule', { value: true });
11
11
  * SPDX-License-Identifier: MIT
12
12
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
13
13
  */
14
- const MULTI_SPACE = /\s+/g;
15
- class ClassList {
16
- constructor(el) {
17
- this.el = el;
18
- }
19
- add(...newClassNames) {
20
- const className = this.el.className;
21
- const set = new Set(className.split(MULTI_SPACE).filter(Boolean));
22
- for (const newClassName of newClassNames) {
23
- set.add(newClassName);
24
- }
25
- this.el.className = Array.from(set).join(' ');
26
- }
27
- contains(className) {
28
- const currentClassNameStr = this.el.className;
29
- return currentClassNameStr.split(MULTI_SPACE).includes(className);
30
- }
31
- remove(...classNamesToRemove) {
32
- const className = this.el.className;
33
- const set = new Set(className.split(MULTI_SPACE).filter(Boolean));
34
- for (const newClassName of classNamesToRemove) {
35
- set.delete(newClassName);
36
- }
37
- this.el.className = Array.from(set).join(' ');
38
- }
39
- replace(oldClassName, newClassName) {
40
- let classWasReplaced = false;
41
- const className = this.el.className;
42
- const listOfClasses = className.split(MULTI_SPACE).filter(Boolean);
43
- listOfClasses.forEach((value, idx) => {
44
- if (value === oldClassName) {
45
- classWasReplaced = true;
46
- listOfClasses[idx] = newClassName;
47
- }
48
- });
49
- this.el.className = listOfClasses.join(' ');
50
- return classWasReplaced;
51
- }
52
- toggle(classNameToToggle, force) {
53
- const classNameStr = this.el.className;
54
- const set = new Set(classNameStr.split(MULTI_SPACE).filter(Boolean));
55
- if (!set.has(classNameToToggle) && force !== false) {
56
- set.add(classNameToToggle);
57
- }
58
- else if (set.has(classNameToToggle) && force !== true) {
59
- set.delete(classNameToToggle);
60
- }
61
- this.el.className = Array.from(set).join(' ');
62
- return set.has(classNameToToggle);
63
- }
64
- get value() {
65
- return this.el.className;
66
- }
67
- toString() {
68
- return this.el.className;
69
- }
70
- item(_index) {
71
- throw new Error('Method "item" not implemented.');
72
- }
73
- supports(_token) {
74
- throw new Error('Method "supports" not implemented.');
75
- }
76
- forEach(_callbackfn, _thisArg) {
77
- throw new Error('Method "forEach" not implemented.');
78
- }
79
- get length() {
80
- throw new Error('Property "length" not implemented.');
81
- }
14
+ // Stubs for all the un-implemented exports from @lwc/engine-server
15
+ function api(..._) {
16
+ throw new Error('@api cannot be used in SSR context.');
82
17
  }
83
-
84
- /******************************************************************************
85
- Copyright (c) Microsoft Corporation.
86
-
87
- Permission to use, copy, modify, and/or distribute this software for any
88
- purpose with or without fee is hereby granted.
89
-
90
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
91
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
92
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
93
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
94
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
95
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
96
- PERFORMANCE OF THIS SOFTWARE.
97
- ***************************************************************************** */
98
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
99
-
100
-
101
- function __classPrivateFieldGet(receiver, state, kind, f) {
102
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
103
- 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");
104
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
105
- }
106
-
107
- function __classPrivateFieldSet(receiver, state, value, kind, f) {
108
- if (kind === "m") throw new TypeError("Private method is not writable");
109
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
110
- 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");
111
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
112
- }
113
-
114
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
115
- var e = new Error(message);
116
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
18
+ function createContextProvider(..._) {
19
+ throw new Error('createContextProvider cannot be used in SSR context.');
20
+ }
21
+ function createElement(..._) {
22
+ throw new Error('createElement cannot be used in SSR context.');
23
+ }
24
+ function freezeTemplate(..._) {
25
+ throw new Error('freezeTemplate cannot be used in SSR context.');
26
+ }
27
+ function getComponentDef(..._) {
28
+ throw new Error('getComponentDef cannot be used in SSR context.');
29
+ }
30
+ function isComponentConstructor(..._) {
31
+ throw new Error('isComponentConstructor cannot be used in SSR context.');
32
+ }
33
+ function parseFragment(..._) {
34
+ throw new Error('parseFragment cannot be used in SSR context.');
35
+ }
36
+ function parseSVGFragment(..._) {
37
+ throw new Error('parseSVGFragment cannot be used in SSR context.');
38
+ }
39
+ function readonly(..._) {
40
+ throw new Error('readonly cannot be used in SSR context.');
41
+ }
42
+ function registerComponent(..._) {
43
+ throw new Error('registerComponent cannot be used in SSR context.');
44
+ }
45
+ function registerDecorators(..._) {
46
+ throw new Error('registerDecorators cannot be used in SSR context.');
47
+ }
48
+ function registerTemplate(..._) {
49
+ throw new Error('registerTemplate cannot be used in SSR context.');
50
+ }
51
+ function sanitizeAttribute(..._) {
52
+ throw new Error('sanitizeAttribute cannot be used in SSR context.');
53
+ }
54
+ function setFeatureFlag(..._) {
55
+ throw new Error('setFeatureFlag cannot be used in SSR context.');
56
+ }
57
+ function setFeatureFlagForTest(..._) {
58
+ throw new Error('setFeatureFlagForTest cannot be used in SSR context.');
59
+ }
60
+ function swapComponent(..._) {
61
+ throw new Error('swapComponent cannot be used in SSR context.');
62
+ }
63
+ function swapStyle(..._) {
64
+ throw new Error('swapStyle cannot be used in SSR context.');
65
+ }
66
+ function swapTemplate(..._) {
67
+ throw new Error('swapTemplate cannot be used in SSR context.');
68
+ }
69
+ function track(..._) {
70
+ throw new Error('@track cannot be used in SSR context.');
71
+ }
72
+ function unwrap(..._) {
73
+ throw new Error('unwrap cannot be used in SSR context.');
74
+ }
75
+ function wire(..._) {
76
+ throw new Error('@wire cannot be used in SSR context.');
77
+ }
78
+ const renderer = {
79
+ isSyntheticShadowDefined: false,
80
+ insert(..._) {
81
+ throw new Error('renderer.insert cannot be used in SSR context.');
82
+ },
83
+ remove(..._) {
84
+ throw new Error('renderer.remove cannot be used in SSR context.');
85
+ },
86
+ cloneNode(..._) {
87
+ throw new Error('renderer.cloneNode cannot be used in SSR context.');
88
+ },
89
+ createFragment(..._) {
90
+ throw new Error('renderer.createFragment cannot be used in SSR context.');
91
+ },
92
+ createElement(..._) {
93
+ throw new Error('renderer.createElement cannot be used in SSR context.');
94
+ },
95
+ createText(..._) {
96
+ throw new Error('renderer.createText cannot be used in SSR context.');
97
+ },
98
+ createComment(..._) {
99
+ throw new Error('renderer.createComment cannot be used in SSR context.');
100
+ },
101
+ createCustomElement(..._) {
102
+ throw new Error('renderer.createCustomElement cannot be used in SSR context.');
103
+ },
104
+ nextSibling(..._) {
105
+ throw new Error('renderer.nextSibling cannot be used in SSR context.');
106
+ },
107
+ previousSibling(..._) {
108
+ throw new Error('renderer.previousSibling cannot be used in SSR context.');
109
+ },
110
+ attachShadow(..._) {
111
+ throw new Error('renderer.attachShadow cannot be used in SSR context.');
112
+ },
113
+ getProperty(..._) {
114
+ throw new Error('renderer.getProperty cannot be used in SSR context.');
115
+ },
116
+ setProperty(..._) {
117
+ throw new Error('renderer.setProperty cannot be used in SSR context.');
118
+ },
119
+ setText(..._) {
120
+ throw new Error('renderer.setText cannot be used in SSR context.');
121
+ },
122
+ getAttribute(..._) {
123
+ throw new Error('renderer.getAttribute cannot be used in SSR context.');
124
+ },
125
+ setAttribute(..._) {
126
+ throw new Error('renderer.setAttribute cannot be used in SSR context.');
127
+ },
128
+ removeAttribute(..._) {
129
+ throw new Error('renderer.removeAttribute cannot be used in SSR context.');
130
+ },
131
+ addEventListener(..._) {
132
+ throw new Error('renderer.addEventListener cannot be used in SSR context.');
133
+ },
134
+ removeEventListener(..._) {
135
+ throw new Error('renderer.removeEventListener cannot be used in SSR context.');
136
+ },
137
+ dispatchEvent(..._) {
138
+ throw new Error('renderer.dispatchEvent cannot be used in SSR context.');
139
+ },
140
+ getClassList(..._) {
141
+ throw new Error('renderer.getClassList cannot be used in SSR context.');
142
+ },
143
+ setCSSStyleProperty(..._) {
144
+ throw new Error('renderer.setCSSStyleProperty cannot be used in SSR context.');
145
+ },
146
+ getBoundingClientRect(..._) {
147
+ throw new Error('renderer.getBoundingClientRect cannot be used in SSR context.');
148
+ },
149
+ querySelector(..._) {
150
+ throw new Error('renderer.querySelector cannot be used in SSR context.');
151
+ },
152
+ querySelectorAll(..._) {
153
+ throw new Error('renderer.querySelectorAll cannot be used in SSR context.');
154
+ },
155
+ getElementsByTagName(..._) {
156
+ throw new Error('renderer.getElementsByTagName cannot be used in SSR context.');
157
+ },
158
+ getElementsByClassName(..._) {
159
+ throw new Error('renderer.getElementsByClassName cannot be used in SSR context.');
160
+ },
161
+ getChildren(..._) {
162
+ throw new Error('renderer.getChildren cannot be used in SSR context.');
163
+ },
164
+ getChildNodes(..._) {
165
+ throw new Error('renderer.getChildNodes cannot be used in SSR context.');
166
+ },
167
+ getFirstChild(..._) {
168
+ throw new Error('renderer.getFirstChild cannot be used in SSR context.');
169
+ },
170
+ getFirstElementChild(..._) {
171
+ throw new Error('renderer.getFirstElementChild cannot be used in SSR context.');
172
+ },
173
+ getLastChild(..._) {
174
+ throw new Error('renderer.getLastChild cannot be used in SSR context.');
175
+ },
176
+ getLastElementChild(..._) {
177
+ throw new Error('renderer.getLastElementChild cannot be used in SSR context.');
178
+ },
179
+ getTagName(..._) {
180
+ throw new Error('renderer.getTagName cannot be used in SSR context.');
181
+ },
182
+ getStyle(..._) {
183
+ throw new Error('renderer.getStyle cannot be used in SSR context.');
184
+ },
185
+ isConnected(..._) {
186
+ throw new Error('renderer.isConnected cannot be used in SSR context.');
187
+ },
188
+ insertStylesheet(..._) {
189
+ throw new Error('renderer.insertStylesheet cannot be used in SSR context.');
190
+ },
191
+ assertInstanceOfHTMLElement(..._) {
192
+ throw new Error('renderer.assertInstanceOfHTMLElement cannot be used in SSR context.');
193
+ },
194
+ ownerDocument(..._) {
195
+ throw new Error('renderer.ownerDocument cannot be used in SSR context.');
196
+ },
197
+ registerContextConsumer(..._) {
198
+ throw new Error('renderer.registerContextConsumer cannot be used in SSR context.');
199
+ },
200
+ attachInternals(..._) {
201
+ throw new Error('renderer.attachInternals cannot be used in SSR context.');
202
+ },
203
+ defineCustomElement(..._) {
204
+ throw new Error('renderer.defineCustomElement cannot be used in SSR context.');
205
+ },
206
+ getParentNode(..._) {
207
+ throw new Error('renderer.getParentNode cannot be used in SSR context.');
208
+ },
209
+ startTrackingMutations(..._) {
210
+ throw new Error('renderer.startTrackingMutations cannot be used in SSR context.');
211
+ },
212
+ stopTrackingMutations(..._) {
213
+ throw new Error('renderer.stopTrackingMutations cannot be used in SSR context.');
214
+ },
117
215
  };
216
+ /**
217
+ * The hot API is used to orchestrate hot swapping in client rendered components.
218
+ * It doesn't do anything on the server side, however, you may import it.
219
+ *
220
+ * The whole point of defining this and exporting it is so that you can import it in isomorphic code without
221
+ * an error being thrown by the import itself.
222
+ */
223
+ // A real stub, not a "not implemented" one! 😯
224
+ const hot = undefined;
118
225
 
119
226
  /**
120
227
  * Copyright (c) 2024 Salesforce, Inc.
@@ -130,6 +237,16 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
130
237
  * @param value
131
238
  * @param msg
132
239
  */
240
+ /**
241
+ *
242
+ * @param value
243
+ * @param msg
244
+ */
245
+ function isFalse$1(value, msg) {
246
+ if (value) {
247
+ throw new Error(`Assert Violation: ${msg}`);
248
+ }
249
+ }
133
250
 
134
251
  /*
135
252
  * Copyright (c) 2024, Salesforce, Inc.
@@ -182,8 +299,18 @@ from: ArrayFrom, } = Array;
182
299
  // statement, rather than this declaration.
183
300
  const { concat: ArrayConcat, copyWithin: ArrayCopyWithin, every: ArrayEvery, fill: ArrayFill, filter: ArrayFilter, find: ArrayFind, findIndex: ArrayFindIndex, includes: ArrayIncludes, indexOf: ArrayIndexOf, join: ArrayJoin, map: ArrayMap, pop: ArrayPop, push: ArrayPush, reduce: ArrayReduce, reverse: ArrayReverse, shift: ArrayShift, slice: ArraySlice, some: ArraySome, sort: ArraySort, splice: ArraySplice, unshift: ArrayUnshift, forEach, // Weird anomaly!
184
301
  } = Array.prototype;
302
+ /** Detached {@linkcode String.fromCharCode}; see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode MDN Reference}. */
303
+ const { fromCharCode: StringFromCharCode } = String;
185
304
  // No JSDocs here - see comment for Array.prototype
186
305
  const { charAt: StringCharAt, charCodeAt: StringCharCodeAt, replace: StringReplace, split: StringSplit, slice: StringSlice, toLowerCase: StringToLowerCase, trim: StringTrim, } = String.prototype;
306
+ /**
307
+ * Determines whether the argument is `undefined`.
308
+ * @param obj Value to test
309
+ * @returns `true` if the value is `undefined`.
310
+ */
311
+ function isUndefined(obj) {
312
+ return obj === undefined;
313
+ }
187
314
  /**
188
315
  * Determines whether the argument is `null`.
189
316
  * @param obj Value to test
@@ -192,6 +319,14 @@ const { charAt: StringCharAt, charCodeAt: StringCharCodeAt, replace: StringRepla
192
319
  function isNull(obj) {
193
320
  return obj === null;
194
321
  }
322
+ /**
323
+ * Determines whether the argument is an object or null.
324
+ * @param obj Value to test
325
+ * @returns `true` if the value is an object or null.
326
+ */
327
+ function isObject(obj) {
328
+ return typeof obj === 'object';
329
+ }
195
330
  const OtS = {}.toString;
196
331
  /**
197
332
  * Converts the argument to a string, safely accounting for objects with "null" prototype.
@@ -306,442 +441,325 @@ const { AriaAttrNameToPropNameMap, AriaPropNameToAttrNameMap } = /*@__PURE__*/ (
306
441
  // Synthetic creation of all AOM property descriptors for Custom Elements
307
442
  forEach.call(AriaPropertyNames, (propName) => {
308
443
  const attrName = StringToLowerCase.call(StringReplace.call(propName, /^aria/, () => 'aria-'));
444
+ // These type assertions are because the map types are a 1:1 mapping of ariaX to aria-x.
445
+ // TypeScript knows we have one of ariaX | ariaY and one of aria-x | aria-y, and tries to
446
+ // prevent us from doing ariaX: aria-y, but we that it's safe.
309
447
  AriaAttrNameToPropNameMap[attrName] = propName;
310
448
  AriaPropNameToAttrNameMap[propName] = attrName;
311
449
  });
312
450
  return { AriaAttrNameToPropNameMap, AriaPropNameToAttrNameMap };
313
451
  })();
314
-
315
- /*
316
- * Copyright (c) 2020, salesforce.com, inc.
317
- * All rights reserved.
318
- * SPDX-License-Identifier: MIT
319
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
320
- */
321
- const ESCAPED_CHARS = {
322
- '"': '"',
323
- "'": ''',
324
- '<': '&lt;',
325
- '>': '&gt;',
326
- '&': '&amp;',
327
- };
328
452
  /**
329
453
  *
330
- * @param str
331
- * @param attrMode
332
- */
333
- function htmlEscape(str, attrMode = false) {
334
- const searchValue = attrMode ? /["&]/g : /["'<>&]/g;
335
- return str.replace(searchValue, (char) => ESCAPED_CHARS[char]);
336
- }
337
- function flattenStylesheets(stylesheets) {
338
- const list = [];
339
- for (const stylesheet of stylesheets) {
340
- if (!isArray(stylesheet)) {
341
- list.push(stylesheet);
342
- }
343
- else {
344
- list.push(...flattenStylesheets(stylesheet));
345
- }
346
- }
347
- return list;
348
- }
349
- /** version: 8.5.0 */
350
-
351
- /*
352
- * Copyright (c) 2024, Salesforce, Inc.
353
- * All rights reserved.
354
- * SPDX-License-Identifier: MIT
355
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
454
+ * @param attrName
356
455
  */
357
- var _MutationTracker_enabledSet, _MutationTracker_mutationMap;
358
- class MutationTracker {
359
- constructor() {
360
- _MutationTracker_enabledSet.set(this, new WeakSet());
361
- _MutationTracker_mutationMap.set(this, new WeakMap());
362
- }
363
- add(instance, attrName) {
364
- if (__classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").has(instance)) {
365
- let mutatedAttrs = __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").get(instance);
366
- if (!mutatedAttrs) {
367
- mutatedAttrs = new Set();
368
- __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").set(instance, mutatedAttrs);
369
- }
370
- mutatedAttrs.add(attrName.toLowerCase());
371
- }
372
- }
373
- enable(instance) {
374
- __classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").add(instance);
375
- }
376
- disable(instance) {
377
- __classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").delete(instance);
378
- }
379
- renderMutatedAttrs(instance) {
380
- const mutatedAttrs = __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").get(instance);
381
- if (mutatedAttrs) {
382
- return ` data-lwc-host-mutated="${[...mutatedAttrs].sort().join(' ')}"`;
383
- }
384
- else {
385
- return '';
386
- }
387
- }
456
+ function isAriaAttribute(attrName) {
457
+ return attrName in AriaAttrNameToPropNameMap;
388
458
  }
389
- _MutationTracker_enabledSet = new WeakMap(), _MutationTracker_mutationMap = new WeakMap();
390
- const mutationTracker = new MutationTracker();
391
-
392
- /*
393
- * Copyright (c) 2024, Salesforce, Inc.
394
- * All rights reserved.
395
- * SPDX-License-Identifier: MIT
396
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
397
- */
398
- /**
399
- * Map of global attribute or ARIA attribute to the corresponding property name.
400
- * Not all global attributes are included, just those from `HTMLElementTheGoodParts`.
401
- */
402
- const attrsToProps = assign(create(null), {
403
- accesskey: 'accessKey',
404
- dir: 'dir',
405
- draggable: 'draggable',
406
- hidden: 'hidden',
407
- id: 'id',
408
- lang: 'lang',
409
- spellcheck: 'spellcheck',
410
- tabindex: 'tabIndex',
411
- title: 'title',
412
- ...AriaAttrNameToPropNameMap,
413
- });
459
+ // This list is based on https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes
460
+ const GLOBAL_ATTRIBUTE = /*@__PURE__*/ new Set([
461
+ 'accesskey',
462
+ 'autocapitalize',
463
+ 'autofocus',
464
+ 'class',
465
+ 'contenteditable',
466
+ 'contextmenu',
467
+ 'dir',
468
+ 'draggable',
469
+ 'enterkeyhint',
470
+ 'exportparts',
471
+ 'hidden',
472
+ 'id',
473
+ 'inputmode',
474
+ 'is',
475
+ 'itemid',
476
+ 'itemprop',
477
+ 'itemref',
478
+ 'itemscope',
479
+ 'itemtype',
480
+ 'lang',
481
+ 'nonce',
482
+ 'part',
483
+ 'slot',
484
+ 'spellcheck',
485
+ 'style',
486
+ 'tabindex',
487
+ 'title',
488
+ 'translate',
489
+ ]);
414
490
  /**
415
- * Descriptor for IDL attribute reflections that merely reflect the string, e.g. `title`.
491
+ *
492
+ * @param attrName
416
493
  */
417
- const stringDescriptor = (attrName) => ({
418
- configurable: true,
419
- enumerable: true,
420
- get() {
421
- return this.getAttribute(attrName);
422
- },
423
- set(newValue) {
424
- const currentValue = this.getAttribute(attrName);
425
- const normalizedValue = String(newValue);
426
- if (normalizedValue !== currentValue) {
427
- this.setAttribute(attrName, normalizedValue);
428
- }
429
- },
430
- });
431
- /** Descriptor for a boolean that checks for `attr="true"` or `attr="false"`, e.g. `spellcheck` and `draggable`. */
432
- const explicitBooleanDescriptor = (attrName, defaultValue) => ({
433
- configurable: true,
434
- enumerable: true,
435
- get() {
436
- const value = this.getAttribute(attrName);
437
- return value === null ? defaultValue : value === String(defaultValue);
438
- },
439
- set(newValue) {
440
- const currentValue = this.getAttribute(attrName);
441
- const normalizedValue = String(Boolean(newValue));
442
- if (normalizedValue !== currentValue) {
443
- this.setAttribute(attrName, normalizedValue);
444
- }
445
- },
446
- });
494
+ function isGlobalHtmlAttribute(attrName) {
495
+ return GLOBAL_ATTRIBUTE.has(attrName);
496
+ }
497
+ // These are HTML standard prop/attribute IDL mappings, but are not predictable based on camel/kebab-case conversion
498
+ const SPECIAL_PROPERTY_ATTRIBUTE_MAPPING = /*@__PURE__@*/ new Map([
499
+ ['accessKey', 'accesskey'],
500
+ ['readOnly', 'readonly'],
501
+ ['tabIndex', 'tabindex'],
502
+ ['bgColor', 'bgcolor'],
503
+ ['colSpan', 'colspan'],
504
+ ['rowSpan', 'rowspan'],
505
+ ['contentEditable', 'contenteditable'],
506
+ ['crossOrigin', 'crossorigin'],
507
+ ['dateTime', 'datetime'],
508
+ ['formAction', 'formaction'],
509
+ ['isMap', 'ismap'],
510
+ ['maxLength', 'maxlength'],
511
+ ['minLength', 'minlength'],
512
+ ['noValidate', 'novalidate'],
513
+ ['useMap', 'usemap'],
514
+ ['htmlFor', 'for'],
515
+ ]);
447
516
  /**
448
- * Descriptor for a "true" boolean attribute that checks solely for presence, e.g. `hidden`.
517
+ * Map associating previously transformed HTML property into HTML attribute.
449
518
  */
450
- const booleanAttributeDescriptor = (attrName) => ({
451
- configurable: true,
452
- enumerable: true,
453
- get() {
454
- return this.hasAttribute(attrName);
455
- },
456
- set(newValue) {
457
- const hasAttribute = this.hasAttribute(attrName);
458
- if (newValue) {
459
- if (!hasAttribute) {
460
- this.setAttribute(attrName, '');
461
- }
462
- }
463
- else {
464
- if (hasAttribute) {
465
- this.removeAttribute(attrName);
466
- }
467
- }
468
- },
469
- });
519
+ const CACHED_PROPERTY_ATTRIBUTE_MAPPING = /*@__PURE__@*/ new Map();
470
520
  /**
471
- * Descriptor for ARIA reflections, e.g. `ariaLabel` and `role`.
521
+ *
522
+ * @param propName
472
523
  */
473
- const ariaDescriptor = (attrName) => ({
474
- configurable: true,
475
- enumerable: true,
476
- get() {
477
- return this.getAttribute(attrName);
478
- },
479
- set(newValue) {
480
- const currentValue = this.getAttribute(attrName);
481
- if (newValue !== currentValue) {
482
- // TODO [#3284]: According to the spec, IDL nullable type values
483
- // (null and undefined) should remove the attribute; however, we
484
- // only do so in the case of null for historical reasons.
485
- if (isNull(newValue)) {
486
- this.removeAttribute(attrName);
487
- }
488
- else {
489
- this.setAttribute(attrName, toString(newValue));
490
- }
524
+ function htmlPropertyToAttribute(propName) {
525
+ const ariaAttributeName = AriaPropNameToAttrNameMap[propName];
526
+ if (!isUndefined(ariaAttributeName)) {
527
+ return ariaAttributeName;
528
+ }
529
+ const specialAttributeName = SPECIAL_PROPERTY_ATTRIBUTE_MAPPING.get(propName);
530
+ if (!isUndefined(specialAttributeName)) {
531
+ return specialAttributeName;
532
+ }
533
+ const cachedAttributeName = CACHED_PROPERTY_ATTRIBUTE_MAPPING.get(propName);
534
+ if (!isUndefined(cachedAttributeName)) {
535
+ return cachedAttributeName;
536
+ }
537
+ let attributeName = '';
538
+ for (let i = 0, len = propName.length; i < len; i++) {
539
+ const code = StringCharCodeAt.call(propName, i);
540
+ if (code >= 65 && // "A"
541
+ code <= 90 // "Z"
542
+ ) {
543
+ attributeName += '-' + StringFromCharCode(code + 32);
491
544
  }
492
- },
493
- });
494
- function reflectAttrToProp(instance, attrName, attrValue) {
495
- const reflectedPropName = attrsToProps[attrName];
496
- // If it is a reflected property and it was not overridden by the instance
497
- if (reflectedPropName && !hasOwnProperty.call(instance, reflectedPropName)) {
498
- const currentValue = instance[reflectedPropName];
499
- if (currentValue !== attrValue) {
500
- instance[reflectedPropName] = attrValue;
545
+ else {
546
+ attributeName += StringFromCharCode(code);
501
547
  }
502
548
  }
549
+ CACHED_PROPERTY_ATTRIBUTE_MAPPING.set(propName, attributeName);
550
+ return attributeName;
503
551
  }
504
- const descriptors = {
505
- accessKey: stringDescriptor('accesskey'),
506
- dir: stringDescriptor('dir'),
507
- draggable: explicitBooleanDescriptor('draggable', true),
508
- hidden: booleanAttributeDescriptor('hidden'),
509
- id: stringDescriptor('id'),
510
- lang: stringDescriptor('lang'),
511
- spellcheck: explicitBooleanDescriptor('spellcheck', false),
512
- tabIndex: {
513
- get() {
514
- const str = this.getAttribute('tabindex');
515
- const num = Number(str);
516
- return isFinite(num) ? Math.trunc(num) : -1;
517
- },
518
- set(newValue) {
519
- const currentValue = this.getAttribute('tabindex');
520
- const num = Number(newValue);
521
- const normalizedValue = isFinite(num) ? String(Math.trunc(num)) : '0';
522
- if (normalizedValue !== currentValue) {
523
- this.setAttribute('tabindex', toString(newValue));
524
- }
525
- },
526
- },
527
- title: stringDescriptor('title'),
552
+
553
+ /*
554
+ * Copyright (c) 2020, salesforce.com, inc.
555
+ * All rights reserved.
556
+ * SPDX-License-Identifier: MIT
557
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
558
+ */
559
+ const ESCAPED_CHARS = {
560
+ '"': '&quot;',
561
+ "'": '&#x27;',
562
+ '<': '&lt;',
563
+ '>': '&gt;',
564
+ '&': '&amp;',
528
565
  };
529
- // Add descriptors for ARIA attributes
530
- for (const [attrName, propName] of entries(AriaAttrNameToPropNameMap)) {
531
- descriptors[propName] = ariaDescriptor(attrName);
566
+ /**
567
+ *
568
+ * @param str
569
+ * @param attrMode
570
+ */
571
+ function htmlEscape(str, attrMode = false) {
572
+ const searchValue = attrMode ? /["&]/g : /["'<>&]/g;
573
+ return str.replace(searchValue, (char) => ESCAPED_CHARS[char]);
532
574
  }
533
575
 
534
576
  /*
535
- * Copyright (c) 2024, salesforce.com, inc.
577
+ * Copyright (c) 2024, Salesforce, Inc.
536
578
  * All rights reserved.
537
579
  * SPDX-License-Identifier: MIT
538
580
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
539
581
  */
540
- var _LightningElement_attrs, _LightningElement_classList;
541
- const SYMBOL__SET_INTERNALS = Symbol('set-internals');
542
- const SYMBOL__GENERATE_MARKUP = Symbol('generate-markup');
543
- class LightningElement {
544
- constructor(propsAvailableAtConstruction) {
545
- this.isConnected = false;
546
- this.className = '';
547
- _LightningElement_attrs.set(this, void 0);
548
- _LightningElement_classList.set(this, null);
549
- assign(this, propsAvailableAtConstruction);
550
- }
551
- [(_LightningElement_attrs = new WeakMap(), _LightningElement_classList = new WeakMap(), SYMBOL__SET_INTERNALS)](props, attrs) {
552
- __classPrivateFieldSet(this, _LightningElement_attrs, attrs, "f");
553
- assign(this, props);
554
- defineProperty(this, 'className', {
555
- get() {
556
- return props.class ?? '';
557
- },
558
- set(newVal) {
559
- props.class = newVal;
560
- attrs.class = newVal;
561
- mutationTracker.add(this, 'class');
562
- },
563
- });
564
- }
565
- get classList() {
566
- if (__classPrivateFieldGet(this, _LightningElement_classList, "f")) {
567
- return __classPrivateFieldGet(this, _LightningElement_classList, "f");
568
- }
569
- return (__classPrivateFieldSet(this, _LightningElement_classList, new ClassList(this), "f"));
570
- }
571
- setAttribute(attrName, attrValue) {
572
- const normalizedName = StringToLowerCase.call(toString(attrName));
573
- const normalizedValue = String(attrValue);
574
- __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName] = normalizedValue;
575
- reflectAttrToProp(this, normalizedName, normalizedValue);
576
- mutationTracker.add(this, normalizedName);
577
- }
578
- getAttribute(attrName) {
579
- const normalizedName = StringToLowerCase.call(toString(attrName));
580
- if (hasOwnProperty.call(__classPrivateFieldGet(this, _LightningElement_attrs, "f"), normalizedName)) {
581
- return __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName];
582
- }
583
- return null;
584
- }
585
- hasAttribute(attrName) {
586
- const normalizedName = StringToLowerCase.call(toString(attrName));
587
- return hasOwnProperty.call(__classPrivateFieldGet(this, _LightningElement_attrs, "f"), normalizedName);
588
- }
589
- removeAttribute(attrName) {
590
- const normalizedName = StringToLowerCase.call(toString(attrName));
591
- delete __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName];
592
- reflectAttrToProp(this, normalizedName, null);
593
- // Track mutations for removal of non-existing attributes
594
- mutationTracker.add(this, normalizedName);
595
- }
596
- addEventListener(_type, _listener, _options) {
597
- // noop
598
- }
599
- removeEventListener(_type, _listener, _options) {
600
- // noop
601
- }
602
- // ----------------------------------------------------------- //
603
- // Props/methods explicitly not available in this environment //
604
- // Getters are named "get*" for parity with @lwc/engine-server //
605
- // ----------------------------------------------------------- //
606
- get children() {
607
- throw new TypeError('"getChildren" is not supported in this environment');
608
- }
609
- get childNodes() {
610
- throw new TypeError('"getChildNodes" is not supported in this environment');
611
- }
612
- get firstChild() {
613
- throw new TypeError('"getFirstChild" is not supported in this environment');
614
- }
615
- get firstElementChild() {
616
- throw new TypeError('"getFirstElementChild" is not supported in this environment');
617
- }
618
- get hostElement() {
619
- // Intentionally different to match @lwc/engine-*core*
620
- throw new TypeError('this.hostElement is not supported in this environment');
621
- }
622
- get lastChild() {
623
- throw new TypeError('"getLastChild" is not supported in this environment');
624
- }
625
- get lastElementChild() {
626
- throw new TypeError('"getLastElementChild" is not supported in this environment');
627
- }
628
- get ownerDocument() {
629
- // Intentionally not "get*" to match @lwc/engine-server
630
- throw new TypeError('"ownerDocument" is not supported in this environment');
631
- }
632
- get style() {
633
- // Intentionally not "get*" to match @lwc/engine-server
634
- throw new TypeError('"style" is not supported in this environment');
635
- }
636
- attachInternals() {
637
- throw new TypeError('"attachInternals" is not supported in this environment');
638
- }
639
- dispatchEvent(_event) {
640
- throw new TypeError('"dispatchEvent" is not supported in this environment');
641
- }
642
- getBoundingClientRect() {
643
- throw new TypeError('"getBoundingClientRect" is not supported in this environment');
644
- }
645
- getElementsByClassName(_classNames) {
646
- throw new TypeError('"getElementsByClassName" is not supported in this environment');
647
- }
648
- getElementsByTagName(_qualifiedName) {
649
- throw new TypeError('"getElementsByTagName" is not supported in this environment');
650
- }
651
- querySelector(_selectors) {
652
- throw new TypeError('"querySelector" is not supported in this environment');
653
- }
654
- querySelectorAll(_selectors) {
655
- throw new TypeError('"querySelectorAll" is not supported in this environment');
656
- }
657
- getAttributeNS(_namespace, _localName) {
658
- throw new Error('Method "getAttributeNS" not implemented.');
659
- }
660
- hasAttributeNS(_namespace, _localName) {
661
- throw new Error('Method "hasAttributeNS" not implemented.');
662
- }
663
- removeAttributeNS(_namespace, _localName) {
664
- throw new Error('Method "removeAttributeNS" not implemented.');
665
- }
666
- setAttributeNS(_namespace, _qualifiedName, _value) {
667
- throw new Error('Method "setAttributeNS" not implemented.');
582
+ let hooksAreSet = false;
583
+ /**
584
+ * EXPERIMENTAL: This function acts like a hook for Lightning Locker Service and other similar
585
+ * libraries to sanitize HTML content. This hook process the content passed via the template to
586
+ * lwc:inner-html directive.
587
+ * It is meant to be overridden via `setHooks`; it throws an error by default.
588
+ */
589
+ exports.sanitizeHtmlContent = () => {
590
+ // locker-service patches this function during runtime to sanitize HTML content.
591
+ throw new Error('sanitizeHtmlContent hook must be implemented.');
592
+ };
593
+ function setHooks(hooks) {
594
+ isFalse$1(hooksAreSet, 'Hooks are already overridden, only one definition is allowed.');
595
+ hooksAreSet = true;
596
+ exports.sanitizeHtmlContent = hooks.sanitizeHtmlContent;
597
+ }
598
+ function flattenStylesheets(stylesheets) {
599
+ const list = [];
600
+ for (const stylesheet of stylesheets) {
601
+ if (!isArray(stylesheet)) {
602
+ list.push(stylesheet);
603
+ }
604
+ else {
605
+ list.push(...flattenStylesheets(stylesheet));
606
+ }
668
607
  }
608
+ return list;
669
609
  }
670
- defineProperties(LightningElement.prototype, descriptors);
610
+ /** version: 8.7.0 */
671
611
 
672
612
  /*
673
- * Copyright (c) 2024, salesforce.com, inc.
613
+ * Copyright (c) 2024, Salesforce, Inc.
674
614
  * All rights reserved.
675
615
  * SPDX-License-Identifier: MIT
676
616
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
677
617
  */
678
- const escapeAttrVal = (attrVal) => attrVal.replaceAll('&', '&amp;').replaceAll('"', '&quot;');
679
- function* renderAttrs(instance, attrs) {
680
- if (!attrs) {
681
- return;
618
+ const MULTI_SPACE = /\s+/g;
619
+ class ClassList {
620
+ constructor(el) {
621
+ this.el = el;
682
622
  }
683
- for (const attrName of Object.getOwnPropertyNames(attrs)) {
684
- const attrVal = attrs[attrName];
685
- if (typeof attrVal === 'string') {
686
- yield attrVal === '' ? ` ${attrName}` : ` ${attrName}="${escapeAttrVal(attrVal)}"`;
623
+ add(...newClassNames) {
624
+ const className = this.el.className;
625
+ const set = new Set(className.split(MULTI_SPACE).filter(Boolean));
626
+ for (const newClassName of newClassNames) {
627
+ set.add(newClassName);
687
628
  }
688
- else if (attrVal === null) {
689
- yield '';
629
+ this.el.className = Array.from(set).join(' ');
630
+ }
631
+ contains(className) {
632
+ const currentClassNameStr = this.el.className;
633
+ return currentClassNameStr.split(MULTI_SPACE).includes(className);
634
+ }
635
+ remove(...classNamesToRemove) {
636
+ const className = this.el.className;
637
+ const set = new Set(className.split(MULTI_SPACE).filter(Boolean));
638
+ for (const newClassName of classNamesToRemove) {
639
+ set.delete(newClassName);
690
640
  }
641
+ this.el.className = Array.from(set).join(' ');
691
642
  }
692
- yield mutationTracker.renderMutatedAttrs(instance);
693
- }
694
- function renderAttrsNoYield(emit, instance, attrs) {
695
- if (!attrs) {
696
- return;
643
+ replace(oldClassName, newClassName) {
644
+ let classWasReplaced = false;
645
+ const className = this.el.className;
646
+ const listOfClasses = className.split(MULTI_SPACE).filter(Boolean);
647
+ listOfClasses.forEach((value, idx) => {
648
+ if (value === oldClassName) {
649
+ classWasReplaced = true;
650
+ listOfClasses[idx] = newClassName;
651
+ }
652
+ });
653
+ this.el.className = listOfClasses.join(' ');
654
+ return classWasReplaced;
697
655
  }
698
- for (const attrName of Object.getOwnPropertyNames(attrs)) {
699
- const attrVal = attrs[attrName];
700
- if (typeof attrVal === 'string') {
701
- emit(attrVal === '' ? ` ${attrName}` : ` ${attrName}="${escapeAttrVal(attrVal)}"`);
656
+ toggle(classNameToToggle, force) {
657
+ const classNameStr = this.el.className;
658
+ const set = new Set(classNameStr.split(MULTI_SPACE).filter(Boolean));
659
+ if (!set.has(classNameToToggle) && force !== false) {
660
+ set.add(classNameToToggle);
702
661
  }
703
- else if (attrVal === null) {
704
- emit('');
662
+ else if (set.has(classNameToToggle) && force !== true) {
663
+ set.delete(classNameToToggle);
705
664
  }
665
+ this.el.className = Array.from(set).join(' ');
666
+ return set.has(classNameToToggle);
706
667
  }
707
- emit(mutationTracker.renderMutatedAttrs(instance));
708
- }
709
- function* fallbackTmpl(_props, _attrs, _slotted, Cmp, _instance) {
710
- if (Cmp.renderMode !== 'light') {
711
- yield '<template shadowrootmode="open"></template>';
668
+ get value() {
669
+ return this.el.className;
712
670
  }
713
- }
714
- function fallbackTmplNoYield(emit, _props, _attrs, _slotted, Cmp, _instance) {
715
- if (Cmp.renderMode !== 'light') {
716
- emit('<template shadowrootmode="open"></template>');
671
+ toString() {
672
+ return this.el.className;
673
+ }
674
+ item(_index) {
675
+ throw new Error('Method "item" not implemented.');
676
+ }
677
+ supports(_token) {
678
+ throw new Error('Method "supports" not implemented.');
679
+ }
680
+ forEach(_callbackfn, _thisArg) {
681
+ throw new Error('Method "forEach" not implemented.');
682
+ }
683
+ get length() {
684
+ throw new Error('Property "length" not implemented.');
717
685
  }
718
686
  }
719
- async function serverSideRenderComponent(tagName, Component, props = {}, mode = 'asyncYield') {
720
- if (typeof tagName !== 'string') {
721
- throw new Error(`tagName must be a string, found: ${tagName}`);
687
+
688
+ /******************************************************************************
689
+ Copyright (c) Microsoft Corporation.
690
+
691
+ Permission to use, copy, modify, and/or distribute this software for any
692
+ purpose with or without fee is hereby granted.
693
+
694
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
695
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
696
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
697
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
698
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
699
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
700
+ PERFORMANCE OF THIS SOFTWARE.
701
+ ***************************************************************************** */
702
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
703
+
704
+
705
+ function __classPrivateFieldGet(receiver, state, kind, f) {
706
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
707
+ 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");
708
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
709
+ }
710
+
711
+ function __classPrivateFieldSet(receiver, state, value, kind, f) {
712
+ if (kind === "m") throw new TypeError("Private method is not writable");
713
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
714
+ 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");
715
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
716
+ }
717
+
718
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
719
+ var e = new Error(message);
720
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
721
+ };
722
+
723
+ /*
724
+ * Copyright (c) 2024, Salesforce, Inc.
725
+ * All rights reserved.
726
+ * SPDX-License-Identifier: MIT
727
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
728
+ */
729
+ var _MutationTracker_enabledSet, _MutationTracker_mutationMap;
730
+ class MutationTracker {
731
+ constructor() {
732
+ _MutationTracker_enabledSet.set(this, new WeakSet());
733
+ _MutationTracker_mutationMap.set(this, new WeakMap());
722
734
  }
723
- // TODO [#4726]: remove `generateMarkup` export
724
- const generateMarkup = SYMBOL__GENERATE_MARKUP in Component ? Component[SYMBOL__GENERATE_MARKUP] : Component;
725
- let markup = '';
726
- const emit = (segment) => {
727
- markup += segment;
728
- };
729
- if (mode === 'asyncYield') {
730
- for await (const segment of generateMarkup(tagName, props, null, null)) {
731
- markup += segment;
735
+ add(instance, attrName) {
736
+ if (__classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").has(instance)) {
737
+ let mutatedAttrs = __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").get(instance);
738
+ if (!mutatedAttrs) {
739
+ mutatedAttrs = new Set();
740
+ __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").set(instance, mutatedAttrs);
741
+ }
742
+ mutatedAttrs.add(attrName.toLowerCase());
732
743
  }
733
744
  }
734
- else if (mode === 'async') {
735
- await generateMarkup(emit, tagName, props, null, null);
745
+ enable(instance) {
746
+ __classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").add(instance);
736
747
  }
737
- else if (mode === 'sync') {
738
- generateMarkup(emit, tagName, props, null, null);
748
+ disable(instance) {
749
+ __classPrivateFieldGet(this, _MutationTracker_enabledSet, "f").delete(instance);
739
750
  }
740
- else {
741
- throw new Error(`Invalid mode: ${mode}`);
751
+ renderMutatedAttrs(instance) {
752
+ const mutatedAttrs = __classPrivateFieldGet(this, _MutationTracker_mutationMap, "f").get(instance);
753
+ if (mutatedAttrs) {
754
+ return ` data-lwc-host-mutated="${[...mutatedAttrs].sort().join(' ')}"`;
755
+ }
756
+ else {
757
+ return '';
758
+ }
742
759
  }
743
- return markup;
744
760
  }
761
+ _MutationTracker_enabledSet = new WeakMap(), _MutationTracker_mutationMap = new WeakMap();
762
+ const mutationTracker = new MutationTracker();
745
763
 
746
764
  /*
747
765
  * Copyright (c) 2024, Salesforce, Inc.
@@ -749,220 +767,271 @@ async function serverSideRenderComponent(tagName, Component, props = {}, mode =
749
767
  * SPDX-License-Identifier: MIT
750
768
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
751
769
  */
752
- // Stubs for all the un-implemented exports from @lwc/engine-server
753
- function api(..._) {
754
- throw new Error('@api cannot be used in SSR context.');
755
- }
756
- function createContextProvider(..._) {
757
- throw new Error('createContextProvider cannot be used in SSR context.');
758
- }
759
- function createElement(..._) {
760
- throw new Error('createElement cannot be used in SSR context.');
761
- }
762
- function freezeTemplate(..._) {
763
- throw new Error('freezeTemplate cannot be used in SSR context.');
764
- }
765
- function getComponentDef(..._) {
766
- throw new Error('getComponentDef cannot be used in SSR context.');
767
- }
768
- function isComponentConstructor(..._) {
769
- throw new Error('isComponentConstructor cannot be used in SSR context.');
770
- }
771
- function parseFragment(..._) {
772
- throw new Error('parseFragment cannot be used in SSR context.');
773
- }
774
- function parseSVGFragment(..._) {
775
- throw new Error('parseSVGFragment cannot be used in SSR context.');
776
- }
777
- function readonly(..._) {
778
- throw new Error('readonly cannot be used in SSR context.');
779
- }
780
- function registerComponent(..._) {
781
- throw new Error('registerComponent cannot be used in SSR context.');
782
- }
783
- function registerDecorators(..._) {
784
- throw new Error('registerDecorators cannot be used in SSR context.');
785
- }
786
- function registerTemplate(..._) {
787
- throw new Error('registerTemplate cannot be used in SSR context.');
788
- }
789
- function sanitizeAttribute(..._) {
790
- throw new Error('sanitizeAttribute cannot be used in SSR context.');
791
- }
792
- function setFeatureFlag(..._) {
793
- throw new Error('setFeatureFlag cannot be used in SSR context.');
794
- }
795
- function setFeatureFlagForTest(..._) {
796
- throw new Error('setFeatureFlagForTest cannot be used in SSR context.');
797
- }
798
- function setHooks(..._) {
799
- throw new Error('setHooks cannot be used in SSR context.');
800
- }
801
- function swapComponent(..._) {
802
- throw new Error('swapComponent cannot be used in SSR context.');
803
- }
804
- function swapStyle(..._) {
805
- throw new Error('swapStyle cannot be used in SSR context.');
806
- }
807
- function swapTemplate(..._) {
808
- throw new Error('swapTemplate cannot be used in SSR context.');
809
- }
810
- function track(..._) {
811
- throw new Error('@track cannot be used in SSR context.');
812
- }
813
- function unwrap(..._) {
814
- throw new Error('unwrap cannot be used in SSR context.');
815
- }
816
- function wire(..._) {
817
- throw new Error('@wire cannot be used in SSR context.');
770
+ /**
771
+ * Filters out the following types of properties that should not be set.
772
+ * - Properties that are not public.
773
+ * - Properties that are not global.
774
+ * - Properties that are global but are internally overridden.
775
+ */
776
+ function filterProperties(props, publicFields, privateFields) {
777
+ const propsToAssign = create(null);
778
+ const publicFieldSet = new Set(publicFields);
779
+ const privateFieldSet = new Set(privateFields);
780
+ keys(props).forEach((propName) => {
781
+ const attrName = htmlPropertyToAttribute(propName);
782
+ if (publicFieldSet.has(propName) ||
783
+ ((isGlobalHtmlAttribute(attrName) || isAriaAttribute(attrName)) &&
784
+ !privateFieldSet.has(propName))) {
785
+ propsToAssign[propName] = props[propName];
786
+ }
787
+ });
788
+ return propsToAssign;
818
789
  }
819
- const renderer = {
820
- isSyntheticShadowDefined: false,
821
- insert(..._) {
822
- throw new Error('renderer.insert cannot be used in SSR context.');
823
- },
824
- remove(..._) {
825
- throw new Error('renderer.remove cannot be used in SSR context.');
826
- },
827
- cloneNode(..._) {
828
- throw new Error('renderer.cloneNode cannot be used in SSR context.');
829
- },
830
- createFragment(..._) {
831
- throw new Error('renderer.createFragment cannot be used in SSR context.');
832
- },
833
- createElement(..._) {
834
- throw new Error('renderer.createElement cannot be used in SSR context.');
835
- },
836
- createText(..._) {
837
- throw new Error('renderer.createText cannot be used in SSR context.');
838
- },
839
- createComment(..._) {
840
- throw new Error('renderer.createComment cannot be used in SSR context.');
841
- },
842
- createCustomElement(..._) {
843
- throw new Error('renderer.createCustomElement cannot be used in SSR context.');
844
- },
845
- nextSibling(..._) {
846
- throw new Error('renderer.nextSibling cannot be used in SSR context.');
847
- },
848
- previousSibling(..._) {
849
- throw new Error('renderer.previousSibling cannot be used in SSR context.');
850
- },
851
- attachShadow(..._) {
852
- throw new Error('renderer.attachShadow cannot be used in SSR context.');
853
- },
854
- getProperty(..._) {
855
- throw new Error('renderer.getProperty cannot be used in SSR context.');
856
- },
857
- setProperty(..._) {
858
- throw new Error('renderer.setProperty cannot be used in SSR context.');
859
- },
860
- setText(..._) {
861
- throw new Error('renderer.setText cannot be used in SSR context.');
862
- },
863
- getAttribute(..._) {
864
- throw new Error('renderer.getAttribute cannot be used in SSR context.');
865
- },
866
- setAttribute(..._) {
867
- throw new Error('renderer.setAttribute cannot be used in SSR context.');
868
- },
869
- removeAttribute(..._) {
870
- throw new Error('renderer.removeAttribute cannot be used in SSR context.');
871
- },
872
- addEventListener(..._) {
873
- throw new Error('renderer.addEventListener cannot be used in SSR context.');
874
- },
875
- removeEventListener(..._) {
876
- throw new Error('renderer.removeEventListener cannot be used in SSR context.');
877
- },
878
- dispatchEvent(..._) {
879
- throw new Error('renderer.dispatchEvent cannot be used in SSR context.');
880
- },
881
- getClassList(..._) {
882
- throw new Error('renderer.getClassList cannot be used in SSR context.');
883
- },
884
- setCSSStyleProperty(..._) {
885
- throw new Error('renderer.setCSSStyleProperty cannot be used in SSR context.');
886
- },
887
- getBoundingClientRect(..._) {
888
- throw new Error('renderer.getBoundingClientRect cannot be used in SSR context.');
889
- },
890
- querySelector(..._) {
891
- throw new Error('renderer.querySelector cannot be used in SSR context.');
892
- },
893
- querySelectorAll(..._) {
894
- throw new Error('renderer.querySelectorAll cannot be used in SSR context.');
895
- },
896
- getElementsByTagName(..._) {
897
- throw new Error('renderer.getElementsByTagName cannot be used in SSR context.');
898
- },
899
- getElementsByClassName(..._) {
900
- throw new Error('renderer.getElementsByClassName cannot be used in SSR context.');
901
- },
902
- getChildren(..._) {
903
- throw new Error('renderer.getChildren cannot be used in SSR context.');
904
- },
905
- getChildNodes(..._) {
906
- throw new Error('renderer.getChildNodes cannot be used in SSR context.');
907
- },
908
- getFirstChild(..._) {
909
- throw new Error('renderer.getFirstChild cannot be used in SSR context.');
910
- },
911
- getFirstElementChild(..._) {
912
- throw new Error('renderer.getFirstElementChild cannot be used in SSR context.');
913
- },
914
- getLastChild(..._) {
915
- throw new Error('renderer.getLastChild cannot be used in SSR context.');
916
- },
917
- getLastElementChild(..._) {
918
- throw new Error('renderer.getLastElementChild cannot be used in SSR context.');
919
- },
920
- getTagName(..._) {
921
- throw new Error('renderer.getTagName cannot be used in SSR context.');
922
- },
923
- getStyle(..._) {
924
- throw new Error('renderer.getStyle cannot be used in SSR context.');
925
- },
926
- isConnected(..._) {
927
- throw new Error('renderer.isConnected cannot be used in SSR context.');
928
- },
929
- insertStylesheet(..._) {
930
- throw new Error('renderer.insertStylesheet cannot be used in SSR context.');
790
+ /**
791
+ * Descriptor for IDL attribute reflections that merely reflect the string, e.g. `title`.
792
+ */
793
+ const stringDescriptor = (attrName) => ({
794
+ configurable: true,
795
+ enumerable: true,
796
+ get() {
797
+ return this.getAttribute(attrName);
931
798
  },
932
- assertInstanceOfHTMLElement(..._) {
933
- throw new Error('renderer.assertInstanceOfHTMLElement cannot be used in SSR context.');
799
+ set(newValue) {
800
+ const currentValue = this.getAttribute(attrName);
801
+ const normalizedValue = String(newValue);
802
+ if (normalizedValue !== currentValue) {
803
+ this.setAttribute(attrName, normalizedValue);
804
+ }
934
805
  },
935
- ownerDocument(..._) {
936
- throw new Error('renderer.ownerDocument cannot be used in SSR context.');
806
+ });
807
+ /** Descriptor for a boolean that checks for `attr="true"` or `attr="false"`, e.g. `spellcheck` and `draggable`. */
808
+ const explicitBooleanDescriptor = (attrName, defaultValue) => ({
809
+ configurable: true,
810
+ enumerable: true,
811
+ get() {
812
+ const value = this.getAttribute(attrName);
813
+ return value === null ? defaultValue : value === String(defaultValue);
937
814
  },
938
- registerContextConsumer(..._) {
939
- throw new Error('renderer.registerContextConsumer cannot be used in SSR context.');
815
+ set(newValue) {
816
+ const currentValue = this.getAttribute(attrName);
817
+ const normalizedValue = String(Boolean(newValue));
818
+ if (normalizedValue !== currentValue) {
819
+ this.setAttribute(attrName, normalizedValue);
820
+ }
940
821
  },
941
- attachInternals(..._) {
942
- throw new Error('renderer.attachInternals cannot be used in SSR context.');
822
+ });
823
+ /**
824
+ * Descriptor for a "true" boolean attribute that checks solely for presence, e.g. `hidden`.
825
+ */
826
+ const booleanAttributeDescriptor = (attrName) => ({
827
+ configurable: true,
828
+ enumerable: true,
829
+ get() {
830
+ return this.hasAttribute(attrName);
943
831
  },
944
- defineCustomElement(..._) {
945
- throw new Error('renderer.defineCustomElement cannot be used in SSR context.');
832
+ set(newValue) {
833
+ const hasAttribute = this.hasAttribute(attrName);
834
+ if (newValue) {
835
+ if (!hasAttribute) {
836
+ this.setAttribute(attrName, '');
837
+ }
838
+ }
839
+ else {
840
+ if (hasAttribute) {
841
+ this.removeAttribute(attrName);
842
+ }
843
+ }
946
844
  },
947
- getParentNode(..._) {
948
- throw new Error('renderer.getParentNode cannot be used in SSR context.');
845
+ });
846
+ /**
847
+ * Descriptor for ARIA reflections, e.g. `ariaLabel` and `role`.
848
+ */
849
+ const ariaDescriptor = (attrName) => ({
850
+ configurable: true,
851
+ enumerable: true,
852
+ get() {
853
+ return this.getAttribute(attrName);
949
854
  },
950
- startTrackingMutations(..._) {
951
- throw new Error('renderer.startTrackingMutations cannot be used in SSR context.');
855
+ set(newValue) {
856
+ const currentValue = this.getAttribute(attrName);
857
+ if (newValue !== currentValue) {
858
+ // TODO [#3284]: According to the spec, IDL nullable type values
859
+ // (null and undefined) should remove the attribute; however, we
860
+ // only do so in the case of null for historical reasons.
861
+ if (isNull(newValue)) {
862
+ this.removeAttribute(attrName);
863
+ }
864
+ else {
865
+ this.setAttribute(attrName, toString(newValue));
866
+ }
867
+ }
952
868
  },
953
- stopTrackingMutations(..._) {
954
- throw new Error('renderer.stopTrackingMutations cannot be used in SSR context.');
869
+ });
870
+ const descriptors = {
871
+ accessKey: stringDescriptor('accesskey'),
872
+ dir: stringDescriptor('dir'),
873
+ draggable: explicitBooleanDescriptor('draggable', true),
874
+ hidden: booleanAttributeDescriptor('hidden'),
875
+ id: stringDescriptor('id'),
876
+ lang: stringDescriptor('lang'),
877
+ spellcheck: explicitBooleanDescriptor('spellcheck', false),
878
+ tabIndex: {
879
+ get() {
880
+ const str = this.getAttribute('tabindex');
881
+ const num = Number(str);
882
+ return isFinite(num) ? Math.trunc(num) : -1;
883
+ },
884
+ set(newValue) {
885
+ const currentValue = this.getAttribute('tabindex');
886
+ const num = Number(newValue);
887
+ const normalizedValue = isFinite(num) ? String(Math.trunc(num)) : '0';
888
+ if (normalizedValue !== currentValue) {
889
+ this.setAttribute('tabindex', toString(newValue));
890
+ }
891
+ },
955
892
  },
893
+ title: stringDescriptor('title'),
956
894
  };
957
- /**
958
- * The hot API is used to orchestrate hot swapping in client rendered components.
959
- * It doesn't do anything on the server side, however, you may import it.
960
- *
961
- * The whole point of defining this and exporting it is so that you can import it in isomorphic code without
962
- * an error being thrown by the import itself.
895
+ // Add descriptors for ARIA attributes
896
+ for (const [attrName, propName] of entries(AriaAttrNameToPropNameMap)) {
897
+ descriptors[propName] = ariaDescriptor(attrName);
898
+ }
899
+
900
+ /*
901
+ * Copyright (c) 2024, salesforce.com, inc.
902
+ * All rights reserved.
903
+ * SPDX-License-Identifier: MIT
904
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
963
905
  */
964
- // A real stub, not a "not implemented" one! 😯
965
- const hot = undefined;
906
+ var _LightningElement_attrs, _LightningElement_classList;
907
+ const SYMBOL__SET_INTERNALS = Symbol('set-internals');
908
+ const SYMBOL__GENERATE_MARKUP = Symbol('generate-markup');
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
+ });
930
+ }
931
+ get classList() {
932
+ if (__classPrivateFieldGet(this, _LightningElement_classList, "f")) {
933
+ return __classPrivateFieldGet(this, _LightningElement_classList, "f");
934
+ }
935
+ return (__classPrivateFieldSet(this, _LightningElement_classList, new ClassList(this), "f"));
936
+ }
937
+ setAttribute(attrName, attrValue) {
938
+ const normalizedName = StringToLowerCase.call(toString(attrName));
939
+ const normalizedValue = String(attrValue);
940
+ __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName] = normalizedValue;
941
+ mutationTracker.add(this, normalizedName);
942
+ }
943
+ getAttribute(attrName) {
944
+ const normalizedName = StringToLowerCase.call(toString(attrName));
945
+ if (hasOwnProperty.call(__classPrivateFieldGet(this, _LightningElement_attrs, "f"), normalizedName)) {
946
+ return __classPrivateFieldGet(this, _LightningElement_attrs, "f")[normalizedName];
947
+ }
948
+ return null;
949
+ }
950
+ hasAttribute(attrName) {
951
+ const normalizedName = StringToLowerCase.call(toString(attrName));
952
+ return hasOwnProperty.call(__classPrivateFieldGet(this, _LightningElement_attrs, "f"), normalizedName);
953
+ }
954
+ removeAttribute(attrName) {
955
+ const normalizedName = StringToLowerCase.call(toString(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');
991
+ }
992
+ get ownerDocument() {
993
+ // Intentionally not "get*" to match @lwc/engine-server
994
+ throw new TypeError('"ownerDocument" is not supported in this environment');
995
+ }
996
+ get style() {
997
+ // Intentionally not "get*" to match @lwc/engine-server
998
+ throw new TypeError('"style" is not supported in this environment');
999
+ }
1000
+ attachInternals() {
1001
+ throw new TypeError('"attachInternals" is not supported in this environment');
1002
+ }
1003
+ dispatchEvent(_event) {
1004
+ throw new TypeError('"dispatchEvent" is not supported in this environment');
1005
+ }
1006
+ getBoundingClientRect() {
1007
+ throw new TypeError('"getBoundingClientRect" is not supported in this environment');
1008
+ }
1009
+ getElementsByClassName(_classNames) {
1010
+ throw new TypeError('"getElementsByClassName" is not supported in this environment');
1011
+ }
1012
+ getElementsByTagName(_qualifiedName) {
1013
+ throw new TypeError('"getElementsByTagName" is not supported in this environment');
1014
+ }
1015
+ querySelector(_selectors) {
1016
+ throw new TypeError('"querySelector" is not supported in this environment');
1017
+ }
1018
+ querySelectorAll(_selectors) {
1019
+ throw new TypeError('"querySelectorAll" is not supported in this environment');
1020
+ }
1021
+ getAttributeNS(_namespace, _localName) {
1022
+ throw new Error('Method "getAttributeNS" not implemented.');
1023
+ }
1024
+ hasAttributeNS(_namespace, _localName) {
1025
+ throw new Error('Method "hasAttributeNS" not implemented.');
1026
+ }
1027
+ removeAttributeNS(_namespace, _localName) {
1028
+ throw new Error('Method "removeAttributeNS" not implemented.');
1029
+ }
1030
+ setAttributeNS(_namespace, _qualifiedName, _value) {
1031
+ throw new Error('Method "setAttributeNS" not implemented.');
1032
+ }
1033
+ }
1034
+ defineProperties(LightningElement.prototype, descriptors);
966
1035
 
967
1036
  /*
968
1037
  * Copyright (c) 2024, salesforce.com, inc.
@@ -970,35 +1039,72 @@ const hot = undefined;
970
1039
  * SPDX-License-Identifier: MIT
971
1040
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
972
1041
  */
973
- /**
974
- * Converts an iterable into one that emits the object used by the [`iterator` directive](
975
- * https://lwc.dev/guide/html_templates#iterator).
976
- */
977
- function* toIteratorDirective(iterable) {
978
- if (iterable === undefined || iterable === null)
1042
+ const escapeAttrVal = (attrVal) => attrVal.replaceAll('&', '&amp;').replaceAll('"', '&quot;');
1043
+ function* renderAttrs(instance, attrs) {
1044
+ if (!attrs) {
979
1045
  return;
980
- if (!iterable[Symbol.iterator]) {
981
- throw new Error(
982
- // Mimic error message from "[i]terable node" in engine-core's api.ts
983
- `Invalid template iteration for value \`${iterable}\`. It must be an array-like object.`);
984
1046
  }
985
- const iterator = iterable[Symbol.iterator]();
986
- let next = iterator.next();
987
- let index = 0;
988
- let { value, done: last = false } = next;
989
- while (last === false) {
990
- // using a look-back approach because we need to know if the element is the last
991
- next = iterator.next();
992
- last = next.done ?? false;
993
- yield {
994
- value,
995
- index,
996
- first: index === 0,
997
- last,
998
- };
999
- index += 1;
1000
- value = next.value;
1047
+ for (const attrName of Object.getOwnPropertyNames(attrs)) {
1048
+ const attrVal = attrs[attrName];
1049
+ if (typeof attrVal === 'string') {
1050
+ yield attrVal === '' ? ` ${attrName}` : ` ${attrName}="${escapeAttrVal(attrVal)}"`;
1051
+ }
1052
+ else if (attrVal === null) {
1053
+ yield '';
1054
+ }
1055
+ }
1056
+ yield mutationTracker.renderMutatedAttrs(instance);
1057
+ }
1058
+ function renderAttrsNoYield(emit, instance, attrs) {
1059
+ if (!attrs) {
1060
+ return;
1061
+ }
1062
+ for (const attrName of Object.getOwnPropertyNames(attrs)) {
1063
+ const attrVal = attrs[attrName];
1064
+ if (typeof attrVal === 'string') {
1065
+ emit(attrVal === '' ? ` ${attrName}` : ` ${attrName}="${escapeAttrVal(attrVal)}"`);
1066
+ }
1067
+ else if (attrVal === null) {
1068
+ emit('');
1069
+ }
1070
+ }
1071
+ emit(mutationTracker.renderMutatedAttrs(instance));
1072
+ }
1073
+ function* fallbackTmpl(_props, _attrs, _slotted, Cmp, _instance) {
1074
+ if (Cmp.renderMode !== 'light') {
1075
+ yield '<template shadowrootmode="open"></template>';
1076
+ }
1077
+ }
1078
+ function fallbackTmplNoYield(emit, _props, _attrs, _slotted, Cmp, _instance) {
1079
+ if (Cmp.renderMode !== 'light') {
1080
+ emit('<template shadowrootmode="open"></template>');
1081
+ }
1082
+ }
1083
+ async function serverSideRenderComponent(tagName, Component, props = {}, mode = 'asyncYield') {
1084
+ if (typeof tagName !== 'string') {
1085
+ throw new Error(`tagName must be a string, found: ${tagName}`);
1086
+ }
1087
+ // TODO [#4726]: remove `generateMarkup` export
1088
+ const generateMarkup = SYMBOL__GENERATE_MARKUP in Component ? Component[SYMBOL__GENERATE_MARKUP] : Component;
1089
+ let markup = '';
1090
+ const emit = (segment) => {
1091
+ markup += segment;
1092
+ };
1093
+ if (mode === 'asyncYield') {
1094
+ for await (const segment of generateMarkup(tagName, props, null, null)) {
1095
+ markup += segment;
1096
+ }
1097
+ }
1098
+ else if (mode === 'async') {
1099
+ await generateMarkup(emit, tagName, props, null, null);
1100
+ }
1101
+ else if (mode === 'sync') {
1102
+ generateMarkup(emit, tagName, props, null, null);
1103
+ }
1104
+ else {
1105
+ throw new Error(`Invalid mode: ${mode}`);
1001
1106
  }
1107
+ return markup;
1002
1108
  }
1003
1109
 
1004
1110
  /*
@@ -1079,15 +1185,87 @@ function renderStylesheets(stylesheets, scopeToken, Component, hasScopedTemplate
1079
1185
  return result;
1080
1186
  }
1081
1187
 
1188
+ /*
1189
+ * Copyright (c) 2024, salesforce.com, inc.
1190
+ * All rights reserved.
1191
+ * SPDX-License-Identifier: MIT
1192
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1193
+ */
1194
+ /**
1195
+ * Converts an iterable into one that emits the object used by the [`iterator` directive](
1196
+ * https://lwc.dev/guide/html_templates#iterator).
1197
+ */
1198
+ function* toIteratorDirective(iterable) {
1199
+ if (iterable === undefined || iterable === null)
1200
+ return;
1201
+ if (!iterable[Symbol.iterator]) {
1202
+ throw new Error(
1203
+ // Mimic error message from "[i]terable node" in engine-core's api.ts
1204
+ `Invalid template iteration for value \`${iterable}\`. It must be an array-like object.`);
1205
+ }
1206
+ const iterator = iterable[Symbol.iterator]();
1207
+ let next = iterator.next();
1208
+ let index = 0;
1209
+ let { value, done: last = false } = next;
1210
+ while (last === false) {
1211
+ // using a look-back approach because we need to know if the element is the last
1212
+ next = iterator.next();
1213
+ last = next.done ?? false;
1214
+ yield {
1215
+ value,
1216
+ index,
1217
+ first: index === 0,
1218
+ last,
1219
+ };
1220
+ index += 1;
1221
+ value = next.value;
1222
+ }
1223
+ }
1224
+
1225
+ /*
1226
+ * Copyright (c) 2024, Salesforce, Inc.
1227
+ * All rights reserved.
1228
+ * SPDX-License-Identifier: MIT
1229
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1230
+ */
1231
+ // Deep freeze and clone an object. Designed for cloning/freezing child props when passed from a parent to a child so
1232
+ // that they are immutable. This is one of the normal guarantees of both engine-dom and engine-server that we want to
1233
+ // emulate in ssr-runtime. The goal here is that a child cannot mutate the props of its parent and thus affect
1234
+ // the parent's rendering, which would lead to bidirectional reactivity and mischief.
1235
+ function cloneAndDeepFreeze(obj) {
1236
+ if (isArray(obj)) {
1237
+ const res = [];
1238
+ for (const item of obj) {
1239
+ ArrayPush.call(res, cloneAndDeepFreeze(item));
1240
+ }
1241
+ freeze(res);
1242
+ return res;
1243
+ }
1244
+ else if (isObject(obj) && !isNull(obj)) {
1245
+ const res = create(null);
1246
+ for (const [key, value] of entries(obj)) {
1247
+ res[key] = cloneAndDeepFreeze(value);
1248
+ }
1249
+ freeze(res);
1250
+ return res;
1251
+ }
1252
+ else {
1253
+ // primitive
1254
+ return obj;
1255
+ }
1256
+ }
1257
+
1082
1258
  exports.ClassList = ClassList;
1083
1259
  exports.LightningElement = LightningElement;
1084
1260
  exports.SYMBOL__GENERATE_MARKUP = SYMBOL__GENERATE_MARKUP;
1085
1261
  exports.SYMBOL__SET_INTERNALS = SYMBOL__SET_INTERNALS;
1086
1262
  exports.api = api;
1263
+ exports.cloneAndDeepFreeze = cloneAndDeepFreeze;
1087
1264
  exports.createContextProvider = createContextProvider;
1088
1265
  exports.createElement = createElement;
1089
1266
  exports.fallbackTmpl = fallbackTmpl;
1090
1267
  exports.fallbackTmplNoYield = fallbackTmplNoYield;
1268
+ exports.filterProperties = filterProperties;
1091
1269
  exports.freezeTemplate = freezeTemplate;
1092
1270
  exports.getComponentDef = getComponentDef;
1093
1271
  exports.hasScopedStaticStylesheets = hasScopedStaticStylesheets;
@@ -1119,5 +1297,5 @@ exports.track = track;
1119
1297
  exports.unwrap = unwrap;
1120
1298
  exports.validateStyleTextContents = validateStyleTextContents;
1121
1299
  exports.wire = wire;
1122
- /** version: 8.5.0 */
1300
+ /** version: 8.7.0 */
1123
1301
  //# sourceMappingURL=index.cjs.js.map