@sitecore-jss/sitecore-jss-react 22.0.0-canary.8 → 22.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.
- package/LICENSE.txt +202 -202
- package/README.md +10 -10
- package/dist/cjs/ComponentBuilder.js +25 -0
- package/dist/cjs/components/BYOCComponent.js +122 -0
- package/dist/cjs/components/BYOCWrapper.js +18 -0
- package/dist/cjs/components/Date.js +1 -4
- package/dist/cjs/components/FEaaSComponent.js +120 -61
- package/dist/cjs/components/FEaaSWrapper.js +18 -0
- package/dist/cjs/components/Image.js +6 -13
- package/dist/cjs/components/Link.js +8 -12
- package/dist/cjs/components/MissingComponent.js +6 -2
- package/dist/cjs/components/Placeholder.js +1 -29
- package/dist/cjs/components/PlaceholderCommon.js +21 -12
- package/dist/cjs/components/RichText.js +1 -5
- package/dist/cjs/components/SitecoreContext.js +2 -2
- package/dist/cjs/components/Text.js +1 -5
- package/dist/cjs/index.js +17 -3
- package/dist/cjs/utils.js +50 -2
- package/dist/esm/ComponentBuilder.js +21 -0
- package/dist/esm/components/BYOCComponent.js +91 -0
- package/dist/esm/components/BYOCWrapper.js +11 -0
- package/dist/esm/components/Date.js +1 -4
- package/dist/esm/components/FEaaSComponent.js +115 -61
- package/dist/esm/components/FEaaSWrapper.js +11 -0
- package/dist/esm/components/Image.js +6 -13
- package/dist/esm/components/Link.js +8 -12
- package/dist/esm/components/MissingComponent.js +6 -2
- package/dist/esm/components/Placeholder.js +2 -30
- package/dist/esm/components/PlaceholderCommon.js +21 -12
- package/dist/esm/components/RichText.js +1 -5
- package/dist/esm/components/SitecoreContext.js +2 -2
- package/dist/esm/components/Text.js +1 -5
- package/dist/esm/index.js +8 -4
- package/dist/esm/utils.js +47 -1
- package/package.json +9 -11
- package/types/ComponentBuilder.d.ts +28 -0
- package/types/components/BYOCComponent.d.ts +87 -0
- package/types/components/BYOCWrapper.d.ts +3 -0
- package/types/components/Date.d.ts +1 -0
- package/types/components/EditFrame.d.ts +1 -0
- package/types/components/FEaaSComponent.d.ts +59 -6
- package/types/components/FEaaSWrapper.d.ts +3 -0
- package/types/components/File.d.ts +1 -0
- package/types/components/HiddenRendering.d.ts +3 -1
- package/types/components/Image.d.ts +2 -6
- package/types/components/Link.d.ts +2 -1
- package/types/components/MissingComponent.d.ts +2 -0
- package/types/components/Placeholder.d.ts +1 -0
- package/types/components/PlaceholderCommon.d.ts +1 -0
- package/types/components/RichText.d.ts +1 -0
- package/types/components/SitecoreContext.d.ts +2 -1
- package/types/components/Text.d.ts +1 -0
- package/types/components/VisitorIdentification.d.ts +1 -0
- package/types/components/sharedTypes.d.ts +1 -0
- package/types/enhancers/withComponentFactory.d.ts +1 -0
- package/types/enhancers/withDatasourceCheck.d.ts +2 -1
- package/types/enhancers/withEditorChromes.d.ts +1 -0
- package/types/enhancers/withSitecoreContext.d.ts +2 -1
- package/types/index.d.ts +8 -4
- package/types/utils.d.ts +18 -1
|
@@ -22,72 +22,131 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
25
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
27
|
-
|
|
28
|
-
const
|
|
38
|
+
exports.composeComponentEndpoint = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.FEAAS_COMPONENT_RENDERING_NAME = void 0;
|
|
39
|
+
const react_1 = __importDefault(require("react"));
|
|
40
|
+
const FEAAS = __importStar(require("@sitecore-feaas/clientside/react"));
|
|
29
41
|
const layout_1 = require("@sitecore-jss/sitecore-jss/layout");
|
|
42
|
+
const utils_1 = require("../utils");
|
|
30
43
|
exports.FEAAS_COMPONENT_RENDERING_NAME = 'FEaaSComponent';
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
!params.ComponentVersion ||
|
|
45
|
-
!params.ComponentRevision ||
|
|
46
|
-
!params.ComponentHostName) {
|
|
44
|
+
/**
|
|
45
|
+
* @param {FEaaSComponentProps} props component props
|
|
46
|
+
*/
|
|
47
|
+
const FEaaSComponent = (props) => {
|
|
48
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
49
|
+
const computedRevision = ((_a = props.params) === null || _a === void 0 ? void 0 : _a.ComponentRevision) || props.revisionFallback;
|
|
50
|
+
if (!props.template &&
|
|
51
|
+
(!props.params ||
|
|
52
|
+
!props.params.LibraryId ||
|
|
53
|
+
!props.params.ComponentId ||
|
|
54
|
+
!props.params.ComponentVersion ||
|
|
55
|
+
!props.params.ComponentHostName ||
|
|
56
|
+
!computedRevision)) {
|
|
47
57
|
// Missing FEaaS component required props
|
|
48
58
|
return null;
|
|
49
59
|
}
|
|
50
|
-
//
|
|
51
|
-
(0,
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
script.onload = resolve;
|
|
58
|
-
document.head.appendChild(script);
|
|
59
|
-
}));
|
|
60
|
-
}, []);
|
|
61
|
-
let data = '';
|
|
62
|
-
if (params === null || params === void 0 ? void 0 : params.ComponentDataOverride) {
|
|
63
|
-
// Use override data if provided
|
|
64
|
-
data = params.ComponentDataOverride;
|
|
65
|
-
}
|
|
66
|
-
else if (fields) {
|
|
67
|
-
// Otherwise use datasource data (provided in fields)
|
|
68
|
-
// FEaaS expects wrapping "_" as catch-all datasource template id
|
|
69
|
-
data = JSON.stringify({ _: getDataFromFields(fields) });
|
|
70
|
-
}
|
|
71
|
-
const reqProps = {
|
|
72
|
-
library: params.LibraryId,
|
|
73
|
-
cdn: params.ComponentHostName,
|
|
74
|
-
component: params.ComponentId,
|
|
75
|
-
version: params.ComponentVersion,
|
|
76
|
-
revision: params.ComponentRevision,
|
|
77
|
-
data,
|
|
78
|
-
};
|
|
79
|
-
const optProps = {};
|
|
80
|
-
if (params.ComponentInstanceId) {
|
|
81
|
-
optProps.instance = params.ComponentInstanceId;
|
|
82
|
-
}
|
|
83
|
-
if (params.ComponentHTMLOverride) {
|
|
84
|
-
optProps.dangerouslySetInnerHTML = { __html: params.ComponentHTMLOverride };
|
|
85
|
-
}
|
|
86
|
-
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
87
|
-
react_1.default.createElement("link", { rel: "preload", as: "style", href: `${reqProps.cdn}/styles/${reqProps.library}/published.css` }),
|
|
88
|
-
react_1.default.createElement("link", { rel: "preload", as: "fetch", href: `${reqProps.cdn}/components/${reqProps.library}/${reqProps.component}/${reqProps.version}/${reqProps.revision}.html` }),
|
|
89
|
-
react_1.default.createElement("link", { rel: "preload", as: "script", href: exports.FEAAS_MODULE_SRC }),
|
|
90
|
-
react_1.default.createElement("feaas-stylesheet", { library: reqProps.library, cdn: reqProps.cdn }),
|
|
91
|
-
react_1.default.createElement("feaas-component", Object.assign({}, reqProps, optProps))));
|
|
60
|
+
// combine fetchedData from server with datasource data (if present)
|
|
61
|
+
const data = Object.assign(Object.assign({}, props.fetchedData), { _: (0, utils_1.getDataFromFields)((_b = props.fields) !== null && _b !== void 0 ? _b : {}) });
|
|
62
|
+
// FEaaS control would still be hydrated by client
|
|
63
|
+
// we pass all the props as a workaround to avoid hydration error, until we convert all JSS components to server side
|
|
64
|
+
// this also allows component to fall back to full client-side rendering when template or src is empty
|
|
65
|
+
// FEAAS should not fetch anything, since JSS does the fetching - so we pass empty array into fetch param
|
|
66
|
+
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: [] }));
|
|
92
67
|
};
|
|
93
68
|
exports.FEaaSComponent = FEaaSComponent;
|
|
69
|
+
/**
|
|
70
|
+
* Fetches server component props required for server rendering, based on rendering params.
|
|
71
|
+
* Component endpoint will either be retrieved from params or from endpointOverride
|
|
72
|
+
* @param {FEaaSComponentParams} params component params
|
|
73
|
+
* @param {LayoutServicePageState} [pageState] page state to determine which component variant to use
|
|
74
|
+
* @param {string} [endpointOverride] optional override for component endpoint
|
|
75
|
+
*/
|
|
76
|
+
function fetchFEaaSComponentServerProps(params, pageState, endpointOverride) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const revisionFallback = pageState && pageState !== layout_1.LayoutServicePageState.Normal ? 'staged' : 'published';
|
|
79
|
+
const src = endpointOverride || (0, exports.composeComponentEndpoint)(params, revisionFallback);
|
|
80
|
+
let template = '';
|
|
81
|
+
let fetchedData = {};
|
|
82
|
+
const fetchDataOptions = params.ComponentDataOverride
|
|
83
|
+
? JSON.parse(params.ComponentDataOverride)
|
|
84
|
+
: {};
|
|
85
|
+
try {
|
|
86
|
+
template = yield fetchComponentTemplate(src, params, revisionFallback);
|
|
87
|
+
fetchedData = yield fetchData(fetchDataOptions);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
console.error(e);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
fetchedData,
|
|
94
|
+
revisionFallback,
|
|
95
|
+
template,
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
exports.fetchFEaaSComponentServerProps = fetchFEaaSComponentServerProps;
|
|
100
|
+
/**
|
|
101
|
+
* @param {string} src component endpoint
|
|
102
|
+
* @param {FEaaSComponentParams} params rendering parameters for FEAAS component
|
|
103
|
+
* @param {RevisionType} revisionFallback fallback revision to fetch if revision is absent in params
|
|
104
|
+
*/
|
|
105
|
+
function fetchComponentTemplate(src, params, revisionFallback) {
|
|
106
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
+
try {
|
|
108
|
+
const { template } = yield FEAAS.fetchComponent(src);
|
|
109
|
+
return template;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
console.error(`Fetch FEAAS component from ${src} failed. Ensure the component revision "${params.ComponentRevision ||
|
|
113
|
+
revisionFallback}" is present`);
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Fetches component data based on the provided data options.
|
|
120
|
+
* This function asynchronously fetches data using the FEAAS.DataSettings.fetch method.
|
|
121
|
+
*
|
|
122
|
+
* @param {FEAAS.DataOptions} dataOptions - Options to customize data fetching.
|
|
123
|
+
* @returns {Promise<FEAAS.DataScopes>} A promise that resolves with the fetched data,
|
|
124
|
+
* or rejects with an error if data fetching encounters an issue.
|
|
125
|
+
* @throws {Error} If an error occurs during data fetching, it is propagated as an error.
|
|
126
|
+
*/
|
|
127
|
+
function fetchData(dataOptions) {
|
|
128
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
try {
|
|
130
|
+
const fetchedData = yield FEAAS.DataSettings.fetch(dataOptions || {});
|
|
131
|
+
return fetchedData;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error('Fetch FEAAS component data settings failed');
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Build component endpoint URL from component's params
|
|
141
|
+
* @param {FEaaSComponentParams} params rendering parameters for FEAAS component
|
|
142
|
+
* @param {RevisionType} revisionFallback fallback revision to fetch if revision is absent in params
|
|
143
|
+
* @returns component endpoint URL
|
|
144
|
+
*/
|
|
145
|
+
const composeComponentEndpoint = (params, revisionFallback) => {
|
|
146
|
+
const revision = params.ComponentRevision || revisionFallback;
|
|
147
|
+
const hostname = params.ComponentHostName.startsWith('https://')
|
|
148
|
+
? params.ComponentHostName
|
|
149
|
+
: `https://${params.ComponentHostName}`;
|
|
150
|
+
return `${hostname}/components/${params.LibraryId}/${params.ComponentId}/${params.ComponentVersion}/${revision}`;
|
|
151
|
+
};
|
|
152
|
+
exports.composeComponentEndpoint = composeComponentEndpoint;
|
|
@@ -0,0 +1,18 @@
|
|
|
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.FEaaSWrapper = exports.FEAAS_WRAPPER_RENDERING_NAME = void 0;
|
|
7
|
+
const FEaaSComponent_1 = require("./FEaaSComponent");
|
|
8
|
+
const react_1 = __importDefault(require("react"));
|
|
9
|
+
exports.FEAAS_WRAPPER_RENDERING_NAME = 'FEaaSWrapper';
|
|
10
|
+
const FEaaSWrapper = (props) => {
|
|
11
|
+
var _a, _b;
|
|
12
|
+
const styles = `component feaas ${(_a = props.params) === null || _a === void 0 ? void 0 : _a.styles}`.trimEnd();
|
|
13
|
+
const id = (_b = props.params) === null || _b === void 0 ? void 0 : _b.RenderingIdentifier;
|
|
14
|
+
return (react_1.default.createElement("div", { className: styles, id: id ? id : undefined },
|
|
15
|
+
react_1.default.createElement("div", { className: "component-content" },
|
|
16
|
+
react_1.default.createElement(FEaaSComponent_1.FEaaSComponent, Object.assign({}, props)))));
|
|
17
|
+
};
|
|
18
|
+
exports.FEaaSWrapper = FEaaSWrapper;
|
|
@@ -18,8 +18,8 @@ exports.Image = exports.getEEMarkup = void 0;
|
|
|
18
18
|
const media_1 = require("@sitecore-jss/sitecore-jss/media");
|
|
19
19
|
const prop_types_1 = __importDefault(require("prop-types"));
|
|
20
20
|
const react_1 = __importDefault(require("react"));
|
|
21
|
-
const server_1 = __importDefault(require("react-dom/server"));
|
|
22
21
|
const utils_1 = require("../utils");
|
|
22
|
+
const utils_2 = require("../utils");
|
|
23
23
|
const getEditableWrapper = (editableMarkup, ...otherProps) => (
|
|
24
24
|
// create an inline wrapper and use dangerouslySetInnerHTML.
|
|
25
25
|
// if we try to parse the EE value, the parser will strip invalid or disallowed attributes from html elements - and EE uses several
|
|
@@ -61,19 +61,15 @@ const getEEMarkup = (imageField, imageParams, mediaUrlPrefix, otherProps) => {
|
|
|
61
61
|
if (!imgAttrs) {
|
|
62
62
|
return getEditableWrapper(imageField.editable);
|
|
63
63
|
}
|
|
64
|
-
const imgHtml =
|
|
64
|
+
const imgHtml = `<img ${(0, utils_2.getAttributesString)(imgAttrs)} />`;
|
|
65
65
|
const editableMarkup = imageField.editable.replace(foundImg.imgTag, imgHtml);
|
|
66
66
|
return getEditableWrapper(editableMarkup);
|
|
67
67
|
};
|
|
68
68
|
exports.getEEMarkup = getEEMarkup;
|
|
69
69
|
const Image = (_a) => {
|
|
70
|
-
var {
|
|
71
|
-
|
|
72
|
-
if (field
|
|
73
|
-
media = field;
|
|
74
|
-
}
|
|
75
|
-
const dynamicMedia = media;
|
|
76
|
-
if (!media ||
|
|
70
|
+
var { editable = true, imageParams, field, mediaUrlPrefix } = _a, otherProps = __rest(_a, ["editable", "imageParams", "field", "mediaUrlPrefix"]);
|
|
71
|
+
const dynamicMedia = field;
|
|
72
|
+
if (!field ||
|
|
77
73
|
(!dynamicMedia.editable && !dynamicMedia.value && !dynamicMedia.src)) {
|
|
78
74
|
return null;
|
|
79
75
|
}
|
|
@@ -83,7 +79,7 @@ const Image = (_a) => {
|
|
|
83
79
|
}
|
|
84
80
|
// some wise-guy/gal is passing in a 'raw' image object value
|
|
85
81
|
const img = dynamicMedia.src
|
|
86
|
-
?
|
|
82
|
+
? field
|
|
87
83
|
: dynamicMedia.value;
|
|
88
84
|
if (!img) {
|
|
89
85
|
return null;
|
|
@@ -118,7 +114,4 @@ exports.Image.propTypes = {
|
|
|
118
114
|
mediaUrlPrefix: prop_types_1.default.instanceOf(RegExp),
|
|
119
115
|
imageParams: prop_types_1.default.objectOf(prop_types_1.default.oneOfType([prop_types_1.default.number.isRequired, prop_types_1.default.string.isRequired]).isRequired),
|
|
120
116
|
};
|
|
121
|
-
exports.Image.defaultProps = {
|
|
122
|
-
editable: true,
|
|
123
|
-
};
|
|
124
117
|
exports.Image.displayName = 'Image';
|
|
@@ -40,9 +40,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
40
40
|
exports.LinkPropTypes = exports.Link = void 0;
|
|
41
41
|
const react_1 = __importStar(require("react"));
|
|
42
42
|
const prop_types_1 = __importDefault(require("prop-types"));
|
|
43
|
-
const html_react_parser_1 = __importDefault(require("html-react-parser"));
|
|
44
43
|
exports.Link = (0, react_1.forwardRef)((_a, ref) => {
|
|
45
|
-
var { field, editable, showLinkTextWithChildrenPresent } = _a, otherProps = __rest(_a, ["field", "editable", "showLinkTextWithChildrenPresent"]);
|
|
44
|
+
var { field, editable = true, showLinkTextWithChildrenPresent } = _a, otherProps = __rest(_a, ["field", "editable", "showLinkTextWithChildrenPresent"]);
|
|
46
45
|
const children = otherProps.children;
|
|
47
46
|
const dynamicField = field;
|
|
48
47
|
if (!field ||
|
|
@@ -59,13 +58,13 @@ exports.Link = (0, react_1.forwardRef)((_a, ref) => {
|
|
|
59
58
|
// However, we cannot combine arbitrary unparsed HTML (innerHTML) based components with actual vDOM components (the children)
|
|
60
59
|
// 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
|
|
61
60
|
// as siblings. Should be "good enough" for most cases - and write your own helper if it isn't. Or bring xEditor out of 2006.
|
|
62
|
-
const htmlProps = Object.assign(Object.assign({ className: 'sc-link-wrapper'
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
resultTags.push(react_1.default.createElement("span", Object.assign({}, htmlProps)
|
|
61
|
+
const htmlProps = Object.assign(Object.assign({ className: 'sc-link-wrapper', dangerouslySetInnerHTML: {
|
|
62
|
+
__html: markup,
|
|
63
|
+
} }, otherProps), { key: 'editable' });
|
|
64
|
+
// Exclude children, since 'dangerouslySetInnerHTML' and 'children' can't be set together
|
|
65
|
+
// and children will be added as a sibling
|
|
66
|
+
delete htmlProps.children;
|
|
67
|
+
resultTags.push(react_1.default.createElement("span", Object.assign({}, htmlProps)));
|
|
69
68
|
// don't render normal link tag when editing, if no children exist
|
|
70
69
|
// this preserves normal-ish behavior if not using a link body (no hacks required)
|
|
71
70
|
if (!children) {
|
|
@@ -110,7 +109,4 @@ exports.LinkPropTypes = {
|
|
|
110
109
|
showLinkTextWithChildrenPresent: prop_types_1.default.bool,
|
|
111
110
|
};
|
|
112
111
|
exports.Link.propTypes = exports.LinkPropTypes;
|
|
113
|
-
exports.Link.defaultProps = {
|
|
114
|
-
editable: true,
|
|
115
|
-
};
|
|
116
112
|
exports.Link.displayName = 'Link';
|
|
@@ -10,7 +10,11 @@ const MissingComponent = (props) => {
|
|
|
10
10
|
const componentName = props.rendering && props.rendering.componentName
|
|
11
11
|
? props.rendering.componentName
|
|
12
12
|
: 'Unnamed Component';
|
|
13
|
-
|
|
13
|
+
// error override would mean component is not unimplemented
|
|
14
|
+
!props.errorOverride &&
|
|
15
|
+
console.log(`Component props for unimplemented '${componentName}' component`, props);
|
|
16
|
+
const errorMessage = props.errorOverride ||
|
|
17
|
+
'JSS component is missing React implementation. See the developer console for more information.';
|
|
14
18
|
return (react_1.default.createElement("div", { style: {
|
|
15
19
|
background: 'darkorange',
|
|
16
20
|
outline: '5px solid orange',
|
|
@@ -19,7 +23,7 @@ const MissingComponent = (props) => {
|
|
|
19
23
|
maxWidth: '500px',
|
|
20
24
|
} },
|
|
21
25
|
react_1.default.createElement("h2", null, componentName),
|
|
22
|
-
react_1.default.createElement("p", null,
|
|
26
|
+
react_1.default.createElement("p", null, errorMessage)));
|
|
23
27
|
};
|
|
24
28
|
exports.MissingComponent = MissingComponent;
|
|
25
29
|
exports.MissingComponent.propTypes = {
|
|
@@ -50,36 +50,8 @@ class PlaceholderComponent extends PlaceholderCommon_1.PlaceholderCommon {
|
|
|
50
50
|
}
|
|
51
51
|
const renderingData = childProps.rendering;
|
|
52
52
|
const placeholderData = PlaceholderCommon_1.PlaceholderCommon.getPlaceholderDataFromRenderingData(renderingData, this.props.name);
|
|
53
|
-
this.isEmpty = placeholderData.every((rendering) => isRawRendering(rendering));
|
|
54
|
-
// This is a workaround to insert Experience Editor-specific markup on the page for empty placeholders.
|
|
55
|
-
// It makes sure the markup is inserted by react and thus avoiding hydration errors when in editing mode
|
|
56
|
-
if (this.isEmpty && utils_1.ExperienceEditor.isActive()) {
|
|
57
|
-
const codePos = placeholderData.findIndex((component) => component.name === 'code' &&
|
|
58
|
-
component.attributes.kind === 'open');
|
|
59
|
-
const plhId = placeholderData[codePos].attributes.id;
|
|
60
|
-
const emptyPlaceholderMarkup = [
|
|
61
|
-
{
|
|
62
|
-
name: 'span',
|
|
63
|
-
contents: null,
|
|
64
|
-
attributes: {
|
|
65
|
-
type: 'text/sitecore',
|
|
66
|
-
'sc-part-of': 'placeholder rendering',
|
|
67
|
-
style: 'display: none;',
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
name: 'div',
|
|
72
|
-
contents: null,
|
|
73
|
-
attributes: {
|
|
74
|
-
class: 'scEnabledChrome scEmptyPlaceholder',
|
|
75
|
-
'sc-part-of': 'placeholder',
|
|
76
|
-
'sc-placeholder-id': plhId,
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
];
|
|
80
|
-
placeholderData.splice(codePos + 1, 0, ...emptyPlaceholderMarkup);
|
|
81
|
-
}
|
|
82
53
|
const components = this.getComponentsForRenderingData(placeholderData);
|
|
54
|
+
this.isEmpty = placeholderData.every((rendering) => isRawRendering(rendering));
|
|
83
55
|
if (this.props.renderEmpty && this.isEmpty) {
|
|
84
56
|
const rendered = this.props.renderEmpty(components);
|
|
85
57
|
return components.length ? this.renderEmptyPlaceholder(rendered) : rendered;
|
|
@@ -21,14 +21,9 @@ const MissingComponent_1 = require("./MissingComponent");
|
|
|
21
21
|
const utils_1 = require("../utils");
|
|
22
22
|
const HiddenRendering_1 = require("./HiddenRendering");
|
|
23
23
|
const FEaaSComponent_1 = require("./FEaaSComponent");
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
*/
|
|
28
|
-
const EXCLUDE_PLACEHOLDERS_RENDER = [
|
|
29
|
-
new RegExp(/column-(\d{1})-\{\*\}/i),
|
|
30
|
-
new RegExp(/row-(\d{1})-\{\*\}/i),
|
|
31
|
-
];
|
|
24
|
+
const FEaaSWrapper_1 = require("./FEaaSWrapper");
|
|
25
|
+
const BYOCComponent_1 = require("./BYOCComponent");
|
|
26
|
+
const BYOCWrapper_1 = require("./BYOCWrapper");
|
|
32
27
|
class PlaceholderCommon extends react_1.default.Component {
|
|
33
28
|
constructor(props) {
|
|
34
29
|
super(props);
|
|
@@ -44,8 +39,10 @@ class PlaceholderCommon extends react_1.default.Component {
|
|
|
44
39
|
from backend side we get common name of placeholder is called 'nameOfContainer-{*}' where '{*}' marker for replacing **/
|
|
45
40
|
if (rendering === null || rendering === void 0 ? void 0 : rendering.placeholders) {
|
|
46
41
|
Object.keys(rendering.placeholders).forEach((placeholder) => {
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
const patternPlaceholder = placeholder.indexOf('{*}') !== -1
|
|
43
|
+
? new RegExp(`^${placeholder.replace(/\{\*\}+/i, '\\d+')}$`)
|
|
44
|
+
: null;
|
|
45
|
+
if (patternPlaceholder && patternPlaceholder.test(name)) {
|
|
49
46
|
rendering.placeholders[name] = rendering.placeholders[placeholder];
|
|
50
47
|
delete rendering.placeholders[placeholder];
|
|
51
48
|
}
|
|
@@ -103,8 +100,20 @@ class PlaceholderCommon extends react_1.default.Component {
|
|
|
103
100
|
else {
|
|
104
101
|
component = this.getComponentForRendering(componentRendering);
|
|
105
102
|
}
|
|
106
|
-
|
|
107
|
-
|
|
103
|
+
// Fallback/defaults for Sitecore Component renderings (in case not defined in component factory)
|
|
104
|
+
if (!component) {
|
|
105
|
+
if (componentRendering.componentName === FEaaSComponent_1.FEAAS_COMPONENT_RENDERING_NAME) {
|
|
106
|
+
component = FEaaSComponent_1.FEaaSComponent;
|
|
107
|
+
}
|
|
108
|
+
else if (componentRendering.componentName === FEaaSWrapper_1.FEAAS_WRAPPER_RENDERING_NAME) {
|
|
109
|
+
component = FEaaSWrapper_1.FEaaSWrapper;
|
|
110
|
+
}
|
|
111
|
+
else if (componentRendering.componentName === BYOCComponent_1.BYOC_COMPONENT_RENDERING_NAME) {
|
|
112
|
+
component = BYOCComponent_1.BYOCComponent;
|
|
113
|
+
}
|
|
114
|
+
else if (componentRendering.componentName === BYOCWrapper_1.BYOC_WRAPPER_RENDERING_NAME) {
|
|
115
|
+
component = BYOCWrapper_1.BYOCWrapper;
|
|
116
|
+
}
|
|
108
117
|
}
|
|
109
118
|
if (!component) {
|
|
110
119
|
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.`);
|
|
@@ -41,7 +41,7 @@ exports.RichTextPropTypes = exports.RichText = void 0;
|
|
|
41
41
|
const react_1 = __importStar(require("react"));
|
|
42
42
|
const prop_types_1 = __importDefault(require("prop-types"));
|
|
43
43
|
exports.RichText = (0, react_1.forwardRef)((_a, ref) => {
|
|
44
|
-
var { field, tag, editable } = _a, otherProps = __rest(_a, ["field", "tag", "editable"]);
|
|
44
|
+
var { field, tag = 'div', editable = true } = _a, otherProps = __rest(_a, ["field", "tag", "editable"]);
|
|
45
45
|
if (!field || (!field.editable && !field.value)) {
|
|
46
46
|
return null;
|
|
47
47
|
}
|
|
@@ -59,8 +59,4 @@ exports.RichTextPropTypes = {
|
|
|
59
59
|
editable: prop_types_1.default.bool,
|
|
60
60
|
};
|
|
61
61
|
exports.RichText.propTypes = exports.RichTextPropTypes;
|
|
62
|
-
exports.RichText.defaultProps = {
|
|
63
|
-
tag: 'div',
|
|
64
|
-
editable: true,
|
|
65
|
-
};
|
|
66
62
|
exports.RichText.displayName = 'RichText';
|
|
@@ -7,7 +7,7 @@ exports.SitecoreContext = exports.ComponentFactoryReactContext = exports.Sitecor
|
|
|
7
7
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
8
8
|
const react_1 = __importDefault(require("react"));
|
|
9
9
|
const prop_types_1 = __importDefault(require("prop-types"));
|
|
10
|
-
const
|
|
10
|
+
const react_2 = __importDefault(require("fast-deep-equal/es6/react"));
|
|
11
11
|
exports.SitecoreContextReactContext = react_1.default.createContext({});
|
|
12
12
|
exports.ComponentFactoryReactContext = react_1.default.createContext({});
|
|
13
13
|
class SitecoreContext extends react_1.default.Component {
|
|
@@ -43,7 +43,7 @@ class SitecoreContext extends react_1.default.Component {
|
|
|
43
43
|
componentDidUpdate(prevProps) {
|
|
44
44
|
// In case if somebody will manage SitecoreContext state by passing fresh `layoutData` prop
|
|
45
45
|
// instead of using `updateSitecoreContext`
|
|
46
|
-
if (!(0,
|
|
46
|
+
if (!(0, react_2.default)(prevProps.layoutData, this.props.layoutData)) {
|
|
47
47
|
this.setContext(this.props.layoutData);
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
@@ -18,7 +18,7 @@ exports.Text = void 0;
|
|
|
18
18
|
const react_1 = __importDefault(require("react"));
|
|
19
19
|
const prop_types_1 = __importDefault(require("prop-types"));
|
|
20
20
|
const Text = (_a) => {
|
|
21
|
-
var { field, tag, editable, encode } = _a, otherProps = __rest(_a, ["field", "tag", "editable", "encode"]);
|
|
21
|
+
var { field, tag, editable = true, encode = true } = _a, otherProps = __rest(_a, ["field", "tag", "editable", "encode"]);
|
|
22
22
|
if (!field || (!field.editable && (field.value === undefined || field.value === ''))) {
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
@@ -76,8 +76,4 @@ exports.Text.propTypes = {
|
|
|
76
76
|
editable: prop_types_1.default.bool,
|
|
77
77
|
encode: prop_types_1.default.bool,
|
|
78
78
|
};
|
|
79
|
-
exports.Text.defaultProps = {
|
|
80
|
-
editable: true,
|
|
81
|
-
encode: true,
|
|
82
|
-
};
|
|
83
79
|
exports.Text.displayName = 'Text';
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EditFrame = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.VisitorIdentification = exports.File = exports.LinkPropTypes = exports.Link = exports.FEaaSComponent = exports.DateField = exports.Text = exports.RichTextPropTypes = exports.RichText = exports.getEEMarkup = exports.Image = exports.Placeholder = exports.
|
|
3
|
+
exports.ComponentBuilder = exports.EditFrame = exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.VisitorIdentification = exports.File = exports.LinkPropTypes = exports.Link = exports.BYOCWrapper = exports.fetchBYOCComponentServerProps = exports.BYOCComponent = exports.FEaaSWrapper = exports.fetchFEaaSComponentServerProps = exports.FEaaSComponent = exports.DateField = exports.Text = exports.RichTextPropTypes = 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.getComponentLibraryStylesheetLinks = exports.getContentStylesheetLink = exports.DefaultEditFrameButtons = exports.DefaultEditFrameButton = exports.resetEditorChromes = exports.isEditorActive = exports.ClientError = exports.enableDebug = exports.constants = void 0;
|
|
4
4
|
var sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
|
|
5
5
|
Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return sitecore_jss_1.constants; } });
|
|
6
6
|
Object.defineProperty(exports, "enableDebug", { enumerable: true, get: function () { return sitecore_jss_1.enableDebug; } });
|
|
7
|
+
Object.defineProperty(exports, "ClientError", { enumerable: true, get: function () { return sitecore_jss_1.ClientError; } });
|
|
7
8
|
var utils_1 = require("@sitecore-jss/sitecore-jss/utils");
|
|
8
9
|
Object.defineProperty(exports, "isEditorActive", { enumerable: true, get: function () { return utils_1.isEditorActive; } });
|
|
9
10
|
Object.defineProperty(exports, "resetEditorChromes", { enumerable: true, get: function () { return utils_1.resetEditorChromes; } });
|
|
10
11
|
Object.defineProperty(exports, "DefaultEditFrameButton", { enumerable: true, get: function () { return utils_1.DefaultEditFrameButton; } });
|
|
11
12
|
Object.defineProperty(exports, "DefaultEditFrameButtons", { enumerable: true, get: function () { return utils_1.DefaultEditFrameButtons; } });
|
|
12
13
|
var layout_1 = require("@sitecore-jss/sitecore-jss/layout");
|
|
14
|
+
Object.defineProperty(exports, "getContentStylesheetLink", { enumerable: true, get: function () { return layout_1.getContentStylesheetLink; } });
|
|
15
|
+
Object.defineProperty(exports, "getComponentLibraryStylesheetLinks", { enumerable: true, get: function () { return layout_1.getComponentLibraryStylesheetLinks; } });
|
|
13
16
|
Object.defineProperty(exports, "LayoutServicePageState", { enumerable: true, get: function () { return layout_1.LayoutServicePageState; } });
|
|
14
17
|
Object.defineProperty(exports, "GraphQLLayoutService", { enumerable: true, get: function () { return layout_1.GraphQLLayoutService; } });
|
|
15
18
|
Object.defineProperty(exports, "RestLayoutService", { enumerable: true, get: function () { return layout_1.RestLayoutService; } });
|
|
@@ -20,10 +23,11 @@ Object.defineProperty(exports, "trackingApi", { enumerable: true, get: function
|
|
|
20
23
|
var i18n_1 = require("@sitecore-jss/sitecore-jss/i18n");
|
|
21
24
|
Object.defineProperty(exports, "GraphQLDictionaryService", { enumerable: true, get: function () { return i18n_1.GraphQLDictionaryService; } });
|
|
22
25
|
Object.defineProperty(exports, "RestDictionaryService", { enumerable: true, get: function () { return i18n_1.RestDictionaryService; } });
|
|
26
|
+
var graphql_1 = require("@sitecore-jss/sitecore-jss/graphql");
|
|
27
|
+
Object.defineProperty(exports, "DefaultRetryStrategy", { enumerable: true, get: function () { return graphql_1.DefaultRetryStrategy; } });
|
|
28
|
+
Object.defineProperty(exports, "GraphQLRequestClient", { enumerable: true, get: function () { return graphql_1.GraphQLRequestClient; } });
|
|
23
29
|
var media_1 = require("@sitecore-jss/sitecore-jss/media");
|
|
24
30
|
Object.defineProperty(exports, "mediaApi", { enumerable: true, get: function () { return media_1.mediaApi; } });
|
|
25
|
-
var feaas_1 = require("@sitecore-jss/sitecore-jss/feaas");
|
|
26
|
-
Object.defineProperty(exports, "getFEAASLibraryStylesheetLinks", { enumerable: true, get: function () { return feaas_1.getFEAASLibraryStylesheetLinks; } });
|
|
27
31
|
var Placeholder_1 = require("./components/Placeholder");
|
|
28
32
|
Object.defineProperty(exports, "Placeholder", { enumerable: true, get: function () { return Placeholder_1.Placeholder; } });
|
|
29
33
|
var Image_1 = require("./components/Image");
|
|
@@ -38,6 +42,14 @@ var Date_1 = require("./components/Date");
|
|
|
38
42
|
Object.defineProperty(exports, "DateField", { enumerable: true, get: function () { return Date_1.DateField; } });
|
|
39
43
|
var FEaaSComponent_1 = require("./components/FEaaSComponent");
|
|
40
44
|
Object.defineProperty(exports, "FEaaSComponent", { enumerable: true, get: function () { return FEaaSComponent_1.FEaaSComponent; } });
|
|
45
|
+
Object.defineProperty(exports, "fetchFEaaSComponentServerProps", { enumerable: true, get: function () { return FEaaSComponent_1.fetchFEaaSComponentServerProps; } });
|
|
46
|
+
var FEaaSWrapper_1 = require("./components/FEaaSWrapper");
|
|
47
|
+
Object.defineProperty(exports, "FEaaSWrapper", { enumerable: true, get: function () { return FEaaSWrapper_1.FEaaSWrapper; } });
|
|
48
|
+
var BYOCComponent_1 = require("./components/BYOCComponent");
|
|
49
|
+
Object.defineProperty(exports, "BYOCComponent", { enumerable: true, get: function () { return BYOCComponent_1.BYOCComponent; } });
|
|
50
|
+
Object.defineProperty(exports, "fetchBYOCComponentServerProps", { enumerable: true, get: function () { return BYOCComponent_1.fetchBYOCComponentServerProps; } });
|
|
51
|
+
var BYOCWrapper_1 = require("./components/BYOCWrapper");
|
|
52
|
+
Object.defineProperty(exports, "BYOCWrapper", { enumerable: true, get: function () { return BYOCWrapper_1.BYOCWrapper; } });
|
|
41
53
|
var Link_1 = require("./components/Link");
|
|
42
54
|
Object.defineProperty(exports, "Link", { enumerable: true, get: function () { return Link_1.Link; } });
|
|
43
55
|
Object.defineProperty(exports, "LinkPropTypes", { enumerable: true, get: function () { return Link_1.LinkPropTypes; } });
|
|
@@ -59,3 +71,5 @@ var withDatasourceCheck_1 = require("./enhancers/withDatasourceCheck");
|
|
|
59
71
|
Object.defineProperty(exports, "withDatasourceCheck", { enumerable: true, get: function () { return withDatasourceCheck_1.withDatasourceCheck; } });
|
|
60
72
|
var EditFrame_1 = require("./components/EditFrame");
|
|
61
73
|
Object.defineProperty(exports, "EditFrame", { enumerable: true, get: function () { return EditFrame_1.EditFrame; } });
|
|
74
|
+
var ComponentBuilder_1 = require("./ComponentBuilder");
|
|
75
|
+
Object.defineProperty(exports, "ComponentBuilder", { enumerable: true, get: function () { return ComponentBuilder_1.ComponentBuilder; } });
|
package/dist/cjs/utils.js
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
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
|
+
};
|
|
2
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.addClassName = exports.convertAttributesToReactProps = exports.convertStyleAttribute = exports.convertKebabCasetoCamelCase = void 0;
|
|
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");
|
|
4
16
|
const style_attr_1 = require("style-attr");
|
|
5
17
|
// https://stackoverflow.com/a/10426674/9324
|
|
6
18
|
const convertKebabCasetoCamelCase = (str) => str.replace(/^.|-./g, (letter, index) => index === 0 ? letter.toLowerCase() : letter.substr(1).toUpperCase());
|
|
@@ -51,7 +63,7 @@ exports.convertAttributesToReactProps = convertAttributesToReactProps;
|
|
|
51
63
|
/**
|
|
52
64
|
* "class" property will be transformed into or appended to "className" instead.
|
|
53
65
|
* @param {string} otherAttrs all other props included on the image component
|
|
54
|
-
*
|
|
66
|
+
* @returns {void}
|
|
55
67
|
*/
|
|
56
68
|
const addClassName = (otherAttrs) => {
|
|
57
69
|
if (otherAttrs.class) {
|
|
@@ -68,3 +80,39 @@ const addClassName = (otherAttrs) => {
|
|
|
68
80
|
}
|
|
69
81
|
};
|
|
70
82
|
exports.addClassName = addClassName;
|
|
83
|
+
/**
|
|
84
|
+
* Converts the given tag attributes object to a string
|
|
85
|
+
* @param {Object.<string, unknown>} attributes the attributes object
|
|
86
|
+
* @returns {string} string representation of the attributes
|
|
87
|
+
*/
|
|
88
|
+
const getAttributesString = (attributes) => {
|
|
89
|
+
const { className } = attributes, restAttributes = __rest(attributes, ["className"]);
|
|
90
|
+
const attributesEntries = Object.entries(restAttributes).map(([key, value]) => {
|
|
91
|
+
if (typeof value === 'object') {
|
|
92
|
+
const valueString = JSON.stringify(value)
|
|
93
|
+
.replace(/"|{|}/g, '')
|
|
94
|
+
.replace(/,/g, ';');
|
|
95
|
+
return `${key}="${valueString}"`;
|
|
96
|
+
}
|
|
97
|
+
return `${key}="${value}"`;
|
|
98
|
+
});
|
|
99
|
+
if (className) {
|
|
100
|
+
attributesEntries.push(`class="${className}"`);
|
|
101
|
+
}
|
|
102
|
+
return attributesEntries.join(' ');
|
|
103
|
+
};
|
|
104
|
+
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;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React implementation of component builder class for building components based on the configuration.
|
|
3
|
+
*/
|
|
4
|
+
export class ComponentBuilder {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.components = new Map([...config.components]);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new instance of component factory
|
|
11
|
+
* @returns {ComponentFactory} Component factory implementation
|
|
12
|
+
*/
|
|
13
|
+
getComponentFactory() {
|
|
14
|
+
return (componentName) => {
|
|
15
|
+
const component = this.components.get(componentName);
|
|
16
|
+
if (!component)
|
|
17
|
+
return null;
|
|
18
|
+
return component;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|