@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: targetURL, search: targetQS = '' } = this.normalizeUrl(req.nextUrl.clone());
65
+ const { pathname: incomingURL, search: incomingQS = '' } = this.normalizeUrl(req.nextUrl.clone());
66
66
  const locale = this.getLanguage(req);
67
- const normalizedPath = targetURL.replace(/\/*$/gi, '');
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 [patternPath, patternQS] = redirect.pattern.endsWith('/')
77
+ const urlArray = redirect.pattern.endsWith('/')
76
78
  ? redirect.pattern.slice(0, -1).split('?')
77
79
  : redirect.pattern.split('?');
78
- return ((patternPath === normalizedPath || patternPath === `/${locale}${normalizedPath}`) &&
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(targetQS))));
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(`${normalizedPath}${targetQS}`),
94
- (0, regex_parser_1.default)(redirect.pattern).test(`/${locale}${normalizedPath}${targetQS}`),
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
- ? targetQS
108
+ ? incomingQS
97
109
  : undefined;
98
110
  // Save the matched query string (if found) into the redirect object
99
111
  redirect.matchedQueryString = matchedQueryString || '';
100
- sitecore_jss_1.debug.redirects('All info: %o', {
101
- matchedQueryString,
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: targetURL, search: targetQS = '' } = this.normalizeUrl(req.nextUrl.clone());
59
+ const { pathname: incomingURL, search: incomingQS = '' } = this.normalizeUrl(req.nextUrl.clone());
60
60
  const locale = this.getLanguage(req);
61
- const normalizedPath = targetURL.replace(/\/*$/gi, '');
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 [patternPath, patternQS] = redirect.pattern.endsWith('/')
71
+ const urlArray = redirect.pattern.endsWith('/')
70
72
  ? redirect.pattern.slice(0, -1).split('?')
71
73
  : redirect.pattern.split('?');
72
- return ((patternPath === normalizedPath || patternPath === `/${locale}${normalizedPath}`) &&
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(targetQS))));
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(`${normalizedPath}${targetQS}`),
88
- regexParser(redirect.pattern).test(`/${locale}${normalizedPath}${targetQS}`),
99
+ regexParser(redirect.pattern).test(`${localePath}${incomingQS}`),
100
+ regexParser(redirect.pattern).test(`${normalizedPath}${incomingQS}`),
89
101
  ].some(Boolean)
90
- ? targetQS
102
+ ? incomingQS
91
103
  : undefined;
92
104
  // Save the matched query string (if found) into the redirect object
93
105
  redirect.matchedQueryString = matchedQueryString || '';
94
- debug.redirects('All info: %o', {
95
- matchedQueryString,
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.1",
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.1",
77
- "@sitecore-jss/sitecore-jss-dev-tools": "22.5.3-canary.1",
78
- "@sitecore-jss/sitecore-jss-react": "22.5.3-canary.1",
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": "8019fc40cb0aa7e4408c4e40b93fcab24a3d72c0",
86
+ "gitHead": "03f9b4b5909008e6e4a89e9ceffe612bab1b1a52",
87
87
  "files": [
88
88
  "dist",
89
89
  "types",