@sitecore-jss/sitecore-jss-react 23.0.0-canary.8 → 23.0.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.
Files changed (90) hide show
  1. package/LICENSE.txt +202 -202
  2. package/README.md +10 -10
  3. package/dist/cjs/components/Date.js +3 -5
  4. package/dist/cjs/components/ErrorBoundary.js +18 -2
  5. package/dist/cjs/components/Image.js +5 -10
  6. package/dist/cjs/components/Link.js +5 -8
  7. package/dist/cjs/components/Placeholder.js +3 -10
  8. package/dist/cjs/components/PlaceholderCommon.js +8 -44
  9. package/dist/cjs/components/RichText.js +10 -11
  10. package/dist/cjs/components/SitecoreContext.js +0 -8
  11. package/dist/cjs/components/Text.js +3 -6
  12. package/dist/cjs/enhancers/withDatasourceCheck.js +1 -4
  13. package/dist/cjs/enhancers/withPlaceholder.js +2 -2
  14. package/dist/cjs/enhancers/withSitecoreContext.js +1 -2
  15. package/dist/cjs/index.js +1 -28
  16. package/dist/cjs/utils.js +1 -16
  17. package/dist/esm/components/Date.js +2 -5
  18. package/dist/esm/components/ErrorBoundary.js +18 -2
  19. package/dist/esm/components/Image.js +4 -10
  20. package/dist/esm/components/Link.js +5 -8
  21. package/dist/esm/components/Placeholder.js +3 -10
  22. package/dist/esm/components/PlaceholderCommon.js +9 -45
  23. package/dist/esm/components/RichText.js +11 -12
  24. package/dist/esm/components/SitecoreContext.js +0 -8
  25. package/dist/esm/components/Text.js +2 -6
  26. package/dist/esm/enhancers/withDatasourceCheck.js +1 -4
  27. package/dist/esm/enhancers/withPlaceholder.js +2 -2
  28. package/dist/esm/enhancers/withSitecoreContext.js +2 -3
  29. package/dist/esm/index.js +1 -11
  30. package/dist/esm/utils.js +0 -14
  31. package/package.json +3 -6
  32. package/types/ComponentBuilder.d.ts +0 -1
  33. package/types/components/Date.d.ts +2 -4
  34. package/types/components/EditFrame.d.ts +0 -1
  35. package/types/components/ErrorBoundary.d.ts +0 -1
  36. package/types/components/File.d.ts +0 -1
  37. package/types/components/HiddenRendering.d.ts +0 -1
  38. package/types/components/Image.d.ts +2 -4
  39. package/types/components/Link.d.ts +3 -5
  40. package/types/components/MissingComponent.d.ts +0 -1
  41. package/types/components/Placeholder.d.ts +0 -1
  42. package/types/components/PlaceholderCommon.d.ts +5 -4
  43. package/types/components/RichText.d.ts +3 -5
  44. package/types/components/SitecoreContext.d.ts +0 -21
  45. package/types/components/Text.d.ts +2 -4
  46. package/types/components/VisitorIdentification.d.ts +0 -1
  47. package/types/components/sharedTypes.d.ts +1 -8
  48. package/types/enhancers/withComponentFactory.d.ts +0 -1
  49. package/types/enhancers/withDatasourceCheck.d.ts +0 -1
  50. package/types/enhancers/withEditorChromes.d.ts +0 -1
  51. package/types/enhancers/withPlaceholder.d.ts +0 -1
  52. package/types/enhancers/withSitecoreContext.d.ts +1 -3
  53. package/types/index.d.ts +1 -11
  54. package/types/utils.d.ts +0 -9
  55. package/dist/cjs/components/BYOCComponent.js +0 -122
  56. package/dist/cjs/components/BYOCWrapper.js +0 -18
  57. package/dist/cjs/components/DefaultEmptyFieldEditingComponents.js +0 -22
  58. package/dist/cjs/components/DesignLibrary.js +0 -72
  59. package/dist/cjs/components/EditingScripts.js +0 -47
  60. package/dist/cjs/components/FEaaSComponent.js +0 -151
  61. package/dist/cjs/components/FEaaSWrapper.js +0 -18
  62. package/dist/cjs/components/FieldMetadata.js +0 -29
  63. package/dist/cjs/components/Form.js +0 -80
  64. package/dist/cjs/components/PlaceholderMetadata.js +0 -63
  65. package/dist/cjs/enhancers/withEmptyFieldEditingComponent.js +0 -63
  66. package/dist/cjs/enhancers/withFieldMetadata.js +0 -60
  67. package/dist/esm/components/BYOCComponent.js +0 -91
  68. package/dist/esm/components/BYOCWrapper.js +0 -11
  69. package/dist/esm/components/DefaultEmptyFieldEditingComponents.js +0 -14
  70. package/dist/esm/components/DesignLibrary.js +0 -45
  71. package/dist/esm/components/EditingScripts.js +0 -40
  72. package/dist/esm/components/FEaaSComponent.js +0 -119
  73. package/dist/esm/components/FEaaSWrapper.js +0 -11
  74. package/dist/esm/components/FieldMetadata.js +0 -22
  75. package/dist/esm/components/Form.js +0 -52
  76. package/dist/esm/components/PlaceholderMetadata.js +0 -56
  77. package/dist/esm/enhancers/withEmptyFieldEditingComponent.js +0 -36
  78. package/dist/esm/enhancers/withFieldMetadata.js +0 -33
  79. package/types/components/BYOCComponent.d.ts +0 -91
  80. package/types/components/BYOCWrapper.d.ts +0 -4
  81. package/types/components/DefaultEmptyFieldEditingComponents.d.ts +0 -10
  82. package/types/components/DesignLibrary.d.ts +0 -3
  83. package/types/components/EditingScripts.d.ts +0 -8
  84. package/types/components/FEaaSComponent.d.ts +0 -72
  85. package/types/components/FEaaSWrapper.d.ts +0 -4
  86. package/types/components/FieldMetadata.d.ts +0 -18
  87. package/types/components/Form.d.ts +0 -30
  88. package/types/components/PlaceholderMetadata.d.ts +0 -29
  89. package/types/enhancers/withEmptyFieldEditingComponent.d.ts +0 -28
  90. package/types/enhancers/withFieldMetadata.d.ts +0 -17
