@sitecore-content-sdk/react 1.2.0-canary.22 → 1.2.0-canary.24

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 (44) hide show
  1. package/dist/cjs/components/ClientEditingChromesUpdate.js +52 -0
  2. package/dist/cjs/components/DesignLibrary.js +2 -2
  3. package/dist/cjs/components/EditingScripts.js +1 -0
  4. package/dist/cjs/components/ErrorBoundary.js +1 -0
  5. package/dist/cjs/components/Placeholder/Placeholder.js +109 -0
  6. package/dist/cjs/components/Placeholder/ServerPlaceholder.js +77 -0
  7. package/dist/cjs/components/Placeholder/index.js +25 -0
  8. package/dist/cjs/components/Placeholder/models.js +19 -0
  9. package/dist/cjs/components/Placeholder/placeholder-utils.js +187 -0
  10. package/dist/cjs/enhancers/withPlaceholder.js +7 -7
  11. package/dist/cjs/enhancers/withServerPlaceholder.js +21 -0
  12. package/dist/cjs/index.js +4 -1
  13. package/dist/esm/components/ClientEditingChromesUpdate.js +15 -0
  14. package/dist/esm/components/DesignLibrary.js +1 -1
  15. package/dist/esm/components/EditingScripts.js +1 -0
  16. package/dist/esm/components/ErrorBoundary.js +1 -0
  17. package/dist/esm/components/Placeholder/Placeholder.js +102 -0
  18. package/dist/esm/components/Placeholder/ServerPlaceholder.js +70 -0
  19. package/dist/esm/components/Placeholder/index.js +4 -0
  20. package/dist/esm/components/Placeholder/models.js +16 -0
  21. package/dist/esm/components/Placeholder/placeholder-utils.js +176 -0
  22. package/dist/esm/enhancers/withPlaceholder.js +7 -7
  23. package/dist/esm/enhancers/withServerPlaceholder.js +14 -0
  24. package/dist/esm/index.js +2 -1
  25. package/package.json +3 -3
  26. package/types/components/ClientEditingChromesUpdate.d.ts +6 -0
  27. package/types/components/ErrorBoundary.d.ts +0 -1
  28. package/types/components/Placeholder/Placeholder.d.ts +28 -0
  29. package/types/components/Placeholder/ServerPlaceholder.d.ts +10 -0
  30. package/types/components/Placeholder/index.d.ts +5 -0
  31. package/types/components/{PlaceholderCommon.d.ts → Placeholder/models.d.ts} +31 -17
  32. package/types/components/Placeholder/placeholder-utils.d.ts +77 -0
  33. package/types/components/sharedTypes/components.d.ts +6 -0
  34. package/types/enhancers/withPlaceholder.d.ts +2 -1
  35. package/types/enhancers/withServerPlaceholder.d.ts +15 -0
  36. package/types/index.d.ts +2 -1
  37. package/dist/cjs/components/Placeholder.js +0 -68
  38. package/dist/cjs/components/PlaceholderCommon.js +0 -176
  39. package/dist/esm/components/Placeholder.js +0 -62
  40. package/dist/esm/components/PlaceholderCommon.js +0 -169
  41. package/types/components/Placeholder.d.ts +0 -20
  42. /package/dist/cjs/components/{PlaceholderMetadata.js → Placeholder/PlaceholderMetadata.js} +0 -0
  43. /package/dist/esm/components/{PlaceholderMetadata.js → Placeholder/PlaceholderMetadata.js} +0 -0
  44. /package/types/components/{PlaceholderMetadata.d.ts → Placeholder/PlaceholderMetadata.d.ts} +0 -0
@@ -0,0 +1,52 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.ClientEditingChromesUpdate = void 0;
38
+ const editing_1 = require("@sitecore-content-sdk/core/editing");
39
+ const react_1 = __importStar(require("react"));
40
+ /**
41
+ * Updates editing chromes in app router / RSC context.
42
+ * This ensures all the relevant Pages editing markup is applied once all client components are loaded.
43
+ */
44
+ const ClientEditingChromesUpdate = () => {
45
+ (0, react_1.useEffect)(() => {
46
+ if ((0, editing_1.isEditorActive)()) {
47
+ (0, editing_1.resetEditorChromes)();
48
+ }
49
+ }, []);
50
+ return react_1.default.createElement(react_1.default.Fragment, null);
51
+ };
52
+ exports.ClientEditingChromesUpdate = ClientEditingChromesUpdate;
@@ -52,7 +52,7 @@ 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 PlaceholderMetadata_1 = require("./PlaceholderMetadata");
55
+ const Placeholder_2 = require("./Placeholder");
56
56
  let { getDesignLibraryImportMapEvent, getDesignLibraryComponentPropsEvent, addComponentPreviewHandler, } = codegen;
