@sitecore-jss/sitecore-jss
Version:
This module is provided as a part of Sitecore JavaScript Rendering SDK. It contains the core JSS APIs (layout service) and utilities.
74 lines (73 loc) • 3.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.traverseComponent = exports.traverseField = exports.traversePlaceholder = exports.getContentStylesheetUrl = exports.getContentStylesheetLink = void 0;
const constants_1 = require("../constants");
/**
* Regular expression to check if the content styles are used in the field value
*/
const CLASS_REGEXP = /class=".*(\bck-content\b).*"/g;
/**
* Get the content styles link to be loaded from the Sitecore Edge Platform
* @param {LayoutServiceData} layoutData Layout service data
* @param {string} sitecoreEdgeContextId Sitecore Edge Context ID
* @param {string} [sitecoreEdgeUrl] Sitecore Edge Platform URL. Default is https://edge-platform.sitecorecloud.io
* @returns {HTMLLink | null} content styles link, null if no styles are used in layout
*/
const getContentStylesheetLink = (layoutData, sitecoreEdgeContextId, sitecoreEdgeUrl = constants_1.SITECORE_EDGE_URL_DEFAULT) => {
if (!layoutData.sitecore.route)
return null;
const config = { loadStyles: false };
(0, exports.traverseComponent)(layoutData.sitecore.route, config);
if (!config.loadStyles)
return null;
return {
href: (0, exports.getContentStylesheetUrl)(sitecoreEdgeContextId, sitecoreEdgeUrl),
rel: 'stylesheet',
};
};
exports.getContentStylesheetLink = getContentStylesheetLink;
const getContentStylesheetUrl = (sitecoreEdgeContextId, sitecoreEdgeUrl = constants_1.SITECORE_EDGE_URL_DEFAULT) => `${sitecoreEdgeUrl}/v1/files/pages/styles/content-styles.css?sitecoreContextId=${sitecoreEdgeContextId}`;
exports.getContentStylesheetUrl = getContentStylesheetUrl;
const traversePlaceholder = (components, config) => {
if (config.loadStyles)
return;
components.forEach((component) => {
(0, exports.traverseComponent)(component, config);
});
};
exports.traversePlaceholder = traversePlaceholder;
const traverseField = (field, config) => {
if (!field || typeof field !== 'object' || config.loadStyles)
return;
if ('editable' in field && field.editable) {
config.loadStyles = CLASS_REGEXP.test(field.editable);
}
else if ('value' in field && typeof field.value === 'string') {
config.loadStyles = CLASS_REGEXP.test(field.value);
}
else if ('fields' in field) {
Object.values(field.fields).forEach((field) => {
(0, exports.traverseField)(field, config);
});
}
else if (Array.isArray(field)) {
field.forEach((field) => {
(0, exports.traverseField)(field, config);
});
}
};
exports.traverseField = traverseField;
const traverseComponent = (component, config) => {
if (config.loadStyles)
return;
if ('fields' in component && component.fields) {
Object.values(component.fields).forEach((field) => {
(0, exports.traverseField)(field, config);
});
}
const placeholders = component.placeholders || {};
Object.keys(placeholders).forEach((placeholder) => {
(0, exports.traversePlaceholder)(placeholders[placeholder], config);
});
};
exports.traverseComponent = traverseComponent;