@sitecore-content-sdk/react 1.2.0-canary.8 → 1.2.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 (104) hide show
  1. package/LICENSE.txt +202 -202
  2. package/README.md +11 -11
  3. package/dist/cjs/components/ClientEditingChromesUpdate.js +52 -0
  4. package/dist/cjs/components/DefaultEmptyFieldEditingComponents.js +4 -4
  5. package/dist/cjs/components/DesignLibrary.js +85 -103
  6. package/dist/cjs/components/EditingScripts.js +1 -0
  7. package/dist/cjs/components/ErrorBoundary.js +1 -0
  8. package/dist/cjs/components/FEaaS/BYOCServerWrapper.js +28 -0
  9. package/dist/cjs/components/{BYOCComponent.js → FEaaS/BYOCWrapper.js} +17 -28
  10. package/dist/cjs/components/FEaaS/FEaaSSeverWrapper.js +34 -0
  11. package/dist/cjs/components/FEaaS/FEaaSWrapper.js +78 -0
  12. package/dist/cjs/components/{FEaaSComponent.js → FEaaS/feaas-utils.js} +18 -35
  13. package/dist/cjs/components/FEaaS/index.js +21 -0
  14. package/dist/cjs/components/FEaaS/models.js +7 -0
  15. package/dist/cjs/components/Link.js +1 -1
  16. package/dist/cjs/components/Placeholder/AppPlaceholder.js +76 -0
  17. package/dist/cjs/components/Placeholder/ClientComponentWrapper.js +21 -0
  18. package/dist/cjs/components/Placeholder/Placeholder.js +110 -0
  19. package/dist/cjs/components/Placeholder/index.js +25 -0
  20. package/dist/cjs/components/Placeholder/models.js +18 -0
  21. package/dist/cjs/components/Placeholder/placeholder-utils.js +215 -0
  22. package/dist/cjs/components/RichText.js +1 -0
  23. package/dist/cjs/components/Text.js +1 -0
  24. package/dist/cjs/enhancers/withAppPlaceholder.js +21 -0
  25. package/dist/cjs/enhancers/withEmptyFieldEditingComponent.js +12 -5
  26. package/dist/cjs/enhancers/withPlaceholder.js +8 -6
  27. package/dist/cjs/index.js +17 -11
  28. package/dist/cjs/rsc-utils/no-rsc.js +5 -0
  29. package/dist/cjs/rsc-utils/rsc.js +5 -0
  30. package/dist/esm/components/ClientEditingChromesUpdate.js +15 -0
  31. package/dist/esm/components/DefaultEmptyFieldEditingComponents.js +4 -4
  32. package/dist/esm/components/DesignLibrary.js +85 -102
  33. package/dist/esm/components/EditingScripts.js +1 -0
  34. package/dist/esm/components/ErrorBoundary.js +1 -0
  35. package/dist/esm/components/FEaaS/BYOCServerWrapper.js +21 -0
  36. package/dist/esm/components/{BYOCComponent.js → FEaaS/BYOCWrapper.js} +15 -26
  37. package/dist/esm/components/FEaaS/FEaaSSeverWrapper.js +27 -0
  38. package/dist/esm/components/FEaaS/FEaaSWrapper.js +37 -0
  39. package/dist/esm/components/{FEaaSComponent.js → FEaaS/feaas-utils.js} +16 -30
  40. package/dist/esm/components/FEaaS/index.js +6 -0
  41. package/dist/esm/components/FEaaS/models.js +4 -0
  42. package/dist/esm/components/Link.js +1 -1
  43. package/dist/esm/components/Placeholder/AppPlaceholder.js +69 -0
  44. package/dist/esm/components/Placeholder/ClientComponentWrapper.js +14 -0
  45. package/dist/esm/components/Placeholder/Placeholder.js +103 -0
  46. package/dist/esm/components/Placeholder/index.js +4 -0
  47. package/dist/esm/components/Placeholder/models.js +15 -0
  48. package/dist/esm/components/Placeholder/placeholder-utils.js +203 -0
  49. package/dist/esm/components/RichText.js +1 -0
  50. package/dist/esm/components/Text.js +1 -0
  51. package/dist/esm/enhancers/withAppPlaceholder.js +14 -0
  52. package/dist/esm/enhancers/withEmptyFieldEditingComponent.js +12 -5
  53. package/dist/esm/enhancers/withPlaceholder.js +8 -6
  54. package/dist/esm/index.js +5 -5
  55. package/dist/esm/rsc-utils/no-rsc.js +2 -0
  56. package/dist/esm/rsc-utils/rsc.js +2 -0
  57. package/package.json +16 -4
  58. package/types/components/ClientEditingChromesUpdate.d.ts +6 -0
  59. package/types/components/Date.d.ts +1 -1
  60. package/types/components/DefaultEmptyFieldEditingComponents.d.ts +8 -2
  61. package/types/components/DesignLibrary.d.ts +13 -13
  62. package/types/components/ErrorBoundary.d.ts +0 -1
  63. package/types/components/FEaaS/BYOCServerWrapper.d.ts +3 -0
  64. package/types/components/FEaaS/BYOCWrapper.d.ts +25 -0
  65. package/types/components/FEaaS/FEaaSSeverWrapper.d.ts +8 -0
  66. package/types/components/FEaaS/FEaaSWrapper.d.ts +7 -0
  67. package/types/components/FEaaS/feaas-utils.d.ts +21 -0
  68. package/types/components/FEaaS/index.d.ts +6 -0
  69. package/types/components/FEaaS/models.d.ts +125 -0
  70. package/types/components/Image.d.ts +1 -1
  71. package/types/components/Link.d.ts +1 -1
  72. package/types/components/Placeholder/AppPlaceholder.d.ts +10 -0
  73. package/types/components/Placeholder/ClientComponentWrapper.d.ts +9 -0
  74. package/types/components/Placeholder/Placeholder.d.ts +28 -0
  75. package/types/components/Placeholder/index.d.ts +5 -0
  76. package/types/components/Placeholder/models.d.ts +140 -0
  77. package/types/components/Placeholder/placeholder-utils.d.ts +53 -0
  78. package/types/components/RichText.d.ts +1 -1
  79. package/types/components/Text.d.ts +1 -1
  80. package/types/components/sharedTypes/components.d.ts +6 -0
  81. package/types/components/sharedTypes/props.d.ts +2 -2
  82. package/types/enhancers/withAppPlaceholder.d.ts +15 -0
  83. package/types/enhancers/withEmptyFieldEditingComponent.d.ts +3 -3
  84. package/types/enhancers/withPlaceholder.d.ts +2 -1
  85. package/types/index.d.ts +4 -5
  86. package/types/rsc-utils/no-rsc.d.ts +1 -0
  87. package/types/rsc-utils/rsc.d.ts +1 -0
  88. package/dist/cjs/components/BYOCWrapper.js +0 -22
  89. package/dist/cjs/components/FEaaSWrapper.js +0 -19
  90. package/dist/cjs/components/Placeholder.js +0 -68
  91. package/dist/cjs/components/PlaceholderCommon.js +0 -176
  92. package/dist/esm/components/BYOCWrapper.js +0 -15
  93. package/dist/esm/components/FEaaSWrapper.js +0 -12
  94. package/dist/esm/components/Placeholder.js +0 -62
  95. package/dist/esm/components/PlaceholderCommon.js +0 -169
  96. package/types/components/BYOCComponent.d.ts +0 -93
  97. package/types/components/BYOCWrapper.d.ts +0 -7
  98. package/types/components/FEaaSComponent.d.ts +0 -72
  99. package/types/components/FEaaSWrapper.d.ts +0 -4
  100. package/types/components/Placeholder.d.ts +0 -20
  101. package/types/components/PlaceholderCommon.d.ts +0 -89
  102. /package/dist/cjs/components/{PlaceholderMetadata.js → Placeholder/PlaceholderMetadata.js} +0 -0
  103. /package/dist/esm/components/{PlaceholderMetadata.js → Placeholder/PlaceholderMetadata.js} +0 -0
  104. /package/types/components/{PlaceholderMetadata.d.ts → Placeholder/PlaceholderMetadata.d.ts} +0 -0
