@sitecore-content-sdk/nextjs 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.
Files changed (234) hide show
  1. package/README.md +11 -11
  2. package/dist/cjs/client/index.js +10 -10
  3. package/dist/cjs/client/models.js +2 -2
  4. package/dist/cjs/client/sitecore-nextjs-client.js +160 -156
  5. package/dist/cjs/components/BYOCWrapper.js +31 -30
  6. package/dist/cjs/components/ComponentPropsContext.js +66 -59
  7. package/dist/cjs/components/FEaaSWrapper.js +33 -32
  8. package/dist/cjs/components/Link.js +117 -90
  9. package/dist/cjs/components/NextImage.js +66 -62
  10. package/dist/cjs/components/Placeholder.js +55 -50
  11. package/dist/cjs/components/RichText.js +133 -128
  12. package/dist/cjs/config/define-config.js +26 -25
  13. package/dist/cjs/config/index.js +5 -5
  14. package/dist/cjs/config-cli/define-cli-config.js +40 -39
  15. package/dist/cjs/config-cli/index.js +5 -5
  16. package/dist/cjs/editing/codegen/import-map.js +129 -118
  17. package/dist/cjs/editing/codegen/index.js +6 -6
  18. package/dist/cjs/editing/constants.js +10 -10
  19. package/dist/cjs/editing/editing-config-middleware.js +70 -69
  20. package/dist/cjs/editing/editing-render-middleware.js +145 -144
  21. package/dist/cjs/editing/feaas-render-middleware.js +102 -101
  22. package/dist/cjs/editing/index.js +19 -19
  23. package/dist/cjs/editing/render-middleware.js +46 -46
  24. package/dist/cjs/editing/utils.js +260 -257
  25. package/dist/cjs/index.js +132 -131
  26. package/dist/cjs/middleware/app-router-multisite-middleware.js +41 -20
  27. package/dist/cjs/middleware/index.js +30 -30
  28. package/dist/cjs/middleware/locale-middleware.js +85 -84
  29. package/dist/cjs/middleware/middleware.js +195 -192
  30. package/dist/cjs/middleware/multisite-middleware.js +141 -118
  31. package/dist/cjs/middleware/personalize-middleware.js +240 -236
  32. package/dist/cjs/middleware/redirects-middleware.js +323 -297
  33. package/dist/cjs/middleware/robots-middleware.js +45 -44
  34. package/dist/cjs/middleware/sitemap-middleware.js +50 -49
  35. package/dist/cjs/monitoring/healthcheck-middleware.js +31 -30
  36. package/dist/cjs/monitoring/index.js +5 -5
  37. package/dist/cjs/route-handler/editing-config-route-handler.js +110 -106
  38. package/dist/cjs/route-handler/editing-render-route-handler.js +270 -165
  39. package/dist/cjs/route-handler/index.js +11 -11
  40. package/dist/cjs/route-handler/robots-route-handler.js +69 -68
  41. package/dist/cjs/route-handler/sitemap-route-handler.js +66 -65
  42. package/dist/cjs/search/index.js +17 -0
  43. package/dist/cjs/services/component-props-service.js +142 -138
  44. package/dist/cjs/sharedTypes/component-props.js +2 -2
  45. package/dist/cjs/sharedTypes/sitecore-page-props.js +2 -2
  46. package/dist/cjs/site/index.js +5 -5
  47. package/dist/cjs/tools/codegen/import-map.js +15 -0
  48. package/dist/cjs/tools/component-props.loader.js +95 -95
  49. package/dist/cjs/tools/generate-map.js +317 -317
  50. package/dist/cjs/tools/index.js +14 -13
  51. package/dist/cjs/tools/templating/byoc-component.js +36 -36
  52. package/dist/cjs/tools/templating/constants.js +7 -7
  53. package/dist/cjs/tools/templating/default-component.js +35 -35
  54. package/dist/cjs/tools/templating/utils.js +200 -0
  55. package/dist/cjs/utils/index.js +14 -14
  56. package/dist/cjs/utils/utils.js +82 -73
  57. package/dist/esm/client/index.js +2 -2
  58. package/dist/esm/client/models.js +1 -1
  59. package/dist/esm/client/sitecore-nextjs-client.js +156 -152
  60. package/dist/esm/components/BYOCWrapper.js +27 -26
  61. package/dist/esm/components/ComponentPropsContext.js +28 -21
  62. package/dist/esm/components/FEaaSWrapper.js +29 -28
  63. package/dist/esm/components/Link.js +78 -51
  64. package/dist/esm/components/NextImage.js +60 -56
  65. package/dist/esm/components/Placeholder.js +18 -13
  66. package/dist/esm/components/RichText.js +96 -91
  67. package/dist/esm/config/define-config.js +21 -20
  68. package/dist/esm/config/index.js +1 -1
  69. package/dist/esm/config-cli/define-cli-config.js +36 -35
  70. package/dist/esm/config-cli/index.js +1 -1
  71. package/dist/esm/editing/codegen/import-map.js +92 -81
  72. package/dist/esm/editing/codegen/index.js +1 -1
  73. package/dist/esm/editing/constants.js +7 -7
  74. package/dist/esm/editing/editing-config-middleware.js +66 -65
  75. package/dist/esm/editing/editing-render-middleware.js +141 -140
  76. package/dist/esm/editing/feaas-render-middleware.js +98 -97
  77. package/dist/esm/editing/index.js +6 -6
  78. package/dist/esm/editing/render-middleware.js +42 -42
  79. package/dist/esm/editing/utils.js +246 -243
  80. package/dist/esm/index.js +25 -25
  81. package/dist/esm/middleware/app-router-multisite-middleware.js +37 -16
  82. package/dist/esm/middleware/index.js +11 -11
  83. package/dist/esm/middleware/locale-middleware.js +81 -80
  84. package/dist/esm/middleware/middleware.js +189 -186
  85. package/dist/esm/middleware/multisite-middleware.js +137 -114
  86. package/dist/esm/middleware/personalize-middleware.js +236 -232
  87. package/dist/esm/middleware/redirects-middleware.js +316 -290
  88. package/dist/esm/middleware/robots-middleware.js +41 -40
  89. package/dist/esm/middleware/sitemap-middleware.js +46 -45
  90. package/dist/esm/monitoring/healthcheck-middleware.js +27 -26
  91. package/dist/esm/monitoring/index.js +1 -1
  92. package/dist/esm/route-handler/editing-config-route-handler.js +106 -102
  93. package/dist/esm/route-handler/editing-render-route-handler.js +265 -160
  94. package/dist/esm/route-handler/index.js +4 -4
  95. package/dist/esm/route-handler/robots-route-handler.js +65 -64
  96. package/dist/esm/route-handler/sitemap-route-handler.js +63 -62
  97. package/dist/esm/search/index.js +1 -0
  98. package/dist/esm/services/component-props-service.js +135 -131
  99. package/dist/esm/sharedTypes/component-props.js +1 -1
  100. package/dist/esm/sharedTypes/sitecore-page-props.js +1 -1
  101. package/dist/esm/site/index.js +1 -1
  102. package/dist/esm/tools/codegen/import-map.js +11 -0
  103. package/dist/esm/tools/component-props.loader.js +59 -59
  104. package/dist/esm/tools/generate-map.js +279 -279
  105. package/dist/esm/tools/index.js +3 -2
  106. package/dist/esm/tools/templating/byoc-component.js +30 -30
  107. package/dist/esm/tools/templating/constants.js +4 -4
  108. package/dist/esm/tools/templating/default-component.js +29 -29
  109. package/dist/esm/tools/templating/utils.js +190 -0
  110. package/dist/esm/utils/index.js +3 -3
  111. package/dist/esm/utils/utils.js +74 -65
  112. package/package.json +87 -13
  113. package/search.d.ts +1 -0
  114. package/types/client/index.d.ts +3 -2
  115. package/types/client/index.d.ts.map +1 -0
  116. package/types/client/models.d.ts +9 -8
  117. package/types/client/models.d.ts.map +1 -0
  118. package/types/client/sitecore-nextjs-client.d.ts +68 -63
  119. package/types/client/sitecore-nextjs-client.d.ts.map +1 -0
  120. package/types/components/BYOCWrapper.d.ts +16 -14
  121. package/types/components/BYOCWrapper.d.ts.map +1 -0
  122. package/types/components/ComponentPropsContext.d.ts +30 -18
  123. package/types/components/ComponentPropsContext.d.ts.map +1 -0
  124. package/types/components/FEaaSWrapper.d.ts +17 -15
  125. package/types/components/FEaaSWrapper.d.ts.map +1 -0
  126. package/types/components/Link.d.ts +25 -15
  127. package/types/components/Link.d.ts.map +1 -0
  128. package/types/components/NextImage.d.ts +11 -6
  129. package/types/components/NextImage.d.ts.map +1 -0
  130. package/types/components/Placeholder.d.ts +14 -8
  131. package/types/components/Placeholder.d.ts.map +1 -0
  132. package/types/components/RichText.d.ts +35 -25
  133. package/types/components/RichText.d.ts.map +1 -0
  134. package/types/config/define-config.d.ts +42 -38
  135. package/types/config/define-config.d.ts.map +1 -0
  136. package/types/config/index.d.ts +2 -1
  137. package/types/config/index.d.ts.map +1 -0
  138. package/types/config-cli/define-cli-config.d.ts +10 -8
  139. package/types/config-cli/define-cli-config.d.ts.map +1 -0
  140. package/types/config-cli/index.d.ts +2 -1
  141. package/types/config-cli/index.d.ts.map +1 -0
  142. package/types/editing/codegen/import-map.d.ts +15 -3
  143. package/types/editing/codegen/import-map.d.ts.map +1 -0
  144. package/types/editing/codegen/index.d.ts +3 -2
  145. package/types/editing/codegen/index.d.ts.map +1 -0
  146. package/types/editing/constants.d.ts +8 -7
  147. package/types/editing/constants.d.ts.map +1 -0
  148. package/types/editing/editing-config-middleware.d.ts +37 -31
  149. package/types/editing/editing-config-middleware.d.ts.map +1 -0
  150. package/types/editing/editing-render-middleware.d.ts +47 -44
  151. package/types/editing/editing-render-middleware.d.ts.map +1 -0
  152. package/types/editing/feaas-render-middleware.d.ts +35 -32
  153. package/types/editing/feaas-render-middleware.d.ts.map +1 -0
  154. package/types/editing/index.d.ts +7 -6
  155. package/types/editing/index.d.ts.map +1 -0
  156. package/types/editing/render-middleware.d.ts +26 -25
  157. package/types/editing/render-middleware.d.ts.map +1 -0
  158. package/types/editing/utils.d.ts +110 -106
  159. package/types/editing/utils.d.ts.map +1 -0
  160. package/types/index.d.ts +25 -24
  161. package/types/index.d.ts.map +1 -0
  162. package/types/middleware/app-router-multisite-middleware.d.ts +28 -13
  163. package/types/middleware/app-router-multisite-middleware.d.ts.map +1 -0
  164. package/types/middleware/index.d.ts +12 -11
  165. package/types/middleware/index.d.ts.map +1 -0
  166. package/types/middleware/locale-middleware.d.ts +35 -32
  167. package/types/middleware/locale-middleware.d.ts.map +1 -0
  168. package/types/middleware/middleware.d.ts +135 -127
  169. package/types/middleware/middleware.d.ts.map +1 -0
  170. package/types/middleware/multisite-middleware.d.ts +54 -37
  171. package/types/middleware/multisite-middleware.d.ts.map +1 -0
  172. package/types/middleware/personalize-middleware.d.ts +81 -65
  173. package/types/middleware/personalize-middleware.d.ts.map +1 -0
  174. package/types/middleware/redirects-middleware.d.ts +68 -65
  175. package/types/middleware/redirects-middleware.d.ts.map +1 -0
  176. package/types/middleware/robots-middleware.d.ts +15 -13
  177. package/types/middleware/robots-middleware.d.ts.map +1 -0
  178. package/types/middleware/sitemap-middleware.d.ts +16 -14
  179. package/types/middleware/sitemap-middleware.d.ts.map +1 -0
  180. package/types/monitoring/healthcheck-middleware.d.ts +14 -12
  181. package/types/monitoring/healthcheck-middleware.d.ts.map +1 -0
  182. package/types/monitoring/index.d.ts +2 -1
  183. package/types/monitoring/index.d.ts.map +1 -0
  184. package/types/route-handler/editing-config-route-handler.d.ts +30 -24
  185. package/types/route-handler/editing-config-route-handler.d.ts.map +1 -0
  186. package/types/route-handler/editing-render-route-handler.d.ts +33 -25
  187. package/types/route-handler/editing-render-route-handler.d.ts.map +1 -0
  188. package/types/route-handler/index.d.ts +5 -4
  189. package/types/route-handler/index.d.ts.map +1 -0
  190. package/types/route-handler/robots-route-handler.d.ts +30 -28
  191. package/types/route-handler/robots-route-handler.d.ts.map +1 -0
  192. package/types/route-handler/sitemap-route-handler.d.ts +30 -28
  193. package/types/route-handler/sitemap-route-handler.d.ts.map +1 -0
  194. package/types/search/index.d.ts +2 -0
  195. package/types/search/index.d.ts.map +1 -0
  196. package/types/services/component-props-service.d.ts +62 -57
  197. package/types/services/component-props-service.d.ts.map +1 -0
  198. package/types/sharedTypes/component-props.d.ts +62 -47
  199. package/types/sharedTypes/component-props.d.ts.map +1 -0
  200. package/types/sharedTypes/sitecore-page-props.d.ts +14 -9
  201. package/types/sharedTypes/sitecore-page-props.d.ts.map +1 -0
  202. package/types/site/index.d.ts +2 -1
  203. package/types/site/index.d.ts.map +1 -0
  204. package/types/tools/codegen/import-map.d.ts +10 -0
  205. package/types/tools/codegen/import-map.d.ts.map +1 -0
  206. package/types/tools/component-props.loader.d.ts +8 -7
  207. package/types/tools/component-props.loader.d.ts.map +1 -0
  208. package/types/tools/generate-map.d.ts +26 -24
  209. package/types/tools/generate-map.d.ts.map +1 -0
  210. package/types/tools/index.d.ts +4 -2
  211. package/types/tools/index.d.ts.map +1 -0
  212. package/types/tools/templating/byoc-component.d.ts +3 -2
  213. package/types/tools/templating/byoc-component.d.ts.map +1 -0
  214. package/types/tools/templating/constants.d.ts +5 -4
  215. package/types/tools/templating/constants.d.ts.map +1 -0
  216. package/types/tools/templating/default-component.d.ts +3 -2
  217. package/types/tools/templating/default-component.d.ts.map +1 -0
  218. package/types/tools/templating/utils.d.ts +44 -0
  219. package/types/tools/templating/utils.d.ts.map +1 -0
  220. package/types/utils/index.d.ts +4 -3
  221. package/types/utils/index.d.ts.map +1 -0
  222. package/types/utils/utils.d.ts +34 -24
  223. package/types/utils/utils.d.ts.map +1 -0
  224. package/client.js +0 -1
  225. package/codegen.js +0 -1
  226. package/config-cli.js +0 -1
  227. package/config.js +0 -1
  228. package/editing.js +0 -1
  229. package/middleware.js +0 -1
  230. package/monitoring.js +0 -1
  231. package/route-handler.js +0 -1
  232. package/site.js +0 -1
  233. package/tools.js +0 -1
  234. package/utils.js +0 -1
