@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,243 +1,246 @@
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 { EDITING_ALLOWED_ORIGINS, isDesignLibraryMode, PREVIEW_KEY, QUERY_PARAM_EDITING_SECRET, } from '@sitecore-content-sdk/core/editing';
11
- import { DEFAULT_VARIANT } from '@sitecore-content-sdk/core/personalize';
12
- import { SITE_KEY } from '@sitecore-content-sdk/core/site';
13
- import { EDITING_PASS_THROUGH_HEADERS, QUERY_PARAM_VERCEL_PROTECTION_BYPASS, QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE, } from './constants';
14
- import { SERVER_PROPS_ID, STATIC_PROPS_ID } from 'next/constants';
15
- import { getAllowedOriginsFromEnv } from '@sitecore-content-sdk/core/utils';
16
- /**
17
- * Gets editing secret value from request
18
- * @param {NextApiRequest | NextRequest} req incoming request
19
- * @returns {string | undefined} editing secret value if present
20
- */
21
- export const getEditingSecretFromRequest = (req) => {
22
- const reqQuery = req.query;
23
- const reqUrl = req.url;
24
- let secret = undefined;
25
- if (reqQuery) {
26
- // pages router
27
- secret = reqQuery[QUERY_PARAM_EDITING_SECRET];
28
- }
29
- else if (reqUrl) {
30
- // app router
31
- const url = new URL(reqUrl);
32
- secret = url.searchParams.get(QUERY_PARAM_EDITING_SECRET);
33
- }
34
- return secret;
35
- };
36
- /**
37
- * Parses query string and its parameters to required editing parameters
38
- * @param {{ [key: string]: string | undefined }} query query string values
39
- * @returns {EditingRenderQueryParams} editing parameters
40
- */
41
- export const mapEditingParams = (query) => {
42
- const params = isDesignLibraryMode(query.mode)
43
- ? {
44
- itemId: query.sc_itemid,
45
- componentUid: query.sc_uid,
46
- renderingId: query.sc_renderingId,
47
- language: query.sc_lang,
48
- site: query.sc_site,
49
- mode: query.mode,
50
- dataSourceId: query.dataSourceId,
51
- version: query.sc_version,
52
- generation: query.generation,
53
- }
54
- : {
55
- site: query.sc_site,
56
- itemId: query.sc_itemid,
57
- language: query.sc_lang,
58
- // for sc_variantId we may employ multiple variants (page-layout + component level)
59
- // they will be separated by commas (,)
60
- variantIds: query.sc_variant || DEFAULT_VARIANT,
61
- version: query.sc_version,
62
- mode: query.mode,
63
- layoutKind: query.sc_layoutKind,
64
- };
65
- return params;
66
- };
67
- /**
68
- * Filters out Next.js preview cookies from a cookie string or array
69
- * @param {string | string[] | null} cookies cookie header value
70
- * @returns {string[] | null} filtered cookies
71
- */
72
- export const cleanupNextPreviewCookies = (cookies) => {
73
- if (!cookies) {
74
- return null;
75
- }
76
- if (!Array.isArray(cookies)) {
77
- cookies = cookies.split(',');
78
- }
79
- // Filter out Next.js preview cookies
80
- const filteredCookies = cookies.filter((cookie) => !new RegExp(`^${"__next_preview_data" /* PreviewCookies.PREVIEW_DATA */}=`).test(cookie) &&
81
- !new RegExp(`^${"__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */}=`).test(cookie));
82
- return filteredCookies;
83
- };
84
- /**
85
- * Gets the Next.js preview cookies to enable preview mode
86
- * @param {string} site current site name
87
- * @returns {string[]} list of cookies to set
88
- */
89
- export const getPreviewCookies = (site) => {
90
- const previewSite = `${SITE_KEY}=${site}; Path=/; HttpOnly; SameSite=None; Secure`;
91
- const previewCookie = `${PREVIEW_KEY}=true; Path=/; HttpOnly; SameSite=None; Secure`;
92
- return [previewSite, previewCookie];
93
- };
94
- /**
95
- * Returns the list of required query parameters based on the page editing mode
96
- * @param {DesignLibraryMode | LayoutServicePageState.Preview | LayoutServicePageState.Edit} mode current page mode
97
- * @returns {string[]} list of required parameters for validation
98
- */
99
- export const getRequiredEditingParamsList = (mode) => {
100
- const editingRequiredParams = ['sc_site', 'sc_itemid', 'sc_lang', 'route', 'mode'];
101
- const componentRequiredParams = [
102
- 'sc_site',
103
- 'sc_itemid',
104
- 'sc_renderingId',
105
- 'sc_uid',
106
- 'sc_lang',
107
- 'mode',
108
- ];
109
- return isDesignLibraryMode(mode) ? componentRequiredParams : editingRequiredParams;
110
- };
111
- /**
112
- * Gets query parameters that should be passed along to subsequent requests (e.g. for deployment protection bypass)
113
- * @param {object} query Object of query parameters from incoming URL
114
- * @returns Object of approved query parameters
115
- */
116
- export const getQueryParamsForPropagation = (query) => {
117
- const params = {};
118
- if (query[QUERY_PARAM_VERCEL_PROTECTION_BYPASS]) {
119
- params[QUERY_PARAM_VERCEL_PROTECTION_BYPASS] = query[QUERY_PARAM_VERCEL_PROTECTION_BYPASS];
120
- }
121
- if (query[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE]) {
122
- params[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE] = query[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE];
123
- }
124
- return params;
125
- };
126
- /**
127
- * Get headers that should be passed along to subsequent requests
128
- * @param {IncomingHttpHeaders} headers Incoming HTTP Headers
129
- * @returns Object of approved headers
130
- */
131
- export const getHeadersForPropagation = (headers) => {
132
- // Filter and normalize headers
133
- const filteredHeaders = EDITING_PASS_THROUGH_HEADERS.reduce((acc, header) => {
134
- const value = headers.get
135
- ? headers.get(header)
136
- : headers[header];
137
- if (value) {
138
- acc[header] = Array.isArray(value) ? value.join(', ') : value;
139
- }
140
- return acc;
141
- }, {});
142
- return filteredHeaders;
143
- };
144
- /**
145
- * Performs an internal request to get the HTML for the editing mode
146
- * @param {string} requestUrl URL to send request to
147
- * @param {object} propagatedQsParams query string params to use with request
148
- * @param {object} propagatedHeaders headers to use with request
149
- * @param {string[]} cookies cookies to use with request
150
- * @param {NativeDataFetcher} dataFetcher NativeFetcher instance to send request with
151
- * @returns {string} HTML with editing markup
152
- */
153
- export const getEditingRequestHtml = (requestUrl, propagatedQsParams, propagatedHeaders, cookies, dataFetcher) => __awaiter(void 0, void 0, void 0, function* () {
154
- // Grab the Next.js preview cookies to send on to the render request
155
- propagatedHeaders.cookie = `${propagatedHeaders.cookie ? propagatedHeaders.cookie + ';' : ''}${cookies.join(';')}`;
156
- // enable content sdk preview
157
- propagatedHeaders.__content_sdk_preview = '1';
158
- for (const key in propagatedQsParams) {
159
- if ({}.hasOwnProperty.call(propagatedQsParams, key)) {
160
- propagatedQsParams[key] && requestUrl.searchParams.append(key, propagatedQsParams[key]);
161
- }
162
- }
163
- requestUrl.searchParams.append('timestamp', Date.now().toString());
164
- const pageRes = yield dataFetcher
165
- .get(requestUrl.toString(), {
166
- credentials: 'include',
167
- headers: propagatedHeaders,
168
- })
169
- .catch((err) => {
170
- // We need to handle not found error provided by Vercel
171
- // for `fallback: false` pages
172
- if (err.response.status === 404) {
173
- return err.response;
174
- }
175
- throw err;
176
- });
177
- let html = pageRes.data;
178
- if (!html || html.length === 0) {
179
- throw new Error(`Failed to render html for ${requestUrl.toString()}`);
180
- }
181
- // replace phkey attribute with key attribute so that newly added renderings
182
- // show correct placeholders, so save and refresh won't be needed after adding each rendering
183
- html = html.replace(new RegExp('phkey', 'g'), 'key');
184
- // When SSG, Next will attempt to perform a router.replace on the client-side to inject the query string parms
185
- // to the router state. See https://github.com/vercel/next.js/blob/v10.0.3/packages/next/client/index.tsx#L169.
186
- // However, this doesn't really work since at this point we're in the editor and the location.search has nothing
187
- // to do with the Next route/page we've rendered. Beyond the extraneous request, this can result in a 404 with
188
- // certain route configurations (e.g. multiple catch-all routes).
189
- // The following line will trick it into thinking we're SSR, thus avoiding any router.replace.
190
- html = html.replace(STATIC_PROPS_ID, SERVER_PROPS_ID);
191
- return html;
192
- });
193
- /**
194
- * Type guard for Design Library mode
195
- * @param {object} data preview data to check
196
- * @returns true if the data is EditingPreviewData
197
- * @see EditingPreviewData
198
- */
199
- export const isDesignLibraryPreviewData = (data) => {
200
- return (typeof data === 'object' &&
201
- data !== null &&
202
- 'mode' in data &&
203
- isDesignLibraryMode(data.mode));
204
- };
205
- /**
206
- * Server URL Resolution order (highest to lowest priority):
207
- * 1. `config.sitecoreInternalEditingHostUrl` (explicitly set in config)
208
- * 2. Environment variable `SITECORE_INTERNAL_EDITING_HOST_URL`
209
- * 3. Fallbacks:
210
- * - For XM Cloud deployments `'http://localhost:3000'`
211
- * - For all other cases → use the request `Host` header
212
- * Note we use https protocol on Vercel due to serverless function architecture.
213
- * In all other scenarios, including localhost (with or without a proxy e.g. ngrok)
214
- * and within a nodejs container, http protocol should be used.
215
- *
216
- * For information about the VERCEL environment variable, see
217
- * https://vercel.com/docs/environment-variables#system-environment-variables
218
- * @param {NextApiRequest} req
219
- */
220
- export const resolveServerUrl = (req) => {
221
- const internalHostUrl = process.env.SITECORE_INTERNAL_EDITING_HOST_URL;
222
- if (internalHostUrl) {
223
- return internalHostUrl;
224
- }
225
- // in xmc deployment we always use localhost:3000
226
- if (process.env.SITECORE) {
227
- return 'http://localhost:3000';
228
- }
229
- // to preserve auth headers, use https if we're in our 3 main hosting options
230
- const useHttps = (process.env.VERCEL || process.env.NETLIFY) !== undefined;
231
- const host = req.headers.get
232
- ? req.headers.get('host')
233
- : req.headers.host;
234
- // use https for requests with auth but also support unsecured http rendering hosts
235
- return `${useHttps ? 'https' : 'http'}://${host}`;
236
- };
237
- /**
238
- * Gets the Content-Security-Policy header value
239
- * @returns Content-Security-Policy header value
240
- */
241
- export const getCSPHeader = () => {
242
- return `frame-ancestors 'self' ${[...getAllowedOriginsFromEnv(), ...EDITING_ALLOWED_ORIGINS].join(' ')}`;
243
- };
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 { EDITING_ALLOWED_ORIGINS, isDesignLibraryMode, PREVIEW_KEY, QUERY_PARAM_EDITING_SECRET, } from '@sitecore-content-sdk/core/editing';
11
+ import { DEFAULT_VARIANT } from '@sitecore-content-sdk/core/personalize';
12
+ import { SITE_KEY } from '@sitecore-content-sdk/core/site';
13
+ import { EDITING_PASS_THROUGH_HEADERS, QUERY_PARAM_VERCEL_PROTECTION_BYPASS, QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE, } from './constants';
14
+ import { SERVER_PROPS_ID, STATIC_PROPS_ID } from 'next/constants';
15
+ import { getAllowedOriginsFromEnv } from '@sitecore-content-sdk/core/utils';
16
+ /**
17
+ * Gets editing secret value from request
18
+ * @param {NextApiRequest | NextRequest} req incoming request
19
+ * @returns {string | undefined} editing secret value if present
20
+ */
21
+ export const getEditingSecretFromRequest = (req) => {
22
+ const reqQuery = req.query;
23
+ const reqUrl = req.url;
24
+ let secret = undefined;
25
+ if (reqQuery) {
26
+ // pages router
27
+ secret = reqQuery[QUERY_PARAM_EDITING_SECRET];
28
+ }
29
+ else if (reqUrl) {
30
+ // app router
31
+ const url = new URL(reqUrl);
32
+ secret = url.searchParams.get(QUERY_PARAM_EDITING_SECRET);
33
+ }
34
+ return secret;
35
+ };
36
+ /**
37
+ * Parses query string and its parameters to required editing parameters
38
+ * @param {{ [key: string]: string | undefined }} query query string values
39
+ * @returns {EditingRenderQueryParams} editing parameters
40
+ */
41
+ export const mapEditingParams = (query) => {
42
+ const params = isDesignLibraryMode(query.mode)
43
+ ? {
44
+ itemId: query.sc_itemid,
45
+ componentUid: query.sc_uid,
46
+ renderingId: query.sc_renderingId,
47
+ language: query.sc_lang,
48
+ site: query.sc_site,
49
+ mode: query.mode,
50
+ dataSourceId: query.dataSourceId,
51
+ version: query.sc_version,
52
+ generation: query.generation,
53
+ }
54
+ : {
55
+ site: query.sc_site,
56
+ itemId: query.sc_itemid,
57
+ language: query.sc_lang,
58
+ // for sc_variantId we may employ multiple variants (page-layout + component level)
59
+ // they will be separated by commas (,)
60
+ variantIds: query.sc_variant || DEFAULT_VARIANT,
61
+ version: query.sc_version,
62
+ mode: query.mode,
63
+ layoutKind: query.sc_layoutKind,
64
+ };
65
+ return params;
66
+ };
67
+ /**
68
+ * Filters out Next.js preview cookies from a cookie string or array
69
+ * @param {string | string[] | null} cookies cookie header value
70
+ * @returns {string[] | null} filtered cookies
71
+ */
72
+ export const cleanupNextPreviewCookies = (cookies) => {
73
+ if (!cookies) {
74
+ return null;
75
+ }
76
+ if (!Array.isArray(cookies)) {
77
+ cookies = cookies.split(',');
78
+ }
79
+ // Filter out Next.js preview cookies
80
+ const filteredCookies = cookies.filter((cookie) => !new RegExp(`^${"__next_preview_data" /* PreviewCookies.PREVIEW_DATA */}=`).test(cookie) &&
81
+ !new RegExp(`^${"__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */}=`).test(cookie));
82
+ return filteredCookies;
83
+ };
84
+ /**
85
+ * Gets the Next.js preview cookies to enable preview mode
86
+ * @param {string} site current site name
87
+ * @returns {string[]} list of cookies to set
88
+ */
89
+ export const getPreviewCookies = (site) => {
90
+ const previewSite = `${SITE_KEY}=${site}; Path=/; HttpOnly; SameSite=None; Secure`;
91
+ const previewCookie = `${PREVIEW_KEY}=true; Path=/; HttpOnly; SameSite=None; Secure`;
92
+ return [previewSite, previewCookie];
93
+ };
94
+ /**
95
+ * Returns the list of required query parameters based on the page editing mode
96
+ * @param {DesignLibraryMode | LayoutServicePageState.Preview | LayoutServicePageState.Edit} mode current page mode
97
+ * @returns {string[]} list of required parameters for validation
98
+ */
99
+ export const getRequiredEditingParamsList = (mode) => {
100
+ const editingRequiredParams = ['sc_site', 'sc_itemid', 'sc_lang', 'route', 'mode'];
101
+ const componentRequiredParams = [
102
+ 'sc_site',
103
+ 'sc_itemid',
104
+ 'sc_renderingId',
105
+ 'sc_uid',
106
+ 'sc_lang',
107
+ 'mode',
108
+ ];
109
+ return isDesignLibraryMode(mode) ? componentRequiredParams : editingRequiredParams;
110
+ };
111
+ /**
112
+ * Gets query parameters that should be passed along to subsequent requests (e.g. for deployment protection bypass)
113
+ * @param {object} query Object of query parameters from incoming URL
114
+ * @returns Object of approved query parameters
115
+ * @internal
116
+ */
117
+ export const getQueryParamsForPropagation = (query) => {
118
+ const params = {};
119
+ if (query[QUERY_PARAM_VERCEL_PROTECTION_BYPASS]) {
120
+ params[QUERY_PARAM_VERCEL_PROTECTION_BYPASS] = query[QUERY_PARAM_VERCEL_PROTECTION_BYPASS];
121
+ }
122
+ if (query[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE]) {
123
+ params[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE] = query[QUERY_PARAM_VERCEL_SET_BYPASS_COOKIE];
124
+ }
125
+ return params;
126
+ };
127
+ /**
128
+ * Get headers that should be passed along to subsequent requests
129
+ * @param {IncomingHttpHeaders} headers Incoming HTTP Headers
130
+ * @returns Object of approved headers
131
+ * @internal
132
+ */
133
+ export const getHeadersForPropagation = (headers) => {
134
+ // Filter and normalize headers
135
+ const filteredHeaders = EDITING_PASS_THROUGH_HEADERS.reduce((acc, header) => {
136
+ const value = headers.get
137
+ ? headers.get(header)
138
+ : headers[header];
139
+ if (value) {
140
+ acc[header] = Array.isArray(value) ? value.join(', ') : value;
141
+ }
142
+ return acc;
143
+ }, {});
144
+ return filteredHeaders;
145
+ };
146
+ /**
147
+ * Performs an internal request to get the HTML for the editing mode
148
+ * @param {string} requestUrl URL to send request to
149
+ * @param {object} propagatedQsParams query string params to use with request
150
+ * @param {object} propagatedHeaders headers to use with request
151
+ * @param {string[]} cookies cookies to use with request
152
+ * @param {NativeDataFetcher} dataFetcher NativeFetcher instance to send request with
153
+ * @returns {string} HTML with editing markup
154
+ */
155
+ export const getEditingRequestHtml = (requestUrl, propagatedQsParams, propagatedHeaders, cookies, dataFetcher) => __awaiter(void 0, void 0, void 0, function* () {
156
+ // Grab the Next.js preview cookies to send on to the render request
157
+ propagatedHeaders.cookie = `${propagatedHeaders.cookie ? propagatedHeaders.cookie + ';' : ''}${cookies.join(';')}`;
158
+ // enable content sdk preview
159
+ propagatedHeaders.__content_sdk_preview = '1';
160
+ for (const key in propagatedQsParams) {
161
+ if ({}.hasOwnProperty.call(propagatedQsParams, key)) {
162
+ propagatedQsParams[key] && requestUrl.searchParams.append(key, propagatedQsParams[key]);
163
+ }
164
+ }
165
+ requestUrl.searchParams.append('timestamp', Date.now().toString());
166
+ const pageRes = yield dataFetcher
167
+ .get(requestUrl.toString(), {
168
+ credentials: 'include',
169
+ headers: propagatedHeaders,
170
+ })
171
+ .catch((err) => {
172
+ // We need to handle not found error provided by Vercel
173
+ // for `fallback: false` pages
174
+ if (err.response.status === 404) {
175
+ return err.response;
176
+ }
177
+ throw err;
178
+ });
179
+ let html = pageRes.data;
180
+ if (!html || html.length === 0) {
181
+ throw new Error(`Failed to render html for ${requestUrl.toString()}`);
182
+ }
183
+ // replace phkey attribute with key attribute so that newly added renderings
184
+ // show correct placeholders, so save and refresh won't be needed after adding each rendering
185
+ html = html.replace(new RegExp('phkey', 'g'), 'key');
186
+ // When SSG, Next will attempt to perform a router.replace on the client-side to inject the query string parms
187
+ // to the router state. See https://github.com/vercel/next.js/blob/v10.0.3/packages/next/client/index.tsx#L169.
188
+ // However, this doesn't really work since at this point we're in the editor and the location.search has nothing
189
+ // to do with the Next route/page we've rendered. Beyond the extraneous request, this can result in a 404 with
190
+ // certain route configurations (e.g. multiple catch-all routes).
191
+ // The following line will trick it into thinking we're SSR, thus avoiding any router.replace.
192
+ html = html.replace(STATIC_PROPS_ID, SERVER_PROPS_ID);
193
+ return html;
194
+ });
195
+ /**
196
+ * Type guard for Design Library mode
197
+ * @param {object} data preview data to check
198
+ * @returns true if the data is EditingPreviewData
199
+ * @see EditingPreviewData
200
+ * @public
201
+ */
202
+ export const isDesignLibraryPreviewData = (data) => {
203
+ return (typeof data === 'object' &&
204
+ data !== null &&
205
+ 'mode' in data &&
206
+ isDesignLibraryMode(data.mode));
207
+ };
208
+ /**
209
+ * Server URL Resolution order (highest to lowest priority):
210
+ * 1. `config.sitecoreInternalEditingHostUrl` (explicitly set in config)
211
+ * 2. Environment variable `SITECORE_INTERNAL_EDITING_HOST_URL`
212
+ * 3. Fallbacks:
213
+ * - For XM Cloud deployments `'http://localhost:3000'`
214
+ * - For all other cases use the request `Host` header
215
+ * Note we use https protocol on Vercel due to serverless function architecture.
216
+ * In all other scenarios, including localhost (with or without a proxy e.g. ngrok)
217
+ * and within a nodejs container, http protocol should be used.
218
+ *
219
+ * For information about the VERCEL environment variable, see
220
+ * https://vercel.com/docs/environment-variables#system-environment-variables
221
+ * @param {NextApiRequest} req
222
+ */
223
+ export const resolveServerUrl = (req) => {
224
+ const internalHostUrl = process.env.SITECORE_INTERNAL_EDITING_HOST_URL;
225
+ if (internalHostUrl) {
226
+ return internalHostUrl;
227
+ }
228
+ // in xmc deployment we always use localhost:3000
229
+ if (process.env.SITECORE) {
230
+ return 'http://localhost:3000';
231
+ }
232
+ // to preserve auth headers, use https if we're in our 3 main hosting options
233
+ const useHttps = (process.env.VERCEL || process.env.NETLIFY) !== undefined;
234
+ const host = req.headers.get
235
+ ? req.headers.get('host')
236
+ : req.headers.host;
237
+ // use https for requests with auth but also support unsecured http rendering hosts
238
+ return `${useHttps ? 'https' : 'http'}://${host}`;
239
+ };
240
+ /**
241
+ * Gets the Content-Security-Policy header value
242
+ * @returns Content-Security-Policy header value
243
+ */
244
+ export const getCSPHeader = () => {
245
+ return `frame-ancestors 'self' ${[...getAllowedOriginsFromEnv(), ...EDITING_ALLOWED_ORIGINS].join(' ')}`;
246
+ };
package/dist/esm/index.js CHANGED
@@ -1,25 +1,25 @@
1
- export { constants,
2
- // generic data access
3
- NativeDataFetcher, enableDebug, debug, MemoryCacheClient, } from '@sitecore-content-sdk/core';
4
- export { LayoutServicePageState, LayoutService, getChildPlaceholder, getFieldValue, getContentStylesheetLink, EditMode, RenderingType, } from '@sitecore-content-sdk/core/layout';
5
- export { ErrorPage } from '@sitecore-content-sdk/core/client';
6
- export { ComponentLayoutService } from '@sitecore-content-sdk/core/editing';
7
- export { mediaApi } from '@sitecore-content-sdk/core/media';
8
- export { DictionaryService, } from '@sitecore-content-sdk/core/i18n';
9
- export { personalizeLayout, getPersonalizedRewrite, getPersonalizedRewriteData, getGroomedVariantIds, normalizePersonalizedRewrite, CdpHelper, PersonalizeService, } from '@sitecore-content-sdk/core/personalize';
10
- export { SitePathService, RedirectsService, REDIRECT_TYPE_301, REDIRECT_TYPE_302, REDIRECT_TYPE_SERVER_TRANSFER, } from '@sitecore-content-sdk/core/site';
11
- export { SitemapXmlService, ErrorPagesService, RobotsService, SiteResolver, SiteInfoService, getSiteRewrite, getSiteRewriteData, normalizeSiteRewrite, } from '@sitecore-content-sdk/core/site';
12
- export { ComponentPropsService } from './services/component-props-service';
13
- export { ComponentPropsReactContext, ComponentPropsContext, useComponentProps, } from './components/ComponentPropsContext';
14
- export { Link } from './components/Link';
15
- export { RichText } from './components/RichText';
16
- export { Placeholder } from './components/Placeholder';
17
- export { NextImage } from './components/NextImage';
18
- import * as FEaaSWrapper from './components/FEaaSWrapper';
19
- import * as BYOCWrapper from './components/BYOCWrapper';
20
- export { FEaaSClientWrapper, FEaaSServerWrapper, BYOCClientWrapper, BYOCServerWrapper, } from '@sitecore-content-sdk/react';
21
- // Preserving original FEaaSWrapper export name for backward compatibility
22
- // TODO: remove in future major release
23
- export { FEaaSWrapper };
24
- export { BYOCWrapper };
25
- export { Image, Text, DateField, FEaaSComponent, fetchFEaaSComponentServerProps, BYOCComponent, getDesignLibraryStylesheetLinks, File, DesignLibrary, DefaultEmptyFieldEditingComponentImage, DefaultEmptyFieldEditingComponentText, SitecoreProvider, SitecoreProviderReactContext, withSitecore, useSitecore, withEditorChromes, withPlaceholder, withDatasourceCheck, withFieldMetadata, withEmptyFieldEditingComponent, EditingScripts, Form, ClientEditingChromesUpdate, AppPlaceholder, } from '@sitecore-content-sdk/react';
1
+ export { constants,
2
+ // generic data access
3
+ NativeDataFetcher, enableDebug, debug, MemoryCacheClient, } from '@sitecore-content-sdk/core';
4
+ export { LayoutServicePageState, LayoutService, getChildPlaceholder, getFieldValue, getContentStylesheetLink, EditMode, RenderingType, } from '@sitecore-content-sdk/core/layout';
5
+ export { ErrorPage } from '@sitecore-content-sdk/core/client';
6
+ export { ComponentLayoutService } from '@sitecore-content-sdk/core/editing';
7
+ export { mediaApi } from '@sitecore-content-sdk/core/media';
8
+ export { DictionaryService, } from '@sitecore-content-sdk/core/i18n';
9
+ export { personalizeLayout, getPersonalizedRewrite, getPersonalizedRewriteData, getGroomedVariantIds, normalizePersonalizedRewrite, CdpHelper, PersonalizeService, } from '@sitecore-content-sdk/core/personalize';
10
+ export { SitePathService, RedirectsService, REDIRECT_TYPE_301, REDIRECT_TYPE_302, REDIRECT_TYPE_SERVER_TRANSFER, } from '@sitecore-content-sdk/core/site';
11
+ export { SitemapXmlService, ErrorPagesService, RobotsService, SiteResolver, SiteInfoService, getSiteRewrite, getSiteRewriteData, normalizeSiteRewrite, } from '@sitecore-content-sdk/core/site';
12
+ export { ComponentPropsService } from './services/component-props-service';
13
+ export { ComponentPropsReactContext, ComponentPropsContext, useComponentProps, } from './components/ComponentPropsContext';
14
+ export { Link } from './components/Link';
15
+ export { RichText } from './components/RichText';
16
+ export { Placeholder } from './components/Placeholder';
17
+ export { NextImage } from './components/NextImage';
18
+ import * as FEaaSWrapper from './components/FEaaSWrapper';
19
+ import * as BYOCWrapper from './components/BYOCWrapper';
20
+ export { FEaaSClientWrapper, FEaaSServerWrapper, BYOCClientWrapper, BYOCServerWrapper, } from '@sitecore-content-sdk/react';
21
+ // Preserving original FEaaSWrapper export name for backward compatibility
22
+ // TODO: remove in future major release
23
+ export { FEaaSWrapper };
24
+ export { BYOCWrapper };
25
+ export { Image, Text, DateField, FEaaSComponent, fetchFEaaSComponentServerProps, BYOCComponent, getDesignLibraryStylesheetLinks, File, DesignLibrary, DesignLibraryApp, DefaultEmptyFieldEditingComponentImage, DefaultEmptyFieldEditingComponentText, SitecoreProvider, SitecoreProviderReactContext, withSitecore, useSitecore, withEditorChromes, withPlaceholder, withDatasourceCheck, withFieldMetadata, withEmptyFieldEditingComponent, EditingScripts, Form, ClientEditingChromesUpdate, AppPlaceholder, } from '@sitecore-content-sdk/react';
@@ -1,16 +1,37 @@
1
- import { MultisiteMiddleware } from './multisite-middleware';
2
- /**
3
- * Middleware/handler for enabling multisite support in the Next.js App Router.
4
- */
5
- export class AppRouterMultisiteMiddleware extends MultisiteMiddleware {
6
- /**
7
- * Generates a site-specific rewrite path for app router based on the provided pathname and site name.
8
- * @param {string} pathname - The pathname to be rewritten.
9
- * @param {string} siteName - The name of the site.
10
- * @returns The rewritten path as a string.
11
- */
12
- getSiteRewrite(pathname, siteName) {
13
- const path = pathname.startsWith('/') ? pathname : '/' + pathname;
14
- return `/${siteName}${path}`;
15
- }
16
- }
1
+ import { MultisiteMiddleware } from './multisite-middleware';
2
+ /**
3
+ * Middleware/handler for enabling multisite support in the Next.js App Router.
4
+ * @public
5
+ */
6
+ export class AppRouterMultisiteMiddleware extends MultisiteMiddleware {
7
+ /**
8
+ * Warns when multisite is disabled in App Router.
9
+ * The middleware will still run to prevent routing errors.
10
+ * @param {NextResponse} _res response (unused, kept for method signature compatibility)
11
+ */
12
+ // eslint-disable-next-line no-unused-vars
13
+ shouldWarnWhenDisabled(_res) {
14
+ console.warn('⚠️ Warning: Multisite is disabled in App Router configuration, but the middleware will continue running. ' +
15
+ 'Disabling multisite in App Router would cause 404 errors for regular page requests because the route structure requires the [site] segment. ' +
16
+ 'Preview/Editing modes will still work. ' +
17
+ 'For single-site setups, keep multisite enabled and configure only one site.');
18
+ }
19
+ /**
20
+ * In App Router, we cannot skip the middleware even if enabled is false,
21
+ * because the route structure requires the [site] segment.
22
+ * @returns {boolean} always returns false (never skip) for App Router
23
+ */
24
+ shouldSkipWhenDisabled() {
25
+ return false; // Never skip in App Router - route structure requires [site] segment
26
+ }
27
+ /**
28
+ * Generates a site-specific rewrite path for app router based on the provided pathname and site name.
29
+ * @param {string} pathname - The pathname to be rewritten.
30
+ * @param {string} siteName - The name of the site.
31
+ * @returns The rewritten path as a string.
32
+ */
33
+ getSiteRewrite(pathname, siteName) {
34
+ const path = pathname.startsWith('/') ? pathname : '/' + pathname;
35
+ return `/${siteName}${path}`;
36
+ }
37
+ }
@@ -1,11 +1,11 @@
1
- export { debug } from '@sitecore-content-sdk/core';
2
- export { MiddlewareBase, Middleware, defineMiddleware } from './middleware';
3
- export { RedirectsMiddleware } from './redirects-middleware';
4
- export { PersonalizeMiddleware } from './personalize-middleware';
5
- export { MultisiteMiddleware } from './multisite-middleware';
6
- export { AppRouterMultisiteMiddleware } from './app-router-multisite-middleware';
7
- export { SitemapMiddleware } from './sitemap-middleware';
8
- export { RobotsMiddleware } from './robots-middleware';
9
- export { LocaleMiddleware } from './locale-middleware';
10
- export { PersonalizeService, } from '@sitecore-content-sdk/core/personalize';
11
- export { RedirectsService, REDIRECT_TYPE_301, REDIRECT_TYPE_302, REDIRECT_TYPE_SERVER_TRANSFER, } from '@sitecore-content-sdk/core/site';
1
+ export { debug } from '@sitecore-content-sdk/core';
2
+ export { MiddlewareBase, Middleware, defineMiddleware } from './middleware';
3
+ export { RedirectsMiddleware } from './redirects-middleware';
4
+ export { PersonalizeMiddleware } from './personalize-middleware';
5
+ export { MultisiteMiddleware } from './multisite-middleware';
6
+ export { AppRouterMultisiteMiddleware } from './app-router-multisite-middleware';
7
+ export { SitemapMiddleware } from './sitemap-middleware';
8
+ export { RobotsMiddleware } from './robots-middleware';
9
+ export { LocaleMiddleware } from './locale-middleware';
10
+ export { PersonalizeService, } from '@sitecore-content-sdk/core/personalize';
11
+ export { RedirectsService, REDIRECT_TYPE_301, REDIRECT_TYPE_302, REDIRECT_TYPE_SERVER_TRANSFER, } from '@sitecore-content-sdk/core/site';