@@ -43,7 +43,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
43
43
  });
44
44
  };
45
45
  Object.defineProperty(exports, "__esModule", { value: true });
46
- exports.DesignLibrary = exports.VariantGeneration = exports.__mockDependencies = void 0;
46
+ exports.DesignLibrary = exports.__mockDependencies = void 0;
47
47
  /* eslint-disable jsdoc/require-param */
48
48
  /* eslint-disable prefer-const */
49
49
  const react_1 = __importStar(require("react"));
@@ -52,55 +52,31 @@ const layout_1 = require("@sitecore-content-sdk/core/layout");
52
52
  const editing_1 = require("@sitecore-content-sdk/core/editing");
53
53
  const codegen = __importStar(require("@sitecore-content-sdk/core/codegen"));
54
54
  const withSitecore_1 = require("../enhancers/withSitecore");
55
+ const Placeholder_2 = require("./Placeholder");
55
56
  let { getDesignLibraryImportMapEvent, getDesignLibraryComponentPropsEvent, addComponentPreviewHandler, } = codegen;
56
57
  const __mockDependencies = (mocks) => {
57
58
  addComponentPreviewHandler = mocks.addComponentPreviewHandler;
58
59
  };
59
60
  exports.__mockDependencies = __mockDependencies;
60
- /**
61
- * This component is used to render the component in preview mode.
62
- * It is used to send the rendered event to the parent window and render the component.
63
- * Reacts on the update event from the parent window and re-renders the component.
64
- */
65
- const Preview = () => {
66
- const { page } = (0, withSitecore_1.useSitecore)();
67
- const { layout: { sitecore: { route }, }, } = page;
68
- const [renderKey, setRenderKey] = (0, react_1.useState)(0);
69
- const [rootUpdate, setRootUpdate] = (0, react_1.useState)(null);
70
- const rootComponent = route === null || route === void 0 ? void 0 : route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER][0];
71
- // useEffect may execute multiple times on single render (i.e. in dev) - but we only want to fire ready event once
72
- let componentReady = false;
73
- // have an up-to-date layout state between re-renders (SSR re-render excluded)
74
- const persistedRoot = (0, react_1.useMemo)(() => (Object.assign(Object.assign({}, (rootComponent || {})), rootUpdate)), [rootComponent, rootUpdate]);
75
- route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER][0] = persistedRoot;
76
- (0, react_1.useEffect)(() => {
77
- // useEffect will fire when components are ready - and we inform the whole wide world of it too
78
- if (!componentReady) {
79
- componentReady = true;
80
- window.top.postMessage((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.READY, rootComponent.uid), '*');
81
- }
82
- const unsubscribe = (0, editing_1.addComponentUpdateHandler)(persistedRoot, (updatedRoot) => {
83
- setRootUpdate(Object.assign({}, updatedRoot));
84
- setRenderKey((key) => key + 1);
85
- });
86
- // useEffect will cleanup event handler on re-render
87
- return unsubscribe;
88
- }, []);
89
- (0, react_1.useEffect)(() => {
90
- // Send a rendered event only as effect of a component update command
91
- if (renderKey === 0) {
92
- return;
93
- }
94
- window.top.postMessage((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.RENDERED, rootComponent.uid), '*');
95
- }, [renderKey, rootComponent.uid]);
96
- return (react_1.default.createElement(react_1.default.Fragment, null,
97
- react_1.default.createElement("main", null,
98
- react_1.default.createElement("div", { id: layout_1.EDITING_COMPONENT_ID }, route && (react_1.default.createElement(Placeholder_1.Placeholder, { name: layout_1.EDITING_COMPONENT_PLACEHOLDER, rendering: route, key: renderKey }))))));
99
- };
100
61
  const sendErrorEvent = (uid, error, type) => {
101
62
  const errorEvent = codegen.getDesignLibraryComponentPreviewErrorEvent(uid, error, type);
102
63
  console.error('Component Library: sending error event', errorEvent);
103
- window.top.postMessage(errorEvent, '*');
64
+ if (typeof window !== 'undefined') {
65
+ const target = window.parent && window.parent !== window ? window.parent : window;
66
+ target.postMessage(errorEvent, '*');
67
+ }
68
+ };
69
+ const postToDL = (evt) => {
70
+ if (typeof window === 'undefined')
71
+ return;
72
+ const target = window.parent && window.parent !== window ? window.parent : window;
73
+ try {
74
+ console.log('Component Library: sending event', evt === null || evt === void 0 ? void 0 : evt.name, evt);
75
+ target.postMessage(evt, '*');
76
+ }
77
+ catch (err) {
78
+ console.error('Component Library: postMessage failed', err, evt);
79
+ }
104
80
  };
