@sitecore-jss/sitecore-jss-nextjs 22.10.0-canary.1 → 22.10.0-canary.10

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.
@@ -26,9 +26,6 @@ const REGEXP_ABSOLUTE_URL = new RegExp('^(?:[a-z]+:)?//', 'i');
26
26
  * compares with current url and redirects to target url
27
27
  */
28
28
  class RedirectsMiddleware extends middleware_1.MiddlewareBase {
29
- /**
30
- * @param {RedirectsMiddlewareConfig} [config] redirects middleware config
31
- */
32
29
  constructor(config) {
33
30
  super(config);
34
31
  this.config = config;
@@ -136,7 +133,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
136
133
  const createResponse = () => __awaiter(this, void 0, void 0, function* () {
137
134
  var _a;
138
135
  const response = res || server_1.NextResponse.next();
139
- if (this.config.disabled && this.config.disabled(req, res || server_1.NextResponse.next())) {
136
+ if (this.config.disabled && this.config.disabled(req, response)) {
140
137
  sitecore_jss_1.debug.redirects('skipped (redirects middleware is disabled)');
141
138
  return response;
142
139
  }
@@ -152,7 +149,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
152
149
  response.headers.set('Cache-Control', 'no-store, must-revalidate');
153
150
  return response;
154
151
  }
155
- site = this.getSite(req, res);
152
+ site = this.getSite(req, response);
156
153
  // Find the redirect from result of RedirectService
157
154
  const existsRedirect = yield this.getExistsRedirect(req, site.name);
158
155
  if (!existsRedirect) {
@@ -169,7 +166,19 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
169
166
  }
170
167
  const url = this.normalizeUrl(req.nextUrl.clone());
171
168
  if (REGEXP_ABSOLUTE_URL.test(existsRedirect.target)) {
172
- url.href = existsRedirect.target;
169
+ // Perform variable substitution for absolute URLs
170
+ let finalTarget = existsRedirect.target;
171
+ if ((0, utils_1.isRegexOrUrl)(existsRedirect.pattern) === 'regex') {
172
+ const matched = url.pathname
173
+ .replace(/\/*$/gi, '')
174
+ .match((0, regex_parser_1.default)(existsRedirect.pattern));
175
+ if (matched) {
176
+ finalTarget = existsRedirect.target.replace(/\$(\d+)/g, (_, index) => {
177
+ return matched[parseInt(index, 10)] || '';
178
+ });
179
+ }
180
+ }
181
+ return this.dispatchRedirect(finalTarget, existsRedirect.redirectType, req, response, true);
173
182
  }
174
183
  else {
175
184
  const isUrl = (0, utils_1.isRegexOrUrl)(existsRedirect.pattern) === 'url';
@@ -191,25 +200,12 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
191
200
  const mergedQueryString = existsRedirect.isQueryStringPreserved
192
201
  ? (0, utils_1.mergeURLSearchParams)(new URLSearchParams((_a = url.search) !== null && _a !== void 0 ? _a : ''), new URLSearchParams(targetQueryString || ''))
193
202
  : targetQueryString || '';
194
- const prepareNewURL = new URL(`${targetPath}${mergedQueryString ? '?' + mergedQueryString : ''}`, url.origin);
203
+ const prepareNewURL = new URL(`${targetPath}${mergedQueryString ? `?${mergedQueryString}` : ''}`, url.origin);
195
204
  url.href = prepareNewURL.href;
196
205
  url.pathname = prepareNewURL.pathname;
197
206
  url.search = prepareNewURL.search;
198
207
  url.locale = req.nextUrl.locale;
199
- }
200
- /** return Response redirect with http code of redirect type */
201
- switch (existsRedirect.redirectType) {
202
- case site_1.REDIRECT_TYPE_301: {
203
- return this.createRedirectResponse(url, response, 301, 'Moved Permanently');
204
- }
205
- case site_1.REDIRECT_TYPE_302: {
206
- return this.createRedirectResponse(url, response, 302, 'Found');
207
- }
208
- case site_1.REDIRECT_TYPE_SERVER_TRANSFER: {
209
- return this.rewrite(url.href, req, response, true);
210
- }
211
- default:
212
- return response;
208
+ return this.dispatchRedirect(url, existsRedirect.redirectType, req, response, false);
213
209
  }
214
210
  });
215
211
  const response = yield createResponse();
@@ -230,7 +226,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
230
226
  */
231
227
  getRedirects(siteName) {
232
228
  return __awaiter(this, void 0, void 0, function* () {
233
- return yield this.redirectsService.fetchRedirects(siteName);
229
+ return this.redirectsService.fetchRedirects(siteName);
234
230
  });
235
231
  }
236
232
  /**
@@ -241,9 +237,8 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
241
237
  * @returns {string} normalize url
242
238
  */
243
239
  normalizeUrl(url) {
244
- if (!url.search) {
240
+ if (!url.search)
245
241
  return url;
246
- }
247
242
  /**
248
243
  * Prepare special parameters for exclusion.
249
244
  */
@@ -260,12 +255,7 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
260
255
  const newQueryString = url.search
261
256
  .replace(/^\?/, '')
262
257
  .split('&')
263
- .filter((param) => {
264
- if (!splittedPathname.includes(param)) {
265
- return param;
266
- }
267
- return false;
268
- })
258
+ .filter((param) => !splittedPathname.includes(param))
269
259
  .join('&');
270
260
  const newUrl = new URL(`${url.pathname.toLowerCase()}?${newQueryString}`, url.origin);
271
261
  url.search = newUrl.search;
@@ -273,6 +263,29 @@ class RedirectsMiddleware extends middleware_1.MiddlewareBase {
273
263
  url.href = newUrl.href;
274
264
  return url;
275
265
  }
266
+ /**
267
+ * Dispatch a redirect or rewrite based on type.
268
+ * @param {NextURL | string} target Final target to redirect/rewrite to (NextURL or string for externals).
269
+ * @param {string} type One of `REDIRECT_TYPE_301`, `REDIRECT_TYPE_302`, or `REDIRECT_TYPE_SERVER_TRANSFER`.
270
+ * @param {NextRequest} req Incoming request.
271
+ * @param {NextResponse} res Current response (used for header cleanup/carry-over).
272
+ * @param {boolean} isExternal Set to `true` when target is an external absolute URL.
273
+ * @returns A NextResponse.
274
+ */
275
+ dispatchRedirect(target, type, req, res, isExternal = false) {
276
+ switch (type) {
277
+ case site_1.REDIRECT_TYPE_301:
278
+ return this.createRedirectResponse(target, res, 301, 'Moved Permanently');
279
+ case site_1.REDIRECT_TYPE_302:
280
+ return this.createRedirectResponse(target, res, 302, 'Found');
281
+ case site_1.REDIRECT_TYPE_SERVER_TRANSFER:
282
+ // rewrite expects a string; unwrap NextURL if needed
283
+ return this.rewrite(typeof target === 'string' ? target : target.href, req, res, isExternal);
284
+ default:
285
+ // Unknown type: return the input response unchanged
286
+ return res;
287
+ }
288
+ }
276
289
  /**
277
290
  * Helper function to create a redirect response and remove the x-middleware-next header.
278
291
  * @param {NextURL} url The URL to redirect to.
@@ -20,9 +20,6 @@ const REGEXP_ABSOLUTE_URL = new RegExp('^(?:[a-z]+:)?//', 'i');
20
20
  * compares with current url and redirects to target url
21
21
  */
22
22
  export class RedirectsMiddleware extends MiddlewareBase {
23
- /**
24
- * @param {RedirectsMiddlewareConfig} [config] redirects middleware config
25
- */
26
23
  constructor(config) {
27
24
  super(config);
28
25
  this.config = config;
@@ -130,7 +127,7 @@ export class RedirectsMiddleware extends MiddlewareBase {
130
127
  const createResponse = () => __awaiter(this, void 0, void 0, function* () {
131
128
  var _a;
132
129
  const response = res || NextResponse.next();
133
- if (this.config.disabled && this.config.disabled(req, res || NextResponse.next())) {
130
+ if (this.config.disabled && this.config.disabled(req, response)) {
134
131
  debug.redirects('skipped (redirects middleware is disabled)');
135
132
  return response;
136
133
  }
@@ -146,7 +143,7 @@ export class RedirectsMiddleware extends MiddlewareBase {
146
143
  response.headers.set('Cache-Control', 'no-store, must-revalidate');
147
144
  return response;
148
145
  }
149
- site = this.getSite(req, res);
146
+ site = this.getSite(req, response);
150
147
  // Find the redirect from result of RedirectService
151
148
  const existsRedirect = yield this.getExistsRedirect(req, site.name);
152
149
  if (!existsRedirect) {
@@ -163,7 +160,19 @@ export class RedirectsMiddleware extends MiddlewareBase {
163
160
  }
164
161
  const url = this.normalizeUrl(req.nextUrl.clone());
165
162
  if (REGEXP_ABSOLUTE_URL.test(existsRedirect.target)) {
166
- url.href = existsRedirect.target;
163
+ // Perform variable substitution for absolute URLs
164
+ let finalTarget = existsRedirect.target;
165
+ if (isRegexOrUrl(existsRedirect.pattern) === 'regex') {
166
+ const matched = url.pathname
167
+ .replace(/\/*$/gi, '')
168
+ .match(regexParser(existsRedirect.pattern));
169
+ if (matched) {
170
+ finalTarget = existsRedirect.target.replace(/\$(\d+)/g, (_, index) => {
171
+ return matched[parseInt(index, 10)] || '';
172
+ });
173
+ }
174
+ }
175
+ return this.dispatchRedirect(finalTarget, existsRedirect.redirectType, req, response, true);
167
176
  }
168
177
  else {
169
178
  const isUrl = isRegexOrUrl(existsRedirect.pattern) === 'url';
@@ -185,25 +194,12 @@ export class RedirectsMiddleware extends MiddlewareBase {
185
194
  const mergedQueryString = existsRedirect.isQueryStringPreserved
186
195
  ? mergeURLSearchParams(new URLSearchParams((_a = url.search) !== null && _a !== void 0 ? _a : ''), new URLSearchParams(targetQueryString || ''))
187
196
  : targetQueryString || '';
188
- const prepareNewURL = new URL(`${targetPath}${mergedQueryString ? '?' + mergedQueryString : ''}`, url.origin);
197
+ const prepareNewURL = new URL(`${targetPath}${mergedQueryString ? `?${mergedQueryString}` : ''}`, url.origin);
189
198
  url.href = prepareNewURL.href;
190
199
  url.pathname = prepareNewURL.pathname;
191
200
  url.search = prepareNewURL.search;
192
201
  url.locale = req.nextUrl.locale;
193
- }
194
- /** return Response redirect with http code of redirect type */
195
- switch (existsRedirect.redirectType) {
196
- case REDIRECT_TYPE_301: {
197
- return this.createRedirectResponse(url, response, 301, 'Moved Permanently');
198
- }
199
- case REDIRECT_TYPE_302: {
200
- return this.createRedirectResponse(url, response, 302, 'Found');
201
- }
202
- case REDIRECT_TYPE_SERVER_TRANSFER: {
203
- return this.rewrite(url.href, req, response, true);
204
- }
205
- default:
206
- return response;
202
+ return this.dispatchRedirect(url, existsRedirect.redirectType, req, response, false);
207
203
  }
208
204
  });
209
205
  const response = yield createResponse();
@@ -224,7 +220,7 @@ export class RedirectsMiddleware extends MiddlewareBase {
224
220
  */
225
221
  getRedirects(siteName) {
226
222
  return __awaiter(this, void 0, void 0, function* () {
227
- return yield this.redirectsService.fetchRedirects(siteName);
223
+ return this.redirectsService.fetchRedirects(siteName);
228
224
  });
229
225
  }
230
226
  /**
@@ -235,9 +231,8 @@ export class RedirectsMiddleware extends MiddlewareBase {
235
231
  * @returns {string} normalize url
236
232
  */
237
233
  normalizeUrl(url) {
238
- if (!url.search) {
234
+ if (!url.search)
239
235
  return url;
240
- }
241
236
  /**
242
237
  * Prepare special parameters for exclusion.
243
238
  */
@@ -254,12 +249,7 @@ export class RedirectsMiddleware extends MiddlewareBase {
254
249
  const newQueryString = url.search
255
250
  .replace(/^\?/, '')
256
251
  .split('&')
257
- .filter((param) => {
258
- if (!splittedPathname.includes(param)) {
259
- return param;
260
- }
261
- return false;
262
- })
252
+ .filter((param) => !splittedPathname.includes(param))
263
253
  .join('&');
264
254
  const newUrl = new URL(`${url.pathname.toLowerCase()}?${newQueryString}`, url.origin);
265
255
  url.search = newUrl.search;
@@ -267,6 +257,29 @@ export class RedirectsMiddleware extends MiddlewareBase {
267
257
  url.href = newUrl.href;
268
258
  return url;
269
259
  }
260
+ /**
261
+ * Dispatch a redirect or rewrite based on type.
262
+ * @param {NextURL | string} target Final target to redirect/rewrite to (NextURL or string for externals).
263
+ * @param {string} type One of `REDIRECT_TYPE_301`, `REDIRECT_TYPE_302`, or `REDIRECT_TYPE_SERVER_TRANSFER`.
264
+ * @param {NextRequest} req Incoming request.
265
+ * @param {NextResponse} res Current response (used for header cleanup/carry-over).
266
+ * @param {boolean} isExternal Set to `true` when target is an external absolute URL.
267
+ * @returns A NextResponse.
268
+ */
269
+ dispatchRedirect(target, type, req, res, isExternal = false) {
270
+ switch (type) {
271
+ case REDIRECT_TYPE_301:
272
+ return this.createRedirectResponse(target, res, 301, 'Moved Permanently');
273
+ case REDIRECT_TYPE_302:
274
+ return this.createRedirectResponse(target, res, 302, 'Found');
275
+ case REDIRECT_TYPE_SERVER_TRANSFER:
276
+ // rewrite expects a string; unwrap NextURL if needed
277
+ return this.rewrite(typeof target === 'string' ? target : target.href, req, res, isExternal);
278
+ default:
279
+ // Unknown type: return the input response unchanged
280
+ return res;
281
+ }
282
+ }
270
283
  /**
271
284
  * Helper function to create a redirect response and remove the x-middleware-next header.
272
285
  * @param {NextURL} url The URL to redirect to.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sitecore-jss/sitecore-jss-nextjs",
3
- "version": "22.10.0-canary.1",
3
+ "version": "22.10.0-canary.10",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "sideEffects": false,
@@ -72,16 +72,16 @@
72
72
  "react-dom": "^19.1.0"
73
73
  },
74
74
  "dependencies": {
75
- "@sitecore-jss/sitecore-jss": "22.10.0-canary.1",
76
- "@sitecore-jss/sitecore-jss-dev-tools": "22.10.0-canary.1",
77
- "@sitecore-jss/sitecore-jss-react": "22.10.0-canary.1",
75
+ "@sitecore-jss/sitecore-jss": "22.10.0-canary.10",
76
+ "@sitecore-jss/sitecore-jss-dev-tools": "22.10.0-canary.10",
77
+ "@sitecore-jss/sitecore-jss-react": "22.10.0-canary.10",
78
78
  "@vercel/kv": "^0.2.1",
79
79
  "regex-parser": "^2.2.11",
80
80
  "sync-disk-cache": "^2.1.0"
81
81
  },
82
82
  "description": "",
83
83
  "types": "types/index.d.ts",
84
- "gitHead": "fdb771841e9cfec52c003ef4a9e88c8ac9017bd0",
84
+ "gitHead": "79499009753a300a5169377663fc5270cd001365",
85
85
  "files": [
86
86
  "dist",
87
87
  "types",
@@ -22,9 +22,6 @@ export declare class RedirectsMiddleware extends MiddlewareBase {
22
22
  protected config: RedirectsMiddlewareConfig;
23
23
  private redirectsService;
24
24
  private locales;
25
- /**
26
- * @param {RedirectsMiddlewareConfig} [config] redirects middleware config
27
- */
28
25
  constructor(config: RedirectsMiddlewareConfig);
29
26
  /**
30
27
  * Gets the Next.js middleware handler with error handling
@@ -60,6 +57,16 @@ export declare class RedirectsMiddleware extends MiddlewareBase {
60
57
  * @returns {string} normalize url
61
58
  */
62
59
  private normalizeUrl;
60
+ /**
61
+ * Dispatch a redirect or rewrite based on type.
62
+ * @param {NextURL | string} target Final target to redirect/rewrite to (NextURL or string for externals).
63
+ * @param {string} type One of `REDIRECT_TYPE_301`, `REDIRECT_TYPE_302`, or `REDIRECT_TYPE_SERVER_TRANSFER`.
64
+ * @param {NextRequest} req Incoming request.
65
+ * @param {NextResponse} res Current response (used for header cleanup/carry-over).
66
+ * @param {boolean} isExternal Set to `true` when target is an external absolute URL.
67
+ * @returns A NextResponse.
68
+ */
69
+ private dispatchRedirect;
63
70
  /**
64
71
  * Helper function to create a redirect response and remove the x-middleware-next header.
65
72
  * @param {NextURL} url The URL to redirect to.