From 9fbc59471b721b1009741dcc0e4b3754ebe01ae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vannicatte?= Date: Wed, 23 Jun 2021 16:14:52 +0200 Subject: [PATCH 1/5] feat(recommend): leverage the new Recommend API client --- examples/demo/package.json | 3 +- examples/demo/src/App.js | 30 +-- examples/js-demo/RelatedItem.js | 4 +- examples/js-demo/app.js | 30 +-- examples/js-demo/package.json | 3 +- packages/recommend-core/package.json | 2 +- .../src/__tests__/getRecommendations.test.ts | 87 ++++---- .../src/getFrequentlyBoughtTogether.ts | 44 ++-- .../recommend-core/src/getRecommendations.ts | 189 +++-------------- .../recommend-core/src/getRelatedProducts.ts | 41 ++-- .../recommend-core/src/types/ProductRecord.ts | 5 +- .../src/types/RecommendRecord.ts | 4 - packages/recommend-core/src/types/index.ts | 1 - packages/recommend-core/src/utils/cx.ts | 3 - .../src/utils/getHitsPerPage.ts | 30 --- .../src/utils/getIndexNameFromModel.ts | 15 -- .../src/utils/getSearchParametersForModel.ts | 81 -------- packages/recommend-core/src/utils/index.ts | 5 +- .../src/utils/mapToRecommendations.ts | 40 ++++ packages/recommend-js/README.md | 28 +-- packages/recommend-js/package.json | 2 +- .../src/frequentlyBoughtTogether.tsx | 2 +- packages/recommend-js/src/relatedProducts.tsx | 2 +- packages/recommend-js/src/useAlgoliaAgent.ts | 9 +- packages/recommend-react/README.md | 58 +++--- packages/recommend-react/package.json | 2 +- .../recommend-react/src/useAlgoliaAgent.ts | 9 +- .../src/useFrequentlyBoughtTogether.ts | 2 +- .../recommend-react/src/useRecommendations.ts | 2 +- .../recommend-react/src/useRelatedProducts.ts | 2 +- test/utils/createRecommendClient.ts | 46 ++++ test/utils/createSearchClient.ts | 41 ---- test/utils/index.ts | 2 +- yarn.lock | 196 ++++++++++++------ 34 files changed, 446 insertions(+), 574 deletions(-) delete mode 100644 packages/recommend-core/src/types/RecommendRecord.ts delete mode 100644 packages/recommend-core/src/utils/cx.ts delete mode 100644 packages/recommend-core/src/utils/getHitsPerPage.ts delete mode 100644 packages/recommend-core/src/utils/getIndexNameFromModel.ts delete mode 100644 packages/recommend-core/src/utils/getSearchParametersForModel.ts create mode 100644 packages/recommend-core/src/utils/mapToRecommendations.ts create mode 100644 test/utils/createRecommendClient.ts delete mode 100644 test/utils/createSearchClient.ts diff --git a/examples/demo/package.json b/examples/demo/package.json index ac49bd01..7af23471 100644 --- a/examples/demo/package.json +++ b/examples/demo/package.json @@ -14,7 +14,8 @@ "@algolia/recommend-react": "1.0.0-experimental.4", "@algolia/ui-components-horizontal-slider-react": "1.0.0-experimental.4", "@algolia/ui-components-horizontal-slider-theme": "1.0.0-experimental.4", - "algoliasearch": "4.9.1", + "algoliasearch": "4.10.2", + "@algolia/recommend": "4.10.2", "react": "17.0.2", "react-dom": "17.0.2", "search-insights": "2.0.0" diff --git a/examples/demo/src/App.js b/examples/demo/src/App.js index d8baec31..d42adc07 100644 --- a/examples/demo/src/App.js +++ b/examples/demo/src/App.js @@ -1,3 +1,4 @@ +import algoliarecommend from '@algolia/recommend'; import { FrequentlyBoughtTogether, RelatedProducts, @@ -22,6 +23,7 @@ const apiKey = '28cf6d38411215e2eef188e635216508'; const indexName = 'gstar_demo_test'; const searchClient = algoliasearch(appId, apiKey); +const recommendClient = algoliarecommend(appId, apiKey); insights('init', { appId, apiKey }); @@ -147,12 +149,12 @@ function App() { (
- {item.__recommendScore && ( + {item._score && (
- {item.__recommendScore} + {item._score}
)}
Promise.resolve({ results: [hit] })), - }; - const searchClient = createSearchClient({ - // @ts-expect-error `initIndex` is not part of the lite bundle - initIndex: jest.fn(() => index), - search: jest.fn(() => + const recommendClient = createRecommendClient({ + getFrequentlyBoughtTogether: jest.fn(() => + Promise.resolve( + createMultiSearchResponse({ + hits: [hit], + }) + ) + ), + getRelatedProducts: jest.fn(() => + Promise.resolve( + createMultiSearchResponse({ + hits: [hit], + }) + ) + ), + getRecommendations: jest.fn(() => Promise.resolve( createMultiSearchResponse({ hits: [hit], @@ -50,37 +59,28 @@ function createRecommendationsClient() { }); return { - index, - searchClient, + recommendClient, }; } describe('getRecommendations', () => { test('calls the correct index for "related-products"', async () => { - const { index, searchClient } = createRecommendationsClient(); + const { recommendClient } = createRecommendationsClient(); const props = { - model: 'related-products' as RecommendationModel, - searchClient: searchClient as any, + model: 'related-products' as RecommendModel, + recommendClient: recommendClient as any, indexName: 'indexName', objectIDs: ['objectID'], - searchParameters: { + queryParameters: { facetFilters: [['brand:Apple']], optionalFilters: ['category:Laptops'], }, }; - await getRecommendations(props); + await getRecommendations([props]); - expect(searchClient.initIndex).toHaveBeenCalledTimes(1); - expect(searchClient.initIndex).toHaveBeenCalledWith( - 'ai_recommend_related-products_indexName' - ); - - expect(index.getObjects).toHaveBeenCalledTimes(1); - expect(index.getObjects).toHaveBeenCalledWith(['objectID']); - - expect(searchClient.search).toHaveBeenCalledTimes(1); - expect(searchClient.search).toHaveBeenCalledWith([ + expect(recommendClient.getRecommendations).toHaveBeenCalledTimes(1); + expect(recommendClient.getRecommendations).toHaveBeenCalledWith([ { indexName: 'indexName', params: { @@ -105,30 +105,22 @@ describe('getRecommendations', () => { }); test('calls the correct index for "bought-together"', async () => { - const { index, searchClient } = createRecommendationsClient(); + const { recommendClient } = createRecommendationsClient(); const props = { - model: 'bought-together' as RecommendationModel, - searchClient: searchClient as any, + model: 'bought-together' as RecommendModel, + recommendClient: recommendClient as any, indexName: 'indexName', objectIDs: ['objectID'], - searchParameters: { + queryParameters: { facetFilters: [['brand:Apple']], optionalFilters: ['category:Laptops'], }, }; - await getRecommendations(props); - - expect(searchClient.initIndex).toHaveBeenCalledTimes(1); - expect(searchClient.initIndex).toHaveBeenCalledWith( - 'ai_recommend_bought-together_indexName' - ); - - expect(index.getObjects).toHaveBeenCalledTimes(1); - expect(index.getObjects).toHaveBeenCalledWith(['objectID']); + await getRecommendations([props]); - expect(searchClient.search).toHaveBeenCalledTimes(1); - expect(searchClient.search).toHaveBeenCalledWith([ + expect(recommendClient.getRecommendations).toHaveBeenCalledTimes(1); + expect(recommendClient.getRecommendations).toHaveBeenCalledWith([ { indexName: 'indexName', params: { @@ -151,22 +143,19 @@ describe('getRecommendations', () => { }); test('returns recommended hits', async () => { - const { searchClient } = createRecommendationsClient(); + const { recommendClient } = createRecommendationsClient(); const props = { - model: 'related-products' as RecommendationModel, - searchClient: searchClient as any, + model: 'related-products' as RecommendModel, + recommendClient: recommendClient as any, indexName: 'indexName', objectIDs: ['objectID'], }; - const { recommendations } = await getRecommendations(props); + const { recommendations } = await getRecommendations([props]); expect(recommendations).toEqual([ { - __indexName: 'indexName', - __position: 1, - __queryID: undefined, - __recommendScore: null, + _score: null, category: 'Women - Jumpsuits-Overalls', hierarchical_categories: { lvl0: 'women', diff --git a/packages/recommend-core/src/getFrequentlyBoughtTogether.ts b/packages/recommend-core/src/getFrequentlyBoughtTogether.ts index 8a9c6ce2..4623e748 100644 --- a/packages/recommend-core/src/getFrequentlyBoughtTogether.ts +++ b/packages/recommend-core/src/getFrequentlyBoughtTogether.ts @@ -1,21 +1,37 @@ -import { - getRecommendations, - GetRecommendationsProps, -} from './getRecommendations'; +import { FrequentlyBoughtTogetherQuery } from '@algolia/recommend'; -export type GetFrequentlyBoughtTogetherProps = Omit< - GetRecommendationsProps, - 'model' | 'fallbackFilters' ->; +import { RecommendationsProps } from './getRecommendations'; +import { mapToRecommendations } from './utils'; +import { version } from './version'; + +export type GetFrequentlyBoughtTogetherProps< + TObject +> = RecommendationsProps & + Omit; export function getFrequentlyBoughtTogether( userProps: GetFrequentlyBoughtTogetherProps ) { - const props: GetRecommendationsProps = { - ...userProps, - fallbackFilters: [], - model: 'bought-together', - }; + const { + objectIDs, + recommendClient, + transformItems = (x) => x, + ...props + } = userProps; + const queries = objectIDs.map((objectID) => ({ + ...props, + objectID, + })); + + recommendClient.addAlgoliaAgent('recommend-core', version); - return getRecommendations(props); + return recommendClient + .getFrequentlyBoughtTogether(queries) + .then((response) => + mapToRecommendations({ + response, + maxRecommendations: props.maxRecommendations, + }) + ) + .then((hits) => ({ recommendations: transformItems(hits) })); } diff --git a/packages/recommend-core/src/getRecommendations.ts b/packages/recommend-core/src/getRecommendations.ts index 4f0123e1..8b1f5638 100644 --- a/packages/recommend-core/src/getRecommendations.ts +++ b/packages/recommend-core/src/getRecommendations.ts @@ -1,178 +1,47 @@ -import type { SearchOptions } from '@algolia/client-search'; -import type { SearchClient } from 'algoliasearch'; +import type { RecommendClient, RecommendationsQuery } from '@algolia/recommend'; -import { - ProductRecord, - RecommendModel, - RecommendRecord, - RecordWithObjectID, -} from './types'; -import { - getHitsPerPage, - getIndexNameFromModel, - getSearchParametersForModel, - sortBy, - uniqBy, -} from './utils'; +import { ProductRecord, RecordWithObjectID } from './types'; +import { mapToRecommendations } from './utils'; import { version } from './version'; -type RecommendedRecord = RecordWithObjectID<{ - recommendations?: RecommendRecord[]; -}>; - -export type GetRecommendationsProps = { - model: RecommendModel; - indexName: string; +export type RecommendationsProps = { objectIDs: string[]; - searchClient: SearchClient; - - fallbackFilters?: SearchOptions['optionalFilters']; - maxRecommendations?: number; - searchParameters?: SearchOptions; - threshold?: number; + recommendClient: RecommendClient; transformItems?: ( items: Array> ) => Array>; }; -export type GetRecommendationsInternalProps = Required< - GetRecommendationsProps ->; +export type GetRecommendationsProps = RecommendationsProps & + Omit; export type GetRecommendationsResult = { recommendations: Array>; }; -function getDefaultedProps( - props: GetRecommendationsProps -): GetRecommendationsInternalProps { - return { - fallbackFilters: [], - maxRecommendations: 0, - threshold: 0, - transformItems: (items) => items, - ...props, - searchParameters: { - analytics: false, - analyticsTags: [`alg-recommend_${props.model}`], - clickAnalytics: false, - enableABTest: false, - filters: props.objectIDs - .map((objectID) => `NOT objectID:${objectID}`) - .join(' AND '), - ruleContexts: props.objectIDs.map( - (objectID) => `alg-recommend_${props.model}_${objectID}` - ), - typoTolerance: false, - ...props.searchParameters, - }, - }; -} - export function getRecommendations( userProps: GetRecommendationsProps ): Promise> { - const props = getDefaultedProps(userProps); - - props.searchClient.addAlgoliaAgent('recommend-core', version); - - return props.searchClient - .initIndex(getIndexNameFromModel(props.model, props.indexName)) - .getObjects(props.objectIDs) - .then((response) => { - const recommendationsList = response.results.map( - (result) => result?.recommendations ?? [] - ); - - return props.searchClient - .search( - recommendationsList.map((recommendations) => { - // This computes the `hitsPerPage` value as if a single `objectID` - // was passed. - const globalHitsPerPage = getHitsPerPage({ - fallbackFilters: props.fallbackFilters, - maxRecommendations: props.maxRecommendations, - recommendationsCount: recommendations.length, - }); - // This reduces the `globalHitsPerPage` value to get a `hitsPerPage` - // that is divided among all requests. - const hitsPerPage = - globalHitsPerPage > 0 - ? Math.ceil(globalHitsPerPage / props.objectIDs.length) - : globalHitsPerPage; - const searchParametersForModel = getSearchParametersForModel({ - fallbackFilters: props.fallbackFilters, - recommendations, - threshold: props.threshold, - })(props.model); - - return { - indexName: props.indexName, - params: { - hitsPerPage, - ...searchParametersForModel, - ...props.searchParameters, - facetFilters: ((searchParametersForModel.facetFilters || - []) as string[]).concat( - (props.searchParameters.facetFilters || []) as string[] - ), - optionalFilters: ((searchParametersForModel.optionalFilters || - []) as string[]).concat( - (props.searchParameters.optionalFilters || []) as string[] - ), - }, - }; - }) - ) - .then((response) => { - const hits = - // Since recommendations from multiple indices are returned, we - // need to sort them descending based on their score. - sortBy>( - (a, b) => { - const scoreA = a.__recommendScore || 0; - const scoreB = b.__recommendScore || 0; - - return scoreA < scoreB ? 1 : -1; - }, - // Multiple identical recommended `objectID`s can be returned b - // the engine, so we need to remove duplicates. - uniqBy>( - 'objectID', - response.results.flatMap((result) => - result.hits.map((hit, index) => { - const match = recommendationsList - .flat() - .find((x) => x.objectID === hit.objectID); - - return { - ...hit, - __indexName: props.indexName, - __queryID: result.queryID, - __position: index + 1, - __recommendScore: match?.score ?? null, - }; - }) - ) - ) - ).slice( - 0, - // We cap the number of recommendations because the previously - // computed `hitsPerPage` was an approximation due to `Math.ceil`. - props.maxRecommendations > 0 - ? props.maxRecommendations - : undefined - ); - - return { - recommendations: props.transformItems(hits), - }; - }); - }) - .catch(() => { - // The `objectID` doesn't exist, we cannot get recommendations. - return { - recommendations: [], - }; - }); + const { + objectIDs, + recommendClient, + transformItems = (x) => x, + ...props + } = userProps; + const queries = objectIDs.map((objectID) => ({ + ...props, + objectID, + })); + + recommendClient.addAlgoliaAgent('recommend-core', version); + + return recommendClient + .getRecommendations(queries) + .then((response) => + mapToRecommendations({ + response, + maxRecommendations: props.maxRecommendations, + }) + ) + .then((hits) => ({ recommendations: transformItems(hits) })); } diff --git a/packages/recommend-core/src/getRelatedProducts.ts b/packages/recommend-core/src/getRelatedProducts.ts index 3af5a9c1..3f2600d2 100644 --- a/packages/recommend-core/src/getRelatedProducts.ts +++ b/packages/recommend-core/src/getRelatedProducts.ts @@ -1,20 +1,35 @@ -import { - getRecommendations, - GetRecommendationsProps, -} from './getRecommendations'; +import { RelatedProductsQuery } from '@algolia/recommend'; -export type GetRelatedProductsProps = Omit< - GetRecommendationsProps, - 'model' ->; +import { RecommendationsProps } from './getRecommendations'; +import { mapToRecommendations } from './utils'; +import { version } from './version'; + +export type GetRelatedProductsProps = RecommendationsProps & + Omit; export function getRelatedProducts( userProps: GetRelatedProductsProps ) { - const props: GetRecommendationsProps = { - ...userProps, - model: 'related-products', - }; + const { + objectIDs, + recommendClient, + transformItems = (x) => x, + ...props + } = userProps; + const queries = objectIDs.map((objectID) => ({ + ...props, + objectID, + })); + + recommendClient.addAlgoliaAgent('recommend-core', version); - return getRecommendations(props); + return recommendClient + .getRelatedProducts(queries) + .then((response) => + mapToRecommendations({ + response, + maxRecommendations: props.maxRecommendations, + }) + ) + .then((hits) => ({ recommendations: transformItems(hits) })); } diff --git a/packages/recommend-core/src/types/ProductRecord.ts b/packages/recommend-core/src/types/ProductRecord.ts index 6b4a20e6..24c555bd 100644 --- a/packages/recommend-core/src/types/ProductRecord.ts +++ b/packages/recommend-core/src/types/ProductRecord.ts @@ -1,7 +1,4 @@ export type ProductRecord = TObject & { objectID: string; - __indexName: string; - __queryID: string | undefined; - __position: number; - __recommendScore: number | null; + _score?: number; }; diff --git a/packages/recommend-core/src/types/RecommendRecord.ts b/packages/recommend-core/src/types/RecommendRecord.ts deleted file mode 100644 index ce04d9d2..00000000 --- a/packages/recommend-core/src/types/RecommendRecord.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type RecommendRecord = { - objectID: string; - score: number; -}; diff --git a/packages/recommend-core/src/types/index.ts b/packages/recommend-core/src/types/index.ts index 9c12d50c..b6ce933c 100644 --- a/packages/recommend-core/src/types/index.ts +++ b/packages/recommend-core/src/types/index.ts @@ -1,4 +1,3 @@ export * from './ProductRecord'; export * from './RecommendModel'; -export * from './RecommendRecord'; export * from './RecordWithObjectID'; diff --git a/packages/recommend-core/src/utils/cx.ts b/packages/recommend-core/src/utils/cx.ts deleted file mode 100644 index 2553655d..00000000 --- a/packages/recommend-core/src/utils/cx.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function cx(...classNames: Array) { - return classNames.filter(Boolean).join(' '); -} diff --git a/packages/recommend-core/src/utils/getHitsPerPage.ts b/packages/recommend-core/src/utils/getHitsPerPage.ts deleted file mode 100644 index 05b346e1..00000000 --- a/packages/recommend-core/src/utils/getHitsPerPage.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { GetRecommendationsInternalProps } from '../getRecommendations'; - -type GetHitsPerPageParams = { - fallbackFilters: GetRecommendationsInternalProps['fallbackFilters']; - maxRecommendations: GetRecommendationsInternalProps['maxRecommendations']; - recommendationsCount: number; -}; - -export function getHitsPerPage({ - fallbackFilters, - maxRecommendations, - recommendationsCount, -}: GetHitsPerPageParams) { - const hasFallback = fallbackFilters.length > 0; - - if (recommendationsCount === 0) { - return hasFallback ? maxRecommendations : 0; - } - - // There's recommendations and a fallback, we force to retrieve - // `maxRecommendations` number of hits. - if (hasFallback) { - return maxRecommendations; - } - - // Otherwise, cap the hits retrieved with `maxRecommendations` - return maxRecommendations > 0 - ? Math.min(recommendationsCount, maxRecommendations) - : recommendationsCount; -} diff --git a/packages/recommend-core/src/utils/getIndexNameFromModel.ts b/packages/recommend-core/src/utils/getIndexNameFromModel.ts deleted file mode 100644 index 379c8db1..00000000 --- a/packages/recommend-core/src/utils/getIndexNameFromModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { RecommendModel } from '../types'; - -export function getIndexNameFromModel( - model: RecommendModel, - indexName: string -) { - switch (model) { - case 'bought-together': - return `ai_recommend_bought-together_${indexName}`; - case 'related-products': - return `ai_recommend_related-products_${indexName}`; - default: - throw new Error(`Unknown model: ${JSON.stringify(model)}.`); - } -} diff --git a/packages/recommend-core/src/utils/getSearchParametersForModel.ts b/packages/recommend-core/src/utils/getSearchParametersForModel.ts deleted file mode 100644 index 5f1dcae3..00000000 --- a/packages/recommend-core/src/utils/getSearchParametersForModel.ts +++ /dev/null @@ -1,81 +0,0 @@ -import type { SearchOptions } from '@algolia/client-search'; - -import { GetRecommendationsInternalProps } from '../getRecommendations'; -import { RecommendModel, RecommendRecord } from '../types'; - -type GetSearchParametersParams = { - fallbackFilters: GetRecommendationsInternalProps['fallbackFilters']; - recommendations: RecommendRecord[]; - threshold: GetRecommendationsInternalProps['threshold']; -}; - -function getFiltersFromRecommendations({ - fallbackFilters, - recommendations, - threshold, -}: GetSearchParametersParams): SearchOptions['optionalFilters'] { - if (recommendations.length === 0) { - return fallbackFilters; - } - - const recommendationFilters = recommendations - .filter((recommendation) => recommendation.score > threshold) - .map(({ objectID, score }) => `objectID:${objectID}`); - - return [...recommendationFilters, ...fallbackFilters]; -} - -function getSearchParametersForRelatedProducts({ - fallbackFilters, - recommendations, - threshold, -}: GetSearchParametersParams): SearchOptions { - return { - optionalFilters: getFiltersFromRecommendations({ - fallbackFilters, - recommendations, - threshold, - }), - }; -} - -function getSearchParametersForFrequentlyBoughtTogether({ - fallbackFilters, - recommendations, - threshold, -}: GetSearchParametersParams): SearchOptions { - if (fallbackFilters.length === 0) { - return { - // We want strict recommendations for FBT when there's no fallback because - // we cannot guess what products were bought with the reference product. - facetFilters: [ - recommendations - .filter((recommendation) => recommendation.score > threshold) - .map((recommendation) => `objectID:${recommendation.objectID}`), - ], - }; - } - - return { - optionalFilters: getFiltersFromRecommendations({ - fallbackFilters, - recommendations, - threshold, - }), - }; -} - -export function getSearchParametersForModel( - params: GetSearchParametersParams -) { - return (model: RecommendModel) => { - switch (model) { - case 'bought-together': - return getSearchParametersForFrequentlyBoughtTogether(params); - case 'related-products': - return getSearchParametersForRelatedProducts(params); - default: - throw new Error(`Unknown model: ${JSON.stringify(model)}.`); - } - }; -} diff --git a/packages/recommend-core/src/utils/index.ts b/packages/recommend-core/src/utils/index.ts index 6103c773..4a354d35 100644 --- a/packages/recommend-core/src/utils/index.ts +++ b/packages/recommend-core/src/utils/index.ts @@ -1,6 +1,3 @@ -export * from './cx'; -export * from './getHitsPerPage'; -export * from './getIndexNameFromModel'; -export * from './getSearchParametersForModel'; +export * from './mapToRecommendations'; export * from './sortBy'; export * from './uniqBy'; diff --git a/packages/recommend-core/src/utils/mapToRecommendations.ts b/packages/recommend-core/src/utils/mapToRecommendations.ts new file mode 100644 index 00000000..37906e6a --- /dev/null +++ b/packages/recommend-core/src/utils/mapToRecommendations.ts @@ -0,0 +1,40 @@ +import { MultipleQueriesResponse } from '@algolia/client-search'; + +import { ProductRecord } from '../types'; + +import { sortBy } from './sortBy'; +import { uniqBy } from './uniqBy'; + +type MapToRecommendations = { + response: MultipleQueriesResponse; + maxRecommendations?: number; +}; + +export function mapToRecommendations({ + response, + maxRecommendations, +}: MapToRecommendations) { + // Since recommendations from multiple indices are returned, we + // need to sort them descending based on their score. + return sortBy>( + (a, b) => { + const scoreA = a._score || 0; + const scoreB = b._score || 0; + + return scoreA < scoreB ? 1 : -1; + }, + // Multiple identical recommended `objectID`s can be returned b + // the engine, so we need to remove duplicates. + uniqBy>( + 'objectID', + response.results.map((result) => result.hits).flat() + ) + ).slice( + 0, + // We cap the number of recommendations because the previously + // computed `hitsPerPage` was an approximation due to `Math.ceil`. + maxRecommendations && maxRecommendations > 0 + ? maxRecommendations + : undefined + ); +} diff --git a/packages/recommend-js/README.md b/packages/recommend-js/README.md index b4456bc4..1e5b60f9 100644 --- a/packages/recommend-js/README.md +++ b/packages/recommend-js/README.md @@ -32,18 +32,18 @@ Then, inject results into it by calling the `relatedProducts` function and provi /** @jsx h */ import { h } from 'preact'; import { relatedProducts } from '@algolia/recommend-js'; -import algoliasearch from 'algoliasearch'; +import algoliarecommend from '@algolia/recommend'; const appId = 'HYDY1KWTWB'; const apiKey = '28cf6d38411215e2eef188e635216508'; const indexName = 'gstar_demo_test'; -const searchClient = algoliasearch(appId, apiKey); +const recommendClient = algoliarecommend(appId, apiKey); const currentObjectID = 'YOUR_OBJECT_ID'; relatedProducts({ container: '#relatedProducts', - searchClient, + recommendClient, indexName, objectIDs: [currentObjectID], itemComponent({ item }) { @@ -65,7 +65,7 @@ Example with the [`HorizontalSlider`](/packages/horizontal-slider-js) UI compone import { h } from 'preact'; import { relatedProducts } from '@algolia/recommend-js'; import { horizontalSlider } from '@algolia/ui-components-horizontal-slider-js'; -import algoliasearch from 'algoliasearch'; +import algoliarecommend from '@algolia/recommend'; import '@algolia/ui-components-horizontal-slider-theme'; @@ -73,12 +73,12 @@ const appId = 'HYDY1KWTWB'; const apiKey = '28cf6d38411215e2eef188e635216508'; const indexName = 'gstar_demo_test'; -const searchClient = algoliasearch(appId, apiKey); +const recommendClient = algoliarecommend(appId, apiKey); const currentObjectID = 'YOUR_OBJECT_ID'; relatedProducts({ container: '#relatedProducts', - searchClient, + recommendClient, indexName, objectIDs: [currentObjectID], itemComponent({ item }) { @@ -205,18 +205,18 @@ Then, inject results into it by calling the `frequentlyBoughtTogether` function /** @jsx h */ import { h } from 'preact'; import { frequentlyBoughtTogether } from '@algolia/recommend-js'; -import algoliasearch from 'algoliasearch'; +import algoliarecommend from '@algolia/recommend'; const appId = 'HYDY1KWTWB'; const apiKey = '28cf6d38411215e2eef188e635216508'; const indexName = 'gstar_demo_test'; -const searchClient = algoliasearch(appId, apiKey); +const recommendClient = algoliarecommend(appId, apiKey); const currentObjectID = 'YOUR_OBJECT_ID'; frequentlyBoughtTogether({ container: '#frequentlyBoughtTogether', - searchClient, + recommendClient, indexName, objectIDs: [currentObjectID], itemComponent({ item }) { @@ -327,9 +327,9 @@ function defaultRender(props) { ## Shared props -### `searchClient` +### `recommendClient` -> `SearchClient` | **required** +> `recommendClient` | **required** The initialized Algolia search client. @@ -351,13 +351,13 @@ An array of `objectID`s of the products to get recommendations from. The number of recommendations to retrieve. -### `fallbackFilters` +### `fallbackParameters` -> list of strings +> `Omit` Additional filters to use as fallback should there not be enough recommendations. -### `searchParameters` +### `queryParameters` > [`SearchParameters`](https://www.algolia.com/doc/api-reference/search-api-parameters/) | defaults to `{ analytics: false, enableABTest: false }` diff --git a/packages/recommend-js/package.json b/packages/recommend-js/package.json index 2754858d..25b5fcc8 100644 --- a/packages/recommend-js/package.json +++ b/packages/recommend-js/package.json @@ -28,7 +28,7 @@ "prepare": "yarn build:esm && yarn build:types" }, "peerDependencies": { - "algoliasearch": "^4.9.1" + "@algolia/recommend": "^4.10.2" }, "dependencies": { "@algolia/recommend-core": "1.0.0-experimental.4", diff --git a/packages/recommend-js/src/frequentlyBoughtTogether.tsx b/packages/recommend-js/src/frequentlyBoughtTogether.tsx index 191d14fb..ac128abd 100644 --- a/packages/recommend-js/src/frequentlyBoughtTogether.tsx +++ b/packages/recommend-js/src/frequentlyBoughtTogether.tsx @@ -29,7 +29,7 @@ function useFrequentlyBoughtTogether( recommendations: [], }); - useAlgoliaAgent({ searchClient: props.searchClient }); + useAlgoliaAgent({ recommendClient: props.recommendClient }); useEffect(() => { getFrequentlyBoughtTogether(props).then((response) => { diff --git a/packages/recommend-js/src/relatedProducts.tsx b/packages/recommend-js/src/relatedProducts.tsx index 5025a239..77925e8c 100644 --- a/packages/recommend-js/src/relatedProducts.tsx +++ b/packages/recommend-js/src/relatedProducts.tsx @@ -25,7 +25,7 @@ function useRelatedProducts(props: GetRelatedProductsProps) { recommendations: [], }); - useAlgoliaAgent({ searchClient: props.searchClient }); + useAlgoliaAgent({ recommendClient: props.recommendClient }); useEffect(() => { getRelatedProducts(props).then((response) => { diff --git a/packages/recommend-js/src/useAlgoliaAgent.ts b/packages/recommend-js/src/useAlgoliaAgent.ts index cf25252c..2d856567 100644 --- a/packages/recommend-js/src/useAlgoliaAgent.ts +++ b/packages/recommend-js/src/useAlgoliaAgent.ts @@ -3,10 +3,13 @@ import { useEffect } from 'preact/hooks'; import { version } from './version'; -type UseAlgoliaAgentProps = Pick, 'searchClient'>; +type UseAlgoliaAgentProps = Pick< + GetRelatedProductsProps, + 'recommendClient' +>; export function useAlgoliaAgent(props: UseAlgoliaAgentProps) { useEffect(() => { - props.searchClient.addAlgoliaAgent('recommend-js', version); - }, [props.searchClient]); + props.recommendClient.addAlgoliaAgent('recommend-js', version); + }, [props.recommendClient]); } diff --git a/packages/recommend-react/README.md b/packages/recommend-react/README.md index dd570840..28f42cc9 100644 --- a/packages/recommend-react/README.md +++ b/packages/recommend-react/README.md @@ -20,13 +20,13 @@ Component to display related products. ```js import { RelatedProducts } from '@algolia/recommend-react'; -import algoliasearch from 'algoliasearch'; +import recommend from '@algolia/recommend'; const appId = 'HYDY1KWTWB'; const apiKey = '28cf6d38411215e2eef188e635216508'; const indexName = 'gstar_demo_test'; -const searchClient = algoliasearch(appId, apiKey); +const recommendClient = recommend(appId, apiKey); function RelatedItem({ item }) { return ( @@ -41,7 +41,7 @@ function App({ currentObjectID }) { return ( ( [`(props: Omit) => { recommendations }`](#shared-props) +> [`(props: Omit) => { recommendations }`](#shared-props) Hook to retrieve frequently bought together products. @@ -527,18 +527,18 @@ Hook to retrieve frequently bought together products. ```jsx import { useFrequentlyBoughtTogether } from '@algolia/recommend-react'; -import algoliasearch from 'algoliasearch'; +import recommend from '@algolia/recommend'; const appId = 'HYDY1KWTWB'; const apiKey = '28cf6d38411215e2eef188e635216508'; const indexName = 'gstar_demo_test'; -const searchClient = algoliasearch(appId, apiKey); +const recommendClient = recommend(appId, apiKey); function App({ currentObjectID }) { // ... const { recommendations } = useFrequentlyBoughtTogether({ - searchClient, + recommendClient, indexName, objectIDs: [currentObjectID], }); @@ -575,19 +575,19 @@ Generic hook to retrieve hits from an AI model. ```jsx import { useRecommendations } from '@algolia/recommend-react'; -import algoliasearch from 'algoliasearch'; +import recommend from '@algolia/recommend'; const appId = 'HYDY1KWTWB'; const apiKey = '28cf6d38411215e2eef188e635216508'; const indexName = 'gstar_demo_test'; -const searchClient = algoliasearch(appId, apiKey); +const recommendClient = recommend(appId, apiKey); function App({ currentObjectID }) { // ... const { recommendations } = useRecommendations({ model: 'related-products', - searchClient, + recommendClient, indexName, objectIDs: [currentObjectID], }); @@ -622,9 +622,9 @@ The name of the Recommendation model to use. ## Shared props -### `searchClient` +### `recommendClient` -> `SearchClient` | **required** +> `recommendClient` | **required** The initialized Algolia search client. @@ -646,13 +646,13 @@ An array of `objectID`s of the products to get recommendations from. The number of recommendations to retrieve. -### `fallbackFilters` +### `fallbackParameters` -> list of strings +> `Omit` Additional filters to use as fallback should there not be enough recommendations. -### `searchParameters` +### `queryParameters` > [`SearchParameters`](https://www.algolia.com/doc/api-reference/search-api-parameters/) | defaults to `{ analytics: false, enableABTest: false }` diff --git a/packages/recommend-react/package.json b/packages/recommend-react/package.json index 576b7925..f1a1bf26 100644 --- a/packages/recommend-react/package.json +++ b/packages/recommend-react/package.json @@ -33,7 +33,7 @@ "@algolia/recommend-vdom": "1.0.0-experimental.4" }, "peerDependencies": { - "algoliasearch": "^4.9.1", + "@algolia/recommend": "^4.10.2", "react": ">= 16.8.0 < 18", "react-dom": ">= 16.8.0 < 18" } diff --git a/packages/recommend-react/src/useAlgoliaAgent.ts b/packages/recommend-react/src/useAlgoliaAgent.ts index 6360670f..535b9e3a 100644 --- a/packages/recommend-react/src/useAlgoliaAgent.ts +++ b/packages/recommend-react/src/useAlgoliaAgent.ts @@ -3,10 +3,13 @@ import { useEffect } from 'react'; import { version } from './version'; -type UseAlgoliaAgentProps = Pick, 'searchClient'>; +type UseAlgoliaAgentProps = Pick< + GetRelatedProductsProps, + 'recommendClient' +>; export function useAlgoliaAgent(props: UseAlgoliaAgentProps) { useEffect(() => { - props.searchClient.addAlgoliaAgent('recommend-react', version); - }, [props.searchClient]); + props.recommendClient.addAlgoliaAgent('recommend-react', version); + }, [props.recommendClient]); } diff --git a/packages/recommend-react/src/useFrequentlyBoughtTogether.ts b/packages/recommend-react/src/useFrequentlyBoughtTogether.ts index fb3cd0df..e6827e8b 100644 --- a/packages/recommend-react/src/useFrequentlyBoughtTogether.ts +++ b/packages/recommend-react/src/useFrequentlyBoughtTogether.ts @@ -14,7 +14,7 @@ export function useFrequentlyBoughtTogether( recommendations: [], }); - useAlgoliaAgent({ searchClient: props.searchClient }); + useAlgoliaAgent({ recommendClient: props.recommendClient }); useEffect(() => { getFrequentlyBoughtTogether(props).then((response) => { diff --git a/packages/recommend-react/src/useRecommendations.ts b/packages/recommend-react/src/useRecommendations.ts index cf5233d9..28472ca1 100644 --- a/packages/recommend-react/src/useRecommendations.ts +++ b/packages/recommend-react/src/useRecommendations.ts @@ -14,7 +14,7 @@ export function useRecommendations( recommendations: [], }); - useAlgoliaAgent({ searchClient: props.searchClient }); + useAlgoliaAgent({ recommendClient: props.recommendClient }); useEffect(() => { getRecommendations(props).then((response) => { diff --git a/packages/recommend-react/src/useRelatedProducts.ts b/packages/recommend-react/src/useRelatedProducts.ts index b2b6b65d..608b338e 100644 --- a/packages/recommend-react/src/useRelatedProducts.ts +++ b/packages/recommend-react/src/useRelatedProducts.ts @@ -14,7 +14,7 @@ export function useRelatedProducts( recommendations: [], }); - useAlgoliaAgent({ searchClient: props.searchClient }); + useAlgoliaAgent({ recommendClient: props.recommendClient }); useEffect(() => { getRelatedProducts(props).then((response) => { diff --git a/test/utils/createRecommendClient.ts b/test/utils/createRecommendClient.ts new file mode 100644 index 00000000..eba15d51 --- /dev/null +++ b/test/utils/createRecommendClient.ts @@ -0,0 +1,46 @@ +import type { RecommendClient } from '@algolia/recommend'; + +import { + createMultiSearchResponse, + createSingleSearchResponse, +} from './createApiResponse'; + +export function createRecommendClient( + args: Partial = {} +): RecommendClient { + return { + appId: '', + addAlgoliaAgent: jest.fn(), + clearCache: jest.fn(), + transporter: { + userAgent: { + value: '', + add() { + return {}; + }, + }, + } as any, + getRecommendations: jest.fn((requests) => + Promise.resolve( + createMultiSearchResponse( + ...requests.map(() => createSingleSearchResponse()) + ) + ) + ), + getFrequentlyBoughtTogether: jest.fn((requests) => + Promise.resolve( + createMultiSearchResponse( + ...requests.map(() => createSingleSearchResponse()) + ) + ) + ), + getRelatedProducts: jest.fn((requests) => + Promise.resolve( + createMultiSearchResponse( + ...requests.map(() => createSingleSearchResponse()) + ) + ) + ), + ...args, + }; +} diff --git a/test/utils/createSearchClient.ts b/test/utils/createSearchClient.ts deleted file mode 100644 index 0e32ffce..00000000 --- a/test/utils/createSearchClient.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { SearchClient } from 'algoliasearch/lite'; - -import { - createMultiSearchResponse, - createSFFVResponse, - createSingleSearchResponse, -} from './createApiResponse'; - -export function createSearchClient( - args: Partial = {} -): SearchClient { - return { - appId: '', - addAlgoliaAgent: jest.fn(), - clearCache: jest.fn(), - // @ts-expect-error `initIndex` is not part of the lite bundle - initIndex: jest.fn(() => ({ - getObject: jest.fn(() => Promise.resolve({})), - search: jest.fn(() => Promise.resolve(createSingleSearchResponse())), - })), - transporter: { - userAgent: { - value: '', - add() { - return {}; - }, - }, - } as any, - search: jest.fn((requests) => - Promise.resolve( - createMultiSearchResponse( - ...requests.map(() => createSingleSearchResponse()) - ) - ) - ), - searchForFacetValues: jest.fn(() => - Promise.resolve([createSFFVResponse()]) - ), - ...args, - }; -} diff --git a/test/utils/index.ts b/test/utils/index.ts index 5d0d6ddd..6465964a 100644 --- a/test/utils/index.ts +++ b/test/utils/index.ts @@ -1,2 +1,2 @@ export * from './createApiResponse'; -export * from './createSearchClient'; +export * from './createRecommendClient'; diff --git a/yarn.lock b/yarn.lock index ccbf3142..2986d4b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,43 +36,56 @@ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.1.0.tgz#24b4545442e94dd3d90d6066b437e9aea3de5246" integrity sha512-usbOwwPydJEzUlMjLAip/CtMqKy2PzsnhkFfWoBPBr9I74uBNYa4+NJBg0b31KmNLSUH0nWFlhiIKwNBjoMTzg== -"@algolia/cache-browser-local-storage@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.9.1.tgz#784e91580dcca00a8280b0905197f5abbbdf4b48" - integrity sha512-bAUU9vKCy45uTTlzJw0LYu1IjoZsmzL6lgjaVFaW1crhX/4P+JD5ReQv3n/wpiXSFaHq1WEO3WyH2g3ymzeipQ== +"@algolia/cache-browser-local-storage@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.0.tgz#02e3f1304908ff64fbdfb2d97ab2280b7ec0b9e2" + integrity sha512-D1aMAbuc0MRQxUWzF4zwFM/nwXjlqRm3SJ4OX9V/rFLWF9272QvYqVUT8lCdX0nCT4XWGk6daQSUw62Knl22vA== dependencies: - "@algolia/cache-common" "4.9.1" + "@algolia/cache-common" "4.10.0" + +"@algolia/cache-common@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.10.0.tgz#d94fe61eda35b78a4fd0c573e28e9aef44dff7f6" + integrity sha512-Vb4jQY2pks+vNS1xj1FmsnTGlAEOFp0T5ZXIOlwmLjrZBfiHxGNIAbfQ6CrEbaVD+lsD66L4pT7ARjZpVz2iqw== "@algolia/cache-common@4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.9.1.tgz#2d5f37ba7aab7db76627c4a4fce51a7fd137fa65" integrity sha512-tcvw4mOfFy44V4ZxDEy9wNGr6vFROZKRpXKTEBgdw/WBn6mX51H1ar4RWtceDEcDU4H5fIv5tsY3ip2hU+fTPg== -"@algolia/cache-in-memory@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.9.1.tgz#3fd1d67aec804b6cc8439015b8b9c712a45c7ae0" - integrity sha512-IEJrHonvdymW2CnRfJtsTVWyfAH05xPEFkGXGCw00+6JNCj8Dln3TeaRLiaaY1srlyGedkemekQm1/Xb46CGOQ== +"@algolia/cache-in-memory@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.10.0.tgz#ad84db3809fc1385b16a346d2f8e973fb1be7014" + integrity sha512-lgAu6Hq+QYq58hlZ/SAyP2Omw7OcDwMGT74M85lHF23zu2Zz2vDPd/M1zOOseoBbgu0FHIsxtPKH5zDlAuH9FA== dependencies: - "@algolia/cache-common" "4.9.1" + "@algolia/cache-common" "4.10.0" -"@algolia/client-account@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.9.1.tgz#f2c1b3e49de2ee1fca44b8b5e64e1ce0dbdff0db" - integrity sha512-Shpjeuwb7i2LR5QuWREb6UbEQLGB+Pl/J5+wPgILJDP/uWp7jpl0ase9mYNQGKj7TjztpSpQCPZ3dSHPnzZPfw== +"@algolia/client-account@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.10.0.tgz#b9ba85a5280d4b70f77d6ee9bf8ddcc5cf565b2e" + integrity sha512-PysRw3Sl/h78MdajST45x6Vqsx3ni9xNGAzz4osGFG+IovTbHF9AhUXWFGWz4AhfXQiuRyOEbsNdltGla0h/Sg== dependencies: - "@algolia/client-common" "4.9.1" - "@algolia/client-search" "4.9.1" - "@algolia/transporter" "4.9.1" + "@algolia/client-common" "4.10.0" + "@algolia/client-search" "4.10.0" + "@algolia/transporter" "4.10.0" -"@algolia/client-analytics@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.9.1.tgz#56972496526910c53c5ce7844f4571efba63eb5f" - integrity sha512-/g6OkOSIA+A0t/tjvbL6iG/zV4El4LPFgv/tcAYHTH27BmlNtnEXw+iFpGjeUlQoPily9WVB3QNLMJkaNwL3HA== +"@algolia/client-analytics@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.10.0.tgz#232202111fd72fd223cbaf13044003c71f3cd3e2" + integrity sha512-+sn4GFrDeymftiJhxjeVBWUd9t6d3iEYjyrubKbTazIWof23EYRjibjXEbMCaxv1GFbogFmYqJ+cblUraG1h/g== dependencies: - "@algolia/client-common" "4.9.1" - "@algolia/client-search" "4.9.1" - "@algolia/requester-common" "4.9.1" - "@algolia/transporter" "4.9.1" + "@algolia/client-common" "4.10.0" + "@algolia/client-search" "4.10.0" + "@algolia/requester-common" "4.10.0" + "@algolia/transporter" "4.10.0" + +"@algolia/client-common@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.10.0.tgz#254d71dfcb2676ea40d3d61686ae698161458a7f" + integrity sha512-QpmAgB8BewXlfChNS25qU8CvAb+fe8VWVdWPvMfHTwxVvcvwHVkwzc0N3kYNT4G6yc1Tn29RdPkTVuCX0Pdfaw== + dependencies: + "@algolia/requester-common" "4.10.0" + "@algolia/transporter" "4.10.0" "@algolia/client-common@4.9.1": version "4.9.1" @@ -82,14 +95,23 @@ "@algolia/requester-common" "4.9.1" "@algolia/transporter" "4.9.1" -"@algolia/client-recommendation@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@algolia/client-recommendation/-/client-recommendation-4.9.1.tgz#217af2a38d37ab12cf23a419cc9a576af9d15b13" - integrity sha512-Drtvvm1PNIOpYf4HFlkPFstFQ3IsN+TRmxur2F7y6Faplb5ybISa8ithu1tmlTdyTf3A78hQUQjgJet6qD2XZw== +"@algolia/client-personalization@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.10.0.tgz#4b564e0a279856e9025dbc5b52cbe41b684820e8" + integrity sha512-/dUCjYbDFjz8n+qcjxzvhbiGCUOv+m6GBP+9JR/nyu3d90Fm29eZo6M1ijMD6QOG+NFY58i0twv4Q5y55rRc5g== dependencies: - "@algolia/client-common" "4.9.1" - "@algolia/requester-common" "4.9.1" - "@algolia/transporter" "4.9.1" + "@algolia/client-common" "4.10.0" + "@algolia/requester-common" "4.10.0" + "@algolia/transporter" "4.10.0" + +"@algolia/client-search@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.10.0.tgz#8ae65954eee56de26275ca4d872e5f46c8aec648" + integrity sha512-V/W45pryCWKm/5mn4BjLe/VKxRXWlN8pTSXGWastyx+ecaBE4xWOOpxr6RMfSLQaw6xbNs8lTEbrn6AxDyJYug== + dependencies: + "@algolia/client-common" "4.10.0" + "@algolia/requester-common" "4.10.0" + "@algolia/transporter" "4.10.0" "@algolia/client-search@4.9.1": version "4.9.1" @@ -100,36 +122,72 @@ "@algolia/requester-common" "4.9.1" "@algolia/transporter" "4.9.1" +"@algolia/logger-common@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.10.0.tgz#8ed00855d70d8bc80ad381bbaf394684020e8f6b" + integrity sha512-wbcK79XQ0nXDW16qyy4yY3vMlDtmVedpx2+2fJo8o16xVss9ONL4JGsD9XnVljZHwQ7sFIHt7sQJ+GpTB0pKrQ== + "@algolia/logger-common@4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.9.1.tgz#3323834095f2916338d2535d2df91c4723ac19f2" integrity sha512-9mPrbFlFyPT7or/7PXTiJjyOewWB9QRkZKVXkt5zHAUiUzGxmmdpJIGpPv3YQnDur8lXrXaRI0MHXUuIDMY1ng== -"@algolia/logger-console@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.9.1.tgz#c324ef26843dbed06b44586309331dbb949744ad" - integrity sha512-74VUwjtFjFpjZpi3QoHIPv0kcr3vWUSHX/Vs8PJW3lPsD4CgyhFenQbG9v+ZnyH0JrJwiYTtzfmrVh7IMWZGrQ== - dependencies: - "@algolia/logger-common" "4.9.1" - -"@algolia/requester-browser-xhr@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.9.1.tgz#0812f3c7c4105a4646c0fba8429b172b2d0e01c5" - integrity sha512-zc46tk5o0ikOAz3uYiRAMxC2iVKAMFKT7nNZnLB5IzT0uqAh7pz/+D/UvIxP4bKmsllpBSnPcpfQF+OI4Ag/BA== - dependencies: - "@algolia/requester-common" "4.9.1" +"@algolia/logger-console@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.10.0.tgz#62a83e2ccf15309361e17d8ba12aac123afe3fb3" + integrity sha512-SScEwLLkFdRa6XG8vva4soQIqDf2Vq5Dr9QQll2ax/Vo662dBMLEbp21z/8k+KetTLkyeplpD4YIWJaAADUXpg== + dependencies: + "@algolia/logger-common" "4.10.0" + +"@algolia/recommend@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.10.0.tgz#cc658f69748c33dfca06a454663fc726ff497be5" + integrity sha512-/Np4uKkeLHK09+l5JnvIo1YFOnqPLtG5ZuJb9qY5zxdrJeKD+SFkfSh5pcovgEMPXp/oP/1xiTwX7ob2q0ZeXA== + dependencies: + "@algolia/cache-browser-local-storage" "4.10.0" + "@algolia/cache-common" "4.10.0" + "@algolia/cache-in-memory" "4.10.0" + "@algolia/client-common" "4.10.0" + "@algolia/client-search" "4.10.0" + "@algolia/logger-common" "4.10.0" + "@algolia/logger-console" "4.10.0" + "@algolia/requester-browser-xhr" "4.10.0" + "@algolia/requester-common" "4.10.0" + "@algolia/requester-node-http" "4.10.0" + "@algolia/transporter" "4.10.0" + +"@algolia/requester-browser-xhr@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.0.tgz#606c8534d5c86a7e614bf89beeae1a2ecc34b7cd" + integrity sha512-N/rmbbU00Q9nUibcWis3ys+6meXWFcCOWoyBpxragyWGQ/7Gu9yY9fT0LOsNUGSf7On2pRvTBIqo1Ssb1aSaJA== + dependencies: + "@algolia/requester-common" "4.10.0" + +"@algolia/requester-common@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.10.0.tgz#c33f0ed6cb0c71f1760c76ab7c430095ec41c647" + integrity sha512-uLhBokatCETTpjh4hLxXtZNird1D3OCG/UaiskKBbWBa3n9fQs7RYY6kGhlUT4syjZHngsw4Zs6Qm10pbilkQQ== "@algolia/requester-common@4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.9.1.tgz#50fcf4c7c1ed7ae13159167ac1da2844d036a630" integrity sha512-9hPgXnlCSbqJqF69M5x5WN3h51Dc+mk/iWNeJSVxExHGvCDfBBZd0v6S15i8q2a9cD1I2RnhMpbnX5BmGtabVA== -"@algolia/requester-node-http@4.9.1": - version "4.9.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.9.1.tgz#70054a0aa5643072404fcb68042eec97c7abd1c8" - integrity sha512-vYNVbSCuyrCSCjHBQJk+tLZtWCjvvDf5tSbRJjyJYMqpnXuIuP7gZm24iHil4NPYBhbBj5NU2ZDAhc/gTn75Ag== +"@algolia/requester-node-http@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.10.0.tgz#ad0ec3da25d3cf99049c6f410e9c7fe29d1e4ec9" + integrity sha512-3H/Mw7NosAJIHpyBBnot9sRp5sajUyAwtBeRJcojqIHtDPWCDYMGkjpKMohR20TtHZOrb0QsGQSx1ITmf2knmw== dependencies: - "@algolia/requester-common" "4.9.1" + "@algolia/requester-common" "4.10.0" + +"@algolia/transporter@4.10.0": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.10.0.tgz#f810853fd37ab3cac151f73e2c7acad5750b2d00" + integrity sha512-qan7d1LrEWWqSQneDxqdDeXeQPr9k3zpQTEMX0FoLOq3YP4lzFjQ00I39qvUeUqRgj3gYM3hy8t5wsnnx+aXzw== + dependencies: + "@algolia/cache-common" "4.10.0" + "@algolia/logger-common" "4.10.0" + "@algolia/requester-common" "4.10.0" "@algolia/transporter@4.9.1": version "4.9.1" @@ -3503,25 +3561,25 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -algoliasearch@4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.9.1.tgz#1fa8ece3f9808e465226176b88b953801c2274e0" - integrity sha512-EeJUYXzBEhZSsL6tXc3hseLBCtlNLa1MZ4mlMK6EeX38yRjY5vgnFcNNml6uUhlOjvheKxgkKRpPWkxgL8Cqkg== - dependencies: - "@algolia/cache-browser-local-storage" "4.9.1" - "@algolia/cache-common" "4.9.1" - "@algolia/cache-in-memory" "4.9.1" - "@algolia/client-account" "4.9.1" - "@algolia/client-analytics" "4.9.1" - "@algolia/client-common" "4.9.1" - "@algolia/client-recommendation" "4.9.1" - "@algolia/client-search" "4.9.1" - "@algolia/logger-common" "4.9.1" - "@algolia/logger-console" "4.9.1" - "@algolia/requester-browser-xhr" "4.9.1" - "@algolia/requester-common" "4.9.1" - "@algolia/requester-node-http" "4.9.1" - "@algolia/transporter" "4.9.1" +algoliasearch@4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.10.0.tgz#320d7edf11c9c91f330a185cd52791c42fb73632" + integrity sha512-9cUQxeHlEtBiFoax3OmRr6+Cb5zaxyjHx7dfj4SrQCzskde0n11aVRddOsubaRGHMsNfk1E+/zEykco21Q3duA== + dependencies: + "@algolia/cache-browser-local-storage" "4.10.0" + "@algolia/cache-common" "4.10.0" + "@algolia/cache-in-memory" "4.10.0" + "@algolia/client-account" "4.10.0" + "@algolia/client-analytics" "4.10.0" + "@algolia/client-common" "4.10.0" + "@algolia/client-personalization" "4.10.0" + "@algolia/client-search" "4.10.0" + "@algolia/logger-common" "4.10.0" + "@algolia/logger-console" "4.10.0" + "@algolia/requester-browser-xhr" "4.10.0" + "@algolia/requester-common" "4.10.0" + "@algolia/requester-node-http" "4.10.0" + "@algolia/transporter" "4.10.0" alphanum-sort@^1.0.0: version "1.0.2" From 70aa3c39c243caf39e4c7534d1bac7c9cfc1706d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Wed, 23 Jun 2021 18:31:13 +0200 Subject: [PATCH 2/5] chore: update lockfile --- yarn.lock | 238 +++++++++++++++++++++++++++--------------------------- 1 file changed, 119 insertions(+), 119 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2986d4b2..4bef54a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,56 +36,56 @@ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.1.0.tgz#24b4545442e94dd3d90d6066b437e9aea3de5246" integrity sha512-usbOwwPydJEzUlMjLAip/CtMqKy2PzsnhkFfWoBPBr9I74uBNYa4+NJBg0b31KmNLSUH0nWFlhiIKwNBjoMTzg== -"@algolia/cache-browser-local-storage@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.0.tgz#02e3f1304908ff64fbdfb2d97ab2280b7ec0b9e2" - integrity sha512-D1aMAbuc0MRQxUWzF4zwFM/nwXjlqRm3SJ4OX9V/rFLWF9272QvYqVUT8lCdX0nCT4XWGk6daQSUw62Knl22vA== +"@algolia/cache-browser-local-storage@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.2.tgz#9925c7c0ce94257564b8948b60fc427c4a98124c" + integrity sha512-B3NInwobEAim4J4Y0mgZermoi0DCXdTT/Q+4ehLamqUqxLw8To5zc9izjg7B8JaFSQsqflRdCeRmYEv2gYDY7g== dependencies: - "@algolia/cache-common" "4.10.0" + "@algolia/cache-common" "4.10.2" -"@algolia/cache-common@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.10.0.tgz#d94fe61eda35b78a4fd0c573e28e9aef44dff7f6" - integrity sha512-Vb4jQY2pks+vNS1xj1FmsnTGlAEOFp0T5ZXIOlwmLjrZBfiHxGNIAbfQ6CrEbaVD+lsD66L4pT7ARjZpVz2iqw== +"@algolia/cache-common@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.10.2.tgz#0113419518419895118d132bed4115345a865ce3" + integrity sha512-xcGbV0+6gLu2C7XoJdD+Pp6wWjROle6PNDsa6O21vS7fw1a03xb2bEnFdl1U31bs69P1z8IRy3h+8RVBouvhhw== "@algolia/cache-common@4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.9.1.tgz#2d5f37ba7aab7db76627c4a4fce51a7fd137fa65" integrity sha512-tcvw4mOfFy44V4ZxDEy9wNGr6vFROZKRpXKTEBgdw/WBn6mX51H1ar4RWtceDEcDU4H5fIv5tsY3ip2hU+fTPg== -"@algolia/cache-in-memory@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.10.0.tgz#ad84db3809fc1385b16a346d2f8e973fb1be7014" - integrity sha512-lgAu6Hq+QYq58hlZ/SAyP2Omw7OcDwMGT74M85lHF23zu2Zz2vDPd/M1zOOseoBbgu0FHIsxtPKH5zDlAuH9FA== +"@algolia/cache-in-memory@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.10.2.tgz#2d34d4155425b385d19ff197a8943a4b5084c790" + integrity sha512-zPIcxHQEJXy+M35A+v9Y5u5BAQOKR2aFK0kYpAdW/OrgxYcrFHtVCxwIWB/ZhGbkDtzCW8/8tJeddcD5YsHX9Q== dependencies: - "@algolia/cache-common" "4.10.0" + "@algolia/cache-common" "4.10.2" -"@algolia/client-account@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.10.0.tgz#b9ba85a5280d4b70f77d6ee9bf8ddcc5cf565b2e" - integrity sha512-PysRw3Sl/h78MdajST45x6Vqsx3ni9xNGAzz4osGFG+IovTbHF9AhUXWFGWz4AhfXQiuRyOEbsNdltGla0h/Sg== +"@algolia/client-account@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.10.2.tgz#c53d18d4f57ab5343c21e0ed795421964ba0cbb9" + integrity sha512-iuIU+xUtjgR9p4Hpujlr8mePDPSrVIk3peg+RAUhxniLBDaI+OhgHyhP6Lmh9flWk+JfRg91Rhk46xuxMLqwfA== dependencies: - "@algolia/client-common" "4.10.0" - "@algolia/client-search" "4.10.0" - "@algolia/transporter" "4.10.0" + "@algolia/client-common" "4.10.2" + "@algolia/client-search" "4.10.2" + "@algolia/transporter" "4.10.2" -"@algolia/client-analytics@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.10.0.tgz#232202111fd72fd223cbaf13044003c71f3cd3e2" - integrity sha512-+sn4GFrDeymftiJhxjeVBWUd9t6d3iEYjyrubKbTazIWof23EYRjibjXEbMCaxv1GFbogFmYqJ+cblUraG1h/g== +"@algolia/client-analytics@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.10.2.tgz#93c881cfb9e5df389725d821327fa801f1baa2c6" + integrity sha512-u47J65NHs0fMryDrMeuLMGjXDOKt/muF9WlfbMslT2Cvdd7PZwl9KYnT7xMhnmBB8TDiDMmEQkDykhnCOnwVNw== dependencies: - "@algolia/client-common" "4.10.0" - "@algolia/client-search" "4.10.0" - "@algolia/requester-common" "4.10.0" - "@algolia/transporter" "4.10.0" + "@algolia/client-common" "4.10.2" + "@algolia/client-search" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/transporter" "4.10.2" -"@algolia/client-common@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.10.0.tgz#254d71dfcb2676ea40d3d61686ae698161458a7f" - integrity sha512-QpmAgB8BewXlfChNS25qU8CvAb+fe8VWVdWPvMfHTwxVvcvwHVkwzc0N3kYNT4G6yc1Tn29RdPkTVuCX0Pdfaw== +"@algolia/client-common@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.10.2.tgz#a715e8feb2a2b6ea38765f53e8ae6ffc4ed80aba" + integrity sha512-sfgZCv9ha9aHbe3ErAYb1blg2qx4XTLvQqP1jq8asU75rrH9XBTtSzQQO43GlArwhtwCHLgcWquN3WgPlLzkiQ== dependencies: - "@algolia/requester-common" "4.10.0" - "@algolia/transporter" "4.10.0" + "@algolia/requester-common" "4.10.2" + "@algolia/transporter" "4.10.2" "@algolia/client-common@4.9.1": version "4.9.1" @@ -95,23 +95,23 @@ "@algolia/requester-common" "4.9.1" "@algolia/transporter" "4.9.1" -"@algolia/client-personalization@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.10.0.tgz#4b564e0a279856e9025dbc5b52cbe41b684820e8" - integrity sha512-/dUCjYbDFjz8n+qcjxzvhbiGCUOv+m6GBP+9JR/nyu3d90Fm29eZo6M1ijMD6QOG+NFY58i0twv4Q5y55rRc5g== +"@algolia/client-personalization@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.10.2.tgz#89d761bcf60ce13b8565c2ae8ab644c3a3d114c8" + integrity sha512-2UhUNo/czfA/keOC3+vFyMnFGV/E1Zkm+ek9Fsk/9miS39UMhx2CmH5vKSIJ7jxLSin7zBaCwKt65phfYty1pg== dependencies: - "@algolia/client-common" "4.10.0" - "@algolia/requester-common" "4.10.0" - "@algolia/transporter" "4.10.0" + "@algolia/client-common" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/transporter" "4.10.2" -"@algolia/client-search@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.10.0.tgz#8ae65954eee56de26275ca4d872e5f46c8aec648" - integrity sha512-V/W45pryCWKm/5mn4BjLe/VKxRXWlN8pTSXGWastyx+ecaBE4xWOOpxr6RMfSLQaw6xbNs8lTEbrn6AxDyJYug== +"@algolia/client-search@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.10.2.tgz#ad281b04ec4e6eaff68fb5be330f0bdf965ce011" + integrity sha512-ZdOh6XS6Y9bcekfG4y0VhdoIYfsTounsgXX4Bt3X2RCcmY3uotgaq2EVY58E6q6nvfgBfPHW18+AZCHKTWHAAw== dependencies: - "@algolia/client-common" "4.10.0" - "@algolia/requester-common" "4.10.0" - "@algolia/transporter" "4.10.0" + "@algolia/client-common" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/transporter" "4.10.2" "@algolia/client-search@4.9.1": version "4.9.1" @@ -122,72 +122,72 @@ "@algolia/requester-common" "4.9.1" "@algolia/transporter" "4.9.1" -"@algolia/logger-common@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.10.0.tgz#8ed00855d70d8bc80ad381bbaf394684020e8f6b" - integrity sha512-wbcK79XQ0nXDW16qyy4yY3vMlDtmVedpx2+2fJo8o16xVss9ONL4JGsD9XnVljZHwQ7sFIHt7sQJ+GpTB0pKrQ== +"@algolia/logger-common@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.10.2.tgz#f28e966a6b878af2917ed2e1518f46650a6fb8ad" + integrity sha512-UJaU6arzmW+FT5fCv5NIbxNMtEoGcf+UENmZxxu7k7UWPARR2XL4ljJ45Jv14Z5dlz32LXWtR1PRmNfkDMk22Q== "@algolia/logger-common@4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.9.1.tgz#3323834095f2916338d2535d2df91c4723ac19f2" integrity sha512-9mPrbFlFyPT7or/7PXTiJjyOewWB9QRkZKVXkt5zHAUiUzGxmmdpJIGpPv3YQnDur8lXrXaRI0MHXUuIDMY1ng== -"@algolia/logger-console@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.10.0.tgz#62a83e2ccf15309361e17d8ba12aac123afe3fb3" - integrity sha512-SScEwLLkFdRa6XG8vva4soQIqDf2Vq5Dr9QQll2ax/Vo662dBMLEbp21z/8k+KetTLkyeplpD4YIWJaAADUXpg== - dependencies: - "@algolia/logger-common" "4.10.0" - -"@algolia/recommend@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.10.0.tgz#cc658f69748c33dfca06a454663fc726ff497be5" - integrity sha512-/Np4uKkeLHK09+l5JnvIo1YFOnqPLtG5ZuJb9qY5zxdrJeKD+SFkfSh5pcovgEMPXp/oP/1xiTwX7ob2q0ZeXA== - dependencies: - "@algolia/cache-browser-local-storage" "4.10.0" - "@algolia/cache-common" "4.10.0" - "@algolia/cache-in-memory" "4.10.0" - "@algolia/client-common" "4.10.0" - "@algolia/client-search" "4.10.0" - "@algolia/logger-common" "4.10.0" - "@algolia/logger-console" "4.10.0" - "@algolia/requester-browser-xhr" "4.10.0" - "@algolia/requester-common" "4.10.0" - "@algolia/requester-node-http" "4.10.0" - "@algolia/transporter" "4.10.0" - -"@algolia/requester-browser-xhr@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.0.tgz#606c8534d5c86a7e614bf89beeae1a2ecc34b7cd" - integrity sha512-N/rmbbU00Q9nUibcWis3ys+6meXWFcCOWoyBpxragyWGQ/7Gu9yY9fT0LOsNUGSf7On2pRvTBIqo1Ssb1aSaJA== - dependencies: - "@algolia/requester-common" "4.10.0" - -"@algolia/requester-common@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.10.0.tgz#c33f0ed6cb0c71f1760c76ab7c430095ec41c647" - integrity sha512-uLhBokatCETTpjh4hLxXtZNird1D3OCG/UaiskKBbWBa3n9fQs7RYY6kGhlUT4syjZHngsw4Zs6Qm10pbilkQQ== +"@algolia/logger-console@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.10.2.tgz#9d3dcbb077242db92f0f0a1795ec95c3bc839599" + integrity sha512-JrCrZ7CGs/TsyNR2AWe9Vdd6rsuxfvfcpqbu+CY7LBUYEnV8GERkf7FnDNaKVNsFJqClILCGh3U8CzQ1G5L+kA== + dependencies: + "@algolia/logger-common" "4.10.2" + +"@algolia/recommend@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.10.2.tgz#acfdded645725207267c355202a300343c2aa7e9" + integrity sha512-vlH7uFz+4G6VNyI9mcMJdUEI/GEJBzS7QisxX17OxcW7RGoqR9ouOWWG+7Z3DFtrhwQOm1EZ/RDid63WJlBP9g== + dependencies: + "@algolia/cache-browser-local-storage" "4.10.2" + "@algolia/cache-common" "4.10.2" + "@algolia/cache-in-memory" "4.10.2" + "@algolia/client-common" "4.10.2" + "@algolia/client-search" "4.10.2" + "@algolia/logger-common" "4.10.2" + "@algolia/logger-console" "4.10.2" + "@algolia/requester-browser-xhr" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/requester-node-http" "4.10.2" + "@algolia/transporter" "4.10.2" + +"@algolia/requester-browser-xhr@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.2.tgz#2286e2f10fff3651f719b8d7d3defc8c032fcce0" + integrity sha512-LveaAp7/oCBotv1aZ4VHz8fCcJA7v/28ayh+Ljlm+hYXsxgs6NAYKz7iBpxGN7q5MV8GM+MThRYNFoT0cHTMxQ== + dependencies: + "@algolia/requester-common" "4.10.2" + +"@algolia/requester-common@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.10.2.tgz#8b62f0848454ec5b07bd3599f5fb2b87ec7c4de8" + integrity sha512-3J2W0fAaURLGK0lEGeNb8eWJnQcsu+oIcfJTCIYkYT5T9w21M65kUUyD9QSf/K137qQts3tzGniUR3LxfovlXA== "@algolia/requester-common@4.9.1": version "4.9.1" resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.9.1.tgz#50fcf4c7c1ed7ae13159167ac1da2844d036a630" integrity sha512-9hPgXnlCSbqJqF69M5x5WN3h51Dc+mk/iWNeJSVxExHGvCDfBBZd0v6S15i8q2a9cD1I2RnhMpbnX5BmGtabVA== -"@algolia/requester-node-http@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.10.0.tgz#ad0ec3da25d3cf99049c6f410e9c7fe29d1e4ec9" - integrity sha512-3H/Mw7NosAJIHpyBBnot9sRp5sajUyAwtBeRJcojqIHtDPWCDYMGkjpKMohR20TtHZOrb0QsGQSx1ITmf2knmw== +"@algolia/requester-node-http@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.10.2.tgz#edb691e34e18aacc15107193319e1a712e024649" + integrity sha512-IBqsalCGgn0CrOP1PKRB5rufEOvHlrSQUFEGXZ8mxmE/zU8CLX2LKqdHbEFeNDLFl+l+8HW5BGVDGD2rvG+hSg== dependencies: - "@algolia/requester-common" "4.10.0" + "@algolia/requester-common" "4.10.2" -"@algolia/transporter@4.10.0": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.10.0.tgz#f810853fd37ab3cac151f73e2c7acad5750b2d00" - integrity sha512-qan7d1LrEWWqSQneDxqdDeXeQPr9k3zpQTEMX0FoLOq3YP4lzFjQ00I39qvUeUqRgj3gYM3hy8t5wsnnx+aXzw== +"@algolia/transporter@4.10.2": + version "4.10.2" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.10.2.tgz#ae0fa7c99b9bf8efa5ac83843558be1074e7c045" + integrity sha512-I3QDRSookQtPSUEnxT2XCShhipCT4beJBpWhteNwMrWQF/SqTsveqSR6bX0G49lDh9MOmYrOlCegteuKuT/tEw== dependencies: - "@algolia/cache-common" "4.10.0" - "@algolia/logger-common" "4.10.0" - "@algolia/requester-common" "4.10.0" + "@algolia/cache-common" "4.10.2" + "@algolia/logger-common" "4.10.2" + "@algolia/requester-common" "4.10.2" "@algolia/transporter@4.9.1": version "4.9.1" @@ -3561,25 +3561,25 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -algoliasearch@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.10.0.tgz#320d7edf11c9c91f330a185cd52791c42fb73632" - integrity sha512-9cUQxeHlEtBiFoax3OmRr6+Cb5zaxyjHx7dfj4SrQCzskde0n11aVRddOsubaRGHMsNfk1E+/zEykco21Q3duA== - dependencies: - "@algolia/cache-browser-local-storage" "4.10.0" - "@algolia/cache-common" "4.10.0" - "@algolia/cache-in-memory" "4.10.0" - "@algolia/client-account" "4.10.0" - "@algolia/client-analytics" "4.10.0" - "@algolia/client-common" "4.10.0" - "@algolia/client-personalization" "4.10.0" - "@algolia/client-search" "4.10.0" - "@algolia/logger-common" "4.10.0" - "@algolia/logger-console" "4.10.0" - "@algolia/requester-browser-xhr" "4.10.0" - "@algolia/requester-common" "4.10.0" - "@algolia/requester-node-http" "4.10.0" - "@algolia/transporter" "4.10.0" +algoliasearch@4.10.2: + version "4.10.2" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.10.2.tgz#23e88c71cb381d5b59430baa5d417186cc8ff683" + integrity sha512-BAYCe97XRfO15irJKBRjBnrp9tSqN0jppklLIXKdtUcXlibcPQtuAeGUP2cPiz6bJd3ISuoYzLFNt4/fQYtLMw== + dependencies: + "@algolia/cache-browser-local-storage" "4.10.2" + "@algolia/cache-common" "4.10.2" + "@algolia/cache-in-memory" "4.10.2" + "@algolia/client-account" "4.10.2" + "@algolia/client-analytics" "4.10.2" + "@algolia/client-common" "4.10.2" + "@algolia/client-personalization" "4.10.2" + "@algolia/client-search" "4.10.2" + "@algolia/logger-common" "4.10.2" + "@algolia/logger-console" "4.10.2" + "@algolia/requester-browser-xhr" "4.10.2" + "@algolia/requester-common" "4.10.2" + "@algolia/requester-node-http" "4.10.2" + "@algolia/transporter" "4.10.2" alphanum-sort@^1.0.0: version "1.0.2" From 0f80cacb367dba59522d24059ff9d4a34ceeb458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Wed, 23 Jun 2021 18:31:21 +0200 Subject: [PATCH 3/5] test: update tests --- .../src/__tests__/getRecommendations.test.ts | 43 +++++-------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/packages/recommend-core/src/__tests__/getRecommendations.test.ts b/packages/recommend-core/src/__tests__/getRecommendations.test.ts index 440db7a6..25cf7520 100644 --- a/packages/recommend-core/src/__tests__/getRecommendations.test.ts +++ b/packages/recommend-core/src/__tests__/getRecommendations.test.ts @@ -77,28 +77,17 @@ describe('getRecommendations', () => { }, }; - await getRecommendations([props]); + await getRecommendations(props); expect(recommendClient.getRecommendations).toHaveBeenCalledTimes(1); expect(recommendClient.getRecommendations).toHaveBeenCalledWith([ { + model: 'related-products', indexName: 'indexName', - params: { - analytics: false, - analyticsTags: ['alg-recommend_related-products'], - clickAnalytics: false, - enableABTest: false, + objectID: 'objectID', + queryParameters: { facetFilters: [['brand:Apple']], - filters: 'NOT objectID:objectID', - hitsPerPage: 3, - optionalFilters: [ - 'objectID:1', - 'objectID:2', - 'objectID:3', - 'category:Laptops', - ], - ruleContexts: ['alg-recommend_related-products_objectID'], - typoTolerance: false, + optionalFilters: ['category:Laptops'], }, }, ]); @@ -117,26 +106,17 @@ describe('getRecommendations', () => { }, }; - await getRecommendations([props]); + await getRecommendations(props); expect(recommendClient.getRecommendations).toHaveBeenCalledTimes(1); expect(recommendClient.getRecommendations).toHaveBeenCalledWith([ { + model: 'bought-together', indexName: 'indexName', - params: { - analytics: false, - analyticsTags: ['alg-recommend_bought-together'], - clickAnalytics: false, - enableABTest: false, - facetFilters: [ - ['objectID:1', 'objectID:2', 'objectID:3'], - ['brand:Apple'], - ], - filters: 'NOT objectID:objectID', - hitsPerPage: 3, + objectID: 'objectID', + queryParameters: { + facetFilters: [['brand:Apple']], optionalFilters: ['category:Laptops'], - ruleContexts: ['alg-recommend_bought-together_objectID'], - typoTolerance: false, }, }, ]); @@ -151,11 +131,10 @@ describe('getRecommendations', () => { objectIDs: ['objectID'], }; - const { recommendations } = await getRecommendations([props]); + const { recommendations } = await getRecommendations(props); expect(recommendations).toEqual([ { - _score: null, category: 'Women - Jumpsuits-Overalls', hierarchical_categories: { lvl0: 'women', From 45dd1d991e52c0a6ec3340dff14ea392d4011d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Wed, 23 Jun 2021 18:33:47 +0200 Subject: [PATCH 4/5] test: remove cast --- .../recommend-core/src/__tests__/getRecommendations.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/recommend-core/src/__tests__/getRecommendations.test.ts b/packages/recommend-core/src/__tests__/getRecommendations.test.ts index 25cf7520..95d60ae0 100644 --- a/packages/recommend-core/src/__tests__/getRecommendations.test.ts +++ b/packages/recommend-core/src/__tests__/getRecommendations.test.ts @@ -68,7 +68,7 @@ describe('getRecommendations', () => { const { recommendClient } = createRecommendationsClient(); const props = { model: 'related-products' as RecommendModel, - recommendClient: recommendClient as any, + recommendClient, indexName: 'indexName', objectIDs: ['objectID'], queryParameters: { @@ -97,7 +97,7 @@ describe('getRecommendations', () => { const { recommendClient } = createRecommendationsClient(); const props = { model: 'bought-together' as RecommendModel, - recommendClient: recommendClient as any, + recommendClient, indexName: 'indexName', objectIDs: ['objectID'], queryParameters: { @@ -126,7 +126,7 @@ describe('getRecommendations', () => { const { recommendClient } = createRecommendationsClient(); const props = { model: 'related-products' as RecommendModel, - recommendClient: recommendClient as any, + recommendClient, indexName: 'indexName', objectIDs: ['objectID'], }; From 9024681d1489c3eb11e362836641ae199811569c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Wed, 23 Jun 2021 18:33:54 +0200 Subject: [PATCH 5/5] test: mock `destroy` --- test/utils/createRecommendClient.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/test/utils/createRecommendClient.ts b/test/utils/createRecommendClient.ts index eba15d51..76b05cd1 100644 --- a/test/utils/createRecommendClient.ts +++ b/test/utils/createRecommendClient.ts @@ -12,14 +12,7 @@ export function createRecommendClient( appId: '', addAlgoliaAgent: jest.fn(), clearCache: jest.fn(), - transporter: { - userAgent: { - value: '', - add() { - return {}; - }, - }, - } as any, + destroy: jest.fn(), getRecommendations: jest.fn((requests) => Promise.resolve( createMultiSearchResponse( @@ -41,6 +34,14 @@ export function createRecommendClient( ) ) ), + transporter: { + userAgent: { + value: '', + add() { + return {}; + }, + }, + } as any, ...args, }; }