105
81
  class ErrorBoundary extends react_1.default.Component {
106
82
  constructor() {
@@ -128,36 +104,74 @@ class ErrorBoundary extends react_1.default.Component {
128
104
  }
129
105
  }
130
106
  /**
131
- * This component is used to render the component in variant generation mode.
132
- * It is used to send the import-map and component-props events to the parent window and render the dynamic component.
107
+ * Design Library component.
108
+ *
109
+ * Renders the **real** Sitecore component for `library` / `library-metadata` modes and,
110
+ * when generation is enabled (`page.mode.designLibrary.isVariantGeneration === true`),
111
+ * wires the **variant generation** handshake so the parent (DL Studio) can send
112
+ * generated code to preview and iterate on.
113
+ * @param {DesignLibraryProps} props
114
+ * @param {() => Promise<{ default: import('../codegen').ImportEntry[] }>} [props.loadImportMap] Optional async loader that resolves to the import-map used to resolve the generated component’s imports. Required when `isVariantGeneration` is true.
115
+ * @returns {JSX.Element} The preview surface, or `null` when not in Design Library mode.
133
116
  */
134
- const VariantGeneration = (props) => {
117
+ const DesignLibrary = ({ loadImportMap }) => {
118
+ var _a, _b;
135
119
  const { page } = (0, withSitecore_1.useSitecore)();
136
- const { layout: { sitecore: { route }, }, } = page;
137
- const rendering = route === null || route === void 0 ? void 0 : route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER][0];
120
+ const route = page.layout.sitecore.route;
121
+ const rendering = (_a = route === null || route === void 0 ? void 0 : route.placeholders[layout_1.EDITING_COMPONENT_PLACEHOLDER]) === null || _a === void 0 ? void 0 : _a[0];
122
+ const { isDesignLibrary } = page.mode;
123
+ const isVariantGeneration = (_b = page.mode.designLibrary) === null || _b === void 0 ? void 0 : _b.isVariantGeneration;
124
+ const [propsState, setPropsState] = (0, react_1.useState)({
125
+ fields: rendering === null || rendering === void 0 ? void 0 : rendering.fields,
126
+ params: rendering === null || rendering === void 0 ? void 0 : rendering.params,
127
+ });
138
128
  const [renderKey, setRenderKey] = (0, react_1.useState)(0);
139
129
  const [Component, setComponent] = (0, react_1.useState)(null);
130
+ const isGeneratedComponentActive = !!Component;
131
+ if (!isDesignLibrary)
132
+ return null;
140
133
  // eslint-disable-next-line react-hooks/rules-of-hooks
141
134
  (0, react_1.useEffect)(() => {
135
+ postToDL((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.READY, rendering.uid));
136
+ if (!isVariantGeneration) {
137
+ requestAnimationFrame(() => {
138
+ setRenderKey((k) => (k === 0 ? k + 1 : k));
139
+ });
140
+ }
141
+ const unsubUpdate = (0, editing_1.addComponentUpdateHandler)(rendering, (updated) => {
142
+ setPropsState({ fields: updated.fields, params: updated.params });
143
+ setRenderKey((k) => k + 1);
144
+ });
145
+ // useEffect will cleanup event handler on re-render
146
+ return () => unsubUpdate && unsubUpdate();
147
+ }, [isVariantGeneration, rendering]);
148
+ // eslint-disable-next-line react-hooks/rules-of-hooks
149
+ (0, react_1.useEffect)(() => {
150
+ // Send a rendered event only as effect of a component update command
151
+ if (renderKey === 0)
152
+ return;
153
+ postToDL((0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.RENDERED, rendering.uid));
154
+ }, [renderKey, rendering]);
155
+ // eslint-disable-next-line react-hooks/rules-of-hooks
156
+ (0, react_1.useEffect)(() => {
157
+ if (!isDesignLibrary || !isVariantGeneration)
158
+ return undefined;
142
159
  let cancelled = false;
143
160
  // since import map is loaded lazily, we only need to add preview event handler once the import map is loaded
144
161
  // unsubscribe function for useEffect cleanup will also be returned once importMap promise has been resolved or rejected
145
- let unsubscribe = undefined;
146
- const init = () => __awaiter(void 0, void 0, void 0, function* () {
147
- var _a;
148
- let importMap = undefined;
149
- if (!props.loadImportMap) {
150
- const errorMessage = 'No loadImportMap prop provided. Please provide a dynamic import map function for DesignLibrary.';
151
- sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
162
+ let unsubscribe;
163
+ (() => __awaiter(void 0, void 0, void 0, function* () {
164
+ if (!loadImportMap) {
165
+ sendErrorEvent(rendering.uid, 'No loadImportMap provided', codegen.DesignLibraryPreviewError.RenderInit);
152
166
  return;
153
167
  }
168
+ let importMap;
154
169
  try {
155
- const importMapImport = yield props.loadImportMap();
156
- importMap = importMapImport.default;
170
+ const mod = yield loadImportMap();
171
+ importMap = mod.default;
157
172
  }
158
- catch (error) {
159
- const errorMessage = `Error loading import map: ${error}`;
160
- sendErrorEvent(rendering.uid, errorMessage, codegen.DesignLibraryPreviewError.RenderInit);
173
+ catch (e) {
174
+ sendErrorEvent(rendering.uid, `Error loading import map: ${e}`, codegen.DesignLibraryPreviewError.RenderInit);
161
175
  return;
162
176
  }
163
177
  // account for component being unmounted while resolving async import map
@@ -165,56 +179,24 @@ const VariantGeneration = (props) => {
165
179
  return;
166
180
  unsubscribe = addComponentPreviewHandler(importMap, (error, Component) => {
167
181
  // Error event is already sent in the addComponentPreviewHandler
168
- if (error) {
182
+ if (error)
169
183
  return;
170
- }
171
- setRenderKey((key) => key + 1);
172
184
  setComponent(() => Component);
185
+ setRenderKey((k) => k + 1);
173
186
  });
174
187
  const importMapEvent = getDesignLibraryImportMapEvent(rendering.uid, importMap);
175
- console.debug('Component Library: sending event', importMapEvent);
176
- window.parent.postMessage(importMapEvent, '*');
177
- const componentPropsEvent = getDesignLibraryComponentPropsEvent(rendering.uid, rendering.fields, rendering.params);
178
- console.debug('Component Library: sending event', componentPropsEvent);
179
- window.top.postMessage(componentPropsEvent, '*');
180
- const readyEvent = (0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.READY, rendering.uid);
181
- console.debug('Component Library: sending event', readyEvent);
182
- (_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(readyEvent, '*');
183
- });
184
- init();
185
- // return function that calls unsubsubribe - if the component was mounted correctly
188
+ postToDL(importMapEvent);
189
+ const propsEvent = getDesignLibraryComponentPropsEvent(rendering.uid, propsState.fields, propsState.params);
190
+ postToDL(propsEvent);
191
+ }))();
192
+ // return function that calls unsubscribe - if the component was mounted correctly
186
193
  return () => {
187
194
  cancelled = true;
188
- if (unsubscribe) {
189
- unsubscribe();
190
- }
195
+ unsubscribe && unsubscribe();
191
196
  };
192
- }, []);
193
- // eslint-disable-next-line react-hooks/rules-of-hooks
194
- (0, react_1.useEffect)(() => {
195
- var _a;
196
- // Send a rendered event only as effect of a component update command
197
- if (renderKey === 0)
198
- return undefined;
199
- const renderedEvent = (0, editing_1.getDesignLibraryStatusEvent)(editing_1.DesignLibraryStatus.RENDERED, rendering.uid);
200
- console.debug('Component Library: sending event', renderedEvent);
201
- (_a = window.top) === null || _a === void 0 ? void 0 : _a.postMessage(renderedEvent, '*');
202
- }, [renderKey, rendering === null || rendering === void 0 ? void 0 : rendering.uid]);
203
- return (react_1.default.createElement("main", null, Component ? (react_1.default.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
204
- react_1.default.createElement(Component, { fields: rendering.fields, params: rendering.params, key: renderKey }))) : (react_1.default.createElement("div", null, "Loading preview..."))));
205
- };
206
- exports.VariantGeneration = VariantGeneration;
207
- const DesignLibrary = ({ loadImportMap }) => {
208
- var _a;
209
- const { page } = (0, withSitecore_1.useSitecore)();
210
- const { isDesignLibrary } = page.mode;
211
- const isVariantGeneration = (_a = page.mode.designLibrary) === null || _a === void 0 ? void 0 : _a.isVariantGeneration;
212
- if (!isDesignLibrary) {
213
- return null;
214
- }
215
- if (isVariantGeneration) {
216
- return react_1.default.createElement(exports.VariantGeneration, { loadImportMap: loadImportMap });
217
- }
218
- return react_1.default.createElement(Preview, null);
197
+ }, [isVariantGeneration, rendering]);
198
+ return (react_1.default.createElement("main", null, isGeneratedComponentActive ? (react_1.default.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
199
+ react_1.default.createElement(Placeholder_2.PlaceholderMetadata, { rendering: rendering },
200
+ react_1.default.createElement(Component, { fields: propsState.fields, params: propsState.params, key: renderKey })))) : (react_1.default.createElement("div", { id: layout_1.EDITING_COMPONENT_ID }, route && (react_1.default.createElement(Placeholder_1.Placeholder, { name: layout_1.EDITING_COMPONENT_PLACEHOLDER, rendering: route, key: renderKey }))))));
219
201
  };
220
202
  exports.DesignLibrary = DesignLibrary;
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
4
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
5
  };
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.BYOCServerWrapper = void 0;
16
+ const react_1 = __importDefault(require("react"));
17
+ const feaas_utils_1 = require("./feaas-utils");
18
+ const BYOCWrapper_1 = require("./BYOCWrapper");
19
+ const models_1 = require("../Placeholder/models");
20
+ const BYOCServerWrapper = (props) => __awaiter(void 0, void 0, void 0, function* () {
21
+ var _a;
22
+ const params = ((_a = props.rendering) === null || _a === void 0 ? void 0 : _a.params) || {};
23
+ // only pass serializable props to the client BYOC component
24
+ const serializableProps = Object.fromEntries(Object.entries(props).filter(([key]) => !models_1.nonSerializedPlaceholderProps.includes(key)));
25
+ const finalProps = Object.assign(Object.assign({}, (yield (0, feaas_utils_1.fetchBYOCComponentServerProps)(params))), serializableProps);
26
+ return react_1.default.createElement(BYOCWrapper_1.BYOCWrapper, Object.assign({}, finalProps));
27
+ });
28
+ exports.BYOCServerWrapper = BYOCServerWrapper;
@@ -33,26 +33,15 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  return result;
34
34
  };
