@sitecore-jss/sitecore-jss-nextjs 21.1.0-canary.99 → 22.0.0-canary.1
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/components/NextImage.js +8 -2
- package/dist/cjs/index.js +7 -2
- package/dist/cjs/middleware/index.js +3 -1
- package/dist/cjs/middleware/middleware.js +70 -0
- package/dist/cjs/middleware/multisite-middleware.js +13 -30
- package/dist/cjs/middleware/personalize-middleware.js +14 -40
- package/dist/cjs/middleware/redirects-middleware.js +30 -25
- package/dist/cjs/services/base-graphql-sitemap-service.js +204 -0
- package/dist/cjs/services/graphql-sitemap-service.js +10 -176
- package/dist/cjs/services/mutisite-graphql-sitemap-service.js +81 -0
- package/dist/esm/components/NextImage.js +8 -2
- package/dist/esm/index.js +4 -3
- package/dist/esm/middleware/index.js +1 -0
- package/dist/esm/middleware/middleware.js +66 -0
- package/dist/esm/middleware/multisite-middleware.js +13 -30
- package/dist/esm/middleware/personalize-middleware.js +15 -41
- package/dist/esm/middleware/redirects-middleware.js +30 -25
- package/dist/esm/services/base-graphql-sitemap-service.js +199 -0
- package/dist/esm/services/graphql-sitemap-service.js +9 -175
- package/dist/esm/services/mutisite-graphql-sitemap-service.js +77 -0
- package/package.json +5 -5
- package/types/index.d.ts +4 -3
- package/types/middleware/index.d.ts +1 -0
- package/types/middleware/middleware.d.ts +68 -0
- package/types/middleware/multisite-middleware.d.ts +3 -25
- package/types/middleware/personalize-middleware.d.ts +8 -41
- package/types/middleware/redirects-middleware.d.ts +7 -29
- package/types/services/base-graphql-sitemap-service.d.ts +149 -0
- package/types/services/graphql-sitemap-service.d.ts +7 -103
- package/types/services/mutisite-graphql-sitemap-service.d.ts +42 -0
|
@@ -28,7 +28,7 @@ const sitecoreLoader = ({ src, width }) => {
|
|
|
28
28
|
};
|
|
29
29
|
exports.sitecoreLoader = sitecoreLoader;
|
|
30
30
|
const NextImage = (_a) => {
|
|
31
|
-
var { editable, imageParams, field, mediaUrlPrefix } = _a, otherProps = __rest(_a, ["editable", "imageParams", "field", "mediaUrlPrefix"]);
|
|
31
|
+
var { editable, imageParams, field, mediaUrlPrefix, fill, priority } = _a, otherProps = __rest(_a, ["editable", "imageParams", "field", "mediaUrlPrefix", "fill", "priority"]);
|
|
32
32
|
// next handles src and we use a custom loader,
|
|
33
33
|
// throw error if these are present
|
|
34
34
|
if (otherProps.src) {
|
|
@@ -51,11 +51,17 @@ const NextImage = (_a) => {
|
|
|
51
51
|
if (!img) {
|
|
52
52
|
return null;
|
|
53
53
|
}
|
|
54
|
-
const attrs = Object.assign(Object.assign(Object.assign({}, img), otherProps), {
|
|
54
|
+
const attrs = Object.assign(Object.assign(Object.assign({}, img), otherProps), { fill,
|
|
55
|
+
priority, src: media_1.mediaApi.updateImageUrl(img.src, imageParams, mediaUrlPrefix) });
|
|
55
56
|
const imageProps = Object.assign(Object.assign({}, attrs), {
|
|
56
57
|
// force replace /media with /jssmedia in src since we _know_ we will be adding a 'mw' query string parameter
|
|
57
58
|
// this is required for Sitecore media API resizing to work properly
|
|
58
59
|
src: media_1.mediaApi.replaceMediaUrlPrefix(attrs.src, mediaUrlPrefix) });
|
|
60
|
+
// Exclude `width`, `height` in case image is responsive, `fill` is used
|
|
61
|
+
if (imageProps.fill) {
|
|
62
|
+
delete imageProps.width;
|
|
63
|
+
delete imageProps.height;
|
|
64
|
+
}
|
|
59
65
|
const loader = (otherProps.loader ? otherProps.loader : exports.sitecoreLoader);
|
|
60
66
|
if (attrs) {
|
|
61
67
|
return react_1.default.createElement(image_1.default, Object.assign({ alt: "", loader: loader }, imageProps));
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.VisitorIdentification = exports.File = void 0;
|
|
3
|
+
exports.Image = exports.NextImage = exports.EditingComponentPlaceholder = exports.Placeholder = exports.RichText = exports.Link = exports.getPublicUrl = exports.handleEditorFastRefresh = exports.useComponentProps = exports.ComponentPropsContext = exports.ComponentPropsReactContext = exports.normalizeSiteRewrite = exports.getSiteRewriteData = exports.getSiteRewrite = exports.GraphQLSiteInfoService = exports.SiteResolver = exports.GraphQLRobotsService = exports.GraphQLErrorPagesService = exports.GraphQLSitemapXmlService = exports.MultisiteGraphQLSitemapService = exports.GraphQLSitemapService = exports.DisconnectedSitemapService = exports.ComponentPropsService = exports.GraphQLRequestClient = exports.PosResolver = exports.CdpHelper = exports.normalizePersonalizedRewrite = exports.getPersonalizedRewriteData = exports.getPersonalizedRewrite = exports.personalizeLayout = exports.RestDictionaryService = exports.GraphQLDictionaryService = exports.trackingApi = exports.mediaApi = exports.EDITING_COMPONENT_ID = exports.EDITING_COMPONENT_PLACEHOLDER = exports.RenderingType = exports.getFieldValue = exports.getChildPlaceholder = exports.RestLayoutService = exports.GraphQLLayoutService = exports.LayoutServicePageState = exports.tryParseEnvValue = exports.resolveUrl = exports.resetEditorChromes = exports.isEditorActive = exports.enableDebug = exports.NativeDataFetcher = exports.AxiosDataFetcher = exports.constants = void 0;
|
|
4
|
+
exports.withDatasourceCheck = exports.withPlaceholder = exports.withEditorChromes = exports.useSitecoreContext = exports.withSitecoreContext = exports.SitecoreContextReactContext = exports.SitecoreContext = exports.VisitorIdentification = exports.File = exports.FEaaSComponent = exports.EditFrame = exports.DateField = exports.Text = void 0;
|
|
5
5
|
var sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
|
|
6
6
|
Object.defineProperty(exports, "constants", { enumerable: true, get: function () { return sitecore_jss_1.constants; } });
|
|
7
7
|
Object.defineProperty(exports, "AxiosDataFetcher", { enumerable: true, get: function () { return sitecore_jss_1.AxiosDataFetcher; } });
|
|
@@ -11,6 +11,7 @@ var utils_1 = require("@sitecore-jss/sitecore-jss/utils");
|
|
|
11
11
|
Object.defineProperty(exports, "isEditorActive", { enumerable: true, get: function () { return utils_1.isEditorActive; } });
|
|
12
12
|
Object.defineProperty(exports, "resetEditorChromes", { enumerable: true, get: function () { return utils_1.resetEditorChromes; } });
|
|
13
13
|
Object.defineProperty(exports, "resolveUrl", { enumerable: true, get: function () { return utils_1.resolveUrl; } });
|
|
14
|
+
Object.defineProperty(exports, "tryParseEnvValue", { enumerable: true, get: function () { return utils_1.tryParseEnvValue; } });
|
|
14
15
|
var layout_1 = require("@sitecore-jss/sitecore-jss/layout");
|
|
15
16
|
Object.defineProperty(exports, "LayoutServicePageState", { enumerable: true, get: function () { return layout_1.LayoutServicePageState; } });
|
|
16
17
|
Object.defineProperty(exports, "GraphQLLayoutService", { enumerable: true, get: function () { return layout_1.GraphQLLayoutService; } });
|
|
@@ -33,6 +34,7 @@ Object.defineProperty(exports, "getPersonalizedRewrite", { enumerable: true, get
|
|
|
33
34
|
Object.defineProperty(exports, "getPersonalizedRewriteData", { enumerable: true, get: function () { return personalize_1.getPersonalizedRewriteData; } });
|
|
34
35
|
Object.defineProperty(exports, "normalizePersonalizedRewrite", { enumerable: true, get: function () { return personalize_1.normalizePersonalizedRewrite; } });
|
|
35
36
|
Object.defineProperty(exports, "CdpHelper", { enumerable: true, get: function () { return personalize_1.CdpHelper; } });
|
|
37
|
+
Object.defineProperty(exports, "PosResolver", { enumerable: true, get: function () { return personalize_1.PosResolver; } });
|
|
36
38
|
var sitecore_jss_2 = require("@sitecore-jss/sitecore-jss");
|
|
37
39
|
Object.defineProperty(exports, "GraphQLRequestClient", { enumerable: true, get: function () { return sitecore_jss_2.GraphQLRequestClient; } });
|
|
38
40
|
var component_props_service_1 = require("./services/component-props-service");
|
|
@@ -41,6 +43,8 @@ var disconnected_sitemap_service_1 = require("./services/disconnected-sitemap-se
|
|
|
41
43
|
Object.defineProperty(exports, "DisconnectedSitemapService", { enumerable: true, get: function () { return disconnected_sitemap_service_1.DisconnectedSitemapService; } });
|
|
42
44
|
var graphql_sitemap_service_1 = require("./services/graphql-sitemap-service");
|
|
43
45
|
Object.defineProperty(exports, "GraphQLSitemapService", { enumerable: true, get: function () { return graphql_sitemap_service_1.GraphQLSitemapService; } });
|
|
46
|
+
var mutisite_graphql_sitemap_service_1 = require("./services/mutisite-graphql-sitemap-service");
|
|
47
|
+
Object.defineProperty(exports, "MultisiteGraphQLSitemapService", { enumerable: true, get: function () { return mutisite_graphql_sitemap_service_1.MultisiteGraphQLSitemapService; } });
|
|
44
48
|
var site_1 = require("@sitecore-jss/sitecore-jss/site");
|
|
45
49
|
Object.defineProperty(exports, "GraphQLSitemapXmlService", { enumerable: true, get: function () { return site_1.GraphQLSitemapXmlService; } });
|
|
46
50
|
Object.defineProperty(exports, "GraphQLErrorPagesService", { enumerable: true, get: function () { return site_1.GraphQLErrorPagesService; } });
|
|
@@ -71,6 +75,7 @@ var sitecore_jss_react_1 = require("@sitecore-jss/sitecore-jss-react");
|
|
|
71
75
|
Object.defineProperty(exports, "Image", { enumerable: true, get: function () { return sitecore_jss_react_1.Image; } });
|
|
72
76
|
Object.defineProperty(exports, "Text", { enumerable: true, get: function () { return sitecore_jss_react_1.Text; } });
|
|
73
77
|
Object.defineProperty(exports, "DateField", { enumerable: true, get: function () { return sitecore_jss_react_1.DateField; } });
|
|
78
|
+
Object.defineProperty(exports, "EditFrame", { enumerable: true, get: function () { return sitecore_jss_react_1.EditFrame; } });
|
|
74
79
|
Object.defineProperty(exports, "FEaaSComponent", { enumerable: true, get: function () { return sitecore_jss_react_1.FEaaSComponent; } });
|
|
75
80
|
Object.defineProperty(exports, "File", { enumerable: true, get: function () { return sitecore_jss_react_1.File; } });
|
|
76
81
|
Object.defineProperty(exports, "VisitorIdentification", { enumerable: true, get: function () { return sitecore_jss_react_1.VisitorIdentification; } });
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SiteResolver = exports.MultisiteMiddleware = exports.PersonalizeMiddleware = exports.RedirectsMiddleware = void 0;
|
|
3
|
+
exports.tryParseEnvValue = exports.SiteResolver = exports.MultisiteMiddleware = exports.PersonalizeMiddleware = exports.RedirectsMiddleware = void 0;
|
|
4
4
|
var redirects_middleware_1 = require("./redirects-middleware");
|
|
5
5
|
Object.defineProperty(exports, "RedirectsMiddleware", { enumerable: true, get: function () { return redirects_middleware_1.RedirectsMiddleware; } });
|
|
6
6
|
var personalize_middleware_1 = require("./personalize-middleware");
|
|
@@ -9,3 +9,5 @@ var multisite_middleware_1 = require("./multisite-middleware");
|
|
|
9
9
|
Object.defineProperty(exports, "MultisiteMiddleware", { enumerable: true, get: function () { return multisite_middleware_1.MultisiteMiddleware; } });
|
|
10
10
|
var site_1 = require("@sitecore-jss/sitecore-jss/site");
|
|
11
11
|
Object.defineProperty(exports, "SiteResolver", { enumerable: true, get: function () { return site_1.SiteResolver; } });
|
|
12
|
+
var utils_1 = require("@sitecore-jss/sitecore-jss/utils");
|
|
13
|
+
Object.defineProperty(exports, "tryParseEnvValue", { enumerable: true, get: function () { return utils_1.tryParseEnvValue; } });
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MiddlewareBase = void 0;
|
|
4
|
+
class MiddlewareBase {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.SITE_SYMBOL = 'sc_site';
|
|
8
|
+
this.defaultHostname = config.defaultHostname || 'localhost';
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Determines if mode is preview
|
|
12
|
+
* @param {NextRequest} req request
|
|
13
|
+
* @returns {boolean} is preview
|
|
14
|
+
*/
|
|
15
|
+
isPreview(req) {
|
|
16
|
+
var _a, _b;
|
|
17
|
+
return !!(((_a = req.cookies.get('__prerender_bypass')) === null || _a === void 0 ? void 0 : _a.value) || ((_b = req.cookies.get('__next_preview_data')) === null || _b === void 0 ? void 0 : _b.value));
|
|
18
|
+
}
|
|
19
|
+
excludeRoute(pathname) {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
return (pathname.includes('.') || // Ignore files
|
|
22
|
+
pathname.startsWith('/api/') || // Ignore Next.js API calls
|
|
23
|
+
pathname.startsWith('/sitecore/') || // Ignore Sitecore API calls
|
|
24
|
+
pathname.startsWith('/_next') || // Ignore next service calls
|
|
25
|
+
(((_a = this.config) === null || _a === void 0 ? void 0 : _a.excludeRoute) && ((_b = this.config) === null || _b === void 0 ? void 0 : _b.excludeRoute(pathname))));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Safely extract all headers for debug logging
|
|
29
|
+
* Necessary to avoid middleware issue https://github.com/vercel/next.js/issues/39765
|
|
30
|
+
* @param {Headers} incomingHeaders Incoming headers
|
|
31
|
+
* @returns Object with headers as key/value pairs
|
|
32
|
+
*/
|
|
33
|
+
extractDebugHeaders(incomingHeaders) {
|
|
34
|
+
const headers = {};
|
|
35
|
+
incomingHeaders.forEach((value, key) => (headers[key] = value));
|
|
36
|
+
return headers;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Provides used language
|
|
40
|
+
* @param {NextRequest} req request
|
|
41
|
+
* @returns {string} language
|
|
42
|
+
*/
|
|
43
|
+
getLanguage(req) {
|
|
44
|
+
return req.nextUrl.locale || req.nextUrl.defaultLocale || 'en';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Extract 'host' header
|
|
48
|
+
* @param {NextRequest} req request
|
|
49
|
+
*/
|
|
50
|
+
getHostHeader(req) {
|
|
51
|
+
var _a;
|
|
52
|
+
return (_a = req.headers.get('host')) === null || _a === void 0 ? void 0 : _a.split(':')[0];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get site information.
|
|
56
|
+
* Can not be used in **Preview** mode, since site will not be resolved
|
|
57
|
+
* @param {NextRequest} req request
|
|
58
|
+
* @param {NextResponse} [res] response
|
|
59
|
+
* @returns {SiteInfo} site information
|
|
60
|
+
*/
|
|
61
|
+
getSite(req, res) {
|
|
62
|
+
var _a;
|
|
63
|
+
const siteNameCookie = (_a = res === null || res === void 0 ? void 0 : res.cookies.get(this.SITE_SYMBOL)) === null || _a === void 0 ? void 0 : _a.value;
|
|
64
|
+
if (siteNameCookie)
|
|
65
|
+
return this.config.siteResolver.getByName(siteNameCookie);
|
|
66
|
+
const hostname = this.getHostHeader(req) || this.defaultHostname;
|
|
67
|
+
return this.config.siteResolver.getByHost(hostname);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.MiddlewareBase = MiddlewareBase;
|
|
@@ -13,40 +13,39 @@ exports.MultisiteMiddleware = void 0;
|
|
|
13
13
|
const server_1 = require("next/server");
|
|
14
14
|
const site_1 = require("@sitecore-jss/sitecore-jss/site");
|
|
15
15
|
const sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
|
|
16
|
+
const middleware_1 = require("./middleware");
|
|
16
17
|
/**
|
|
17
18
|
* Middleware / handler for multisite support
|
|
18
19
|
*/
|
|
19
|
-
class MultisiteMiddleware {
|
|
20
|
+
class MultisiteMiddleware extends middleware_1.MiddlewareBase {
|
|
20
21
|
/**
|
|
21
22
|
* @param {MultisiteMiddlewareConfig} [config] Multisite middleware config
|
|
22
23
|
*/
|
|
23
24
|
constructor(config) {
|
|
25
|
+
super(config);
|
|
24
26
|
this.config = config;
|
|
25
27
|
this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
26
|
-
var _a
|
|
28
|
+
var _a;
|
|
27
29
|
const pathname = req.nextUrl.pathname;
|
|
28
|
-
const
|
|
29
|
-
const hostname =
|
|
30
|
+
const language = this.getLanguage(req);
|
|
31
|
+
const hostname = this.getHostHeader(req) || this.defaultHostname;
|
|
30
32
|
sitecore_jss_1.debug.multisite('multisite middleware start: %o', {
|
|
31
33
|
pathname,
|
|
34
|
+
language,
|
|
32
35
|
hostname,
|
|
33
36
|
});
|
|
34
|
-
if (!hostHeader) {
|
|
35
|
-
sitecore_jss_1.debug.multisite(`host header is missing, default ${hostname} is used`);
|
|
36
|
-
}
|
|
37
37
|
// Response will be provided if other middleware is run before us
|
|
38
38
|
let response = res || server_1.NextResponse.next();
|
|
39
|
-
if (this.excludeRoute(pathname)
|
|
40
|
-
|
|
41
|
-
sitecore_jss_1.debug.multisite('skipped (route excluded)');
|
|
39
|
+
if (this.isPreview(req) || this.excludeRoute(pathname)) {
|
|
40
|
+
sitecore_jss_1.debug.multisite('skipped (%s)', this.isPreview(req) ? 'preview' : 'route excluded');
|
|
42
41
|
return response;
|
|
43
42
|
}
|
|
44
43
|
// Site name can be forced by query string parameter or cookie
|
|
45
|
-
const siteName = req.nextUrl.searchParams.get(
|
|
44
|
+
const siteName = req.nextUrl.searchParams.get(this.SITE_SYMBOL) ||
|
|
46
45
|
(this.config.useCookieResolution &&
|
|
47
46
|
this.config.useCookieResolution(req) &&
|
|
48
|
-
((
|
|
49
|
-
this.config.
|
|
47
|
+
((_a = req.cookies.get(this.SITE_SYMBOL)) === null || _a === void 0 ? void 0 : _a.value)) ||
|
|
48
|
+
this.config.siteResolver.getByHost(hostname).name;
|
|
50
49
|
// Rewrite to site specific path
|
|
51
50
|
const rewritePath = (0, site_1.getSiteRewrite)(pathname, {
|
|
52
51
|
siteName,
|
|
@@ -56,7 +55,7 @@ class MultisiteMiddleware {
|
|
|
56
55
|
rewriteUrl.pathname = rewritePath;
|
|
57
56
|
response = server_1.NextResponse.rewrite(rewriteUrl);
|
|
58
57
|
// Share site name with the following executed middlewares
|
|
59
|
-
response.cookies.set(
|
|
58
|
+
response.cookies.set(this.SITE_SYMBOL, siteName);
|
|
60
59
|
// Share rewrite path with following executed middlewares
|
|
61
60
|
response.headers.set('x-sc-rewrite', rewritePath);
|
|
62
61
|
sitecore_jss_1.debug.multisite('multisite middleware end: %o', {
|
|
@@ -67,7 +66,6 @@ class MultisiteMiddleware {
|
|
|
67
66
|
});
|
|
68
67
|
return response;
|
|
69
68
|
});
|
|
70
|
-
this.defaultHostname = config.defaultHostname || 'localhost';
|
|
71
69
|
}
|
|
72
70
|
/**
|
|
73
71
|
* Gets the Next.js middleware handler with error handling
|
|
@@ -85,20 +83,5 @@ class MultisiteMiddleware {
|
|
|
85
83
|
}
|
|
86
84
|
});
|
|
87
85
|
}
|
|
88
|
-
excludeRoute(pathname) {
|
|
89
|
-
if (pathname.includes('.') || // Ignore files
|
|
90
|
-
pathname.startsWith('/api/') || // Ignore Next.js API calls
|
|
91
|
-
pathname.startsWith('/sitecore/') || // Ignore Sitecore API calls
|
|
92
|
-
pathname.startsWith('/_next') // Ignore next service calls
|
|
93
|
-
) {
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
extractDebugHeaders(incomingHeaders) {
|
|
99
|
-
const headers = {};
|
|
100
|
-
incomingHeaders.forEach((value, key) => (headers[key] = value));
|
|
101
|
-
return headers;
|
|
102
|
-
}
|
|
103
86
|
}
|
|
104
87
|
exports.MultisiteMiddleware = MultisiteMiddleware;
|
|
@@ -13,30 +13,28 @@ exports.PersonalizeMiddleware = void 0;
|
|
|
13
13
|
const server_1 = require("next/server");
|
|
14
14
|
const personalize_1 = require("@sitecore-jss/sitecore-jss/personalize");
|
|
15
15
|
const sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
|
|
16
|
+
const middleware_1 = require("./middleware");
|
|
16
17
|
/**
|
|
17
18
|
* Middleware / handler to support Sitecore Personalize
|
|
18
19
|
*/
|
|
19
|
-
class PersonalizeMiddleware {
|
|
20
|
+
class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
|
|
20
21
|
/**
|
|
21
22
|
* @param {PersonalizeMiddlewareConfig} [config] Personalize middleware config
|
|
22
23
|
*/
|
|
23
24
|
constructor(config) {
|
|
25
|
+
super(config);
|
|
24
26
|
this.config = config;
|
|
25
27
|
this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
26
|
-
var _a, _b;
|
|
27
|
-
const hostHeader = (_a = req.headers.get('host')) === null || _a === void 0 ? void 0 : _a.split(':')[0];
|
|
28
|
-
const hostname = hostHeader || this.defaultHostname;
|
|
29
28
|
const pathname = req.nextUrl.pathname;
|
|
30
|
-
const language =
|
|
31
|
-
const
|
|
29
|
+
const language = this.getLanguage(req);
|
|
30
|
+
const hostname = this.getHostHeader(req) || this.defaultHostname;
|
|
32
31
|
let browserId = this.getBrowserId(req);
|
|
33
32
|
sitecore_jss_1.debug.personalize('personalize middleware start: %o', {
|
|
34
33
|
pathname,
|
|
35
34
|
language,
|
|
35
|
+
hostname,
|
|
36
|
+
browserId,
|
|
36
37
|
});
|
|
37
|
-
if (!hostHeader) {
|
|
38
|
-
sitecore_jss_1.debug.personalize(`host header is missing, default ${hostname} is used`);
|
|
39
|
-
}
|
|
40
38
|
// Response will be provided if other middleware is run before us (e.g. redirects)
|
|
41
39
|
let response = res || server_1.NextResponse.next();
|
|
42
40
|
if (this.config.disabled && this.config.disabled(req, response)) {
|
|
@@ -45,13 +43,13 @@ class PersonalizeMiddleware {
|
|
|
45
43
|
}
|
|
46
44
|
if (response.redirected || // Don't attempt to personalize a redirect
|
|
47
45
|
this.isPreview(req) || // No need to personalize for preview (layout data is already prepared for preview)
|
|
48
|
-
this.excludeRoute(pathname)
|
|
49
|
-
(this.config.excludeRoute && this.config.excludeRoute(pathname))) {
|
|
46
|
+
this.excludeRoute(pathname)) {
|
|
50
47
|
sitecore_jss_1.debug.personalize('skipped (%s)', response.redirected ? 'redirected' : this.isPreview(req) ? 'preview' : 'route excluded');
|
|
51
48
|
return response;
|
|
52
49
|
}
|
|
50
|
+
const site = this.getSite(req, res);
|
|
53
51
|
// Get personalization info from Experience Edge
|
|
54
|
-
const personalizeInfo = yield this.personalizeService.getPersonalizeInfo(pathname, language,
|
|
52
|
+
const personalizeInfo = yield this.personalizeService.getPersonalizeInfo(pathname, language, site.name);
|
|
55
53
|
if (!personalizeInfo) {
|
|
56
54
|
// Likely an invalid route / language
|
|
57
55
|
sitecore_jss_1.debug.personalize('skipped (personalize info not found)');
|
|
@@ -71,7 +69,9 @@ class PersonalizeMiddleware {
|
|
|
71
69
|
// Execute targeted experience in CDP
|
|
72
70
|
const { ua } = (0, server_1.userAgent)(req);
|
|
73
71
|
const params = this.getExperienceParams(req);
|
|
74
|
-
const pointOfSale = this.config.getPointOfSale
|
|
72
|
+
const pointOfSale = this.config.getPointOfSale
|
|
73
|
+
? this.config.getPointOfSale(site, language)
|
|
74
|
+
: personalize_1.PosResolver.resolve(site, language);
|
|
75
75
|
const variantId = yield this.cdpService.executeExperience(personalizeInfo.contentId, browserId, ua, pointOfSale, params);
|
|
76
76
|
if (!variantId) {
|
|
77
77
|
sitecore_jss_1.debug.personalize('skipped (no variant identified)');
|
|
@@ -97,7 +97,7 @@ class PersonalizeMiddleware {
|
|
|
97
97
|
// Set browserId cookie on the response
|
|
98
98
|
this.setBrowserId(response, browserId);
|
|
99
99
|
// Share site name with the following executed middlewares
|
|
100
|
-
response.cookies.set(
|
|
100
|
+
response.cookies.set(this.SITE_SYMBOL, site.name);
|
|
101
101
|
sitecore_jss_1.debug.personalize('personalize middleware end: %o', {
|
|
102
102
|
rewritePath,
|
|
103
103
|
browserId,
|
|
@@ -117,7 +117,6 @@ class PersonalizeMiddleware {
|
|
|
117
117
|
});
|
|
118
118
|
return (url, data) => fetcher.fetch(url, data);
|
|
119
119
|
} }));
|
|
120
|
-
this.defaultHostname = config.defaultHostname || 'localhost';
|
|
121
120
|
}
|
|
122
121
|
/**
|
|
123
122
|
* Gets the Next.js middleware handler with error handling
|
|
@@ -159,30 +158,5 @@ class PersonalizeMiddleware {
|
|
|
159
158
|
},
|
|
160
159
|
};
|
|
161
160
|
}
|
|
162
|
-
excludeRoute(pathname) {
|
|
163
|
-
if (pathname.includes('.') || // Ignore files
|
|
164
|
-
pathname.startsWith('/api/') || // Ignore Next.js API calls
|
|
165
|
-
pathname.startsWith('/sitecore/') || // Ignore Sitecore API calls
|
|
166
|
-
pathname.startsWith('/_next') // Ignore next service calls
|
|
167
|
-
) {
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
isPreview(req) {
|
|
173
|
-
var _a, _b;
|
|
174
|
-
return (((_a = req.cookies.get('__prerender_bypass')) === null || _a === void 0 ? void 0 : _a.value) || ((_b = req.cookies.get('__next_preview_data')) === null || _b === void 0 ? void 0 : _b.value));
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Safely extract all headers for debug logging
|
|
178
|
-
* Necessary to avoid middleware issue https://github.com/vercel/next.js/issues/39765
|
|
179
|
-
* @param {Headers} incomingHeaders Incoming headers
|
|
180
|
-
* @returns Object with headers as key/value pairs
|
|
181
|
-
*/
|
|
182
|
-
extractDebugHeaders(incomingHeaders) {
|
|
183
|
-
const headers = {};
|
|
184
|
-
incomingHeaders.forEach((value, key) => (headers[key] = value));
|
|
185
|
-
return headers;
|
|
186
|
-
}
|
|
187
161
|
}
|
|
188
162
|
exports.PersonalizeMiddleware = PersonalizeMiddleware;
|
|
@@ -16,29 +16,43 @@ exports.RedirectsMiddleware = void 0;
|
|
|
16
16
|
const regex_parser_1 = __importDefault(require("regex-parser"));
|
|
17
17
|
const server_1 = require("next/server");
|
|
18
18
|
const site_1 = require("@sitecore-jss/sitecore-jss/site");
|
|
19
|
+
const sitecore_jss_1 = require("@sitecore-jss/sitecore-jss");
|
|
20
|
+
const middleware_1 = require("./middleware");
|
|
19
21
|
/**
|
|
20
22
|
* Middleware / handler fetches all redirects from Sitecore instance by grapqhl service
|
|
21
23
|
* compares with current url and redirects to target url
|
|
22
24
|
*/
|
|
23
|
-
class RedirectsMiddleware {
|
|
25
|
+
class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
24
26
|
/**
|
|
25
27
|
* @param {RedirectsMiddlewareConfig} [config] redirects middleware config
|
|
26
28
|
*/
|
|
27
29
|
constructor(config) {
|
|
30
|
+
super(config);
|
|
28
31
|
this.config = config;
|
|
29
32
|
this.handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
+
const pathname = req.nextUrl.pathname;
|
|
34
|
+
const language = this.getLanguage(req);
|
|
35
|
+
const hostname = this.getHostHeader(req) || this.defaultHostname;
|
|
36
|
+
let site;
|
|
37
|
+
sitecore_jss_1.debug.redirects('redirects middleware start: %o', {
|
|
38
|
+
pathname,
|
|
39
|
+
language,
|
|
40
|
+
hostname,
|
|
41
|
+
});
|
|
33
42
|
const createResponse = () => __awaiter(this, void 0, void 0, function* () {
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
43
|
+
if (this.config.disabled && this.config.disabled(req, server_1.NextResponse.next())) {
|
|
44
|
+
sitecore_jss_1.debug.redirects('skipped (redirects middleware is disabled)');
|
|
45
|
+
return res || server_1.NextResponse.next();
|
|
46
|
+
}
|
|
47
|
+
if (this.isPreview(req) || this.excludeRoute(pathname)) {
|
|
48
|
+
sitecore_jss_1.debug.redirects('skipped (%s)', this.isPreview(req) ? 'preview' : 'route excluded');
|
|
37
49
|
return res || server_1.NextResponse.next();
|
|
38
50
|
}
|
|
51
|
+
site = this.getSite(req, res);
|
|
39
52
|
// Find the redirect from result of RedirectService
|
|
40
|
-
const existsRedirect = yield this.getExistsRedirect(req,
|
|
53
|
+
const existsRedirect = yield this.getExistsRedirect(req, site.name);
|
|
41
54
|
if (!existsRedirect) {
|
|
55
|
+
sitecore_jss_1.debug.redirects('skipped (redirect does not exist)');
|
|
42
56
|
return res || server_1.NextResponse.next();
|
|
43
57
|
}
|
|
44
58
|
const url = req.nextUrl.clone();
|
|
@@ -73,14 +87,20 @@ class RedirectsMiddleware {
|
|
|
73
87
|
});
|
|
74
88
|
const response = yield createResponse();
|
|
75
89
|
// Share site name with the following executed middlewares
|
|
76
|
-
|
|
90
|
+
// Don't need to set when middleware is disabled
|
|
91
|
+
site && response.cookies.set(this.SITE_SYMBOL, site.name);
|
|
92
|
+
sitecore_jss_1.debug.redirects('redirects middleware end: %o', {
|
|
93
|
+
redirected: response.redirected,
|
|
94
|
+
status: response.status,
|
|
95
|
+
url: response.url,
|
|
96
|
+
headers: this.extractDebugHeaders(response.headers),
|
|
97
|
+
});
|
|
77
98
|
return response;
|
|
78
99
|
});
|
|
79
100
|
// NOTE: we provide native fetch for compatibility on Next.js Edge Runtime
|
|
80
101
|
// (underlying default 'cross-fetch' is not currently compatible: https://github.com/lquixada/cross-fetch/issues/78)
|
|
81
102
|
this.redirectsService = new site_1.GraphQLRedirectsService(Object.assign(Object.assign({}, config), { fetch: fetch }));
|
|
82
103
|
this.locales = config.locales;
|
|
83
|
-
this.defaultHostname = config.defaultHostname || 'localhost';
|
|
84
104
|
}
|
|
85
105
|
/**
|
|
86
106
|
* Gets the Next.js API route handler
|
|
@@ -89,21 +109,6 @@ class RedirectsMiddleware {
|
|
|
89
109
|
getHandler() {
|
|
90
110
|
return this.handler;
|
|
91
111
|
}
|
|
92
|
-
excludeRoute(pathname) {
|
|
93
|
-
if (pathname.includes('.') || // Ignore files
|
|
94
|
-
pathname.startsWith('/api/') || // Ignore Next.js API calls
|
|
95
|
-
pathname.startsWith('/sitecore/') || // Ignore Sitecore API calls
|
|
96
|
-
pathname.startsWith('/_next') // Ignore next service calls
|
|
97
|
-
) {
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
getHostname(req) {
|
|
103
|
-
var _a;
|
|
104
|
-
const hostHeader = (_a = req.headers.get('host')) === null || _a === void 0 ? void 0 : _a.split(':')[0];
|
|
105
|
-
return hostHeader || this.defaultHostname;
|
|
106
|
-
}
|
|
107
112
|
/**
|
|
108
113
|
* Method returns RedirectInfo when matches
|
|
109
114
|
* @param {NextRequest} req request
|