57
57
  const __mockDependencies = (mocks) => {
58
58
  addComponentPreviewHandler = mocks.addComponentPreviewHandler;
@@ -196,7 +196,7 @@ const DesignLibrary = ({ loadImportMap }) => {
196
196
  };
197
197
  }, [isVariantGeneration, rendering]);
198
198
  return (react_1.default.createElement("main", null, isGeneratedComponentActive ? (react_1.default.createElement(ErrorBoundary, { uid: rendering.uid, renderKey: renderKey },
199
- react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { rendering: rendering },
199
+ react_1.default.createElement(Placeholder_2.PlaceholderMetadata, { rendering: rendering },
200
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 }))))));
201
201
  };
202
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,109 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Placeholder = exports.PlaceholderComponent = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const withComponentMap_1 = require("../../enhancers/withComponentMap");
9
+ const editing_1 = require("@sitecore-content-sdk/core/editing");
10
+ const withSitecore_1 = require("../../enhancers/withSitecore");
11
+ const placeholder_utils_1 = require("./placeholder-utils");
12
+ const PlaceholderMetadata_1 = require("./PlaceholderMetadata");
13
+ const ErrorBoundary_1 = __importDefault(require("../ErrorBoundary"));
14
+ class PlaceholderComponent extends react_1.default.Component {
15
+ constructor(props) {
16
+ super(props);
17
+ this.isEmpty = false;
18
+ this.state = {};
19
+ }
20
+ componentDidMount() {
21
+ if (this.isEmpty && editing_1.PagesEditor.isActive()) {
22
+ editing_1.PagesEditor.resetChromes();
23
+ }
24
+ }
25
+ componentDidCatch(error) {
26
+ this.setState({ error });
27
+ }
28
+ /**
29
+ * Renders the placeholder when it is empty. The required CSS styles are applied to the placeholder in edit mode.
30
+ * @param {React.ReactNode | React.ReactElement[]} node react node
31
+ * @returns react node
32
+ * @deprecated use renderEmptyPlaceholder from react/nextjs import instead
33
+ */
34
+ renderEmptyPlaceholder(node) {
35
+ return (0, placeholder_utils_1.renderEmptyPlaceholder)(node);
36
+ }
37
+ render() {
38
+ const childProps = Object.assign({}, this.props);
39
+ delete childProps.componentMap;
40
+ if (this.state.error) {
41
+ if (childProps.errorComponent) {
42
+ return react_1.default.createElement(childProps.errorComponent, { error: this.state.error });
43
+ }
44
+ return (react_1.default.createElement("div", { className: "sc-content-sdk-placeholder-error" },
45
+ "A rendering error occurred: ",
46
+ this.state.error.message,
47
+ "."));
48
+ }
49
+ const renderingData = childProps.rendering;
50
+ const placeholderRenderings = (0, placeholder_utils_1.getPlaceholderRenderings)(renderingData, this.props.name, this.props.page.mode.isEditing);
51
+ this.isEmpty = !placeholderRenderings.length;
52
+ const components = PlaceholderComponent.getRenderedComponents(this.props, placeholderRenderings);
53
+ if (this.isEmpty) {
54
+ const rendered = this.props.renderEmpty ? this.props.renderEmpty(components) : components;
55
+ return this.props.page.mode.isEditing ? (0, placeholder_utils_1.renderEmptyPlaceholder)(rendered) : rendered;
56
+ }
57
+ else if (this.props.render) {
58
+ return this.props.render(components, placeholderRenderings, childProps);
59
+ }
60
+ else if (this.props.renderEach) {
61
+ const renderEach = this.props.renderEach;
62
+ return components.map((component, index) => {
63
+ if (component && component.props && component.props.type === 'text/sitecore') {
64
+ return component;
65
+ }
66
+ return renderEach(component, index);
67
+ });
68
+ }
69
+ else {
70
+ return components;
71
+ }
72
+ }
73
+ }
74
+ exports.PlaceholderComponent = PlaceholderComponent;
75
+ /**
76
+ * Renders the components for the placeholder based on the provided rendering data.
77
+ * @param {PlaceholderProps} props placeholder component props
78
+ * @param {ComponentRendering[]} placeholderRenderings renderings within placeholder
79
+ * @returns {React.ReactNode | React.ReactElement[]} rendered components
80
+ */
81
+ PlaceholderComponent.getRenderedComponents = (props, placeholderRenderings) => {
82
+ const { name, missingComponentComponent, hiddenRenderingComponent } = props;
83
+ const transformedComponents = placeholderRenderings
84
+ .map((componentRendering, index) => {
85
+ const key = componentRendering.uid || `component-${index}`;
86
+ const renderedProps = (0, placeholder_utils_1.getRenderedComponentProps)(props, componentRendering, key);
87
+ const component = (0, placeholder_utils_1.getComponentForRendering)(componentRendering, name, props.componentMap, hiddenRenderingComponent, missingComponentComponent);
88
+ let rendered = react_1.default.createElement(component.component, props.modifyComponentProps ? props.modifyComponentProps(renderedProps) : renderedProps);
89
+ if (!component.isEmpty) {
90
+ const errorBoundaryKey = rendered.type + '-' + index;
91
+ const disableSuspense = props.disableSuspense || false;
92
+ rendered = (react_1.default.createElement(ErrorBoundary_1.default, { "data-testid": "error-boundary", key: errorBoundaryKey, errorComponent: props.errorComponent, componentLoadingMessage: props.componentLoadingMessage, isDynamic: component.dynamic, disableSuspense: disableSuspense, rendering: rendered.props.rendering }, rendered));
93
+ }
94
+ // if in edit mode then emit shallow chromes for hydration in Pages
95
+ if (props.page.mode.isEditing) {
96
+ return (react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: key, rendering: componentRendering }, rendered));
97
+ }
98
+ return rendered;
99
+ })
100
+ .filter((element) => element); // remove nulls
101
+ if (props.page.mode.isEditing) {
102
+ return [
103
+ react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: props.rendering.uid, placeholderName: name, rendering: props.rendering }, transformedComponents),
104
+ ];
105
+ }
106
+ return transformedComponents;
107
+ };
108
+ const PlaceholderWithComponentMap = (0, withComponentMap_1.withComponentMap)(PlaceholderComponent);
109
+ exports.Placeholder = (0, withSitecore_1.withSitecore)()(PlaceholderWithComponentMap);
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ServerPlaceholder = void 0;
7
+ const models_1 = require("./models");
8
+ const placeholder_utils_1 = require("./placeholder-utils");
9
+ const react_1 = __importDefault(require("react"));
10
+ const PlaceholderMetadata_1 = require("./PlaceholderMetadata");
11
+ const ErrorBoundary_1 = __importDefault(require("../ErrorBoundary"));
12
+ /**
13
+ * React Server Component implementation for Placeholder.
14
+ * Renders components from the layout data for the given placeholder name, with consideration for page edit mode.
15
+ * Pulls components from the provided component map.
16
+ * @param {PlaceholderProps} props Placeholder props
17
+ * @returns {React.ReactNode | React.ReactElement[]} rendered component(s)
18
+ */
19
+ const ServerPlaceholder = (props) => {
20
+ var _a;
21
+ if (!props.componentMap) {
22
+ throw new Error('Component map is required for ServerPlaceholder');
23
+ }
24
+ // get serializable props for client rendering
25
+ const serializableProps = models_1.nonSerializedPlaceholderProps.reduce((finalProps, prop) => {
26
+ delete finalProps[prop];
27
+ return finalProps;
28
+ }, Object.assign({}, props));
29
+ const placeholderRenderings = (0, placeholder_utils_1.getPlaceholderRenderings)(props.rendering, props.name, (_a = props.page) === null || _a === void 0 ? void 0 : _a.mode.isEditing);
30
+ const components = placeholderRenderings
31
+ .map((rendering, index) => {
32
+ const { component, isEmpty, componentType, dynamic } = (0, placeholder_utils_1.getComponentForRendering)(rendering, props.name, props.componentMap, props.hiddenRenderingComponent, props.missingComponentComponent);
33
+ const isClient = componentType === 'client';
34
+ const key = rendering.uid || `component-${index}`;
35
+ const finalPhProps = isClient ? serializableProps : props;
36
+ const renderedProps = (0, placeholder_utils_1.getRenderedComponentProps)(finalPhProps, rendering, key);
37
+ let rendered = react_1.default.createElement(component, props.modifyComponentProps ? props.modifyComponentProps(renderedProps) : renderedProps);
38
+ if (!isEmpty) {
39
+ const errorBoundaryKey = rendered.type + '-' + index;
40
+ const disableSuspense = props.disableSuspense || false;
41
+ rendered = (react_1.default.createElement(ErrorBoundary_1.default, { "data-testid": "error-boundary", key: errorBoundaryKey, errorComponent: props.errorComponent, componentLoadingMessage: props.componentLoadingMessage, isDynamic: dynamic, disableSuspense: disableSuspense, rendering: rendered.props.rendering }, rendered));
42
+ }
43
+ // if in edit mode then emit shallow chromes for hydration in Pages
44
+ if (props.page.mode.isEditing) {
45
+ const key = rendering.uid || `component-${index}`;
46
+ return (react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: key, rendering: rendering }, rendered));
47
+ }
48
+ return rendered;
49
+ })
50
+ .filter((element) => element);
51
+ const finalRendering = props.page.mode.isEditing
52
+ ? [
53
+ react_1.default.createElement(PlaceholderMetadata_1.PlaceholderMetadata, { key: props.rendering.uid, placeholderName: props.name, rendering: props.rendering }, components),
54
+ ]
55
+ : components;
56
+ const placeholderEmpty = !placeholderRenderings.length;
57
+ if (placeholderEmpty) {
58
+ const rendered = props.renderEmpty ? props.renderEmpty(finalRendering) : finalRendering;
59
+ return props.page.mode.isEditing ? (0, placeholder_utils_1.renderEmptyPlaceholder)(rendered) : rendered;
60
+ }
61
+ if (props.render) {
62
+ return props.render(components, placeholderRenderings, serializableProps);
63
+ }
64
+ else if (props.renderEach) {
65
+ const renderEach = props.renderEach;
66
+ return finalRendering.map((component, index) => {
67
+ if (component && component.props && component.props.type === 'text/sitecore') {
68
+ return component;
69
+ }
70
+ return renderEach(component, index);
71
+ });
72
+ }
73
+ else {
74
+ return finalRendering;
75
+ }
76
+ };
77
+ exports.ServerPlaceholder = ServerPlaceholder;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.PlaceholderMetadata = exports.PlaceholderComponent = exports.Placeholder = exports.ServerPlaceholder = void 0;
18
+ var ServerPlaceholder_1 = require("./ServerPlaceholder");
19
+ Object.defineProperty(exports, "ServerPlaceholder", { enumerable: true, get: function () { return ServerPlaceholder_1.ServerPlaceholder; } });
20
+ var Placeholder_1 = require("./Placeholder");
21
+ Object.defineProperty(exports, "Placeholder", { enumerable: true, get: function () { return Placeholder_1.Placeholder; } });
22
+ Object.defineProperty(exports, "PlaceholderComponent", { enumerable: true, get: function () { return Placeholder_1.PlaceholderComponent; } });
23
+ var PlaceholderMetadata_1 = require("./PlaceholderMetadata");
24
+ Object.defineProperty(exports, "PlaceholderMetadata", { enumerable: true, get: function () { return PlaceholderMetadata_1.PlaceholderMetadata; } });
25
+ __exportStar(require("./placeholder-utils"), exports);
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.nonSerializedPlaceholderProps = void 0;
4
+ /**
5
+ * Prop names from placeholder that cannot be serialized and passed from server to client side components
6
+ */
7
+ exports.nonSerializedPlaceholderProps = [
8
+ 'renderEmpty',
9
+ 'render',
10
+ 'renderEach',
11
+ 'errorComponent',
12
+ 'componentLoadingMessage',
13
+ 'modifyComponentProps',
14
+ 'componentMap',
15
+ 'page',
16
+ 'missingComponentComponent',
17
+ 'hiddenRenderingComponent',
18
+ 'rendering',
19
+ ];
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.getComponentForRendering = exports.getRenderedComponentProps = exports.renderEmptyPlaceholder = exports.getSXAParams = exports.getPlaceholderRenderings = void 0;
18
+ const react_1 = __importDefault(require("react"));
19
+ const MissingComponent_1 = require("../MissingComponent");
20
+ const sharedTypes_1 = require("../sharedTypes");
21
+ const layout_1 = require("@sitecore-content-sdk/core/layout");
22
+ const core_1 = require("@sitecore-content-sdk/core");
23
+ const HiddenRendering_1 = require("../HiddenRendering");
24
+ const FEaaSComponent_1 = require("../FEaaSComponent");
25
+ const FEaaSWrapper_1 = require("../FEaaSWrapper");
26
+ const BYOCComponent_1 = require("../BYOCComponent");
27
+ const BYOCWrapper_1 = require("../BYOCWrapper");
28
+ /**
29
+ * Get the renderings for the specified placeholder from the rendering data.
30
+ * @param {ComponentRendering | RouteData } rendering rendering data
31
+ * @param {string} name placeholder name
32
+ * @param {boolean} isEditing whether components should be rendered in editing mode
33
+ * @returns {ComponentRendering[]} array of component renderings
34
+ */
35
+ const getPlaceholderRenderings = (rendering, name, isEditing) => {
36
+ let result;
37
+ let phName = name.slice();
38
+ /**
39
+ * Process (SXA) dynamic placeholders
40
+ * Find and replace the matching dynamic placeholder e.g 'nameOfContainer-{*}' with the requested e.g. 'nameOfContainer-1'.
41
+ * For Metadata EditMode, we need to keep the raw placeholder name in place.
42
+ */
43
+ if (rendering === null || rendering === void 0 ? void 0 : rendering.placeholders) {
44
+ Object.keys(rendering.placeholders).forEach((placeholder) => {
45
+ const patternPlaceholder = (0, layout_1.isDynamicPlaceholder)(placeholder)
46
+ ? (0, layout_1.getDynamicPlaceholderPattern)(placeholder)
47
+ : null;
48
+ if (patternPlaceholder && patternPlaceholder.test(phName)) {
49
+ if (isEditing) {
50
+ phName = placeholder;
51
+ }
52
+ else {
53
+ rendering.placeholders[phName] = rendering.placeholders[placeholder];
54
+ delete rendering.placeholders[placeholder];
55
+ }
56
+ }
57
+ });
58
+ }
59
+ if (rendering && rendering.placeholders && Object.keys(rendering.placeholders).length > 0) {
60
+ result = rendering.placeholders[phName];
61
+ }
62
+ else {
63
+ result = null;
64
+ }
65
+ if (!result) {
66
+ console.warn(`Placeholder '${phName}' was not found in the current rendering data`, JSON.stringify(rendering, null, 2));
67
+ return [];
68
+ }
69
+ return result;
70
+ };
71
+ exports.getPlaceholderRenderings = getPlaceholderRenderings;
72
+ /**
73
+ * Get SXA specific params from Sitecore rendering params
74
+ * @param {ComponentRendering} rendering rendering object
75
+ * @returns {object} converted SXA params
76
+ */
77
+ const getSXAParams = (rendering) => {
78
+ if (!rendering.params)
79
+ return {};
80
+ const { GridParameters, Styles } = rendering.params;
81
+ return ((GridParameters || Styles) && {
82
+ styles: `${GridParameters || ''} ${Styles || ''}`,
83
+ });
84
+ };
85
+ exports.getSXAParams = getSXAParams;
86
+ /**
87
+ * Renders the placeholder when it is empty. The required CSS styles are applied to the placeholder in edit mode.
88
+ * @param {React.ReactNode | React.ReactElement[]} node react node
89
+ * @returns react node
90
+ */
91
+ const renderEmptyPlaceholder = (node) => {
92
+ return react_1.default.createElement("div", { className: "sc-jss-empty-placeholder" }, node);
93
+ };
94
+ exports.renderEmptyPlaceholder = renderEmptyPlaceholder;
95
+ /**
96
+ * Get component props to be passed to the rendered component.
97
+ * @param {PlaceholderProps} placeholderProps current placeholder props
98
+ * @param {ComponentRendering} componentRendering rendering to be rendered
99
+ * @param {string} renderingKey unique key to pass over to rendering props
100
+ * @returns {RenderedProps} props to be passed to the rendered component
101
+ */
102
+ const getRenderedComponentProps = (placeholderProps, componentRendering, renderingKey) => {
103
+ const { fields: placeholderFields, params: placeholderParams } = placeholderProps, passThroughProps = __rest(placeholderProps, ["fields", "params"]);
104
+ delete passThroughProps.missingComponentComponent;
105
+ delete passThroughProps.hiddenRenderingComponent;
106
+ delete passThroughProps.name;
107
+ const fields = Object.assign(Object.assign({}, (placeholderFields || {})), (componentRendering.fields || {}));
108
+ const params = Object.assign(Object.assign({}, (placeholderParams || {})), (componentRendering.params || {}));
109
+ return Object.assign(Object.assign({ key: renderingKey }, passThroughProps), { fields, params: Object.assign(Object.assign({}, params), (0, exports.getSXAParams)(componentRendering)), rendering: componentRendering });
110
+ };
111
+ exports.getRenderedComponentProps = getRenderedComponentProps;
112
+ /**
113
+ * Get component implemenation from the component map based on the rendering definition.
114
+ * @param {ComponentRendering} renderingDefinition rendering data
115
+ * @param {string} placeholderName name of current placeholder
116
+ * @param {ComponentMap} componentMap component map for the current app
117
+ * @param {React.ComponentClass} [hiddenRenderingComponent] fallback implementation in to be rendered if the rendering is hidden
118
+ * @param {React.ComponentClass} [missingComponentComponent] fallback implementation in case no component is found in the component map
119
+ * @returns {ContentSDKComponet | null} component implementation or null if no component map is provided
120
+ */
121
+ const getComponentForRendering = (renderingDefinition, placeholderName, componentMap, hiddenRenderingComponent, missingComponentComponent) => {
122
+ var _a, _b;
123
+ if (renderingDefinition.componentName === core_1.constants.HIDDEN_RENDERING_NAME) {
124
+ return {
125
+ component: hiddenRenderingComponent !== null && hiddenRenderingComponent !== void 0 ? hiddenRenderingComponent : HiddenRendering_1.HiddenRendering,
126
+ isEmpty: true,
127
+ };
128
+ }
129
+ else if (!renderingDefinition.componentName) {
130
+ console.error(`Placeholder ${placeholderName} contains unknown component ${renderingDefinition.componentName}. Ensure that a React component exists for it, and that it is registered in your component-map file.`);
131
+ return {
132
+ component: () => react_1.default.createElement(react_1.default.Fragment, null),
133
+ isEmpty: true,
134
+ };
135
+ }
136
+ let component = null;
137
+ if (!componentMap || componentMap.size === 0) {
138
+ console.warn(`No components were available in component map to service request for component ${renderingDefinition}`);
139
+ }
140
+ else {
141
+ component = componentMap.get(renderingDefinition.componentName);
142
+ }
143
+ if (!component) {
144
+ // Fallback/defaults for Sitecore Component renderings (in case not defined in component map)
145
+ if (renderingDefinition.componentName === FEaaSComponent_1.FEAAS_COMPONENT_RENDERING_NAME) {
146
+ return {
147
+ component: FEaaSComponent_1.FEaaSComponent,
148
+ };
149
+ }
150
+ else if (renderingDefinition.componentName === FEaaSWrapper_1.FEAAS_WRAPPER_RENDERING_NAME) {
151
+ return {
152
+ component: FEaaSWrapper_1.FEaaSWrapper,
153
+ };
154
+ }
155
+ else if (renderingDefinition.componentName === BYOCComponent_1.BYOC_COMPONENT_RENDERING_NAME) {
156
+ return {
157
+ component: BYOCComponent_1.BYOCComponent,
158
+ };
159
+ }
160
+ else if (renderingDefinition.componentName === BYOCWrapper_1.BYOC_WRAPPER_RENDERING_NAME) {
161
+ // wrapping with error boundary could cause problems in case where parent component uses withPlaceholder HOC and tries to access its children props
162
+ // that's why we need to mark BYOC wrapper dynamic
163
+ return {
164
+ component: BYOCWrapper_1.BYOCWrapper,
165
+ dynamic: true,
166
+ };
167
+ }
168
+ return {
169
+ component: missingComponentComponent !== null && missingComponentComponent !== void 0 ? missingComponentComponent : MissingComponent_1.MissingComponent,
170
+ isEmpty: true,
171
+ };
172
+ }
173
+ // Render SXA Rendering Variant if available
174
+ const exportName = (_a = renderingDefinition.params) === null || _a === void 0 ? void 0 : _a.FieldNames;
175
+ const renderedComponent = exportName && exportName !== sharedTypes_1.DEFAULT_EXPORT_NAME
176
+ ? component[exportName]
177
+ : component.default ||
178
+ component.Default ||
179
+ component;
180
+ // all dynamic elements will have a separate render prop
181
+ return {
182
+ component: renderedComponent,
183
+ dynamic: !!((_b = renderedComponent.render) === null || _b === void 0 ? void 0 : _b.preload),
184
+ componentType: component.componentType,
185
+ };
186
+ };
187
+ exports.getComponentForRendering = getComponentForRendering;
@@ -5,16 +5,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.withPlaceholder = withPlaceholder;
7
7
  const react_1 = __importDefault(require("react"));