35
35
  })();
36
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
37
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
38
- return new (P || (P = Promise))(function (resolve, reject) {
39
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
40
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
41
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
42
- step((generator = generator.apply(thisArg, _arguments || [])).next());
43
- });
44
- };
45
36
  var __importDefault = (this && this.__importDefault) || function (mod) {
46
37
  return (mod && mod.__esModule) ? mod : { "default": mod };
47
38
  };
48
39
  Object.defineProperty(exports, "__esModule", { value: true });
49
- exports.BYOCComponent = exports.BYOC_COMPONENT_RENDERING_NAME = void 0;
50
- exports.fetchBYOCComponentServerProps = fetchBYOCComponentServerProps;
40
+ exports.BYOCWrapper = exports.BYOCComponent = void 0;
51
41
  const react_1 = __importDefault(require("react"));
52
- const utils_1 = require("../utils");
53
- const MissingComponent_1 = require("./MissingComponent");
54
42
  const FEAAS = __importStar(require("@sitecore-feaas/clientside/react"));
55
- exports.BYOC_COMPONENT_RENDERING_NAME = 'BYOCComponent';
43
+ const utils_1 = require("../../utils");
44
+ const MissingComponent_1 = require("../MissingComponent");
56
45
  const DefaultErrorComponent = (props) => {
57
46
  var _a;
58
47
  return (react_1.default.createElement("div", null,
@@ -60,11 +49,12 @@ const DefaultErrorComponent = (props) => {
60
49
  _a.message,
61
50
  "."));
62
51
  };
52
+ // BYOCComponent remains for backward compatibility and testing purposes
63
53
  /**
64
54
  * BYOCComponent facilitate the rendering of external components. It manages potential errors,
65
55
  * missing components, and customization of error messages or alternative rendering components.
66
56
  * @param {ByocComponentProps} props component props
67
- * @returns dynamicly rendered component or Missing Component error frame
57
+ * @returns dynamically rendered component or Missing Component error frame
68
58
  */
69
59
  class BYOCComponent extends react_1.default.Component {
70
60
  constructor(props) {
@@ -117,17 +107,16 @@ class BYOCComponent extends react_1.default.Component {
117
107
  }
118
108
  exports.BYOCComponent = BYOCComponent;
119
109
  /**
120
- * Fetches server component props required for server rendering, based on rendering params.
121
- * @param {BYOCComponentParams} params component params
110
+ * SXA wrapper for BYOC components
111
+ * @param {BYOCComponentProps} props component props
112
+ * @returns wrapped BYOC component
122
113
  */
123
- function fetchBYOCComponentServerProps(params) {
124
- return __awaiter(this, void 0, void 0, function* () {
125
- const fetchDataOptions = params.ComponentDataOverride
126
- ? JSON.parse(params.ComponentDataOverride)
127
- : {};
128
- const fetchedData = yield FEAAS.DataSettings.fetch(fetchDataOptions || {});
129
- return {
130
- fetchedData,
131
- };
132
- });
133
- }
114
+ const BYOCWrapper = (props) => {
115
+ var _a, _b, _c;
116
+ const styles = (_b = (_a = props.params) === null || _a === void 0 ? void 0 : _a.styles) === null || _b === void 0 ? void 0 : _b.trimEnd();
117
+ const id = (_c = props.params) === null || _c === void 0 ? void 0 : _c.RenderingIdentifier;
118
+ return (react_1.default.createElement("div", { className: styles ? styles : undefined, id: id ? id : undefined },
119
+ react_1.default.createElement("div", { className: "component-content" },
120
+ react_1.default.createElement(BYOCComponent, Object.assign({}, props)))));
121
+ };
122
+ exports.BYOCWrapper = BYOCWrapper;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.FEaaSServerWrapper = void 0;
16
+ const react_1 = __importDefault(require("react"));
17
+ const feaas_utils_1 = require("./feaas-utils");
18
+ const FEaaSWrapper_1 = require("./FEaaSWrapper");
19
+ const models_1 = require("../Placeholder/models");
20
+ /**
21
+ * Server component for FEaaS. Retrieves server props and renders client FEaaSWrapper.
22
+ * @param {FEaaSComponentProps} props incoming props
23
+ * @returns {Promise<JSX.Element>} rendered FEaaSWrapper component
24
+ */
25
+ const FEaaSServerWrapper = (props) => __awaiter(void 0, void 0, void 0, function* () {
26
+ var _a, _b;
27
+ const params = ((_a = props.rendering) === null || _a === void 0 ? void 0 : _a.params) || {};
28
+ const isPageStateNormal = (_b = props.page) === null || _b === void 0 ? void 0 : _b.mode.isNormal;
29
+ // only pass serializable props to the client FEaaS component
30
+ const serializableProps = Object.fromEntries(Object.entries(props).filter(([key]) => !models_1.nonSerializedPlaceholderProps.includes(key)));
31
+ const finalProps = Object.assign(Object.assign({}, (yield (0, feaas_utils_1.fetchFEaaSComponentServerProps)(params, isPageStateNormal))), serializableProps);
32
+ return react_1.default.createElement(FEaaSWrapper_1.FEaaSWrapper, Object.assign({}, finalProps));
33
+ });
34
+ exports.FEaaSServerWrapper = FEaaSServerWrapper;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ 'use client';
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.FEaaSWrapper = exports.FEaaSComponent = void 0;
41
+ const react_1 = __importDefault(require("react"));
42
+ const FEAAS = __importStar(require("@sitecore-feaas/clientside/react"));
43
+ const utils_1 = require("../../utils");
44
+ // FEaaSComponent remains for backward compatibility and testing purposes
45
+ /**
46
+ * @param {FEaaSComponentProps} props component props
47
+ */
48
+ const FEaaSComponent = (props) => {
49
+ var _a, _b, _c, _d, _e, _f, _g;
50
+ const computedRevision = ((_a = props.params) === null || _a === void 0 ? void 0 : _a.ComponentRevision) || props.revisionFallback;
51
+ if (!props.template &&
52
+ (!props.params ||
53
+ !props.params.LibraryId ||
54
+ !props.params.ComponentId ||
55
+ !props.params.ComponentVersion ||
56
+ !props.params.ComponentHostName ||
57
+ !computedRevision)) {
58
+ // Missing FEaaS component required props
59
+ return null;
60
+ }
61
+ // combine fetchedData from server with datasource data (if present)
62
+ const data = Object.assign(Object.assign({}, props.fetchedData), { _: (0, utils_1.getDataFromFields)((_b = props.fields) !== null && _b !== void 0 ? _b : {}) });
63
+ // FEaaS control would still be hydrated by client
64
+ // we pass all the props as a workaround to avoid hydration error, until we convert all Content SDK components to server side
65
+ // this also allows component to fall back to full client-side rendering when template or src is empty
66
+ // FEAAS should not fetch anything, since Content SDK does the fetching - so we pass empty array into fetch param
67
+ return (react_1.default.createElement(FEAAS.Component, { data: data, template: props.template, cdn: (_c = props.params) === null || _c === void 0 ? void 0 : _c.ComponentHostName, library: (_d = props.params) === null || _d === void 0 ? void 0 : _d.LibraryId, version: (_e = props.params) === null || _e === void 0 ? void 0 : _e.ComponentVersion, component: (_f = props.params) === null || _f === void 0 ? void 0 : _f.ComponentId, instance: (_g = props.params) === null || _g === void 0 ? void 0 : _g.ComponentInstanceId, revision: computedRevision, fetch: [] }));
68
+ };
69
+ exports.FEaaSComponent = FEaaSComponent;
70
+ const FEaaSWrapper = (props) => {
71
+ var _a, _b;
72
+ const styles = `component feaas ${(_a = props.params) === null || _a === void 0 ? void 0 : _a.styles}`.trimEnd();
73
+ const id = (_b = props.params) === null || _b === void 0 ? void 0 : _b.RenderingIdentifier;
74
+ return (react_1.default.createElement("div", { className: styles, id: id ? id : undefined },
75
+ react_1.default.createElement("div", { className: "component-content" },
76
+ react_1.default.createElement(exports.FEaaSComponent, Object.assign({}, props)))));
77
+ };
78
+ exports.FEaaSWrapper = FEaaSWrapper;
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- 'use client';
3
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
3
  if (k2 === undefined) k2 = k;
5
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -42,52 +41,36 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
42
41
  step((generator = generator.apply(thisArg, _arguments || [])).next());
43
42
  });
44
43
  };
