@sitecore-jss/sitecore-jss-nextjs 22.6.0-canary.13 → 22.6.0-canary.14
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/middleware/middleware.js +7 -4
- package/dist/cjs/middleware/personalize-middleware.js +1 -1
- package/dist/cjs/middleware/redirects-middleware.js +14 -6
- package/dist/esm/middleware/middleware.js +6 -3
- package/dist/esm/middleware/personalize-middleware.js +2 -2
- package/dist/esm/middleware/redirects-middleware.js +15 -7
- package/package.json +5 -5
- package/types/middleware/middleware.d.ts +3 -2
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MiddlewareBase = void 0;
|
|
3
|
+
exports.MiddlewareBase = exports.REWRITE_HEADER_NAME = void 0;
|
|
4
4
|
const server_1 = require("next/server");
|
|
5
|
+
exports.REWRITE_HEADER_NAME = 'x-sc-rewrite';
|
|
5
6
|
class MiddlewareBase {
|
|
6
7
|
constructor(config) {
|
|
7
8
|
this.config = config;
|
|
8
9
|
this.SITE_SYMBOL = 'sc_site';
|
|
9
|
-
this.REWRITE_HEADER_NAME = 'x-sc-rewrite';
|
|
10
10
|
this.defaultHostname = config.defaultHostname || 'localhost';
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
@@ -84,14 +84,17 @@ class MiddlewareBase {
|
|
|
84
84
|
* @param {string} rewritePath the destionation path
|
|
85
85
|
* @param {NextRequest} req the current request
|
|
86
86
|
* @param {NextResponse} res the current response
|
|
87
|
+
* @param {boolean} [skipHeader] don't write 'x-sc-rewrite' header
|
|
87
88
|
*/
|
|
88
|
-
rewrite(rewritePath, req, res) {
|
|
89
|
+
rewrite(rewritePath, req, res, skipHeader) {
|
|
89
90
|
// Note an absolute URL is required: https://nextjs.org/docs/messages/middleware-relative-urls
|
|
90
91
|
const rewriteUrl = req.nextUrl.clone();
|
|
91
92
|
rewriteUrl.pathname = rewritePath;
|
|
92
93
|
const response = server_1.NextResponse.rewrite(rewriteUrl, res);
|
|
93
94
|
// Share rewrite path with following executed middlewares
|
|
94
|
-
|
|
95
|
+
if (!skipHeader) {
|
|
96
|
+
response.headers.set(exports.REWRITE_HEADER_NAME, rewritePath);
|
|
97
|
+
}
|
|
95
98
|
return response;
|
|
96
99
|
}
|
|
97
100
|
}
|
|
@@ -102,7 +102,7 @@ class PersonalizeMiddleware extends middleware_1.MiddlewareBase {
|
|
|
102
102
|
return response;
|
|
103
103
|
}
|
|
104
104
|
// Path can be rewritten by previously executed middleware
|
|
105
|
-
const basePath = (res === null || res === void 0 ? void 0 : res.headers.get(
|
|
105
|
+
const basePath = (res === null || res === void 0 ? void 0 : res.headers.get(middleware_1.REWRITE_HEADER_NAME)) || pathname;
|
|
106
106
|
// Rewrite to persononalized path
|
|
107
107
|
const rewritePath = (0, personalize_1.getPersonalizedRewrite)(basePath, identifiedVariantIds);
|
|
108
108
|
response = this.rewrite(rewritePath, req, response);
|
|
@@ -70,14 +70,13 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
70
70
|
let matchedQueryString;
|
|
71
71
|
return modifyRedirects.length
|
|
72
72
|
? modifyRedirects.find((redirect) => {
|
|
73
|
-
var _a;
|
|
74
73
|
if ((0, utils_1.isRegexOrUrl)(redirect.pattern) === 'url') {
|
|
75
|
-
const
|
|
74
|
+
const [patternPath, patternQS] = redirect.pattern.endsWith('/')
|
|
76
75
|
? redirect.pattern.slice(0, -1).split('?')
|
|
77
76
|
: redirect.pattern.split('?');
|
|
78
|
-
return ((
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
return ((patternPath === normalizedPath || patternPath === `/${locale}${normalizedPath}`) &&
|
|
78
|
+
(!patternQS ||
|
|
79
|
+
(0, utils_1.areURLSearchParamsEqual)(new URLSearchParams(patternQS), new URLSearchParams(targetQS))));
|
|
81
80
|
}
|
|
82
81
|
// Modify the redirect pattern to ignore the language prefix in the path
|
|
83
82
|
// And escapes non-special "?" characters in a string or regex.
|
|
@@ -88,6 +87,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
88
87
|
.replace(/^\^\/|\/\$$/g, '') // Removes unnecessary start (^) and end ($) anchors
|
|
89
88
|
.replace(/^\^|\$$/g, '') // Further cleans up anchors
|
|
90
89
|
.replace(/\$\/gi$/g, '')}[\/]?$/i`; // Ensures the pattern allows an optional trailing slash
|
|
90
|
+
// Redirect pattern matches the full incoming URL with query string present
|
|
91
91
|
matchedQueryString = [
|
|
92
92
|
(0, regex_parser_1.default)(redirect.pattern).test(`${normalizedPath}${targetQS}`),
|
|
93
93
|
(0, regex_parser_1.default)(redirect.pattern).test(`/${locale}${normalizedPath}${targetQS}`),
|
|
@@ -96,6 +96,12 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
96
96
|
: undefined;
|
|
97
97
|
// Save the matched query string (if found) into the redirect object
|
|
98
98
|
redirect.matchedQueryString = matchedQueryString || '';
|
|
99
|
+
sitecore_jss_1.debug.redirects('All info: %o', {
|
|
100
|
+
matchedQueryString,
|
|
101
|
+
patern: redirect.pattern,
|
|
102
|
+
targetURL,
|
|
103
|
+
targetQS,
|
|
104
|
+
});
|
|
99
105
|
return (!!((0, regex_parser_1.default)(redirect.pattern).test(targetURL) ||
|
|
100
106
|
(0, regex_parser_1.default)(redirect.pattern).test(`/${req.nextUrl.locale}${targetURL}`) ||
|
|
101
107
|
matchedQueryString) && (redirect.locale ? redirect.locale.toLowerCase() === locale.toLowerCase() : true));
|
|
@@ -141,6 +147,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
141
147
|
site = this.getSite(req, res);
|
|
142
148
|
// Find the redirect from result of RedirectService
|
|
143
149
|
const existsRedirect = yield this.getExistsRedirect(req, site.name);
|
|
150
|
+
sitecore_jss_1.debug.redirects('Existing redirect: %o', { existsRedirect });
|
|
144
151
|
if (!existsRedirect) {
|
|
145
152
|
sitecore_jss_1.debug.redirects('skipped (redirect does not exist)');
|
|
146
153
|
return response;
|
|
@@ -191,7 +198,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
191
198
|
return this.createRedirectResponse(url, response, 302, 'Found');
|
|
192
199
|
}
|
|
193
200
|
case site_1.REDIRECT_TYPE_SERVER_TRANSFER: {
|
|
194
|
-
return this.rewrite(url.href, req, response);
|
|
201
|
+
return this.rewrite(url.href, req, response, true);
|
|
195
202
|
}
|
|
196
203
|
default:
|
|
197
204
|
return response;
|
|
@@ -264,6 +271,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
264
271
|
if (res === null || res === void 0 ? void 0 : res.headers) {
|
|
265
272
|
redirect.headers.delete('x-middleware-next');
|
|
266
273
|
redirect.headers.delete('x-middleware-rewrite');
|
|
274
|
+
redirect.headers.delete(middleware_1.REWRITE_HEADER_NAME);
|
|
267
275
|
}
|
|
268
276
|
return redirect;
|
|
269
277
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
|
+
export const REWRITE_HEADER_NAME = 'x-sc-rewrite';
|
|
2
3
|
export class MiddlewareBase {
|
|
3
4
|
constructor(config) {
|
|
4
5
|
this.config = config;
|
|
5
6
|
this.SITE_SYMBOL = 'sc_site';
|
|
6
|
-
this.REWRITE_HEADER_NAME = 'x-sc-rewrite';
|
|
7
7
|
this.defaultHostname = config.defaultHostname || 'localhost';
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
@@ -81,14 +81,17 @@ export class MiddlewareBase {
|
|
|
81
81
|
* @param {string} rewritePath the destionation path
|
|
82
82
|
* @param {NextRequest} req the current request
|
|
83
83
|
* @param {NextResponse} res the current response
|
|
84
|
+
* @param {boolean} [skipHeader] don't write 'x-sc-rewrite' header
|
|
84
85
|
*/
|
|
85
|
-
rewrite(rewritePath, req, res) {
|
|
86
|
+
rewrite(rewritePath, req, res, skipHeader) {
|
|
86
87
|
// Note an absolute URL is required: https://nextjs.org/docs/messages/middleware-relative-urls
|
|
87
88
|
const rewriteUrl = req.nextUrl.clone();
|
|
88
89
|
rewriteUrl.pathname = rewritePath;
|
|
89
90
|
const response = NextResponse.rewrite(rewriteUrl, res);
|
|
90
91
|
// Share rewrite path with following executed middlewares
|
|
91
|
-
|
|
92
|
+
if (!skipHeader) {
|
|
93
|
+
response.headers.set(REWRITE_HEADER_NAME, rewritePath);
|
|
94
|
+
}
|
|
92
95
|
return response;
|
|
93
96
|
}
|
|
94
97
|
}
|
|
@@ -10,7 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import { NextResponse } from 'next/server';
|
|
11
11
|
import { GraphQLPersonalizeService, getPersonalizedRewrite, CdpHelper, DEFAULT_VARIANT, } from '@sitecore-jss/sitecore-jss/personalize';
|
|
12
12
|
import { debug } from '@sitecore-jss/sitecore-jss';
|
|
13
|
-
import { MiddlewareBase } from './middleware';
|
|
13
|
+
import { MiddlewareBase, REWRITE_HEADER_NAME } from './middleware';
|
|
14
14
|
import { CloudSDK } from '@sitecore-cloudsdk/core/server';
|
|
15
15
|
import { personalize } from '@sitecore-cloudsdk/personalize/server';
|
|
16
16
|
/**
|
|
@@ -99,7 +99,7 @@ export class PersonalizeMiddleware extends MiddlewareBase {
|
|
|
99
99
|
return response;
|
|
100
100
|
}
|
|
101
101
|
// Path can be rewritten by previously executed middleware
|
|
102
|
-
const basePath = (res === null || res === void 0 ? void 0 : res.headers.get(
|
|
102
|
+
const basePath = (res === null || res === void 0 ? void 0 : res.headers.get(REWRITE_HEADER_NAME)) || pathname;
|
|
103
103
|
// Rewrite to persononalized path
|
|
104
104
|
const rewritePath = getPersonalizedRewrite(basePath, identifiedVariantIds);
|
|
105
105
|
response = this.rewrite(rewritePath, req, response);
|
|
@@ -12,7 +12,7 @@ import { GraphQLRedirectsService, REDIRECT_TYPE_301, REDIRECT_TYPE_302, REDIRECT
|
|
|
12
12
|
import { areURLSearchParamsEqual, escapeNonSpecialQuestionMarks, isRegexOrUrl, mergeURLSearchParams, } from '@sitecore-jss/sitecore-jss/utils';
|
|
13
13
|
import { NextResponse } from 'next/server';
|
|
14
14
|
import regexParser from 'regex-parser';
|
|
15
|
-
import { MiddlewareBase } from './middleware';
|
|
15
|
+
import { MiddlewareBase, REWRITE_HEADER_NAME } from './middleware';
|
|
16
16
|
const REGEXP_CONTEXT_SITE_LANG = new RegExp(/\$siteLang/, 'i');
|
|
17
17
|
const REGEXP_ABSOLUTE_URL = new RegExp('^(?:[a-z]+:)?//', 'i');
|
|
18
18
|
/**
|
|
@@ -64,14 +64,13 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
64
64
|
let matchedQueryString;
|
|
65
65
|
return modifyRedirects.length
|
|
66
66
|
? modifyRedirects.find((redirect) => {
|
|
67
|
-
var _a;
|
|
68
67
|
if (isRegexOrUrl(redirect.pattern) === 'url') {
|
|
69
|
-
const
|
|
68
|
+
const [patternPath, patternQS] = redirect.pattern.endsWith('/')
|
|
70
69
|
? redirect.pattern.slice(0, -1).split('?')
|
|
71
70
|
: redirect.pattern.split('?');
|
|
72
|
-
return ((
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
return ((patternPath === normalizedPath || patternPath === `/${locale}${normalizedPath}`) &&
|
|
72
|
+
(!patternQS ||
|
|
73
|
+
areURLSearchParamsEqual(new URLSearchParams(patternQS), new URLSearchParams(targetQS))));
|
|
75
74
|
}
|
|
76
75
|
// Modify the redirect pattern to ignore the language prefix in the path
|
|
77
76
|
// And escapes non-special "?" characters in a string or regex.
|
|
@@ -82,6 +81,7 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
82
81
|
.replace(/^\^\/|\/\$$/g, '') // Removes unnecessary start (^) and end ($) anchors
|
|
83
82
|
.replace(/^\^|\$$/g, '') // Further cleans up anchors
|
|
84
83
|
.replace(/\$\/gi$/g, '')}[\/]?$/i`; // Ensures the pattern allows an optional trailing slash
|
|
84
|
+
// Redirect pattern matches the full incoming URL with query string present
|
|
85
85
|
matchedQueryString = [
|
|
86
86
|
regexParser(redirect.pattern).test(`${normalizedPath}${targetQS}`),
|
|
87
87
|
regexParser(redirect.pattern).test(`/${locale}${normalizedPath}${targetQS}`),
|
|
@@ -90,6 +90,12 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
90
90
|
: undefined;
|
|
91
91
|
// Save the matched query string (if found) into the redirect object
|
|
92
92
|
redirect.matchedQueryString = matchedQueryString || '';
|
|
93
|
+
debug.redirects('All info: %o', {
|
|
94
|
+
matchedQueryString,
|
|
95
|
+
patern: redirect.pattern,
|
|
96
|
+
targetURL,
|
|
97
|
+
targetQS,
|
|
98
|
+
});
|
|
93
99
|
return (!!(regexParser(redirect.pattern).test(targetURL) ||
|
|
94
100
|
regexParser(redirect.pattern).test(`/${req.nextUrl.locale}${targetURL}`) ||
|
|
95
101
|
matchedQueryString) && (redirect.locale ? redirect.locale.toLowerCase() === locale.toLowerCase() : true));
|
|
@@ -135,6 +141,7 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
135
141
|
site = this.getSite(req, res);
|
|
136
142
|
// Find the redirect from result of RedirectService
|
|
137
143
|
const existsRedirect = yield this.getExistsRedirect(req, site.name);
|
|
144
|
+
debug.redirects('Existing redirect: %o', { existsRedirect });
|
|
138
145
|
if (!existsRedirect) {
|
|
139
146
|
debug.redirects('skipped (redirect does not exist)');
|
|
140
147
|
return response;
|
|
@@ -185,7 +192,7 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
185
192
|
return this.createRedirectResponse(url, response, 302, 'Found');
|
|
186
193
|
}
|
|
187
194
|
case REDIRECT_TYPE_SERVER_TRANSFER: {
|
|
188
|
-
return this.rewrite(url.href, req, response);
|
|
195
|
+
return this.rewrite(url.href, req, response, true);
|
|
189
196
|
}
|
|
190
197
|
default:
|
|
191
198
|
return response;
|
|
@@ -258,6 +265,7 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
258
265
|
if (res === null || res === void 0 ? void 0 : res.headers) {
|
|
259
266
|
redirect.headers.delete('x-middleware-next');
|
|
260
267
|
redirect.headers.delete('x-middleware-rewrite');
|
|
268
|
+
redirect.headers.delete(REWRITE_HEADER_NAME);
|
|
261
269
|
}
|
|
262
270
|
return redirect;
|
|
263
271
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sitecore-jss/sitecore-jss-nextjs",
|
|
3
|
-
"version": "22.6.0-canary.
|
|
3
|
+
"version": "22.6.0-canary.14",
|
|
4
4
|
"main": "dist/cjs/index.js",
|
|
5
5
|
"module": "dist/esm/index.js",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -73,9 +73,9 @@
|
|
|
73
73
|
"react-dom": "^18.2.0"
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
|
-
"@sitecore-jss/sitecore-jss": "22.6.0-canary.
|
|
77
|
-
"@sitecore-jss/sitecore-jss-dev-tools": "22.6.0-canary.
|
|
78
|
-
"@sitecore-jss/sitecore-jss-react": "22.6.0-canary.
|
|
76
|
+
"@sitecore-jss/sitecore-jss": "22.6.0-canary.14",
|
|
77
|
+
"@sitecore-jss/sitecore-jss-dev-tools": "22.6.0-canary.14",
|
|
78
|
+
"@sitecore-jss/sitecore-jss-react": "22.6.0-canary.14",
|
|
79
79
|
"@vercel/kv": "^0.2.1",
|
|
80
80
|
"prop-types": "^15.8.1",
|
|
81
81
|
"regex-parser": "^2.2.11",
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
},
|
|
84
84
|
"description": "",
|
|
85
85
|
"types": "types/index.d.ts",
|
|
86
|
-
"gitHead": "
|
|
86
|
+
"gitHead": "64734f6a02d1a91bdd0bf2d9d080415443787864",
|
|
87
87
|
"files": [
|
|
88
88
|
"dist",
|
|
89
89
|
"types",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SiteInfo, SiteResolver } from '@sitecore-jss/sitecore-jss/site';
|
|
2
2
|
import { NextRequest, NextResponse } from 'next/server';
|
|
3
|
+
export declare const REWRITE_HEADER_NAME = "x-sc-rewrite";
|
|
3
4
|
export type MiddlewareBaseConfig = {
|
|
4
5
|
/**
|
|
5
6
|
* function, determines if middleware should be turned off, based on cookie, header, or other considerations
|
|
@@ -28,7 +29,6 @@ export type MiddlewareBaseConfig = {
|
|
|
28
29
|
export declare abstract class MiddlewareBase {
|
|
29
30
|
protected config: MiddlewareBaseConfig;
|
|
30
31
|
protected SITE_SYMBOL: string;
|
|
31
|
-
protected REWRITE_HEADER_NAME: string;
|
|
32
32
|
protected defaultHostname: string;
|
|
33
33
|
constructor(config: MiddlewareBaseConfig);
|
|
34
34
|
/**
|
|
@@ -77,6 +77,7 @@ export declare abstract class MiddlewareBase {
|
|
|
77
77
|
* @param {string} rewritePath the destionation path
|
|
78
78
|
* @param {NextRequest} req the current request
|
|
79
79
|
* @param {NextResponse} res the current response
|
|
80
|
+
* @param {boolean} [skipHeader] don't write 'x-sc-rewrite' header
|
|
80
81
|
*/
|
|
81
|
-
protected rewrite(rewritePath: string, req: NextRequest, res: NextResponse): NextResponse;
|
|
82
|
+
protected rewrite(rewritePath: string, req: NextRequest, res: NextResponse, skipHeader?: boolean): NextResponse;
|
|
82
83
|
}
|