@lwc/ssr-runtime 8.4.0 → 8.5.0

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.cjs.js CHANGED
@@ -150,6 +150,8 @@ defineProperty,
150
150
  entries,
151
151
  /** Detached {@linkcode Object.freeze}; see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze MDN Reference}. */
152
152
  freeze,
153
+ /** Detached {@linkcode Object.fromEntries}; see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries MDN Reference}. */
154
+ fromEntries,
153
155
  /** Detached {@linkcode Object.getOwnPropertyDescriptor}; see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor MDN Reference}. */
154
156
  getOwnPropertyDescriptor,
155
157
  /** Detached {@linkcode Object.getOwnPropertyDescriptors}; see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors MDN Reference}. */
@@ -332,7 +334,19 @@ function htmlEscape(str, attrMode = false) {
332
334
  const searchValue = attrMode ? /["&]/g : /["'<>&]/g;
333
335
  return str.replace(searchValue, (char) => ESCAPED_CHARS[char]);
334
336
  }
335
- /** version: 8.4.0 */
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 */
336
350
 
337
351
  /*
338
352
  * Copyright (c) 2024, Salesforce, Inc.
@@ -381,8 +395,102 @@ const mutationTracker = new MutationTracker();
381
395
  * SPDX-License-Identifier: MIT
382
396
  * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
383
397
  */
384
- // Eventually include globals that also reflect
385
- const attrsToProps = AriaAttrNameToPropNameMap;
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
+ });
414
+ /**
415
+ * Descriptor for IDL attribute reflections that merely reflect the string, e.g. `title`.
416
+ */
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
+ });
447
+ /**
448
+ * Descriptor for a "true" boolean attribute that checks solely for presence, e.g. `hidden`.
449
+ */
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
+ });
470
+ /**
471
+ * Descriptor for ARIA reflections, e.g. `ariaLabel` and `role`.
472
+ */
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
+ }
491
+ }
492
+ },
493
+ });
386
494
  function reflectAttrToProp(instance, attrName, attrValue) {
387
495
  const reflectedPropName = attrsToProps[attrName];
388
496
  // If it is a reflected property and it was not overridden by the instance
@@ -393,30 +501,34 @@ function reflectAttrToProp(instance, attrName, attrValue) {
393
501
  }
394
502
  }
395
503
  }
396
- const descriptors = create(null);
397
- for (const [attrName, propName] of entries(attrsToProps)) {
398
- descriptors[propName] = {
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: {
399
513
  get() {
400
- return this.getAttribute(attrName);
514
+ const str = this.getAttribute('tabindex');
515
+ const num = Number(str);
516
+ return isFinite(num) ? Math.trunc(num) : -1;
401
517
  },
402
518
  set(newValue) {
403
- const currentValue = this.getAttribute(attrName);
404
- if (newValue !== currentValue) {
405
- // TODO [#3284]: According to the spec, IDL nullable type values
406
- // (null and undefined) should remove the attribute; however, we
407
- // only do so in the case of null for historical reasons.
408
- // See also https://github.com/w3c/aria/issues/1858
409
- if (isNull(newValue)) {
410
- this.removeAttribute(attrName);
411
- }
412
- else {
413
- this.setAttribute(attrName, toString(newValue));
414
- }
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));
415
524
  }
416
525
  },
417
- configurable: true,
418
- enumerable: true,
419
- };
526
+ },
527
+ title: stringDescriptor('title'),
528
+ };
529
+ // Add descriptors for ARIA attributes
530
+ for (const [attrName, propName] of entries(AriaAttrNameToPropNameMap)) {
531
+ descriptors[propName] = ariaDescriptor(attrName);
420
532
  }
421
533
 
422
534
  /*
@@ -427,6 +539,7 @@ for (const [attrName, propName] of entries(attrsToProps)) {
427
539
  */
428
540
  var _LightningElement_attrs, _LightningElement_classList;
429
541
  const SYMBOL__SET_INTERNALS = Symbol('set-internals');