45
- var __importDefault = (this && this.__importDefault) || function (mod) {
46
- return (mod && mod.__esModule) ? mod : { "default": mod };
47
- };
48
44
  Object.defineProperty(exports, "__esModule", { value: true });
49
- exports.composeComponentEndpoint = exports.FEaaSComponent = exports.FEAAS_COMPONENT_RENDERING_NAME = void 0;
45
+ exports.composeComponentEndpoint = void 0;
46
+ exports.fetchBYOCComponentServerProps = fetchBYOCComponentServerProps;
50
47
  exports.fetchFEaaSComponentServerProps = fetchFEaaSComponentServerProps;
51
- const react_1 = __importDefault(require("react"));
52
48
  const FEAAS = __importStar(require("@sitecore-feaas/clientside/react"));
53
- const layout_1 = require("@sitecore-content-sdk/core/layout");
54
- const utils_1 = require("../utils");
55
- exports.FEAAS_COMPONENT_RENDERING_NAME = 'FEaaSComponent';
56
49
  /**
57
- * @param {FEaaSComponentProps} props component props
50
+ * Fetches server component props required for server rendering, based on rendering params.
51
+ * @param {BYOCComponentParams} params component params
58
52
  */
59
- const FEaaSComponent = (props) => {
60
- var _a, _b, _c, _d, _e, _f, _g;
61
- const computedRevision = ((_a = props.params) === null || _a === void 0 ? void 0 : _a.ComponentRevision) || props.revisionFallback;
62
- if (!props.template &&
63
- (!props.params ||
64
- !props.params.LibraryId ||
65
- !props.params.ComponentId ||
66
- !props.params.ComponentVersion ||
67
- !props.params.ComponentHostName ||
68
- !computedRevision)) {
69
- // Missing FEaaS component required props
70
- return null;
71
- }
72
- // combine fetchedData from server with datasource data (if present)
73
- const data = Object.assign(Object.assign({}, props.fetchedData), { _: (0, utils_1.getDataFromFields)((_b = props.fields) !== null && _b !== void 0 ? _b : {}) });
74
- // FEaaS control would still be hydrated by client
75
- // we pass all the props as a workaround to avoid hydration error, until we convert all Content SDK components to server side
76
- // this also allows component to fall back to full client-side rendering when template or src is empty
77
- // FEAAS should not fetch anything, since Content SDK does the fetching - so we pass empty array into fetch param
78
- return (react_1.default.createElement(FEAAS.Component, { data: data, template: props.template, cdn: (_c = props.params) === null || _c === void 0 ? void 0 : _c.ComponentHostName, library: (_d = props.params) === null || _d === void 0 ? void 0 : _d.LibraryId, version: (_e = props.params) === null || _e === void 0 ? void 0 : _e.ComponentVersion, component: (_f = props.params) === null || _f === void 0 ? void 0 : _f.ComponentId, instance: (_g = props.params) === null || _g === void 0 ? void 0 : _g.ComponentInstanceId, revision: computedRevision, fetch: [] }));
79
- };
80
- exports.FEaaSComponent = FEaaSComponent;
53
+ function fetchBYOCComponentServerProps(params) {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ const fetchDataOptions = params.ComponentDataOverride
56
+ ? JSON.parse(params.ComponentDataOverride)
57
+ : {};
58
+ const fetchedData = yield FEAAS.DataSettings.fetch(fetchDataOptions || {});
59
+ return {
60
+ fetchedData,
61
+ };
62
+ });
63
+ }
81
64
  /**
82
65
  * Fetches server component props required for server rendering, based on rendering params.
83
66
  * Component endpoint will either be retrieved from params or from endpointOverride
84
67
  * @param {FEaaSComponentParams} params component params
85
- * @param {LayoutServicePageState} [pageState] page state to determine which component variant to use
68
+ * @param {boolean} [isPageStateNormal] whether page is in normal mode
86
69
  * @param {string} [endpointOverride] optional override for component endpoint
87
70
  */
