@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,
|
|
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,
|
|
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
|
-
|
|
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 ?
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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 ?
|
|
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
|
|
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.
|
|
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.
|
|
76
|
-
"@sitecore-jss/sitecore-jss-dev-tools": "22.10.0-canary.
|
|
77
|
-
"@sitecore-jss/sitecore-jss-react": "22.10.0-canary.
|
|
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": "
|
|
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.
|