@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,140 +1,141 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { debug, NativeDataFetcher } from '@sitecore-content-sdk/core';
11
- import { QUERY_PARAM_EDITING_SECRET, EDITING_ALLOWED_ORIGINS, } from '@sitecore-content-sdk/core/editing';
12
- import { LayoutServicePageState } from '@sitecore-content-sdk/core/layout';
13
- import { getEditingSecret } from '../utils/utils';
14
- import { RenderMiddlewareBase } from './render-middleware';
15
- import { getEnforcedCorsHeaders } from '@sitecore-content-sdk/core/utils';
16
- import { getPreviewCookies, getRequiredEditingParamsList, mapEditingParams, cleanupNextPreviewCookies, getQueryParamsForPropagation, getHeadersForPropagation, getEditingRequestHtml, getCSPHeader, resolveServerUrl, } from './utils';
17
- /**
18
- * Middleware / handler for use in the editing render Next.js API route (e.g. '/api/editing/render')
19
- * which is required for Sitecore editing support.
20
- */
21
- export class EditingRenderMiddleware extends RenderMiddlewareBase {
22
- /**
23
- * @param {EditingRenderMiddlewareConfig} [config] Editing render middleware config
24
- */
25
- constructor(config) {
26
- super();
27
- this.config = config;
28
- this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
29
- var _a, _b, _c, _d, _e;
30
- const { body, method, headers, query } = req;
31
- debug.editing('editing render middleware start: %o', {
32
- method,
33
- query,
34
- headers,
35
- body,
36
- });
37
- const corsHeaders = getEnforcedCorsHeaders({
38
- requestMethod: req.method,
39
- headers: req.headers,
40
- presetCorsHeader: headers['Access-Control-Allow-Origin'],
41
- allowedOrigins: EDITING_ALLOWED_ORIGINS,
42
- });
43
- if (!corsHeaders) {
44
- debug.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
45
- return res.status(401).json({
46
- html: `<html><body>Requests from origin ${(_a = req.headers) === null || _a === void 0 ? void 0 : _a.origin} not allowed</body></html>`,
47
- });
48
- }
49
- Object.keys(corsHeaders).forEach((key) => {
50
- res.setHeader(key, corsHeaders[key]);
51
- });
52
- // Validate secret
53
- const secret = query[QUERY_PARAM_EDITING_SECRET];
54
- if (secret !== getEditingSecret()) {
55
- debug.editing('invalid editing secret - sent "%s" expected "%s"', secret, getEditingSecret());
56
- return res.status(401).json({
57
- html: '<html><body>Missing or invalid secret</body></html>',
58
- });
59
- }
60
- if (req.method === 'OPTIONS') {
61
- debug.editing('preflight request');
62
- // CORS headers are set by enforceCors
63
- return res.status(204).send(null);
64
- }
65
- if (req.method !== 'GET') {
66
- debug.editing('invalid method - sent %s expected GET', req.method);
67
- res.setHeader('Allow', 'GET');
68
- return res.status(405).json({
69
- html: `<html><body>Invalid request method '${req.method}'</body></html>`,
70
- });
71
- }
72
- const startTimestamp = Date.now();
73
- const mode = query.mode;
74
- const requiredQueryParams = getRequiredEditingParamsList(mode);
75
- const missingQueryParams = requiredQueryParams.filter((param) => !query[param]);
76
- // Validate query parameters
77
- if (missingQueryParams.length) {
78
- debug.editing('missing required query parameters: %o', missingQueryParams);
79
- return res.status(400).json({
80
- html: `<html><body>Missing required query parameters: ${missingQueryParams.join(', ')}</body></html>`,
81
- });
82
- }
83
- const previewDataParams = mapEditingParams(query);
84
- res.setPreviewData(Object.assign(Object.assign({}, previewDataParams), { variantIds: (_b = previewDataParams.variantIds) === null || _b === void 0 ? void 0 : _b.split(',') }), {
85
- maxAge: 3,
86
- });
87
- // Set Preview mode identifier cookie, if the page is rendered in Sitecore Preview mode
88
- if (mode === LayoutServicePageState.Preview) {
89
- const cookies = res.getHeader('Set-Cookie');
90
- const previewCookies = getPreviewCookies(query.sc_site);
91
- res.setHeader('Set-Cookie', [...cookies, ...previewCookies]);
92
- }
93
- // Restrict the page to be rendered only within the allowed origins
94
- res.setHeader('Content-Security-Policy', getCSPHeader());
95
- const encodedRoute = encodeURI(query.route);
96
- const route = ((_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.resolvePageUrl) === null || _d === void 0 ? void 0 : _d.call(_c, encodedRoute)) || encodedRoute;
97
- const base = ((_e = this.config) === null || _e === void 0 ? void 0 : _e.sitecoreInternalEditingHostUrl) || resolveServerUrl(req);
98
- const requestUrl = new URL(route, base);
99
- const cookies = res.getHeader('Set-Cookie');
100
- // Make actual render request for page route, passing on preview cookies as well as any approved query string parameters.
101
- // Note timestamp effectively disables caching the request (no amount of cache headers seemed to do it)
102
- try {
103
- debug.editing('fetching page route for %s', query.route);
104
- // Get query string parameters to propagate on subsequent requests (e.g. for deployment protection bypass)
105
- const propagatedQsParams = getQueryParamsForPropagation(query);
106
- // Get headers to propagate on subsequent requests
107
- const propagatedHeaders = getHeadersForPropagation(headers);
108
- const html = yield getEditingRequestHtml(requestUrl, propagatedQsParams, propagatedHeaders, cookies, this.dataFetcher);
109
- // remove preview cookies to not leak them to the browser
110
- if (cookies && Array.isArray(cookies)) {
111
- const filteredCookies = cleanupNextPreviewCookies(cookies);
112
- filteredCookies && res.setHeader('Set-Cookie', filteredCookies);
113
- }
114
- debug.editing('editing render middleware end in %dms: %o', Date.now() - startTimestamp, {
115
- status: 200,
116
- route,
117
- });
118
- res.status(200).send(html);
119
- }
120
- catch (err) {
121
- const error = err;
122
- console.error(error);
123
- if (error.response) {
124
- console.info(
125
- // eslint-disable-next-line quotes
126
- "Hint: for non-standard server or Next.js route configurations, you may need to override 'resolvePageUrl' or set the 'sitecoreInternalEditingHostUrl' (or SITECORE_INTERNAL_EDITING_HOST_URL env variable) available on the 'EditingRenderMiddleware' config.");
127
- }
128
- res.status(500).send(`<html><body>${error}</body></html>`);
129
- }
130
- });
131
- this.dataFetcher = new NativeDataFetcher({ debugger: debug.editing });
132
- }
133
- /**
134
- * Gets the Next.js API route handler
135
- * @returns route handler
136
- */
137
- getHandler() {
138
- return this.handler;
139
- }
140
- }
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { debug, NativeDataFetcher } from '@sitecore-content-sdk/core';
11
+ import { QUERY_PARAM_EDITING_SECRET, INVALID_SECRET_HTML_MESSAGE, EDITING_ALLOWED_ORIGINS, } from '@sitecore-content-sdk/core/editing';
12
+ import { LayoutServicePageState } from '@sitecore-content-sdk/core/layout';
13
+ import { getEditingSecret } from '../utils/utils';
14
+ import { RenderMiddlewareBase } from './render-middleware';
15
+ import { getEnforcedCorsHeaders } from '@sitecore-content-sdk/core/utils';
16
+ import { getPreviewCookies, getRequiredEditingParamsList, mapEditingParams, cleanupNextPreviewCookies, getQueryParamsForPropagation, getHeadersForPropagation, getEditingRequestHtml, getCSPHeader, resolveServerUrl, } from './utils';
17
+ /**
18
+ * Middleware / handler for use in the editing render Next.js API route (e.g. '/api/editing/render')
19
+ * which is required for Sitecore editing support.
20
+ * @public
21
+ */
22
+ export class EditingRenderMiddleware extends RenderMiddlewareBase {
23
+ /**
24
+ * @param {EditingRenderMiddlewareConfig} [config] Editing render middleware config
25
+ */
26
+ constructor(config) {
27
+ super();
28
+ this.config = config;
29
+ this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
30
+ var _a, _b, _c, _d, _e;
31
+ const { body, method, headers, query } = req;
32
+ debug.editing('editing render middleware start: %o', {
33
+ method,
34
+ query,
35
+ headers,
36
+ body,
37
+ });
38
+ const corsHeaders = getEnforcedCorsHeaders({
39
+ requestMethod: req.method,
40
+ headers: req.headers,
41
+ presetCorsHeader: headers['Access-Control-Allow-Origin'],
42
+ allowedOrigins: EDITING_ALLOWED_ORIGINS,
43
+ });
44
+ if (!corsHeaders) {
45
+ debug.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
46
+ return res.status(401).json({
47
+ html: `<html><body>Requests from origin ${(_a = req.headers) === null || _a === void 0 ? void 0 : _a.origin} not allowed</body></html>`,
48
+ });
49
+ }
50
+ Object.keys(corsHeaders).forEach((key) => {
51
+ res.setHeader(key, corsHeaders[key]);
52
+ });
53
+ // Validate secret
54
+ const secret = query[QUERY_PARAM_EDITING_SECRET];
55
+ if (secret !== getEditingSecret()) {
56
+ debug.editing('invalid editing secret - sent "%s" expected "%s"', secret, getEditingSecret());
57
+ return res.status(401).json({
58
+ html: INVALID_SECRET_HTML_MESSAGE,
59
+ });
60
+ }
61
+ if (req.method === 'OPTIONS') {
62
+ debug.editing('preflight request');
63
+ // CORS headers are set by enforceCors
64
+ return res.status(204).send(null);
65
+ }
66
+ if (req.method !== 'GET') {
67
+ debug.editing('invalid method - sent %s expected GET', req.method);
68
+ res.setHeader('Allow', 'GET');
69
+ return res.status(405).json({
70
+ html: `<html><body>Invalid request method '${req.method}'</body></html>`,
71
+ });
72
+ }
73
+ const startTimestamp = Date.now();
74
+ const mode = query.mode;
75
+ const requiredQueryParams = getRequiredEditingParamsList(mode);
76
+ const missingQueryParams = requiredQueryParams.filter((param) => !query[param]);
77
+ // Validate query parameters
78
+ if (missingQueryParams.length) {
79
+ debug.editing('missing required query parameters: %o', missingQueryParams);
80
+ return res.status(400).json({
81
+ html: `<html><body>Missing required query parameters: ${missingQueryParams.join(', ')}</body></html>`,
82
+ });
83
+ }
84
+ const previewDataParams = mapEditingParams(query);
85
+ res.setPreviewData(Object.assign(Object.assign({}, previewDataParams), { variantIds: (_b = previewDataParams.variantIds) === null || _b === void 0 ? void 0 : _b.split(',') }), {
86
+ maxAge: 3,
87
+ });
88
+ // Set Preview mode identifier cookie, if the page is rendered in Sitecore Preview mode
89
+ if (mode === LayoutServicePageState.Preview) {
90
+ const cookies = res.getHeader('Set-Cookie');
91
+ const previewCookies = getPreviewCookies(query.sc_site);
92
+ res.setHeader('Set-Cookie', [...cookies, ...previewCookies]);
93
+ }
94
+ // Restrict the page to be rendered only within the allowed origins
95
+ res.setHeader('Content-Security-Policy', getCSPHeader());
96
+ const encodedRoute = encodeURI(query.route);
97
+ const route = ((_d = (_c = this.config) === null || _c === void 0 ? void 0 : _c.resolvePageUrl) === null || _d === void 0 ? void 0 : _d.call(_c, encodedRoute)) || encodedRoute;
98
+ const base = ((_e = this.config) === null || _e === void 0 ? void 0 : _e.sitecoreInternalEditingHostUrl) || resolveServerUrl(req);
99
+ const requestUrl = new URL(route, base);
100
+ const cookies = res.getHeader('Set-Cookie');
101
+ // Make actual render request for page route, passing on preview cookies as well as any approved query string parameters.
102
+ // Note timestamp effectively disables caching the request (no amount of cache headers seemed to do it)
103
+ try {
104
+ debug.editing('fetching page route for %s', query.route);
105
+ // Get query string parameters to propagate on subsequent requests (e.g. for deployment protection bypass)
106
+ const propagatedQsParams = getQueryParamsForPropagation(query);
107
+ // Get headers to propagate on subsequent requests
108
+ const propagatedHeaders = getHeadersForPropagation(headers);
109
+ const html = yield getEditingRequestHtml(requestUrl, propagatedQsParams, propagatedHeaders, cookies, this.dataFetcher);
110
+ // remove preview cookies to not leak them to the browser
111
+ if (cookies && Array.isArray(cookies)) {
112
+ const filteredCookies = cleanupNextPreviewCookies(cookies);
113
+ filteredCookies && res.setHeader('Set-Cookie', filteredCookies);
114
+ }
115
+ debug.editing('editing render middleware end in %dms: %o', Date.now() - startTimestamp, {
116
+ status: 200,
117
+ route,
118
+ });
119
+ res.status(200).send(html);
120
+ }
121
+ catch (err) {
122
+ const error = err;
123
+ console.error(error);
124
+ if (error.response) {
125
+ console.info(
126
+ // eslint-disable-next-line quotes
127
+ "Hint: for non-standard server or Next.js route configurations, you may need to override 'resolvePageUrl' or set the 'sitecoreInternalEditingHostUrl' (or SITECORE_INTERNAL_EDITING_HOST_URL env variable) available on the 'EditingRenderMiddleware' config.");
128
+ }
129
+ res.status(500).send(`<html><body>${error}</body></html>`);
130
+ }
131
+ });
132
+ this.dataFetcher = new NativeDataFetcher({ debugger: debug.editing });
133
+ }
134
+ /**
135
+ * Gets the Next.js API route handler
136
+ * @returns route handler
137
+ */
138
+ getHandler() {
139
+ return this.handler;
140
+ }
141
+ }
@@ -1,97 +1,98 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { debug } from '@sitecore-content-sdk/core';
11
- import { EDITING_ALLOWED_ORIGINS, QUERY_PARAM_EDITING_SECRET, } from '@sitecore-content-sdk/core/editing';
12
- import { getEditingSecret } from '../utils/utils';
13
- import { RenderMiddlewareBase } from './render-middleware';
14
- import { enforceCors } from '@sitecore-content-sdk/core/utils';
15
- /**
16
- * Middleware / handler for use in the feaas render Next.js API route (e.g. '/api/editing/feaas/render')
17
- * which is required for Sitecore editing support.
18
- */
19
- export class FEAASRenderMiddleware extends RenderMiddlewareBase {
20
- /**
21
- * @param {EditingRenderMiddlewareConfig} [config] Editing render middleware config
22
- */
23
- constructor(config) {
24
- var _a;
25
- super();
26
- this.config = config;
27
- this.defaultPageUrl = '/feaas/render';
28
- this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
29
- var _a;
30
- const { method, query, headers } = req;
31
- const startTimestamp = Date.now();
32
- debug.editing('feaas render middleware start: %o', {
33
- method,
34
- query,
35
- headers,
36
- });
37
- if (!enforceCors(req, res, EDITING_ALLOWED_ORIGINS)) {
38
- debug.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
39
- return res
40
- .status(401)
41
- .send(`<html><body>Requests from origin ${(_a = req.headers) === null || _a === void 0 ? void 0 : _a.origin} are not allowed</body></html>`);
42
- }
43
- if (!method || !['GET', 'OPTIONS'].includes(method)) {
44
- debug.editing('invalid method - sent %s expected GET,OPTIONS', method);
45
- res.setHeader('Allow', 'GET, OPTIONS');
46
- return res.status(405).send(`<html><body>Invalid request method '${method}'</body></html>`);
47
- }
48
- // Validate secret
49
- const secret = query[QUERY_PARAM_EDITING_SECRET];
50
- if (secret !== getEditingSecret()) {
51
- debug.editing('invalid editing secret - sent "%s" expected "%s"', secret, getEditingSecret());
52
- return res.status(401).send('<html><body>Missing or invalid secret</body></html>');
53
- }
54
- // Handle preflight request
55
- if (method === 'OPTIONS') {
56
- debug.editing('preflight request');
57
- // CORS headers are set by enforceCors
58
- return res.status(204).send(null);
59
- }
60
- try {
61
- // Get query string parameters to propagate on subsequent requests (e.g. for deployment protection bypass)
62
- const params = this.getQueryParamsForPropagation(query);
63
- // Enable Next.js Preview Mode
64
- res.setPreviewData({});
65
- const queryParams = new URLSearchParams();
66
- for (const key in params) {
67
- if ({}.hasOwnProperty.call(params, key)) {
68
- queryParams.append(key, params[key]);
69
- }
70
- }
71
- // Pass "feaasSrc" in case a FEAASComponent is being requested
72
- if (query.feaasSrc) {
73
- queryParams.append('feaasSrc', query.feaasSrc);
74
- }
75
- const redirectUrl = this.pageUrl + (queryParams.toString() ? `?${queryParams.toString()}` : '');
76
- debug.editing('redirecting to page route %s', redirectUrl);
77
- debug.editing('feaas render middleware end in %dms', Date.now() - startTimestamp);
78
- res.redirect(redirectUrl);
79
- }
80
- catch (err) {
81
- const error = err;
82
- console.info(
83
- // eslint-disable-next-line quotes
84
- "Hint: for non-standard server or Next.js route configurations, you may need to override the 'pageUrl' available on the 'FEAASRenderMiddleware' config.");
85
- res.status(500).send(`<html><body>${error}</body></html>`);
86
- }
87
- });
88
- this.pageUrl = (_a = config === null || config === void 0 ? void 0 : config.pageUrl) !== null && _a !== void 0 ? _a : this.defaultPageUrl;
89
- }
90
- /**
91
- * Gets the Next.js API route handler
92
- * @returns route handler
93
- */
94
- getHandler() {
95
- return this.handler;
96
- }
97
- }
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { debug } from '@sitecore-content-sdk/core';
11
+ import { EDITING_ALLOWED_ORIGINS, QUERY_PARAM_EDITING_SECRET, INVALID_SECRET_HTML_MESSAGE, } from '@sitecore-content-sdk/core/editing';
12
+ import { getEditingSecret } from '../utils/utils';
13
+ import { RenderMiddlewareBase } from './render-middleware';
14
+ import { enforceCors } from '@sitecore-content-sdk/core/utils';
15
+ /**
16
+ * Middleware / handler for use in the feaas render Next.js API route (e.g. '/api/editing/feaas/render')
17
+ * which is required for Sitecore editing support.
18
+ * @public
19
+ */
20
+ export class FEAASRenderMiddleware extends RenderMiddlewareBase {
21
+ /**
22
+ * @param {EditingRenderMiddlewareConfig} [config] Editing render middleware config
23
+ */
24
+ constructor(config) {
25
+ var _a;
26
+ super();
27
+ this.config = config;
28
+ this.defaultPageUrl = '/feaas/render';
29
+ this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
30
+ var _a;
31
+ const { method, query, headers } = req;
32
+ const startTimestamp = Date.now();
33
+ debug.editing('feaas render middleware start: %o', {
34
+ method,
35
+ query,
36
+ headers,
37
+ });
38
+ if (!enforceCors(req, res, EDITING_ALLOWED_ORIGINS)) {
39
+ debug.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
40
+ return res
41
+ .status(401)
42
+ .send(`<html><body>Requests from origin ${(_a = req.headers) === null || _a === void 0 ? void 0 : _a.origin} are not allowed</body></html>`);
43
+ }
44
+ if (!method || !['GET', 'OPTIONS'].includes(method)) {
45
+ debug.editing('invalid method - sent %s expected GET,OPTIONS', method);
46
+ res.setHeader('Allow', 'GET, OPTIONS');
47
+ return res.status(405).send(`<html><body>Invalid request method '${method}'</body></html>`);
48
+ }
49
+ // Validate secret
50
+ const secret = query[QUERY_PARAM_EDITING_SECRET];
51
+ if (secret !== getEditingSecret()) {
52
+ debug.editing('invalid editing secret - sent "%s" expected "%s"', secret, getEditingSecret());
53
+ return res.status(401).send(INVALID_SECRET_HTML_MESSAGE);
54
+ }
55
+ // Handle preflight request
56
+ if (method === 'OPTIONS') {
57
+ debug.editing('preflight request');
58
+ // CORS headers are set by enforceCors
59
+ return res.status(204).send(null);
60
+ }
61
+ try {
62
+ // Get query string parameters to propagate on subsequent requests (e.g. for deployment protection bypass)
63
+ const params = this.getQueryParamsForPropagation(query);
64
+ // Enable Next.js Preview Mode
65
+ res.setPreviewData({});
66
+ const queryParams = new URLSearchParams();
67
+ for (const key in params) {
68
+ if ({}.hasOwnProperty.call(params, key)) {
69
+ queryParams.append(key, params[key]);
70
+ }
71
+ }
72
+ // Pass "feaasSrc" in case a FEAASComponent is being requested
73
+ if (query.feaasSrc) {
74
+ queryParams.append('feaasSrc', query.feaasSrc);
75
+ }
76
+ const redirectUrl = this.pageUrl + (queryParams.toString() ? `?${queryParams.toString()}` : '');
77
+ debug.editing('redirecting to page route %s', redirectUrl);
78
+ debug.editing('feaas render middleware end in %dms', Date.now() - startTimestamp);
79
+ res.redirect(redirectUrl);
80
+ }
81
+ catch (err) {
82
+ const error = err;
83
+ console.info(
84
+ // eslint-disable-next-line quotes
85
+ "Hint: for non-standard server or Next.js route configurations, you may need to override the 'pageUrl' available on the 'FEAASRenderMiddleware' config.");
86
+ res.status(500).send(`<html><body>${error}</body></html>`);
87
+ }
88
+ });
89
+ this.pageUrl = (_a = config === null || config === void 0 ? void 0 : config.pageUrl) !== null && _a !== void 0 ? _a : this.defaultPageUrl;
90
+ }
91
+ /**
92
+ * Gets the Next.js API route handler
93
+ * @returns route handler
94
+ */
95
+ getHandler() {
96
+ return this.handler;
97
+ }
98
+ }
@@ -1,6 +1,6 @@
1
- export { EditingService } from '@sitecore-content-sdk/core/editing';
2
- export { EditingRenderMiddleware, } from './editing-render-middleware';
3
- export { isDesignLibraryPreviewData, getQueryParamsForPropagation, getHeadersForPropagation, } from './utils';
4
- export { FEAASRenderMiddleware } from './feaas-render-middleware';
5
- export { EditingConfigMiddleware, } from './editing-config-middleware';
6
- export { RenderingType, EDITING_COMPONENT_PLACEHOLDER, EDITING_COMPONENT_ID, } from '@sitecore-content-sdk/core/layout';
1
+ export { EditingService } from '@sitecore-content-sdk/core/editing';
2
+ export { EditingRenderMiddleware, } from './editing-render-middleware';
3
+ export { isDesignLibraryPreviewData, getQueryParamsForPropagation, getHeadersForPropagation, } from './utils';
4
+ export { FEAASRenderMiddleware } from './feaas-render-middleware';
5
+ export { EditingConfigMiddleware, } from './editing-config-middleware';
6
+ export { RenderingType, EDITING_COMPONENT_PLACEHOLDER, EDITING_COMPONENT_ID, } from '@sitecore-content-sdk/core/layout';
@@ -1,42 +1,42 @@
1
- import { QUERY_PARAM_VERCEL_PROTECTION_BYPASS, QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE, EDITING_PASS_THROUGH_HEADERS, } from './constants';
2
- /**
3
- * Base class for middleware that handles pages and components rendering in Sitecore Editors.
4
- * @deprecated getQueryParamsForPropagation and getHeadersForPropagation methods have been moved to separate exports
5
- */
6
- export class RenderMiddlewareBase {
7
- constructor() {
8
- /**
9
- * Gets query parameters that should be passed along to subsequent requests (e.g. for deployment protection bypass)
10
- * @param {object} query Object of query parameters from incoming URL
11
- * @returns Object of approved query parameters
12
- */
13
- this.getQueryParamsForPropagation = (query) => {
14
- const params = {};
15
- if (query[QUERY_PARAM_VERCEL_PROTECTION_BYPASS]) {
16
- params[QUERY_PARAM_VERCEL_PROTECTION_BYPASS] = query[QUERY_PARAM_VERCEL_PROTECTION_BYPASS];
17
- }
18
- if (query[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE]) {
19
- params[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE] = query[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE];
20
- }
21
- return params;
22
- };
23
- /**
24
- * Get headers that should be passed along to subsequent requests
25
- * @param {IncomingHttpHeaders} headers Incoming HTTP Headers
26
- * @returns Object of approved headers
27
- */
28
- this.getHeadersForPropagation = (headers) => {
29
- // Filter and normalize headers
30
- const filteredHeaders = EDITING_PASS_THROUGH_HEADERS.reduce((acc, header) => {
31
- const value = headers.get
32
- ? headers.get(header)
33
- : headers[header];
34
- if (value) {
35
- acc[header] = Array.isArray(value) ? value.join(', ') : value;
36
- }
37
- return acc;
38
- }, {});
39
- return filteredHeaders;
40
- };
41
- }
42
- }
1
+ import { QUERY_PARAM_VERCEL_PROTECTION_BYPASS, QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE, EDITING_PASS_THROUGH_HEADERS, } from './constants';
2
+ /**
3
+ * Base class for middleware that handles pages and components rendering in Sitecore Editors.
4
+ * @internal
5
+ */
6
+ export class RenderMiddlewareBase {
7
+ constructor() {
8
+ /**
9
+ * Gets query parameters that should be passed along to subsequent requests (e.g. for deployment protection bypass)
10
+ * @param {object} query Object of query parameters from incoming URL
11
+ * @returns Object of approved query parameters
12
+ */
13
+ this.getQueryParamsForPropagation = (query) => {
14
+ const params = {};
15
+ if (query[QUERY_PARAM_VERCEL_PROTECTION_BYPASS]) {
16
+ params[QUERY_PARAM_VERCEL_PROTECTION_BYPASS] = query[QUERY_PARAM_VERCEL_PROTECTION_BYPASS];
17
+ }
18
+ if (query[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE]) {
19
+ params[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE] = query[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE];
20
+ }
21
+ return params;
22
+ };
23
+ /**
24
+ * Get headers that should be passed along to subsequent requests
25
+ * @param {IncomingHttpHeaders} headers Incoming HTTP Headers
26
+ * @returns Object of approved headers
27
+ */
28
+ this.getHeadersForPropagation = (headers) => {
29
+ // Filter and normalize headers
30
+ const filteredHeaders = EDITING_PASS_THROUGH_HEADERS.reduce((acc, header) => {
31
+ const value = headers.get
32
+ ? headers.get(header)
33
+ : headers[header];
34
+ if (value) {
35
+ acc[header] = Array.isArray(value) ? value.join(', ') : value;
36
+ }
37
+ return acc;
38
+ }, {});
39
+ return filteredHeaders;
40
+ };
41
+ }
42
+ }