@sitecore-content-sdk/content 2.1.1-canary.20260521052552 → 2.1.1
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/dist/cjs/media/media-api.js +18 -72
- package/dist/cjs/personalize/layout-personalizer.js +1 -1
- package/dist/esm/media/media-api.js +15 -72
- package/dist/esm/personalize/layout-personalizer.js +1 -1
- package/package.json +7 -5
- package/types/media/media-api.d.ts.map +1 -1
- package/types/personalize/layout-personalizer.d.ts.map +1 -1
|
@@ -1,63 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.getSrcSet = exports.updateImageUrl = exports.replaceMediaUrlPrefix = exports.getRequiredParams = void 0;
|
|
7
|
+
const url_parse_1 = __importDefault(require("url-parse"));
|
|
4
8
|
// finds the Sitecore media URL prefix
|
|
5
9
|
const mediaUrlPrefixRegex = /\/([-~]{1})\/media\//i;
|
|
6
|
-
/** Base URL used only to parse path-only / relative media URLs with WHATWG URL */
|
|
7
|
-
const RELATIVE_URL_BASE = 'http://__sitecore_content_sdk_media__/';
|
|
8
|
-
/**
|
|
9
|
-
* Whether the URL input uses an absolute or special (protocol-relative) scheme.
|
|
10
|
-
* @param {string} input Media URL string
|
|
11
|
-
* @returns True when the input has a scheme or starts with `//`
|
|
12
|
-
* @internal
|
|
13
|
-
*/
|
|
14
|
-
function hasAbsoluteOrSpecialScheme(input) {
|
|
15
|
-
return /^[a-z][a-z0-9+.-]*:/i.test(input) || input.startsWith('//');
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Parse a media URL that may be absolute or path-only (relative).
|
|
19
|
-
* @param {string} input Media URL string
|
|
20
|
-
* @returns Parsed URL and whether the input was path-only (so serialization omits the dummy base)
|
|
21
|
-
* @internal
|
|
22
|
-
*/
|
|
23
|
-
function parseMediaUrl(input) {
|
|
24
|
-
if (hasAbsoluteOrSpecialScheme(input)) {
|
|
25
|
-
try {
|
|
26
|
-
const url = input.startsWith('//') ? new URL(input, 'http://_') : new URL(input);
|
|
27
|
-
return { url, relative: false };
|
|
28
|
-
}
|
|
29
|
-
catch (_a) {
|
|
30
|
-
// fall through to relative parse attempt
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return { url: new URL(input, RELATIVE_URL_BASE), relative: true };
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Serialize a parsed media URL, omitting the dummy base for path-only inputs.
|
|
37
|
-
* @param {URL} parsed Parsed media URL
|
|
38
|
-
* @param {boolean} relative Whether the original input was path-only
|
|
39
|
-
* @returns Serialized URL string
|
|
40
|
-
* @internal
|
|
41
|
-
*/
|
|
42
|
-
function serializeMediaUrl(parsed, relative) {
|
|
43
|
-
if (relative) {
|
|
44
|
-
return `${parsed.pathname}${parsed.search}${parsed.hash}`;
|
|
45
|
-
}
|
|
46
|
-
return parsed.toString();
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Convert URL search params to a plain query record.
|
|
50
|
-
* @param {URLSearchParams} sp URL search params
|
|
51
|
-
* @returns Query string key/value map
|
|
52
|
-
* @internal
|
|
53
|
-
*/
|
|
54
|
-
function searchParamsToQueryRecord(sp) {
|
|
55
|
-
const q = {};
|
|
56
|
-
sp.forEach((value, key) => {
|
|
57
|
-
q[key] = value;
|
|
58
|
-
});
|
|
59
|
-
return q;
|
|
60
|
-
}
|
|
61
10
|
/**
|
|
62
11
|
* Get required query string params which should be merged with user params
|
|
63
12
|
* @param {object} qs layout service parsed query string
|
|
@@ -78,12 +27,13 @@ exports.getRequiredParams = getRequiredParams;
|
|
|
78
27
|
* @public
|
|
79
28
|
*/
|
|
80
29
|
const replaceMediaUrlPrefix = (url, mediaUrlPrefix = mediaUrlPrefixRegex) => {
|
|
81
|
-
const
|
|
30
|
+
const parsed = (0, url_parse_1.default)(url, {}, true);
|
|
82
31
|
const match = mediaUrlPrefix.exec(parsed.pathname);
|
|
83
32
|
if (match && match.length > 1) {
|
|
84
|
-
|
|
33
|
+
// regex will provide us with /-/ or /~/ type
|
|
34
|
+
parsed.set('pathname', parsed.pathname.replace(mediaUrlPrefix, `/${match[1]}/jssmedia/`));
|
|
85
35
|
}
|
|
86
|
-
return
|
|
36
|
+
return parsed.toString();
|
|
87
37
|
};
|
|
88
38
|
exports.replaceMediaUrlPrefix = replaceMediaUrlPrefix;
|
|
89
39
|
/**
|
|
@@ -103,24 +53,20 @@ const updateImageUrl = (url, params, mediaUrlPrefix = mediaUrlPrefixRegex) => {
|
|
|
103
53
|
// if params aren't supplied, no need to run it through Content SDK media handler
|
|
104
54
|
return url;
|
|
105
55
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
for (const [key, val] of Object.entries(params)) {
|
|
110
|
-
if (val !== undefined && val !== null && val !== '') {
|
|
111
|
-
merged[key] = String(val);
|
|
112
|
-
}
|
|
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 = {};
|
|
113
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);
|
|
114
63
|
Object.entries(requiredParams).forEach(([key, param]) => {
|
|
115
|
-
if (param
|
|
116
|
-
|
|
64
|
+
if (param) {
|
|
65
|
+
query[key] = param;
|
|
117
66
|
}
|
|
118
67
|
});
|
|
119
|
-
parsed.
|
|
120
|
-
|
|
121
|
-
parsed.searchParams.set(k, v);
|
|
122
|
-
}
|
|
123
|
-
return serializeMediaUrl(parsed, relative);
|
|
68
|
+
parsed.set('query', query);
|
|
69
|
+
return parsed.toString();
|
|
124
70
|
};
|
|
125
71
|
exports.updateImageUrl = updateImageUrl;
|
|
126
72
|
/**
|
|
@@ -91,7 +91,7 @@ function personalizeComponent(component, variantIds, isEditing) {
|
|
|
91
91
|
return component;
|
|
92
92
|
Object.keys(component === null || component === void 0 ? void 0 : component.placeholders).forEach((placeholder) => {
|
|
93
93
|
if (component.placeholders) {
|
|
94
|
-
component.placeholders[placeholder] = personalizePlaceholder(component.placeholders[placeholder], variantIds
|
|
94
|
+
component.placeholders[placeholder] = personalizePlaceholder(component.placeholders[placeholder], variantIds);
|
|
95
95
|
}
|
|
96
96
|
});
|
|
97
97
|
return component;
|
|
@@ -1,60 +1,6 @@
|
|
|
1
|
+
import URL from 'url-parse';
|
|
1
2
|
// finds the Sitecore media URL prefix
|
|
2
3
|
const mediaUrlPrefixRegex = /\/([-~]{1})\/media\//i;
|
|
3
|
-
/** Base URL used only to parse path-only / relative media URLs with WHATWG URL */
|
|
4
|
-
const RELATIVE_URL_BASE = 'http://__sitecore_content_sdk_media__/';
|
|
5
|
-
/**
|
|
6
|
-
* Whether the URL input uses an absolute or special (protocol-relative) scheme.
|
|
7
|
-
* @param {string} input Media URL string
|
|
8
|
-
* @returns True when the input has a scheme or starts with `//`
|
|
9
|
-
* @internal
|
|
10
|
-
*/
|
|
11
|
-
function hasAbsoluteOrSpecialScheme(input) {
|
|
12
|
-
return /^[a-z][a-z0-9+.-]*:/i.test(input) || input.startsWith('//');
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Parse a media URL that may be absolute or path-only (relative).
|
|
16
|
-
* @param {string} input Media URL string
|
|
17
|
-
* @returns Parsed URL and whether the input was path-only (so serialization omits the dummy base)
|
|
18
|
-
* @internal
|
|
19
|
-
*/
|
|
20
|
-
function parseMediaUrl(input) {
|
|
21
|
-
if (hasAbsoluteOrSpecialScheme(input)) {
|
|
22
|
-
try {
|
|
23
|
-
const url = input.startsWith('//') ? new URL(input, 'http://_') : new URL(input);
|
|
24
|
-
return { url, relative: false };
|
|
25
|
-
}
|
|
26
|
-
catch (_a) {
|
|
27
|
-
// fall through to relative parse attempt
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return { url: new URL(input, RELATIVE_URL_BASE), relative: true };
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Serialize a parsed media URL, omitting the dummy base for path-only inputs.
|
|
34
|
-
* @param {URL} parsed Parsed media URL
|
|
35
|
-
* @param {boolean} relative Whether the original input was path-only
|
|
36
|
-
* @returns Serialized URL string
|
|
37
|
-
* @internal
|
|
38
|
-
*/
|
|
39
|
-
function serializeMediaUrl(parsed, relative) {
|
|
40
|
-
if (relative) {
|
|
41
|
-
return `${parsed.pathname}${parsed.search}${parsed.hash}`;
|
|
42
|
-
}
|
|
43
|
-
return parsed.toString();
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Convert URL search params to a plain query record.
|
|
47
|
-
* @param {URLSearchParams} sp URL search params
|
|
48
|
-
* @returns Query string key/value map
|
|
49
|
-
* @internal
|
|
50
|
-
*/
|
|
51
|
-
function searchParamsToQueryRecord(sp) {
|
|
52
|
-
const q = {};
|
|
53
|
-
sp.forEach((value, key) => {
|
|
54
|
-
q[key] = value;
|
|
55
|
-
});
|
|
56
|
-
return q;
|
|
57
|
-
}
|
|
58
4
|
/**
|
|
59
5
|
* Get required query string params which should be merged with user params
|
|
60
6
|
* @param {object} qs layout service parsed query string
|
|
@@ -74,12 +20,13 @@ export const getRequiredParams = (qs) => {
|
|
|
74
20
|
* @public
|
|
75
21
|
*/
|
|
76
22
|
export const replaceMediaUrlPrefix = (url, mediaUrlPrefix = mediaUrlPrefixRegex) => {
|
|
77
|
-
const
|
|
23
|
+
const parsed = URL(url, {}, true);
|
|
78
24
|
const match = mediaUrlPrefix.exec(parsed.pathname);
|
|
79
25
|
if (match && match.length > 1) {
|
|
80
|
-
|
|
26
|
+
// regex will provide us with /-/ or /~/ type
|
|
27
|
+
parsed.set('pathname', parsed.pathname.replace(mediaUrlPrefix, `/${match[1]}/jssmedia/`));
|
|
81
28
|
}
|
|
82
|
-
return
|
|
29
|
+
return parsed.toString();
|
|
83
30
|
};
|
|
84
31
|
/**
|
|
85
32
|
* Prepares a Sitecore media URL with `params` for use by the Content SDK media handler.
|
|
@@ -98,24 +45,20 @@ export const updateImageUrl = (url, params, mediaUrlPrefix = mediaUrlPrefixRegex
|
|
|
98
45
|
// if params aren't supplied, no need to run it through Content SDK media handler
|
|
99
46
|
return url;
|
|
100
47
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
for (const [key, val] of Object.entries(params)) {
|
|
105
|
-
if (val !== undefined && val !== null && val !== '') {
|
|
106
|
-
merged[key] = String(val);
|
|
107
|
-
}
|
|
48
|
+
// polyfill node `global` in browser to workaround https://github.com/unshiftio/url-parse/issues/150
|
|
49
|
+
if (typeof window !== 'undefined' && !window.global) {
|
|
50
|
+
window.global = {};
|
|
108
51
|
}
|
|
52
|
+
const parsed = URL(replaceMediaUrlPrefix(url, mediaUrlPrefix), {}, true);
|
|
53
|
+
const requiredParams = getRequiredParams(parsed.query);
|
|
54
|
+
const query = Object.assign({}, params);
|
|
109
55
|
Object.entries(requiredParams).forEach(([key, param]) => {
|
|
110
|
-
if (param
|
|
111
|
-
|
|
56
|
+
if (param) {
|
|
57
|
+
query[key] = param;
|
|
112
58
|
}
|
|
113
59
|
});
|
|
114
|
-
parsed.
|
|
115
|
-
|
|
116
|
-
parsed.searchParams.set(k, v);
|
|
117
|
-
}
|
|
118
|
-
return serializeMediaUrl(parsed, relative);
|
|
60
|
+
parsed.set('query', query);
|
|
61
|
+
return parsed.toString();
|
|
119
62
|
};
|
|
120
63
|
/**
|
|
121
64
|
* Receives an array of `srcSet` parameters that are iterated and used as parameters to generate
|
|
@@ -86,7 +86,7 @@ export function personalizeComponent(component, variantIds, isEditing) {
|
|
|
86
86
|
return component;
|
|
87
87
|
Object.keys(component === null || component === void 0 ? void 0 : component.placeholders).forEach((placeholder) => {
|
|
88
88
|
if (component.placeholders) {
|
|
89
|
-
component.placeholders[placeholder] = personalizePlaceholder(component.placeholders[placeholder], variantIds
|
|
89
|
+
component.placeholders[placeholder] = personalizePlaceholder(component.placeholders[placeholder], variantIds);
|
|
90
90
|
}
|
|
91
91
|
});
|
|
92
92
|
return component;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sitecore-content-sdk/content",
|
|
3
|
-
"version": "2.1.1
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"main": "dist/cjs/index.js",
|
|
5
5
|
"module": "dist/esm/index.js",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"url": "https://github.com/sitecore/content-sdk/issues"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@sitecore-content-sdk/events": "2.1.
|
|
39
|
+
"@sitecore-content-sdk/events": "^2.1.0",
|
|
40
40
|
"@stylistic/eslint-plugin": "^5.2.2",
|
|
41
41
|
"@types/chai": "^5.2.2",
|
|
42
42
|
"@types/chai-spies": "^1.0.6",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"@types/proxyquire": "^1.3.31",
|
|
50
50
|
"@types/sinon": "^17.0.4",
|
|
51
51
|
"@types/sinon-chai": "^4.0.0",
|
|
52
|
+
"@types/url-parse": "1.4.11",
|
|
52
53
|
"@typescript-eslint/eslint-plugin": "8.39.0",
|
|
53
54
|
"@typescript-eslint/parser": "8.39.0",
|
|
54
55
|
"chai": "^4.4.1",
|
|
@@ -73,14 +74,15 @@
|
|
|
73
74
|
"typescript": "~5.8.3"
|
|
74
75
|
},
|
|
75
76
|
"peerDependencies": {
|
|
76
|
-
"@sitecore-content-sdk/events": "2.1.
|
|
77
|
+
"@sitecore-content-sdk/events": "^2.1.0"
|
|
77
78
|
},
|
|
78
79
|
"dependencies": {
|
|
79
|
-
"@sitecore-content-sdk/core": "2.1.
|
|
80
|
+
"@sitecore-content-sdk/core": "^2.1.0",
|
|
80
81
|
"chalk": "^4.1.2",
|
|
81
82
|
"debug": "^4.4.0",
|
|
82
83
|
"glob": "^11.0.2",
|
|
83
|
-
"graphql": "^16.11.0"
|
|
84
|
+
"graphql": "^16.11.0",
|
|
85
|
+
"url-parse": "^1.5.10"
|
|
84
86
|
},
|
|
85
87
|
"description": "",
|
|
86
88
|
"types": "types/index.d.ts",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-api.d.ts","sourceRoot":"","sources":["../../src/media/media-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"media-api.d.ts","sourceRoot":"","sources":["../../src/media/media-api.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,IAAI;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE;;;;;;CAI1E,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,KAAK,MAAM,EACX,iBAAgB,MAA4B,KAC3C,MAUF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,MAAM,EACX,SAAS;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,IAAI,EAC9D,iBAAgB,MAA4B,WA0B7C,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GACpB,KAAK,MAAM,EACX,QAAQ,KAAK,CAAC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,EAC7D,cAAc;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;CAAE,EAC5D,iBAAiB,MAAM,WAaxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-personalizer.d.ts","sourceRoot":"","sources":["../../src/personalize/layout-personalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAS3F,MAAM,MAAM,iCAAiC,GAAG,kBAAkB,GAAG;IACnE,WAAW,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,iCAAiC,CAAA;KAAE,CAAC;CACpE,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,EACjB,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAC7B,gBAAgB,CAAC,MAAM,CAAC,GAAG,SAAS,CAkBtC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,kBAAkB,EAAE,EAChC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,CAAC,EAAE,OAAO,GAClB,kBAAkB,EAAE,CA0BtB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,iCAAiC,EAC5C,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,CAAC,EAAE,OAAO,GAClB,kBAAkB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"layout-personalizer.d.ts","sourceRoot":"","sources":["../../src/personalize/layout-personalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAS3F,MAAM,MAAM,iCAAiC,GAAG,kBAAkB,GAAG;IACnE,WAAW,EAAE;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,iCAAiC,CAAA;KAAE,CAAC;CACpE,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,EACjB,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAC7B,gBAAgB,CAAC,MAAM,CAAC,GAAG,SAAS,CAkBtC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,kBAAkB,EAAE,EAChC,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,CAAC,EAAE,OAAO,GAClB,kBAAkB,EAAE,CA0BtB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,iCAAiC,EAC5C,UAAU,EAAE,MAAM,EAAE,EACpB,SAAS,CAAC,EAAE,OAAO,GAClB,kBAAkB,GAAG,IAAI,CA2C3B"}
|