diff --git a/packages/sitecore-jss/src/site/index.ts b/packages/sitecore-jss/src/site/index.ts index 4ec786780c..f54ffc4db8 100644 --- a/packages/sitecore-jss/src/site/index.ts +++ b/packages/sitecore-jss/src/site/index.ts @@ -25,6 +25,7 @@ export { GraphQLErrorPagesServiceConfig, } from './graphql-error-pages-service'; +export { SiteResolver } from './site-resolver'; export { SiteInfo, GraphQLSiteInfoService, diff --git a/packages/sitecore-jss/src/site/site-resolver.test.ts b/packages/sitecore-jss/src/site/site-resolver.test.ts new file mode 100644 index 0000000000..d5c2d7aaf6 --- /dev/null +++ b/packages/sitecore-jss/src/site/site-resolver.test.ts @@ -0,0 +1,37 @@ +import { expect } from 'chai'; +import { SiteResolver } from './site-resolver'; + +describe('SiteResolver', () => { + const sitesInfo = [ + { + name: 'cat', + hostName: 'supercat.com', + virtualFolder: '/north', + language: 'en', + }, + { + name: 'dog', + hostName: 'superdog.com', + virtualFolder: '/south', + language: 'da-DK', + }, + ]; + + it('should resolve site name', () => { + const siteName = SiteResolver.resolve('superdog.com', sitesInfo); + + expect(siteName).to.equal('dog'); + }); + + it('should return custom fallback site name', () => { + const siteName = SiteResolver.resolve('superanimal.com', sitesInfo, 'animal'); + + expect(siteName).to.equal('animal'); + }); + + it('should return default fallback site name', () => { + const siteName = SiteResolver.resolve('superanimal.com', sitesInfo); + + expect(siteName).to.equal('website'); + }); +}); diff --git a/packages/sitecore-jss/src/site/site-resolver.ts b/packages/sitecore-jss/src/site/site-resolver.ts new file mode 100644 index 0000000000..25137aad2f --- /dev/null +++ b/packages/sitecore-jss/src/site/site-resolver.ts @@ -0,0 +1,17 @@ +import { SiteInfo } from './graphql-siteinfo-service'; + +// This resolver is used to determine site name based on the provided hostname +export class SiteResolver { + /** + * Resolve siteName by hostName + * @param {string} hostName + * @param {SiteInfo[]} sitesInfo + * @param {string} [fallbackSiteName] siteName to be returned in case siteName is not found + * @returns {string} siteName + */ + static resolve = (hostName: string, sitesInfo: SiteInfo[], fallbackSiteName?: string): string => { + const siteInfo = sitesInfo.find((info) => info.hostName === hostName); + + return siteInfo?.name || fallbackSiteName || 'website'; + }; +}