@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.
- package/README.md +11 -11
- package/dist/cjs/client/index.js +10 -10
- package/dist/cjs/client/models.js +2 -2
- package/dist/cjs/client/sitecore-nextjs-client.js +160 -156
- package/dist/cjs/components/BYOCWrapper.js +31 -30
- package/dist/cjs/components/ComponentPropsContext.js +66 -59
- package/dist/cjs/components/FEaaSWrapper.js +33 -32
- package/dist/cjs/components/Link.js +117 -90
- package/dist/cjs/components/NextImage.js +66 -62
- package/dist/cjs/components/Placeholder.js +55 -50
- package/dist/cjs/components/RichText.js +133 -128
- package/dist/cjs/config/define-config.js +26 -25
- package/dist/cjs/config/index.js +5 -5
- package/dist/cjs/config-cli/define-cli-config.js +40 -39
- package/dist/cjs/config-cli/index.js +5 -5
- package/dist/cjs/editing/codegen/import-map.js +129 -118
- package/dist/cjs/editing/codegen/index.js +6 -6
- package/dist/cjs/editing/constants.js +10 -10
- package/dist/cjs/editing/editing-config-middleware.js +70 -69
- package/dist/cjs/editing/editing-render-middleware.js +145 -144
- package/dist/cjs/editing/feaas-render-middleware.js +102 -101
- package/dist/cjs/editing/index.js +19 -19
- package/dist/cjs/editing/render-middleware.js +46 -46
- package/dist/cjs/editing/utils.js +260 -257
- package/dist/cjs/index.js +132 -131
- package/dist/cjs/middleware/app-router-multisite-middleware.js +41 -20
- package/dist/cjs/middleware/index.js +30 -30
- package/dist/cjs/middleware/locale-middleware.js +85 -84
- package/dist/cjs/middleware/middleware.js +195 -192
- package/dist/cjs/middleware/multisite-middleware.js +141 -118
- package/dist/cjs/middleware/personalize-middleware.js +240 -236
- package/dist/cjs/middleware/redirects-middleware.js +323 -297
- package/dist/cjs/middleware/robots-middleware.js +45 -44
- package/dist/cjs/middleware/sitemap-middleware.js +50 -49
- package/dist/cjs/monitoring/healthcheck-middleware.js +31 -30
- package/dist/cjs/monitoring/index.js +5 -5
- package/dist/cjs/route-handler/editing-config-route-handler.js +110 -106
- package/dist/cjs/route-handler/editing-render-route-handler.js +270 -165
- package/dist/cjs/route-handler/index.js +11 -11
- package/dist/cjs/route-handler/robots-route-handler.js +69 -68
- package/dist/cjs/route-handler/sitemap-route-handler.js +66 -65
- package/dist/cjs/search/index.js +17 -0
- package/dist/cjs/services/component-props-service.js +142 -138
- package/dist/cjs/sharedTypes/component-props.js +2 -2
- package/dist/cjs/sharedTypes/sitecore-page-props.js +2 -2
- package/dist/cjs/site/index.js +5 -5
- package/dist/cjs/tools/codegen/import-map.js +15 -0
- package/dist/cjs/tools/component-props.loader.js +95 -95
- package/dist/cjs/tools/generate-map.js +317 -317
- package/dist/cjs/tools/index.js +14 -13
- package/dist/cjs/tools/templating/byoc-component.js +36 -36
- package/dist/cjs/tools/templating/constants.js +7 -7
- package/dist/cjs/tools/templating/default-component.js +35 -35
- package/dist/cjs/tools/templating/utils.js +200 -0
- package/dist/cjs/utils/index.js +14 -14
- package/dist/cjs/utils/utils.js +82 -73
- package/dist/esm/client/index.js +2 -2
- package/dist/esm/client/models.js +1 -1
- package/dist/esm/client/sitecore-nextjs-client.js +156 -152
- package/dist/esm/components/BYOCWrapper.js +27 -26
- package/dist/esm/components/ComponentPropsContext.js +28 -21
- package/dist/esm/components/FEaaSWrapper.js +29 -28
- package/dist/esm/components/Link.js +78 -51
- package/dist/esm/components/NextImage.js +60 -56
- package/dist/esm/components/Placeholder.js +18 -13
- package/dist/esm/components/RichText.js +96 -91
- package/dist/esm/config/define-config.js +21 -20
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/config-cli/define-cli-config.js +36 -35
- package/dist/esm/config-cli/index.js +1 -1
- package/dist/esm/editing/codegen/import-map.js +92 -81
- package/dist/esm/editing/codegen/index.js +1 -1
- package/dist/esm/editing/constants.js +7 -7
- package/dist/esm/editing/editing-config-middleware.js +66 -65
- package/dist/esm/editing/editing-render-middleware.js +141 -140
- package/dist/esm/editing/feaas-render-middleware.js +98 -97
- package/dist/esm/editing/index.js +6 -6
- package/dist/esm/editing/render-middleware.js +42 -42
- package/dist/esm/editing/utils.js +246 -243
- package/dist/esm/index.js +25 -25
- package/dist/esm/middleware/app-router-multisite-middleware.js +37 -16
- package/dist/esm/middleware/index.js +11 -11
- package/dist/esm/middleware/locale-middleware.js +81 -80
- package/dist/esm/middleware/middleware.js +189 -186
- package/dist/esm/middleware/multisite-middleware.js +137 -114
- package/dist/esm/middleware/personalize-middleware.js +236 -232
- package/dist/esm/middleware/redirects-middleware.js +316 -290
- package/dist/esm/middleware/robots-middleware.js +41 -40
- package/dist/esm/middleware/sitemap-middleware.js +46 -45
- package/dist/esm/monitoring/healthcheck-middleware.js +27 -26
- package/dist/esm/monitoring/index.js +1 -1
- package/dist/esm/route-handler/editing-config-route-handler.js +106 -102
- package/dist/esm/route-handler/editing-render-route-handler.js +265 -160
- package/dist/esm/route-handler/index.js +4 -4
- package/dist/esm/route-handler/robots-route-handler.js +65 -64
- package/dist/esm/route-handler/sitemap-route-handler.js +63 -62
- package/dist/esm/search/index.js +1 -0
- package/dist/esm/services/component-props-service.js +135 -131
- package/dist/esm/sharedTypes/component-props.js +1 -1
- package/dist/esm/sharedTypes/sitecore-page-props.js +1 -1
- package/dist/esm/site/index.js +1 -1
- package/dist/esm/tools/codegen/import-map.js +11 -0
- package/dist/esm/tools/component-props.loader.js +59 -59
- package/dist/esm/tools/generate-map.js +279 -279
- package/dist/esm/tools/index.js +3 -2
- package/dist/esm/tools/templating/byoc-component.js +30 -30
- package/dist/esm/tools/templating/constants.js +4 -4
- package/dist/esm/tools/templating/default-component.js +29 -29
- package/dist/esm/tools/templating/utils.js +190 -0
- package/dist/esm/utils/index.js +3 -3
- package/dist/esm/utils/utils.js +74 -65
- package/package.json +87 -13
- package/search.d.ts +1 -0
- package/types/client/index.d.ts +3 -2
- package/types/client/index.d.ts.map +1 -0
- package/types/client/models.d.ts +9 -8
- package/types/client/models.d.ts.map +1 -0
- package/types/client/sitecore-nextjs-client.d.ts +68 -63
- package/types/client/sitecore-nextjs-client.d.ts.map +1 -0
- package/types/components/BYOCWrapper.d.ts +16 -14
- package/types/components/BYOCWrapper.d.ts.map +1 -0
- package/types/components/ComponentPropsContext.d.ts +30 -18
- package/types/components/ComponentPropsContext.d.ts.map +1 -0
- package/types/components/FEaaSWrapper.d.ts +17 -15
- package/types/components/FEaaSWrapper.d.ts.map +1 -0
- package/types/components/Link.d.ts +25 -15
- package/types/components/Link.d.ts.map +1 -0
- package/types/components/NextImage.d.ts +11 -6
- package/types/components/NextImage.d.ts.map +1 -0
- package/types/components/Placeholder.d.ts +14 -8
- package/types/components/Placeholder.d.ts.map +1 -0
- package/types/components/RichText.d.ts +35 -25
- package/types/components/RichText.d.ts.map +1 -0
- package/types/config/define-config.d.ts +42 -38
- package/types/config/define-config.d.ts.map +1 -0
- package/types/config/index.d.ts +2 -1
- package/types/config/index.d.ts.map +1 -0
- package/types/config-cli/define-cli-config.d.ts +10 -8
- package/types/config-cli/define-cli-config.d.ts.map +1 -0
- package/types/config-cli/index.d.ts +2 -1
- package/types/config-cli/index.d.ts.map +1 -0
- package/types/editing/codegen/import-map.d.ts +15 -3
- package/types/editing/codegen/import-map.d.ts.map +1 -0
- package/types/editing/codegen/index.d.ts +3 -2
- package/types/editing/codegen/index.d.ts.map +1 -0
- package/types/editing/constants.d.ts +8 -7
- package/types/editing/constants.d.ts.map +1 -0
- package/types/editing/editing-config-middleware.d.ts +37 -31
- package/types/editing/editing-config-middleware.d.ts.map +1 -0
- package/types/editing/editing-render-middleware.d.ts +47 -44
- package/types/editing/editing-render-middleware.d.ts.map +1 -0
- package/types/editing/feaas-render-middleware.d.ts +35 -32
- package/types/editing/feaas-render-middleware.d.ts.map +1 -0
- package/types/editing/index.d.ts +7 -6
- package/types/editing/index.d.ts.map +1 -0
- package/types/editing/render-middleware.d.ts +26 -25
- package/types/editing/render-middleware.d.ts.map +1 -0
- package/types/editing/utils.d.ts +110 -106
- package/types/editing/utils.d.ts.map +1 -0
- package/types/index.d.ts +25 -24
- package/types/index.d.ts.map +1 -0
- package/types/middleware/app-router-multisite-middleware.d.ts +28 -13
- package/types/middleware/app-router-multisite-middleware.d.ts.map +1 -0
- package/types/middleware/index.d.ts +12 -11
- package/types/middleware/index.d.ts.map +1 -0
- package/types/middleware/locale-middleware.d.ts +35 -32
- package/types/middleware/locale-middleware.d.ts.map +1 -0
- package/types/middleware/middleware.d.ts +135 -127
- package/types/middleware/middleware.d.ts.map +1 -0
- package/types/middleware/multisite-middleware.d.ts +54 -37
- package/types/middleware/multisite-middleware.d.ts.map +1 -0
- package/types/middleware/personalize-middleware.d.ts +81 -65
- package/types/middleware/personalize-middleware.d.ts.map +1 -0
- package/types/middleware/redirects-middleware.d.ts +68 -65
- package/types/middleware/redirects-middleware.d.ts.map +1 -0
- package/types/middleware/robots-middleware.d.ts +15 -13
- package/types/middleware/robots-middleware.d.ts.map +1 -0
- package/types/middleware/sitemap-middleware.d.ts +16 -14
- package/types/middleware/sitemap-middleware.d.ts.map +1 -0
- package/types/monitoring/healthcheck-middleware.d.ts +14 -12
- package/types/monitoring/healthcheck-middleware.d.ts.map +1 -0
- package/types/monitoring/index.d.ts +2 -1
- package/types/monitoring/index.d.ts.map +1 -0
- package/types/route-handler/editing-config-route-handler.d.ts +30 -24
- package/types/route-handler/editing-config-route-handler.d.ts.map +1 -0
- package/types/route-handler/editing-render-route-handler.d.ts +33 -25
- package/types/route-handler/editing-render-route-handler.d.ts.map +1 -0
- package/types/route-handler/index.d.ts +5 -4
- package/types/route-handler/index.d.ts.map +1 -0
- package/types/route-handler/robots-route-handler.d.ts +30 -28
- package/types/route-handler/robots-route-handler.d.ts.map +1 -0
- package/types/route-handler/sitemap-route-handler.d.ts +30 -28
- package/types/route-handler/sitemap-route-handler.d.ts.map +1 -0
- package/types/search/index.d.ts +2 -0
- package/types/search/index.d.ts.map +1 -0
- package/types/services/component-props-service.d.ts +62 -57
- package/types/services/component-props-service.d.ts.map +1 -0
- package/types/sharedTypes/component-props.d.ts +62 -47
- package/types/sharedTypes/component-props.d.ts.map +1 -0
- package/types/sharedTypes/sitecore-page-props.d.ts +14 -9
- package/types/sharedTypes/sitecore-page-props.d.ts.map +1 -0
- package/types/site/index.d.ts +2 -1
- package/types/site/index.d.ts.map +1 -0
- package/types/tools/codegen/import-map.d.ts +10 -0
- package/types/tools/codegen/import-map.d.ts.map +1 -0
- package/types/tools/component-props.loader.d.ts +8 -7
- package/types/tools/component-props.loader.d.ts.map +1 -0
- package/types/tools/generate-map.d.ts +26 -24
- package/types/tools/generate-map.d.ts.map +1 -0
- package/types/tools/index.d.ts +4 -2
- package/types/tools/index.d.ts.map +1 -0
- package/types/tools/templating/byoc-component.d.ts +3 -2
- package/types/tools/templating/byoc-component.d.ts.map +1 -0
- package/types/tools/templating/constants.d.ts +5 -4
- package/types/tools/templating/constants.d.ts.map +1 -0
- package/types/tools/templating/default-component.d.ts +3 -2
- package/types/tools/templating/default-component.d.ts.map +1 -0
- package/types/tools/templating/utils.d.ts +44 -0
- package/types/tools/templating/utils.d.ts.map +1 -0
- package/types/utils/index.d.ts +4 -3
- package/types/utils/index.d.ts.map +1 -0
- package/types/utils/utils.d.ts +34 -24
- package/types/utils/utils.d.ts.map +1 -0
- package/client.js +0 -1
- package/codegen.js +0 -1
- package/config-cli.js +0 -1
- package/config.js +0 -1
- package/editing.js +0 -1
- package/middleware.js +0 -1
- package/monitoring.js +0 -1
- package/route-handler.js +0 -1
- package/site.js +0 -1
- package/tools.js +0 -1
- 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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
*
|
|
129
|
-
* @
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
*
|
|
148
|
-
* @param {
|
|
149
|
-
* @param {
|
|
150
|
-
* @param {
|
|
151
|
-
* @
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
//
|
|
157
|
-
propagatedHeaders.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
//
|
|
185
|
-
|
|
186
|
-
//
|
|
187
|
-
// to
|
|
188
|
-
//
|
|
189
|
-
//
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
*
|
|
197
|
-
* @
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* @
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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';
|