@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,80 +1,81 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
import { debug } from '@sitecore-content-sdk/core';
|
|
12
|
-
import { getLocaleRewrite } from '@sitecore-content-sdk/core/i18n';
|
|
13
|
-
import { MiddlewareBase, LOCALE_HEADER_NAME } from './middleware';
|
|
14
|
-
/**
|
|
15
|
-
* Middleware/handler for handling locale-based routing in the Next.js App Router.
|
|
16
|
-
* This middleware is responsible for extracting the locale from the request path and rewriting it if necessary.
|
|
17
|
-
* It also sets the locale header in the response.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
this.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
console.log(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
*
|
|
72
|
-
* @
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
import { debug } from '@sitecore-content-sdk/core';
|
|
12
|
+
import { getLocaleRewrite } from '@sitecore-content-sdk/core/i18n';
|
|
13
|
+
import { MiddlewareBase, LOCALE_HEADER_NAME } from './middleware';
|
|
14
|
+
/**
|
|
15
|
+
* Middleware/handler for handling locale-based routing in the Next.js App Router.
|
|
16
|
+
* This middleware is responsible for extracting the locale from the request path and rewriting it if necessary.
|
|
17
|
+
* It also sets the locale header in the response.
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
export class LocaleMiddleware extends MiddlewareBase {
|
|
21
|
+
/**
|
|
22
|
+
* @param {LocaleMiddlewareConfig} config Locale middleware config
|
|
23
|
+
*/
|
|
24
|
+
constructor(config) {
|
|
25
|
+
super(config);
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.handle = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
try {
|
|
29
|
+
const { pathname } = req.nextUrl;
|
|
30
|
+
const localeFromPath = this.getLocaleFromPath(pathname);
|
|
31
|
+
const locale = localeFromPath || this.getLanguage(req, res);
|
|
32
|
+
debug.locale('locale middleware start: %o', {
|
|
33
|
+
pathname,
|
|
34
|
+
locale,
|
|
35
|
+
});
|
|
36
|
+
if (this.disabled(req, res)) {
|
|
37
|
+
debug.locale('skipped (locale middleware is disabled)');
|
|
38
|
+
return res;
|
|
39
|
+
}
|
|
40
|
+
if (!localeFromPath) {
|
|
41
|
+
// locale is not present in path, we need to rewrite to include the locale segment
|
|
42
|
+
const rewritePath = getLocaleRewrite(pathname, locale);
|
|
43
|
+
const response = this.rewrite(rewritePath, req, res);
|
|
44
|
+
this.setLocaleHeader(response, locale);
|
|
45
|
+
debug.locale('locale middleware end, with rewrite: %o', {
|
|
46
|
+
pathname,
|
|
47
|
+
locale,
|
|
48
|
+
rewritePath,
|
|
49
|
+
});
|
|
50
|
+
return response;
|
|
51
|
+
}
|
|
52
|
+
this.setLocaleHeader(res, locale);
|
|
53
|
+
debug.locale('locale middleware end, no rewrite: %o', {
|
|
54
|
+
pathname,
|
|
55
|
+
locale,
|
|
56
|
+
});
|
|
57
|
+
return res;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.log('Locale middleware failed:');
|
|
61
|
+
console.log(error);
|
|
62
|
+
return res;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
disabled(req, res) {
|
|
67
|
+
// ignore files
|
|
68
|
+
return req.nextUrl.pathname.includes('.') || super.disabled(req, res);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract locale from path
|
|
72
|
+
* @param {string} path request path
|
|
73
|
+
* @returns {string | undefined} the locale if found
|
|
74
|
+
*/
|
|
75
|
+
getLocaleFromPath(path) {
|
|
76
|
+
return this.config.locales.find((locale) => path.includes(`/${locale}/`) || path.endsWith(`/${locale}`));
|
|
77
|
+
}
|
|
78
|
+
setLocaleHeader(res, locale) {
|
|
79
|
+
res.headers.set(LOCALE_HEADER_NAME, locale);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -1,186 +1,189 @@
|
|
|
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 { SITE_KEY, SiteResolver } from '@sitecore-content-sdk/core/site';
|
|
11
|
-
import { debug } from '@sitecore-content-sdk/core';
|
|
12
|
-
import { NextResponse } from 'next/server';
|
|
13
|
-
import { createGraphQLClientFactory, } from '@sitecore-content-sdk/core/client';
|
|
14
|
-
export const REWRITE_HEADER_NAME = 'x-sc-rewrite';
|
|
15
|
-
export const LOCALE_HEADER_NAME = 'x-sc-locale';
|
|
16
|
-
/**
|
|
17
|
-
* Middleware class to be extended by all middleware implementations
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
this.
|
|
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
|
-
const
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
const
|
|
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
|
-
*
|
|
92
|
-
* @
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
*
|
|
105
|
-
*
|
|
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
|
-
|
|
149
|
-
*
|
|
150
|
-
* @param {
|
|
151
|
-
* @param {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
*
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const
|
|
182
|
-
debug.common('middleware
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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 { SITE_KEY, SiteResolver } from '@sitecore-content-sdk/core/site';
|
|
11
|
+
import { debug } from '@sitecore-content-sdk/core';
|
|
12
|
+
import { NextResponse } from 'next/server';
|
|
13
|
+
import { createGraphQLClientFactory, } from '@sitecore-content-sdk/core/client';
|
|
14
|
+
export const REWRITE_HEADER_NAME = 'x-sc-rewrite';
|
|
15
|
+
export const LOCALE_HEADER_NAME = 'x-sc-locale';
|
|
16
|
+
/**
|
|
17
|
+
* Middleware class to be extended by all middleware implementations
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
export class Middleware {
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Base middleware class with common methods
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export class MiddlewareBase extends Middleware {
|
|
27
|
+
constructor(config) {
|
|
28
|
+
super();
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.siteResolver = new SiteResolver(config.sites);
|
|
31
|
+
this.defaultHostname = config.defaultHostname || 'localhost';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Determines if mode is preview
|
|
35
|
+
* @param {NextRequest} req request
|
|
36
|
+
* @returns {boolean} is preview
|
|
37
|
+
*/
|
|
38
|
+
isPreview(req) {
|
|
39
|
+
var _a, _b;
|
|
40
|
+
return !!(((_a = req.cookies.get("__prerender_bypass" /* PreviewCookies.PRERENDER_BYPASS */)) === null || _a === void 0 ? void 0 : _a.value) ||
|
|
41
|
+
((_b = req.cookies.get("__next_preview_data" /* PreviewCookies.PREVIEW_DATA */)) === null || _b === void 0 ? void 0 : _b.value));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Determines if the application is using the app router based on the locale header
|
|
45
|
+
* @param {NextResponse} res response
|
|
46
|
+
* @returns {boolean} true if app router is used
|
|
47
|
+
*/
|
|
48
|
+
isAppRouter(res) {
|
|
49
|
+
return !!this.getLanguageFromHeader(res);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Determines if the request is a Next.js (next/link) prefetch request
|
|
53
|
+
* @param {NextRequest} req request
|
|
54
|
+
* @returns {boolean} is prefetch
|
|
55
|
+
*/
|
|
56
|
+
isPrefetch(req) {
|
|
57
|
+
const isMobile = req.headers.get('sec-ch-ua-mobile') === '?1';
|
|
58
|
+
const userAgent = req.headers.get('user-agent') || '';
|
|
59
|
+
const isKnownPlatform = /iPhone|Mac|Linux|Windows|Android/i.test(userAgent);
|
|
60
|
+
const isKnownDevice = isMobile || isKnownPlatform;
|
|
61
|
+
const purpose = req.headers.get('purpose');
|
|
62
|
+
const nextRouterPrefetch = req.headers.get('Next-Router-Prefetch');
|
|
63
|
+
const middlewarePrefetch = req.headers.get('x-middleware-prefetch');
|
|
64
|
+
// Some real navigations on different devices may incorrectly include 'prefetch' headers.
|
|
65
|
+
// To avoid skipping personalization in such cases, we treat 'x-middleware-prefetch' as a more reliable signal of true prefetch behavior.
|
|
66
|
+
if (isKnownDevice && middlewarePrefetch === '1') {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
// Otherwise, standard prefetch detection
|
|
70
|
+
return purpose === 'prefetch' || nextRouterPrefetch === '1' || middlewarePrefetch === '1';
|
|
71
|
+
}
|
|
72
|
+
disabled(req, res) {
|
|
73
|
+
const { pathname } = req.nextUrl;
|
|
74
|
+
return (pathname.startsWith('/api/') || // Ignore Next.js API calls
|
|
75
|
+
pathname.startsWith('/sitecore/') || // Ignore Sitecore API calls
|
|
76
|
+
pathname.startsWith('/_next') || // Ignore next service calls
|
|
77
|
+
(this.config.skip && this.config.skip(req, res)));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Safely extract all headers for debug logging
|
|
81
|
+
* Necessary to avoid middleware issue https://github.com/vercel/next.js/issues/39765
|
|
82
|
+
* @param {Headers} incomingHeaders Incoming headers
|
|
83
|
+
* @returns Object with headers as key/value pairs
|
|
84
|
+
*/
|
|
85
|
+
extractDebugHeaders(incomingHeaders) {
|
|
86
|
+
const headers = {};
|
|
87
|
+
incomingHeaders.forEach((value, key) => (headers[key] = value));
|
|
88
|
+
return headers;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Provides used language
|
|
92
|
+
* @param {NextRequest} req request
|
|
93
|
+
* @param {NextResponse} res response
|
|
94
|
+
* @returns {string} language
|
|
95
|
+
*/
|
|
96
|
+
getLanguage(req, res) {
|
|
97
|
+
return (this.getLanguageFromHeader(res) ||
|
|
98
|
+
req.nextUrl.locale ||
|
|
99
|
+
req.nextUrl.defaultLocale ||
|
|
100
|
+
this.config.defaultLanguage ||
|
|
101
|
+
'en');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Extract language from locale header of the response
|
|
105
|
+
* set by LocaleMiddleware for app router application
|
|
106
|
+
* @param {NextResponse} res response
|
|
107
|
+
* @returns {string | undefined} language or undefined if not found
|
|
108
|
+
*/
|
|
109
|
+
getLanguageFromHeader(res) {
|
|
110
|
+
var _a;
|
|
111
|
+
return (_a = res === null || res === void 0 ? void 0 : res.headers.get(LOCALE_HEADER_NAME)) !== null && _a !== void 0 ? _a : undefined;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Extract 'host' header
|
|
115
|
+
* @param {NextRequest} req request
|
|
116
|
+
*/
|
|
117
|
+
getHostHeader(req) {
|
|
118
|
+
var _a;
|
|
119
|
+
return (_a = req.headers.get('host')) === null || _a === void 0 ? void 0 : _a.split(':')[0];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get site information. If site name is stored in cookie, use it, otherwise resolve by hostname
|
|
123
|
+
* - If site can't be resolved by site name cookie use default site info based on provided parameters
|
|
124
|
+
* - If site can't be resolved by hostname throw an error
|
|
125
|
+
* @param {NextRequest} req request
|
|
126
|
+
* @param {NextResponse} [res] response
|
|
127
|
+
* @returns {SiteInfo} site information
|
|
128
|
+
*/
|
|
129
|
+
getSite(req, res) {
|
|
130
|
+
var _a;
|
|
131
|
+
const siteNameCookie = (_a = res === null || res === void 0 ? void 0 : res.cookies.get(SITE_KEY)) === null || _a === void 0 ? void 0 : _a.value;
|
|
132
|
+
const hostname = this.getHostHeader(req) || this.defaultHostname;
|
|
133
|
+
if (siteNameCookie) {
|
|
134
|
+
// Usually we should be able to resolve site by cookie
|
|
135
|
+
// in case of Sitecore Preview mode, there can be a case that new site was created
|
|
136
|
+
// but it's not present in the sitemap, so we fallback to default site info
|
|
137
|
+
return (this.siteResolver.getByName(siteNameCookie) || {
|
|
138
|
+
name: siteNameCookie,
|
|
139
|
+
language: this.getLanguage(req),
|
|
140
|
+
hostName: '*',
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return this.siteResolver.getByHost(hostname);
|
|
144
|
+
}
|
|
145
|
+
getClientFactory(graphQLOptions) {
|
|
146
|
+
return createGraphQLClientFactory(graphQLOptions);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create a rewrite response
|
|
150
|
+
* @param {string} rewritePath the destionation path
|
|
151
|
+
* @param {NextRequest} req the current request
|
|
152
|
+
* @param {NextResponse} res the current response
|
|
153
|
+
* @param {boolean} [skipHeader] don't write 'x-sc-rewrite' header
|
|
154
|
+
*/
|
|
155
|
+
rewrite(rewritePath, req, res, skipHeader) {
|
|
156
|
+
// Note an absolute URL is required: https://nextjs.org/docs/messages/middleware-relative-urls
|
|
157
|
+
const rewriteUrl = req.nextUrl.clone();
|
|
158
|
+
rewriteUrl.pathname = rewritePath;
|
|
159
|
+
const response = NextResponse.rewrite(rewriteUrl, res);
|
|
160
|
+
// Share rewrite path with following executed middlewares
|
|
161
|
+
if (!skipHeader) {
|
|
162
|
+
response.headers.set(REWRITE_HEADER_NAME, rewritePath);
|
|
163
|
+
}
|
|
164
|
+
return response;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Define a middleware with a list of middlewares
|
|
169
|
+
* @param {Middleware[]} middlewares List of middlewares to execute
|
|
170
|
+
* @public
|
|
171
|
+
*/
|
|
172
|
+
export const defineMiddleware = (...middlewares) => {
|
|
173
|
+
return {
|
|
174
|
+
/**
|
|
175
|
+
* Execute all middlewares
|
|
176
|
+
* @param {NextRequest} req request
|
|
177
|
+
* @param {NextFetchEvent} ev fetch event
|
|
178
|
+
* @param {NextResponse} [res] response
|
|
179
|
+
*/
|
|
180
|
+
exec: (req, ev, res) => __awaiter(void 0, void 0, void 0, function* () {
|
|
181
|
+
const response = res || NextResponse.next();
|
|
182
|
+
debug.common('middleware start');
|
|
183
|
+
const start = Date.now();
|
|
184
|
+
const middlewareResponse = yield middlewares.reduce((p, middleware) => p.then((res) => middleware.handle(req, res, ev)), Promise.resolve(response));
|
|
185
|
+
debug.common('middleware end in %dms', Date.now() - start);
|
|
186
|
+
return middlewareResponse;
|
|
187
|
+
}),
|
|
188
|
+
};
|
|
189
|
+
};
|