diff --git a/docs/search-core.source.md b/docs/search-core.source.md index 6dc1c3cd..545b7d31 100644 --- a/docs/search-core.source.md +++ b/docs/search-core.source.md @@ -20,6 +20,7 @@ export declare enum Source | Bing | "BING_CSE" | The result is from Bing Search Engine. | | Custom | "CUSTOM_SEARCHER" | The result was from a custom source. | | DocumentVertical | "DOCUMENT_VERTICAL" | The result is from a document vertical. | +| FunctionVertical | "FUNCTION_VERTICAL" | The result is from a function vertical. | | Google | "GOOGLE_CSE" | The result is from Google Custom Search Engine. | | KnowledgeManager | "KNOWLEDGE_MANAGER" | The result is from a Knowledge Graph. | | Zendesk | "ZENDESK" | The result is from Zendesk. | diff --git a/etc/search-core.api.md b/etc/search-core.api.md index d2b5fbc8..dbcfb723 100644 --- a/etc/search-core.api.md +++ b/etc/search-core.api.md @@ -754,6 +754,7 @@ export enum Source { Bing = "BING_CSE", Custom = "CUSTOM_SEARCHER", DocumentVertical = "DOCUMENT_VERTICAL", + FunctionVertical = "FUNCTION_VERTICAL", Google = "GOOGLE_CSE", KnowledgeManager = "KNOWLEDGE_MANAGER", Zendesk = "ZENDESK" diff --git a/package-lock.json b/package-lock.json index 18be19d9..b61dc53a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@yext/search-core", - "version": "2.6.0-beta.2", + "version": "2.6.0-beta.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@yext/search-core", - "version": "2.6.0-beta.2", + "version": "2.6.0-beta.3", "license": "BSD-3-Clause", "dependencies": { "@babel/runtime-corejs3": "^7.12.5", diff --git a/package.json b/package.json index ff135761..c814640f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@yext/search-core", - "version": "2.6.0-beta.2", + "version": "2.6.0-beta.3", "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/searchservice/response/Source.ts b/src/models/searchservice/response/Source.ts index ddbebe9d..158027a9 100644 --- a/src/models/searchservice/response/Source.ts +++ b/src/models/searchservice/response/Source.ts @@ -18,4 +18,6 @@ export enum Source { Custom = 'CUSTOM_SEARCHER', /** The result is from a document vertical. */ DocumentVertical = 'DOCUMENT_VERTICAL', + /** The result is from a function vertical. */ + FunctionVertical = 'FUNCTION_VERTICAL', } \ No newline at end of file diff --git a/src/transformers/searchservice/ResultsFactory.ts b/src/transformers/searchservice/ResultsFactory.ts index 944e1c4d..e7989f10 100644 --- a/src/transformers/searchservice/ResultsFactory.ts +++ b/src/transformers/searchservice/ResultsFactory.ts @@ -26,6 +26,8 @@ export class ResultsFactory { return this.fromAlgoliaSearchEngine(result, resultIndex); case Source.DocumentVertical: return this.fromDocumentVertical(result, resultIndex); + case Source.FunctionVertical: + return this.fromFunctionVertical(result, resultIndex); default: return this.fromCustomSource(result, resultIndex); } @@ -113,10 +115,18 @@ export class ResultsFactory { } private static fromCustomSource(result: any, index: number): Result { + return this.fromCustomDataHelper(result, index, Source.Custom); + } + + private static fromFunctionVertical(result: any, index: number): Result { + return this.fromCustomDataHelper(result, index, Source.FunctionVertical); + } + + private static fromCustomDataHelper(result: any, index: number, source: Source): Result { const rawData = result.data ?? result; return { rawData: rawData, - source: Source.Custom, + source: source, index: index, name: rawData.name, description: rawData.description, // Do we want to truncate this like in the SDK? diff --git a/test-site/index.html b/test-site/index.html index 5d5914e6..9de8956f 100644 --- a/test-site/index.html +++ b/test-site/index.html @@ -14,5 +14,6 @@ + diff --git a/test-site/js-index.html b/test-site/js-index.html index 5058203f..8c0dee64 100644 --- a/test-site/js-index.html +++ b/test-site/js-index.html @@ -13,5 +13,6 @@ + diff --git a/test-site/package-lock.json b/test-site/package-lock.json index 17efb9b4..b4c1544e 100644 --- a/test-site/package-lock.json +++ b/test-site/package-lock.json @@ -380,12 +380,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -672,10 +673,11 @@ "dev": true }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -798,6 +800,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -912,18 +915,6 @@ "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -1205,13 +1196,11 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1373,6 +1362,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -1618,12 +1608,6 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } }, "dependencies": { @@ -1946,12 +1930,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browserslist": { @@ -2152,9 +2136,9 @@ "dev": true }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -2328,15 +2312,6 @@ "p-locate": "^4.1.0" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2536,13 +2511,10 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true }, "serialize-javascript": { "version": "6.0.2", @@ -2804,12 +2776,6 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } } diff --git a/test-site/src/js/index.js b/test-site/src/js/index.js index ace12653..ddc361ca 100644 --- a/test-site/src/js/index.js +++ b/test-site/src/js/index.js @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { provideCore } from '@yext/search-core'; -import verticalRequest from './requests/verticalRequest'; +import { verticalRequest, functionVerticalRequest } from './requests/verticalRequest'; import universalRequest from './requests/universalRequest'; import questionRequest from './requests/questionRequest'; import { univeralAutocompleteRequest, verticalAutocompleteRequest, filterSearchRequest } from './requests/autocompleteRequests'; @@ -69,6 +69,13 @@ export async function generativeDirectAnswer() { updateUI(data, startTime, 'Core Generative Direct Answer Response:'); } +export async function functionVerticalSearch() { + loadingSpinner(); + const startTime = new Date().getTime(); + const results = await globalCore.verticalSearch(functionVerticalRequest); + updateUI(results, startTime, 'Core Function Vertical Response:'); +} + function loadingSpinner() { element.textContent = 'Loading...'; } diff --git a/test-site/src/js/requests/verticalRequest.js b/test-site/src/js/requests/verticalRequest.js index 9c594d51..e5805288 100644 --- a/test-site/src/js/requests/verticalRequest.js +++ b/test-site/src/js/requests/verticalRequest.js @@ -1,6 +1,6 @@ import { QueryTrigger } from '@yext/search-core'; -const verticalRequest = { +export const verticalRequest = { verticalKey: 'people', query: 'virginia', queryTrigger: QueryTrigger.Initialize, @@ -12,4 +12,7 @@ const verticalRequest = { referrerPageUrl: 'www.google.com/answers/not/ads' }; -export default verticalRequest; \ No newline at end of file +export const functionVerticalRequest = { + verticalKey: 'function_vertical', + query: 'virginia', +}; \ No newline at end of file diff --git a/test-site/src/ts/index.ts b/test-site/src/ts/index.ts index 50381a5f..ad0c4b4f 100644 --- a/test-site/src/ts/index.ts +++ b/test-site/src/ts/index.ts @@ -1,5 +1,5 @@ import { provideCore, SearchConfig, SearchCore, UniversalSearchRequest, UniversalSearchResponse } from '@yext/search-core'; -import verticalRequest from './requests/verticalRequest'; +import { verticalRequest, functionVerticalRequest } from './requests/verticalRequest'; import universalRequest from './requests/universalRequest'; import questionRequest from './requests/questionRequest'; import { univeralAutocompleteRequest, verticalAutocompleteRequest, filterSearchRequest } from './requests/autocompleteRequests'; @@ -8,7 +8,7 @@ import initDirectAnswers from './initDirectAnswers'; const coreConfig: SearchConfig = { apiKey: process.env.API_KEY, - experienceKey: 'slanswers', + experienceKey: 'developer-support-test', locale: 'en', experienceVersion: 'PRODUCTION', }; @@ -44,6 +44,13 @@ export async function verticalSearch(): Promise { updateUI(results, startTime, 'Core Vertical Response:'); } +export async function functionVerticalSearch(): Promise { + loadingSpinner(); + const startTime = new Date().getTime(); + const results = await globalCore.verticalSearch(functionVerticalRequest); + updateUI(results, startTime, 'Core Function Vertical Response:'); +} + export async function submitQuestion(): Promise { loadingSpinner(); const startTime = new Date().getTime(); diff --git a/test-site/src/ts/requests/verticalRequest.ts b/test-site/src/ts/requests/verticalRequest.ts index 1079b41d..355d7565 100644 --- a/test-site/src/ts/requests/verticalRequest.ts +++ b/test-site/src/ts/requests/verticalRequest.ts @@ -1,6 +1,6 @@ import { QueryTrigger, VerticalSearchRequest } from '@yext/search-core'; -const verticalRequest: VerticalSearchRequest = { +export const verticalRequest: VerticalSearchRequest = { verticalKey: 'people', query: 'virginia', queryTrigger: QueryTrigger.Initialize, @@ -17,4 +17,7 @@ const verticalRequest: VerticalSearchRequest = { } }; -export default verticalRequest; \ No newline at end of file +export const functionVerticalRequest: VerticalSearchRequest = { + verticalKey: 'function_vertical', + query: 'virginia', +}; \ No newline at end of file diff --git a/tests/transformers/searchservice/ResultsFactory.ts b/tests/transformers/searchservice/ResultsFactory.ts index 210c1c50..ffedef6e 100644 --- a/tests/transformers/searchservice/ResultsFactory.ts +++ b/tests/transformers/searchservice/ResultsFactory.ts @@ -183,4 +183,38 @@ it('properly transforms backend results from custom source', () => { const actualResults = ResultsFactory.create(genericData, Source.Custom); expect(expectedResults).toMatchObject(actualResults); +}); + +it('properly transforms backend results from function vertical', () => { + const genericData = [{ + data: { + answer: 'You should still self\-quarantine for 14 days since your last exposure.', + c_organization: 'CDC', + id: 'iwasaroundsomeonewhohascovid19andmycovid19testcame', + website: 'https://www.cdc.gov/coronavirus/2019-ncov/faq.html', + name: 'Do I still need to quarantine for 14 days?', + description: 'COVID question 2' + }, + highlightedFields: {} + }]; + + const expectedResults = [{ + description: 'COVID question 2', + id: 'iwasaroundsomeonewhohascovid19andmycovid19testcame', + index: 1, + link: 'https://www.cdc.gov/coronavirus/2019-ncov/faq.html', + name: 'Do I still need to quarantine for 14 days?', + rawData: { + answer: 'You should still self\-quarantine for 14 days since your last exposure.', + c_organization: 'CDC', + id: 'iwasaroundsomeonewhohascovid19andmycovid19testcame', + website: 'https://www.cdc.gov/coronavirus/2019-ncov/faq.html', + name: 'Do I still need to quarantine for 14 days?', + description: 'COVID question 2' + }, + source: Source.FunctionVertical + }]; + + const actualResults = ResultsFactory.create(genericData, Source.FunctionVertical); + expect(expectedResults).toMatchObject(actualResults); }); \ No newline at end of file