8
- const PlaceholderCommon_1 = require("../components/PlaceholderCommon");
9
8
  const withComponentMap_1 = require("./withComponentMap");
10
9
  const withSitecore_1 = require("./withSitecore");
10
+ const Placeholder_1 = require("../components/Placeholder");
11
11
  /**
12
+ * HOC to provide client-side placeholder functionality to a component.
12
13
  * @param {WithPlaceholderSpec} placeholders
13
14
  * @param {WithPlaceholderOptions} [options]
14
15
  */
15
16
  function withPlaceholder(placeholders, options) {
16
17
  return (WrappedComponent) => {
17
- class WithPlaceholder extends PlaceholderCommon_1.PlaceholderCommon {
18
+ class WithPlaceholder extends Placeholder_1.PlaceholderComponent {
18
19
  constructor(props) {
19
20
  super(props);
20
21
  }
@@ -42,16 +43,15 @@ function withPlaceholder(placeholders, options) {
42
43
  definitelyArrayPlacholders.forEach((placeholder) => {
43
44
  let placeholderData;
44
45
  if (typeof placeholder !== 'string' && placeholder.placeholder && placeholder.prop) {
45
- placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, placeholder.placeholder, childProps.page.mode.isEditing);
46
+ placeholderData = (0, Placeholder_1.getPlaceholderRenderings)(renderingData, placeholder.placeholder, childProps.page.mode.isEditing);
46
47
  if (placeholderData) {
47
- childProps[placeholder.prop] = this.getComponentsForRenderingData(placeholderData);
48
+ childProps[placeholder.prop] = Placeholder_1.PlaceholderComponent.getRenderedComponents(this.props, placeholderData);
48
49
  }
49
50
  }
50
51
  else {
51
- placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, placeholder, childProps.page.mode.isEditing);
52
+ placeholderData = (0, Placeholder_1.getPlaceholderRenderings)(renderingData, placeholder, childProps.page.mode.isEditing);
52
53
  if (placeholderData) {
53
- childProps[placeholder] =
54
- this.getComponentsForRenderingData(placeholderData);
54
+ childProps[placeholder] = Placeholder_1.PlaceholderComponent.getRenderedComponents(this.props, placeholderData);
55
55
  }
56
56
  }
57
57
  });
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.withServerPlaceholder = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ServerPlaceholder_1 = require("../components/Placeholder/ServerPlaceholder");
9
+ const withServerPlaceholder = (Component) => {
10
+ return (props) => {
11
+ const placeholders = props.rendering.placeholders;
12
+ const phProps = {};
13
+ for (const placeholder of Object.keys(placeholders)) {
14
+ phProps[placeholder] = (react_1.default.createElement(ServerPlaceholder_1.ServerPlaceholder, { name: placeholder, rendering: props.rendering, page: props.page, componentMap: props.componentMap }));
15
+ }
16
+ const displayName = Component.displayName || Component.name || 'Component';
17
+ const propsCopy = Object.assign(Object.assign({}, props), { displayName });
18
+ return react_1.default.createElement(Component, Object.assign({}, propsCopy, { placeholders: phProps }));
19
+ };
20
+ };
21
+ exports.withServerPlaceholder = withServerPlaceholder;
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SitePathService = exports.DefaultEmptyFieldEditingComponentImage = exports.DefaultEmptyFieldEditingComponentText = exports.EditingScripts = exports.withEmptyFieldEditingComponent = exports.withFieldMetadata = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecore = exports.withSitecore = exports.SitecoreProviderReactContext = exports.SitecoreProvider = 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.Image = exports.Placeholder = exports.Form = exports.mediaApi = exports.ErrorPage = exports.GraphQLRequestClient = exports.DefaultRetryStrategy = exports.DictionaryService = exports.EditMode = exports.getFieldValue = exports.getChildPlaceholder = exports.LayoutService = exports.LayoutServicePageState = exports.getDesignLibraryStylesheetLinks = exports.getContentStylesheetLink = exports.resetEditorChromes = exports.isEditorActive = exports.NativeDataFetcher = exports.MemoryCacheClient = exports.ClientError = exports.enableDebug = exports.constants = void 0;
3
+ exports.SitePathService = exports.ClientEditingChromesUpdate = exports.DefaultEmptyFieldEditingComponentImage = exports.DefaultEmptyFieldEditingComponentText = exports.EditingScripts = exports.withEmptyFieldEditingComponent = exports.withFieldMetadata = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecore = exports.withSitecore = exports.SitecoreProviderReactContext = exports.SitecoreProvider = 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.Image = exports.ServerPlaceholder = exports.Placeholder = exports.Form = exports.mediaApi = exports.ErrorPage = exports.GraphQLRequestClient = exports.DefaultRetryStrategy = exports.DictionaryService = exports.EditMode = exports.getFieldValue = exports.getChildPlaceholder = exports.LayoutService = exports.LayoutServicePageState = exports.getDesignLibraryStylesheetLinks = exports.getContentStylesheetLink = exports.resetEditorChromes = exports.isEditorActive = exports.NativeDataFetcher = exports.MemoryCacheClient = exports.ClientError = exports.enableDebug = exports.constants = void 0;
4
4
  var core_1 = require("@sitecore-content-sdk/core");
5
5
  Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return core_1.constants; } });
