@sitecore-content-sdk/nextjs 1.4.0-canary.15 → 1.4.0-canary.17
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/dist/cjs/client/sitecore-nextjs-client.js +1 -1
- package/dist/cjs/components/RichText.js +1 -1
- package/dist/cjs/editing/feaas-render-middleware.js +1 -1
- 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 +26 -0
- package/dist/cjs/{middleware/locale-middleware.js → proxy/locale-proxy.js} +13 -13
- package/dist/cjs/{middleware/multisite-middleware.js → proxy/multisite-proxy.js} +16 -16
- package/dist/cjs/{middleware/personalize-middleware.js → proxy/personalize-proxy.js} +18 -18
- package/dist/cjs/{middleware/middleware.js → proxy/proxy.js} +25 -25
- package/dist/cjs/{middleware/redirects-middleware.js → proxy/redirects-proxy.js} +32 -26
- package/dist/cjs/route-handler/robots-route-handler.js +6 -1
- package/dist/cjs/route-handler/sitemap-route-handler.js +6 -1
- package/dist/cjs/utils/utils.js +2 -2
- package/dist/esm/client/sitecore-nextjs-client.js +1 -1
- package/dist/esm/components/RichText.js +1 -1
- package/dist/esm/editing/feaas-render-middleware.js +1 -1
- 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} +10 -10
- package/dist/esm/{middleware/multisite-middleware.js → proxy/multisite-proxy.js} +13 -13
- package/dist/esm/{middleware/personalize-middleware.js → proxy/personalize-proxy.js} +15 -15
- package/dist/esm/{middleware/middleware.js → proxy/proxy.js} +21 -21
- package/dist/esm/{middleware/redirects-middleware.js → proxy/redirects-proxy.js} +28 -22
- package/dist/esm/route-handler/robots-route-handler.js +6 -1
- package/dist/esm/route-handler/sitemap-route-handler.js +6 -1
- package/dist/esm/utils/utils.js +1 -1
- package/package.json +12 -7
- package/proxy.d.ts +1 -0
- package/types/components/RichText.d.ts.map +1 -1
- package/types/editing/editing-config-middleware.d.ts.map +1 -1
- package/types/editing/feaas-render-middleware.d.ts +1 -1
- package/types/middleware/index.d.ts +0 -9
- package/types/middleware/index.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} +9 -9
- package/types/proxy/personalize-proxy.d.ts.map +1 -0
- package/types/{middleware/middleware.d.ts → proxy/proxy.d.ts} +22 -24
- package/types/proxy/proxy.d.ts.map +1 -0
- package/types/{middleware/redirects-middleware.d.ts → proxy/redirects-proxy.d.ts} +10 -10
- package/types/proxy/redirects-proxy.d.ts.map +1 -0
- package/types/route-handler/robots-route-handler.d.ts.map +1 -1
- package/types/route-handler/sitemap-route-handler.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.
|
|
15
|
+
exports.RedirectsProxy = void 0;
|
|
16
16
|
const core_1 = require("@sitecore-content-sdk/core");
|
|
17
17
|
const site_1 = require("@sitecore-content-sdk/core/site");
|
|
18
18
|
const utils_1 = require("@sitecore-content-sdk/core/utils");
|
|
19
19
|
const server_1 = require("next/server");
|
|
20
20
|
const regex_parser_1 = __importDefault(require("regex-parser"));
|
|
21
|
-
const
|
|
21
|
+
const proxy_1 = require("./proxy");
|
|
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
|
-
core_1.debug.redirects('skipped (redirects
|
|
38
|
+
core_1.debug.redirects('skipped (redirects proxy is disabled globally)');
|
|
40
39
|
return res;
|
|
41
40
|
}
|
|
42
41
|
try {
|
|
@@ -45,13 +44,13 @@ 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
|
-
core_1.debug.redirects('redirects
|
|
47
|
+
core_1.debug.redirects('redirects proxy start: %o', {
|
|
49
48
|
pathname,
|
|
50
49
|
language,
|
|
51
50
|
hostname,
|
|
52
51
|
});
|
|
53
52
|
if (this.disabled(req, res)) {
|
|
54
|
-
core_1.debug.redirects('skipped (redirects
|
|
53
|
+
core_1.debug.redirects('skipped (redirects proxy is disabled)');
|
|
55
54
|
return res;
|
|
56
55
|
}
|
|
57
56
|
const isAppRouterRequest = this.isAppRouter(res);
|
|
@@ -61,10 +60,10 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
61
60
|
return false;
|
|
62
61
|
}
|
|
63
62
|
// Skip prefetch requests from Next.js, which are not original client requests
|
|
64
|
-
// as they load unnecessary requests that burden the redirects
|
|
63
|
+
// as they load unnecessary requests that burden the redirects proxy with meaningless traffic
|
|
65
64
|
if (this.isPrefetch(req)) {
|
|
66
65
|
core_1.debug.redirects('skipped (prefetch)');
|
|
67
|
-
res.headers.set('x-
|
|
66
|
+
res.headers.set('x-proxy-cache', 'no-cache');
|
|
68
67
|
res.headers.set('Cache-Control', 'no-store, must-revalidate');
|
|
69
68
|
return false;
|
|
70
69
|
}
|
|
@@ -141,7 +140,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
141
140
|
const redirectedResponse = REGEXP_ABSOLUTE_URL.test(existsRedirect.target)
|
|
142
141
|
? processAbsoluteUrlTarget(reqUrl, existsRedirect)
|
|
143
142
|
: processRelativeUrlTarget(reqUrl, existsRedirect);
|
|
144
|
-
core_1.debug.redirects('redirects
|
|
143
|
+
core_1.debug.redirects('redirects proxy end in %dms: %o', Date.now() - startTimestamp, {
|
|
145
144
|
redirected: redirectedResponse.redirected,
|
|
146
145
|
status: redirectedResponse.status,
|
|
147
146
|
url: redirectedResponse.url,
|
|
@@ -150,17 +149,22 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
150
149
|
return redirectedResponse;
|
|
151
150
|
}
|
|
152
151
|
catch (error) {
|
|
153
|
-
console.log('Redirect
|
|
152
|
+
console.log('Redirect proxy failed:');
|
|
154
153
|
console.log(error);
|
|
155
154
|
return res;
|
|
156
155
|
}
|
|
157
156
|
});
|
|
158
157
|
this.locales = config.locales;
|
|
158
|
+
// If redirectsService is provided directly (e.g., for testing), use it
|
|
159
|
+
if (this.config.redirectsService) {
|
|
160
|
+
this.redirectsService = this.config.redirectsService;
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
159
163
|
// Validate API config is present - redirects requires either Edge or local API configuration
|
|
160
164
|
const hasEdgeConfig = !!(this.config.contextId || this.config.clientContextId);
|
|
161
165
|
const hasLocalConfig = !!(this.config.apiHost && this.config.apiKey);
|
|
162
166
|
if (!hasEdgeConfig && !hasLocalConfig) {
|
|
163
|
-
console.warn('[
|
|
167
|
+
console.warn('[RedirectsProxy] Redirects proxy requires either Edge configuration (contextId/clientContextId) or local API configuration (apiHost/apiKey). ' +
|
|
164
168
|
'Redirects features will be disabled. This is expected when API configuration is not available.');
|
|
165
169
|
// Set to null to indicate service is disabled
|
|
166
170
|
this.redirectsService = null;
|
|
@@ -183,16 +187,16 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
183
187
|
};
|
|
184
188
|
// NOTE: we provide native fetch for compatibility on Next.js Edge Runtime
|
|
185
189
|
// (underlying default 'cross-fetch' is not currently compatible: https://github.com/lquixada/cross-fetch/issues/78)
|
|
186
|
-
this.redirectsService =
|
|
187
|
-
(_a = this.config.redirectsService) !== null && _a !== void 0 ? _a : new site_1.RedirectsService(Object.assign(Object.assign({}, config), { clientFactory: this.getClientFactory(graphQLOptions), fetch: fetch }));
|
|
190
|
+
this.redirectsService = new site_1.RedirectsService(Object.assign(Object.assign({}, config), { clientFactory: this.getClientFactory(graphQLOptions), fetch: fetch }));
|
|
188
191
|
}
|
|
189
192
|
disabled(req, res) {
|
|
190
|
-
// Check if API config is missing - if so, disable the
|
|
193
|
+
// Check if API config is missing - if so, disable the proxy
|
|
191
194
|
if (!this.redirectsService) {
|
|
192
195
|
core_1.debug.redirects('skipped (redirects service not configured - API config required)');
|
|
193
196
|
return true;
|
|
194
197
|
}
|
|
195
|
-
|
|
198
|
+
// ignore files
|
|
199
|
+
return req.nextUrl.pathname.includes('.') || super.disabled(req, res);
|
|
196
200
|
}
|
|
197
201
|
/**
|
|
198
202
|
* Method returns RedirectInfo when matches
|
|
@@ -281,7 +285,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
281
285
|
/**
|
|
282
286
|
* Remove special parameters(Next.JS)
|
|
283
287
|
* Example: /about/contact/us
|
|
284
|
-
* When a user clicks on this link, Next.js should generate a link for the
|
|
288
|
+
* When a user clicks on this link, Next.js should generate a link for the proxy, formatted like this:
|
|
285
289
|
* http://host/about/contact/us?path=about&path=contact&path=us
|
|
286
290
|
*/
|
|
287
291
|
const newQueryString = url.search
|
|
@@ -333,7 +337,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
333
337
|
}
|
|
334
338
|
// Check if it has a site prefix
|
|
335
339
|
// If so, preserve it for the redirect target to maintain proper routing
|
|
336
|
-
const incomingRewrite = res === null || res === void 0 ? void 0 : res.headers.get(
|
|
340
|
+
const incomingRewrite = res === null || res === void 0 ? void 0 : res.headers.get(proxy_1.REWRITE_HEADER_NAME);
|
|
337
341
|
if (incomingRewrite && !isExternal) {
|
|
338
342
|
// Extract locale from target path
|
|
339
343
|
const targetPathParts = rewritePath.split('/').filter(Boolean);
|
|
@@ -355,7 +359,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
355
359
|
}
|
|
356
360
|
}
|
|
357
361
|
/**
|
|
358
|
-
* Helper function to create a redirect response and remove the x-
|
|
362
|
+
* Helper function to create a redirect response and remove the x-proxy-next header.
|
|
359
363
|
* @param {NextURL | string} url The URL to redirect to.
|
|
360
364
|
* @param {Response} res The response object.
|
|
361
365
|
* @param {number} status The HTTP status code of the redirect.
|
|
@@ -363,17 +367,19 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
363
367
|
* @returns {NextResponse<unknown>} The redirect response.
|
|
364
368
|
*/
|
|
365
369
|
createRedirectResponse(url, res, status, statusText) {
|
|
366
|
-
|
|
370
|
+
// Convert NextURL to string if needed - NextResponse.redirect requires a string URL
|
|
371
|
+
const urlString = typeof url === 'string' ? url : url.href;
|
|
372
|
+
const redirect = server_1.NextResponse.redirect(urlString, {
|
|
367
373
|
status,
|
|
368
374
|
statusText,
|
|
369
375
|
headers: res === null || res === void 0 ? void 0 : res.headers,
|
|
370
376
|
});
|
|
371
377
|
if (res === null || res === void 0 ? void 0 : res.headers) {
|
|
372
|
-
redirect.headers.delete('x-
|
|
373
|
-
redirect.headers.delete('x-
|
|
374
|
-
redirect.headers.delete(
|
|
378
|
+
redirect.headers.delete('x-proxy-next');
|
|
379
|
+
redirect.headers.delete('x-proxy-rewrite');
|
|
380
|
+
redirect.headers.delete(proxy_1.REWRITE_HEADER_NAME);
|
|
375
381
|
}
|
|
376
382
|
return redirect;
|
|
377
383
|
}
|
|
378
384
|
}
|
|
379
|
-
exports.
|
|
385
|
+
exports.RedirectsProxy = RedirectsProxy;
|
|
@@ -31,11 +31,12 @@ const createRobotsRouteHandler = (options) => {
|
|
|
31
31
|
const GET = (req) => __awaiter(void 0, void 0, void 0, function* () {
|
|
32
32
|
var _a;
|
|
33
33
|
try {
|
|
34
|
-
const startTimestamp = Date.now();
|
|
35
34
|
const hostName = req.headers.get('x-forwarded-host') ||
|
|
36
35
|
((_a = req.headers.get('host')) === null || _a === void 0 ? void 0 : _a.split(':')[0]) ||
|
|
37
36
|
'localhost';
|
|
38
37
|
const site = siteResolver.getByHost(hostName);
|
|
38
|
+
// Access request data first, then capture timestamp for Next.js 16 compatibility
|
|
39
|
+
const startTimestamp = Date.now();
|
|
39
40
|
core_1.debug.robots('robots route handler start: %o', {
|
|
40
41
|
hostName,
|
|
41
42
|
siteName: site.name,
|
|
@@ -59,6 +60,10 @@ const createRobotsRouteHandler = (options) => {
|
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
catch (error) {
|
|
63
|
+
// Re-throw prerender bail-out errors so Next.js can handle them properly
|
|
64
|
+
if (error instanceof Error && error.digest === 'NEXT_PRERENDER_INTERRUPTED') {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
62
67
|
console.log('Robots route handler failed:');
|
|
63
68
|
console.log(error);
|
|
64
69
|
return new Response('Internal Server Error', {
|
|
@@ -38,8 +38,9 @@ function createSitemapRouteHandler(options) {
|
|
|
38
38
|
});
|
|
39
39
|
const GET = (req) => __awaiter(this, void 0, void 0, function* () {
|
|
40
40
|
try {
|
|
41
|
-
const startTimestamp = Date.now();
|
|
42
41
|
const options = getOptions(req);
|
|
42
|
+
// Access request data first, then capture timestamp for Next.js 16 compatibility
|
|
43
|
+
const startTimestamp = Date.now();
|
|
43
44
|
core_1.debug.sitemap('sitemap route handler start: %o', {
|
|
44
45
|
options,
|
|
45
46
|
});
|
|
@@ -52,6 +53,10 @@ function createSitemapRouteHandler(options) {
|
|
|
52
53
|
});
|
|
53
54
|
}
|
|
54
55
|
catch (error) {
|
|
56
|
+
// Re-throw prerender bail-out errors so Next.js can handle them properly
|
|
57
|
+
if (error instanceof Error && error.digest === 'NEXT_PRERENDER_INTERRUPTED') {
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
55
60
|
console.log('Sitemap route handler failed:');
|
|
56
61
|
console.log(error);
|
|
57
62
|
if (error instanceof Error && error.message === 'REDIRECT_404') {
|
package/dist/cjs/utils/utils.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseRewriteHeader = exports.isServerSidePropsContext = exports.extractPath = exports.getEditingSecret = exports.handleEditorFastRefresh = void 0;
|
|
4
4
|
const editing_1 = require("@sitecore-content-sdk/core/editing");
|
|
5
|
-
const
|
|
5
|
+
const proxy_1 = require("../proxy/proxy");
|
|
6
6
|
/**
|
|
7
7
|
* Since Sitecore editors do not support Fast Refresh:
|
|
8
8
|
* 1. Subscribe on events provided by webpack.
|
|
@@ -73,7 +73,7 @@ exports.isServerSidePropsContext = isServerSidePropsContext;
|
|
|
73
73
|
* @public
|
|
74
74
|
*/
|
|
75
75
|
const parseRewriteHeader = (headers) => {
|
|
76
|
-
const rewriteHeader = headers.get(
|
|
76
|
+
const rewriteHeader = headers.get(proxy_1.REWRITE_HEADER_NAME);
|
|
77
77
|
const rewriteSegments = (rewriteHeader === null || rewriteHeader === void 0 ? void 0 : rewriteHeader.split('/').filter((segment) => segment)) || [];
|
|
78
78
|
const site = rewriteSegments[0];
|
|
79
79
|
const locale = rewriteSegments[1];
|
|
@@ -28,7 +28,7 @@ export class SitecoreNextjsClient extends SitecoreClient {
|
|
|
28
28
|
*/
|
|
29
29
|
getSiteNameFromPath(path) {
|
|
30
30
|
const resolvedPath = super.parsePath(path);
|
|
31
|
-
// Get site name (from path rewritten in
|
|
31
|
+
// Get site name (from path rewritten in proxy)
|
|
32
32
|
const siteData = getSiteRewriteData(resolvedPath, this.initOptions.defaultSite);
|
|
33
33
|
return siteData.siteName;
|
|
34
34
|
}
|
|
@@ -91,6 +91,6 @@ export const RichText = (props) => {
|
|
|
91
91
|
link.addEventListener('click', routeHandler, false);
|
|
92
92
|
});
|
|
93
93
|
};
|
|
94
|
-
return React.createElement(ReactRichText, Object.assign({ ref: richTextRef, editable: editable }, rest));
|
|
94
|
+
return (React.createElement(ReactRichText, Object.assign({ ref: richTextRef, editable: editable }, rest)));
|
|
95
95
|
};
|
|
96
96
|
RichText.displayName = 'NextRichText';
|
|
@@ -19,7 +19,7 @@ import { enforceCors } from '@sitecore-content-sdk/core/utils';
|
|
|
19
19
|
*/
|
|
20
20
|
export class FEAASRenderMiddleware extends RenderMiddlewareBase {
|
|
21
21
|
/**
|
|
22
|
-
* @param {
|
|
22
|
+
* @param {FEAASRenderMiddlewareConfig} [config] FEAAS render middleware config
|
|
23
23
|
*/
|
|
24
24
|
constructor(config) {
|
|
25
25
|
var _a;
|
|
@@ -1,11 +1,2 @@
|
|
|
1
|
-
export { debug } from '@sitecore-content-sdk/core';
|
|
2
|
-
export { MiddlewareBase, Middleware, defineMiddleware } from './middleware';
|
|
3
|
-
export { RedirectsMiddleware } from './redirects-middleware';
|
|
4
|
-
export { PersonalizeMiddleware } from './personalize-middleware';
|
|
5
|
-
export { MultisiteMiddleware } from './multisite-middleware';
|
|
6
|
-
export { AppRouterMultisiteMiddleware } from './app-router-multisite-middleware';
|
|
7
1
|
export { SitemapMiddleware } from './sitemap-middleware';
|
|
8
2
|
export { RobotsMiddleware } from './robots-middleware';
|
|
9
|
-
export { LocaleMiddleware } from './locale-middleware';
|
|
10
|
-
export { PersonalizeService, } from '@sitecore-content-sdk/core/personalize';
|
|
11
|
-
export { RedirectsService, REDIRECT_TYPE_301, REDIRECT_TYPE_302, REDIRECT_TYPE_SERVER_TRANSFER, } from '@sitecore-content-sdk/core/site';
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MultisiteProxy } from './multisite-proxy';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Proxy/handler for enabling multisite support in the Next.js App Router.
|
|
4
4
|
* @public
|
|
5
5
|
*/
|
|
6
|
-
export class
|
|
6
|
+
export class AppRouterMultisiteProxy extends MultisiteProxy {
|
|
7
7
|
/**
|
|
8
8
|
* Warns when multisite is disabled in App Router.
|
|
9
|
-
* The
|
|
9
|
+
* The proxy will still run to prevent routing errors.
|
|
10
10
|
* @param {NextResponse} _res response (unused, kept for method signature compatibility)
|
|
11
11
|
*/
|
|
12
12
|
// eslint-disable-next-line no-unused-vars
|
|
13
13
|
shouldWarnWhenDisabled(_res) {
|
|
14
|
-
console.warn('⚠️ Warning: Multisite is disabled in App Router configuration, but the
|
|
14
|
+
console.warn('⚠️ Warning: Multisite is disabled in App Router configuration, but the proxy will continue running. ' +
|
|
15
15
|
'Disabling multisite in App Router would cause 404 errors for regular page requests because the route structure requires the [site] segment. ' +
|
|
16
16
|
'Preview/Editing modes will still work. ' +
|
|
17
17
|
'For single-site setups, keep multisite enabled and configure only one site.');
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* In App Router, we cannot skip the
|
|
20
|
+
* In App Router, we cannot skip the proxy even if enabled is false,
|
|
21
21
|
* because the route structure requires the [site] segment.
|
|
22
22
|
* @returns {boolean} always returns false (never skip) for App Router
|
|
23
23
|
*/
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { debug } from '@sitecore-content-sdk/core';
|
|
2
|
+
export { ProxyBase, ProxyHandler, defineProxy } from './proxy';
|
|
3
|
+
export { RedirectsProxy } from './redirects-proxy';
|
|
4
|
+
export { PersonalizeProxy } from './personalize-proxy';
|
|
5
|
+
export { MultisiteProxy } from './multisite-proxy';
|
|
6
|
+
export { AppRouterMultisiteProxy } from './app-router-multisite-proxy';
|
|
7
|
+
export { LocaleProxy } from './locale-proxy';
|
|
8
|
+
export { PersonalizeService, } from '@sitecore-content-sdk/core/personalize';
|
|
9
|
+
export { RedirectsService, REDIRECT_TYPE_301, REDIRECT_TYPE_302, REDIRECT_TYPE_SERVER_TRANSFER, } from '@sitecore-content-sdk/core/site';
|
|
@@ -10,16 +10,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
import { debug } from '@sitecore-content-sdk/core';
|
|
12
12
|
import { getLocaleRewrite } from '@sitecore-content-sdk/core/i18n';
|
|
13
|
-
import {
|
|
13
|
+
import { ProxyBase, LOCALE_HEADER_NAME } from './proxy';
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
* This
|
|
15
|
+
* Proxy/handler for handling locale-based routing in the Next.js App Router.
|
|
16
|
+
* This proxy is responsible for extracting the locale from the request path and rewriting it if necessary.
|
|
17
17
|
* It also sets the locale header in the response.
|
|
18
18
|
* @public
|
|
19
19
|
*/
|
|
20
|
-
export class
|
|
20
|
+
export class LocaleProxy extends ProxyBase {
|
|
21
21
|
/**
|
|
22
|
-
* @param {
|
|
22
|
+
* @param {LocaleProxyConfig} config Locale proxy config
|
|
23
23
|
*/
|
|
24
24
|
constructor(config) {
|
|
25
25
|
super(config);
|
|
@@ -29,12 +29,12 @@ export class LocaleMiddleware extends MiddlewareBase {
|
|
|
29
29
|
const { pathname } = req.nextUrl;
|
|
30
30
|
const localeFromPath = this.getLocaleFromPath(pathname);
|
|
31
31
|
const locale = localeFromPath || this.getLanguage(req, res);
|
|
32
|
-
debug.locale('locale
|
|
32
|
+
debug.locale('locale proxy start: %o', {
|
|
33
33
|
pathname,
|
|
34
34
|
locale,
|
|
35
35
|
});
|
|
36
36
|
if (this.disabled(req, res)) {
|
|
37
|
-
debug.locale('skipped (locale
|
|
37
|
+
debug.locale('skipped (locale proxy is disabled)');
|
|
38
38
|
return res;
|
|
39
39
|
}
|
|
40
40
|
if (!localeFromPath) {
|
|
@@ -42,7 +42,7 @@ export class LocaleMiddleware extends MiddlewareBase {
|
|
|
42
42
|
const rewritePath = getLocaleRewrite(pathname, locale);
|
|
43
43
|
const response = this.rewrite(rewritePath, req, res);
|
|
44
44
|
this.setLocaleHeader(response, locale);
|
|
45
|
-
debug.locale('locale
|
|
45
|
+
debug.locale('locale proxy end, with rewrite: %o', {
|
|
46
46
|
pathname,
|
|
47
47
|
locale,
|
|
48
48
|
rewritePath,
|
|
@@ -50,14 +50,14 @@ export class LocaleMiddleware extends MiddlewareBase {
|
|
|
50
50
|
return response;
|
|
51
51
|
}
|
|
52
52
|
this.setLocaleHeader(res, locale);
|
|
53
|
-
debug.locale('locale
|
|
53
|
+
debug.locale('locale proxy end, no rewrite: %o', {
|
|
54
54
|
pathname,
|
|
55
55
|
locale,
|
|
56
56
|
});
|
|
57
57
|
return res;
|
|
58
58
|
}
|
|
59
59
|
catch (error) {
|
|
60
|
-
console.log('Locale
|
|
60
|
+
console.log('Locale proxy failed:');
|
|
61
61
|
console.log(error);
|
|
62
62
|
return res;
|
|
63
63
|
}
|
|
@@ -10,15 +10,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
import { getSiteRewrite, SITE_KEY } from '@sitecore-content-sdk/core/site';
|
|
12
12
|
import { debug } from '@sitecore-content-sdk/core';
|
|
13
|
-
import {
|
|
13
|
+
import { ProxyBase, REWRITE_HEADER_NAME } from './proxy';
|
|
14
14
|
import { PREVIEW_KEY } from '@sitecore-content-sdk/core/editing';
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Proxy / handler for multisite support
|
|
17
17
|
* @public
|
|
18
18
|
*/
|
|
19
|
-
export class
|
|
19
|
+
export class MultisiteProxy extends ProxyBase {
|
|
20
20
|
/**
|
|
21
|
-
* @param {
|
|
21
|
+
* @param {MultisiteProxyConfig} [config] Multisite proxy config
|
|
22
22
|
*/
|
|
23
23
|
constructor(config) {
|
|
24
24
|
super(config);
|
|
@@ -26,12 +26,12 @@ export class MultisiteMiddleware extends MiddlewareBase {
|
|
|
26
26
|
this.handle = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
27
27
|
var _a, _b, _c;
|
|
28
28
|
try {
|
|
29
|
-
// Path can be rewritten by previously executed
|
|
29
|
+
// Path can be rewritten by previously executed proxy
|
|
30
30
|
const pathname = (res === null || res === void 0 ? void 0 : res.headers.get(REWRITE_HEADER_NAME)) || req.nextUrl.pathname;
|
|
31
31
|
const language = this.getLanguage(req, res);
|
|
32
32
|
const hostname = this.getHostHeader(req) || this.defaultHostname;
|
|
33
33
|
const startTimestamp = Date.now();
|
|
34
|
-
debug.multisite('multisite
|
|
34
|
+
debug.multisite('multisite proxy start: %o', {
|
|
35
35
|
pathname,
|
|
36
36
|
language,
|
|
37
37
|
hostname,
|
|
@@ -50,13 +50,13 @@ export class MultisiteMiddleware extends MiddlewareBase {
|
|
|
50
50
|
if (!this.config.enabled) {
|
|
51
51
|
this.shouldWarnWhenDisabled(res);
|
|
52
52
|
if (this.shouldSkipWhenDisabled()) {
|
|
53
|
-
debug.multisite('skipped (multisite
|
|
53
|
+
debug.multisite('skipped (multisite proxy is disabled globally)');
|
|
54
54
|
return res;
|
|
55
55
|
}
|
|
56
56
|
// Continue execution if shouldSkipWhenDisabled returns false (App Router case)
|
|
57
57
|
}
|
|
58
58
|
if (this.disabled(req, res)) {
|
|
59
|
-
debug.multisite('skipped (multisite
|
|
59
|
+
debug.multisite('skipped (multisite proxy is disabled)');
|
|
60
60
|
return res;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
@@ -86,9 +86,9 @@ export class MultisiteMiddleware extends MiddlewareBase {
|
|
|
86
86
|
httpOnly: true,
|
|
87
87
|
sameSite: 'none',
|
|
88
88
|
};
|
|
89
|
-
// Share site name with the following executed
|
|
89
|
+
// Share site name with the following executed proxies
|
|
90
90
|
response.cookies.set(SITE_KEY, siteName, defaultCookieAttributes);
|
|
91
|
-
debug.multisite('multisite
|
|
91
|
+
debug.multisite('multisite proxy end in %dms: %o', Date.now() - startTimestamp, {
|
|
92
92
|
rewritePath,
|
|
93
93
|
siteName,
|
|
94
94
|
headers: this.extractDebugHeaders(response.headers),
|
|
@@ -97,7 +97,7 @@ export class MultisiteMiddleware extends MiddlewareBase {
|
|
|
97
97
|
return response;
|
|
98
98
|
}
|
|
99
99
|
catch (error) {
|
|
100
|
-
console.log('Multisite
|
|
100
|
+
console.log('Multisite proxy failed:');
|
|
101
101
|
console.log(error);
|
|
102
102
|
return res;
|
|
103
103
|
}
|
|
@@ -116,9 +116,9 @@ export class MultisiteMiddleware extends MiddlewareBase {
|
|
|
116
116
|
// Base implementation does nothing - subclasses can override to show warnings
|
|
117
117
|
}
|
|
118
118
|
/**
|
|
119
|
-
* Determines if
|
|
119
|
+
* Determines if proxy should be skipped when multisite is disabled.
|
|
120
120
|
* Override in subclasses to provide router-specific behavior.
|
|
121
|
-
* @returns {boolean} true if
|
|
121
|
+
* @returns {boolean} true if proxy should be skipped when disabled
|
|
122
122
|
*/
|
|
123
123
|
shouldSkipWhenDisabled() {
|
|
124
124
|
return true; // Base class skips when disabled
|
|
@@ -9,16 +9,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { PersonalizeService, getPersonalizedRewrite, CdpHelper, DEFAULT_VARIANT, } from '@sitecore-content-sdk/core/personalize';
|
|
11
11
|
import { debug } from '@sitecore-content-sdk/core';
|
|
12
|
-
import {
|
|
12
|
+
import { ProxyBase, REWRITE_HEADER_NAME } from './proxy';
|
|
13
13
|
import { CloudSDK } from '@sitecore-cloudsdk/core/server';
|
|
14
14
|
import { personalize } from '@sitecore-cloudsdk/personalize/server';
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* Proxy / handler to support Sitecore Personalize
|
|
17
17
|
* @public
|
|
18
18
|
*/
|
|
19
|
-
export class
|
|
19
|
+
export class PersonalizeProxy extends ProxyBase {
|
|
20
20
|
/**
|
|
21
|
-
* @param {
|
|
21
|
+
* @param {PersonalizeProxyConfig} [config] Personalize proxy config
|
|
22
22
|
*/
|
|
23
23
|
constructor(config) {
|
|
24
24
|
var _a;
|
|
@@ -26,7 +26,7 @@ export class PersonalizeMiddleware extends MiddlewareBase {
|
|
|
26
26
|
this.config = config;
|
|
27
27
|
this.handle = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
28
28
|
if (!this.config.enabled) {
|
|
29
|
-
debug.personalize('skipped (personalize
|
|
29
|
+
debug.personalize('skipped (personalize proxy is disabled globally)');
|
|
30
30
|
return res;
|
|
31
31
|
}
|
|
32
32
|
try {
|
|
@@ -38,11 +38,11 @@ export class PersonalizeMiddleware extends MiddlewareBase {
|
|
|
38
38
|
const geo = this.config.extractGeoDataCb
|
|
39
39
|
? yield this.config.extractGeoDataCb(req)
|
|
40
40
|
: undefined;
|
|
41
|
-
debug.personalize('personalize
|
|
41
|
+
debug.personalize('personalize proxy start: %o', Object.assign(Object.assign({ pathname,
|
|
42
42
|
language,
|
|
43
43
|
hostname }, (geo && { geo })), { headers: this.extractDebugHeaders(req.headers) }));
|
|
44
44
|
if (this.disabled(req, res)) {
|
|
45
|
-
debug.personalize('skipped (personalize
|
|
45
|
+
debug.personalize('skipped (personalize proxy is disabled)');
|
|
46
46
|
return res;
|
|
47
47
|
}
|
|
48
48
|
if (res.redirected || // Don't attempt to personalize a redirect
|
|
@@ -72,8 +72,8 @@ export class PersonalizeMiddleware extends MiddlewareBase {
|
|
|
72
72
|
// Personalized, but this is a prefetch request.
|
|
73
73
|
// In this case, don't execute a personalize request; otherwise, the metrics for component A/B experiments would be inaccurate.
|
|
74
74
|
// Disable preflight caching to force revalidation on client-side navigation (personalization WILL be influenced).
|
|
75
|
-
// Note the reason we don't move this any earlier in the
|
|
76
|
-
res.headers.set('x-
|
|
75
|
+
// Note the reason we don't move this any earlier in the proxy is that we would then be sacrificing performance for non-personalized pages.
|
|
76
|
+
res.headers.set('x-proxy-cache', 'no-cache');
|
|
77
77
|
res.headers.set('Cache-Control', 'no-store, must-revalidate');
|
|
78
78
|
return res;
|
|
79
79
|
}
|
|
@@ -102,29 +102,29 @@ export class PersonalizeMiddleware extends MiddlewareBase {
|
|
|
102
102
|
debug.personalize('skipped (no variant(s) identified)');
|
|
103
103
|
return res;
|
|
104
104
|
}
|
|
105
|
-
// Path can be rewritten by previously executed
|
|
105
|
+
// Path can be rewritten by previously executed proxy
|
|
106
106
|
const basePath = (res === null || res === void 0 ? void 0 : res.headers.get(REWRITE_HEADER_NAME)) || pathname;
|
|
107
107
|
// Rewrite to persononalized path
|
|
108
108
|
const rewritePath = getPersonalizedRewrite(basePath, identifiedVariantIds);
|
|
109
109
|
const response = this.rewrite(rewritePath, req, res);
|
|
110
110
|
// Disable preflight caching to force revalidation on client-side navigation (personalization MAY be influenced).
|
|
111
111
|
// See https://github.com/vercel/next.js/pull/32767
|
|
112
|
-
response.headers.set('x-
|
|
113
|
-
debug.personalize('personalize
|
|
112
|
+
response.headers.set('x-proxy-cache', 'no-cache');
|
|
113
|
+
debug.personalize('personalize proxy end in %dms: %o', Date.now() - startTimestamp, {
|
|
114
114
|
rewritePath,
|
|
115
115
|
headers: this.extractDebugHeaders(response.headers),
|
|
116
116
|
});
|
|
117
117
|
return response;
|
|
118
118
|
}
|
|
119
119
|
catch (error) {
|
|
120
|
-
console.log('Personalize
|
|
120
|
+
console.log('Personalize proxy failed:');
|
|
121
121
|
console.log(error);
|
|
122
122
|
return res;
|
|
123
123
|
}
|
|
124
124
|
});
|
|
125
125
|
// Validate edge config is present - personalize requires Edge platform
|
|
126
126
|
if (!this.config.contextId && !this.config.clientContextId) {
|
|
127
|
-
console.warn('[
|
|
127
|
+
console.warn('[PersonalizeProxy] Personalize proxy requires Edge configuration (contextId/clientContextId). ' +
|
|
128
128
|
'Personalize features will be disabled. This is expected in local container development.');
|
|
129
129
|
// Set to null to indicate service is disabled
|
|
130
130
|
this.personalizeService = null;
|
|
@@ -150,7 +150,7 @@ export class PersonalizeMiddleware extends MiddlewareBase {
|
|
|
150
150
|
});
|
|
151
151
|
}
|
|
152
152
|
disabled(req, res) {
|
|
153
|
-
// Check if API config is missing - if so, disable the
|
|
153
|
+
// Check if API config is missing - if so, disable the proxy
|
|
154
154
|
if (!this.personalizeService) {
|
|
155
155
|
debug.personalize('skipped (personalize service not configured - edge config required)');
|
|
156
156
|
return true;
|