@@ -1,46 +1,46 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RenderMiddlewareBase = void 0;
4
- const constants_1 = require("./constants");
5
- /**
6
- * Base class for middleware that handles pages and components rendering in Sitecore Editors.
7
- * @deprecated getQueryParamsForPropagation and getHeadersForPropagation methods have been moved to separate exports
8
- */
9
- class RenderMiddlewareBase {
10
- constructor() {
11
- /**
12
- * Gets query parameters that should be passed along to subsequent requests (e.g. for deployment protection bypass)
13
- * @param {object} query Object of query parameters from incoming URL
14
- * @returns Object of approved query parameters
15
- */
16
- this.getQueryParamsForPropagation = (query) => {
17
- const params = {};
18
- if (query[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS]) {
19
- params[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS] = query[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS];
20
- }
21
- if (query[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE]) {
22
- params[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE] = query[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE];
23
- }
24
- return params;
25
- };
26
- /**
27
- * Get headers that should be passed along to subsequent requests
28
- * @param {IncomingHttpHeaders} headers Incoming HTTP Headers
29
- * @returns Object of approved headers
30
- */
31
- this.getHeadersForPropagation = (headers) => {
32
- // Filter and normalize headers
33
- const filteredHeaders = constants_1.EDITING_PASS_THROUGH_HEADERS.reduce((acc, header) => {
34
- const value = headers.get
35
- ? headers.get(header)
36
- : headers[header];
37
- if (value) {
38
- acc[header] = Array.isArray(value) ? value.join(', ') : value;
39
- }
40
- return acc;
41
- }, {});
42
- return filteredHeaders;
43
- };
44
- }
45
- }
46
- exports.RenderMiddlewareBase = RenderMiddlewareBase;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenderMiddlewareBase = void 0;
4
+ const constants_1 = require("./constants");
5
+ /**
6
+ * Base class for middleware that handles pages and components rendering in Sitecore Editors.
7
+ * @internal
8
+ */
9
+ class RenderMiddlewareBase {
10
+ constructor() {
11
+ /**
12
+ * Gets query parameters that should be passed along to subsequent requests (e.g. for deployment protection bypass)
13
+ * @param {object} query Object of query parameters from incoming URL
14
+ * @returns Object of approved query parameters
15
+ */
16
+ this.getQueryParamsForPropagation = (query) => {
17
+ const params = {};
18
+ if (query[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS]) {
19
+ params[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS] = query[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS];
20
+ }
21
+ if (query[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE]) {
22
+ params[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE] = query[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE];
23
+ }
24
+ return params;
25
+ };
26
+ /**
27
+ * Get headers that should be passed along to subsequent requests
28
+ * @param {IncomingHttpHeaders} headers Incoming HTTP Headers
29
+ * @returns Object of approved headers
30
+ */
31
+ this.getHeadersForPropagation = (headers) => {
32
+ // Filter and normalize headers
33
+ const filteredHeaders = constants_1.EDITING_PASS_THROUGH_HEADERS.reduce((acc, header) => {
34
+ const value = headers.get
35
+ ? headers.get(header)
36
+ : headers[header];
37
+ if (value) {
38
+ acc[header] = Array.isArray(value) ? value.join(', ') : value;
39
+ }
40
+ return acc;
41
+ }, {});
42
+ return filteredHeaders;
43
+ };
44
+ }
45
+ }
46
+ exports.RenderMiddlewareBase = RenderMiddlewareBase;
@@ -1,257 +1,260 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.getCSPHeader = exports.resolveServerUrl = exports.isDesignLibraryPreviewData = exports.getEditingRequestHtml = exports.getHeadersForPropagation = exports.getQueryParamsForPropagation = exports.getRequiredEditingParamsList = exports.getPreviewCookies = exports.cleanupNextPreviewCookies = exports.mapEditingParams = exports.getEditingSecretFromRequest = void 0;
13
- const editing_1 = require("@sitecore-content-sdk/core/editing");
14
- const personalize_1 = require("@sitecore-content-sdk/core/personalize");
15
- const site_1 = require("@sitecore-content-sdk/core/site");
16
- const constants_1 = require("./constants");
17
- const constants_2 = require("next/constants");
18
- const utils_1 = require("@sitecore-content-sdk/core/utils");
19
- /**
20
- * Gets editing secret value from request
21
- * @param {NextApiRequest | NextRequest} req incoming request
22
- * @returns {string | undefined} editing secret value if present
23
- */
24
- const getEditingSecretFromRequest = (req) => {
25
- const reqQuery = req.query;
26
- const reqUrl = req.url;
27
- let secret = undefined;
28
- if (reqQuery) {
29
- // pages router
30
- secret = reqQuery[editing_1.QUERY_PARAM_EDITING_SECRET];
31
- }
32
- else if (reqUrl) {
33
- // app router
34
- const url = new URL(reqUrl);
35
- secret = url.searchParams.get(editing_1.QUERY_PARAM_EDITING_SECRET);
36
- }
37
- return secret;
38
- };
39
- exports.getEditingSecretFromRequest = getEditingSecretFromRequest;
40
- /**
41
- * Parses query string and its parameters to required editing parameters
42
- * @param {{ [key: string]: string | undefined }} query query string values
43
- * @returns {EditingRenderQueryParams} editing parameters
44
- */
45
- const mapEditingParams = (query) => {
46
- const params = (0, editing_1.isDesignLibraryMode)(query.mode)
47
- ? {
48
- itemId: query.sc_itemid,
49
- componentUid: query.sc_uid,
50
- renderingId: query.sc_renderingId,
51
- language: query.sc_lang,
52
- site: query.sc_site,
53
- mode: query.mode,
54
- dataSourceId: query.dataSourceId,
55
- version: query.sc_version,
56
- generation: query.generation,
57
- }
58
- : {
59
- site: query.sc_site,
60
- itemId: query.sc_itemid,
61
- language: query.sc_lang,
62
- // for sc_variantId we may employ multiple variants (page-layout + component level)
63
- // they will be separated by commas (,)
64
- variantIds: query.sc_variant || personalize_1.DEFAULT_VARIANT,
65
- version: query.sc_version,
66
- mode: query.mode,
67
- layoutKind: query.sc_layoutKind,
68
- };
69
- return params;
70
- };
71
- exports.mapEditingParams = mapEditingParams;
72
- /**
73
- * Filters out Next.js preview cookies from a cookie string or array
74
- * @param {string | string[] | null} cookies cookie header value
75
- * @returns {string[] | null} filtered cookies
76
- */
77
- const cleanupNextPreviewCookies = (cookies) => {
78
- if (!cookies) {
79
- return null;
80
- }
81
- if (!Array.isArray(cookies)) {
82
- cookies = cookies.split(',');
83
- }
84
- // Filter out Next.js preview cookies
85
- const filteredCookies = cookies.filter((cookie) => !new RegExp(`^${"__next_preview_data" /* PreviewCookies.PREVIEW_DATA */}=`).test(cookie) &&
86
- !new RegExp(`^${"__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */}=`).test(cookie));
87
- return filteredCookies;
88
- };
89
- exports.cleanupNextPreviewCookies = cleanupNextPreviewCookies;
90
- /**
91
- * Gets the Next.js preview cookies to enable preview mode
92
- * @param {string} site current site name
93
- * @returns {string[]} list of cookies to set
94
- */
95
- const getPreviewCookies = (site) => {
96
- const previewSite = `${site_1.SITE_KEY}=${site}; Path=/; HttpOnly; SameSite=None; Secure`;
97
- const previewCookie = `${editing_1.PREVIEW_KEY}=true; Path=/; HttpOnly; SameSite=None; Secure`;
98
- return [previewSite, previewCookie];
99
- };
100
- exports.getPreviewCookies = getPreviewCookies;
101
- /**
102
- * Returns the list of required query parameters based on the page editing mode
103
- * @param {DesignLibraryMode | LayoutServicePageState.Preview | LayoutServicePageState.Edit} mode current page mode
104
- * @returns {string[]} list of required parameters for validation
105
- */
106
- const getRequiredEditingParamsList = (mode) => {
107
- const editingRequiredParams = ['sc_site', 'sc_itemid', 'sc_lang', 'route', 'mode'];
108
- const componentRequiredParams = [
109
- 'sc_site',
110
- 'sc_itemid',
111
- 'sc_renderingId',
112
- 'sc_uid',
113
- 'sc_lang',
114
- 'mode',
115
- ];
116
- return (0, editing_1.isDesignLibraryMode)(mode) ? componentRequiredParams : editingRequiredParams;
117
- };
118
- exports.getRequiredEditingParamsList = getRequiredEditingParamsList;
119
- /**
120
- * Gets query parameters that should be passed along to subsequent requests (e.g. for deployment protection bypass)
121
- * @param {object} query Object of query parameters from incoming URL
122
- * @returns Object of approved query parameters
123
- */
124
- const getQueryParamsForPropagation = (query) => {
125
- const params = {};
126
- if (query[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS]) {
127
- params[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS] = query[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS];
128
- }
129
- if (query[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE]) {
130
- params[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE] = query[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE];
131
- }
132
- return params;
133
- };
134
- exports.getQueryParamsForPropagation = getQueryParamsForPropagation;
135
- /**
136
- * Get headers that should be passed along to subsequent requests
137
- * @param {IncomingHttpHeaders} headers Incoming HTTP Headers
138
- * @returns Object of approved headers
139
- */
140
- const getHeadersForPropagation = (headers) => {
141
- // Filter and normalize headers
142
- const filteredHeaders = constants_1.EDITING_PASS_THROUGH_HEADERS.reduce((acc, header) => {
143
- const value = headers.get
144
- ? headers.get(header)
145
- : headers[header];
146
- if (value) {
147
- acc[header] = Array.isArray(value) ? value.join(', ') : value;
148
- }
149
- return acc;
150
- }, {});
151
- return filteredHeaders;
152
- };
153
- exports.getHeadersForPropagation = getHeadersForPropagation;
154
- /**
155
- * Performs an internal request to get the HTML for the editing mode
156
- * @param {string} requestUrl URL to send request to
157
- * @param {object} propagatedQsParams query string params to use with request
158
- * @param {object} propagatedHeaders headers to use with request
159
- * @param {string[]} cookies cookies to use with request
160
- * @param {NativeDataFetcher} dataFetcher NativeFetcher instance to send request with
161
- * @returns {string} HTML with editing markup
162
- */
163
- const getEditingRequestHtml = (requestUrl, propagatedQsParams, propagatedHeaders, cookies, dataFetcher) => __awaiter(void 0, void 0, void 0, function* () {
164
- // Grab the Next.js preview cookies to send on to the render request
165
- propagatedHeaders.cookie = `${propagatedHeaders.cookie ? propagatedHeaders.cookie + ';' : ''}${cookies.join(';')}`;
166
- // enable content sdk preview
167
- propagatedHeaders.__content_sdk_preview = '1';
168
- for (const key in propagatedQsParams) {
169
- if ({}.hasOwnProperty.call(propagatedQsParams, key)) {
170
- propagatedQsParams[key] && requestUrl.searchParams.append(key, propagatedQsParams[key]);
171
- }
172
- }
173
- requestUrl.searchParams.append('timestamp', Date.now().toString());
174
- const pageRes = yield dataFetcher
175
- .get(requestUrl.toString(), {
176
- credentials: 'include',
177
- headers: propagatedHeaders,
178
- })
179
- .catch((err) => {
180
- // We need to handle not found error provided by Vercel
181
- // for `fallback: false` pages
182
- if (err.response.status === 404) {
183
- return err.response;
184
- }
185
- throw err;
186
- });
187
- let html = pageRes.data;
188
- if (!html || html.length === 0) {
189
- throw new Error(`Failed to render html for ${requestUrl.toString()}`);
190
- }
191
- // replace phkey attribute with key attribute so that newly added renderings
192
- // show correct placeholders, so save and refresh won't be needed after adding each rendering
193
- html = html.replace(new RegExp('phkey', 'g'), 'key');
194
- // When SSG, Next will attempt to perform a router.replace on the client-side to inject the query string parms
195
- // to the router state. See https://github.com/vercel/next.js/blob/v10.0.3/packages/next/client/index.tsx#L169.
196
- // However, this doesn't really work since at this point we're in the editor and the location.search has nothing
197
- // to do with the Next route/page we've rendered. Beyond the extraneous request, this can result in a 404 with
198
- // certain route configurations (e.g. multiple catch-all routes).
199
- // The following line will trick it into thinking we're SSR, thus avoiding any router.replace.
200
- html = html.replace(constants_2.STATIC_PROPS_ID, constants_2.SERVER_PROPS_ID);
201
- return html;
202
- });
203
- exports.getEditingRequestHtml = getEditingRequestHtml;
204
- /**
205
- * Type guard for Design Library mode
206
- * @param {object} data preview data to check
207
- * @returns true if the data is EditingPreviewData
208
- * @see EditingPreviewData
209
- */
210
- const isDesignLibraryPreviewData = (data) => {
211
- return (typeof data === 'object' &&
212
- data !== null &&
213
- 'mode' in data &&
214
- (0, editing_1.isDesignLibraryMode)(data.mode));
215
- };
216
- exports.isDesignLibraryPreviewData = isDesignLibraryPreviewData;
217
- /**
218
- * Server URL Resolution order (highest to lowest priority):
219
- * 1. `config.sitecoreInternalEditingHostUrl` (explicitly set in config)
220
- * 2. Environment variable `SITECORE_INTERNAL_EDITING_HOST_URL`
221
- * 3. Fallbacks:
222
- * - For XM Cloud deployments `'http://localhost:3000'`
223
- * - For all other cases → use the request `Host` header
224
- * Note we use https protocol on Vercel due to serverless function architecture.
225
- * In all other scenarios, including localhost (with or without a proxy e.g. ngrok)
226
- * and within a nodejs container, http protocol should be used.
227
- *
228
- * For information about the VERCEL environment variable, see
229
- * https://vercel.com/docs/environment-variables#system-environment-variables
230
- * @param {NextApiRequest} req
231
- */
232
- const resolveServerUrl = (req) => {
233
- const internalHostUrl = process.env.SITECORE_INTERNAL_EDITING_HOST_URL;
234
- if (internalHostUrl) {
235
- return internalHostUrl;
236
- }
237
- // in xmc deployment we always use localhost:3000
238
- if (process.env.SITECORE) {
239
- return 'http://localhost:3000';
240
- }
241
- // to preserve auth headers, use https if we're in our 3 main hosting options
242
- const useHttps = (process.env.VERCEL || process.env.NETLIFY) !== undefined;
243
- const host = req.headers.get
244
- ? req.headers.get('host')
245
- : req.headers.host;
246
- // use https for requests with auth but also support unsecured http rendering hosts
247
- return `${useHttps ? 'https' : 'http'}://${host}`;
248
- };
249
- exports.resolveServerUrl = resolveServerUrl;
250
- /**
251
- * Gets the Content-Security-Policy header value
252
- * @returns Content-Security-Policy header value
253
- */
254
- const getCSPHeader = () => {
255
- return `frame-ancestors 'self' ${[...(0, utils_1.getAllowedOriginsFromEnv)(), ...editing_1.EDITING_ALLOWED_ORIGINS].join(' ')}`;
256
- };
257
- exports.getCSPHeader = getCSPHeader;
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getCSPHeader = exports.resolveServerUrl = exports.isDesignLibraryPreviewData = exports.getEditingRequestHtml = exports.getHeadersForPropagation = exports.getQueryParamsForPropagation = exports.getRequiredEditingParamsList = exports.getPreviewCookies = exports.cleanupNextPreviewCookies = exports.mapEditingParams = exports.getEditingSecretFromRequest = void 0;
13
+ const editing_1 = require("@sitecore-content-sdk/core/editing");
14
+ const personalize_1 = require("@sitecore-content-sdk/core/personalize");
15
+ const site_1 = require("@sitecore-content-sdk/core/site");
16
+ const constants_1 = require("./constants");
17
+ const constants_2 = require("next/constants");
18
+ const utils_1 = require("@sitecore-content-sdk/core/utils");
19
+ /**
20
+ * Gets editing secret value from request
21
+ * @param {NextApiRequest | NextRequest} req incoming request
22
+ * @returns {string | undefined} editing secret value if present
23
+ */
24
+ const getEditingSecretFromRequest = (req) => {
25
+ const reqQuery = req.query;
26
+ const reqUrl = req.url;
27
+ let secret = undefined;
28
+ if (reqQuery) {
29
+ // pages router
30
+ secret = reqQuery[editing_1.QUERY_PARAM_EDITING_SECRET];
31
+ }
32
+ else if (reqUrl) {
33
+ // app router
34
+ const url = new URL(reqUrl);
35
+ secret = url.searchParams.get(editing_1.QUERY_PARAM_EDITING_SECRET);
36
+ }
37
+ return secret;
38
+ };
39
+ exports.getEditingSecretFromRequest = getEditingSecretFromRequest;
40
+ /**
41
+ * Parses query string and its parameters to required editing parameters
42
+ * @param {{ [key: string]: string | undefined }} query query string values
43
+ * @returns {EditingRenderQueryParams} editing parameters
44
+ */
45
+ const mapEditingParams = (query) => {
46
+ const params = (0, editing_1.isDesignLibraryMode)(query.mode)
47
+ ? {
48
+ itemId: query.sc_itemid,
49
+ componentUid: query.sc_uid,
50
+ renderingId: query.sc_renderingId,
51
+ language: query.sc_lang,
52
+ site: query.sc_site,
53
+ mode: query.mode,
54
+ dataSourceId: query.dataSourceId,
55
+ version: query.sc_version,
56
+ generation: query.generation,
57
+ }
58
+ : {
59
+ site: query.sc_site,
60
+ itemId: query.sc_itemid,
61
+ language: query.sc_lang,
62
+ // for sc_variantId we may employ multiple variants (page-layout + component level)
63
+ // they will be separated by commas (,)
64
+ variantIds: query.sc_variant || personalize_1.DEFAULT_VARIANT,
65
+ version: query.sc_version,
66
+ mode: query.mode,
67
+ layoutKind: query.sc_layoutKind,
68
+ };
69
+ return params;
70
+ };
71
+ exports.mapEditingParams = mapEditingParams;
72
+ /**
73
+ * Filters out Next.js preview cookies from a cookie string or array
74
+ * @param {string | string[] | null} cookies cookie header value
75
+ * @returns {string[] | null} filtered cookies
76
+ */
77
+ const cleanupNextPreviewCookies = (cookies) => {
78
+ if (!cookies) {
79
+ return null;
80
+ }
81
+ if (!Array.isArray(cookies)) {
82
+ cookies = cookies.split(',');
83
+ }
84
+ // Filter out Next.js preview cookies
85
+ const filteredCookies = cookies.filter((cookie) => !new RegExp(`^${"__next_preview_data" /* PreviewCookies.PREVIEW_DATA */}=`).test(cookie) &&
86
+ !new RegExp(`^${"__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */}=`).test(cookie));
87
+ return filteredCookies;
88
+ };
89
+ exports.cleanupNextPreviewCookies = cleanupNextPreviewCookies;
90
+ /**
91
+ * Gets the Next.js preview cookies to enable preview mode
92
+ * @param {string} site current site name
93
+ * @returns {string[]} list of cookies to set
94
+ */
95
+ const getPreviewCookies = (site) => {
96
+ const previewSite = `${site_1.SITE_KEY}=${site}; Path=/; HttpOnly; SameSite=None; Secure`;
97
+ const previewCookie = `${editing_1.PREVIEW_KEY}=true; Path=/; HttpOnly; SameSite=None; Secure`;
98
+ return [previewSite, previewCookie];
99
+ };
100
+ exports.getPreviewCookies = getPreviewCookies;
101
+ /**
102
+ * Returns the list of required query parameters based on the page editing mode
103
+ * @param {DesignLibraryMode | LayoutServicePageState.Preview | LayoutServicePageState.Edit} mode current page mode
104
+ * @returns {string[]} list of required parameters for validation
105
+ */
106
+ const getRequiredEditingParamsList = (mode) => {
107
+ const editingRequiredParams = ['sc_site', 'sc_itemid', 'sc_lang', 'route', 'mode'];
108
+ const componentRequiredParams = [
109
+ 'sc_site',
110
+ 'sc_itemid',
111
+ 'sc_renderingId',
112
+ 'sc_uid',
113
+ 'sc_lang',
114
+ 'mode',
115
+ ];
116
+ return (0, editing_1.isDesignLibraryMode)(mode) ? componentRequiredParams : editingRequiredParams;
117
+ };
118
+ exports.getRequiredEditingParamsList = getRequiredEditingParamsList;
119
+ /**
120
+ * Gets query parameters that should be passed along to subsequent requests (e.g. for deployment protection bypass)
121
+ * @param {object} query Object of query parameters from incoming URL
122
+ * @returns Object of approved query parameters
123
+ * @internal
124
+ */
125
+ const getQueryParamsForPropagation = (query) => {
126
+ const params = {};
127
+ if (query[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS]) {
128
+ params[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS] = query[constants_1.QUERY_PARAM_VERCEL_PROTECTION_BYPASS];
129
+ }
130
+ if (query[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE]) {
131
+ params[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE] = query[constants_1.QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE];
132
+ }
133
+ return params;
134
+ };
135
+ exports.getQueryParamsForPropagation = getQueryParamsForPropagation;
136
+ /**
137
+ * Get headers that should be passed along to subsequent requests
138
+ * @param {IncomingHttpHeaders} headers Incoming HTTP Headers
139
+ * @returns Object of approved headers
140
+ * @internal
141
+ */
142
+ const getHeadersForPropagation = (headers) => {
143
+ // Filter and normalize headers
144
+ const filteredHeaders = constants_1.EDITING_PASS_THROUGH_HEADERS.reduce((acc, header) => {
145
+ const value = headers.get
146
+ ? headers.get(header)
147
+ : headers[header];
148
+ if (value) {
149
+ acc[header] = Array.isArray(value) ? value.join(', ') : value;
150
+ }
151
+ return acc;
152
+ }, {});
153
+ return filteredHeaders;
154
+ };
155
+ exports.getHeadersForPropagation = getHeadersForPropagation;
156
+ /**
157
+ * Performs an internal request to get the HTML for the editing mode
158
+ * @param {string} requestUrl URL to send request to
159
+ * @param {object} propagatedQsParams query string params to use with request
160
+ * @param {object} propagatedHeaders headers to use with request
161
+ * @param {string[]} cookies cookies to use with request
162
+ * @param {NativeDataFetcher} dataFetcher NativeFetcher instance to send request with
163
+ * @returns {string} HTML with editing markup
164
+ */
165
+ const getEditingRequestHtml = (requestUrl, propagatedQsParams, propagatedHeaders, cookies, dataFetcher) => __awaiter(void 0, void 0, void 0, function* () {
166
+ // Grab the Next.js preview cookies to send on to the render request
167
+ propagatedHeaders.cookie = `${propagatedHeaders.cookie ? propagatedHeaders.cookie + ';' : ''}${cookies.join(';')}`;
168
+ // enable content sdk preview
169
+ propagatedHeaders.__content_sdk_preview = '1';
170
+ for (const key in propagatedQsParams) {
171
+ if ({}.hasOwnProperty.call(propagatedQsParams, key)) {
172
+ propagatedQsParams[key] && requestUrl.searchParams.append(key, propagatedQsParams[key]);
173
+ }
174
+ }
175
+ requestUrl.searchParams.append('timestamp', Date.now().toString());
176
+ const pageRes = yield dataFetcher
177
+ .get(requestUrl.toString(), {
178
+ credentials: 'include',
179
+ headers: propagatedHeaders,
180
+ })
181
+ .catch((err) => {
182
+ // We need to handle not found error provided by Vercel
183
+ // for `fallback: false` pages
184
+ if (err.response.status === 404) {
185
+ return err.response;
186
+ }
187
+ throw err;
188
+ });
189
+ let html = pageRes.data;
190
+ if (!html || html.length === 0) {
191
+ throw new Error(`Failed to render html for ${requestUrl.toString()}`);
192
+ }
193
+ // replace phkey attribute with key attribute so that newly added renderings
194
+ // show correct placeholders, so save and refresh won't be needed after adding each rendering
195
+ html = html.replace(new RegExp('phkey', 'g'), 'key');
196
+ // When SSG, Next will attempt to perform a router.replace on the client-side to inject the query string parms
197
+ // to the router state. See https://github.com/vercel/next.js/blob/v10.0.3/packages/next/client/index.tsx#L169.
198
+ // However, this doesn't really work since at this point we're in the editor and the location.search has nothing
199
+ // to do with the Next route/page we've rendered. Beyond the extraneous request, this can result in a 404 with
200
+ // certain route configurations (e.g. multiple catch-all routes).
201
+ // The following line will trick it into thinking we're SSR, thus avoiding any router.replace.
202
+ html = html.replace(constants_2.STATIC_PROPS_ID, constants_2.SERVER_PROPS_ID);
203
+ return html;
204
+ });
205
+ exports.getEditingRequestHtml = getEditingRequestHtml;
206
+ /**
207
+ * Type guard for Design Library mode
208
+ * @param {object} data preview data to check
209
+ * @returns true if the data is EditingPreviewData
210
+ * @see EditingPreviewData
211
+ * @public
212
+ */
213
+ const isDesignLibraryPreviewData = (data) => {
214
+ return (typeof data === 'object' &&
215
+ data !== null &&
216
+ 'mode' in data &&
217
+ (0, editing_1.isDesignLibraryMode)(data.mode));
218
+ };
219
+ exports.isDesignLibraryPreviewData = isDesignLibraryPreviewData;
220
+ /**
221
+ * Server URL Resolution order (highest to lowest priority):
222
+ * 1. `config.sitecoreInternalEditingHostUrl` (explicitly set in config)
223
+ * 2. Environment variable `SITECORE_INTERNAL_EDITING_HOST_URL`
224
+ * 3. Fallbacks:
225
+ * - For XM Cloud deployments `'http://localhost:3000'`
226
+ * - For all other cases use the request `Host` header
227
+ * Note we use https protocol on Vercel due to serverless function architecture.
228
+ * In all other scenarios, including localhost (with or without a proxy e.g. ngrok)
229
+ * and within a nodejs container, http protocol should be used.
230
+ *
231
+ * For information about the VERCEL environment variable, see
232
+ * https://vercel.com/docs/environment-variables#system-environment-variables
233
+ * @param {NextApiRequest} req
234
+ */
235
+ const resolveServerUrl = (req) => {
236
+ const internalHostUrl = process.env.SITECORE_INTERNAL_EDITING_HOST_URL;
237
+ if (internalHostUrl) {
238
+ return internalHostUrl;
239
+ }
240
+ // in xmc deployment we always use localhost:3000
241
+ if (process.env.SITECORE) {
242
+ return 'http://localhost:3000';
243
+ }
244
+ // to preserve auth headers, use https if we're in our 3 main hosting options
245
+ const useHttps = (process.env.VERCEL || process.env.NETLIFY) !== undefined;
246
+ const host = req.headers.get
247
+ ? req.headers.get('host')
248
+ : req.headers.host;
249
+ // use https for requests with auth but also support unsecured http rendering hosts
250
+ return `${useHttps ? 'https' : 'http'}://${host}`;
251
+ };
252
+ exports.resolveServerUrl = resolveServerUrl;
253
+ /**
254
+ * Gets the Content-Security-Policy header value
255
+ * @returns Content-Security-Policy header value
256
+ */
257
+ const getCSPHeader = () => {
258
+ return `frame-ancestors 'self' ${[...(0, utils_1.getAllowedOriginsFromEnv)(), ...editing_1.EDITING_ALLOWED_ORIGINS].join(' ')}`;
259
+ };
260
+ exports.getCSPHeader = getCSPHeader;