6
6
  Object.defineProperty(exports, "enableDebug", { enumerable: true, get: function () { return core_1.enableDebug; } });
@@ -30,6 +30,7 @@ var Form_1 = require("./components/Form");
30
30
  Object.defineProperty(exports, "Form", { enumerable: true, get: function () { return Form_1.Form; } });
31
31
  var Placeholder_1 = require("./components/Placeholder");
32
32
  Object.defineProperty(exports, "Placeholder", { enumerable: true, get: function () { return Placeholder_1.Placeholder; } });
33
+ Object.defineProperty(exports, "ServerPlaceholder", { enumerable: true, get: function () { return Placeholder_1.ServerPlaceholder; } });
33
34
  var Image_1 = require("./components/Image");
34
35
  Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return Image_1.Image; } });
35
36
  var RichText_1 = require("./components/RichText");
@@ -75,5 +76,7 @@ Object.defineProperty(exports, "EditingScripts", { enumerable: true, get: functi
75
76
  var DefaultEmptyFieldEditingComponents_1 = require("./components/DefaultEmptyFieldEditingComponents");
76
77
  Object.defineProperty(exports, "DefaultEmptyFieldEditingComponentText", { enumerable: true, get: function () { return DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentText; } });
77
78
  Object.defineProperty(exports, "DefaultEmptyFieldEditingComponentImage", { enumerable: true, get: function () { return DefaultEmptyFieldEditingComponents_1.DefaultEmptyFieldEditingComponentImage; } });
79
+ var ClientEditingChromesUpdate_1 = require("./components/ClientEditingChromesUpdate");
80
+ Object.defineProperty(exports, "ClientEditingChromesUpdate", { enumerable: true, get: function () { return ClientEditingChromesUpdate_1.ClientEditingChromesUpdate; } });
78
81
  var site_1 = require("@sitecore-content-sdk/core/site");
79
82
  Object.defineProperty(exports, "SitePathService", { enumerable: true, get: function () { return site_1.SitePathService; } });
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { isEditorActive, resetEditorChromes } from '@sitecore-content-sdk/core/editing';
3
+ import React, { useEffect } from 'react';
4
+ /**
5
+ * Updates editing chromes in app router / RSC context.
6
+ * This ensures all the relevant Pages editing markup is applied once all client components are loaded.
7
+ */
8
+ export const ClientEditingChromesUpdate = () => {
9
+ useEffect(() => {
10
+ if (isEditorActive()) {
11
+ resetEditorChromes();
12
+ }
13
+ }, []);
14
+ return React.createElement(React.Fragment, null);
15
+ };
@@ -16,7 +16,7 @@ import { EDITING_COMPONENT_ID, EDITING_COMPONENT_PLACEHOLDER, } from '@sitecore-
16
16
  import { DesignLibraryStatus, getDesignLibraryStatusEvent, addComponentUpdateHandler, } from '@sitecore-content-sdk/core/editing';
17
17
  import * as codegen from '@sitecore-content-sdk/core/codegen';
18
18
  import { useSitecore } from '../enhancers/withSitecore';
19
- import { PlaceholderMetadata } from './PlaceholderMetadata';
19
+ import { PlaceholderMetadata } from './Placeholder';
20
20
  let { getDesignLibraryImportMapEvent, getDesignLibraryComponentPropsEvent, addComponentPreviewHandler, } = codegen;
21
21
  export const __mockDependencies = (mocks) => {
22
22
  addComponentPreviewHandler = mocks.addComponentPreviewHandler;
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import React from 'react';
2
3
  import { useSitecore } from '../enhancers/withSitecore';
3
4
  import { getContentSdkPagesClientData } from '@sitecore-content-sdk/core/editing';
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import React, { Suspense } from 'react';
2
3
  import { withSitecore } from '../enhancers/withSitecore';
3
4
  class ErrorBoundary extends React.Component {