@sitecore-content-sdk/content 1.5.0-canary.5
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 -0
- package/README.md +7 -0
- package/client.d.ts +1 -0
- package/codegen.d.ts +1 -0
- package/config-cli.d.ts +1 -0
- package/config.d.ts +1 -0
- package/dist/cjs/client/edge-proxy.js +24 -0
- package/dist/cjs/client/index.js +14 -0
- package/dist/cjs/client/models.js +2 -0
- package/dist/cjs/client/sitecore-client.js +420 -0
- package/dist/cjs/client/utils.js +53 -0
- package/dist/cjs/config/define-config.js +195 -0
- package/dist/cjs/config/index.js +7 -0
- package/dist/cjs/config/models.js +12 -0
- package/dist/cjs/config-cli/define-cli-config.js +23 -0
- package/dist/cjs/config-cli/index.js +7 -0
- package/dist/cjs/config-cli/models.js +8 -0
- package/dist/cjs/constants.js +12 -0
- package/dist/cjs/debug.js +21 -0
- package/dist/cjs/editing/codegen/index.js +14 -0
- package/dist/cjs/editing/codegen/preview.js +277 -0
- package/dist/cjs/editing/component-layout-service.js +62 -0
- package/dist/cjs/editing/design-library.js +184 -0
- package/dist/cjs/editing/editing-service.js +81 -0
- package/dist/cjs/editing/index.js +33 -0
- package/dist/cjs/editing/models.js +44 -0
- package/dist/cjs/editing/utils.js +105 -0
- package/dist/cjs/form/form.js +81 -0
- package/dist/cjs/form/index.js +7 -0
- package/dist/cjs/i18n/dictionary-service.js +144 -0
- package/dist/cjs/i18n/index.js +7 -0
- package/dist/cjs/i18n/utils.js +16 -0
- package/dist/cjs/index.js +47 -0
- package/dist/cjs/layout/content-styles.js +73 -0
- package/dist/cjs/layout/index.js +24 -0
- package/dist/cjs/layout/layout-service.js +68 -0
- package/dist/cjs/layout/models.js +39 -0
- package/dist/cjs/layout/themes.js +77 -0
- package/dist/cjs/layout/utils.js +117 -0
- package/dist/cjs/media/index.js +38 -0
- package/dist/cjs/media/media-api.js +100 -0
- package/dist/cjs/models.js +2 -0
- package/dist/cjs/personalize/index.js +15 -0
- package/dist/cjs/personalize/layout-personalizer.js +98 -0
- package/dist/cjs/personalize/personalize-service.js +109 -0
- package/dist/cjs/personalize/utils.js +143 -0
- package/dist/cjs/site/error-pages-service.js +82 -0
- package/dist/cjs/site/index.js +26 -0
- package/dist/cjs/site/models.js +2 -0
- package/dist/cjs/site/redirects-service.js +109 -0
- package/dist/cjs/site/robots-service.js +74 -0
- package/dist/cjs/site/site-resolver.js +73 -0
- package/dist/cjs/site/siteinfo-service.js +94 -0
- package/dist/cjs/site/sitemap-xml-service.js +92 -0
- package/dist/cjs/site/sitepath-service.js +201 -0
- package/dist/cjs/site/utils.js +55 -0
- package/dist/cjs/sitecore-service-base.js +33 -0
- package/dist/cjs/tools/codegen/component-generation.js +49 -0
- package/dist/cjs/tools/codegen/extract-files.js +105 -0
- package/dist/cjs/tools/codegen/import-map.js +411 -0
- package/dist/cjs/tools/codegen/utils.js +418 -0
- package/dist/cjs/tools/generate-map.js +2 -0
- package/dist/cjs/tools/generateSites.js +59 -0
- package/dist/cjs/tools/index.js +30 -0
- package/dist/cjs/tools/scaffold.js +62 -0
- package/dist/cjs/tools/templating/components.js +96 -0
- package/dist/cjs/tools/templating/index.js +6 -0
- package/dist/esm/client/edge-proxy.js +19 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/models.js +1 -0
- package/dist/esm/client/sitecore-client.js +416 -0
- package/dist/esm/client/utils.js +49 -0
- package/dist/esm/config/define-config.js +189 -0
- package/dist/esm/config/index.js +2 -0
- package/dist/esm/config/models.js +9 -0
- package/dist/esm/config-cli/define-cli-config.js +19 -0
- package/dist/esm/config-cli/index.js +2 -0
- package/dist/esm/config-cli/models.js +5 -0
- package/dist/esm/constants.js +9 -0
- package/dist/esm/debug.js +19 -0
- package/dist/esm/editing/codegen/index.js +1 -0
- package/dist/esm/editing/codegen/preview.js +263 -0
- package/dist/esm/editing/component-layout-service.js +55 -0
- package/dist/esm/editing/design-library.js +172 -0
- package/dist/esm/editing/editing-service.js +74 -0
- package/dist/esm/editing/index.js +6 -0
- package/dist/esm/editing/models.js +41 -0
- package/dist/esm/editing/utils.js +98 -0
- package/dist/esm/form/form.js +72 -0
- package/dist/esm/form/index.js +1 -0
- package/dist/esm/i18n/dictionary-service.js +137 -0
- package/dist/esm/i18n/index.js +2 -0
- package/dist/esm/i18n/utils.js +13 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/layout/content-styles.js +65 -0
- package/dist/esm/layout/index.js +6 -0
- package/dist/esm/layout/layout-service.js +61 -0
- package/dist/esm/layout/models.js +36 -0
- package/dist/esm/layout/themes.js +72 -0
- package/dist/esm/layout/utils.js +109 -0
- package/dist/esm/media/index.js +2 -0
- package/dist/esm/media/media-api.js +90 -0
- package/dist/esm/models.js +1 -0
- package/dist/esm/personalize/index.js +3 -0
- package/dist/esm/personalize/layout-personalizer.js +93 -0
- package/dist/esm/personalize/personalize-service.js +102 -0
- package/dist/esm/personalize/utils.js +135 -0
- package/dist/esm/site/error-pages-service.js +75 -0
- package/dist/esm/site/index.js +8 -0
- package/dist/esm/site/models.js +1 -0
- package/dist/esm/site/redirects-service.js +102 -0
- package/dist/esm/site/robots-service.js +67 -0
- package/dist/esm/site/site-resolver.js +69 -0
- package/dist/esm/site/siteinfo-service.js +87 -0
- package/dist/esm/site/sitemap-xml-service.js +85 -0
- package/dist/esm/site/sitepath-service.js +193 -0
- package/dist/esm/site/utils.js +49 -0
- package/dist/esm/sitecore-service-base.js +29 -0
- package/dist/esm/tools/codegen/component-generation.js +44 -0
- package/dist/esm/tools/codegen/extract-files.js +99 -0
- package/dist/esm/tools/codegen/import-map.js +368 -0
- package/dist/esm/tools/codegen/utils.js +373 -0
- package/dist/esm/tools/generate-map.js +1 -0
- package/dist/esm/tools/generateSites.js +52 -0
- package/dist/esm/tools/index.js +6 -0
- package/dist/esm/tools/scaffold.js +54 -0
- package/dist/esm/tools/templating/components.js +59 -0
- package/dist/esm/tools/templating/index.js +1 -0
- package/editing.d.ts +1 -0
- package/i18n.d.ts +1 -0
- package/layout.d.ts +1 -0
- package/media.d.ts +1 -0
- package/package.json +157 -0
- package/personalize.d.ts +1 -0
- package/site.d.ts +1 -0
- package/tools.d.ts +1 -0
- package/types/client/edge-proxy.d.ts +17 -0
- package/types/client/edge-proxy.d.ts.map +1 -0
- package/types/client/index.d.ts +7 -0
- package/types/client/index.d.ts.map +1 -0
- package/types/client/models.d.ts +21 -0
- package/types/client/models.d.ts.map +1 -0
- package/types/client/sitecore-client.d.ts +338 -0
- package/types/client/sitecore-client.d.ts.map +1 -0
- package/types/client/utils.d.ts +15 -0
- package/types/client/utils.d.ts.map +1 -0
- package/types/config/define-config.d.ts +20 -0
- package/types/config/define-config.d.ts.map +1 -0
- package/types/config/index.d.ts +3 -0
- package/types/config/index.d.ts.map +1 -0
- package/types/config/models.d.ts +287 -0
- package/types/config/models.d.ts.map +1 -0
- package/types/config-cli/define-cli-config.d.ts +9 -0
- package/types/config-cli/define-cli-config.d.ts.map +1 -0
- package/types/config-cli/index.d.ts +3 -0
- package/types/config-cli/index.d.ts.map +1 -0
- package/types/config-cli/models.d.ts +6 -0
- package/types/config-cli/models.d.ts.map +1 -0
- package/types/constants.d.ts +10 -0
- package/types/constants.d.ts.map +1 -0
- package/types/debug.d.ts +19 -0
- package/types/debug.d.ts.map +1 -0
- package/types/editing/codegen/index.d.ts +2 -0
- package/types/editing/codegen/index.d.ts.map +1 -0
- package/types/editing/codegen/preview.d.ts +256 -0
- package/types/editing/codegen/preview.d.ts.map +1 -0
- package/types/editing/component-layout-service.d.ts +84 -0
- package/types/editing/component-layout-service.d.ts.map +1 -0
- package/types/editing/design-library.d.ts +111 -0
- package/types/editing/design-library.d.ts.map +1 -0
- package/types/editing/editing-service.d.ts +71 -0
- package/types/editing/editing-service.d.ts.map +1 -0
- package/types/editing/index.d.ts +7 -0
- package/types/editing/index.d.ts.map +1 -0
- package/types/editing/models.d.ts +103 -0
- package/types/editing/models.d.ts.map +1 -0
- package/types/editing/utils.d.ts +82 -0
- package/types/editing/utils.d.ts.map +1 -0
- package/types/form/form.d.ts +25 -0
- package/types/form/form.d.ts.map +1 -0
- package/types/form/index.d.ts +2 -0
- package/types/form/index.d.ts.map +1 -0
- package/types/i18n/dictionary-service.d.ts +133 -0
- package/types/i18n/dictionary-service.d.ts.map +1 -0
- package/types/i18n/index.d.ts +3 -0
- package/types/i18n/index.d.ts.map +1 -0
- package/types/i18n/utils.d.ts +9 -0
- package/types/i18n/utils.d.ts.map +1 -0
- package/types/index.d.ts +7 -0
- package/types/index.d.ts.map +1 -0
- package/types/layout/content-styles.d.ts +20 -0
- package/types/layout/content-styles.d.ts.map +1 -0
- package/types/layout/index.d.ts +6 -0
- package/types/layout/index.d.ts.map +1 -0
- package/types/layout/layout-service.d.ts +45 -0
- package/types/layout/layout-service.d.ts.map +1 -0
- package/types/layout/models.d.ts +174 -0
- package/types/layout/models.d.ts.map +1 -0
- package/types/layout/themes.d.ts +13 -0
- package/types/layout/themes.d.ts.map +1 -0
- package/types/layout/utils.d.ts +56 -0
- package/types/layout/utils.d.ts.map +1 -0
- package/types/media/index.d.ts +3 -0
- package/types/media/index.d.ts.map +1 -0
- package/types/media/media-api.d.ts +60 -0
- package/types/media/media-api.d.ts.map +1 -0
- package/types/models.d.ts +32 -0
- package/types/models.d.ts.map +1 -0
- package/types/personalize/index.d.ts +4 -0
- package/types/personalize/index.d.ts.map +1 -0
- package/types/personalize/layout-personalizer.d.ts +29 -0
- package/types/personalize/layout-personalizer.d.ts.map +1 -0
- package/types/personalize/personalize-service.d.ts +89 -0
- package/types/personalize/personalize-service.d.ts.map +1 -0
- package/types/personalize/utils.d.ts +78 -0
- package/types/personalize/utils.d.ts.map +1 -0
- package/types/site/error-pages-service.d.ts +64 -0
- package/types/site/error-pages-service.d.ts.map +1 -0
- package/types/site/index.d.ts +10 -0
- package/types/site/index.d.ts.map +1 -0
- package/types/site/models.d.ts +23 -0
- package/types/site/models.d.ts.map +1 -0
- package/types/site/redirects-service.d.ts +91 -0
- package/types/site/redirects-service.d.ts.map +1 -0
- package/types/site/robots-service.d.ts +57 -0
- package/types/site/robots-service.d.ts.map +1 -0
- package/types/site/site-resolver.d.ts +28 -0
- package/types/site/site-resolver.d.ts.map +1 -0
- package/types/site/siteinfo-service.d.ts +64 -0
- package/types/site/siteinfo-service.d.ts.map +1 -0
- package/types/site/sitemap-xml-service.d.ts +63 -0
- package/types/site/sitemap-xml-service.d.ts.map +1 -0
- package/types/site/sitepath-service.d.ts +137 -0
- package/types/site/sitepath-service.d.ts.map +1 -0
- package/types/site/utils.d.ts +41 -0
- package/types/site/utils.d.ts.map +1 -0
- package/types/sitecore-service-base.d.ts +31 -0
- package/types/sitecore-service-base.d.ts.map +1 -0
- package/types/tools/codegen/component-generation.d.ts +50 -0
- package/types/tools/codegen/component-generation.d.ts.map +1 -0
- package/types/tools/codegen/extract-files.d.ts +24 -0
- package/types/tools/codegen/extract-files.d.ts.map +1 -0
- package/types/tools/codegen/import-map.d.ts +103 -0
- package/types/tools/codegen/import-map.d.ts.map +1 -0
- package/types/tools/codegen/utils.d.ts +76 -0
- package/types/tools/codegen/utils.d.ts.map +1 -0
- package/types/tools/generate-map.d.ts +36 -0
- package/types/tools/generate-map.d.ts.map +1 -0
- package/types/tools/generateSites.d.ts +25 -0
- package/types/tools/generateSites.d.ts.map +1 -0
- package/types/tools/index.d.ts +8 -0
- package/types/tools/index.d.ts.map +1 -0
- package/types/tools/scaffold.d.ts +27 -0
- package/types/tools/scaffold.d.ts.map +1 -0
- package/types/tools/templating/components.d.ts +104 -0
- package/types/tools/templating/components.d.ts.map +1 -0
- package/types/tools/templating/index.d.ts +2 -0
- package/types/tools/templating/index.d.ts.map +1 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDesignLibraryStylesheetLinks = exports.GRAPHQL_LAYOUT_QUERY_NAME = exports.LayoutService = exports.getContentStylesheetLink = exports.EMPTY_DATE_FIELD_VALUE = exports.getDynamicPlaceholderPattern = exports.isDynamicPlaceholder = exports.isFieldValueEmpty = exports.getChildPlaceholder = exports.getFieldValue = exports.EDITING_COMPONENT_ID = exports.EDITING_COMPONENT_PLACEHOLDER = exports.RenderingType = exports.EditMode = exports.LayoutServicePageState = void 0;
|
|
4
|
+
// layout
|
|
5
|
+
var models_1 = require("./models");
|
|
6
|
+
Object.defineProperty(exports, "LayoutServicePageState", { enumerable: true, get: function () { return models_1.LayoutServicePageState; } });
|
|
7
|
+
Object.defineProperty(exports, "EditMode", { enumerable: true, get: function () { return models_1.EditMode; } });
|
|
8
|
+
Object.defineProperty(exports, "RenderingType", { enumerable: true, get: function () { return models_1.RenderingType; } });
|
|
9
|
+
Object.defineProperty(exports, "EDITING_COMPONENT_PLACEHOLDER", { enumerable: true, get: function () { return models_1.EDITING_COMPONENT_PLACEHOLDER; } });
|
|
10
|
+
Object.defineProperty(exports, "EDITING_COMPONENT_ID", { enumerable: true, get: function () { return models_1.EDITING_COMPONENT_ID; } });
|
|
11
|
+
var utils_1 = require("./utils");
|
|
12
|
+
Object.defineProperty(exports, "getFieldValue", { enumerable: true, get: function () { return utils_1.getFieldValue; } });
|
|
13
|
+
Object.defineProperty(exports, "getChildPlaceholder", { enumerable: true, get: function () { return utils_1.getChildPlaceholder; } });
|
|
14
|
+
Object.defineProperty(exports, "isFieldValueEmpty", { enumerable: true, get: function () { return utils_1.isFieldValueEmpty; } });
|
|
15
|
+
Object.defineProperty(exports, "isDynamicPlaceholder", { enumerable: true, get: function () { return utils_1.isDynamicPlaceholder; } });
|
|
16
|
+
Object.defineProperty(exports, "getDynamicPlaceholderPattern", { enumerable: true, get: function () { return utils_1.getDynamicPlaceholderPattern; } });
|
|
17
|
+
Object.defineProperty(exports, "EMPTY_DATE_FIELD_VALUE", { enumerable: true, get: function () { return utils_1.EMPTY_DATE_FIELD_VALUE; } });
|
|
18
|
+
var content_styles_1 = require("./content-styles");
|
|
19
|
+
Object.defineProperty(exports, "getContentStylesheetLink", { enumerable: true, get: function () { return content_styles_1.getContentStylesheetLink; } });
|
|
20
|
+
var layout_service_1 = require("./layout-service");
|
|
21
|
+
Object.defineProperty(exports, "LayoutService", { enumerable: true, get: function () { return layout_service_1.LayoutService; } });
|
|
22
|
+
Object.defineProperty(exports, "GRAPHQL_LAYOUT_QUERY_NAME", { enumerable: true, get: function () { return layout_service_1.GRAPHQL_LAYOUT_QUERY_NAME; } });
|
|
23
|
+
var themes_1 = require("./themes");
|
|
24
|
+
Object.defineProperty(exports, "getDesignLibraryStylesheetLinks", { enumerable: true, get: function () { return themes_1.getDesignLibraryStylesheetLinks; } });
|
|
@@ -0,0 +1,68 @@
|
|
|
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.LayoutService = exports.GRAPHQL_LAYOUT_QUERY_NAME = void 0;
|
|
7
|
+
const sitecore_service_base_1 = require("../sitecore-service-base");
|
|
8
|
+
const debug_1 = __importDefault(require("../debug"));
|
|
9
|
+
/**
|
|
10
|
+
* GraphQL layout query name
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
exports.GRAPHQL_LAYOUT_QUERY_NAME = 'ContentSdkLayoutQuery';
|
|
14
|
+
/**
|
|
15
|
+
* Service that fetch layout data using Sitecore's GraphQL API.
|
|
16
|
+
* @augments LayoutServiceBase
|
|
17
|
+
* @mixes GraphQLRequestClient
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
class LayoutService extends sitecore_service_base_1.SitecoreServiceBase {
|
|
21
|
+
/**
|
|
22
|
+
* Fetch layout data using the Sitecore GraphQL endpoint.
|
|
23
|
+
* @param {LayoutServiceConfig} serviceConfig configuration
|
|
24
|
+
*/
|
|
25
|
+
constructor(serviceConfig) {
|
|
26
|
+
super(serviceConfig);
|
|
27
|
+
this.serviceConfig = serviceConfig;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Fetch layout data for an item.
|
|
31
|
+
* @param {string} itemPath item path to fetch layout data for.
|
|
32
|
+
* @param {RouteOptions} [routeOptions] Request options like language and site to retrieve data for
|
|
33
|
+
* @param {FetchOptions} [fetchOptions] Options to override graphQL client details like retries and fetch implementation
|
|
34
|
+
* @returns {Promise<LayoutServiceData>} layout service data
|
|
35
|
+
*/
|
|
36
|
+
async fetchLayoutData(itemPath, routeOptions, fetchOptions) {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
const site = routeOptions.site;
|
|
39
|
+
const query = this.getLayoutQuery(itemPath, site, routeOptions === null || routeOptions === void 0 ? void 0 : routeOptions.locale);
|
|
40
|
+
debug_1.default.layout('fetching layout data for %s %s %s', itemPath, routeOptions === null || routeOptions === void 0 ? void 0 : routeOptions.locale, site);
|
|
41
|
+
const data = await this.graphQLClient.request(query, {}, fetchOptions);
|
|
42
|
+
// If `rendered` is empty -> not found
|
|
43
|
+
return (((_b = (_a = data === null || data === void 0 ? void 0 : data.layout) === null || _a === void 0 ? void 0 : _a.item) === null || _b === void 0 ? void 0 : _b.rendered) || {
|
|
44
|
+
sitecore: { context: { pageEditing: false, language: routeOptions === null || routeOptions === void 0 ? void 0 : routeOptions.locale }, route: null },
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Returns GraphQL Layout query
|
|
49
|
+
* @param {string} itemPath page route
|
|
50
|
+
* @param {string} [site] site name
|
|
51
|
+
* @param {string} [language] language
|
|
52
|
+
* @returns {string} GraphQL query
|
|
53
|
+
*/
|
|
54
|
+
getLayoutQuery(itemPath, site, language) {
|
|
55
|
+
const languageVariable = language ? `, language:"${language}"` : '';
|
|
56
|
+
const layoutQuery = this.serviceConfig.formatLayoutQuery
|
|
57
|
+
? this.serviceConfig.formatLayoutQuery(site, itemPath, language)
|
|
58
|
+
: `layout(site:"${site}", routePath:"${itemPath}"${languageVariable})`;
|
|
59
|
+
return `query ${exports.GRAPHQL_LAYOUT_QUERY_NAME} {
|
|
60
|
+
${layoutQuery}{
|
|
61
|
+
item {
|
|
62
|
+
rendered
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.LayoutService = LayoutService;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EDITING_COMPONENT_ID = exports.EDITING_COMPONENT_PLACEHOLDER = exports.RenderingType = exports.EditMode = exports.LayoutServicePageState = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Layout Service page state enum
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
var LayoutServicePageState;
|
|
9
|
+
(function (LayoutServicePageState) {
|
|
10
|
+
LayoutServicePageState["Preview"] = "preview";
|
|
11
|
+
LayoutServicePageState["Edit"] = "edit";
|
|
12
|
+
LayoutServicePageState["Normal"] = "normal";
|
|
13
|
+
})(LayoutServicePageState || (exports.LayoutServicePageState = LayoutServicePageState = {}));
|
|
14
|
+
/**
|
|
15
|
+
* Represents the edit mode for rendering content in Sitecore Editors
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
var EditMode;
|
|
19
|
+
(function (EditMode) {
|
|
20
|
+
EditMode["Metadata"] = "metadata";
|
|
21
|
+
})(EditMode || (exports.EditMode = EditMode = {}));
|
|
22
|
+
/**
|
|
23
|
+
* Editing rendering type
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
var RenderingType;
|
|
27
|
+
(function (RenderingType) {
|
|
28
|
+
RenderingType["Component"] = "component";
|
|
29
|
+
})(RenderingType || (exports.RenderingType = RenderingType = {}));
|
|
30
|
+
/**
|
|
31
|
+
* Static placeholder name used for component rendering
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
exports.EDITING_COMPONENT_PLACEHOLDER = 'editing-componentmode-placeholder';
|
|
35
|
+
/**
|
|
36
|
+
* Id of wrapper for component rendering
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
exports.EDITING_COMPONENT_ID = 'editing-component';
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getStylesheetUrl = void 0;
|
|
4
|
+
exports.getDesignLibraryStylesheetLinks = getDesignLibraryStylesheetLinks;
|
|
5
|
+
const tools_1 = require("@sitecore-content-sdk/core/tools");
|
|
6
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
7
|
+
const _1 = require(".");
|
|
8
|
+
const { SITECORE_EDGE_URL_DEFAULT } = core_1.constants;
|
|
9
|
+
/**
|
|
10
|
+
* Pattern for library ids
|
|
11
|
+
* @example -library--foo
|
|
12
|
+
*/
|
|
13
|
+
const STYLES_LIBRARY_ID_REGEX = /-library--([^\s]+)/;
|
|
14
|
+
/**
|
|
15
|
+
* Walks through rendering tree and returns list of links of all FEAAS, BYOC or SXA Design Library Stylesheets that are used
|
|
16
|
+
* @param {LayoutServiceData} layoutData Layout service data
|
|
17
|
+
* @param {string} sitecoreEdgeContextId Sitecore Edge Context ID
|
|
18
|
+
* @param {string} [sitecoreEdgeUrl] Sitecore Edge Platform URL. Default is https://edge-platform.sitecorecloud.io
|
|
19
|
+
* @returns {HTMLLink[]} library stylesheet links
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
function getDesignLibraryStylesheetLinks(layoutData, sitecoreEdgeContextId, sitecoreEdgeUrl = SITECORE_EDGE_URL_DEFAULT) {
|
|
23
|
+
const ids = new Set();
|
|
24
|
+
if (!layoutData.sitecore.route)
|
|
25
|
+
return [];
|
|
26
|
+
traverseComponent(layoutData.sitecore.route, ids);
|
|
27
|
+
return [...ids].map((id) => ({
|
|
28
|
+
href: (0, exports.getStylesheetUrl)(id, sitecoreEdgeContextId, sitecoreEdgeUrl),
|
|
29
|
+
rel: 'stylesheet',
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
const getStylesheetUrl = (id, sitecoreEdgeContextId, sitecoreEdgeUrl = SITECORE_EDGE_URL_DEFAULT) => {
|
|
33
|
+
return `${(0, tools_1.normalizeUrl)(sitecoreEdgeUrl)}/v1/files/components/styles/${id}.css?sitecoreContextId=${sitecoreEdgeContextId}`;
|
|
34
|
+
};
|
|
35
|
+
exports.getStylesheetUrl = getStylesheetUrl;
|
|
36
|
+
/**
|
|
37
|
+
* Traverse placeholder and components to add library ids
|
|
38
|
+
* @param {ComponentRendering[]} components
|
|
39
|
+
* @param {Set<string>} ids library ids
|
|
40
|
+
*/
|
|
41
|
+
const traversePlaceholder = (components, ids) => {
|
|
42
|
+
components.map((component) => {
|
|
43
|
+
return traverseComponent(component, ids);
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Traverse component and children to add library ids
|
|
48
|
+
* @param {RouteData | ComponentRendering | HtmlElementRendering} component component data
|
|
49
|
+
* @param {Set<string>} ids library ids
|
|
50
|
+
*/
|
|
51
|
+
const traverseComponent = (component, ids) => {
|
|
52
|
+
var _a, _b, _c, _d, _e, _f;
|
|
53
|
+
let libraryId = undefined;
|
|
54
|
+
if ('params' in component && component.params) {
|
|
55
|
+
// LibraryID in css class name takes precedence over LibraryId attribute
|
|
56
|
+
libraryId =
|
|
57
|
+
((_b = (_a = component.params.CSSStyles) === null || _a === void 0 ? void 0 : _a.match(STYLES_LIBRARY_ID_REGEX)) === null || _b === void 0 ? void 0 : _b[1]) ||
|
|
58
|
+
((_d = (_c = component.params.Styles) === null || _c === void 0 ? void 0 : _c.match(STYLES_LIBRARY_ID_REGEX)) === null || _d === void 0 ? void 0 : _d[1]) ||
|
|
59
|
+
component.params.LibraryId ||
|
|
60
|
+
undefined;
|
|
61
|
+
}
|
|
62
|
+
// if params are empty we try to fall back to data source
|
|
63
|
+
if (!libraryId && 'fields' in component && component.fields) {
|
|
64
|
+
libraryId =
|
|
65
|
+
((_e = (0, _1.getFieldValue)(component.fields, 'CSSStyles', '').match(STYLES_LIBRARY_ID_REGEX)) === null || _e === void 0 ? void 0 : _e[1]) ||
|
|
66
|
+
((_f = (0, _1.getFieldValue)(component.fields, 'Styles', '').match(STYLES_LIBRARY_ID_REGEX)) === null || _f === void 0 ? void 0 : _f[1]) ||
|
|
67
|
+
(0, _1.getFieldValue)(component.fields, 'LibraryId', '') ||
|
|
68
|
+
undefined;
|
|
69
|
+
}
|
|
70
|
+
if (libraryId) {
|
|
71
|
+
ids.add(libraryId);
|
|
72
|
+
}
|
|
73
|
+
const placeholders = component.placeholders || {};
|
|
74
|
+
Object.keys(placeholders).forEach((placeholder) => {
|
|
75
|
+
traversePlaceholder(placeholders[placeholder], ids);
|
|
76
|
+
});
|
|
77
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EMPTY_DATE_FIELD_VALUE = exports.isDynamicPlaceholder = exports.getDynamicPlaceholderPattern = void 0;
|
|
4
|
+
exports.getFieldValue = getFieldValue;
|
|
5
|
+
exports.getChildPlaceholder = getChildPlaceholder;
|
|
6
|
+
exports.isFieldValueEmpty = isFieldValueEmpty;
|
|
7
|
+
/**
|
|
8
|
+
* @param {ComponentRendering | Fields} renderingOrFields the rendering or fields object to extract the field from
|
|
9
|
+
* @param {string} fieldName the name of the field to extract
|
|
10
|
+
* @param {T} [defaultValue] the default value to return if the field is not defined
|
|
11
|
+
* @returns {Field | T} the field value or the default value if the field is not defined
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
// eslint-disable-next-line no-redeclare
|
|
15
|
+
function getFieldValue(renderingOrFields, fieldName, defaultValue) {
|
|
16
|
+
if (!renderingOrFields || !fieldName) {
|
|
17
|
+
return defaultValue;
|
|
18
|
+
}
|
|
19
|
+
const fields = renderingOrFields;
|
|
20
|
+
const field = fields[fieldName];
|
|
21
|
+
if (field && typeof field.value !== 'undefined') {
|
|
22
|
+
return field.value;
|
|
23
|
+
}
|
|
24
|
+
const rendering = renderingOrFields;
|
|
25
|
+
if (!rendering.fields ||
|
|
26
|
+
!rendering.fields[fieldName] ||
|
|
27
|
+
typeof rendering.fields[fieldName].value === 'undefined') {
|
|
28
|
+
return defaultValue;
|
|
29
|
+
}
|
|
30
|
+
return rendering.fields[fieldName].value;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Gets rendering definitions in a given child placeholder under a current rendering.
|
|
34
|
+
* @param {ComponentRendering} rendering
|
|
35
|
+
* @param {string} placeholderName
|
|
36
|
+
* @returns {ComponentRendering[]} child placeholder
|
|
37
|
+
* @public
|
|
38
|
+
*/
|
|
39
|
+
function getChildPlaceholder(rendering, placeholderName) {
|
|
40
|
+
if (!rendering ||
|
|
41
|
+
!placeholderName ||
|
|
42
|
+
!rendering.placeholders ||
|
|
43
|
+
!rendering.placeholders[placeholderName]) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
return rendering.placeholders[placeholderName];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns a regular expression pattern for a dynamic placeholder name.
|
|
50
|
+
* @param {string} placeholder Placeholder name with a dynamic segment (e.g. 'main-{*}')
|
|
51
|
+
* @returns Regular expression pattern for the dynamic segment
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
const getDynamicPlaceholderPattern = (placeholder) => {
|
|
55
|
+
return new RegExp(`^${placeholder.replace(/\{\*\}+/i, '\\d+')}$`);
|
|
56
|
+
};
|
|
57
|
+
exports.getDynamicPlaceholderPattern = getDynamicPlaceholderPattern;
|
|
58
|
+
/**
|
|
59
|
+
* Checks if the placeholder name is dynamic.
|
|
60
|
+
* @param {string} placeholder Placeholder name
|
|
61
|
+
* @returns True if the placeholder name is dynamic
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
const isDynamicPlaceholder = (placeholder) => placeholder.indexOf('{*}') !== -1;
|
|
65
|
+
exports.isDynamicPlaceholder = isDynamicPlaceholder;
|
|
66
|
+
/**
|
|
67
|
+
* The default value for an empty Date field.
|
|
68
|
+
* This value is defined as a default one by .NET
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
exports.EMPTY_DATE_FIELD_VALUE = '0001-01-01T00:00:00Z';
|
|
72
|
+
/**
|
|
73
|
+
* Determines if the passed in field object's value is empty.
|
|
74
|
+
* @param {GenericFieldValue | Partial<Field>} field the field object.
|
|
75
|
+
* Partial<T> type is used here because _field.value_ could be required or optional for the different field types
|
|
76
|
+
* @returns True if the field value is empty
|
|
77
|
+
* @public
|
|
78
|
+
*/
|
|
79
|
+
function isFieldValueEmpty(field) {
|
|
80
|
+
if (!field)
|
|
81
|
+
return true;
|
|
82
|
+
const isImageFieldEmpty = (fieldValue) => !fieldValue.src;
|
|
83
|
+
const isFileFieldEmpty = (fieldValue) => !fieldValue.src;
|
|
84
|
+
const isLinkFieldEmpty = (fieldValue) => !fieldValue.href;
|
|
85
|
+
const isDateFieldEmpty = (fieldValue) => {
|
|
86
|
+
if (typeof fieldValue === 'string') {
|
|
87
|
+
return fieldValue === exports.EMPTY_DATE_FIELD_VALUE;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
return !(typeof (fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.getMonth) === 'function' &&
|
|
91
|
+
!isNaN(fieldValue === null || fieldValue === void 0 ? void 0 : fieldValue.getMonth()));
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const isEmpty = (fieldValue) => {
|
|
95
|
+
if (fieldValue === null || fieldValue === undefined) {
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
if (typeof fieldValue === 'object') {
|
|
99
|
+
return (isImageFieldEmpty(fieldValue) &&
|
|
100
|
+
isFileFieldEmpty(fieldValue) &&
|
|
101
|
+
isLinkFieldEmpty(fieldValue) &&
|
|
102
|
+
isDateFieldEmpty(fieldValue));
|
|
103
|
+
}
|
|
104
|
+
else if (typeof fieldValue === 'number' || typeof fieldValue === 'boolean') {
|
|
105
|
+
// Avoid returning true for 0 and false values
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return !fieldValue || isDateFieldEmpty(fieldValue);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const dynamicField = field;
|
|
113
|
+
if (dynamicField.value !== undefined) {
|
|
114
|
+
return isEmpty(dynamicField.value);
|
|
115
|
+
}
|
|
116
|
+
return isEmpty(field);
|
|
117
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.mediaApi = void 0;
|
|
37
|
+
const mediaApi = __importStar(require("./media-api"));
|
|
38
|
+
exports.mediaApi = mediaApi;
|
|
@@ -0,0 +1,100 @@
|
|
|
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.getSrcSet = exports.updateImageUrl = exports.replaceMediaUrlPrefix = exports.getRequiredParams = void 0;
|
|
7
|
+
const url_parse_1 = __importDefault(require("url-parse"));
|
|
8
|
+
// finds the Sitecore media URL prefix
|
|
9
|
+
const mediaUrlPrefixRegex = /\/([-~]{1})\/media\//i;
|
|
10
|
+
/**
|
|
11
|
+
* Get required query string params which should be merged with user params
|
|
12
|
+
* @param {object} qs layout service parsed query string
|
|
13
|
+
* @returns {object} requiredParams
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
const getRequiredParams = (qs) => {
|
|
17
|
+
const { rev, db, la, vs, ts } = qs;
|
|
18
|
+
return { rev, db, la, vs, ts };
|
|
19
|
+
};
|
|
20
|
+
exports.getRequiredParams = getRequiredParams;
|
|
21
|
+
/**
|
|
22
|
+
* Replace `/~/media` or `/-/media` with `/~/jssmedia` or `/-/jssmedia`, respectively.
|
|
23
|
+
* Can use `mediaUrlPrefix` in order to use a custom prefix.
|
|
24
|
+
* @param {string} url The URL to replace the media URL prefix in
|
|
25
|
+
* @param {RegExp} [mediaUrlPrefix] The regex to match the media URL prefix
|
|
26
|
+
* @returns {string} The URL with the media URL prefix replaced
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
const replaceMediaUrlPrefix = (url, mediaUrlPrefix = mediaUrlPrefixRegex) => {
|
|
30
|
+
const parsed = (0, url_parse_1.default)(url, {}, true);
|
|
31
|
+
const match = mediaUrlPrefix.exec(parsed.pathname);
|
|
32
|
+
if (match && match.length > 1) {
|
|
33
|
+
// regex will provide us with /-/ or /~/ type
|
|
34
|
+
parsed.set('pathname', parsed.pathname.replace(mediaUrlPrefix, `/${match[1]}/jssmedia/`));
|
|
35
|
+
}
|
|
36
|
+
return parsed.toString();
|
|
37
|
+
};
|
|
38
|
+
exports.replaceMediaUrlPrefix = replaceMediaUrlPrefix;
|
|
39
|
+
/**
|
|
40
|
+
* Prepares a Sitecore media URL with `params` for use by the Content SDK media handler.
|
|
41
|
+
* This is done by replacing `/~/media` or `/-/media` with `/~/jssmedia` or `/-/jssmedia`, respectively.
|
|
42
|
+
* Provided `params` are used as the querystring parameters for the media URL.
|
|
43
|
+
* Can use `mediaUrlPrefix` in order to use a custom prefix.
|
|
44
|
+
* If no `params` are sent, the original media URL is returned.
|
|
45
|
+
* @param {string} url The URL to prepare
|
|
46
|
+
* @param {object} [params] The querystring parameters to use
|
|
47
|
+
* @param {RegExp} [mediaUrlPrefix] The regex to match the media URL prefix
|
|
48
|
+
* @returns {string} The prepared URL
|
|
49
|
+
* @public
|
|
50
|
+
*/
|
|
51
|
+
const updateImageUrl = (url, params, mediaUrlPrefix = mediaUrlPrefixRegex) => {
|
|
52
|
+
if (!params || Object.keys(params).length === 0) {
|
|
53
|
+
// if params aren't supplied, no need to run it through Content SDK media handler
|
|
54
|
+
return url;
|
|
55
|
+
}
|
|
56
|
+
// polyfill node `global` in browser to workaround https://github.com/unshiftio/url-parse/issues/150
|
|
57
|
+
if (typeof window !== 'undefined' && !window.global) {
|
|
58
|
+
window.global = {};
|
|
59
|
+
}
|
|
60
|
+
const parsed = (0, url_parse_1.default)((0, exports.replaceMediaUrlPrefix)(url, mediaUrlPrefix), {}, true);
|
|
61
|
+
const requiredParams = (0, exports.getRequiredParams)(parsed.query);
|
|
62
|
+
const query = Object.assign({}, params);
|
|
63
|
+
Object.entries(requiredParams).forEach(([key, param]) => {
|
|
64
|
+
if (param) {
|
|
65
|
+
query[key] = param;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
parsed.set('query', query);
|
|
69
|
+
return parsed.toString();
|
|
70
|
+
};
|
|
71
|
+
exports.updateImageUrl = updateImageUrl;
|
|
72
|
+
/**
|
|
73
|
+
* Receives an array of `srcSet` parameters that are iterated and used as parameters to generate
|
|
74
|
+
* a corresponding set of updated Sitecore media URLs via @see updateImageUrl. The result is a comma-delimited
|
|
75
|
+
* list of media URLs with respective dimension parameters.
|
|
76
|
+
* @example
|
|
77
|
+
* // returns '/ipsum.jpg?h=1000&w=1000 1000w, /ipsum.jpg?mh=250&mw=250 250w'
|
|
78
|
+
* getSrcSet('/ipsum.jpg', [{ h: 1000, w: 1000 }, { mh: 250, mw: 250 } ])
|
|
79
|
+
* More information about `srcSet`: {@link https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img}
|
|
80
|
+
* @param {string} url The URL to prepare
|
|
81
|
+
* @param {Array} srcSet The array of parameters to use
|
|
82
|
+
* @param {object} [imageParams] The querystring parameters to use
|
|
83
|
+
* @param {RegExp} [mediaUrlPrefix] The regex to match the media URL prefix
|
|
84
|
+
* @returns {string} The prepared URL
|
|
85
|
+
* @public
|
|
86
|
+
*/
|
|
87
|
+
const getSrcSet = (url, srcSet, imageParams, mediaUrlPrefix) => {
|
|
88
|
+
return srcSet
|
|
89
|
+
.map((params) => {
|
|
90
|
+
const newParams = Object.assign(Object.assign({}, imageParams), params);
|
|
91
|
+
const imageWidth = newParams.w || newParams.mw;
|
|
92
|
+
if (!imageWidth) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
return `${(0, exports.updateImageUrl)(url, newParams, mediaUrlPrefix)} ${imageWidth}w`;
|
|
96
|
+
})
|
|
97
|
+
.filter((value) => value)
|
|
98
|
+
.join(', ');
|
|
99
|
+
};
|
|
100
|
+
exports.getSrcSet = getSrcSet;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VARIANT_PREFIX = exports.DEFAULT_VARIANT = exports.CdpHelper = exports.normalizePersonalizedRewrite = exports.getGroomedVariantIds = exports.getPersonalizedRewriteData = exports.getPersonalizedRewrite = exports.PersonalizeService = exports.personalizeLayout = void 0;
|
|
4
|
+
var layout_personalizer_1 = require("./layout-personalizer");
|
|
5
|
+
Object.defineProperty(exports, "personalizeLayout", { enumerable: true, get: function () { return layout_personalizer_1.personalizeLayout; } });
|
|
6
|
+
var personalize_service_1 = require("./personalize-service");
|
|
7
|
+
Object.defineProperty(exports, "PersonalizeService", { enumerable: true, get: function () { return personalize_service_1.PersonalizeService; } });
|
|
8
|
+
var utils_1 = require("./utils");
|
|
9
|
+
Object.defineProperty(exports, "getPersonalizedRewrite", { enumerable: true, get: function () { return utils_1.getPersonalizedRewrite; } });
|
|
10
|
+
Object.defineProperty(exports, "getPersonalizedRewriteData", { enumerable: true, get: function () { return utils_1.getPersonalizedRewriteData; } });
|
|
11
|
+
Object.defineProperty(exports, "getGroomedVariantIds", { enumerable: true, get: function () { return utils_1.getGroomedVariantIds; } });
|
|
12
|
+
Object.defineProperty(exports, "normalizePersonalizedRewrite", { enumerable: true, get: function () { return utils_1.normalizePersonalizedRewrite; } });
|
|
13
|
+
Object.defineProperty(exports, "CdpHelper", { enumerable: true, get: function () { return utils_1.CdpHelper; } });
|
|
14
|
+
Object.defineProperty(exports, "DEFAULT_VARIANT", { enumerable: true, get: function () { return utils_1.DEFAULT_VARIANT; } });
|
|
15
|
+
Object.defineProperty(exports, "VARIANT_PREFIX", { enumerable: true, get: function () { return utils_1.VARIANT_PREFIX; } });
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.personalizeLayout = personalizeLayout;
|
|
4
|
+
exports.personalizePlaceholder = personalizePlaceholder;
|
|
5
|
+
exports.personalizeComponent = personalizeComponent;
|
|
6
|
+
const constants_1 = require("../constants");
|
|
7
|
+
const transformToHiddenRenderingVariant = (component) => (Object.assign(Object.assign({}, component), { componentName: constants_1.HIDDEN_RENDERING_NAME, experiences: {} }));
|
|
8
|
+
/**
|
|
9
|
+
* Apply personalization to layout data. This will recursively go through all placeholders/components, check experiences nodes and replace default with object from specific experience.
|
|
10
|
+
* @param {LayoutServiceData} layout Layout data
|
|
11
|
+
* @param {string} variantId variant id
|
|
12
|
+
* @param {string[]} [componentVariantIds] component variant ids
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
15
|
+
function personalizeLayout(layout, variantId, componentVariantIds) {
|
|
16
|
+
var _a;
|
|
17
|
+
// Add (page-level) variantId to Sitecore context so that it is accessible here
|
|
18
|
+
layout.sitecore.context.variantId = variantId;
|
|
19
|
+
const placeholders = ((_a = layout.sitecore.route) === null || _a === void 0 ? void 0 : _a.placeholders) || {};
|
|
20
|
+
if (Object.keys(placeholders).length === 0) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const isEditing = layout.sitecore.context.pageEditing;
|
|
24
|
+
if (placeholders) {
|
|
25
|
+
Object.keys(placeholders).forEach((placeholder) => {
|
|
26
|
+
placeholders[placeholder] = personalizePlaceholder(placeholders[placeholder], [variantId, ...(componentVariantIds || [])], isEditing);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return placeholders;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @param {Array} components components within placeholder
|
|
33
|
+
* @param {string[]} variantIds variant ids
|
|
34
|
+
* @param {boolean} isEditing indicates if page is rendered in metadata edit mode
|
|
35
|
+
* @returns {ComponentRendering[]} components with personalization applied
|
|
36
|
+
*/
|
|
37
|
+
function personalizePlaceholder(components, variantIds, isEditing) {
|
|
38
|
+
return components
|
|
39
|
+
.map((component) => {
|
|
40
|
+
const rendering = component;
|
|
41
|
+
if (rendering.experiences !== undefined) {
|
|
42
|
+
return personalizeComponent(rendering, variantIds, isEditing);
|
|
43
|
+
}
|
|
44
|
+
else if (rendering.placeholders) {
|
|
45
|
+
const placeholders = rendering.placeholders;
|
|
46
|
+
Object.keys(placeholders).forEach((placeholder) => {
|
|
47
|
+
placeholders[placeholder] = personalizePlaceholder(placeholders[placeholder], variantIds, isEditing);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return component;
|
|
51
|
+
})
|
|
52
|
+
.filter(Boolean);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* @param {ComponentRenderingWithExperiences} component component with experiences
|
|
56
|
+
* @param {string[]} variantIds variant ids
|
|
57
|
+
* @param {boolean} isEditing indicates if page is rendered in metadata edit mode
|
|
58
|
+
* @returns {ComponentRendering | null} component with personalization applied or null if hidden
|
|
59
|
+
*/
|
|
60
|
+
function personalizeComponent(component, variantIds, isEditing) {
|
|
61
|
+
// Check if we have a page/component experience matching any of the variants (there should be at most 1)
|
|
62
|
+
const match = Object.keys(component.experiences).find((variantId) => variantIds.includes(variantId));
|
|
63
|
+
const variant = match && component.experiences[match];
|
|
64
|
+
// variant and componentName can be undefined or null
|
|
65
|
+
if (!variant && !component.componentName) {
|
|
66
|
+
// DEFAULT IS HIDDEN
|
|
67
|
+
if (isEditing) {
|
|
68
|
+
component = transformToHiddenRenderingVariant(component);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else if (variant && variant.componentName === null && variant.dataSource === null) {
|
|
75
|
+
// VARIANT IS HIDDEN
|
|
76
|
+
if (isEditing) {
|
|
77
|
+
component = transformToHiddenRenderingVariant(component);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else if (variant) {
|
|
84
|
+
component = variant;
|
|
85
|
+
}
|
|
86
|
+
// remove unused experiences from layout data
|
|
87
|
+
if (component.experiences) {
|
|
88
|
+
component.experiences = {};
|
|
89
|
+
}
|
|
90
|
+
if (!component.placeholders)
|
|
91
|
+
return component;
|
|
92
|
+
Object.keys(component === null || component === void 0 ? void 0 : component.placeholders).forEach((placeholder) => {
|
|
93
|
+
if (component.placeholders) {
|
|
94
|
+
component.placeholders[placeholder] = personalizePlaceholder(component.placeholders[placeholder], variantIds);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return component;
|
|
98
|
+
}
|