Skip to content

Commit aa2c943

Browse files
illiakovalenkoart-alexeyenkoAutomated Buildambrauersc-ruslanmatkovskyi
authored
[Next.js][Multi-site] Support for "sc_site" query string parameter (#1283)
* jss-cli unit test coverage: first batch * jss-cli unit test coverage: second batch * jss-cli unit tests: second batch * fix expected output for test not to fail across environments * lint * dev-tools unit test coverage first batch * dev-tools unit test coverage: second batch * resolve-scjssconfig test placeholder (for the future!) * exclude index file from jss-vue test coverage (#1266) * version v21.1.0-canary.58 [skip ci] * fix test for scjssconfig resolving * Update packages/sitecore-jss-dev-tools/src/manifest/manifest-manager.test.ts Co-authored-by: Adam Brauer <[email protected]> * Update packages/sitecore-jss-dev-tools/src/manifest/manifest-manager.test.ts Co-authored-by: Adam Brauer <[email protected]> * lint * adding test data for scjssconfig * some improvements to reject logic in resolve scjssconfig * lint numero 2 * version v21.1.0-canary.59 [skip ci] * #556667: fixed urls for sitemap * version v21.1.0-canary.60 [skip ci] * final batch * re-gen yarn.lock * yarn.lock re-update * version v21.1.0-canary.61 [skip ci] * #552985: fixed header styles * version v21.1.0-canary.62 [skip ci] * #546298: fixed style for showing hidden components * version v21.1.0-canary.63 [skip ci] * SiteResolver.resolve updates: removed 'language' from site resolution logic, return SiteInfo instead of site name * [Next.js][Multi-site] Multi-site middleware plugin * #559044: fixed rendering dynamic placeholder (#1278) * version v21.1.0-canary.64 [skip ci] * Adjust with latest site resolver changes * adjust * Add latest changes * Extra comment * extra fix * Extend unit tests * Revert cookie set change * Use response cookies instead of request * Add querystring support * Adjust changes according to review * Adjust changes * Adjust changes according to review * lint fix * Use `sc_site` request cookie when it's present Co-authored-by: Artem Alexeyenko <[email protected]> Co-authored-by: Automated Build <[email protected]> Co-authored-by: Adam Brauer <[email protected]> Co-authored-by: Ruslan Matkovskyi <[email protected]> Co-authored-by: Ruslan Matkovskyi <[email protected]>
1 parent bc26952 commit aa2c943

File tree

2 files changed

+92
-2
lines changed

2 files changed

+92
-2
lines changed

packages/sitecore-jss-nextjs/src/middleware/multisite-middleware.test.ts

+87-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ describe('MultisiteMiddleware', () => {
2828
clone() {
2929
return Object.assign({}, req.nextUrl);
3030
},
31-
...props?.nextUrl,
31+
searchParams: {
32+
get(key) {
33+
return req.nextUrl.searchParams[key];
34+
},
35+
...props.searchParams,
36+
},
37+
...props.nextUrl,
3238
},
3339
headers: {
3440
get(key: string) {
@@ -308,6 +314,86 @@ describe('MultisiteMiddleware', () => {
308314

309315
nextRewriteStub.restore();
310316
});
317+
318+
it('sc_site querystring parameter is provided', async () => {
319+
const req = createRequest({ searchParams: { sc_site: 'qsFoo' } });
320+
321+
const res = createResponse();
322+
323+
const nextRewriteStub = sinon.stub(nextjs.NextResponse, 'rewrite').returns(res);
324+
325+
const { middleware, getSite } = createMiddleware();
326+
327+
const finalRes = await middleware.getHandler()(req, res);
328+
329+
validateDebugLog('multisite middleware start: %o', {
330+
pathname: '/styleguide',
331+
hostname: 'foo.net',
332+
});
333+
334+
validateDebugLog('multisite middleware end: %o', {
335+
rewritePath: '/_site_qsFoo/styleguide',
336+
siteName: 'qsFoo',
337+
headers: {
338+
'x-sc-rewrite': '/_site_qsFoo/styleguide',
339+
},
340+
cookies: {
341+
...res.cookies,
342+
sc_site: 'qsFoo',
343+
},
344+
});
345+
346+
expect(getSite.notCalled).equal(true);
347+
348+
expect(finalRes).to.deep.equal(res);
349+
350+
expect(nextRewriteStub).calledWith({
351+
...req.nextUrl,
352+
pathname: '/_site_qsFoo/styleguide',
353+
});
354+
355+
nextRewriteStub.restore();
356+
});
357+
358+
it('sc_site cookie is provided', async () => {
359+
const req = createRequest({ cookieValues: { sc_site: 'foobar' } });
360+
361+
const res = createResponse();
362+
363+
const nextRewriteStub = sinon.stub(nextjs.NextResponse, 'rewrite').returns(res);
364+
365+
const { middleware, getSite } = createMiddleware();
366+
367+
const finalRes = await middleware.getHandler()(req, res);
368+
369+
validateDebugLog('multisite middleware start: %o', {
370+
pathname: '/styleguide',
371+
hostname: 'foo.net',
372+
});
373+
374+
validateDebugLog('multisite middleware end: %o', {
375+
rewritePath: '/_site_foobar/styleguide',
376+
siteName: 'foobar',
377+
headers: {
378+
'x-sc-rewrite': '/_site_foobar/styleguide',
379+
},
380+
cookies: {
381+
...res.cookies,
382+
sc_site: 'foobar',
383+
},
384+
});
385+
386+
expect(getSite.notCalled).equal(true);
387+
388+
expect(finalRes).to.deep.equal(res);
389+
390+
expect(nextRewriteStub).calledWith({
391+
...req.nextUrl,
392+
pathname: '/_site_foobar/styleguide',
393+
});
394+
395+
nextRewriteStub.restore();
396+
});
311397
});
312398

313399
describe('error handling', () => {

packages/sitecore-jss-nextjs/src/middleware/multisite-middleware.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ export class MultisiteMiddleware {
9494
return response;
9595
}
9696

97-
const { name: siteName } = this.config.getSite(hostname);
97+
// Site name can be forced by query string parameter or cookie
98+
const siteName =
99+
req.nextUrl.searchParams.get('sc_site') ||
100+
req.cookies.get('sc_site') ||
101+
this.config.getSite(hostname).name;
98102

99103
// Rewrite to site specific path
100104
const rewritePath = getSiteRewrite(pathname, {

0 commit comments

Comments
 (0)