88
- function fetchFEaaSComponentServerProps(params, pageState, endpointOverride) {
71
+ function fetchFEaaSComponentServerProps(params, isPageStateNormal, endpointOverride) {
89
72
  return __awaiter(this, void 0, void 0, function* () {
90
- const revisionFallback = pageState && pageState !== layout_1.LayoutServicePageState.Normal ? 'staged' : 'published';
73
+ const revisionFallback = isPageStateNormal ? 'published' : 'staged';
91
74
  const src = endpointOverride || (0, exports.composeComponentEndpoint)(params, revisionFallback);
92
75
  let template = '';
93
76
  let fetchedData = {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchBYOCComponentServerProps = exports.fetchFEaaSComponentServerProps = exports.BYOCServerWrapper = exports.FEaaSServerWrapper = exports.BYOC_WRAPPER_RENDERING_NAME = exports.FEAAS_WRAPPER_RENDERING_NAME = exports.BYOC_COMPONENT_RENDERING_NAME = exports.FEAAS_COMPONENT_RENDERING_NAME = exports.BYOCComponent = exports.BYOCWrapper = exports.FEaaSComponent = exports.FEaaSWrapper = void 0;
4
+ var FEaaSWrapper_1 = require("./FEaaSWrapper");
5
+ Object.defineProperty(exports, "FEaaSWrapper", { enumerable: true, get: function () { return FEaaSWrapper_1.FEaaSWrapper; } });
6
+ Object.defineProperty(exports, "FEaaSComponent", { enumerable: true, get: function () { return FEaaSWrapper_1.FEaaSComponent; } });
7
+ var BYOCWrapper_1 = require("./BYOCWrapper");
8
+ Object.defineProperty(exports, "BYOCWrapper", { enumerable: true, get: function () { return BYOCWrapper_1.BYOCWrapper; } });
9
+ Object.defineProperty(exports, "BYOCComponent", { enumerable: true, get: function () { return BYOCWrapper_1.BYOCComponent; } });
10
+ var models_1 = require("./models");
11
+ Object.defineProperty(exports, "FEAAS_COMPONENT_RENDERING_NAME", { enumerable: true, get: function () { return models_1.FEAAS_COMPONENT_RENDERING_NAME; } });
12
+ Object.defineProperty(exports, "BYOC_COMPONENT_RENDERING_NAME", { enumerable: true, get: function () { return models_1.BYOC_COMPONENT_RENDERING_NAME; } });
13
+ Object.defineProperty(exports, "FEAAS_WRAPPER_RENDERING_NAME", { enumerable: true, get: function () { return models_1.FEAAS_WRAPPER_RENDERING_NAME; } });
14
+ Object.defineProperty(exports, "BYOC_WRAPPER_RENDERING_NAME", { enumerable: true, get: function () { return models_1.BYOC_WRAPPER_RENDERING_NAME; } });
15
+ var FEaaSSeverWrapper_1 = require("./FEaaSSeverWrapper");
16
+ Object.defineProperty(exports, "FEaaSServerWrapper", { enumerable: true, get: function () { return FEaaSSeverWrapper_1.FEaaSServerWrapper; } });
17
+ var BYOCServerWrapper_1 = require("./BYOCServerWrapper");
18
+ Object.defineProperty(exports, "BYOCServerWrapper", { enumerable: true, get: function () { return BYOCServerWrapper_1.BYOCServerWrapper; } });
19
+ var feaas_utils_1 = require("./feaas-utils");
20
+ Object.defineProperty(exports, "fetchFEaaSComponentServerProps", { enumerable: true, get: function () { return feaas_utils_1.fetchFEaaSComponentServerProps; } });
21
+ Object.defineProperty(exports, "fetchBYOCComponentServerProps", { enumerable: true, get: function () { return feaas_utils_1.fetchBYOCComponentServerProps; } });
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BYOC_COMPONENT_RENDERING_NAME = exports.BYOC_WRAPPER_RENDERING_NAME = exports.FEAAS_COMPONENT_RENDERING_NAME = exports.FEAAS_WRAPPER_RENDERING_NAME = void 0;
4
+ exports.FEAAS_WRAPPER_RENDERING_NAME = 'FEaaSWrapper';
5
+ exports.FEAAS_COMPONENT_RENDERING_NAME = 'FEaaSComponent';
6
+ exports.BYOC_WRAPPER_RENDERING_NAME = 'BYOCWrapper';
7
+ exports.BYOC_COMPONENT_RENDERING_NAME = 'BYOCComponent';
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ 'use client';
2
3
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
4
  if (k2 === undefined) k2 = k;
4
5
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -45,7 +46,6 @@ var __rest = (this && this.__rest) || function (s, e) {
45
46
  };
46
47
  Object.defineProperty(exports, "__esModule", { value: true });
47
48
  exports.Link = void 0;
48
- /* eslint-disable no-unused-expressions, @typescript-eslint/no-unused-expressions */
49
49
  const react_1 = __importStar(require("react"));
50
50
  const layout_1 = require("@sitecore-content-sdk/core/layout");
51
51
  const withFieldMetadata_1 = require("../enhancers/withFieldMetadata");