@sitecore-content-sdk/core 1.3.0-canary.9 → 1.4.0-canary.2
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/README.md +7 -7
- package/dist/cjs/cache-client.js +55 -54
- package/dist/cjs/client/constants.js +7 -7
- package/dist/cjs/client/edge-proxy.js +24 -22
- package/dist/cjs/client/index.js +15 -15
- package/dist/cjs/client/models.js +2 -2
- package/dist/cjs/client/sitecore-client.js +421 -419
- package/dist/cjs/client/utils.js +47 -46
- package/dist/cjs/config/define-config.js +194 -193
- package/dist/cjs/config/index.js +7 -7
- package/dist/cjs/config/models.js +12 -11
- package/dist/cjs/config-cli/define-cli-config.js +23 -22
- package/dist/cjs/config-cli/index.js +7 -7
- package/dist/cjs/config-cli/models.js +8 -7
- package/dist/cjs/constants.js +49 -17
- package/dist/cjs/debug.js +48 -46
- package/dist/cjs/editing/codegen/index.js +14 -9
- package/dist/cjs/editing/codegen/preview.js +277 -193
- package/dist/cjs/editing/component-layout-service.js +62 -61
- package/dist/cjs/editing/design-library.js +183 -126
- package/dist/cjs/editing/editing-service.js +75 -74
- package/dist/cjs/editing/index.js +33 -27
- package/dist/cjs/editing/metadata.js +42 -42
- package/dist/cjs/editing/models.js +44 -38
- package/dist/cjs/editing/utils.js +108 -90
- package/dist/cjs/form/form.js +81 -78
- package/dist/cjs/form/index.js +7 -7
- package/dist/cjs/graphql-request-client.js +108 -107
- package/dist/cjs/i18n/dictionary-service.js +122 -121
- package/dist/cjs/i18n/index.js +7 -7
- package/dist/cjs/i18n/utils.js +16 -15
- package/dist/cjs/index.js +60 -60
- package/dist/cjs/layout/content-styles.js +72 -71
- package/dist/cjs/layout/index.js +24 -24
- package/dist/cjs/layout/layout-service.js +62 -57
- package/dist/cjs/layout/models.js +39 -34
- package/dist/cjs/layout/themes.js +76 -75
- package/dist/cjs/layout/utils.js +117 -110
- package/dist/cjs/media/index.js +38 -38
- package/dist/cjs/media/media-api.js +100 -96
- package/dist/cjs/models.js +2 -2
- package/dist/cjs/native-fetcher.js +194 -179
- package/dist/cjs/personalize/index.js +15 -15
- package/dist/cjs/personalize/layout-personalizer.js +98 -97
- package/dist/cjs/personalize/personalize-service.js +98 -94
- package/dist/cjs/personalize/utils.js +143 -136
- package/dist/cjs/retries.js +43 -42
- package/dist/cjs/site/error-pages-service.js +65 -64
- package/dist/cjs/site/index.js +26 -26
- package/dist/cjs/site/models.js +2 -2
- package/dist/cjs/site/redirects-service.js +94 -81
- package/dist/cjs/site/robots-service.js +66 -65
- package/dist/cjs/site/site-resolver.js +73 -72
- package/dist/cjs/site/siteinfo-service.js +84 -80
- package/dist/cjs/site/sitemap-xml-service.js +84 -83
- package/dist/cjs/site/sitepath-service.js +165 -164
- package/dist/cjs/site/utils.js +55 -47
- package/dist/cjs/sitecore-service-base.js +36 -36
- package/dist/cjs/tools/auth/flow.js +65 -64
- package/dist/cjs/tools/auth/index.js +5 -5
- package/dist/cjs/tools/auth/models.js +2 -2
- package/dist/cjs/tools/auth/tenant-store.js +38 -38
- package/dist/cjs/tools/codegen/component-generation.js +52 -50
- package/dist/cjs/tools/codegen/extract-files.js +105 -107
- package/dist/cjs/tools/codegen/import-map.js +401 -349
- package/dist/cjs/tools/codegen/utils.js +418 -418
- package/dist/cjs/tools/generate-map.js +2 -2
- package/dist/cjs/tools/generateMetadata.js +36 -35
- package/dist/cjs/tools/generateSites.js +59 -58
- package/dist/cjs/tools/index.js +75 -73
- package/dist/cjs/tools/scaffold.js +60 -59
- package/dist/cjs/tools/templating/components.js +96 -266
- package/dist/cjs/tools/templating/index.js +11 -14
- package/dist/cjs/tools/templating/plugins.js +80 -78
- package/dist/cjs/tools/templating/utils.js +67 -66
- package/dist/cjs/utils/ensurePath.js +20 -20
- package/dist/cjs/utils/env.js +28 -27
- package/dist/cjs/utils/globalCache.js +55 -0
- package/dist/cjs/utils/index.js +26 -21
- package/dist/cjs/utils/is-server.js +11 -10
- package/dist/cjs/utils/normalize-url.js +5 -5
- package/dist/cjs/utils/timeout-promise.js +31 -31
- package/dist/cjs/utils/utils.js +254 -229
- package/dist/esm/cache-client.js +51 -50
- package/dist/esm/client/constants.js +4 -4
- package/dist/esm/client/edge-proxy.js +19 -17
- package/dist/esm/client/index.js +5 -5
- package/dist/esm/client/models.js +1 -1
- package/dist/esm/client/sitecore-client.js +414 -412
- package/dist/esm/client/utils.js +43 -42
- package/dist/esm/config/define-config.js +188 -187
- package/dist/esm/config/index.js +2 -2
- package/dist/esm/config/models.js +9 -8
- package/dist/esm/config-cli/define-cli-config.js +19 -18
- package/dist/esm/config-cli/index.js +2 -2
- package/dist/esm/config-cli/models.js +5 -4
- package/dist/esm/constants.js +46 -14
- package/dist/esm/debug.js +41 -39
- package/dist/esm/editing/codegen/index.js +1 -1
- package/dist/esm/editing/codegen/preview.js +263 -185
- package/dist/esm/editing/component-layout-service.js +55 -54
- package/dist/esm/editing/design-library.js +171 -117
- package/dist/esm/editing/editing-service.js +68 -67
- package/dist/esm/editing/index.js +6 -5
- package/dist/esm/editing/metadata.js +39 -39
- package/dist/esm/editing/models.js +41 -35
- package/dist/esm/editing/utils.js +98 -80
- package/dist/esm/form/form.js +72 -69
- package/dist/esm/form/index.js +1 -1
- package/dist/esm/graphql-request-client.js +101 -100
- package/dist/esm/i18n/dictionary-service.js +115 -114
- package/dist/esm/i18n/index.js +2 -2
- package/dist/esm/i18n/utils.js +13 -12
- package/dist/esm/index.js +13 -13
- package/dist/esm/layout/content-styles.js +64 -63
- package/dist/esm/layout/index.js +6 -6
- package/dist/esm/layout/layout-service.js +55 -50
- package/dist/esm/layout/models.js +36 -31
- package/dist/esm/layout/themes.js +71 -70
- package/dist/esm/layout/utils.js +109 -102
- package/dist/esm/media/index.js +2 -2
- package/dist/esm/media/media-api.js +90 -86
- package/dist/esm/models.js +1 -1
- package/dist/esm/native-fetcher.js +187 -172
- package/dist/esm/personalize/index.js +3 -3
- package/dist/esm/personalize/layout-personalizer.js +93 -92
- package/dist/esm/personalize/personalize-service.js +91 -87
- package/dist/esm/personalize/utils.js +135 -128
- package/dist/esm/retries.js +39 -38
- package/dist/esm/site/error-pages-service.js +58 -57
- package/dist/esm/site/index.js +8 -8
- package/dist/esm/site/models.js +1 -1
- package/dist/esm/site/redirects-service.js +87 -74
- package/dist/esm/site/robots-service.js +59 -58
- package/dist/esm/site/site-resolver.js +69 -68
- package/dist/esm/site/siteinfo-service.js +77 -73
- package/dist/esm/site/sitemap-xml-service.js +77 -76
- package/dist/esm/site/sitepath-service.js +157 -156
- package/dist/esm/site/utils.js +49 -41
- package/dist/esm/sitecore-service-base.js +29 -29
- package/dist/esm/tools/auth/flow.js +62 -61
- package/dist/esm/tools/auth/index.js +1 -1
- package/dist/esm/tools/auth/models.js +1 -1
- package/dist/esm/tools/auth/tenant-store.js +35 -35
- package/dist/esm/tools/codegen/component-generation.js +44 -42
- package/dist/esm/tools/codegen/extract-files.js +99 -101
- package/dist/esm/tools/codegen/import-map.js +358 -306
- package/dist/esm/tools/codegen/utils.js +373 -373
- package/dist/esm/tools/generate-map.js +1 -1
- package/dist/esm/tools/generateMetadata.js +29 -28
- package/dist/esm/tools/generateSites.js +52 -51
- package/dist/esm/tools/index.js +28 -27
- package/dist/esm/tools/scaffold.js +52 -51
- package/dist/esm/tools/templating/components.js +59 -223
- package/dist/esm/tools/templating/index.js +3 -3
- package/dist/esm/tools/templating/plugins.js +72 -70
- package/dist/esm/tools/templating/utils.js +59 -58
- package/dist/esm/utils/ensurePath.js +13 -13
- package/dist/esm/utils/env.js +24 -23
- package/dist/esm/utils/globalCache.js +49 -0
- package/dist/esm/utils/index.js +4 -3
- package/dist/esm/utils/is-server.js +9 -8
- package/dist/esm/utils/normalize-url.js +1 -1
- package/dist/esm/utils/timeout-promise.js +28 -28
- package/dist/esm/utils/utils.js +238 -213
- package/package.json +73 -5
- package/types/cache-client.d.ts +68 -64
- package/types/cache-client.d.ts.map +1 -0
- package/types/client/constants.d.ts +5 -4
- package/types/client/constants.d.ts.map +1 -0
- package/types/client/edge-proxy.d.ts +18 -15
- package/types/client/edge-proxy.d.ts.map +1 -0
- package/types/client/index.d.ts +8 -7
- package/types/client/index.d.ts.map +1 -0
- package/types/client/models.d.ts +21 -19
- package/types/client/models.d.ts.map +1 -0
- package/types/client/sitecore-client.d.ts +338 -327
- package/types/client/sitecore-client.d.ts.map +1 -0
- package/types/client/utils.d.ts +15 -9
- package/types/client/utils.d.ts.map +1 -0
- package/types/config/define-config.d.ts +20 -18
- package/types/config/define-config.d.ts.map +1 -0
- package/types/config/index.d.ts +3 -2
- package/types/config/index.d.ts.map +1 -0
- package/types/config/models.d.ts +287 -268
- package/types/config/models.d.ts.map +1 -0
- package/types/config-cli/define-cli-config.d.ts +9 -7
- package/types/config-cli/define-cli-config.d.ts.map +1 -0
- package/types/config-cli/index.d.ts +3 -2
- package/types/config-cli/index.d.ts.map +1 -0
- package/types/config-cli/models.d.ts +6 -4
- package/types/config-cli/models.d.ts.map +1 -0
- package/types/constants.d.ts +44 -11
- package/types/constants.d.ts.map +1 -0
- package/types/debug.d.ts +35 -28
- package/types/debug.d.ts.map +1 -0
- package/types/editing/codegen/index.d.ts +2 -1
- package/types/editing/codegen/index.d.ts.map +1 -0
- package/types/editing/codegen/preview.d.ts +256 -195
- package/types/editing/codegen/preview.d.ts.map +1 -0
- package/types/editing/component-layout-service.d.ts +84 -80
- package/types/editing/component-layout-service.d.ts.map +1 -0
- package/types/editing/design-library.d.ts +111 -63
- package/types/editing/design-library.d.ts.map +1 -0
- package/types/editing/editing-service.d.ts +72 -62
- package/types/editing/editing-service.d.ts.map +1 -0
- package/types/editing/index.d.ts +7 -6
- package/types/editing/index.d.ts.map +1 -0
- package/types/editing/metadata.d.ts +8 -7
- package/types/editing/metadata.d.ts.map +1 -0
- package/types/editing/models.d.ts +103 -92
- package/types/editing/models.d.ts.map +1 -0
- package/types/editing/utils.d.ts +91 -74
- package/types/editing/utils.d.ts.map +1 -0
- package/types/form/form.d.ts +25 -21
- package/types/form/form.d.ts.map +1 -0
- package/types/form/index.d.ts +2 -1
- package/types/form/index.d.ts.map +1 -0
- package/types/graphql-request-client.d.ts +112 -105
- package/types/graphql-request-client.d.ts.map +1 -0
- package/types/i18n/dictionary-service.d.ts +135 -131
- package/types/i18n/dictionary-service.d.ts.map +1 -0
- package/types/i18n/index.d.ts +3 -2
- package/types/i18n/index.d.ts.map +1 -0
- package/types/i18n/utils.d.ts +9 -7
- package/types/i18n/utils.d.ts.map +1 -0
- package/types/index.d.ts +13 -12
- package/types/index.d.ts.map +1 -0
- package/types/layout/content-styles.d.ts +20 -18
- package/types/layout/content-styles.d.ts.map +1 -0
- package/types/layout/index.d.ts +6 -5
- package/types/layout/index.d.ts.map +1 -0
- package/types/layout/layout-service.d.ts +45 -35
- package/types/layout/layout-service.d.ts.map +1 -0
- package/types/layout/models.d.ts +174 -151
- package/types/layout/models.d.ts.map +1 -0
- package/types/layout/themes.d.ts +13 -11
- package/types/layout/themes.d.ts.map +1 -0
- package/types/layout/utils.d.ts +56 -41
- package/types/layout/utils.d.ts.map +1 -0
- package/types/media/index.d.ts +3 -2
- package/types/media/index.d.ts.map +1 -0
- package/types/media/media-api.d.ts +60 -55
- package/types/media/media-api.d.ts.map +1 -0
- package/types/models.d.ts +94 -84
- package/types/models.d.ts.map +1 -0
- package/types/native-fetcher.d.ts +124 -114
- package/types/native-fetcher.d.ts.map +1 -0
- package/types/personalize/index.d.ts +4 -3
- package/types/personalize/index.d.ts.map +1 -0
- package/types/personalize/layout-personalizer.d.ts +29 -27
- package/types/personalize/layout-personalizer.d.ts.map +1 -0
- package/types/personalize/personalize-service.d.ts +90 -80
- package/types/personalize/personalize-service.d.ts.map +1 -0
- package/types/personalize/utils.d.ts +78 -69
- package/types/personalize/utils.d.ts.map +1 -0
- package/types/retries.d.ts +26 -24
- package/types/retries.d.ts.map +1 -0
- package/types/site/error-pages-service.d.ts +64 -57
- package/types/site/error-pages-service.d.ts.map +1 -0
- package/types/site/index.d.ts +10 -9
- package/types/site/index.d.ts.map +1 -0
- package/types/site/models.d.ts +23 -18
- package/types/site/models.d.ts.map +1 -0
- package/types/site/redirects-service.d.ts +92 -69
- package/types/site/redirects-service.d.ts.map +1 -0
- package/types/site/robots-service.d.ts +57 -50
- package/types/site/robots-service.d.ts.map +1 -0
- package/types/site/site-resolver.d.ts +28 -26
- package/types/site/site-resolver.d.ts.map +1 -0
- package/types/site/siteinfo-service.d.ts +65 -52
- package/types/site/siteinfo-service.d.ts.map +1 -0
- package/types/site/sitemap-xml-service.d.ts +63 -56
- package/types/site/sitemap-xml-service.d.ts.map +1 -0
- package/types/site/sitepath-service.d.ts +137 -134
- package/types/site/sitepath-service.d.ts.map +1 -0
- package/types/site/utils.d.ts +41 -28
- package/types/site/utils.d.ts.map +1 -0
- package/types/sitecore-service-base.d.ts +31 -30
- package/types/sitecore-service-base.d.ts.map +1 -0
- package/types/tools/auth/flow.d.ts +29 -27
- package/types/tools/auth/flow.d.ts.map +1 -0
- package/types/tools/auth/index.d.ts +2 -1
- package/types/tools/auth/index.d.ts.map +1 -0
- package/types/tools/auth/models.d.ts +35 -33
- package/types/tools/auth/models.d.ts.map +1 -0
- package/types/tools/auth/tenant-store.d.ts +12 -11
- package/types/tools/auth/tenant-store.d.ts.map +1 -0
- package/types/tools/codegen/component-generation.d.ts +50 -47
- package/types/tools/codegen/component-generation.d.ts.map +1 -0
- package/types/tools/codegen/extract-files.d.ts +24 -22
- package/types/tools/codegen/extract-files.d.ts.map +1 -0
- package/types/tools/codegen/import-map.d.ts +103 -70
- package/types/tools/codegen/import-map.d.ts.map +1 -0
- package/types/tools/codegen/utils.d.ts +76 -75
- package/types/tools/codegen/utils.d.ts.map +1 -0
- package/types/tools/generate-map.d.ts +36 -26
- package/types/tools/generate-map.d.ts.map +1 -0
- package/types/tools/generateMetadata.d.ts +24 -22
- package/types/tools/generateMetadata.d.ts.map +1 -0
- package/types/tools/generateSites.d.ts +25 -22
- package/types/tools/generateSites.d.ts.map +1 -0
- package/types/tools/index.d.ts +22 -20
- package/types/tools/index.d.ts.map +1 -0
- package/types/tools/scaffold.d.ts +27 -25
- package/types/tools/scaffold.d.ts.map +1 -0
- package/types/tools/templating/components.d.ts +104 -103
- package/types/tools/templating/components.d.ts.map +1 -0
- package/types/tools/templating/index.d.ts +4 -3
- package/types/tools/templating/index.d.ts.map +1 -0
- package/types/tools/templating/plugins.d.ts +71 -67
- package/types/tools/templating/plugins.d.ts.map +1 -0
- package/types/tools/templating/utils.d.ts +42 -40
- package/types/tools/templating/utils.d.ts.map +1 -0
- package/types/utils/ensurePath.d.ts +7 -6
- package/types/utils/ensurePath.d.ts.map +1 -0
- package/types/utils/env.d.ts +9 -7
- package/types/utils/env.d.ts.map +1 -0
- package/types/utils/globalCache.d.ts +37 -0
- package/types/utils/globalCache.d.ts.map +1 -0
- package/types/utils/index.d.ts +5 -3
- package/types/utils/index.d.ts.map +1 -0
- package/types/utils/is-server.d.ts +8 -6
- package/types/utils/is-server.d.ts.map +1 -0
- package/types/utils/normalize-url.d.ts +2 -1
- package/types/utils/normalize-url.d.ts.map +1 -0
- package/types/utils/timeout-promise.d.ts +18 -17
- package/types/utils/timeout-promise.d.ts.map +1 -0
- package/types/utils/utils.d.ts +104 -79
- package/types/utils/utils.d.ts.map +1 -0
- package/client.js +0 -1
- package/codegen.js +0 -1
- package/config-cli.js +0 -1
- package/config.js +0 -1
- package/editing.js +0 -1
- package/i18n.js +0 -1
- package/layout.js +0 -1
- package/media.js +0 -1
- package/personalize.js +0 -1
- package/site.js +0 -1
- package/tools.js +0 -1
- package/utils.js +0 -1
|
@@ -1,20 +1,24 @@
|
|
|
1
|
-
import debug from '../debug';
|
|
2
|
-
import { isTimeoutError } from '../utils';
|
|
3
|
-
import { MemoryCacheClient } from '../cache-client';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import debug from '../debug';
|
|
2
|
+
import { isTimeoutError } from '../utils';
|
|
3
|
+
import { MemoryCacheClient } from '../cache-client';
|
|
4
|
+
/**
|
|
5
|
+
* Fetch personalize data using the Sitecore GraphQL endpoint.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export class PersonalizeService {
|
|
9
|
+
/**
|
|
10
|
+
* Fetch personalize data using the Sitecore GraphQL endpoint.
|
|
11
|
+
* @param {PersonalizeServiceConfig} config
|
|
12
|
+
*/
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.config.timeout = config.timeout || 400;
|
|
16
|
+
this.graphQLClient = this.getGraphQLClient();
|
|
17
|
+
this.cache = this.getCacheClient();
|
|
18
|
+
}
|
|
19
|
+
get query() {
|
|
16
20
|
return /* GraphQL */ `
|
|
17
|
-
query($siteName: String!, $language: String!, $itemPath: String!) {
|
|
21
|
+
query ($siteName: String!, $language: String!, $itemPath: String!) {
|
|
18
22
|
layout(site: $siteName, routePath: $itemPath, language: $language) {
|
|
19
23
|
item {
|
|
20
24
|
id
|
|
@@ -25,74 +29,74 @@ export class PersonalizeService {
|
|
|
25
29
|
}
|
|
26
30
|
}
|
|
27
31
|
}
|
|
28
|
-
`;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Get personalize information for a route
|
|
32
|
-
* @param {string} itemPath page route
|
|
33
|
-
* @param {string} language language
|
|
34
|
-
* @param {string} siteName site name
|
|
35
|
-
* @returns {Promise<PersonalizeInfo | undefined>} the personalize information or undefined (if itemPath / language not found)
|
|
36
|
-
*/
|
|
37
|
-
async getPersonalizeInfo(itemPath, language, siteName) {
|
|
38
|
-
var _a;
|
|
39
|
-
// while other graphql services can use fetchOptions, personalize is more sensitive
|
|
40
|
-
// we don't allow retries in it since we need to be fast
|
|
41
|
-
debug.personalize('fetching personalize info for %s %s %s', siteName, itemPath, language);
|
|
42
|
-
const cacheKey = this.getCacheKey(itemPath, language, siteName);
|
|
43
|
-
let data = this.cache.getCacheValue(cacheKey);
|
|
44
|
-
if (!data) {
|
|
45
|
-
try {
|
|
46
|
-
data = await this.graphQLClient.request(this.query, {
|
|
47
|
-
siteName,
|
|
48
|
-
itemPath,
|
|
49
|
-
language,
|
|
50
|
-
});
|
|
51
|
-
this.cache.setCacheValue(cacheKey, data);
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
if (isTimeoutError(error)) {
|
|
55
|
-
return undefined;
|
|
56
|
-
}
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return ((_a = data === null || data === void 0 ? void 0 : data.layout) === null || _a === void 0 ? void 0 : _a.item)
|
|
61
|
-
? {
|
|
62
|
-
pageId: data.layout.item.id,
|
|
63
|
-
variantIds: data.layout.item.personalization.variantIds,
|
|
64
|
-
}
|
|
65
|
-
: undefined;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Gets cache client implementation
|
|
69
|
-
* Override this method if custom cache needs to be used
|
|
70
|
-
* @returns CacheClient instance
|
|
71
|
-
*/
|
|
72
|
-
getCacheClient() {
|
|
73
|
-
var _a, _b;
|
|
74
|
-
return new MemoryCacheClient({
|
|
75
|
-
cacheEnabled: (_a = this.config.cacheEnabled) !== null && _a !== void 0 ? _a : true,
|
|
76
|
-
cacheTimeout: (_b = this.config.cacheTimeout) !== null && _b !== void 0 ? _b : 10,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
getCacheKey(itemPath, language, siteName) {
|
|
80
|
-
return `${siteName}-${itemPath}-${language}`;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Gets a GraphQL client that can make requests to the API. Uses graphql-request as the default
|
|
84
|
-
* library for fetching graphql data (@see GraphQLRequestClient). Override this method if you
|
|
85
|
-
* want to use something else.
|
|
86
|
-
* @returns {GraphQLClient} implementation
|
|
87
|
-
*/
|
|
88
|
-
getGraphQLClient() {
|
|
89
|
-
if (!this.config.clientFactory) {
|
|
90
|
-
throw new Error('clientFactory needs to be provided when initializing GraphQL client.');
|
|
91
|
-
}
|
|
92
|
-
return this.config.clientFactory({
|
|
93
|
-
debugger: debug.personalize,
|
|
94
|
-
fetch: this.config.fetch,
|
|
95
|
-
timeout: this.config.timeout,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
}
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get personalize information for a route
|
|
36
|
+
* @param {string} itemPath page route
|
|
37
|
+
* @param {string} language language
|
|
38
|
+
* @param {string} siteName site name
|
|
39
|
+
* @returns {Promise<PersonalizeInfo | undefined>} the personalize information or undefined (if itemPath / language not found)
|
|
40
|
+
*/
|
|
41
|
+
async getPersonalizeInfo(itemPath, language, siteName) {
|
|
42
|
+
var _a;
|
|
43
|
+
// while other graphql services can use fetchOptions, personalize is more sensitive
|
|
44
|
+
// we don't allow retries in it since we need to be fast
|
|
45
|
+
debug.personalize('fetching personalize info for %s %s %s', siteName, itemPath, language);
|
|
46
|
+
const cacheKey = this.getCacheKey(itemPath, language, siteName);
|
|
47
|
+
let data = this.cache.getCacheValue(cacheKey);
|
|
48
|
+
if (!data) {
|
|
49
|
+
try {
|
|
50
|
+
data = await this.graphQLClient.request(this.query, {
|
|
51
|
+
siteName,
|
|
52
|
+
itemPath,
|
|
53
|
+
language,
|
|
54
|
+
});
|
|
55
|
+
this.cache.setCacheValue(cacheKey, data);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (isTimeoutError(error)) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return ((_a = data === null || data === void 0 ? void 0 : data.layout) === null || _a === void 0 ? void 0 : _a.item)
|
|
65
|
+
? {
|
|
66
|
+
pageId: data.layout.item.id,
|
|
67
|
+
variantIds: data.layout.item.personalization.variantIds,
|
|
68
|
+
}
|
|
69
|
+
: undefined;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Gets cache client implementation
|
|
73
|
+
* Override this method if custom cache needs to be used
|
|
74
|
+
* @returns CacheClient instance
|
|
75
|
+
*/
|
|
76
|
+
getCacheClient() {
|
|
77
|
+
var _a, _b;
|
|
78
|
+
return new MemoryCacheClient({
|
|
79
|
+
cacheEnabled: (_a = this.config.cacheEnabled) !== null && _a !== void 0 ? _a : true,
|
|
80
|
+
cacheTimeout: (_b = this.config.cacheTimeout) !== null && _b !== void 0 ? _b : 10,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
getCacheKey(itemPath, language, siteName) {
|
|
84
|
+
return `${siteName}-${itemPath}-${language}`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Gets a GraphQL client that can make requests to the API. Uses graphql-request as the default
|
|
88
|
+
* library for fetching graphql data (@see GraphQLRequestClient). Override this method if you
|
|
89
|
+
* want to use something else.
|
|
90
|
+
* @returns {GraphQLClient} implementation
|
|
91
|
+
*/
|
|
92
|
+
getGraphQLClient() {
|
|
93
|
+
if (!this.config.clientFactory) {
|
|
94
|
+
throw new Error('clientFactory needs to be provided when initializing GraphQL client.');
|
|
95
|
+
}
|
|
96
|
+
return this.config.clientFactory({
|
|
97
|
+
debugger: debug.personalize,
|
|
98
|
+
fetch: this.config.fetch,
|
|
99
|
+
timeout: this.config.timeout,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -1,128 +1,135 @@
|
|
|
1
|
-
|
|
2
|
-
export const
|
|
3
|
-
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
* @
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
// There
|
|
49
|
-
data.
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
1
|
+
/** @internal */
|
|
2
|
+
export const DEFAULT_VARIANT = '_default';
|
|
3
|
+
/** @internal */
|
|
4
|
+
export const VARIANT_PREFIX = '_variantId_';
|
|
5
|
+
/**
|
|
6
|
+
* Get a personalized rewrite path for given pathname
|
|
7
|
+
* @param {string} pathname the pathname
|
|
8
|
+
* @param {string[]} variantIds the variantIds to include in the rewrite
|
|
9
|
+
* @returns {string} the rewrite path
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export function getPersonalizedRewrite(pathname, variantIds) {
|
|
13
|
+
const path = pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;
|
|
14
|
+
return `${path}${variantIds.map((variantId) => `/${VARIANT_PREFIX}${variantId}`).join('')}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get personalize data from the rewrite path
|
|
18
|
+
* @param {string} pathname the pathname
|
|
19
|
+
* @returns {PersonalizedRewriteData} the personalize data from the rewrite
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export function getPersonalizedRewriteData(pathname) {
|
|
23
|
+
const segments = pathname.split('/');
|
|
24
|
+
const variantIds = [];
|
|
25
|
+
segments.forEach((segment) => {
|
|
26
|
+
const result = segment.match(`${VARIANT_PREFIX}(.*$)`);
|
|
27
|
+
if (result) {
|
|
28
|
+
variantIds.push(result[1]);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return getGroomedVariantIds(variantIds);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parses a list of variantIds and divides into layout and component variants
|
|
35
|
+
* @param {string[]} variantIds the list of variant IDs for a page
|
|
36
|
+
* @returns {PersonalizedRewriteData} object with variant IDs sorted
|
|
37
|
+
* @public
|
|
38
|
+
*/
|
|
39
|
+
export function getGroomedVariantIds(variantIds) {
|
|
40
|
+
const data = {
|
|
41
|
+
variantId: DEFAULT_VARIANT,
|
|
42
|
+
componentVariantIds: [],
|
|
43
|
+
};
|
|
44
|
+
variantIds.forEach((variantId) => {
|
|
45
|
+
var _a;
|
|
46
|
+
if (variantId.includes('_')) {
|
|
47
|
+
// Component-level personalization in format "<ComponentID>_<VariantID>"
|
|
48
|
+
// There can be multiple
|
|
49
|
+
(_a = data.componentVariantIds) === null || _a === void 0 ? void 0 : _a.push(variantId);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Embedded (page-level) personalization in format "<VariantID>"
|
|
53
|
+
// There should be only one
|
|
54
|
+
data.variantId = variantId;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
return data;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Normalize a personalized rewrite path (remove personalize data)
|
|
61
|
+
* @param {string} pathname the pathname
|
|
62
|
+
* @returns {string} the pathname with personalize data removed
|
|
63
|
+
* @public
|
|
64
|
+
*/
|
|
65
|
+
export function normalizePersonalizedRewrite(pathname) {
|
|
66
|
+
if (!pathname.includes(VARIANT_PREFIX)) {
|
|
67
|
+
return pathname;
|
|
68
|
+
}
|
|
69
|
+
let segments = pathname.split('/');
|
|
70
|
+
segments = segments.filter((segment) => !segment.includes(VARIANT_PREFIX));
|
|
71
|
+
const result = segments.join('/');
|
|
72
|
+
// return root path if all segments were personalize data
|
|
73
|
+
return result ? result : '/';
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Static utility class for Sitecore CDP
|
|
77
|
+
* @public
|
|
78
|
+
*/
|
|
79
|
+
export class CdpHelper {
|
|
80
|
+
/**
|
|
81
|
+
* Gets the page variant id for CDP in the required format
|
|
82
|
+
* @param {string} pageId the page id
|
|
83
|
+
* @param {string} language the language
|
|
84
|
+
* @param {string} variantId the variant id
|
|
85
|
+
* @param {string} [scope] the scope value
|
|
86
|
+
* @returns {string} the formatted page variant id
|
|
87
|
+
*/
|
|
88
|
+
static getPageVariantId(pageId, language, variantId, scope) {
|
|
89
|
+
const formattedPageId = pageId.replace(/[{}-]/g, '');
|
|
90
|
+
const formattedLanguage = language.replace('-', '_');
|
|
91
|
+
const scopeId = scope ? `${this.normalizeScope(scope)}_` : '';
|
|
92
|
+
let formattedVariantId = variantId;
|
|
93
|
+
if (!variantId || variantId === DEFAULT_VARIANT) {
|
|
94
|
+
formattedVariantId = 'default';
|
|
95
|
+
}
|
|
96
|
+
return `${scopeId}${formattedPageId}_${formattedLanguage}_${formattedVariantId}`.toLowerCase();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Gets the friendly id for (page-level) Embedded Personalization in the required format `embedded_[<scope>_]<id>_<lang>`
|
|
100
|
+
* @param {string} pageId the page id
|
|
101
|
+
* @param {string} language the language
|
|
102
|
+
* @param {string} [scope] the scope value
|
|
103
|
+
* @returns {string} the friendly id
|
|
104
|
+
*/
|
|
105
|
+
static getPageFriendlyId(pageId, language, scope) {
|
|
106
|
+
const formattedPageId = pageId.replace(/[{}-]/g, '');
|
|
107
|
+
const formattedLanguage = language.replace('-', '_');
|
|
108
|
+
const scopeId = scope ? `${this.normalizeScope(scope)}_` : '';
|
|
109
|
+
return `embedded_${scopeId}${formattedPageId}_${formattedLanguage}`.toLowerCase();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Gets the friendly id for Component A/B Testing in the required format `component_[<scope>_]<pageId>_<componentId>_<language>*`
|
|
113
|
+
* @param {string} pageId the page id
|
|
114
|
+
* @param {string} componentId the component id
|
|
115
|
+
* @param {string} language the language
|
|
116
|
+
* @param {string} [scope] the scope value
|
|
117
|
+
* @returns {string} the friendly id
|
|
118
|
+
*/
|
|
119
|
+
static getComponentFriendlyId(pageId, componentId, language, scope) {
|
|
120
|
+
const formattedPageId = pageId.replace(/[{}-]/g, '');
|
|
121
|
+
const formattedComponentId = componentId.replace(/[{}-]/g, '');
|
|
122
|
+
const formattedLanguage = language.replace('-', '_');
|
|
123
|
+
const scopeId = scope ? `${this.normalizeScope(scope)}_` : '';
|
|
124
|
+
return `component_${scopeId}${formattedPageId}_${formattedComponentId}_${formattedLanguage}*`.toLowerCase();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Normalizes the scope from the given string value
|
|
128
|
+
* Removes all non-alphanumeric characters
|
|
129
|
+
* @param {string} [scope] the scope value
|
|
130
|
+
* @returns {string} normalized scope value
|
|
131
|
+
*/
|
|
132
|
+
static normalizeScope(scope) {
|
|
133
|
+
return (scope === null || scope === void 0 ? void 0 : scope.replace(/[^a-zA-Z0-9]+/g, '')) || '';
|
|
134
|
+
}
|
|
135
|
+
}
|
package/dist/esm/retries.js
CHANGED
|
@@ -1,38 +1,39 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Represents a default retry strategy for handling retry attempts in case of specific HTTP status codes.
|
|
3
|
-
* This class implements the RetryStrategy interface and provides methods to determine whether a request
|
|
4
|
-
* should be retried and calculates the delay before the next retry attempt.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* @param {
|
|
10
|
-
* @param {
|
|
11
|
-
* @param {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
this.
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
retryAfterHeader
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Represents a default retry strategy for handling retry attempts in case of specific HTTP status codes.
|
|
3
|
+
* This class implements the RetryStrategy interface and provides methods to determine whether a request
|
|
4
|
+
* should be retried and calculates the delay before the next retry attempt.
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export class DefaultRetryStrategy {
|
|
8
|
+
/**
|
|
9
|
+
* @param {object} options Configurable options for retry mechanism.
|
|
10
|
+
* @param {number[]} [options.statusCodes] HTTP status codes to trigger retries on. Default is [429].
|
|
11
|
+
* @param {string[]} [options.errorCodes] Node error codes to trigger retries. Default is ['ECONNRESET', 'ETIMEDOUT', 'EPROTO'].
|
|
12
|
+
* @param {number} [options.factor] Factor by which the delay increases with each retry attempt. Default is 2.
|
|
13
|
+
*/
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
this.statusCodes = options.statusCodes || [429];
|
|
16
|
+
this.errorCodes = options.errorCodes || ['ECONNRESET', 'ETIMEDOUT', 'EPROTO'];
|
|
17
|
+
this.factor = options.factor || 2;
|
|
18
|
+
}
|
|
19
|
+
shouldRetry(error, attempt, retries) {
|
|
20
|
+
var _a;
|
|
21
|
+
const isStatusCodeError = ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) !== undefined && this.statusCodes.includes(error.response.status);
|
|
22
|
+
const isNodeErrorCode = error.code !== undefined && this.errorCodes.includes(error.code);
|
|
23
|
+
return retries > 0 && attempt <= retries && (isStatusCodeError || isNodeErrorCode);
|
|
24
|
+
}
|
|
25
|
+
getDelay(error, attempt) {
|
|
26
|
+
var _a;
|
|
27
|
+
const rawHeaders = (_a = error.response) === null || _a === void 0 ? void 0 : _a.headers;
|
|
28
|
+
const retryAfterHeader = rawHeaders === null || rawHeaders === void 0 ? void 0 : rawHeaders.get('Retry-After');
|
|
29
|
+
if (retryAfterHeader !== null &&
|
|
30
|
+
retryAfterHeader !== undefined &&
|
|
31
|
+
retryAfterHeader.trim() !== '') {
|
|
32
|
+
const delaySeconds = Number.parseFloat(retryAfterHeader);
|
|
33
|
+
return delaySeconds * 1000;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return Math.pow(this.factor, attempt - 1) * 1000;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|