542
+ const SYMBOL__GENERATE_MARKUP = Symbol('generate-markup');
430
543
  class LightningElement {
431
544
  constructor(propsAvailableAtConstruction) {
432
545
  this.isConnected = false;
@@ -603,21 +716,26 @@ function fallbackTmplNoYield(emit, _props, _attrs, _slotted, Cmp, _instance) {
603
716
  emit('<template shadowrootmode="open"></template>');
604
717
  }
605
718
  }
606
- async function serverSideRenderComponent(tagName, compiledGenerateMarkup, props, mode = 'asyncYield') {
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}`);
722
+ }
723
+ // TODO [#4726]: remove `generateMarkup` export
724
+ const generateMarkup = SYMBOL__GENERATE_MARKUP in Component ? Component[SYMBOL__GENERATE_MARKUP] : Component;
607
725
  let markup = '';
608
726
  const emit = (segment) => {
609
727
  markup += segment;
610
728
  };
611
729
  if (mode === 'asyncYield') {
612
- for await (const segment of compiledGenerateMarkup(tagName, props, null, null)) {
730
+ for await (const segment of generateMarkup(tagName, props, null, null)) {
613
731
  markup += segment;
614
732
  }
615
733
  }
616
734
  else if (mode === 'async') {
617
- await compiledGenerateMarkup(emit, tagName, props, null, null);
735
+ await generateMarkup(emit, tagName, props, null, null);
618
736
  }
619
737
  else if (mode === 'sync') {
620
- compiledGenerateMarkup(emit, tagName, props, null, null);
738
+ generateMarkup(emit, tagName, props, null, null);
621
739
  }
622
740
  else {
623
741
  throw new Error(`Invalid mode: ${mode}`);
@@ -931,8 +1049,39 @@ function validateStyleTextContents(contents) {
931
1049
  }
932
1050
  }
933
1051
 
1052
+ /*
1053
+ * Copyright (c) 2024, Salesforce, Inc.
1054
+ * All rights reserved.
1055
+ * SPDX-License-Identifier: MIT
1056
+ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
1057
+ */
1058
+ function hasScopedStaticStylesheets(Component) {
1059
+ const { stylesheets } = Component;
1060
+ if (stylesheets) {
1061
+ return flattenStylesheets(stylesheets).some((stylesheet) => stylesheet.$scoped$);
1062
+ }
1063
+ return false;
1064
+ }
1065
+ function renderStylesheets(stylesheets, scopeToken, Component, hasScopedTemplateStyles) {
1066
+ const hasAnyScopedStyles = hasScopedTemplateStyles || hasScopedStaticStylesheets(Component);
1067
+ let result = '';
1068
+ const truthyStylesheets = stylesheets.filter(Boolean);
1069
+ for (const stylesheet of flattenStylesheets(truthyStylesheets)) {
1070
+ // TODO [#2869]: `<style>`s should not have scope token classes
1071
+ result += `<style${hasAnyScopedStyles ? ` class="${scopeToken}"` : ''} type="text/css">`;
1072
+ const token = stylesheet.$scoped$ ? scopeToken : undefined;
1073
+ const useActualHostSelector = !stylesheet.$scoped$ || Component.renderMode !== 'light';
1074
+ const useNativeDirPseudoclass = true;
1075
+ const styleContents = stylesheet(token, useActualHostSelector, useNativeDirPseudoclass);
1076
+ validateStyleTextContents(styleContents);
1077
+ result += styleContents + '</style>';
1078
+ }
1079
+ return result;
1080
+ }
1081
+
934
1082
  exports.ClassList = ClassList;
935
1083
  exports.LightningElement = LightningElement;
1084
+ exports.SYMBOL__GENERATE_MARKUP = SYMBOL__GENERATE_MARKUP;
936
1085
  exports.SYMBOL__SET_INTERNALS = SYMBOL__SET_INTERNALS;
937
1086
  exports.api = api;
938
1087
  exports.createContextProvider = createContextProvider;
@@ -941,6 +1090,7 @@ exports.fallbackTmpl = fallbackTmpl;
941
1090
  exports.fallbackTmplNoYield = fallbackTmplNoYield;
942
1091
  exports.freezeTemplate = freezeTemplate;
943
1092
  exports.getComponentDef = getComponentDef;
1093
+ exports.hasScopedStaticStylesheets = hasScopedStaticStylesheets;
944
1094
  exports.hot = hot;
945
1095
  exports.htmlEscape = htmlEscape;
946
1096
  exports.isComponentConstructor = isComponentConstructor;
@@ -954,6 +1104,7 @@ exports.registerTemplate = registerTemplate;
954
1104
  exports.renderAttrs = renderAttrs;
955
1105
  exports.renderAttrsNoYield = renderAttrsNoYield;
956
1106
  exports.renderComponent = serverSideRenderComponent;
1107
+ exports.renderStylesheets = renderStylesheets;
957
1108
  exports.renderer = renderer;
958
1109
  exports.sanitizeAttribute = sanitizeAttribute;
959
1110
  exports.serverSideRenderComponent = serverSideRenderComponent;
@@ -968,5 +1119,5 @@ exports.track = track;
968
1119
  exports.unwrap = unwrap;
969
1120
  exports.validateStyleTextContents = validateStyleTextContents;
970
1121
  exports.wire = wire;
971
- /** version: 8.4.0 */
1122
+ /** version: 8.5.0 */
972
1123
  //# sourceMappingURL=index.cjs.js.map