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