@@ -10,11 +10,6 @@ const layout_1 = require("@sitecore-jss/sitecore-jss/layout");
10
10
  const sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
11
11
  const utils_1 = require("../utils");
12
12
  const HiddenRendering_1 = require("./HiddenRendering");
13
- const FEaaSComponent_1 = require("./FEaaSComponent");
14
- const FEaaSWrapper_1 = require("./FEaaSWrapper");
15
- const BYOCComponent_1 = require("./BYOCComponent");
16
- const BYOCWrapper_1 = require("./BYOCWrapper");
17
- const PlaceholderMetadata_1 = require("./PlaceholderMetadata");
18
13
  const ErrorBoundary_1 = __importDefault(require("./ErrorBoundary"));
19
14
  class PlaceholderCommon extends react_1.default.Component {
20
15
  constructor(props) {
@@ -25,13 +20,12 @@ class PlaceholderCommon extends react_1.default.Component {
25
20
  this.updateKeyAttributes = this.updateKeyAttributes.bind(this);
26
21
  this.createRawElement = this.createRawElement.bind(this);
27
22
  }
28
- static getPlaceholderDataFromRenderingData(rendering, name, editMode) {
23
+ static getPlaceholderDataFromRenderingData(rendering, name) {
29
24
  let result;
30
- let phName = name.slice();
25
+ const phName = name.slice();
31
26
  /**
32
27
  * Process (SXA) dynamic placeholders
33
28
  * Find and replace the matching dynamic placeholder e.g 'nameOfContainer-{*}' with the requested e.g. 'nameOfContainer-1'.
34
- * For Metadata EditMode, we need to keep the raw placeholder name in place.
35
29
  */
36
30
  if (rendering === null || rendering === void 0 ? void 0 : rendering.placeholders) {
37
31
  Object.keys(rendering.placeholders).forEach((placeholder) => {
@@ -39,13 +33,8 @@ class PlaceholderCommon extends react_1.default.Component {
39
33
  ? (0, layout_1.getDynamicPlaceholderPattern)(placeholder)
40
34
  : null;
41
35
  if (patternPlaceholder && patternPlaceholder.test(phName)) {
42
- if (editMode === layout_1.EditMode.Metadata) {
43
- phName = placeholder;
44
- }
45
- else {
46
- rendering.placeholders[phName] = rendering.placeholders[placeholder];
47
- delete rendering.placeholders[placeholder];
48
- }
36
+ rendering.placeholders[phName] = rendering.placeholders[placeholder];
37
+ delete rendering.placeholders[placeholder];
49
38
  }
50
39
  });
51
40
  }
@@ -78,11 +67,10 @@ class PlaceholderCommon extends react_1.default.Component {
78
67
  });
79
68
  }
80
69
  getComponentsForRenderingData(placeholderData) {
81
- var _a;
82
70
  const { name, fields: placeholderFields, params: placeholderParams, missingComponentComponent, hiddenRenderingComponent, passThroughComponentProps, modifyComponentProps, } = this.props;
83
71
  const transformedComponents = placeholderData
84
72
  .map((rendering, index) => {
85
- var _a, _b;
73
+ var _a;
86
74
  const key = rendering.uid
87
75
  ? rendering.uid
88
76
  : `component-${index}`;
@@ -106,21 +94,6 @@ class PlaceholderCommon extends react_1.default.Component {
106
94
  else {
107
95
  component = this.getComponentForRendering(componentRendering);
108
96
  }
109
- // Fallback/defaults for Sitecore Component renderings (in case not defined in component factory)
110
- if (!component) {
111
- if (componentRendering.componentName === FEaaSComponent_1.FEAAS_COMPONENT_RENDERING_NAME) {
112
- component = FEaaSComponent_1.FEaaSComponent;
113
- }
114
- else if (componentRendering.componentName === FEaaSWrapper_1.FEAAS_WRAPPER_RENDERING_NAME) {
115
- component = FEaaSWrapper_1.FEaaSWrapper;
116
- }
117
- else if (componentRendering.componentName === BYOCComponent_1.BYOC_COMPONENT_RENDERING_NAME) {
118
- component = BYOCComponent_1.BYOCComponent;
119
- }
120
- else if (componentRendering.componentName === BYOCWrapper_1.BYOC_WRAPPER_RENDERING_NAME) {
121
- component = BYOCWrapper_1.BYOCWrapper;
122
- }
123
- }
124
97
  if (!component) {
125
98
  console.error(`Placeholder ${name} contains unknown component ${componentRendering.componentName}. Ensure that a React component exists for it, and that it is registered in your componentFactory.js.`);
126
99
  component = missingComponentComponent !== null && missingComponentComponent !== void 0 ? missingComponentComponent : MissingComponent_1.MissingComponent;
@@ -139,26 +112,15 @@ class PlaceholderCommon extends react_1.default.Component {
139
112
  if (!isEmpty) {
140
113
  // assign type based on passed element - type='text/sitecore' should be ignored when renderEach Placeholder prop function is being used
141
114
  const type = rendered.props.type === 'text/sitecore' ? rendered.props.type : '';
142
- // the registered BYOC components are imported using dynamic(), so we need to account for that when passing the isDynamic prop to ErrorBoundary
143
- const isByocWrapper = componentRendering.componentName === BYOCWrapper_1.BYOC_WRAPPER_RENDERING_NAME;
144
115
  // all dynamic elements will have a separate render prop
145
116
  const isDynamicComponent = !!((_a = component.render) === null || _a === void 0 ? void 0 : _a.preload);
146
117
  // wrapping with error boundary could cause problems in case where parent component uses withPlaceholder HOC and tries to access its children props
147
118
  // that's why we need to expose element's props here
148
- rendered = (react_1.default.createElement(ErrorBoundary_1.default, Object.assign({ key: rendered.type + '-' + index, errorComponent: this.props.errorComponent, componentLoadingMessage: this.props.componentLoadingMessage, type: type, isDynamic: isDynamicComponent || isByocWrapper, disableSuspense: this.props.disableSuspense }, rendered.props), rendered));
149
- }
150
- // if editMode is equal to 'metadata' then emit shallow chromes for hydration in Pages
151
- if (((_b = this.props.sitecoreContext) === null || _b === void 0 ? void 0 : _b.editMode) === layout_1.EditMode.Metadata) {
152
- return (react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: key, rendering: rendering }, rendered));
119
+ rendered = (react_1.default.createElement(ErrorBoundary_1.default, Object.assign({ key: rendered.type + '-' + index, errorComponent: this.props.errorComponent, componentLoadingMessage: this.props.componentLoadingMessage, type: type, isDynamic: isDynamicComponent, disableSuspense: this.props.disableSuspense }, rendered.props), rendered));
153
120
  }
154
121
  return rendered;
155
122
  })
156
123
  .filter((element) => element); // remove nulls
157
- if (((_a = this.props.sitecoreContext) === null || _a === void 0 ? void 0 : _a.editMode) === layout_1.EditMode.Metadata) {
158
- return [
159
- react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: this.props.rendering.uid, placeholderName: name, rendering: this.props.rendering }, transformedComponents),
160
- ];
161
- }
162
124
  return transformedComponents;
163
125
  }
164
126
  getComponentForRendering(renderingDefinition) {
@@ -190,6 +152,8 @@ class PlaceholderCommon extends react_1.default.Component {
190
152
  if (!Array.isArray(attributes) && attributes && attributes.chrometype === 'placeholder') {
191
153
  props.phkey = elem.attributes.key; // props that get rendered as dom attribute names need to be lowercase, otherwise React complains.
192
154
  props.ref = this.addRef; // only need ref for placeholder containers, trying to add it to other components (e.g. stateless components) may result in a warning.
155
+ // EE may mutate chrome
156
+ props.suppressHydrationWarning = true;
193
157
  }
194
158
  return react_1.default.createElement(elem.name, props);
195
159
  }
@@ -36,20 +36,19 @@ var __rest = (this && this.__rest) || function (s, e) {
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
37
  exports.RichText = void 0;
38
38
  const react_1 = __importStar(require("react"));
39
- const withFieldMetadata_1 = require("../enhancers/withFieldMetadata");
40
- const withEmptyFieldEditingComponent_1 = require("../enhancers/withEmptyFieldEditingComponent");
41
- const DefaultEmptyFieldEditingComponents_1 = require("./DefaultEmptyFieldEditingComponents");
42
39
  const layout_1 = require("@sitecore-jss/sitecore-jss/layout");
43
- exports.RichText = (0, withFieldMetadata_1.withFieldMetadata)((0, withEmptyFieldEditingComponent_1.withEmptyFieldEditingComponent)(
44
- // eslint-disable-next-line react/display-name
45
- (0, react_1.forwardRef)((_a, ref) => {
40
+ exports.RichText = (0, react_1.forwardRef)((_a, ref) => {
46
41
  var { field, tag = 'div', editable = true } = _a, otherProps = __rest(_a, ["field", "tag", "editable"]);
47
- if (!field || (!field.editable && (0, layout_1.isFieldValueEmpty)(field))) {
42
+ const html = field && (field.editable && editable ? field.editable : field.value);
43
+ // Keep the object reference stable across re-renders when the html is unchanged,
44
+ // since React DOM compares dangerouslySetInnerHTML by reference and re-sets
45
+ // innerHTML (recreating all child DOM nodes) whenever it changes.
46
+ const dangerouslySetInnerHTML = (0, react_1.useMemo)(() => (html !== undefined && html !== '' ? { __html: html } : undefined), [html]);
47
+ if (!field || (!field.editable && (0, layout_1.isFieldValueEmpty)(field)) || !dangerouslySetInnerHTML) {
48
48
  return null;
49
49
  }
50
- const htmlProps = Object.assign({ dangerouslySetInnerHTML: {
51
- __html: field.editable && editable ? field.editable : field.value,
52
- }, ref }, otherProps);
50
+ const htmlProps = Object.assign(Object.assign({ dangerouslySetInnerHTML,
51
+ ref }, (field.editable && editable ? { suppressHydrationWarning: true } : {})), otherProps);
53
52
  return react_1.default.createElement(tag || 'div', htmlProps);
54
- }), { defaultEmptyFieldEditingComponent: DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentText, isForwardRef: true }), true);
53
+ });
55
54
  exports.RichText.displayName = 'RichText';
@@ -4,15 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.SitecoreContext = exports.ComponentFactoryReactContext = exports.SitecoreContextReactContext = void 0;
7
- /* eslint-disable @typescript-eslint/no-explicit-any */
8
7
  const react_1 = __importDefault(require("react"));
9
8
  const react_2 = __importDefault(require("fast-deep-equal/es6/react"));
10
- const sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
11
9
  exports.SitecoreContextReactContext = react_1.default.createContext({});
12
10
  exports.ComponentFactoryReactContext = react_1.default.createContext({});
13
11
  class SitecoreContext extends react_1.default.Component {
14
12
  constructor(props) {
15
- var _a, _b, _c, _d;
16
13
  super(props);
17
14
  /**
18
15
  * Update context state. Value can be @type {LayoutServiceData} which will be automatically transformed
@@ -27,14 +24,9 @@ class SitecoreContext extends react_1.default.Component {
27
24
  });
28
25
  };
29
26
  const context = this.constructContext(props.layoutData);
30
- let api = props.api;
31
- if (((_b = (_a = props.api) === null || _a === void 0 ? void 0 : _a.edge) === null || _b === void 0 ? void 0 : _b.contextId) && !((_d = (_c = props.api) === null || _c === void 0 ? void 0 : _c.edge) === null || _d === void 0 ? void 0 : _d.edgeUrl)) {
32
- api = Object.assign(Object.assign({}, props.api), { edge: Object.assign(Object.assign({}, props.api.edge), { edgeUrl: sitecore_jss_1.constants.SITECORE_EDGE_URL_DEFAULT }) });
33
- }
34
27
  this.state = {
35
28
  context,
36
29
  setContext: this.setContext,
37
- api,
38
30
  };
39
31
  }
40
32
  constructContext(layoutData) {
@@ -16,18 +16,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.Text = void 0;
18
18
  const react_1 = __importDefault(require("react"));
19
- const withFieldMetadata_1 = require("../enhancers/withFieldMetadata");
20
- const withEmptyFieldEditingComponent_1 = require("../enhancers/withEmptyFieldEditingComponent");
21
- const DefaultEmptyFieldEditingComponents_1 = require("./DefaultEmptyFieldEditingComponents");
22
19
  const layout_1 = require("@sitecore-jss/sitecore-jss/layout");
23
- exports.Text = (0, withFieldMetadata_1.withFieldMetadata)((0, withEmptyFieldEditingComponent_1.withEmptyFieldEditingComponent)((_a) => {
20
+ const Text = (_a) => {
24
21
  var { field, tag, editable = true, encode = true } = _a, otherProps = __rest(_a, ["field", "tag", "editable", "encode"]);
25
22
  if (!field || (!field.editable && (0, layout_1.isFieldValueEmpty)(field))) {
26
23
  return null;
27
24
  }
28
25
  // can't use editable value if we want to output unencoded
29
26
  if (!encode) {
30
- // eslint-disable-next-line no-param-reassign
31
27
  editable = false;
32
28
  }
33
29
  const isEditable = field.editable && editable;
@@ -68,5 +64,6 @@ exports.Text = (0, withFieldMetadata_1.withFieldMetadata)((0, withEmptyFieldEdit
68
64
  else {
69
65
  return react_1.default.createElement(react_1.default.Fragment, null, children);
70
66
  }
71
- }, { defaultEmptyFieldEditingComponent: DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentText }));
67
+ };
68
+ exports.Text = Text;
72
69
  exports.Text.displayName = 'Text';
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.withDatasourceCheck = exports.DefaultEditingError = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
- const layout_1 = require("@sitecore-jss/sitecore-jss/layout");
9
8
  const withSitecoreContext_1 = require("./withSitecoreContext");
10
9
  const DefaultEditingError = () => (react_1.default.createElement("div", { className: "sc-jss-editing-error", role: "alert" }, "Datasource is required. Please choose a content item for this component."));
11
10
  exports.DefaultEditingError = DefaultEditingError;
@@ -22,9 +21,7 @@ function withDatasourceCheck(options) {
22
21
  var _a, _b;
23
22
  const { sitecoreContext } = (0, withSitecoreContext_1.useSitecoreContext)();
24
23
  const EditingError = (_a = options === null || options === void 0 ? void 0 : options.editingErrorComponent) !== null && _a !== void 0 ? _a : exports.DefaultEditingError;
25
- // If the component is rendered in DesignLibrary, we don't need to check for datasource
26
- const isDesignLibrary = (sitecoreContext === null || sitecoreContext === void 0 ? void 0 : sitecoreContext.renderingType) === layout_1.RenderingType.Component;
27
- return isDesignLibrary || ((_b = props.rendering) === null || _b === void 0 ? void 0 : _b.dataSource) ? (react_1.default.createElement(Component, Object.assign({}, props))) : sitecoreContext.pageEditing ? (react_1.default.createElement(EditingError, null)) : null;
24
+ return ((_b = props.rendering) === null || _b === void 0 ? void 0 : _b.dataSource) ? (react_1.default.createElement(Component, Object.assign({}, props))) : sitecoreContext.pageEditing ? (react_1.default.createElement(EditingError, null)) : null;
28
25
  };
29
26
  };
30
27
  }
@@ -42,13 +42,13 @@ function withPlaceholder(placeholders, options) {
42
42
  definitelyArrayPlacholders.forEach((placeholder) => {
43
43
  let placeholderData;
44
44
  if (typeof placeholder !== 'string' && placeholder.placeholder && placeholder.prop) {
45
- placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, placeholder.placeholder, childProps.sitecoreContext.editMode);
45
+ placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, placeholder.placeholder);
46
46
  if (placeholderData) {
47
47
  childProps[placeholder.prop] = this.getComponentsForRenderingData(placeholderData);
48
48
  }
49
49
  }
50
50
  else {
51
- placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, placeholder, childProps.sitecoreContext.editMode);
51
+ placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, placeholder);
52
52
  if (placeholderData) {
53
53
  childProps[placeholder] = this.getComponentsForRenderingData(placeholderData);
54
54
  }
@@ -12,7 +12,7 @@ const SitecoreContext_1 = require("../components/SitecoreContext");
12
12
  function withSitecoreContext(options) {
13
13
  return function withSitecoreContextHoc(Component) {
14
14
  return function WithSitecoreContext(props) {
15
- return (react_1.default.createElement(SitecoreContext_1.SitecoreContextReactContext.Consumer, null, (context) => (react_1.default.createElement(Component, Object.assign({}, props, { sitecoreContext: context.context, api: context.api, updateSitecoreContext: options && options.updatable && context.setContext })))));
15
+ return (react_1.default.createElement(SitecoreContext_1.SitecoreContextReactContext.Consumer, null, (context) => (react_1.default.createElement(Component, Object.assign({}, props, { sitecoreContext: context.context, updateSitecoreContext: options && options.updatable && context.setContext })))));
16
16
  };
17
17
  };
18
18
  }
@@ -42,7 +42,6 @@ function useSitecoreContext(options) {
42
42
  const reactContext = react_1.default.useContext(SitecoreContext_1.SitecoreContextReactContext);
43
43
  const updatable = options === null || options === void 0 ? void 0 : options.updatable;
44
44
  return {
45
- api: reactContext.api,
46
45
  sitecoreContext: reactContext.context,
47
46
  updateSitecoreContext: updatable ? reactContext.setContext : undefined,
48
47
  };
package/dist/cjs/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.withFieldMetadata = exports.ComponentBuilder = exports.EditFrame = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.VisitorIdentification = exports.File = exports.Link = exports.BYOCWrapper = exports.fetchBYOCComponentServerProps = exports.BYOCComponent = exports.DesignLibrary = exports.FEaaSWrapper = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.RichText = exports.getEEMarkup = exports.Image = exports.Form = exports.Placeholder = exports.mediaApi = exports.GraphQLRequestClient = exports.DefaultRetryStrategy = exports.RestDictionaryService = exports.GraphQLDictionaryService = exports.trackingApi = exports.EditMode = exports.getFieldValue = exports.getChildPlaceholder = exports.RestLayoutService = exports.GraphQLLayoutService = exports.LayoutServicePageState = exports.getDesignLibraryStylesheetLinks = exports.getContentStylesheetLink = exports.DefaultEditFrameButtons = exports.DefaultEditFrameButton = exports.resetEditorChromes = exports.isEditorActive = exports.NativeDataFetcher = exports.MemoryCacheClient = exports.ClientError = exports.enableDebug = exports.constants = void 0;
4
- exports.DefaultEmptyFieldEditingComponentImage = exports.DefaultEmptyFieldEditingComponentText = exports.EditingScripts = exports.withEmptyFieldEditingComponent = void 0;
3
+ exports.ComponentBuilder = exports.EditFrame = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.VisitorIdentification = exports.File = exports.Link = exports.DateField = exports.Text = exports.RichText = exports.getEEMarkup = exports.Image = exports.Placeholder = exports.mediaApi = exports.GraphQLRequestClient = exports.DefaultRetryStrategy = exports.RestDictionaryService = exports.GraphQLDictionaryService = exports.trackingApi = exports.getFieldValue = exports.getChildPlaceholder = exports.RestLayoutService = exports.GraphQLLayoutService = exports.LayoutServicePageState = exports.DefaultEditFrameButtons = exports.DefaultEditFrameButton = exports.resetEditorChromes = exports.isEditorActive = exports.NativeDataFetcher = exports.MemoryCacheClient = exports.ClientError = exports.enableDebug = exports.constants = void 0;
5
4
  var sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
6
5
  Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return sitecore_jss_1.constants; } });
7
6
  Object.defineProperty(exports, "enableDebug", { enumerable: true, get: function () { return sitecore_jss_1.enableDebug; } });
@@ -14,14 +13,11 @@ Object.defineProperty(exports, "resetEditorChromes", { enumerable: true, get: fu
14
13
  Object.defineProperty(exports, "DefaultEditFrameButton", { enumerable: true, get: function () { return editing_1.DefaultEditFrameButton; } });
15
14
  Object.defineProperty(exports, "DefaultEditFrameButtons", { enumerable: true, get: function () { return editing_1.DefaultEditFrameButtons; } });
16
15
  var layout_1 = require("@sitecore-jss/sitecore-jss/layout");
17
- Object.defineProperty(exports, "getContentStylesheetLink", { enumerable: true, get: function () { return layout_1.getContentStylesheetLink; } });
18
- Object.defineProperty(exports, "getDesignLibraryStylesheetLinks", { enumerable: true, get: function () { return layout_1.getDesignLibraryStylesheetLinks; } });
19
16
  Object.defineProperty(exports, "LayoutServicePageState", { enumerable: true, get: function () { return layout_1.LayoutServicePageState; } });
20
17
  Object.defineProperty(exports, "GraphQLLayoutService", { enumerable: true, get: function () { return layout_1.GraphQLLayoutService; } });
21
18
  Object.defineProperty(exports, "RestLayoutService", { enumerable: true, get: function () { return layout_1.RestLayoutService; } });
22
19
  Object.defineProperty(exports, "getChildPlaceholder", { enumerable: true, get: function () { return layout_1.getChildPlaceholder; } });
23
20
  Object.defineProperty(exports, "getFieldValue", { enumerable: true, get: function () { return layout_1.getFieldValue; } });
24
- Object.defineProperty(exports, "EditMode", { enumerable: true, get: function () { return layout_1.EditMode; } });
25
21
  var tracking_1 = require("@sitecore-jss/sitecore-jss/tracking");
26
22
  Object.defineProperty(exports, "trackingApi", { enumerable: true, get: function () { return tracking_1.trackingApi; } });
27
23
  var i18n_1 = require("@sitecore-jss/sitecore-jss/i18n");
@@ -34,8 +30,6 @@ var media_1 = require("@sitecore-jss/sitecore-jss/media");
34
30
  Object.defineProperty(exports, "mediaApi", { enumerable: true, get: function () { return media_1.mediaApi; } });
35
31
  var Placeholder_1 = require("./components/Placeholder");
36
32
  Object.defineProperty(exports, "Placeholder", { enumerable: true, get: function () { return Placeholder_1.Placeholder; } });
37
- var Form_1 = require("./components/Form");
38
- Object.defineProperty(exports, "Form", { enumerable: true, get: function () { return Form_1.Form; } });
39
33
  var Image_1 = require("./components/Image");
40
34
  Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return Image_1.Image; } });
41
35
  Object.defineProperty(exports, "getEEMarkup", { enumerable: true, get: function () { return Image_1.getEEMarkup; } });
@@ -45,18 +39,6 @@ var Text_1 = require("./components/Text");
45
39
  Object.defineProperty(exports, "Text", { enumerable: true, get: function () { return Text_1.Text; } });
46
40
  var Date_1 = require("./components/Date");
47
41
  Object.defineProperty(exports, "DateField", { enumerable: true, get: function () { return Date_1.DateField; } });
48
- var FEaaSComponent_1 = require("./components/FEaaSComponent");
49
- Object.defineProperty(exports, "FEaaSComponent", { enumerable: true, get: function () { return FEaaSComponent_1.FEaaSComponent; } });
50
- Object.defineProperty(exports, "fetchFEaaSComponentServerProps", { enumerable: true, get: function () { return FEaaSComponent_1.fetchFEaaSComponentServerProps; } });
51
- var FEaaSWrapper_1 = require("./components/FEaaSWrapper");
52
- Object.defineProperty(exports, "FEaaSWrapper", { enumerable: true, get: function () { return FEaaSWrapper_1.FEaaSWrapper; } });
53
- var DesignLibrary_1 = require("./components/DesignLibrary");
54
- Object.defineProperty(exports, "DesignLibrary", { enumerable: true, get: function () { return DesignLibrary_1.DesignLibrary; } });
55
- var BYOCComponent_1 = require("./components/BYOCComponent");
56
- Object.defineProperty(exports, "BYOCComponent", { enumerable: true, get: function () { return BYOCComponent_1.BYOCComponent; } });
57
- Object.defineProperty(exports, "fetchBYOCComponentServerProps", { enumerable: true, get: function () { return BYOCComponent_1.fetchBYOCComponentServerProps; } });
58
- var BYOCWrapper_1 = require("./components/BYOCWrapper");
59
- Object.defineProperty(exports, "BYOCWrapper", { enumerable: true, get: function () { return BYOCWrapper_1.BYOCWrapper; } });
60
42
  var Link_1 = require("./components/Link");
61
43
  Object.defineProperty(exports, "Link", { enumerable: true, get: function () { return Link_1.Link; } });
62
44
  var File_1 = require("./components/File");
@@ -79,12 +61,3 @@ var EditFrame_1 = require("./components/EditFrame");
79
61
  Object.defineProperty(exports, "EditFrame", { enumerable: true, get: function () { return EditFrame_1.EditFrame; } });
80
62
  var ComponentBuilder_1 = require("./ComponentBuilder");
81
63
  Object.defineProperty(exports, "ComponentBuilder", { enumerable: true, get: function () { return ComponentBuilder_1.ComponentBuilder; } });
82
- var withFieldMetadata_1 = require("./enhancers/withFieldMetadata");
83
- Object.defineProperty(exports, "withFieldMetadata", { enumerable: true, get: function () { return withFieldMetadata_1.withFieldMetadata; } });
84
- var withEmptyFieldEditingComponent_1 = require("./enhancers/withEmptyFieldEditingComponent");
85
- Object.defineProperty(exports, "withEmptyFieldEditingComponent", { enumerable: true, get: function () { return withEmptyFieldEditingComponent_1.withEmptyFieldEditingComponent; } });
86
- var EditingScripts_1 = require("./components/EditingScripts");
87
- Object.defineProperty(exports, "EditingScripts", { enumerable: true, get: function () { return EditingScripts_1.EditingScripts; } });
88
- var DefaultEmptyFieldEditingComponents_1 = require("./components/DefaultEmptyFieldEditingComponents");
89
- Object.defineProperty(exports, "DefaultEmptyFieldEditingComponentText", { enumerable: true, get: function () { return DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentText; } });
90
- Object.defineProperty(exports, "DefaultEmptyFieldEditingComponentImage", { enumerable: true, get: function () { return DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentImage; } });
package/dist/cjs/utils.js CHANGED
@@ -11,8 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
11
11
  return t;
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.getDataFromFields = exports.getAttributesString = exports.addClassName = exports.convertAttributesToReactProps = exports.convertStyleAttribute = exports.convertKebabCasetoCamelCase = void 0;
15
- const layout_1 = require("@sitecore-jss/sitecore-jss/layout");
14
+ exports.getAttributesString = exports.addClassName = exports.convertAttributesToReactProps = exports.convertStyleAttribute = exports.convertKebabCasetoCamelCase = void 0;
16
15
  const style_attr_1 = require("style-attr");
17
16
  // https://stackoverflow.com/a/10426674/9324
18
17
  const convertKebabCasetoCamelCase = (str) => str.replace(/^.|-./g, (letter, index) => index === 0 ? letter.toLowerCase() : letter.substr(1).toUpperCase());
@@ -102,17 +101,3 @@ const getAttributesString = (attributes) => {
102
101
  return attributesEntries.join(' ');
103
102
  };
104
103
  exports.getAttributesString = getAttributesString;
105
- /**
106
- * Used in FEAAS and BYOC implementations to convert datasource item field values into component props
107
- * @param {ComponentFields} fields field collection from Sitecore
108
- * @returns JSON object that can be used as props
109
- */
110
- const getDataFromFields = (fields) => {
111
- let data = {};
112
- data = Object.entries(fields).reduce((acc, [key]) => {
113
- acc[key] = (0, layout_1.getFieldValue)(fields, key);
114
- return acc;
115
- }, data);
116
- return data;
117
- };
118
- exports.getDataFromFields = getDataFromFields;
@@ -10,11 +10,8 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  return t;
11
11
  };
12
12
  import React from 'react';
13
- import { withFieldMetadata } from '../enhancers/withFieldMetadata';
14
- import { withEmptyFieldEditingComponent } from '../enhancers/withEmptyFieldEditingComponent';
15
- import { DefaultEmptyFieldEditingComponentText } from './DefaultEmptyFieldEditingComponents';
16
13
  import { isFieldValueEmpty } from '@sitecore-jss/sitecore-jss/layout';
17
- export const DateField = withFieldMetadata(withEmptyFieldEditingComponent((_a) => {
14
+ export const DateField = (_a) => {
18
15
  var { field, tag, editable = true, render } = _a, otherProps = __rest(_a, ["field", "tag", "editable", "render"]);
19
16
  if (!field || (!field.editable && isFieldValueEmpty(field))) {
20
17
  return null;
@@ -38,5 +35,5 @@ export const DateField = withFieldMetadata(withEmptyFieldEditingComponent((_a) =
38
35
  else {
39
36
  return React.createElement(React.Fragment, null, children);
40
37
  }
41
- }, { defaultEmptyFieldEditingComponent: DefaultEmptyFieldEditingComponentText }));
38
+ };
42
39
  DateField.displayName = 'Date';
@@ -27,6 +27,11 @@ class ErrorBoundary extends React.Component {
27
27
  ((_a = this.props.sitecoreContext) === null || _a === void 0 ? void 0 : _a.pageState) === LayoutServicePageState.Edit ||
28
28
  ((_b = this.props.sitecoreContext) === null || _b === void 0 ? void 0 : _b.pageState) === LayoutServicePageState.Preview);
29
29
  }
30
+ isPageEditing() {
31
+ var _a, _b;
32
+ return (!!((_a = this.props.sitecoreContext) === null || _a === void 0 ? void 0 : _a.pageEditing) ||
33
+ ((_b = this.props.sitecoreContext) === null || _b === void 0 ? void 0 : _b.pageState) === LayoutServicePageState.Edit);
34
+ }
30
35
  render() {
31
36
  var _a, _b;
32
37
  if (this.state.error) {
@@ -51,10 +56,21 @@ class ErrorBoundary extends React.Component {
51
56
  }
52
57
  }
53
58
  // do not apply suspense when suspense is disabled or when on already dynamic components
59
+ let content;
54
60
  if (((_b = this.props.disableSuspense) !== null && _b !== void 0 ? _b : true) || this.props.isDynamic) {
55
- return this.props.children;
61
+ content = this.props.children;
62
+ }
63
+ else {
64
+ content = (React.createElement(Suspense, { fallback: React.createElement("h4", null, this.props.componentLoadingMessage || this.defaultLoadingMessage) }, this.props.children));
65
+ }
66
+ // Experience Editor tags the outermost DOM node of each rendering (sc-part-of,
67
+ // scEnabledChrome) after SSR. Own that node in the SDK during editing so hydration
68
+ // mismatches can be suppressed without requiring suppressHydrationWarning on every
69
+ // app component. `display: contents` keeps SXA/Bootstrap column layout intact.
70
+ if (this.isPageEditing()) {
71
+ return (React.createElement("div", { suppressHydrationWarning: true, style: { display: 'contents' } }, content));
56
72
  }
57
- return (React.createElement(Suspense, { fallback: React.createElement("h4", null, this.props.componentLoadingMessage || this.defaultLoadingMessage) }, this.props.children));
73
+ return content;
58
74
  }
59
75
  }
60
76
  export default withSitecoreContext()(ErrorBoundary);
@@ -13,14 +13,12 @@ import { mediaApi } from '@sitecore-jss/sitecore-jss/media';
13
13
  import React from 'react';
14
14
  import { addClassName, convertAttributesToReactProps } from '../utils';
15
15
  import { getAttributesString } from '../utils';
16
- import { withFieldMetadata } from '../enhancers/withFieldMetadata';
17
- import { withEmptyFieldEditingComponent } from '../enhancers/withEmptyFieldEditingComponent';
18
- import { DefaultEmptyFieldEditingComponentImage } from './DefaultEmptyFieldEditingComponents';
19
16
  import { isFieldValueEmpty } from '@sitecore-jss/sitecore-jss/layout';
20
17
  const getEditableWrapper = (editableMarkup, ...otherProps) => (
21
18
  // create an inline wrapper and use dangerouslySetInnerHTML.
22
19
  // if we try to parse the EE value, the parser will strip invalid or disallowed attributes from html elements - and EE uses several
23
- React.createElement("span", Object.assign({ className: "sc-image-wrapper" }, otherProps, { dangerouslySetInnerHTML: { __html: editableMarkup } })));
20
+ // Experience Editor rewrites this chrome markup client-side after SSR.
21
+ React.createElement("span", Object.assign({ className: "sc-image-wrapper", suppressHydrationWarning: true }, otherProps, { dangerouslySetInnerHTML: { __html: editableMarkup } })));
24
22
  const getImageAttrs = (_a, imageParams, mediaUrlPrefix) => {
25
23
  var { src, srcSet } = _a, otherAttrs = __rest(_a, ["src", "srcSet"]);
26
24
  if (!src) {
@@ -62,7 +60,7 @@ export const getEEMarkup = (imageField, imageParams, mediaUrlPrefix, otherProps)
62
60
  const editableMarkup = imageField.editable.replace(foundImg.imgTag, imgHtml);
63
61
  return getEditableWrapper(editableMarkup);
64
62
  };
65
- export const Image = withFieldMetadata(withEmptyFieldEditingComponent((_a) => {
63
+ export const Image = (_a) => {
66
64
  var { editable = true, imageParams, field, mediaUrlPrefix } = _a, otherProps = __rest(_a, ["editable", "imageParams", "field", "mediaUrlPrefix"]);
67
65
  const dynamicMedia = field;
68
66
  if (!field || (!dynamicMedia.editable && isFieldValueEmpty(dynamicMedia))) {
@@ -79,14 +77,10 @@ export const Image = withFieldMetadata(withEmptyFieldEditingComponent((_a) => {
79
77
  if (!img) {
80
78
  return null;
81
79
  }
82
- // prevent metadata from being passed to the img tag
83
- if (img.metadata) {
84
- delete img.metadata;
85
- }
86
80
  const attrs = getImageAttrs(Object.assign(Object.assign({}, img), otherProps), imageParams, mediaUrlPrefix);
87
81
  if (attrs) {
88
82
  return React.createElement("img", Object.assign({}, attrs));
89
83
  }
90
84
  return null; // we can't handle the truth
91
- }, { defaultEmptyFieldEditingComponent: DefaultEmptyFieldEditingComponentImage }));
85
+ };
92
86
  Image.displayName = 'Image';
@@ -10,13 +10,8 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  return t;
11
11
  };
12
12
  import React, { forwardRef } from 'react';
13
- import { withFieldMetadata } from '../enhancers/withFieldMetadata';
14
- import { withEmptyFieldEditingComponent } from '../enhancers/withEmptyFieldEditingComponent';
15
- import { DefaultEmptyFieldEditingComponentText } from './DefaultEmptyFieldEditingComponents';
16
13
  import { isFieldValueEmpty } from '@sitecore-jss/sitecore-jss/layout';
17
- export const Link = withFieldMetadata(withEmptyFieldEditingComponent(
18
- // eslint-disable-next-line react/display-name
19
- forwardRef((_a, ref) => {
14
+ export const Link = forwardRef((_a, ref) => {
20
15
  var { field, editable = true, showLinkTextWithChildrenPresent } = _a, otherProps = __rest(_a, ["field", "editable", "showLinkTextWithChildrenPresent"]);
21
16
  const children = otherProps.children;
22
17
  const dynamicField = field;
@@ -31,7 +26,9 @@ forwardRef((_a, ref) => {
31
26
  // However, we cannot combine arbitrary unparsed HTML (innerHTML) based components with actual vDOM components (the children)
32
27
  // because the innerHTML is not parsed - it'd make a discontinuous vDOM. So, we'll go for the next best compromise of rendering the link field and children separately
33
28
  // as siblings. Should be "good enough" for most cases - and write your own helper if it isn't. Or bring xEditor out of 2006.
34
- const htmlProps = Object.assign(Object.assign({ className: 'sc-link-wrapper', dangerouslySetInnerHTML: {
29
+ const htmlProps = Object.assign(Object.assign({ className: 'sc-link-wrapper',
30
+ // Experience Editor rewrites this chrome markup client-side after SSR.
31
+ suppressHydrationWarning: true, dangerouslySetInnerHTML: {
35
32
  __html: markup,
36
33
  } }, otherProps), { key: 'editable' });
37
34
  // Exclude children, since 'dangerouslySetInnerHTML' and 'children' can't be set together
@@ -66,5 +63,5 @@ forwardRef((_a, ref) => {
66
63
  const linkText = showLinkTextWithChildrenPresent || !children ? link.text || link.href : null;
67
64
  resultTags.push(React.createElement('a', Object.assign(Object.assign(Object.assign({}, anchorAttrs), otherProps), { key: 'link', ref }), linkText, children));
68
65
  return React.createElement(React.Fragment, null, resultTags);
69
- }), { defaultEmptyFieldEditingComponent: DefaultEmptyFieldEditingComponentText, isForwardRef: true }), true);
66
+ });
70
67
  Link.displayName = 'Link';
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { PlaceholderCommon } from './PlaceholderCommon';
3
3
  import { withComponentFactory } from '../enhancers/withComponentFactory';
4
- import { HorizonEditor } from '@sitecore-jss/sitecore-jss/editing';
5
4
  import { withSitecoreContext } from '../enhancers/withSitecoreContext';
6
5
  /**
7
6
  * @param {HtmlElementRendering | ComponentRendering} rendering
@@ -15,12 +14,6 @@ class PlaceholderComponent extends PlaceholderCommon {
15
14
  super(props);
16
15
  this.isEmpty = false;
17
16
  }
18
- componentDidMount() {
19
- super.componentDidMount();
20
- if (this.isEmpty && HorizonEditor.isActive()) {
21
- HorizonEditor.resetChromes();
22
- }
23
- }
24
17
  /**
25
18
  * In case we need to render an empty placeholder, some part of the markup will be inserted by the EE,
26
19
  * so we need to separate the empty placeholder's markup and allow React reconciliation to be executed correctly
@@ -29,10 +22,10 @@ class PlaceholderComponent extends PlaceholderCommon {
29
22
  * @returns react node
30
23
  */
31
24
  renderEmptyPlaceholder(node) {
32
- return React.createElement("div", { className: "sc-jss-empty-placeholder" }, node);
25
+ // Experience Editor may mutate empty-placeholder chrome between SSR and hydration.
26
+ return (React.createElement("div", { className: "sc-jss-empty-placeholder", suppressHydrationWarning: true }, node));
33
27
  }
34
28
  render() {
35
- var _a;
36
29
  const childProps = Object.assign({}, this.props);
37
30
  delete childProps.componentFactory;
38
31
  if (this.state.error) {
@@ -45,7 +38,7 @@ class PlaceholderComponent extends PlaceholderCommon {
45
38
  "."));
46
39
  }
47
40
  const renderingData = childProps.rendering;
48
- const placeholderData = PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, this.props.name, (_a = this.props.sitecoreContext) === null || _a === void 0 ? void 0 : _a.editMode);
41
+ const placeholderData = PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, this.props.name);
49
42
  this.isEmpty = placeholderData.every((rendering) => isRawRendering(rendering));
50
43
  const components = this.getComponentsForRenderingData(placeholderData);
51
44
  if (this.props.renderEmpty && this.isEmpty) {