From b1d93dffad124e8bbef21b760d52e338c623cdfa Mon Sep 17 00:00:00 2001 From: Haroen Viaene Date: Wed, 14 Sep 2022 11:53:32 +0200 Subject: [PATCH] fix(preset-algolia): support algoliasearch v5 (#1002) * fix(preset-algolia): support algoliasearch v5 * generic --- .../autocomplete-preset-algolia/package.json | 4 +- .../src/highlight/HighlightedHit.ts | 2 +- .../src/highlight/SnippetedHit.ts | 2 +- .../src/requester/createRequester.ts | 9 ++- .../src/requester/getAlgoliaFacets.ts | 2 +- .../src/search/fetchAlgoliaResults.ts | 10 +-- .../src/types/algoliasearch.ts | 71 +++++++++++++++++++ .../src/types/index.ts | 1 + 8 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 packages/autocomplete-preset-algolia/src/types/algoliasearch.ts create mode 100644 packages/autocomplete-preset-algolia/src/types/index.ts diff --git a/packages/autocomplete-preset-algolia/package.json b/packages/autocomplete-preset-algolia/package.json index 0e2ea53ae..3d9f31c52 100644 --- a/packages/autocomplete-preset-algolia/package.json +++ b/packages/autocomplete-preset-algolia/package.json @@ -38,7 +38,7 @@ "algoliasearch": "4.9.1" }, "peerDependencies": { - "@algolia/client-search": "^4.9.1", - "algoliasearch": "^4.9.1" + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" } } diff --git a/packages/autocomplete-preset-algolia/src/highlight/HighlightedHit.ts b/packages/autocomplete-preset-algolia/src/highlight/HighlightedHit.ts index 63bde579e..28c67d07f 100644 --- a/packages/autocomplete-preset-algolia/src/highlight/HighlightedHit.ts +++ b/packages/autocomplete-preset-algolia/src/highlight/HighlightedHit.ts @@ -1,4 +1,4 @@ -import { HighlightResult } from '@algolia/client-search'; +import { HighlightResult } from '../types'; export type HighlightedHit = THit & { _highlightResult?: HighlightResult; diff --git a/packages/autocomplete-preset-algolia/src/highlight/SnippetedHit.ts b/packages/autocomplete-preset-algolia/src/highlight/SnippetedHit.ts index ca0dc6f0c..9f48224b1 100644 --- a/packages/autocomplete-preset-algolia/src/highlight/SnippetedHit.ts +++ b/packages/autocomplete-preset-algolia/src/highlight/SnippetedHit.ts @@ -1,4 +1,4 @@ -import { SnippetResult } from '@algolia/client-search'; +import { SnippetResult } from '../types'; export type SnippetedHit = THit & { _snippetResult?: SnippetResult; diff --git a/packages/autocomplete-preset-algolia/src/requester/createRequester.ts b/packages/autocomplete-preset-algolia/src/requester/createRequester.ts index eb12ea2d0..e4982697a 100644 --- a/packages/autocomplete-preset-algolia/src/requester/createRequester.ts +++ b/packages/autocomplete-preset-algolia/src/requester/createRequester.ts @@ -1,11 +1,10 @@ -import { +import { fetchAlgoliaResults } from '../search'; +import type { MultipleQueriesQuery, SearchForFacetValuesResponse, SearchResponse, -} from '@algolia/client-search'; -import { SearchClient } from 'algoliasearch/lite'; - -import { fetchAlgoliaResults } from '../search'; + SearchClient, +} from '../types'; type Fetcher = typeof fetchAlgoliaResults; diff --git a/packages/autocomplete-preset-algolia/src/requester/getAlgoliaFacets.ts b/packages/autocomplete-preset-algolia/src/requester/getAlgoliaFacets.ts index 6ac7b261d..9860bf714 100644 --- a/packages/autocomplete-preset-algolia/src/requester/getAlgoliaFacets.ts +++ b/packages/autocomplete-preset-algolia/src/requester/getAlgoliaFacets.ts @@ -1,4 +1,4 @@ -import { MultipleQueriesQuery } from '@algolia/client-search'; +import type { MultipleQueriesQuery } from '../types'; import { createAlgoliaRequester } from './createAlgoliaRequester'; import { RequestParams } from './createRequester'; diff --git a/packages/autocomplete-preset-algolia/src/search/fetchAlgoliaResults.ts b/packages/autocomplete-preset-algolia/src/search/fetchAlgoliaResults.ts index db85ba5e9..9cdadd06a 100644 --- a/packages/autocomplete-preset-algolia/src/search/fetchAlgoliaResults.ts +++ b/packages/autocomplete-preset-algolia/src/search/fetchAlgoliaResults.ts @@ -2,14 +2,14 @@ import { userAgents as coreUserAgents, UserAgent, } from '@algolia/autocomplete-shared'; -import { + +import { HIGHLIGHT_PRE_TAG, HIGHLIGHT_POST_TAG } from '../constants'; +import type { MultipleQueriesQuery, SearchForFacetValuesResponse, SearchResponse, -} from '@algolia/client-search'; -import type { SearchClient } from 'algoliasearch/lite'; - -import { HIGHLIGHT_PRE_TAG, HIGHLIGHT_POST_TAG } from '../constants'; + SearchClient, +} from '../types'; export interface SearchParams { /** diff --git a/packages/autocomplete-preset-algolia/src/types/algoliasearch.ts b/packages/autocomplete-preset-algolia/src/types/algoliasearch.ts new file mode 100644 index 000000000..39d6821a7 --- /dev/null +++ b/packages/autocomplete-preset-algolia/src/types/algoliasearch.ts @@ -0,0 +1,71 @@ +import * as ClientSearch from '@algolia/client-search'; +import type * as AlgoliaSearch from 'algoliasearch/lite'; + +// turns any to unknown, so it can be used as a conditional +type AnyToUnknown = (any extends TSubject ? true : false) extends true + ? unknown + : TSubject; + +type SearchClientShape = { + search: unknown; +}; + +type ClientLiteV5 = AnyToUnknown< + // @ts-ignore + ReturnType +>; +type ClientSearchV5 = AnyToUnknown< + // @ts-ignore + ReturnType +>; +type ClientV5 = ClientLiteV5 extends SearchClientShape + ? ClientLiteV5 + : ClientSearchV5 extends SearchClientShape + ? ClientSearchV5 + : unknown; + +type PickForClient< + TMapping extends { v4: unknown; v5: unknown } +> = ClientV5 extends SearchClientShape ? TMapping['v5'] : TMapping['v4']; + +export type SearchClient = PickForClient<{ + // @ts-ignore + v4: AlgoliaSearch.SearchClient; + // @ts-ignore + v5: ClientV5; +}>; + +export type MultipleQueriesQuery = PickForClient<{ + // @ts-ignore + v4: ClientSearch.MultipleQueriesQuery; + // @ts-ignore + v5: AlgoliaSearch.LegacySearchMethodProps[number]; +}>; + +export type SearchForFacetValuesResponse = PickForClient<{ + // @ts-ignore + v4: ClientSearch.SearchForFacetValuesResponse; + // @ts-ignore + v5: AlgoliaSearch.SearchForFacetValuesResponse; +}>; + +export type SearchResponse = PickForClient<{ + // @ts-ignore + v4: ClientSearch.SearchResponse; + // @ts-ignore + v5: AlgoliaSearch.SearchResponse; +}>; + +export type HighlightResult = PickForClient<{ + // @ts-ignore + v4: ClientSearch.HighlightResult; + // @ts-ignore + v5: AlgoliaSearch.HighlightResult; // should be generic, but isn't yet in the client +}>; + +export type SnippetResult = PickForClient<{ + // @ts-ignore + v4: ClientSearch.SnippetResult; + // @ts-ignore + v5: AlgoliaSearch.SnippetResult; // should be generic, but isn't yet in the client +}>; diff --git a/packages/autocomplete-preset-algolia/src/types/index.ts b/packages/autocomplete-preset-algolia/src/types/index.ts new file mode 100644 index 000000000..fc912ced6 --- /dev/null +++ b/packages/autocomplete-preset-algolia/src/types/index.ts @@ -0,0 +1 @@ +export * from './algoliasearch';