@sitecore-content-sdk/content 1.5.0-canary.10
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 +29 -0
- package/dist/cjs/client/index.js +14 -0
- package/dist/cjs/client/models.js +2 -0
- package/dist/cjs/client/sitecore-client.js +443 -0
- package/dist/cjs/client/utils.js +53 -0
- package/dist/cjs/config/define-config.js +200 -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 +15 -0
- package/dist/cjs/editing/codegen/preview.js +305 -0
- package/dist/cjs/editing/component-layout-service.js +63 -0
- package/dist/cjs/editing/design-library.js +191 -0
- package/dist/cjs/editing/editing-service.js +82 -0
- package/dist/cjs/editing/index.js +34 -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 +72 -0
- package/dist/cjs/layout/index.js +29 -0
- package/dist/cjs/layout/layout-service.js +69 -0
- package/dist/cjs/layout/models.js +39 -0
- package/dist/cjs/layout/rewrite-edge-host.js +161 -0
- package/dist/cjs/layout/themes.js +74 -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 +95 -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 +103 -0
- package/dist/cjs/tools/codegen/import-map.js +398 -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 +58 -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 +24 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/models.js +1 -0
- package/dist/esm/client/sitecore-client.js +439 -0
- package/dist/esm/client/utils.js +49 -0
- package/dist/esm/config/define-config.js +194 -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 +287 -0
- package/dist/esm/editing/component-layout-service.js +56 -0
- package/dist/esm/editing/design-library.js +179 -0
- package/dist/esm/editing/editing-service.js +75 -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 +64 -0
- package/dist/esm/layout/index.js +7 -0
- package/dist/esm/layout/layout-service.js +62 -0
- package/dist/esm/layout/models.js +36 -0
- package/dist/esm/layout/rewrite-edge-host.js +155 -0
- package/dist/esm/layout/themes.js +69 -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 +88 -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 +97 -0
- package/dist/esm/tools/codegen/import-map.js +355 -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 +51 -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 +346 -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 +294 -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 +289 -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 +119 -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 +7 -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/rewrite-edge-host.d.ts +43 -0
- package/types/layout/rewrite-edge-host.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 +88 -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 +72 -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 +20 -0
- package/types/tools/codegen/extract-files.d.ts.map +1 -0
- package/types/tools/codegen/import-map.d.ts +98 -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 +22 -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,144 @@
|
|
|
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.DictionaryService = exports.queryError = void 0;
|
|
7
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
8
|
+
const constants_1 = require("../constants");
|
|
9
|
+
const debug_1 = __importDefault(require("../debug"));
|
|
10
|
+
/** @private */
|
|
11
|
+
exports.queryError = 'Valid value for rootItemId not provided and failed to auto-resolve app root item.';
|
|
12
|
+
/** @default */
|
|
13
|
+
const siteQuery = /* GraphQL */ `
|
|
14
|
+
query DictionarySiteQuery(
|
|
15
|
+
$siteName: String!
|
|
16
|
+
$language: String!
|
|
17
|
+
$pageSize: Int = 500
|
|
18
|
+
$after: String
|
|
19
|
+
) {
|
|
20
|
+
site {
|
|
21
|
+
siteInfo(site: $siteName) {
|
|
22
|
+
dictionary(language: $language, first: $pageSize, after: $after) {
|
|
23
|
+
pageInfo {
|
|
24
|
+
endCursor
|
|
25
|
+
hasNext
|
|
26
|
+
}
|
|
27
|
+
results {
|
|
28
|
+
key
|
|
29
|
+
value
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
/**
|
|
37
|
+
* Service that fetch dictionary data using Sitecore's GraphQL API.
|
|
38
|
+
* @augments DictionaryServiceBase
|
|
39
|
+
* @mixes SearchQueryService<DictionaryQueryResult>
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
class DictionaryService {
|
|
43
|
+
/**
|
|
44
|
+
* Creates an instance of graphQL dictionary service with the provided options
|
|
45
|
+
* @param {DictionaryService} options instance
|
|
46
|
+
*/
|
|
47
|
+
constructor(options) {
|
|
48
|
+
this.options = options;
|
|
49
|
+
this.cache = this.getCacheClient();
|
|
50
|
+
this.graphQLClient = this.getGraphQLClient();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Fetches dictionary data for internalization. Uses search query by default
|
|
54
|
+
* @param {string} language the language to fetch
|
|
55
|
+
* @param {string} site site name to fetch data for.
|
|
56
|
+
* @param {FetchOptions} [fetchOptions] Options to override graphQL client details like retries and fetch implementation
|
|
57
|
+
* @returns {Promise<DictionaryPhrases>} dictionary phrases
|
|
58
|
+
* @throws {Error} if the app root was not found for the specified site and language.
|
|
59
|
+
*/
|
|
60
|
+
async fetchDictionaryData(language, site, fetchOptions) {
|
|
61
|
+
var _a, _b;
|
|
62
|
+
const cacheKey = site + language;
|
|
63
|
+
const cachedValue = this.getCacheValue(cacheKey);
|
|
64
|
+
if (cachedValue) {
|
|
65
|
+
debug_1.default.dictionary('using cached dictionary data for %s %s', language, site);
|
|
66
|
+
return cachedValue;
|
|
67
|
+
}
|
|
68
|
+
const phrases = {};
|
|
69
|
+
debug_1.default.dictionary('fetching dictionary data for %s %s', language, site);
|
|
70
|
+
let results = [];
|
|
71
|
+
let hasNext = true;
|
|
72
|
+
let after = '';
|
|
73
|
+
if (!site) {
|
|
74
|
+
throw new RangeError(constants_1.siteNameError);
|
|
75
|
+
}
|
|
76
|
+
if (!language) {
|
|
77
|
+
throw new RangeError(constants_1.languageError);
|
|
78
|
+
}
|
|
79
|
+
while (hasNext) {
|
|
80
|
+
const fetchResponse = await this.graphQLClient.request(siteQuery, {
|
|
81
|
+
siteName: site,
|
|
82
|
+
language,
|
|
83
|
+
pageSize: this.options.pageSize,
|
|
84
|
+
after,
|
|
85
|
+
}, fetchOptions);
|
|
86
|
+
if ((_b = (_a = fetchResponse === null || fetchResponse === void 0 ? void 0 : fetchResponse.site) === null || _a === void 0 ? void 0 : _a.siteInfo) === null || _b === void 0 ? void 0 : _b.dictionary) {
|
|
87
|
+
results = results.concat(fetchResponse.site.siteInfo.dictionary.results);
|
|
88
|
+
after = fetchResponse.site.siteInfo.dictionary.pageInfo.endCursor;
|
|
89
|
+
hasNext = fetchResponse.site.siteInfo.dictionary.pageInfo.hasNext;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
hasNext = false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
results.forEach((item) => (phrases[item.key] = item.value));
|
|
96
|
+
this.setCacheValue(cacheKey, phrases);
|
|
97
|
+
return phrases;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Caches a @see DictionaryPhrases value for the specified cache key.
|
|
101
|
+
* @param {string} key The cache key.
|
|
102
|
+
* @param {DictionaryPhrases} value The value to cache.
|
|
103
|
+
* @returns The value added to the cache.
|
|
104
|
+
* @mixes CacheClient<DictionaryPhrases>
|
|
105
|
+
*/
|
|
106
|
+
setCacheValue(key, value) {
|
|
107
|
+
return this.cache.setCacheValue(key, value);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Retrieves a @see DictionaryPhrases value from the cache.
|
|
111
|
+
* @param {string} key The cache key.
|
|
112
|
+
* @returns The @see DictionaryPhrases value, or null if the specified key is not found in the cache.
|
|
113
|
+
*/
|
|
114
|
+
getCacheValue(key) {
|
|
115
|
+
return this.cache.getCacheValue(key);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Gets a cache client that can cache data. Uses memory-cache as the default
|
|
119
|
+
* library for caching (@see MemoryCacheClient). Override this method if you
|
|
120
|
+
* want to use something else.
|
|
121
|
+
* @returns {CacheClient} implementation
|
|
122
|
+
*/
|
|
123
|
+
getCacheClient() {
|
|
124
|
+
return new core_1.MemoryCacheClient(this.options);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Gets a GraphQL client that can make requests to the API. Uses graphql-request as the default
|
|
128
|
+
* library for fetching graphql data (@see GraphQLRequestClient). Override this method if you
|
|
129
|
+
* want to use something else.
|
|
130
|
+
* @returns {GraphQLClient} implementation
|
|
131
|
+
*/
|
|
132
|
+
getGraphQLClient() {
|
|
133
|
+
var _a, _b;
|
|
134
|
+
if (!this.options.clientFactory) {
|
|
135
|
+
throw new Error('clientFactory needs to be provided when initializing GraphQL client.');
|
|
136
|
+
}
|
|
137
|
+
return this.options.clientFactory({
|
|
138
|
+
debugger: debug_1.default.dictionary,
|
|
139
|
+
retries: (_a = this.options.retries) === null || _a === void 0 ? void 0 : _a.count,
|
|
140
|
+
retryStrategy: (_b = this.options.retries) === null || _b === void 0 ? void 0 : _b.retryStrategy,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.DictionaryService = DictionaryService;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLocaleRewrite = exports.DictionaryService = void 0;
|
|
4
|
+
var dictionary_service_1 = require("./dictionary-service");
|
|
5
|
+
Object.defineProperty(exports, "DictionaryService", { enumerable: true, get: function () { return dictionary_service_1.DictionaryService; } });
|
|
6
|
+
var utils_1 = require("./utils");
|
|
7
|
+
Object.defineProperty(exports, "getLocaleRewrite", { enumerable: true, get: function () { return utils_1.getLocaleRewrite; } });
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getLocaleRewrite = getLocaleRewrite;
|
|
4
|
+
/**
|
|
5
|
+
* Get a locale rewrite path for given pathname
|
|
6
|
+
* @param {string} pathname the pathname
|
|
7
|
+
* @param {string} locale the site data to include in the rewrite
|
|
8
|
+
* @returns {string} the rewrite path
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
function getLocaleRewrite(pathname, locale) {
|
|
12
|
+
if (pathname === '/')
|
|
13
|
+
return `/${locale}`;
|
|
14
|
+
const path = pathname.startsWith('/') ? pathname : '/' + pathname;
|
|
15
|
+
return `/${locale}${path}`;
|
|
16
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.HIDDEN_RENDERING_NAME = exports.defineConfig = exports.form = exports.debug = void 0;
|
|
40
|
+
const form = __importStar(require("./form"));
|
|
41
|
+
exports.form = form;
|
|
42
|
+
var debug_1 = require("./debug");
|
|
43
|
+
Object.defineProperty(exports, "debug", { enumerable: true, get: function () { return __importDefault(debug_1).default; } });
|
|
44
|
+
var config_1 = require("./config");
|
|
45
|
+
Object.defineProperty(exports, "defineConfig", { enumerable: true, get: function () { return config_1.defineConfig; } });
|
|
46
|
+
var constants_1 = require("./constants");
|
|
47
|
+
Object.defineProperty(exports, "HIDDEN_RENDERING_NAME", { enumerable: true, get: function () { return constants_1.HIDDEN_RENDERING_NAME; } });
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.traverseComponent = exports.traverseField = exports.traversePlaceholder = exports.getContentStylesheetUrl = exports.getContentStylesheetLink = void 0;
|
|
4
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
5
|
+
const tools_1 = require("@sitecore-content-sdk/core/tools");
|
|
6
|
+
/**
|
|
7
|
+
* Regular expression to check if the content styles are used in the field value
|
|
8
|
+
*/
|
|
9
|
+
const CLASS_REGEXP = /class=".*(\bck-content\b).*"/g;
|
|
10
|
+
/**
|
|
11
|
+
* Get the content styles link to be loaded from the Sitecore Edge Platform
|
|
12
|
+
* @param {LayoutServiceData} layoutData Layout service data
|
|
13
|
+
* @param {string} sitecoreEdgeContextId Sitecore Edge Context ID
|
|
14
|
+
* @param {string} [sitecoreEdgeUrl] Sitecore Edge Platform URL (resolved at config level). Defaults to platform URL.
|
|
15
|
+
* @returns {HTMLLink | null} content styles link, null if no styles are used in layout
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
const getContentStylesheetLink = (layoutData, sitecoreEdgeContextId, sitecoreEdgeUrl = core_1.constants.SITECORE_EDGE_PLATFORM_URL_DEFAULT) => {
|
|
19
|
+
if (!layoutData.sitecore.route)
|
|
20
|
+
return null;
|
|
21
|
+
const config = { loadStyles: false };
|
|
22
|
+
(0, exports.traverseComponent)(layoutData.sitecore.route, config);
|
|
23
|
+
if (!config.loadStyles)
|
|
24
|
+
return null;
|
|
25
|
+
return {
|
|
26
|
+
href: (0, exports.getContentStylesheetUrl)(sitecoreEdgeContextId, sitecoreEdgeUrl),
|
|
27
|
+
rel: 'stylesheet',
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
exports.getContentStylesheetLink = getContentStylesheetLink;
|
|
31
|
+
const getContentStylesheetUrl = (sitecoreEdgeContextId, sitecoreEdgeUrl = core_1.constants.SITECORE_EDGE_PLATFORM_URL_DEFAULT) => `${(0, tools_1.normalizeUrl)(sitecoreEdgeUrl)}/v1/files/pages/styles/content-styles.css?sitecoreContextId=${sitecoreEdgeContextId}`;
|
|
32
|
+
exports.getContentStylesheetUrl = getContentStylesheetUrl;
|
|
33
|
+
const traversePlaceholder = (components, config) => {
|
|
34
|
+
if (config.loadStyles)
|
|
35
|
+
return;
|
|
36
|
+
components.forEach((component) => {
|
|
37
|
+
(0, exports.traverseComponent)(component, config);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
exports.traversePlaceholder = traversePlaceholder;
|
|
41
|
+
const traverseField = (field, config) => {
|
|
42
|
+
if (!field || typeof field !== 'object' || config.loadStyles)
|
|
43
|
+
return;
|
|
44
|
+
if ('value' in field && typeof field.value === 'string') {
|
|
45
|
+
config.loadStyles = CLASS_REGEXP.test(field.value);
|
|
46
|
+
}
|
|
47
|
+
else if ('fields' in field) {
|
|
48
|
+
Object.values(field.fields).forEach((field) => {
|
|
49
|
+
(0, exports.traverseField)(field, config);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else if (Array.isArray(field)) {
|
|
53
|
+
field.forEach((field) => {
|
|
54
|
+
(0, exports.traverseField)(field, config);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
exports.traverseField = traverseField;
|
|
59
|
+
const traverseComponent = (component, config) => {
|
|
60
|
+
if (config.loadStyles)
|
|
61
|
+
return;
|
|
62
|
+
if ('fields' in component && component.fields) {
|
|
63
|
+
Object.values(component.fields).forEach((field) => {
|
|
64
|
+
(0, exports.traverseField)(field, config);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const placeholders = component.placeholders || {};
|
|
68
|
+
Object.keys(placeholders).forEach((placeholder) => {
|
|
69
|
+
(0, exports.traversePlaceholder)(placeholders[placeholder], config);
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
exports.traverseComponent = traverseComponent;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyMediaUrlRewrite = exports.getDefaultMediaUrlTransformer = exports.containsDefaultEdgeHost = exports.rewriteEdgeHostInResponse = 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; } });
|
|
25
|
+
var rewrite_edge_host_1 = require("./rewrite-edge-host");
|
|
26
|
+
Object.defineProperty(exports, "rewriteEdgeHostInResponse", { enumerable: true, get: function () { return rewrite_edge_host_1.rewriteEdgeHostInResponse; } });
|
|
27
|
+
Object.defineProperty(exports, "containsDefaultEdgeHost", { enumerable: true, get: function () { return rewrite_edge_host_1.containsDefaultEdgeHost; } });
|
|
28
|
+
Object.defineProperty(exports, "getDefaultMediaUrlTransformer", { enumerable: true, get: function () { return rewrite_edge_host_1.getDefaultMediaUrlTransformer; } });
|
|
29
|
+
Object.defineProperty(exports, "applyMediaUrlRewrite", { enumerable: true, get: function () { return rewrite_edge_host_1.applyMediaUrlRewrite; } });
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
const layoutData = ((_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
|
+
return layoutData;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Returns GraphQL Layout query
|
|
50
|
+
* @param {string} itemPath page route
|
|
51
|
+
* @param {string} [site] site name
|
|
52
|
+
* @param {string} [language] language
|
|
53
|
+
* @returns {string} GraphQL query
|
|
54
|
+
*/
|
|
55
|
+
getLayoutQuery(itemPath, site, language) {
|
|
56
|
+
const languageVariable = language ? `, language:"${language}"` : '';
|
|
57
|
+
const layoutQuery = this.serviceConfig.formatLayoutQuery
|
|
58
|
+
? this.serviceConfig.formatLayoutQuery(site, itemPath, language)
|
|
59
|
+
: `layout(site:"${site}", routePath:"${itemPath}"${languageVariable})`;
|
|
60
|
+
return `query ${exports.GRAPHQL_LAYOUT_QUERY_NAME} {
|
|
61
|
+
${layoutQuery}{
|
|
62
|
+
item {
|
|
63
|
+
rendered
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
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,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rewriteEdgeHostInResponse = rewriteEdgeHostInResponse;
|
|
4
|
+
exports.getDefaultMediaUrlTransformer = getDefaultMediaUrlTransformer;
|
|
5
|
+
exports.applyMediaUrlRewrite = applyMediaUrlRewrite;
|
|
6
|
+
exports.containsDefaultEdgeHost = containsDefaultEdgeHost;
|
|
7
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
8
|
+
const tools_1 = require("@sitecore-content-sdk/core/tools");
|
|
9
|
+
/** Default Edge hostname derived from the default Edge URL (edge.sitecorecloud.io). @internal */
|
|
10
|
+
const DEFAULT_EDGE_HOSTNAME = new URL(core_1.constants.SITECORE_EXPERIENCE_EDGE_URL_DEFAULT).hostname;
|
|
11
|
+
/**
|
|
12
|
+
* Returns true if the given URL has a custom (non-default) Edge hostname.
|
|
13
|
+
* @param {string} url - Full URL or hostname
|
|
14
|
+
* @returns {boolean} True if URL host is not the default Edge hostname
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
function isCustomEdgeUrl(url) {
|
|
18
|
+
try {
|
|
19
|
+
const u = url.startsWith('http') ? new URL(url) : new URL(`https://${url}`);
|
|
20
|
+
const host = u.hostname.toLowerCase();
|
|
21
|
+
return host !== DEFAULT_EDGE_HOSTNAME;
|
|
22
|
+
}
|
|
23
|
+
catch (_a) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Regular expression for matching the default Edge hostname in URLs.
|
|
29
|
+
* Matches both http:// and https:// protocols.
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
const EDGE_HOST_PATTERN = new RegExp(`https?://${escapeRegExp(DEFAULT_EDGE_HOSTNAME)}`, 'gi');
|
|
33
|
+
/**
|
|
34
|
+
* Escapes a string so it can be safely embedded in a RegExp as a literal.
|
|
35
|
+
* @param {string} input - The string to escape
|
|
36
|
+
* @returns {string} The escaped string safe for RegExp construction
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
function escapeRegExp(input) {
|
|
40
|
+
return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Rewrites Experience Edge hostnames in a response object to use the custom hostname.
|
|
44
|
+
* This function performs a deep traversal of the object and replaces any string values
|
|
45
|
+
* containing the default Experience Edge hostname with the custom hostname.
|
|
46
|
+
* Caller should pass the Experience Edge URL (e.g. from resolveExperienceEdgeUrl()).
|
|
47
|
+
*
|
|
48
|
+
* Use case: Experience Edge returns Layout Service output (layout, placeholders, component fields).
|
|
49
|
+
* Field values can contain URLs with the Edge hostname—e.g. Image field `value.src`
|
|
50
|
+
* (`https://edge.sitecorecloud.io/-/media/...`), Rich Text HTML (`<img src="...">`),
|
|
51
|
+
* or link `href`. When using a custom hostname (e.g. CDN in front of Edge), these URLs
|
|
52
|
+
* must be rewritten so layout API and media requests both go through the custom host.
|
|
53
|
+
* @param {T} response - The response object to process (typically LayoutServiceData)
|
|
54
|
+
* @param {string} edgeUrl - Experience Edge URL to rewrite to (e.g. from resolveExperienceEdgeUrl).
|
|
55
|
+
* @returns {T} The response object with Experience Edge hostnames rewritten (same reference if no custom hostname)
|
|
56
|
+
* @public
|
|
57
|
+
* @example
|
|
58
|
+
* const layout = await layoutService.fetchLayoutData(path, options);
|
|
59
|
+
* const rewritten = rewriteEdgeHostInResponse(layout, resolveExperienceEdgeUrl());
|
|
60
|
+
*/
|
|
61
|
+
function rewriteEdgeHostInResponse(response, edgeUrl) {
|
|
62
|
+
const customEdgeUrl = (0, tools_1.normalizeUrl)(edgeUrl);
|
|
63
|
+
if (!isCustomEdgeUrl(customEdgeUrl)) {
|
|
64
|
+
return response;
|
|
65
|
+
}
|
|
66
|
+
return deepRewriteEdgeHost(response, customEdgeUrl);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Recursively traverses an object/array and rewrites Edge hostnames in string values.
|
|
70
|
+
* @param {T} value - The value to process
|
|
71
|
+
* @param {string} customEdgeUrl - The custom Edge URL to replace with
|
|
72
|
+
* @returns {T} The processed value with Edge hostnames replaced
|
|
73
|
+
* @internal
|
|
74
|
+
*/
|
|
75
|
+
function deepRewriteEdgeHost(value, customEdgeUrl) {
|
|
76
|
+
// Handle null/undefined
|
|
77
|
+
if (value === null || value === undefined) {
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
// Handle strings - perform the actual replacement
|
|
81
|
+
if (typeof value === 'string') {
|
|
82
|
+
return rewriteEdgeHostInString(value, customEdgeUrl);
|
|
83
|
+
}
|
|
84
|
+
// Handle arrays
|
|
85
|
+
if (Array.isArray(value)) {
|
|
86
|
+
return value.map((item) => deepRewriteEdgeHost(item, customEdgeUrl));
|
|
87
|
+
}
|
|
88
|
+
// Handle plain objects
|
|
89
|
+
if (typeof value === 'object') {
|
|
90
|
+
// Skip non-plain objects (Date, RegExp, etc.)
|
|
91
|
+
if (Object.getPrototypeOf(value) !== Object.prototype) {
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
const result = {};
|
|
95
|
+
for (const key of Object.keys(value)) {
|
|
96
|
+
result[key] = deepRewriteEdgeHost(value[key], customEdgeUrl);
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
// Return primitives (numbers, booleans) unchanged
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Replaces Experience Edge hostnames in a string with the custom hostname.
|
|
105
|
+
* @param {string} str - The string to process
|
|
106
|
+
* @param {string} customEdgeUrl - The custom Experience Edge URL to replace with
|
|
107
|
+
* @returns {string} The string with Experience Edge hostnames replaced
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
function rewriteEdgeHostInString(str, customEdgeUrl) {
|
|
111
|
+
EDGE_HOST_PATTERN.lastIndex = 0;
|
|
112
|
+
return str.replace(EDGE_HOST_PATTERN, customEdgeUrl);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Returns the default media URL transformer: rewrites Experience Edge hostnames when custom hostname is configured.
|
|
116
|
+
* @param {string} edgeUrl - Experience Edge URL to rewrite to (e.g. from resolveExperienceEdgeUrl()).
|
|
117
|
+
* @returns {(value: string) => string} Transformer function; returns string unchanged when no custom hostname
|
|
118
|
+
* @internal
|
|
119
|
+
*/
|
|
120
|
+
function getDefaultMediaUrlTransformer(edgeUrl) {
|
|
121
|
+
const customEdgeUrl = (0, tools_1.normalizeUrl)(edgeUrl);
|
|
122
|
+
if (!isCustomEdgeUrl(customEdgeUrl)) {
|
|
123
|
+
return (s) => s;
|
|
124
|
+
}
|
|
125
|
+
return (s) => rewriteEdgeHostInString(s, customEdgeUrl);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Deeply traverses a value and applies a string transformer to every string.
|
|
129
|
+
* @param {T} value - Value to process (layout, object, array, string)
|
|
130
|
+
* @param {(s: string) => string} transform - Function that transforms each string
|
|
131
|
+
* @returns {T} New value with transformed strings
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
function applyMediaUrlRewrite(value, transform) {
|
|
135
|
+
if (value === null || value === undefined) {
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
if (typeof value === 'string') {
|
|
139
|
+
return transform(value);
|
|
140
|
+
}
|
|
141
|
+
if (Array.isArray(value)) {
|
|
142
|
+
return value.map((item) => applyMediaUrlRewrite(item, transform));
|
|
143
|
+
}
|
|
144
|
+
if (typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype) {
|
|
145
|
+
const result = {};
|
|
146
|
+
for (const key of Object.keys(value)) {
|
|
147
|
+
result[key] = applyMediaUrlRewrite(value[key], transform);
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Checks if a string contains the default Edge hostname (from the default Edge URL).
|
|
155
|
+
* @param {string} str - The string to check
|
|
156
|
+
* @returns {boolean} True if the string contains the default Edge hostname
|
|
157
|
+
* @public
|
|
158
|
+
*/
|
|
159
|
+
function containsDefaultEdgeHost(str) {
|
|
160
|
+
return str.includes(DEFAULT_EDGE_HOSTNAME);
|
|
161
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getStylesheetUrl = void 0;
|
|
4
|
+
exports.getDesignLibraryStylesheetLinks = getDesignLibraryStylesheetLinks;
|
|
5
|
+
const core_1 = require("@sitecore-content-sdk/core");
|
|
6
|
+
const tools_1 = require("@sitecore-content-sdk/core/tools");
|
|
7
|
+
const _1 = require(".");
|
|
8
|
+
/**
|
|
9
|
+
* Pattern for library ids
|
|
10
|
+
* @example -library--foo
|
|
11
|
+
*/
|
|
12
|
+
const STYLES_LIBRARY_ID_REGEX = /-library--([^\s]+)/;
|
|
13
|
+
/**
|
|
14
|
+
* Walks through rendering tree and returns list of links of all FEAAS, BYOC or SXA Design Library Stylesheets that are used
|
|
15
|
+
* @param {LayoutServiceData} layoutData Layout service data
|
|
16
|
+
* @param {string} sitecoreEdgeContextId Sitecore Edge Context ID
|
|
17
|
+
* @param {string} [sitecoreEdgeUrl] Sitecore Edge Platform URL (resolved at config level). Defaults to platform URL.
|
|
18
|
+
* @returns {HTMLLink[]} library stylesheet links
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
function getDesignLibraryStylesheetLinks(layoutData, sitecoreEdgeContextId, sitecoreEdgeUrl = core_1.constants.SITECORE_EDGE_PLATFORM_URL_DEFAULT) {
|
|
22
|
+
const ids = new Set();
|
|
23
|
+
if (!layoutData.sitecore.route)
|
|
24
|
+
return [];
|
|
25
|
+
traverseComponent(layoutData.sitecore.route, ids);
|
|
26
|
+
return [...ids].map((id) => ({
|
|
27
|
+
href: (0, exports.getStylesheetUrl)(id, sitecoreEdgeContextId, sitecoreEdgeUrl),
|
|
28
|
+
rel: 'stylesheet',
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
const getStylesheetUrl = (id, sitecoreEdgeContextId, sitecoreEdgeUrl = core_1.constants.SITECORE_EDGE_PLATFORM_URL_DEFAULT) => `${(0, tools_1.normalizeUrl)(sitecoreEdgeUrl)}/v1/files/components/styles/${id}.css?sitecoreContextId=${sitecoreEdgeContextId}`;
|
|
32
|
+
exports.getStylesheetUrl = getStylesheetUrl;
|
|
33
|
+
/**
|
|
34
|
+
* Traverse placeholder and components to add library ids
|
|
35
|
+
* @param {ComponentRendering[]} components
|
|
36
|
+
* @param {Set<string>} ids library ids
|
|
37
|
+
*/
|
|
38
|
+
const traversePlaceholder = (components, ids) => {
|
|
39
|
+
components.map((component) => {
|
|
40
|
+
return traverseComponent(component, ids);
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Traverse component and children to add library ids
|
|
45
|
+
* @param {RouteData | ComponentRendering | HtmlElementRendering} component component data
|
|
46
|
+
* @param {Set<string>} ids library ids
|
|
47
|
+
*/
|
|
48
|
+
const traverseComponent = (component, ids) => {
|
|
49
|
+
var _a, _b, _c, _d, _e, _f;
|
|
50
|
+
let libraryId = undefined;
|
|
51
|
+
if ('params' in component && component.params) {
|
|
52
|
+
// LibraryID in css class name takes precedence over LibraryId attribute
|
|
53
|
+
libraryId =
|
|
54
|
+
((_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]) ||
|
|
55
|
+
((_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]) ||
|
|
56
|
+
component.params.LibraryId ||
|
|
57
|
+
undefined;
|
|
58
|
+
}
|
|
59
|
+
// if params are empty we try to fall back to data source
|
|
60
|
+
if (!libraryId && 'fields' in component && component.fields) {
|
|
61
|
+
libraryId =
|
|
62
|
+
((_e = (0, _1.getFieldValue)(component.fields, 'CSSStyles', '').match(STYLES_LIBRARY_ID_REGEX)) === null || _e === void 0 ? void 0 : _e[1]) ||
|
|
63
|
+
((_f = (0, _1.getFieldValue)(component.fields, 'Styles', '').match(STYLES_LIBRARY_ID_REGEX)) === null || _f === void 0 ? void 0 : _f[1]) ||
|
|
64
|
+
(0, _1.getFieldValue)(component.fields, 'LibraryId', '') ||
|
|
65
|
+
undefined;
|
|
66
|
+
}
|
|
67
|
+
if (libraryId) {
|
|
68
|
+
ids.add(libraryId);
|
|
69
|
+
}
|
|
70
|
+
const placeholders = component.placeholders || {};
|
|
71
|
+
Object.keys(placeholders).forEach((placeholder) => {
|
|
72
|
+
traversePlaceholder(placeholders[placeholder], ids);
|
|
73
|
+
});
|
|
74
|
+
};
|