@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.
@@ -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 { url: parsed, relative } = parseMediaUrl(url);
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
- parsed.pathname = parsed.pathname.replace(mediaUrlPrefix, `/${match[1]}/jssmedia/`);
33
+ // regex will provide us with /-/ or /~/ type
34
+ parsed.set('pathname', parsed.pathname.replace(mediaUrlPrefix, `/${match[1]}/jssmedia/`));
85
35
  }
86
- return serializeMediaUrl(parsed, relative);
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
- const { url: parsed, relative } = parseMediaUrl((0, exports.replaceMediaUrlPrefix)(url, mediaUrlPrefix));
107
- const requiredParams = (0, exports.getRequiredParams)(searchParamsToQueryRecord(parsed.searchParams));
108
- const merged = {};
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 !== undefined && param !== null && param !== '') {
116
- merged[key] = param;
64
+ if (param) {
65
+ query[key] = param;
117
66
  }
118
67
  });
119
- parsed.search = '';
120
- for (const [k, v] of Object.entries(merged)) {
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, isEditing);
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 { url: parsed, relative } = parseMediaUrl(url);
23
+ const parsed = URL(url, {}, true);
78
24
  const match = mediaUrlPrefix.exec(parsed.pathname);
79
25
  if (match && match.length > 1) {
80
- parsed.pathname = parsed.pathname.replace(mediaUrlPrefix, `/${match[1]}/jssmedia/`);
26
+ // regex will provide us with /-/ or /~/ type
27
+ parsed.set('pathname', parsed.pathname.replace(mediaUrlPrefix, `/${match[1]}/jssmedia/`));
81
28
  }
82
- return serializeMediaUrl(parsed, relative);
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
- const { url: parsed, relative } = parseMediaUrl(replaceMediaUrlPrefix(url, mediaUrlPrefix));
102
- const requiredParams = getRequiredParams(searchParamsToQueryRecord(parsed.searchParams));
103
- const merged = {};
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 !== undefined && param !== null && param !== '') {
111
- merged[key] = param;
56
+ if (param) {
57
+ query[key] = param;
112
58
  }
113
59
  });
114
- parsed.search = '';
115
- for (const [k, v] of Object.entries(merged)) {
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, isEditing);
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-canary.20260521052552",
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.1-canary.20260521052552",
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.1-canary.20260521052552"
77
+ "@sitecore-content-sdk/events": "^2.1.0"
77
78
  },
78
79
  "dependencies": {
79
- "@sitecore-content-sdk/core": "2.1.1-canary.20260521052552",
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":"AA8DA;;;;;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,MASF,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,WA6B7C,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
+ {"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,CA4C3B"}
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"}