@sitecore-content-sdk/nextjs 1.5.0 → 2.0.0-canary.10
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/LICENSE.txt +202 -202
- package/dist/cjs/client/index.js +1 -1
- package/dist/cjs/client/sitecore-nextjs-client.js +4 -4
- package/dist/cjs/components/BYOCWrapper.js +0 -5
- package/dist/cjs/components/FEaaSWrapper.js +0 -5
- package/dist/cjs/components/NextImage.js +2 -2
- package/dist/cjs/config/define-config.js +7 -4
- package/dist/cjs/config-cli/define-cli-config.js +1 -1
- package/dist/cjs/debug.js +11 -0
- package/dist/cjs/editing/codegen/import-map-server.js +1 -1
- package/dist/cjs/editing/editing-config-middleware.js +13 -11
- package/dist/cjs/editing/editing-render-middleware.js +41 -29
- package/dist/cjs/editing/feaas-render-middleware.js +24 -13
- package/dist/cjs/editing/index.js +2 -2
- package/dist/cjs/editing/types.js +2 -0
- package/dist/cjs/editing/utils.js +35 -6
- package/dist/cjs/index.js +17 -11
- package/dist/cjs/middleware/index.js +1 -24
- package/dist/cjs/{middleware/app-router-multisite-middleware.js → proxy/app-router-multisite-proxy.js} +8 -8
- package/dist/cjs/proxy/index.js +29 -0
- package/dist/cjs/{middleware/locale-middleware.js → proxy/locale-proxy.js} +18 -15
- package/dist/cjs/{middleware/multisite-middleware.js → proxy/multisite-proxy.js} +23 -20
- package/dist/cjs/{middleware/personalize-middleware.js → proxy/personalize-proxy.js} +31 -28
- package/dist/cjs/{middleware/middleware.js → proxy/proxy.js} +31 -28
- package/dist/cjs/{middleware/redirects-middleware.js → proxy/redirects-proxy.js} +121 -111
- package/dist/cjs/route-handler/editing-config-route-handler.js +16 -13
- package/dist/cjs/route-handler/editing-render-route-handler.js +43 -32
- package/dist/cjs/route-handler/robots-route-handler.js +14 -6
- package/dist/cjs/route-handler/sitemap-route-handler.js +13 -5
- package/dist/cjs/site/index.js +1 -1
- package/dist/cjs/tools/codegen/import-map.js +2 -2
- package/dist/cjs/tools/generate-map.js +1 -1
- package/dist/cjs/tools/index.js +7 -8
- package/dist/cjs/tools/templating/byoc-component.js +1 -1
- package/dist/cjs/tools/templating/default-component.js +1 -1
- package/dist/cjs/tools/templating/utils.js +5 -6
- package/dist/cjs/utils/index.js +4 -5
- package/dist/cjs/utils/utils.js +3 -3
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/client/sitecore-nextjs-client.js +4 -4
- package/dist/esm/components/BYOCWrapper.js +0 -5
- package/dist/esm/components/FEaaSWrapper.js +0 -5
- package/dist/esm/components/NextImage.js +2 -2
- package/dist/esm/config/define-config.js +7 -4
- package/dist/esm/config-cli/define-cli-config.js +1 -1
- package/dist/esm/debug.js +9 -0
- package/dist/esm/editing/codegen/import-map-server.js +1 -1
- package/dist/esm/editing/editing-config-middleware.js +4 -5
- package/dist/esm/editing/editing-render-middleware.js +22 -13
- package/dist/esm/editing/feaas-render-middleware.js +14 -6
- package/dist/esm/editing/index.js +2 -2
- package/dist/esm/editing/types.js +1 -0
- package/dist/esm/editing/utils.js +32 -4
- package/dist/esm/index.js +11 -12
- package/dist/esm/middleware/index.js +0 -9
- package/dist/esm/{middleware/app-router-multisite-middleware.js → proxy/app-router-multisite-proxy.js} +6 -6
- package/dist/esm/proxy/index.js +9 -0
- package/dist/esm/{middleware/locale-middleware.js → proxy/locale-proxy.js} +12 -12
- package/dist/esm/{middleware/multisite-middleware.js → proxy/multisite-proxy.js} +16 -16
- package/dist/esm/{middleware/personalize-middleware.js → proxy/personalize-proxy.js} +17 -17
- package/dist/esm/{middleware/middleware.js → proxy/proxy.js} +24 -24
- package/dist/esm/{middleware/redirects-middleware.js → proxy/redirects-proxy.js} +112 -102
- package/dist/esm/route-handler/editing-config-route-handler.js +4 -4
- package/dist/esm/route-handler/editing-render-route-handler.js +19 -11
- package/dist/esm/route-handler/robots-route-handler.js +8 -3
- package/dist/esm/route-handler/sitemap-route-handler.js +8 -3
- package/dist/esm/site/index.js +1 -1
- package/dist/esm/tools/codegen/import-map.js +1 -1
- package/dist/esm/tools/generate-map.js +1 -1
- package/dist/esm/tools/index.js +2 -1
- package/dist/esm/tools/templating/byoc-component.js +1 -1
- package/dist/esm/tools/templating/default-component.js +1 -1
- package/dist/esm/tools/templating/utils.js +1 -2
- package/dist/esm/utils/index.js +2 -2
- package/dist/esm/utils/utils.js +2 -2
- package/package.json +187 -181
- package/proxy.d.ts +1 -0
- package/types/client/index.d.ts +1 -1
- package/types/client/index.d.ts.map +1 -1
- package/types/client/sitecore-nextjs-client.d.ts +3 -3
- package/types/client/sitecore-nextjs-client.d.ts.map +1 -1
- package/types/components/BYOCWrapper.d.ts +0 -5
- package/types/components/BYOCWrapper.d.ts.map +1 -1
- package/types/components/FEaaSWrapper.d.ts +0 -5
- package/types/components/FEaaSWrapper.d.ts.map +1 -1
- package/types/components/Placeholder.d.ts +2 -2
- package/types/components/Placeholder.d.ts.map +1 -1
- package/types/config/define-config.d.ts +1 -1
- package/types/config/define-config.d.ts.map +1 -1
- package/types/config-cli/define-cli-config.d.ts +1 -1
- package/types/config-cli/define-cli-config.d.ts.map +1 -1
- package/types/debug.d.ts +7 -0
- package/types/debug.d.ts.map +1 -0
- package/types/editing/codegen/import-map-server.d.ts +1 -1
- package/types/editing/codegen/import-map-server.d.ts.map +1 -1
- package/types/editing/codegen/import-map-utils.d.ts +1 -1
- package/types/editing/codegen/import-map-utils.d.ts.map +1 -1
- package/types/editing/codegen/import-map.d.ts +1 -1
- package/types/editing/codegen/import-map.d.ts.map +1 -1
- package/types/editing/codegen/index.d.ts +1 -1
- package/types/editing/codegen/index.d.ts.map +1 -1
- package/types/editing/editing-config-middleware.d.ts +1 -1
- package/types/editing/editing-config-middleware.d.ts.map +1 -1
- package/types/editing/editing-render-middleware.d.ts +8 -1
- package/types/editing/editing-render-middleware.d.ts.map +1 -1
- package/types/editing/feaas-render-middleware.d.ts +1 -1
- package/types/editing/feaas-render-middleware.d.ts.map +1 -1
- package/types/editing/index.d.ts +3 -2
- package/types/editing/index.d.ts.map +1 -1
- package/types/editing/types.d.ts +37 -0
- package/types/editing/types.d.ts.map +1 -0
- package/types/editing/utils.d.ts +12 -1
- package/types/editing/utils.d.ts.map +1 -1
- package/types/index.d.ts +13 -11
- package/types/index.d.ts.map +1 -1
- package/types/middleware/index.d.ts +0 -9
- package/types/middleware/index.d.ts.map +1 -1
- package/types/middleware/robots-middleware.d.ts +1 -1
- package/types/middleware/robots-middleware.d.ts.map +1 -1
- package/types/middleware/sitemap-middleware.d.ts +1 -1
- package/types/middleware/sitemap-middleware.d.ts.map +1 -1
- package/types/{middleware/app-router-multisite-middleware.d.ts → proxy/app-router-multisite-proxy.d.ts} +6 -6
- package/types/proxy/app-router-multisite-proxy.d.ts.map +1 -0
- package/types/proxy/index.d.ts +10 -0
- package/types/proxy/index.d.ts.map +1 -0
- package/types/proxy/locale-proxy.d.ts +35 -0
- package/types/proxy/locale-proxy.d.ts.map +1 -0
- package/types/{middleware/multisite-middleware.d.ts → proxy/multisite-proxy.d.ts} +11 -11
- package/types/proxy/multisite-proxy.d.ts.map +1 -0
- package/types/{middleware/personalize-middleware.d.ts → proxy/personalize-proxy.d.ts} +10 -10
- package/types/proxy/personalize-proxy.d.ts.map +1 -0
- package/types/{middleware/middleware.d.ts → proxy/proxy.d.ts} +24 -26
- package/types/proxy/proxy.d.ts.map +1 -0
- package/types/{middleware/redirects-middleware.d.ts → proxy/redirects-proxy.d.ts} +11 -11
- package/types/proxy/redirects-proxy.d.ts.map +1 -0
- package/types/route-handler/editing-config-route-handler.d.ts +1 -1
- package/types/route-handler/editing-config-route-handler.d.ts.map +1 -1
- package/types/route-handler/editing-render-route-handler.d.ts +7 -0
- package/types/route-handler/editing-render-route-handler.d.ts.map +1 -1
- package/types/route-handler/robots-route-handler.d.ts +2 -2
- package/types/route-handler/robots-route-handler.d.ts.map +1 -1
- package/types/route-handler/sitemap-route-handler.d.ts +2 -2
- package/types/route-handler/sitemap-route-handler.d.ts.map +1 -1
- package/types/services/component-props-service.d.ts +1 -1
- package/types/services/component-props-service.d.ts.map +1 -1
- package/types/sharedTypes/component-props.d.ts +1 -1
- package/types/sharedTypes/component-props.d.ts.map +1 -1
- package/types/sharedTypes/sitecore-page-props.d.ts +2 -2
- package/types/sharedTypes/sitecore-page-props.d.ts.map +1 -1
- package/types/site/index.d.ts +1 -1
- package/types/site/index.d.ts.map +1 -1
- package/types/tools/codegen/import-map.d.ts +3 -3
- package/types/tools/codegen/import-map.d.ts.map +1 -1
- package/types/tools/generate-map.d.ts +1 -1
- package/types/tools/generate-map.d.ts.map +1 -1
- package/types/tools/index.d.ts +3 -1
- package/types/tools/index.d.ts.map +1 -1
- package/types/tools/templating/byoc-component.d.ts +1 -1
- package/types/tools/templating/byoc-component.d.ts.map +1 -1
- package/types/tools/templating/default-component.d.ts +1 -1
- package/types/tools/templating/default-component.d.ts.map +1 -1
- package/types/tools/templating/utils.d.ts +2 -2
- package/types/tools/templating/utils.d.ts.map +1 -1
- package/types/utils/index.d.ts +2 -2
- package/types/utils/index.d.ts.map +1 -1
- package/types/middleware/app-router-multisite-middleware.d.ts.map +0 -1
- package/types/middleware/locale-middleware.d.ts +0 -35
- package/types/middleware/locale-middleware.d.ts.map +0 -1
- package/types/middleware/middleware.d.ts.map +0 -1
- package/types/middleware/multisite-middleware.d.ts.map +0 -1
- package/types/middleware/personalize-middleware.d.ts.map +0 -1
- package/types/middleware/redirects-middleware.d.ts.map +0 -1
|
@@ -12,31 +12,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
12
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const utils_1 = require("@sitecore-content-sdk/core/utils");
|
|
15
|
+
exports.RedirectsProxy = void 0;
|
|
16
|
+
const site_1 = require("@sitecore-content-sdk/content/site");
|
|
17
|
+
const tools_1 = require("@sitecore-content-sdk/core/tools");
|
|
19
18
|
const server_1 = require("next/server");
|
|
20
19
|
const regex_parser_1 = __importDefault(require("regex-parser"));
|
|
21
|
-
const
|
|
20
|
+
const proxy_1 = require("./proxy");
|
|
21
|
+
const debug_1 = __importDefault(require("../debug"));
|
|
22
22
|
const REGEXP_CONTEXT_SITE_LANG = new RegExp(/\$siteLang/, 'i');
|
|
23
23
|
const REGEXP_ABSOLUTE_URL = new RegExp('^(?:[a-z]+:)?//', 'i');
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* Proxy / handler fetches all redirects from Sitecore instance by grapqhl service
|
|
26
26
|
* compares with current url and redirects to target url
|
|
27
27
|
* @public
|
|
28
28
|
*/
|
|
29
|
-
class
|
|
29
|
+
class RedirectsProxy extends proxy_1.ProxyBase {
|
|
30
30
|
/**
|
|
31
|
-
* @param {
|
|
31
|
+
* @param {RedirectsProxyConfig} [config] redirects proxy config
|
|
32
32
|
*/
|
|
33
33
|
constructor(config) {
|
|
34
|
-
var _a;
|
|
35
34
|
super(config);
|
|
36
35
|
this.config = config;
|
|
37
36
|
this.handle = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
38
37
|
if (!this.config.enabled) {
|
|
39
|
-
|
|
38
|
+
debug_1.default.redirects('skipped (redirects proxy is disabled globally)');
|
|
40
39
|
return res;
|
|
41
40
|
}
|
|
42
41
|
try {
|
|
@@ -45,124 +44,133 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
45
44
|
const hostname = this.getHostHeader(req) || this.defaultHostname;
|
|
46
45
|
let site;
|
|
47
46
|
const startTimestamp = Date.now();
|
|
48
|
-
|
|
47
|
+
debug_1.default.redirects('redirects proxy start: %o', {
|
|
49
48
|
pathname,
|
|
50
49
|
language,
|
|
51
50
|
hostname,
|
|
52
51
|
});
|
|
53
52
|
if (this.disabled(req, res)) {
|
|
54
|
-
|
|
53
|
+
debug_1.default.redirects('skipped (redirects proxy is disabled)');
|
|
55
54
|
return res;
|
|
56
55
|
}
|
|
57
56
|
const isAppRouterRequest = this.isAppRouter(res);
|
|
58
|
-
const
|
|
59
|
-
var _a;
|
|
57
|
+
const validateRequest = () => {
|
|
60
58
|
if (this.isPreview(req)) {
|
|
61
|
-
|
|
62
|
-
return
|
|
59
|
+
debug_1.default.redirects('skipped (preview)');
|
|
60
|
+
return false;
|
|
63
61
|
}
|
|
64
62
|
// Skip prefetch requests from Next.js, which are not original client requests
|
|
65
|
-
// as they load unnecessary requests that burden the redirects
|
|
63
|
+
// as they load unnecessary requests that burden the redirects proxy with meaningless traffic
|
|
66
64
|
if (this.isPrefetch(req)) {
|
|
67
|
-
|
|
68
|
-
res.headers.set('x-
|
|
65
|
+
debug_1.default.redirects('skipped (prefetch)');
|
|
66
|
+
res.headers.set('x-proxy-cache', 'no-cache');
|
|
69
67
|
res.headers.set('Cache-Control', 'no-store, must-revalidate');
|
|
70
|
-
return
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
};
|
|
72
|
+
if (!validateRequest()) {
|
|
73
|
+
return res;
|
|
74
|
+
}
|
|
75
|
+
site = this.getSite(req, res);
|
|
76
|
+
// Find the redirect from result of RedirectService
|
|
77
|
+
const existsRedirect = yield this.getExistsRedirect(req, site.name);
|
|
78
|
+
if (!existsRedirect) {
|
|
79
|
+
debug_1.default.redirects('skipped (redirect does not exist)');
|
|
80
|
+
return res;
|
|
81
|
+
}
|
|
82
|
+
debug_1.default.redirects('Matched redirect rule: %o', { existsRedirect });
|
|
83
|
+
const processAbsoluteUrlTarget = (url, existsRedirect) => {
|
|
84
|
+
var _a;
|
|
85
|
+
// Redirect logic for absolute (external or not) URLS. To avoid locale stripping: use plain string for external URLs to prevent Next.js rewriting.
|
|
86
|
+
let targetUrl = existsRedirect.target;
|
|
87
|
+
if (url.search && existsRedirect.isQueryStringPreserved) {
|
|
88
|
+
const incomingQS = new URLSearchParams((_a = url.search) !== null && _a !== void 0 ? _a : '');
|
|
89
|
+
const [targetMainUrl, targetQS] = targetUrl.split('?');
|
|
90
|
+
const mergedQueryString = (0, tools_1.mergeURLSearchParams)(incomingQS, new URLSearchParams(targetQS || ''));
|
|
91
|
+
targetUrl = `${targetMainUrl}?${mergedQueryString}`;
|
|
71
92
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
93
|
+
return this.dispatchRedirect(targetUrl, existsRedirect.redirectType, req, res, true);
|
|
94
|
+
};
|
|
95
|
+
const processRelativeUrlTarget = (url, existsRedirect) => {
|
|
96
|
+
var _a;
|
|
97
|
+
let targetUrl = existsRedirect.target;
|
|
98
|
+
const possiblyLocalePrefix = targetUrl.split('/')[1];
|
|
99
|
+
let targetLocale = '';
|
|
100
|
+
if (this.locales.includes(possiblyLocalePrefix)) {
|
|
101
|
+
targetLocale = possiblyLocalePrefix;
|
|
102
|
+
targetUrl = targetUrl.replace(`/${possiblyLocalePrefix}`, '');
|
|
78
103
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (REGEXP_CONTEXT_SITE_LANG.test(existsRedirect.target) &&
|
|
82
|
-
!(REGEXP_ABSOLUTE_URL.test(existsRedirect.target) &&
|
|
83
|
-
existsRedirect.target.includes(hostname))) {
|
|
84
|
-
existsRedirect.target = existsRedirect.target.replace(REGEXP_CONTEXT_SITE_LANG, site.language);
|
|
85
|
-
if (!isAppRouterRequest) {
|
|
86
|
-
req.nextUrl.locale = site.language;
|
|
87
|
-
}
|
|
104
|
+
else if (existsRedirect.isLanguagePreserved) {
|
|
105
|
+
targetLocale = language;
|
|
88
106
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
107
|
+
let [targetMainUrl, targetQS] = targetUrl.split('?');
|
|
108
|
+
if (url.search && existsRedirect.isQueryStringPreserved) {
|
|
109
|
+
const incomingQS = new URLSearchParams((_a = url.search) !== null && _a !== void 0 ? _a : '');
|
|
110
|
+
targetQS = (0, tools_1.mergeURLSearchParams)(incomingQS, new URLSearchParams(targetQS || ''));
|
|
111
|
+
}
|
|
112
|
+
const prepareNewURL = new URL(`${targetMainUrl}${targetQS ? '?' + targetQS : ''}`, url.origin);
|
|
113
|
+
const basePath = url.basePath; // setting NextUrl.href overrides basePath, so we need to store it
|
|
114
|
+
url.href = prepareNewURL.href;
|
|
115
|
+
url.pathname = prepareNewURL.pathname;
|
|
116
|
+
url.search = prepareNewURL.search;
|
|
117
|
+
// NextUrl setter sets '/' by default if basePath is empty
|
|
118
|
+
// this causes issues when basePath is not configured so we need to set it only if exists
|
|
119
|
+
if (basePath) {
|
|
120
|
+
url.basePath = basePath;
|
|
121
|
+
}
|
|
122
|
+
if (!isAppRouterRequest) {
|
|
123
|
+
// for pages router i18n implementation, apply default locale as backup
|
|
124
|
+
url.locale = targetLocale || req.nextUrl.defaultLocale || 'en';
|
|
105
125
|
}
|
|
106
126
|
else {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (this.locales.includes(urlFirstPart)) {
|
|
111
|
-
if (!isAppRouterRequest) {
|
|
112
|
-
req.nextUrl.locale = urlFirstPart;
|
|
113
|
-
}
|
|
114
|
-
existsRedirect.target = existsRedirect.target.replace(`/${urlFirstPart}`, '');
|
|
115
|
-
}
|
|
116
|
-
const targetSegments = isUrl
|
|
117
|
-
? existsRedirect.target.split('?')
|
|
118
|
-
: url.pathname.replace(/\/*$/gi, '') + existsRedirect.matchedQueryString;
|
|
119
|
-
const [targetPath, targetQueryString] = isUrl
|
|
120
|
-
? targetSegments
|
|
121
|
-
: targetSegments
|
|
122
|
-
.replace((0, regex_parser_1.default)(existsRedirect.pattern), existsRedirect.target)
|
|
123
|
-
.replace(/^\/\//, '/')
|
|
124
|
-
.split('?');
|
|
125
|
-
const mergedQueryString = existsRedirect.isQueryStringPreserved
|
|
126
|
-
? (0, utils_1.mergeURLSearchParams)(new URLSearchParams((_a = url.search) !== null && _a !== void 0 ? _a : ''), new URLSearchParams(targetQueryString || ''))
|
|
127
|
-
: targetQueryString || '';
|
|
128
|
-
const prepareNewURL = new URL(`${targetPath}${mergedQueryString ? '?' + mergedQueryString : ''}`, url.origin);
|
|
129
|
-
const basePath = url.basePath; // setting NextUrl.href overrides basePath, so we need to store it
|
|
130
|
-
url.href = prepareNewURL.href;
|
|
131
|
-
url.pathname = prepareNewURL.pathname;
|
|
132
|
-
url.search = prepareNewURL.search;
|
|
133
|
-
// NextUrl setter sets '/' by default if basePath is empty
|
|
134
|
-
// this causes issues when basePath is not configured so we need to set it only if exists
|
|
135
|
-
if (basePath) {
|
|
136
|
-
url.basePath = basePath;
|
|
137
|
-
}
|
|
138
|
-
if (!isAppRouterRequest) {
|
|
139
|
-
url.locale = req.nextUrl.locale;
|
|
140
|
-
}
|
|
127
|
+
// In App Router, we need to set the locale in the pathname, if present
|
|
128
|
+
if (targetLocale)
|
|
129
|
+
url.pathname = `/${targetLocale}${url.pathname}`;
|
|
141
130
|
}
|
|
142
131
|
/** return Response redirect with http code of redirect type */
|
|
143
|
-
return this.dispatchRedirect(url, existsRedirect.redirectType, req, res, false);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
132
|
+
return this.dispatchRedirect(this.normalizeUrl(url), existsRedirect.redirectType, req, res, false);
|
|
133
|
+
};
|
|
134
|
+
// replace $siteLang token in target if exists
|
|
135
|
+
existsRedirect.target = existsRedirect.target.replace(REGEXP_CONTEXT_SITE_LANG, site.language);
|
|
136
|
+
const reqUrl = this.normalizeUrl(req.nextUrl.clone());
|
|
137
|
+
// Apply regex replacements to the target URL if the pattern is a regex
|
|
138
|
+
const matched = reqUrl.pathname
|
|
139
|
+
.replace(/\/*$/gi, '')
|
|
140
|
+
.match((0, regex_parser_1.default)(existsRedirect.pattern));
|
|
141
|
+
if (matched) {
|
|
142
|
+
existsRedirect.target = existsRedirect.target.replace(/\$(\d+)/g, (_, index) => {
|
|
143
|
+
return matched[parseInt(index, 10)] || '';
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
const redirectedResponse = REGEXP_ABSOLUTE_URL.test(existsRedirect.target)
|
|
147
|
+
? processAbsoluteUrlTarget(reqUrl, existsRedirect)
|
|
148
|
+
: processRelativeUrlTarget(reqUrl, existsRedirect);
|
|
149
|
+
debug_1.default.redirects('redirects proxy end in %dms: %o', Date.now() - startTimestamp, {
|
|
150
|
+
redirected: redirectedResponse.redirected,
|
|
151
|
+
status: redirectedResponse.status,
|
|
152
|
+
url: redirectedResponse.url,
|
|
153
|
+
headers: this.extractDebugHeaders(redirectedResponse.headers),
|
|
151
154
|
});
|
|
152
|
-
return
|
|
155
|
+
return redirectedResponse;
|
|
153
156
|
}
|
|
154
157
|
catch (error) {
|
|
155
|
-
console.log('Redirect
|
|
158
|
+
console.log('Redirect proxy failed:');
|
|
156
159
|
console.log(error);
|
|
157
160
|
return res;
|
|
158
161
|
}
|
|
159
162
|
});
|
|
160
163
|
this.locales = config.locales;
|
|
164
|
+
// If redirectsService is provided directly (e.g., for testing), use it
|
|
165
|
+
if (this.config.redirectsService) {
|
|
166
|
+
this.redirectsService = this.config.redirectsService;
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
161
169
|
// Validate API config is present - redirects requires either Edge or local API configuration
|
|
162
170
|
const hasEdgeConfig = !!(this.config.contextId || this.config.clientContextId);
|
|
163
171
|
const hasLocalConfig = !!(this.config.apiHost && this.config.apiKey);
|
|
164
172
|
if (!hasEdgeConfig && !hasLocalConfig) {
|
|
165
|
-
console.warn('[
|
|
173
|
+
console.warn('[RedirectsProxy] Redirects proxy requires either Edge configuration (contextId/clientContextId) or local API configuration (apiHost/apiKey). ' +
|
|
166
174
|
'Redirects features will be disabled. This is expected when API configuration is not available.');
|
|
167
175
|
// Set to null to indicate service is disabled
|
|
168
176
|
this.redirectsService = null;
|
|
@@ -185,16 +193,16 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
185
193
|
};
|
|
186
194
|
// NOTE: we provide native fetch for compatibility on Next.js Edge Runtime
|
|
187
195
|
// (underlying default 'cross-fetch' is not currently compatible: https://github.com/lquixada/cross-fetch/issues/78)
|
|
188
|
-
this.redirectsService =
|
|
189
|
-
(_a = this.config.redirectsService) !== null && _a !== void 0 ? _a : new site_1.RedirectsService(Object.assign(Object.assign({}, config), { clientFactory: this.getClientFactory(graphQLOptions), fetch: fetch }));
|
|
196
|
+
this.redirectsService = new site_1.RedirectsService(Object.assign(Object.assign({}, config), { clientFactory: this.getClientFactory(graphQLOptions), fetch: fetch }));
|
|
190
197
|
}
|
|
191
198
|
disabled(req, res) {
|
|
192
|
-
// Check if API config is missing - if so, disable the
|
|
199
|
+
// Check if API config is missing - if so, disable the proxy
|
|
193
200
|
if (!this.redirectsService) {
|
|
194
|
-
|
|
201
|
+
debug_1.default.redirects('skipped (redirects service not configured - API config required)');
|
|
195
202
|
return true;
|
|
196
203
|
}
|
|
197
|
-
|
|
204
|
+
// ignore files
|
|
205
|
+
return req.nextUrl.pathname.includes('.') || super.disabled(req, res);
|
|
198
206
|
}
|
|
199
207
|
/**
|
|
200
208
|
* Method returns RedirectInfo when matches
|
|
@@ -212,14 +220,13 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
212
220
|
const locale = this.getLanguage(req);
|
|
213
221
|
const normalizedPath = incomingURL.replace(/\/*$/gi, '').toLowerCase();
|
|
214
222
|
const redirects = yield this.redirectsService.fetchRedirects(siteName);
|
|
215
|
-
const language = this.getLanguage(req);
|
|
216
223
|
const modifyRedirects = structuredClone(redirects);
|
|
217
224
|
let matchedQueryString;
|
|
218
225
|
const localePath = `/${locale.toLowerCase()}${normalizedPath}`;
|
|
219
226
|
return modifyRedirects.length
|
|
220
227
|
? modifyRedirects.find((redirect) => {
|
|
221
228
|
// process static URL (non-regex) rules
|
|
222
|
-
if ((0,
|
|
229
|
+
if ((0, tools_1.isRegexOrUrl)(redirect.pattern) === 'url') {
|
|
223
230
|
const urlArray = redirect.pattern.endsWith('/')
|
|
224
231
|
? redirect.pattern.slice(0, -1).split('?')
|
|
225
232
|
: redirect.pattern.split('?');
|
|
@@ -234,12 +241,13 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
234
241
|
}
|
|
235
242
|
return ((patternPath === localePath || patternPath === normalizedPath) &&
|
|
236
243
|
(!patternQS ||
|
|
237
|
-
(0,
|
|
244
|
+
(0, tools_1.areURLSearchParamsEqual)(new URLSearchParams(patternQS), new URLSearchParams(incomingQS))));
|
|
238
245
|
}
|
|
239
246
|
// process regex rules
|
|
240
247
|
// Modify the redirect pattern to ignore the language prefix in the path
|
|
241
248
|
// And escapes non-special "?" characters in a string or regex.
|
|
242
|
-
redirect.pattern = (0,
|
|
249
|
+
redirect.pattern = (0, tools_1.escapeNonSpecialQuestionMarks)('^' + redirect.pattern.replace(new RegExp(`^[^]?/${locale}/`, 'gi'), '') // ensure function thinks input is regex
|
|
250
|
+
);
|
|
243
251
|
// Prepare the redirect pattern as a regular expression, making it more flexible for matching URLs
|
|
244
252
|
redirect.pattern = `/^\/${redirect.pattern
|
|
245
253
|
.replace(/^\/|\/$/g, '') // Removes leading and trailing slashes
|
|
@@ -283,7 +291,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
283
291
|
/**
|
|
284
292
|
* Remove special parameters(Next.JS)
|
|
285
293
|
* Example: /about/contact/us
|
|
286
|
-
* When a user clicks on this link, Next.js should generate a link for the
|
|
294
|
+
* When a user clicks on this link, Next.js should generate a link for the proxy, formatted like this:
|
|
287
295
|
* http://host/about/contact/us?path=about&path=contact&path=us
|
|
288
296
|
*/
|
|
289
297
|
const newQueryString = url.search
|
|
@@ -341,7 +349,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
341
349
|
}
|
|
342
350
|
// Check if it has a site prefix
|
|
343
351
|
// If so, preserve it for the redirect target to maintain proper routing
|
|
344
|
-
const incomingRewrite = res === null || res === void 0 ? void 0 : res.headers.get(
|
|
352
|
+
const incomingRewrite = res === null || res === void 0 ? void 0 : res.headers.get(proxy_1.REWRITE_HEADER_NAME);
|
|
345
353
|
if (incomingRewrite && !isExternal) {
|
|
346
354
|
// Extract locale from target path
|
|
347
355
|
const targetPathParts = rewritePath.split('/').filter(Boolean);
|
|
@@ -363,7 +371,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
363
371
|
}
|
|
364
372
|
}
|
|
365
373
|
/**
|
|
366
|
-
* Helper function to create a redirect response and remove the x-
|
|
374
|
+
* Helper function to create a redirect response and remove the x-proxy-next header.
|
|
367
375
|
* @param {NextURL | string} url The URL to redirect to.
|
|
368
376
|
* @param {Response} res The response object.
|
|
369
377
|
* @param {number} status The HTTP status code of the redirect.
|
|
@@ -371,7 +379,9 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
371
379
|
* @returns {NextResponse<unknown>} The redirect response.
|
|
372
380
|
*/
|
|
373
381
|
createRedirectResponse(url, res, status, statusText) {
|
|
374
|
-
|
|
382
|
+
// Convert NextURL to string if needed - NextResponse.redirect requires a string URL
|
|
383
|
+
const urlString = typeof url === 'string' ? url : url.href;
|
|
384
|
+
const redirect = server_1.NextResponse.redirect(urlString, {
|
|
375
385
|
status,
|
|
376
386
|
statusText,
|
|
377
387
|
headers: res === null || res === void 0 ? void 0 : res.headers,
|
|
@@ -379,9 +389,9 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
379
389
|
if (res === null || res === void 0 ? void 0 : res.headers) {
|
|
380
390
|
redirect.headers.delete('x-middleware-next');
|
|
381
391
|
redirect.headers.delete('x-middleware-rewrite');
|
|
382
|
-
redirect.headers.delete(
|
|
392
|
+
redirect.headers.delete(proxy_1.REWRITE_HEADER_NAME);
|
|
383
393
|
}
|
|
384
394
|
return redirect;
|
|
385
395
|
}
|
|
386
396
|
}
|
|
387
|
-
exports.
|
|
397
|
+
exports.RedirectsProxy = RedirectsProxy;
|
|
@@ -8,13 +8,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
exports.createEditingConfigRouteHandler = void 0;
|
|
13
|
-
const editing_1 = require("@sitecore-content-sdk/
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
16
|
+
const editing_1 = require("@sitecore-content-sdk/content/editing");
|
|
17
|
+
const tools_1 = require("@sitecore-content-sdk/core/tools");
|
|
18
|
+
const layout_1 = require("@sitecore-content-sdk/content/layout");
|
|
19
|
+
const utils_1 = require("../utils/utils");
|
|
20
|
+
const debug_1 = __importDefault(require("../debug"));
|
|
18
21
|
/**
|
|
19
22
|
* Creates a route handler for the editing config API route (e.g. '/api/editing/config')
|
|
20
23
|
* Provides configuration information to determine feature compatibility on Pages side.
|
|
@@ -26,7 +29,7 @@ const createEditingConfigRouteHandler = (options) => {
|
|
|
26
29
|
const { components, metadata, clientComponents } = options;
|
|
27
30
|
const validateRequest = (req) => {
|
|
28
31
|
const secret = req.nextUrl.searchParams.get(editing_1.QUERY_PARAM_EDITING_SECRET);
|
|
29
|
-
const corsHeaders = (0,
|
|
32
|
+
const corsHeaders = (0, tools_1.getEnforcedCorsHeaders)({
|
|
30
33
|
requestMethod: req.method,
|
|
31
34
|
headers: req.headers,
|
|
32
35
|
presetCorsHeader: undefined,
|
|
@@ -37,10 +40,10 @@ const createEditingConfigRouteHandler = (options) => {
|
|
|
37
40
|
const GET = (req) => __awaiter(void 0, void 0, void 0, function* () {
|
|
38
41
|
try {
|
|
39
42
|
const startTimestamp = Date.now();
|
|
40
|
-
|
|
43
|
+
debug_1.default.editing('editing config route handler start');
|
|
41
44
|
const { secret, corsHeaders } = validateRequest(req);
|
|
42
45
|
if (!corsHeaders) {
|
|
43
|
-
|
|
46
|
+
debug_1.default.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
|
|
44
47
|
return new Response(JSON.stringify({ message: 'Invalid origin' }), {
|
|
45
48
|
status: 401,
|
|
46
49
|
headers: {
|
|
@@ -48,8 +51,8 @@ const createEditingConfigRouteHandler = (options) => {
|
|
|
48
51
|
},
|
|
49
52
|
});
|
|
50
53
|
}
|
|
51
|
-
if (secret !== (0,
|
|
52
|
-
|
|
54
|
+
if (secret !== (0, utils_1.getEditingSecret)()) {
|
|
55
|
+
debug_1.default.editing('invalid editing secret - sent "%s" expected "%s"', secret, (0, utils_1.getEditingSecret)());
|
|
53
56
|
return new Response(JSON.stringify({ message: 'Missing or invalid editing secret' }), {
|
|
54
57
|
status: 401,
|
|
55
58
|
headers: Object.assign({ 'Content-Type': 'application/json' }, corsHeaders),
|
|
@@ -64,7 +67,7 @@ const createEditingConfigRouteHandler = (options) => {
|
|
|
64
67
|
packages: metadata.packages,
|
|
65
68
|
editMode: layout_1.EditMode.Metadata,
|
|
66
69
|
};
|
|
67
|
-
|
|
70
|
+
debug_1.default.editing('editing config route handler end in %dms', Date.now() - startTimestamp);
|
|
68
71
|
return new Response(JSON.stringify(responseData), {
|
|
69
72
|
status: 200,
|
|
70
73
|
headers: Object.assign({ 'Content-Type': 'application/json' }, corsHeaders),
|
|
@@ -80,10 +83,10 @@ const createEditingConfigRouteHandler = (options) => {
|
|
|
80
83
|
});
|
|
81
84
|
const OPTIONS = (req) => __awaiter(void 0, void 0, void 0, function* () {
|
|
82
85
|
try {
|
|
83
|
-
|
|
86
|
+
debug_1.default.editing('preflight request');
|
|
84
87
|
const { corsHeaders } = validateRequest(req);
|
|
85
88
|
if (!corsHeaders) {
|
|
86
|
-
|
|
89
|
+
debug_1.default.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
|
|
87
90
|
return new Response(JSON.stringify({ message: 'Invalid origin' }), {
|
|
88
91
|
status: 401,
|
|
89
92
|
headers: {
|
|
@@ -8,17 +8,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
exports.createEditingRenderRouteHandlers = void 0;
|
|
13
16
|
exports.getNextCookies = getNextCookies;
|
|
14
17
|
const core_1 = require("@sitecore-content-sdk/core");
|
|
15
|
-
const editing_1 = require("@sitecore-content-sdk/
|
|
16
|
-
const
|
|
17
|
-
const layout_1 = require("@sitecore-content-sdk/
|
|
18
|
-
const
|
|
18
|
+
const editing_1 = require("@sitecore-content-sdk/content/editing");
|
|
19
|
+
const tools_1 = require("@sitecore-content-sdk/core/tools");
|
|
20
|
+
const layout_1 = require("@sitecore-content-sdk/content/layout");
|
|
21
|
+
const utils_1 = require("../utils/utils");
|
|
19
22
|
const headers_1 = require("next/headers");
|
|
20
|
-
const
|
|
21
|
-
const site_1 = require("@sitecore-content-sdk/
|
|
23
|
+
const utils_2 = require("../editing/utils");
|
|
24
|
+
const site_1 = require("@sitecore-content-sdk/content/site");
|
|
25
|
+
const debug_1 = __importDefault(require("../debug"));
|
|
22
26
|
/**
|
|
23
27
|
* Helper function to handle cookie operations - can be mocked for testing
|
|
24
28
|
* @returns {Promise<NextCookies>} Next cookies
|
|
@@ -39,17 +43,17 @@ function getNextCookies() {
|
|
|
39
43
|
* @public
|
|
40
44
|
*/
|
|
41
45
|
const createEditingRenderRouteHandlers = (options) => {
|
|
42
|
-
const dataFetcher = new core_1.NativeDataFetcher({ debugger:
|
|
46
|
+
const dataFetcher = new core_1.NativeDataFetcher({ debugger: debug_1.default.editing });
|
|
43
47
|
const getCorsHeaders = (req) => {
|
|
44
48
|
var _a;
|
|
45
|
-
const expectedCorsHeaders = (0,
|
|
49
|
+
const expectedCorsHeaders = (0, tools_1.getEnforcedCorsHeaders)({
|
|
46
50
|
requestMethod: req.method,
|
|
47
51
|
headers: req.headers,
|
|
48
52
|
presetCorsHeader: (_a = req.headers) === null || _a === void 0 ? void 0 : _a.get('Access-Control-Allow-Origin'),
|
|
49
53
|
allowedOrigins: editing_1.EDITING_ALLOWED_ORIGINS,
|
|
50
54
|
});
|
|
51
55
|
if (!expectedCorsHeaders) {
|
|
52
|
-
|
|
56
|
+
debug_1.default.editing('invalid origin host - set allowed origins in JSS_ALLOWED_ORIGINS environment variable');
|
|
53
57
|
}
|
|
54
58
|
return expectedCorsHeaders;
|
|
55
59
|
};
|
|
@@ -57,10 +61,10 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
57
61
|
return `<html><body>Requests from origin ${origin} not allowed</body></html>`;
|
|
58
62
|
};
|
|
59
63
|
const validateEditingSecret = (receivedSecret) => {
|
|
60
|
-
const editingSecret = (0,
|
|
64
|
+
const editingSecret = (0, utils_1.getEditingSecret)();
|
|
61
65
|
const secretIsvalid = editingSecret === receivedSecret;
|
|
62
66
|
if (!secretIsvalid) {
|
|
63
|
-
|
|
67
|
+
debug_1.default.editing('invalid editing secret - sent "%s" expected "%s"', receivedSecret, editingSecret);
|
|
64
68
|
}
|
|
65
69
|
return secretIsvalid;
|
|
66
70
|
};
|
|
@@ -76,7 +80,7 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
76
80
|
status: 401,
|
|
77
81
|
});
|
|
78
82
|
}
|
|
79
|
-
|
|
83
|
+
debug_1.default.editing('preflight request');
|
|
80
84
|
return new Response(null, { status: 204, headers: expectedCorsHeaders });
|
|
81
85
|
};
|
|
82
86
|
const GET = (req) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -87,7 +91,7 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
87
91
|
req.nextUrl.searchParams.forEach((value, key) => {
|
|
88
92
|
query[key] = value;
|
|
89
93
|
});
|
|
90
|
-
|
|
94
|
+
debug_1.default.editing('editing render handler start: %o', {
|
|
91
95
|
method,
|
|
92
96
|
query,
|
|
93
97
|
headers,
|
|
@@ -110,21 +114,28 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
110
114
|
draft.enable();
|
|
111
115
|
const startTimestamp = Date.now();
|
|
112
116
|
const mode = query.mode;
|
|
113
|
-
const requiredQueryParams = (0,
|
|
117
|
+
const requiredQueryParams = (0, utils_2.getRequiredEditingParamsList)(mode);
|
|
114
118
|
const missingQueryParams = requiredQueryParams.filter((param) => !query[param]);
|
|
119
|
+
const { allowedQueryParams, missingAllowedParams } = (0, utils_2.getAllowedQueryParams)(query, options.allowedQueryParams);
|
|
115
120
|
// Validate query parameters
|
|
116
|
-
if (missingQueryParams.length) {
|
|
117
|
-
|
|
121
|
+
if (missingQueryParams.length || missingAllowedParams.length) {
|
|
122
|
+
debug_1.default.editing('missing required query parameters: %o', [
|
|
123
|
+
...missingQueryParams,
|
|
124
|
+
...missingAllowedParams,
|
|
125
|
+
]);
|
|
118
126
|
return Response.json({
|
|
119
|
-
html: `<html><body>Missing required query parameters: ${
|
|
127
|
+
html: `<html><body>Missing required query parameters: ${[
|
|
128
|
+
...missingQueryParams,
|
|
129
|
+
...missingAllowedParams,
|
|
130
|
+
].join(', ')}</body></html>`,
|
|
120
131
|
}, { status: 400, headers: responseHeaders });
|
|
121
132
|
}
|
|
122
133
|
const encodedRoute = encodeURI(query.route);
|
|
123
134
|
const route = ((_a = options === null || options === void 0 ? void 0 : options.resolvePageUrl) === null || _a === void 0 ? void 0 : _a.call(options, encodedRoute)) || encodedRoute;
|
|
124
|
-
const base = (0,
|
|
135
|
+
const base = (0, utils_2.resolveServerUrl)(req);
|
|
125
136
|
const requestUrl = new URL(route, base);
|
|
126
137
|
// Restrict the page to be rendered only within the allowed origins
|
|
127
|
-
responseHeaders['Content-Security-Policy'] = (0,
|
|
138
|
+
responseHeaders['Content-Security-Policy'] = (0, utils_2.getCSPHeader)();
|
|
128
139
|
const cookieStore = yield getNextCookies();
|
|
129
140
|
cookieStore.set("__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */, ((_b = cookieStore.get("__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */)) === null || _b === void 0 ? void 0 : _b.value) || '', {
|
|
130
141
|
httpOnly: true,
|
|
@@ -149,17 +160,17 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
149
160
|
}
|
|
150
161
|
const convertedCookies = cookieStore.getAll().map((c) => `${c.name}=${c.value}`);
|
|
151
162
|
try {
|
|
152
|
-
|
|
163
|
+
debug_1.default.editing('fetching page route for %s', query.route);
|
|
153
164
|
// Get query string parameters to propagate on subsequent requests (e.g. for deployment protection bypass)
|
|
154
165
|
// Additionally ,in app router preview data is passed through query string instead of preview data cookie
|
|
155
|
-
const propagatedQsParams = Object.assign(Object.assign({}, (0,
|
|
166
|
+
const propagatedQsParams = Object.assign(Object.assign(Object.assign({}, (0, utils_2.getQueryParamsForPropagation)(query)), (0, utils_2.mapEditingParams)(query)), allowedQueryParams);
|
|
156
167
|
// Get headers to propagate on subsequent requests
|
|
157
|
-
const propagatedHeaders = (0,
|
|
158
|
-
const html = yield (0,
|
|
168
|
+
const propagatedHeaders = (0, utils_2.getHeadersForPropagation)(headers);
|
|
169
|
+
const html = yield (0, utils_2.getEditingRequestHtml)(requestUrl, propagatedQsParams, propagatedHeaders, convertedCookies, dataFetcher);
|
|
159
170
|
// remove nextjs preview cookies to not leak them to the browser
|
|
160
|
-
const filteredCookies = (0,
|
|
171
|
+
const filteredCookies = (0, utils_2.cleanupNextPreviewCookies)(convertedCookies);
|
|
161
172
|
responseHeaders['Set-Cookie'] = (filteredCookies === null || filteredCookies === void 0 ? void 0 : filteredCookies.join('; ')) || '';
|
|
162
|
-
|
|
173
|
+
debug_1.default.editing('editing render handler end in %dms: %o', Date.now() - startTimestamp, {
|
|
163
174
|
status: 200,
|
|
164
175
|
route,
|
|
165
176
|
});
|
|
@@ -167,9 +178,9 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
167
178
|
return new Response(html, { status: 200, headers: responseHeaders });
|
|
168
179
|
}
|
|
169
180
|
catch (err) {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
181
|
+
debug_1.default.editing('error fetching page route %s: %o', requestUrl, err);
|
|
182
|
+
debug_1.default.editing('falling back to redirect method... ');
|
|
183
|
+
debug_1.default.editing('editing render handler end in %dms: redirect %o', Date.now() - startTimestamp, {
|
|
173
184
|
status: 307,
|
|
174
185
|
route,
|
|
175
186
|
});
|
|
@@ -211,8 +222,8 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
211
222
|
req.nextUrl.searchParams.forEach((value, key) => {
|
|
212
223
|
query[key] = value;
|
|
213
224
|
});
|
|
214
|
-
const propagatedQsParams = Object.assign(Object.assign({}, (0,
|
|
215
|
-
const base = (0,
|
|
225
|
+
const propagatedQsParams = Object.assign(Object.assign(Object.assign({}, (0, utils_2.getQueryParamsForPropagation)(query)), (0, utils_2.mapEditingParams)(query)), (0, utils_2.getAllowedQueryParams)(query, options.allowedQueryParams).allowedQueryParams);
|
|
226
|
+
const base = (0, utils_2.resolveServerUrl)(req);
|
|
216
227
|
const targetUrl = new URL('/', base);
|
|
217
228
|
for (const key in propagatedQsParams) {
|
|
218
229
|
if ({}.hasOwnProperty.call(propagatedQsParams, key)) {
|
|
@@ -251,13 +262,13 @@ const createEditingRenderRouteHandlers = (options) => {
|
|
|
251
262
|
}
|
|
252
263
|
});
|
|
253
264
|
// Restrict the page to be rendered only within the allowed origins
|
|
254
|
-
filteredHeaders.set('Content-Security-Policy', (0,
|
|
265
|
+
filteredHeaders.set('Content-Security-Policy', (0, utils_2.getCSPHeader)());
|
|
255
266
|
// add expected CORS headers to response
|
|
256
267
|
Object.entries(expectedCorsHeaders !== null && expectedCorsHeaders !== void 0 ? expectedCorsHeaders : {}).forEach(([key, value]) => {
|
|
257
268
|
filteredHeaders.set(key, value);
|
|
258
269
|
});
|
|
259
270
|
// remove nextjs preview cookies to not leak them to the browser
|
|
260
|
-
const filteredCookies = (0,
|
|
271
|
+
const filteredCookies = (0, utils_2.cleanupNextPreviewCookies)(filteredHeaders.get('Set-Cookie'));
|
|
261
272
|
filteredHeaders.set('Set-Cookie', (filteredCookies === null || filteredCookies === void 0 ? void 0 : filteredCookies.join('; ')) || '');
|
|
262
273
|
return new Response(forwardedResponse.data, {
|
|
263
274
|
status: forwardedResponse.status,
|