@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,165 +1,270 @@
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.createEditingRenderRouteHandlers = void 0;
13
- exports.getNextCookies = getNextCookies;
14
- const core_1 = require("@sitecore-content-sdk/core");
15
- const editing_1 = require("@sitecore-content-sdk/core/editing");
16
- const utils_1 = require("@sitecore-content-sdk/core/utils");
17
- const layout_1 = require("@sitecore-content-sdk/core/layout");
18
- const utils_2 = require("../utils/utils");
19
- const headers_1 = require("next/headers");
20
- const utils_3 = require("../editing/utils");
21
- const site_1 = require("@sitecore-content-sdk/core/site");
22
- /**
23
- * Helper function to handle cookie operations - can be mocked for testing
24
- * @returns {Promise<NextCookies>} Next cookies
25
- */
26
- function getNextCookies() {
27
- return __awaiter(this, void 0, void 0, function* () {
28
- // In test environment, use mock cookie store only if specifically provided
29
- if (process.env.TEST === 'true' && global.__TEST_COOKIE_STORE__) {
30
- return global.__TEST_COOKIE_STORE__;
31
- }
32
- return yield (0, headers_1.cookies)();
33
- });
34
- }
35
- const createEditingRenderRouteHandlers = (options) => {
36
- const dataFetcher = new core_1.NativeDataFetcher({ debugger: core_1.debug.editing });
37
- const OPTIONS = (req) => {
38
- var _a;
39
- // init query string values
40
- const query = {};
41
- req.nextUrl.searchParams.forEach((value, key) => {
42
- query[key] = value;
43
- });
44
- const expectedCorsHeaders = (0, utils_1.getEnforcedCorsHeaders)({
45
- requestMethod: req.method,
46
- headers: req.headers,
47
- presetCorsHeader: (_a = req.headers) === null || _a === void 0 ? void 0 : _a.get('Access-Control-Allow-Origin'),
48
- allowedOrigins: editing_1.EDITING_ALLOWED_ORIGINS,
49
- });
50
- if (!expectedCorsHeaders) {
51
- core_1.debug.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
52
- return new Response(`<html><body>Requests from origin ${req.headers.get('origin')} not allowed</body></html>`, { status: 401 });
53
- }
54
- core_1.debug.editing('preflight request');
55
- return new Response(null, { status: 204, headers: expectedCorsHeaders });
56
- };
57
- const GET = (req) => __awaiter(void 0, void 0, void 0, function* () {
58
- var _a, _b;
59
- const { method, headers } = req;
60
- // init query string values
61
- const query = {};
62
- req.nextUrl.searchParams.forEach((value, key) => {
63
- query[key] = value;
64
- });
65
- core_1.debug.editing('editing render handler start: %o', {
66
- method,
67
- query,
68
- headers,
69
- });
70
- const expectedCorsHeaders = (0, utils_1.getEnforcedCorsHeaders)({
71
- requestMethod: req.method,
72
- headers: headers,
73
- presetCorsHeader: headers.get('Access-Control-Allow-Origin'),
74
- allowedOrigins: editing_1.EDITING_ALLOWED_ORIGINS,
75
- });
76
- if (!expectedCorsHeaders) {
77
- core_1.debug.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
78
- return new Response(`<html><body>Requests from origin ${req.headers.get('origin')} not allowed</body></html>`, { status: 401 });
79
- }
80
- const responseHeaders = expectedCorsHeaders;
81
- // Validate secret
82
- const secret = query[editing_1.QUERY_PARAM_EDITING_SECRET];
83
- if (secret !== (0, utils_2.getEditingSecret)()) {
84
- core_1.debug.editing('invalid editing secret - sent "%s" expected "%s"', secret, (0, utils_2.getEditingSecret)());
85
- return Response.json({
86
- html: '<html><body>Missing or invalid secret</body></html>',
87
- }, { status: 401, headers: responseHeaders });
88
- }
89
- // enable preview
90
- const draft = yield (0, headers_1.draftMode)();
91
- draft.enable();
92
- const startTimestamp = Date.now();
93
- const mode = query.mode;
94
- const requiredQueryParams = (0, utils_3.getRequiredEditingParamsList)(mode);
95
- const missingQueryParams = requiredQueryParams.filter((param) => !query[param]);
96
- // Validate query parameters
97
- if (missingQueryParams.length) {
98
- core_1.debug.editing('missing required query parameters: %o', missingQueryParams);
99
- return Response.json({
100
- html: `<html><body>Missing required query parameters: ${missingQueryParams.join(', ')}</body></html>`,
101
- }, { status: 400, headers: responseHeaders });
102
- }
103
- const encodedRoute = encodeURI(query.route);
104
- const route = ((_a = options === null || options === void 0 ? void 0 : options.resolvePageUrl) === null || _a === void 0 ? void 0 : _a.call(options, encodedRoute)) || encodedRoute;
105
- const base = (0, utils_3.resolveServerUrl)(req);
106
- const requestUrl = new URL(route, base);
107
- // Restrict the page to be rendered only within the allowed origins
108
- responseHeaders['Content-Security-Policy'] = (0, utils_3.getCSPHeader)();
109
- const cookieStore = yield getNextCookies();
110
- cookieStore.set("__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */, ((_b = cookieStore.get("__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */)) === null || _b === void 0 ? void 0 : _b.value) || '', {
111
- httpOnly: true,
112
- path: '/',
113
- sameSite: 'none',
114
- secure: true,
115
- });
116
- // Set Preview mode identifier cookies, if the page is rendered in Sitecore Preview mode
117
- if (mode === layout_1.LayoutServicePageState.Preview) {
118
- cookieStore.set(editing_1.PREVIEW_KEY, 'true', {
119
- httpOnly: true,
120
- path: '/',
121
- sameSite: 'none',
122
- secure: true,
123
- });
124
- cookieStore.set(site_1.SITE_KEY, query.sc_site, {
125
- httpOnly: true,
126
- path: '/',
127
- sameSite: 'none',
128
- secure: true,
129
- });
130
- }
131
- const convertedCookies = cookieStore.getAll().map((c) => `${c.name}=${c.value}`);
132
- try {
133
- core_1.debug.editing('fetching page route for %s', query.route);
134
- // Get query string parameters to propagate on subsequent requests (e.g. for deployment protection bypass)
135
- // Additionally ,in app router preview data is passed through query string instead of preview data cookie
136
- const propagatedQsParams = Object.assign(Object.assign({}, (0, utils_3.getQueryParamsForPropagation)(query)), (0, utils_3.mapEditingParams)(query));
137
- // Get headers to propagate on subsequent requests
138
- const propagatedHeaders = (0, utils_3.getHeadersForPropagation)(headers);
139
- const html = yield (0, utils_3.getEditingRequestHtml)(requestUrl, propagatedQsParams, propagatedHeaders, convertedCookies, dataFetcher);
140
- // remove nextjs preview cookies to not leak them to the browser
141
- const filteredCookies = (0, utils_3.cleanupNextPreviewCookies)(convertedCookies);
142
- responseHeaders['Set-Cookie'] = (filteredCookies === null || filteredCookies === void 0 ? void 0 : filteredCookies.join('; ')) || '';
143
- core_1.debug.editing('editing render handler end in %dms: %o', Date.now() - startTimestamp, {
144
- status: 200,
145
- route,
146
- });
147
- responseHeaders['Content-Type'] = 'text/html; charset=utf-8';
148
- return new Response(html, { status: 200, headers: responseHeaders });
149
- }
150
- catch (err) {
151
- core_1.debug.editing('error fetching page route %s: %o', requestUrl, err);
152
- core_1.debug.editing('falling back to redirect method... ');
153
- core_1.debug.editing('editing render handler end in %dms: redirect %o', Date.now() - startTimestamp, {
154
- status: 307,
155
- route,
156
- });
157
- return Response.redirect(route);
158
- }
159
- finally {
160
- yield draft.disable();
161
- }
162
- });
163
- return { GET, OPTIONS };
164
- };
165
- exports.createEditingRenderRouteHandlers = createEditingRenderRouteHandlers;
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.createEditingRenderRouteHandlers = void 0;
13
+ exports.getNextCookies = getNextCookies;
14
+ const core_1 = require("@sitecore-content-sdk/core");
15
+ const editing_1 = require("@sitecore-content-sdk/core/editing");
16
+ const utils_1 = require("@sitecore-content-sdk/core/utils");
17
+ const layout_1 = require("@sitecore-content-sdk/core/layout");
18
+ const utils_2 = require("../utils/utils");
19
+ const headers_1 = require("next/headers");
20
+ const utils_3 = require("../editing/utils");
21
+ const site_1 = require("@sitecore-content-sdk/core/site");
22
+ /**
23
+ * Helper function to handle cookie operations - can be mocked for testing
24
+ * @returns {Promise<NextCookies>} Next cookies
25
+ */
26
+ function getNextCookies() {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ // In test environment, use mock cookie store only if specifically provided
29
+ if (process.env.TEST === 'true' && global.__TEST_COOKIE_STORE__) {
30
+ return global.__TEST_COOKIE_STORE__;
31
+ }
32
+ return yield (0, headers_1.cookies)();
33
+ });
34
+ }
35
+ /**
36
+ * Creates a route handler for the editing render API route (e.g. '/api/editing/render')
37
+ * @param {EditingHandlerOptions} options - The options for the route handler.
38
+ * @returns The route handler object with GET and OPTIONS methods.
39
+ * @public
40
+ */
41
+ const createEditingRenderRouteHandlers = (options) => {
42
+ const dataFetcher = new core_1.NativeDataFetcher({ debugger: core_1.debug.editing });
43
+ const getCorsHeaders = (req) => {
44
+ var _a;
45
+ const expectedCorsHeaders = (0, utils_1.getEnforcedCorsHeaders)({
46
+ requestMethod: req.method,
47
+ headers: req.headers,
48
+ presetCorsHeader: (_a = req.headers) === null || _a === void 0 ? void 0 : _a.get('Access-Control-Allow-Origin'),
49
+ allowedOrigins: editing_1.EDITING_ALLOWED_ORIGINS,
50
+ });
51
+ if (!expectedCorsHeaders) {
52
+ core_1.debug.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
53
+ }
54
+ return expectedCorsHeaders;
55
+ };
56
+ const getOriginNotAllowedMessage = (origin) => {
57
+ return `<html><body>Requests from origin ${origin} not allowed</body></html>`;
58
+ };
59
+ const validateEditingSecret = (receivedSecret) => {
60
+ const editingSecret = (0, utils_2.getEditingSecret)();
61
+ const secretIsvalid = editingSecret === receivedSecret;
62
+ if (!secretIsvalid) {
63
+ core_1.debug.editing('invalid editing secret - sent "%s" expected "%s"', receivedSecret, editingSecret);
64
+ }
65
+ return secretIsvalid;
66
+ };
67
+ const OPTIONS = (req) => {
68
+ // init query string values
69
+ const query = {};
70
+ req.nextUrl.searchParams.forEach((value, key) => {
71
+ query[key] = value;
72
+ });
73
+ const expectedCorsHeaders = getCorsHeaders(req);
74
+ if (!expectedCorsHeaders) {
75
+ return new Response(getOriginNotAllowedMessage(req.headers.get('origin') || ''), {
76
+ status: 401,
77
+ });
78
+ }
79
+ core_1.debug.editing('preflight request');
80
+ return new Response(null, { status: 204, headers: expectedCorsHeaders });
81
+ };
82
+ const GET = (req) => __awaiter(void 0, void 0, void 0, function* () {
83
+ var _a, _b;
84
+ const { method, headers } = req;
85
+ // init query string values
86
+ const query = {};
87
+ req.nextUrl.searchParams.forEach((value, key) => {
88
+ query[key] = value;
89
+ });
90
+ core_1.debug.editing('editing render handler start: %o', {
91
+ method,
92
+ query,
93
+ headers,
94
+ });
95
+ const expectedCorsHeaders = getCorsHeaders(req);
96
+ if (!expectedCorsHeaders) {
97
+ return new Response(getOriginNotAllowedMessage(req.headers.get('origin') || ''), {
98
+ status: 401,
99
+ });
100
+ }
101
+ const responseHeaders = expectedCorsHeaders;
102
+ // Validate secret
103
+ if (!validateEditingSecret(query[editing_1.QUERY_PARAM_EDITING_SECRET])) {
104
+ return Response.json({
105
+ html: editing_1.INVALID_SECRET_HTML_MESSAGE,
106
+ }, { status: 401, headers: responseHeaders });
107
+ }
108
+ // enable preview
109
+ const draft = yield (0, headers_1.draftMode)();
110
+ draft.enable();
111
+ const startTimestamp = Date.now();
112
+ const mode = query.mode;
113
+ const requiredQueryParams = (0, utils_3.getRequiredEditingParamsList)(mode);
114
+ const missingQueryParams = requiredQueryParams.filter((param) => !query[param]);
115
+ // Validate query parameters
116
+ if (missingQueryParams.length) {
117
+ core_1.debug.editing('missing required query parameters: %o', missingQueryParams);
118
+ return Response.json({
119
+ html: `<html><body>Missing required query parameters: ${missingQueryParams.join(', ')}</body></html>`,
120
+ }, { status: 400, headers: responseHeaders });
121
+ }
122
+ const encodedRoute = encodeURI(query.route);
123
+ const route = ((_a = options === null || options === void 0 ? void 0 : options.resolvePageUrl) === null || _a === void 0 ? void 0 : _a.call(options, encodedRoute)) || encodedRoute;
124
+ const base = (0, utils_3.resolveServerUrl)(req);
125
+ const requestUrl = new URL(route, base);
126
+ // Restrict the page to be rendered only within the allowed origins
127
+ responseHeaders['Content-Security-Policy'] = (0, utils_3.getCSPHeader)();
128
+ const cookieStore = yield getNextCookies();
129
+ cookieStore.set("__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */, ((_b = cookieStore.get("__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */)) === null || _b === void 0 ? void 0 : _b.value) || '', {
130
+ httpOnly: true,
131
+ path: '/',
132
+ sameSite: 'none',
133
+ secure: true,
134
+ });
135
+ // Set Preview mode identifier cookies, if the page is rendered in Sitecore Preview mode
136
+ if (mode === layout_1.LayoutServicePageState.Preview) {
137
+ cookieStore.set(editing_1.PREVIEW_KEY, 'true', {
138
+ httpOnly: true,
139
+ path: '/',
140
+ sameSite: 'none',
141
+ secure: true,
142
+ });
143
+ cookieStore.set(site_1.SITE_KEY, query.sc_site, {
144
+ httpOnly: true,
145
+ path: '/',
146
+ sameSite: 'none',
147
+ secure: true,
148
+ });
149
+ }
150
+ const convertedCookies = cookieStore.getAll().map((c) => `${c.name}=${c.value}`);
151
+ try {
152
+ core_1.debug.editing('fetching page route for %s', query.route);
153
+ // Get query string parameters to propagate on subsequent requests (e.g. for deployment protection bypass)
154
+ // Additionally ,in app router preview data is passed through query string instead of preview data cookie
155
+ const propagatedQsParams = Object.assign(Object.assign({}, (0, utils_3.getQueryParamsForPropagation)(query)), (0, utils_3.mapEditingParams)(query));
156
+ // Get headers to propagate on subsequent requests
157
+ const propagatedHeaders = (0, utils_3.getHeadersForPropagation)(headers);
158
+ const html = yield (0, utils_3.getEditingRequestHtml)(requestUrl, propagatedQsParams, propagatedHeaders, convertedCookies, dataFetcher);
159
+ // remove nextjs preview cookies to not leak them to the browser
160
+ const filteredCookies = (0, utils_3.cleanupNextPreviewCookies)(convertedCookies);
161
+ responseHeaders['Set-Cookie'] = (filteredCookies === null || filteredCookies === void 0 ? void 0 : filteredCookies.join('; ')) || '';
162
+ core_1.debug.editing('editing render handler end in %dms: %o', Date.now() - startTimestamp, {
163
+ status: 200,
164
+ route,
165
+ });
166
+ responseHeaders['Content-Type'] = 'text/html; charset=utf-8';
167
+ return new Response(html, { status: 200, headers: responseHeaders });
168
+ }
169
+ catch (err) {
170
+ core_1.debug.editing('error fetching page route %s: %o', requestUrl, err);
171
+ core_1.debug.editing('falling back to redirect method... ');
172
+ core_1.debug.editing('editing render handler end in %dms: redirect %o', Date.now() - startTimestamp, {
173
+ status: 307,
174
+ route,
175
+ });
176
+ return Response.redirect(route);
177
+ }
178
+ finally {
179
+ yield draft.disable();
180
+ }
181
+ });
182
+ /**
183
+ * This POST handler serves as proxy for server action call when Design Library is rendering server component.
184
+ * When Design Library needs to dynamically update or render a generated variant of server component a server action {@link updateServerComponentAction} is called from the client side.
185
+ * The way server functions work is that the action call is made to the same URL with POST method, which in normal page render is handled internally by Next.js.
186
+ * However, in editing mode we are in an api route handler scenario so we need to proxy the POST request to be able to process the server action correctly.
187
+ * @param {NextRequest} req - The incoming request
188
+ */
189
+ const POST = (req) => __awaiter(void 0, void 0, void 0, function* () {
190
+ var _a;
191
+ const requestOrigin = req.headers.get('origin') || '';
192
+ const originHost = new URL(requestOrigin).host;
193
+ const expectedCorsHeaders = getCorsHeaders(req);
194
+ // Bypass CORS if:
195
+ // we are in local or sitecore environment - requested hostname is 'localhost'
196
+ // or the request is same origin (e.g. in vercel netlify environment)
197
+ const bypassCors = req.nextUrl.hostname === 'localhost' || req.nextUrl.host === originHost;
198
+ if (!bypassCors && !expectedCorsHeaders) {
199
+ return new Response(getOriginNotAllowedMessage(requestOrigin), {
200
+ status: 401,
201
+ });
202
+ }
203
+ // Validate secret
204
+ if (!validateEditingSecret(req.nextUrl.searchParams.get(editing_1.QUERY_PARAM_EDITING_SECRET) || '')) {
205
+ return Response.json({
206
+ html: editing_1.INVALID_SECRET_HTML_MESSAGE,
207
+ }, { status: 401, headers: expectedCorsHeaders !== null && expectedCorsHeaders !== void 0 ? expectedCorsHeaders : {} });
208
+ }
209
+ // propagate vercel protection query parameters; map query parameters for design library request
210
+ const query = {};
211
+ req.nextUrl.searchParams.forEach((value, key) => {
212
+ query[key] = value;
213
+ });
214
+ const propagatedQsParams = Object.assign(Object.assign({}, (0, utils_3.getQueryParamsForPropagation)(query)), (0, utils_3.mapEditingParams)(query));
215
+ const base = (0, utils_3.resolveServerUrl)(req);
216
+ const targetUrl = new URL('/', base);
217
+ for (const key in propagatedQsParams) {
218
+ if ({}.hasOwnProperty.call(propagatedQsParams, key)) {
219
+ propagatedQsParams[key] && targetUrl.searchParams.append(key, propagatedQsParams[key]);
220
+ }
221
+ }
222
+ targetUrl.searchParams.append('timestamp', Date.now().toString());
223
+ // enable draft mode in order to get prerender bypass cookie from request
224
+ const draft = yield (0, headers_1.draftMode)();
225
+ draft.enable();
226
+ // add prerender bypass cookie to forwarded request in order to enable draft mode
227
+ const cookieStore = yield getNextCookies();
228
+ const reqCookie = req.headers.get('cookie') || '';
229
+ const prerenderBypassCookie = `${"__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */}=${((_a = cookieStore.get("__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */)) === null || _a === void 0 ? void 0 : _a.value) || ''}`;
230
+ const forwardCookie = reqCookie
231
+ ? `${reqCookie}; ${prerenderBypassCookie}`
232
+ : prerenderBypassCookie;
233
+ const forwardHeaders = new Headers(req.headers);
234
+ forwardHeaders.set('cookie', forwardCookie);
235
+ const forwardedResponse = yield dataFetcher.fetch(targetUrl.toString(), {
236
+ method: req.method,
237
+ headers: forwardHeaders,
238
+ body: req.body,
239
+ duplex: 'half',
240
+ });
241
+ // Filter out x-middleware headers since rewrites are not allowed in route handlers
242
+ // Also filter out content-encoding and content-length to avoid issues when browser reads the payload
243
+ const filteredHeaders = new Headers();
244
+ const forwardedHeaders = new Headers(forwardedResponse.headers);
245
+ forwardedHeaders.forEach((value, key) => {
246
+ if (key !== 'x-middleware-next' &&
247
+ key !== 'x-middleware-rewrite' &&
248
+ key !== 'content-encoding' &&
249
+ key !== 'content-length') {
250
+ filteredHeaders.set(key, value);
251
+ }
252
+ });
253
+ // Restrict the page to be rendered only within the allowed origins
254
+ filteredHeaders.set('Content-Security-Policy', (0, utils_3.getCSPHeader)());
255
+ // add expected CORS headers to response
256
+ Object.entries(expectedCorsHeaders !== null && expectedCorsHeaders !== void 0 ? expectedCorsHeaders : {}).forEach(([key, value]) => {
257
+ filteredHeaders.set(key, value);
258
+ });
259
+ // remove nextjs preview cookies to not leak them to the browser
260
+ const filteredCookies = (0, utils_3.cleanupNextPreviewCookies)(filteredHeaders.get('Set-Cookie'));
261
+ filteredHeaders.set('Set-Cookie', (filteredCookies === null || filteredCookies === void 0 ? void 0 : filteredCookies.join('; ')) || '');
262
+ return new Response(forwardedResponse.data, {
263
+ status: forwardedResponse.status,
264
+ statusText: forwardedResponse.statusText,
265
+ headers: filteredHeaders,
266
+ });
267
+ });
268
+ return { GET, POST, OPTIONS };
269
+ };
270
+ exports.createEditingRenderRouteHandlers = createEditingRenderRouteHandlers;
@@ -1,11 +1,11 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createEditingRenderRouteHandlers = exports.createEditingConfigRouteHandler = exports.createRobotsRouteHandler = exports.createSitemapRouteHandler = void 0;
4
- var sitemap_route_handler_1 = require("./sitemap-route-handler");
5
- Object.defineProperty(exports, "createSitemapRouteHandler", { enumerable: true, get: function () { return sitemap_route_handler_1.createSitemapRouteHandler; } });
6
- var robots_route_handler_1 = require("./robots-route-handler");
7
- Object.defineProperty(exports, "createRobotsRouteHandler", { enumerable: true, get: function () { return robots_route_handler_1.createRobotsRouteHandler; } });
8
- var editing_config_route_handler_1 = require("./editing-config-route-handler");
9
- Object.defineProperty(exports, "createEditingConfigRouteHandler", { enumerable: true, get: function () { return editing_config_route_handler_1.createEditingConfigRouteHandler; } });
10
- var editing_render_route_handler_1 = require("./editing-render-route-handler");
11
- Object.defineProperty(exports, "createEditingRenderRouteHandlers", { enumerable: true, get: function () { return editing_render_route_handler_1.createEditingRenderRouteHandlers; } });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEditingRenderRouteHandlers = exports.createEditingConfigRouteHandler = exports.createRobotsRouteHandler = exports.createSitemapRouteHandler = void 0;
4
+ var sitemap_route_handler_1 = require("./sitemap-route-handler");
5
+ Object.defineProperty(exports, "createSitemapRouteHandler", { enumerable: true, get: function () { return sitemap_route_handler_1.createSitemapRouteHandler; } });
6
+ var robots_route_handler_1 = require("./robots-route-handler");
7
+ Object.defineProperty(exports, "createRobotsRouteHandler", { enumerable: true, get: function () { return robots_route_handler_1.createRobotsRouteHandler; } });
8
+ var editing_config_route_handler_1 = require("./editing-config-route-handler");
9
+ Object.defineProperty(exports, "createEditingConfigRouteHandler", { enumerable: true, get: function () { return editing_config_route_handler_1.createEditingConfigRouteHandler; } });
10
+ var editing_render_route_handler_1 = require("./editing-render-route-handler");
11
+ Object.defineProperty(exports, "createEditingRenderRouteHandlers", { enumerable: true, get: function () { return editing_render_route_handler_1.createEditingRenderRouteHandlers; } });
@@ -1,68 +1,69 @@
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.createRobotsRouteHandler = void 0;
13
- const site_1 = require("@sitecore-content-sdk/core/site");
14
- const core_1 = require("@sitecore-content-sdk/core");
15
- const cache_1 = require("next/cache");
16
- /**
17
- * Creates a route handler to serve the robots.txt file.
18
- * @param {RouteHandlerOptions} options - The options for the route handler.
19
- * @returns The route handler.
20
- */
21
- const createRobotsRouteHandler = (options) => {
22
- const { client, sites, revalidate = 60 } = options;
23
- const siteResolver = new site_1.SiteResolver(sites);
24
- const getRobots = (0, cache_1.unstable_cache)((site) => __awaiter(void 0, void 0, void 0, function* () {
25
- return client.getRobots(site);
26
- }), ['robots'], {
27
- revalidate,
28
- tags: ['robots'],
29
- });
30
- const GET = (req) => __awaiter(void 0, void 0, void 0, function* () {
31
- var _a;
32
- try {
33
- const startTimestamp = Date.now();
34
- const hostName = ((_a = req.headers.get('host')) === null || _a === void 0 ? void 0 : _a.split(':')[0]) || 'localhost';
35
- const site = siteResolver.getByHost(hostName);
36
- core_1.debug.robots('robots route handler start: %o', {
37
- hostName,
38
- siteName: site.name,
39
- });
40
- const robotsContent = yield getRobots(site.name);
41
- if (!robotsContent) {
42
- core_1.debug.robots('robots route handler end in %dms', Date.now() - startTimestamp);
43
- return new Response('User-agent: *\nDisallow: /', {
44
- status: 404,
45
- headers: {
46
- 'Content-Type': 'text/plain',
47
- },
48
- });
49
- }
50
- core_1.debug.robots('robots route handler end in %dms', Date.now() - startTimestamp);
51
- return new Response(robotsContent, {
52
- status: 200,
53
- headers: {
54
- 'Content-Type': 'text/plain',
55
- },
56
- });
57
- }
58
- catch (error) {
59
- console.log('Robots route handler failed:');
60
- console.log(error);
61
- return new Response('Internal Server Error', {
62
- status: 500,
63
- });
64
- }
65
- });
66
- return { GET };
67
- };
68
- exports.createRobotsRouteHandler = createRobotsRouteHandler;
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.createRobotsRouteHandler = void 0;
13
+ const site_1 = require("@sitecore-content-sdk/core/site");
14
+ const core_1 = require("@sitecore-content-sdk/core");
15
+ const cache_1 = require("next/cache");
16
+ /**
17
+ * Creates a route handler to serve the robots.txt file.
18
+ * @param {RouteHandlerOptions} options - The options for the route handler.
19
+ * @returns The route handler object with GET method.
20
+ * @public
21
+ */
22
+ const createRobotsRouteHandler = (options) => {
23
+ const { client, sites, revalidate = 60 } = options;
24
+ const siteResolver = new site_1.SiteResolver(sites);
25
+ const getRobots = (0, cache_1.unstable_cache)((site) => __awaiter(void 0, void 0, void 0, function* () {
26
+ return client.getRobots(site);
27
+ }), ['robots'], {
28
+ revalidate,
29
+ tags: ['robots'],
30
+ });
31
+ const GET = (req) => __awaiter(void 0, void 0, void 0, function* () {
32
+ var _a;
33
+ try {
34
+ const startTimestamp = Date.now();
35
+ const hostName = ((_a = req.headers.get('host')) === null || _a === void 0 ? void 0 : _a.split(':')[0]) || 'localhost';
36
+ const site = siteResolver.getByHost(hostName);
37
+ core_1.debug.robots('robots route handler start: %o', {
38
+ hostName,
39
+ siteName: site.name,
40
+ });
41
+ const robotsContent = yield getRobots(site.name);
42
+ if (!robotsContent) {
43
+ core_1.debug.robots('robots route handler end in %dms', Date.now() - startTimestamp);
44
+ return new Response('User-agent: *\nDisallow: /', {
45
+ status: 404,
46
+ headers: {
47
+ 'Content-Type': 'text/plain',
48
+ },
49
+ });
50
+ }
51
+ core_1.debug.robots('robots route handler end in %dms', Date.now() - startTimestamp);
52
+ return new Response(robotsContent, {
53
+ status: 200,
54
+ headers: {
55
+ 'Content-Type': 'text/plain',
56
+ },
57
+ });
58
+ }
59
+ catch (error) {
60
+ console.log('Robots route handler failed:');
61
+ console.log(error);
62
+ return new Response('Internal Server Error', {
63
+ status: 500,
64
+ });
65
+ }
66
+ });
67
+ return { GET };
68
+ };
69
+ exports.createRobotsRouteHandler = createRobotsRouteHandler;