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