From 3870bc14cf1341f4f96298445926c7a949ef2f02 Mon Sep 17 00:00:00 2001 From: Artem Alexeyenko Date: Mon, 16 Jan 2023 18:47:24 -0500 Subject: [PATCH 1/5] fix rewrite middleware overriding multisite response --- .../nextjs-sxa/src/lib/middleware/plugins/redirects.ts | 4 ++-- .../src/middleware/redirects-middleware.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts b/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts index cea2330c21..0ee2fd780b 100644 --- a/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts +++ b/packages/create-sitecore-jss/src/templates/nextjs-sxa/src/lib/middleware/plugins/redirects.ts @@ -32,8 +32,8 @@ class RedirectsPlugin implements MiddlewarePlugin { * @param req * @returns Promise */ - async exec(req: NextRequest): Promise { - return this.redirectsMiddleware.getHandler()(req); + async exec(req: NextRequest, res?:NextResponse): Promise { + return this.redirectsMiddleware.getHandler()(req, res); } } diff --git a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts index e36eddcb5f..430339fc1f 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts @@ -89,19 +89,19 @@ export class RedirectsMiddleware { const hostname = this.getHostname(req); const siteName = res?.cookies.get('sc_site') || this.config.getSite(hostname).name; - const createResponse = async () => { + const createResponse = async (res?: NextResponse) => { if ( (this.config.disabled && this.config.disabled(req, NextResponse.next())) || this.excludeRoute(req.nextUrl.pathname) || (this.config.excludeRoute && this.config.excludeRoute(req.nextUrl.pathname)) ) { - return NextResponse.next(); + return res || NextResponse.next(); } // Find the redirect from result of RedirectService const existsRedirect = await this.getExistsRedirect(req, siteName); if (!existsRedirect) { - return NextResponse.next(); + return res || NextResponse.next(); } const url = req.nextUrl.clone(); @@ -135,7 +135,7 @@ export class RedirectsMiddleware { } }; - const response = await createResponse(); + const response = await createResponse(res); // Share site name with the following executed middlewares response.cookies.set('sc_site', siteName); From fea4f0c39d97de004a3e569444165a1a9f37aa47 Mon Sep 17 00:00:00 2001 From: Artem Alexeyenko Date: Tue, 17 Jan 2023 09:12:29 -0500 Subject: [PATCH 2/5] extra tests --- .../middleware/redirects-middleware.test.ts | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts index bc21513b9e..9738c0ac39 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts @@ -292,7 +292,7 @@ describe('RedirectsMiddleware', () => { // eslint-disable-next-line no-unused-expressions expect(fetchRedirects.called).to.be.true; expect(finalRes).to.deep.equal(res); - }); + }); it('should rewrite path when redirect type is server transfer', async () => { const res = NextResponse.rewrite('http://localhost:3000/found'); @@ -352,6 +352,67 @@ describe('RedirectsMiddleware', () => { expect(finalRes.status).to.equal(res.status); }); + it('should preserve site name from response data when provided, if no redirect type defined', async () => { + const res = NextResponse.next(); + const site = 'learn2grow'; + res.cookies.set('sc_site', site); + const req = createRequest({ + nextUrl: { + pathname: '/not-found', + locale: 'en', + clone() { + return Object.assign({}, req.nextUrl); + }, + }, + }); + + const { middleware, fetchRedirects, getSite } = createMiddleware({ + pattern: 'not-found', + target: 'http://localhost:3000/found', + redirectType: 'default', + isQueryStringPreserved: true, + locale: 'en', + }); + + const finalRes = await middleware.getHandler()(req, res); + + expect(getSite).to.not.be.called; + // eslint-disable-next-line no-unused-expressions + expect(fetchRedirects.called).to.be.true; + expect(finalRes.cookies.get('sc_site')).to.equal(site); + }); + + it('should preserve site name from response data when provided, if handler is disabled', async () => { + const res = NextResponse.next(); + const site = 'learn2grow'; + res.cookies.set('sc_site', site); + const req = createRequest({ + nextUrl: { + pathname: '/not-found', + locale: 'en', + clone() { + return Object.assign({}, req.nextUrl); + }, + }, + }); + + const { middleware, fetchRedirects, getSite } = createMiddleware({ + pattern: 'not-found', + target: 'http://localhost:3000/found', + redirectType: 'default', + isQueryStringPreserved: true, + locale: 'en', + disabled: () => true, + }); + + const finalRes = await middleware.getHandler()(req, res); + + expect(getSite).to.not.be.called; + // eslint-disable-next-line no-unused-expressions + expect(fetchRedirects.called).to.be.false; + expect(finalRes.cookies.get('sc_site')).to.equal(site); + }); + it('default fallback hostname is used', async () => { const res = NextResponse.redirect('http://localhost:3000/found', 301); const req = createRequest({ From bc622e17e5828f2aeb3a5fdc81dc72c43cb2f7b8 Mon Sep 17 00:00:00 2001 From: Artem Alexeyenko Date: Tue, 17 Jan 2023 09:38:54 -0500 Subject: [PATCH 3/5] lint tests --- .../src/middleware/redirects-middleware.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts index 9738c0ac39..1d4c8d783f 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.test.ts @@ -292,7 +292,7 @@ describe('RedirectsMiddleware', () => { // eslint-disable-next-line no-unused-expressions expect(fetchRedirects.called).to.be.true; expect(finalRes).to.deep.equal(res); - }); + }); it('should rewrite path when redirect type is server transfer', async () => { const res = NextResponse.rewrite('http://localhost:3000/found'); @@ -375,7 +375,7 @@ describe('RedirectsMiddleware', () => { }); const finalRes = await middleware.getHandler()(req, res); - + // eslint-disable-next-line no-unused-expressions expect(getSite).to.not.be.called; // eslint-disable-next-line no-unused-expressions expect(fetchRedirects.called).to.be.true; @@ -406,7 +406,7 @@ describe('RedirectsMiddleware', () => { }); const finalRes = await middleware.getHandler()(req, res); - + // eslint-disable-next-line no-unused-expressions expect(getSite).to.not.be.called; // eslint-disable-next-line no-unused-expressions expect(fetchRedirects.called).to.be.false; From 2f7480d4c9535192c9ed4b1a2f352ca6aea641a0 Mon Sep 17 00:00:00 2001 From: Artem Alexeyenko Date: Tue, 17 Jan 2023 11:27:11 -0500 Subject: [PATCH 4/5] remove res from nested function params --- .../sitecore-jss-nextjs/src/middleware/redirects-middleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts index 430339fc1f..a7c4cf417e 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts @@ -89,7 +89,7 @@ export class RedirectsMiddleware { const hostname = this.getHostname(req); const siteName = res?.cookies.get('sc_site') || this.config.getSite(hostname).name; - const createResponse = async (res?: NextResponse) => { + const createResponse = async () => { if ( (this.config.disabled && this.config.disabled(req, NextResponse.next())) || this.excludeRoute(req.nextUrl.pathname) || From f9137b39ee2c2454785d086eba7f4de08eea6ba4 Mon Sep 17 00:00:00 2001 From: Artem Alexeyenko Date: Tue, 17 Jan 2023 11:54:19 -0500 Subject: [PATCH 5/5] tweak method call --- .../sitecore-jss-nextjs/src/middleware/redirects-middleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts index a7c4cf417e..fbc435e890 100644 --- a/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts +++ b/packages/sitecore-jss-nextjs/src/middleware/redirects-middleware.ts @@ -135,7 +135,7 @@ export class RedirectsMiddleware { } }; - const response = await createResponse(res); + const response = await createResponse(); // Share site name with the following executed middlewares response.cookies.set('sc_site', siteName);