@sitecore-jss/sitecore-jss-nextjs 22.5.3-canary.1 → 22.5.3-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.
|
@@ -62,23 +62,35 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
62
62
|
*/
|
|
63
63
|
getExistsRedirect(req, siteName) {
|
|
64
64
|
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
const { pathname:
|
|
65
|
+
const { pathname: incomingURL, search: incomingQS = '' } = this.normalizeUrl(req.nextUrl.clone());
|
|
66
66
|
const locale = this.getLanguage(req);
|
|
67
|
-
const normalizedPath =
|
|
67
|
+
const normalizedPath = incomingURL.replace(/\/*$/gi, '');
|
|
68
68
|
const redirects = yield this.redirectsService.fetchRedirects(siteName);
|
|
69
69
|
const language = this.getLanguage(req);
|
|
70
70
|
const modifyRedirects = structuredClone(redirects);
|
|
71
71
|
let matchedQueryString;
|
|
72
|
+
const localePath = `/${locale.toLowerCase()}${normalizedPath}`;
|
|
72
73
|
return modifyRedirects.length
|
|
73
74
|
? modifyRedirects.find((redirect) => {
|
|
75
|
+
// process static URL (non-regex) rules
|
|
74
76
|
if ((0, utils_1.isRegexOrUrl)(redirect.pattern) === 'url') {
|
|
75
|
-
const
|
|
77
|
+
const urlArray = redirect.pattern.endsWith('/')
|
|
76
78
|
? redirect.pattern.slice(0, -1).split('?')
|
|
77
79
|
: redirect.pattern.split('?');
|
|
78
|
-
|
|
80
|
+
const patternQS = urlArray[1];
|
|
81
|
+
let patternPath = urlArray[0];
|
|
82
|
+
// nextjs routes are case-sensitive, but locales should be compared case-insensitively
|
|
83
|
+
const patternParts = patternPath.split('/');
|
|
84
|
+
const maybeLocale = patternParts[1].toLowerCase();
|
|
85
|
+
// case insensitive lookup of locales
|
|
86
|
+
if (new RegExp(this.locales.join('|'), 'i').test(maybeLocale)) {
|
|
87
|
+
patternPath = patternPath.replace(`/${patternParts[1]}`, `/${maybeLocale}`);
|
|
88
|
+
}
|
|
89
|
+
return ((patternPath === localePath || patternPath === normalizedPath) &&
|
|
79
90
|
(!patternQS ||
|
|
80
|
-
(0, utils_1.areURLSearchParamsEqual)(new URLSearchParams(patternQS), new URLSearchParams(
|
|
91
|
+
(0, utils_1.areURLSearchParamsEqual)(new URLSearchParams(patternQS), new URLSearchParams(incomingQS))));
|
|
81
92
|
}
|
|
93
|
+
// process regex rules
|
|
82
94
|
// Modify the redirect pattern to ignore the language prefix in the path
|
|
83
95
|
// And escapes non-special "?" characters in a string or regex.
|
|
84
96
|
redirect.pattern = (0, utils_1.escapeNonSpecialQuestionMarks)(redirect.pattern.replace(new RegExp(`^[^]?/${language}/`, 'gi'), ''));
|
|
@@ -90,21 +102,15 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
90
102
|
.replace(/\$\/gi$/g, '')}[\/]?$/i`; // Ensures the pattern allows an optional trailing slash
|
|
91
103
|
// Redirect pattern matches the full incoming URL with query string present
|
|
92
104
|
matchedQueryString = [
|
|
93
|
-
(0, regex_parser_1.default)(redirect.pattern).test(`${
|
|
94
|
-
(0, regex_parser_1.default)(redirect.pattern).test(
|
|
105
|
+
(0, regex_parser_1.default)(redirect.pattern).test(`${localePath}${incomingQS}`),
|
|
106
|
+
(0, regex_parser_1.default)(redirect.pattern).test(`${normalizedPath}${incomingQS}`),
|
|
95
107
|
].some(Boolean)
|
|
96
|
-
?
|
|
108
|
+
? incomingQS
|
|
97
109
|
: undefined;
|
|
98
110
|
// Save the matched query string (if found) into the redirect object
|
|
99
111
|
redirect.matchedQueryString = matchedQueryString || '';
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
patern: redirect.pattern,
|
|
103
|
-
targetURL,
|
|
104
|
-
targetQS,
|
|
105
|
-
});
|
|
106
|
-
return (!!((0, regex_parser_1.default)(redirect.pattern).test(targetURL) ||
|
|
107
|
-
(0, regex_parser_1.default)(redirect.pattern).test(`/${req.nextUrl.locale}${targetURL}`) ||
|
|
112
|
+
return (!!((0, regex_parser_1.default)(redirect.pattern).test(`/${req.nextUrl.locale}${incomingURL}`) ||
|
|
113
|
+
(0, regex_parser_1.default)(redirect.pattern).test(incomingURL) ||
|
|
108
114
|
matchedQueryString) && (redirect.locale ? redirect.locale.toLowerCase() === locale.toLowerCase() : true));
|
|
109
115
|
})
|
|
110
116
|
: undefined;
|
|
@@ -148,11 +154,11 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
|
|
|
148
154
|
site = this.getSite(req, res);
|
|
149
155
|
// Find the redirect from result of RedirectService
|
|
150
156
|
const existsRedirect = yield this.getExistsRedirect(req, site.name);
|
|
151
|
-
sitecore_jss_1.debug.redirects('Existing redirect: %o', { existsRedirect });
|
|
152
157
|
if (!existsRedirect) {
|
|
153
158
|
sitecore_jss_1.debug.redirects('skipped (redirect does not exist)');
|
|
154
159
|
return response;
|
|
155
160
|
}
|
|
161
|
+
sitecore_jss_1.debug.redirects('Matched redirect rule: %o', { existsRedirect });
|
|
156
162
|
// Find context site language and replace token
|
|
157
163
|
if (REGEXP_CONTEXT_SITE_LANG.test(existsRedirect.target) &&
|
|
158
164
|
!(REGEXP_ABSOLUTE_URL.test(existsRedirect.target) &&
|
|
@@ -56,23 +56,35 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
56
56
|
*/
|
|
57
57
|
getExistsRedirect(req, siteName) {
|
|
58
58
|
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
-
const { pathname:
|
|
59
|
+
const { pathname: incomingURL, search: incomingQS = '' } = this.normalizeUrl(req.nextUrl.clone());
|
|
60
60
|
const locale = this.getLanguage(req);
|
|
61
|
-
const normalizedPath =
|
|
61
|
+
const normalizedPath = incomingURL.replace(/\/*$/gi, '');
|
|
62
62
|
const redirects = yield this.redirectsService.fetchRedirects(siteName);
|
|
63
63
|
const language = this.getLanguage(req);
|
|
64
64
|
const modifyRedirects = structuredClone(redirects);
|
|
65
65
|
let matchedQueryString;
|
|
66
|
+
const localePath = `/${locale.toLowerCase()}${normalizedPath}`;
|
|
66
67
|
return modifyRedirects.length
|
|
67
68
|
? modifyRedirects.find((redirect) => {
|
|
69
|
+
// process static URL (non-regex) rules
|
|
68
70
|
if (isRegexOrUrl(redirect.pattern) === 'url') {
|
|
69
|
-
const
|
|
71
|
+
const urlArray = redirect.pattern.endsWith('/')
|
|
70
72
|
? redirect.pattern.slice(0, -1).split('?')
|
|
71
73
|
: redirect.pattern.split('?');
|
|
72
|
-
|
|
74
|
+
const patternQS = urlArray[1];
|
|
75
|
+
let patternPath = urlArray[0];
|
|
76
|
+
// nextjs routes are case-sensitive, but locales should be compared case-insensitively
|
|
77
|
+
const patternParts = patternPath.split('/');
|
|
78
|
+
const maybeLocale = patternParts[1].toLowerCase();
|
|
79
|
+
// case insensitive lookup of locales
|
|
80
|
+
if (new RegExp(this.locales.join('|'), 'i').test(maybeLocale)) {
|
|
81
|
+
patternPath = patternPath.replace(`/${patternParts[1]}`, `/${maybeLocale}`);
|
|
82
|
+
}
|
|
83
|
+
return ((patternPath === localePath || patternPath === normalizedPath) &&
|
|
73
84
|
(!patternQS ||
|
|
74
|
-
areURLSearchParamsEqual(new URLSearchParams(patternQS), new URLSearchParams(
|
|
85
|
+
areURLSearchParamsEqual(new URLSearchParams(patternQS), new URLSearchParams(incomingQS))));
|
|
75
86
|
}
|
|
87
|
+
// process regex rules
|
|
76
88
|
// Modify the redirect pattern to ignore the language prefix in the path
|
|
77
89
|
// And escapes non-special "?" characters in a string or regex.
|
|
78
90
|
redirect.pattern = escapeNonSpecialQuestionMarks(redirect.pattern.replace(new RegExp(`^[^]?/${language}/`, 'gi'), ''));
|
|
@@ -84,21 +96,15 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
84
96
|
.replace(/\$\/gi$/g, '')}[\/]?$/i`; // Ensures the pattern allows an optional trailing slash
|
|
85
97
|
// Redirect pattern matches the full incoming URL with query string present
|
|
86
98
|
matchedQueryString = [
|
|
87
|
-
regexParser(redirect.pattern).test(`${
|
|
88
|
-
regexParser(redirect.pattern).test(
|
|
99
|
+
regexParser(redirect.pattern).test(`${localePath}${incomingQS}`),
|
|
100
|
+
regexParser(redirect.pattern).test(`${normalizedPath}${incomingQS}`),
|
|
89
101
|
].some(Boolean)
|
|
90
|
-
?
|
|
102
|
+
? incomingQS
|
|
91
103
|
: undefined;
|
|
92
104
|
// Save the matched query string (if found) into the redirect object
|
|
93
105
|
redirect.matchedQueryString = matchedQueryString || '';
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
patern: redirect.pattern,
|
|
97
|
-
targetURL,
|
|
98
|
-
targetQS,
|
|
99
|
-
});
|
|
100
|
-
return (!!(regexParser(redirect.pattern).test(targetURL) ||
|
|
101
|
-
regexParser(redirect.pattern).test(`/${req.nextUrl.locale}${targetURL}`) ||
|
|
106
|
+
return (!!(regexParser(redirect.pattern).test(`/${req.nextUrl.locale}${incomingURL}`) ||
|
|
107
|
+
regexParser(redirect.pattern).test(incomingURL) ||
|
|
102
108
|
matchedQueryString) && (redirect.locale ? redirect.locale.toLowerCase() === locale.toLowerCase() : true));
|
|
103
109
|
})
|
|
104
110
|
: undefined;
|
|
@@ -142,11 +148,11 @@ export class RedirectsMiddleware extends MiddlewareBase {
|
|
|
142
148
|
site = this.getSite(req, res);
|
|
143
149
|
// Find the redirect from result of RedirectService
|
|
144
150
|
const existsRedirect = yield this.getExistsRedirect(req, site.name);
|
|
145
|
-
debug.redirects('Existing redirect: %o', { existsRedirect });
|
|
146
151
|
if (!existsRedirect) {
|
|
147
152
|
debug.redirects('skipped (redirect does not exist)');
|
|
148
153
|
return response;
|
|
149
154
|
}
|
|
155
|
+
debug.redirects('Matched redirect rule: %o', { existsRedirect });
|
|
150
156
|
// Find context site language and replace token
|
|
151
157
|
if (REGEXP_CONTEXT_SITE_LANG.test(existsRedirect.target) &&
|
|
152
158
|
!(REGEXP_ABSOLUTE_URL.test(existsRedirect.target) &&
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sitecore-jss/sitecore-jss-nextjs",
|
|
3
|
-
"version": "22.5.3-canary.
|
|
3
|
+
"version": "22.5.3-canary.2",
|
|
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.5.3-canary.
|
|
77
|
-
"@sitecore-jss/sitecore-jss-dev-tools": "22.5.3-canary.
|
|
78
|
-
"@sitecore-jss/sitecore-jss-react": "22.5.3-canary.
|
|
76
|
+
"@sitecore-jss/sitecore-jss": "22.5.3-canary.2",
|
|
77
|
+
"@sitecore-jss/sitecore-jss-dev-tools": "22.5.3-canary.2",
|
|
78
|
+
"@sitecore-jss/sitecore-jss-react": "22.5.3-canary.2",
|
|
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": "03f9b4b5909008e6e4a89e9ceffe612bab1b1a52",
|
|
87
87
|
"files": [
|
|
88
88
|
"dist",
|
|
89
89
|
"types",
|