diff --git a/docs/search-core.cloudchoice.md b/docs/search-core.cloudchoice.md new file mode 100644 index 00000000..d1102d14 --- /dev/null +++ b/docs/search-core.cloudchoice.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@yext/search-core](./search-core.md) > [CloudChoice](./search-core.cloudchoice.md) + +## CloudChoice enum + +Defines the cloud choice of the API domains. + +Signature: + +```typescript +export declare enum CloudChoice +``` + +## Enumeration Members + +| Member | Value | Description | +| --- | --- | --- | +| GLOBAL\_GCP | "GLOBAL-GCP" | | +| GLOBAL\_MULTI | "GLOBAL-MULTI" | | + diff --git a/docs/search-core.md b/docs/search-core.md index 3ca5a1c9..a36f8cc3 100644 --- a/docs/search-core.md +++ b/docs/search-core.md @@ -17,6 +17,7 @@ | --- | --- | | [AppliedQueryFilterType](./search-core.appliedqueryfiltertype.md) | Represents the type of [AppliedQueryFilter](./search-core.appliedqueryfilter.md) applied to a search. | | [BuiltInFieldType](./search-core.builtinfieldtype.md) | Possible built-in field types for [DirectAnswer.fieldType](./search-core.directanswer.fieldtype.md). | +| [CloudChoice](./search-core.cloudchoice.md) | Defines the cloud choice of the API domains. | | [CloudRegion](./search-core.cloudregion.md) | Defines the cloud region of the API domains. | | [DirectAnswerType](./search-core.directanswertype.md) | Represents the type of direct answer. | | [Direction](./search-core.direction.md) | The direction of a sort. | diff --git a/docs/search-core.servingconfig.cloudchoice.md b/docs/search-core.servingconfig.cloudchoice.md new file mode 100644 index 00000000..38c42cee --- /dev/null +++ b/docs/search-core.servingconfig.cloudchoice.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@yext/search-core](./search-core.md) > [ServingConfig](./search-core.servingconfig.md) > [cloudChoice](./search-core.servingconfig.cloudchoice.md) + +## ServingConfig.cloudChoice property + +Defines the cloud choice of the API domains. + +Signature: + +```typescript +cloudChoice?: CloudChoice; +``` diff --git a/docs/search-core.servingconfig.md b/docs/search-core.servingconfig.md index 233f2845..6d6a056c 100644 --- a/docs/search-core.servingconfig.md +++ b/docs/search-core.servingconfig.md @@ -16,6 +16,7 @@ export interface ServingConfig | Property | Type | Description | | --- | --- | --- | +| [cloudChoice?](./search-core.servingconfig.cloudchoice.md) | [CloudChoice](./search-core.cloudchoice.md) | (Optional) Defines the cloud choice of the API domains. | | [cloudRegion?](./search-core.servingconfig.cloudregion.md) | [CloudRegion](./search-core.cloudregion.md) | (Optional) Defines the cloud region of the API domains. | | [environment?](./search-core.servingconfig.environment.md) | [Environment](./search-core.environment.md) | (Optional) Defines the environment of the API domains. | diff --git a/etc/search-core.api.md b/etc/search-core.api.md index 1435c291..d56e9bf6 100644 --- a/etc/search-core.api.md +++ b/etc/search-core.api.md @@ -166,6 +166,14 @@ export interface ClientSDKHeaderValues { ANSWERS_CORE?: never; } +// @public +export enum CloudChoice { + // (undocumented) + GLOBAL_GCP = "GLOBAL-GCP", + // (undocumented) + GLOBAL_MULTI = "GLOBAL-MULTI" +} + // @public export enum CloudRegion { // (undocumented) @@ -699,6 +707,7 @@ export interface Segment { // @public export interface ServingConfig { + cloudChoice?: CloudChoice; cloudRegion?: CloudRegion; environment?: Environment; } diff --git a/package-lock.json b/package-lock.json index 541c6f5a..7c2b2589 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@yext/search-core", - "version": "2.5.3", + "version": "2.5.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@yext/search-core", - "version": "2.5.3", + "version": "2.5.4", "license": "BSD-3-Clause", "dependencies": { "@babel/runtime-corejs3": "^7.12.5", diff --git a/package.json b/package.json index a40aa9f4..60c0181b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@yext/search-core", - "version": "2.5.3", + "version": "2.5.4", "description": "Typescript Networking Library for the Yext Search API", "main": "./dist/commonjs/src/index.js", "module": "./dist/esm/src/index.js", diff --git a/src/models/core/CloudChoice.ts b/src/models/core/CloudChoice.ts new file mode 100644 index 00000000..881fad7a --- /dev/null +++ b/src/models/core/CloudChoice.ts @@ -0,0 +1,9 @@ +/** + * Defines the cloud choice of the API domains. + * + * @public + */ +export enum CloudChoice { + GLOBAL_MULTI = 'GLOBAL-MULTI', //All available cloud regions + GLOBAL_GCP = 'GLOBAL-GCP', //Only available GCP-backed cloud regions +} diff --git a/src/models/core/SearchConfig.ts b/src/models/core/SearchConfig.ts index 67e4fea2..9b4c50a5 100644 --- a/src/models/core/SearchConfig.ts +++ b/src/models/core/SearchConfig.ts @@ -2,6 +2,7 @@ import { Endpoints } from './Endpoints'; import { Visitor } from './Visitor'; import { Environment } from './Environment'; import { CloudRegion } from './CloudRegion'; +import { CloudChoice } from './CloudChoice'; /** * The configuration options for getting the endpoints. @@ -20,7 +21,13 @@ export interface ServingConfig { * * @public */ - cloudRegion?: CloudRegion + cloudRegion?: CloudRegion, + /** + * {@inheritDoc CloudChoice} + * + * @public + */ + cloudChoice?: CloudChoice } /** @@ -119,4 +126,4 @@ export type SearchConfig = SearchConfigWithApiKey | SearchConfigWithToken; * * @internal */ -export type SearchConfigWithDefaulting = SearchConfig & { endpoints: Required }; \ No newline at end of file +export type SearchConfigWithDefaulting = SearchConfig & { endpoints: Required }; diff --git a/src/models/index.ts b/src/models/index.ts index 369e4a4f..7ac79c4d 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -18,6 +18,7 @@ export { } from './core/AdditionalHttpHeaders'; export { Environment } from './core/Environment'; export { CloudRegion } from './core/CloudRegion'; +export { CloudChoice } from './core/CloudChoice'; // Autocomplete service export * from './autocompleteservice/AutocompleteRequest'; diff --git a/src/provideEndpoints.ts b/src/provideEndpoints.ts index 11b0ad9f..e4dd966d 100644 --- a/src/provideEndpoints.ts +++ b/src/provideEndpoints.ts @@ -2,6 +2,7 @@ import { Endpoints } from './models/core/Endpoints'; import { Environment } from './models/core/Environment'; import { CloudRegion } from './models/core/CloudRegion'; import { ServingConfig } from './models/core/SearchConfig'; +import { CloudChoice } from './models/core/CloudChoice'; export const defaultApiVersion = 20220511; @@ -13,15 +14,23 @@ export const defaultApiVersion = 20220511; export class EndpointsFactory { private readonly environment: Environment; private readonly cloudRegion: CloudRegion; + private readonly cloudChoice: CloudChoice; constructor(config?: ServingConfig) { this.environment = config?.environment || Environment.PROD; this.cloudRegion = config?.cloudRegion || CloudRegion.US; + this.cloudChoice = config?.cloudChoice || CloudChoice.GLOBAL_MULTI; } /** Provides the domain based on environment and cloud region. */ getDomain() { - return `https://${this.environment}-cdn.${this.cloudRegion}.yextapis.com`; + switch (this.cloudChoice){ + case CloudChoice.GLOBAL_GCP: + return `https://${this.environment}-cdn-gcp.${this.cloudRegion}.yextapis.com`; + case CloudChoice.GLOBAL_MULTI: + default: + return `https://${this.environment}-cdn.${this.cloudRegion}.yextapis.com`; + } } /** Provides all endpoints based on environment and cloud region. */ @@ -46,5 +55,8 @@ export class EndpointsFactory { * @public */ export const SandboxEndpoints: Required = - new EndpointsFactory({ environment: Environment.SANDBOX, cloudRegion: CloudRegion.US }) + new EndpointsFactory({ + environment: Environment.SANDBOX, + cloudRegion: CloudRegion.US, + cloudChoice: CloudChoice.GLOBAL_MULTI }) .getEndpoints(); diff --git a/tests/provideEndpointsTest.ts b/tests/provideEndpointsTest.ts new file mode 100644 index 00000000..a2bb1900 --- /dev/null +++ b/tests/provideEndpointsTest.ts @@ -0,0 +1,47 @@ +import { EndpointsFactory } from '../src/provideEndpoints'; +import { CloudChoice, CloudRegion, Environment } from '../src'; + +it('Sandbox, US, Multi produces expected endpoint', () => { + const endPoints = new EndpointsFactory({ + environment: Environment.SANDBOX, + cloudRegion: CloudRegion.US, + cloudChoice: CloudChoice.GLOBAL_MULTI + }).getEndpoints(); + expect(endPoints).toHaveProperty('universalSearch', 'https://sbx-cdn.us.yextapis.com/v2/accounts/me/search/query'); +}); + +it('Prod, US, Multi produces expected endpoint', () => { + const endPoints = new EndpointsFactory({ + environment: Environment.PROD, + cloudRegion: CloudRegion.US, + cloudChoice: CloudChoice.GLOBAL_MULTI + }).getEndpoints(); + expect(endPoints).toHaveProperty('verticalSearch', 'https://prod-cdn.us.yextapis.com/v2/accounts/me/search/vertical/query'); +}); + +it('Prod, US, GCP produces expected endpoint', () => { + const endPoints = new EndpointsFactory({ + environment: Environment.PROD, + cloudRegion: CloudRegion.US, + cloudChoice: CloudChoice.GLOBAL_GCP + }).getEndpoints(); + expect(endPoints).toHaveProperty('universalAutocomplete', 'https://prod-cdn-gcp.us.yextapis.com/v2/accounts/me/search/autocomplete'); +}); + +it('Prod, EU, Multi produces expected endpoint', () => { + const endPoints = new EndpointsFactory({ + environment: Environment.PROD, + cloudRegion: CloudRegion.EU, + cloudChoice: CloudChoice.GLOBAL_MULTI + }).getEndpoints(); + expect(endPoints).toHaveProperty('verticalAutocomplete', 'https://prod-cdn.eu.yextapis.com/v2/accounts/me/search/vertical/autocomplete'); +}); + +it('Prod, EU, GCP produces expected endpoint', () => { + const endPoints = new EndpointsFactory({ + environment: Environment.PROD, + cloudRegion: CloudRegion.EU, + cloudChoice: CloudChoice.GLOBAL_GCP + }).getEndpoints(); + expect(endPoints).toHaveProperty('filterSearch', 'https://prod-cdn-gcp.eu.yextapis.com/v2/accounts/me/search/filtersearch'); +});