Skip to content

Commit 1aa3dde

Browse files
Haroenvtkruggsarahdayan
authored
fix(umd): batch requests when using plugins via UMD (#902)
* wip * e2e test * remove e2e * new test to clarify that execute isn't referentially equal * back to status quo * fix the issue * fix unit test * move algolia marker to outside createRequester * docs * make ts happy again * Apply suggestions from code review Co-authored-by: Sarah Dayan <[email protected]> * make requester id required for batching * Update packages/autocomplete-preset-algolia/src/requester/createRequester.ts Co-authored-by: Sarah Dayan <[email protected]> * extended test Co-authored-by: Youcef Mammar <[email protected]> Co-authored-by: Sarah Dayan <[email protected]>
1 parent aa7caa9 commit 1aa3dde

File tree

11 files changed

+166
-11
lines changed

11 files changed

+166
-11
lines changed

bundlesize.config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
{
88
"path": "packages/autocomplete-js/dist/umd/index.production.js",
9-
"maxSize": "16.5 kB"
9+
"maxSize": "16.75 kB"
1010
},
1111
{
1212
"path": "packages/autocomplete-preset-algolia/dist/umd/index.production.js",

packages/autocomplete-core/src/resolve.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ function isRequesterDescription<TItem extends BaseItem>(
3333
type PackedDescription<TItem extends BaseItem> = {
3434
searchClient: SearchClient;
3535
execute: Execute<TItem>;
36+
requesterId?: string;
3637
items: RequestDescriptionPreResolved<TItem>['requests'];
3738
};
3839

3940
type RequestDescriptionPreResolved<TItem extends BaseItem> = Pick<
4041
RequesterDescription<TItem>,
41-
'execute' | 'searchClient' | 'transformResponse'
42+
'execute' | 'requesterId' | 'searchClient' | 'transformResponse'
4243
> & {
4344
requests: Array<{
4445
query: MultipleQueriesQuery;
@@ -90,15 +91,16 @@ export function resolve<TItem extends BaseItem>(
9091
return acc;
9192
}
9293

93-
const { searchClient, execute, requests } = current;
94+
const { searchClient, execute, requesterId, requests } = current;
9495

9596
const container = acc.find<PackedDescription<TItem>>(
9697
(item): item is PackedDescription<TItem> => {
9798
return (
9899
isDescription(current) &&
99100
isDescription(item) &&
100101
item.searchClient === searchClient &&
101-
item.execute === execute
102+
Boolean(requesterId) &&
103+
item.requesterId === requesterId
102104
);
103105
}
104106
);
@@ -108,6 +110,7 @@ export function resolve<TItem extends BaseItem>(
108110
} else {
109111
const request: PackedDescription<TItem> = {
110112
execute,
113+
requesterId,
111114
items: requests,
112115
searchClient,
113116
};

packages/autocomplete-js/src/__tests__/requester.test.ts

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import {
2+
createRequester,
3+
fetchAlgoliaResults,
4+
} from '@algolia/autocomplete-preset-algolia';
15
import { fireEvent, waitFor, within } from '@testing-library/dom';
26

37
import {
@@ -346,6 +350,123 @@ describe('requester', () => {
346350
});
347351
});
348352

353+
test('batches calls across requesters with same id', async () => {
354+
const container = document.createElement('div');
355+
const panelContainer = document.createElement('div');
356+
357+
document.body.appendChild(panelContainer);
358+
359+
const searchClient = createSearchClient({
360+
search: jest.fn((requests) =>
361+
Promise.resolve(
362+
createMultiSearchResponse<{ label: string }>(
363+
...requests.map(({ indexName, params: { query } }) => ({
364+
hits: [{ objectID: '1', label: 'Hit 1' }],
365+
index: indexName,
366+
query,
367+
}))
368+
)
369+
)
370+
),
371+
});
372+
373+
const getResults1 = (params) =>
374+
createRequester(
375+
fetchAlgoliaResults,
376+
'custom-requester-id'
377+
)({
378+
transformResponse: (response) => response.hits,
379+
})(params);
380+
381+
const getResults2 = (params) =>
382+
createRequester(
383+
fetchAlgoliaResults,
384+
'custom-requester-id'
385+
)({
386+
transformResponse: (response) => response.hits,
387+
})(params);
388+
389+
const getResults3 = (params) =>
390+
createRequester(
391+
fetchAlgoliaResults,
392+
'different-requester-id'
393+
)({
394+
transformResponse: (response) => response.hits,
395+
})(params);
396+
397+
const templates = {
398+
item({ item }) {
399+
return JSON.stringify(item);
400+
},
401+
};
402+
403+
autocomplete({
404+
container,
405+
panelContainer,
406+
getSources({ query }) {
407+
return [
408+
{
409+
sourceId: 'hits',
410+
getItems() {
411+
return getResults1({
412+
searchClient,
413+
queries: [
414+
{
415+
indexName: 'indexName',
416+
query,
417+
},
418+
],
419+
});
420+
},
421+
templates,
422+
},
423+
{
424+
sourceId: 'hits-merged',
425+
getItems() {
426+
return getResults2({
427+
searchClient,
428+
queries: [
429+
{
430+
indexName: 'indexName',
431+
query,
432+
},
433+
],
434+
});
435+
},
436+
templates,
437+
},
438+
{
439+
sourceId: 'hits-separate',
440+
getItems() {
441+
return getResults3({
442+
searchClient,
443+
queries: [
444+
{
445+
indexName: 'indexName',
446+
query,
447+
},
448+
],
449+
});
450+
},
451+
templates,
452+
},
453+
];
454+
},
455+
});
456+
457+
const input = container.querySelector<HTMLInputElement>('.aa-Input');
458+
459+
fireEvent.input(input, { target: { value: 'a' } });
460+
461+
await waitFor(() => {
462+
expect(
463+
panelContainer.querySelector<HTMLElement>('.aa-Panel')
464+
).toBeInTheDocument();
465+
466+
expect(searchClient.search).toHaveBeenCalledTimes(2);
467+
});
468+
});
469+
349470
test('transforms the response before forwarding it to the state', async () => {
350471
const container = document.createElement('div');
351472
const panelContainer = document.createElement('div');

packages/autocomplete-js/src/requesters/__tests__/getAlgoliaFacets.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('getAlgoliaFacets', () => {
2222

2323
expect(description).toEqual({
2424
execute: expect.any(Function),
25+
requesterId: 'algolia',
2526
transformResponse: expect.any(Function),
2627
searchClient,
2728
queries: [

packages/autocomplete-js/src/requesters/__tests__/getAlgoliaResults.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('getAlgoliaResults', () => {
2222

2323
expect(description).toEqual({
2424
execute: expect.any(Function),
25+
requesterId: 'algolia',
2526
transformResponse: expect.any(Function),
2627
searchClient,
2728
queries: [

packages/autocomplete-js/src/requesters/createAlgoliaRequester.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import {
55

66
import { userAgents } from '../userAgents';
77

8-
export const createAlgoliaRequester = createRequester((params) =>
9-
fetchAlgoliaResults({
10-
...params,
11-
userAgents,
12-
})
8+
export const createAlgoliaRequester = createRequester(
9+
(params) =>
10+
fetchAlgoliaResults({
11+
...params,
12+
userAgents,
13+
}),
14+
'algolia'
1315
);

packages/autocomplete-preset-algolia/src/requester/__tests__/createRequester.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ describe('createRequester', () => {
4040

4141
expect(description).toEqual({
4242
execute: expect.any(Function),
43+
requesterId: undefined,
4344
transformResponse,
4445
searchClient,
4546
queries: [

packages/autocomplete-preset-algolia/src/requester/__tests__/getAlgoliaFacets.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('getAlgoliaFacets', () => {
2222

2323
expect(description).toEqual({
2424
execute: expect.any(Function),
25+
requesterId: 'algolia',
2526
transformResponse: expect.any(Function),
2627
searchClient,
2728
queries: [

packages/autocomplete-preset-algolia/src/requester/__tests__/getAlgoliaResults.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('getAlgoliaResults', () => {
2222

2323
expect(description).toEqual({
2424
execute: expect.any(Function),
25+
requesterId: 'algolia',
2526
transformResponse: expect.any(Function),
2627
searchClient,
2728
queries: [

packages/autocomplete-preset-algolia/src/requester/createAlgoliaRequester.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,7 @@ import { fetchAlgoliaResults } from '../search';
22

33
import { createRequester } from './createRequester';
44

5-
export const createAlgoliaRequester = createRequester(fetchAlgoliaResults);
5+
export const createAlgoliaRequester = createRequester(
6+
fetchAlgoliaResults,
7+
'algolia'
8+
);

0 commit comments

Comments
 (0)