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