Skip to content

Commit 7d19396

Browse files
feat(plugins): introduce Query Suggestions plugin (#360)
1 parent 86adc65 commit 7d19396

File tree

24 files changed

+283
-116
lines changed

24 files changed

+283
-116
lines changed

.circleci/config.yml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@ aliases:
2626
mkdir -p packages/autocomplete-shared/dist
2727
mkdir -p packages/autocomplete-core/dist
2828
mkdir -p packages/autocomplete-js/dist
29-
mkdir -p packages/autocomplete-plugin-recent-searches/dist
3029
mkdir -p packages/autocomplete-preset-algolia/dist
30+
mkdir -p packages/autocomplete-plugin-recent-searches/dist
31+
mkdir -p packages/autocomplete-plugin-query-suggestions/dist
3132
3233
cp -R /tmp/workspace/packages/autocomplete-shared/dist packages/autocomplete-shared
3334
cp -R /tmp/workspace/packages/autocomplete-core/dist packages/autocomplete-core
3435
cp -R /tmp/workspace/packages/autocomplete-js/dist packages/autocomplete-js
35-
cp -R /tmp/workspace/packages/autocomplete-plugin-recent-searches/dist packages/autocomplete-plugin-recent-searches
3636
cp -R /tmp/workspace/packages/autocomplete-preset-algolia/dist packages/autocomplete-preset-algolia
37+
cp -R /tmp/workspace/packages/autocomplete-plugin-recent-searches/dist packages/autocomplete-plugin-recent-searches
38+
cp -R /tmp/workspace/packages/autocomplete-plugin-query-suggestions/dist packages/autocomplete-plugin-query-suggestions
3739
3840
defaults: &defaults
3941
working_directory: ~/autocomplete
@@ -66,14 +68,16 @@ jobs:
6668
mkdir -p /tmp/workspace/packages/autocomplete-shared/dist
6769
mkdir -p /tmp/workspace/packages/autocomplete-core/dist
6870
mkdir -p /tmp/workspace/packages/autocomplete-js/dist
69-
mkdir -p /tmp/workspace/packages/autocomplete-plugin-recent-searches/dist
7071
mkdir -p /tmp/workspace/packages/autocomplete-preset-algolia/dist
72+
mkdir -p /tmp/workspace/packages/autocomplete-plugin-recent-searches/dist
73+
mkdir -p /tmp/workspace/packages/autocomplete-plugin-query-suggestions/dist
7174
7275
cp -R packages/autocomplete-shared/dist /tmp/workspace/packages/autocomplete-shared
7376
cp -R packages/autocomplete-core/dist /tmp/workspace/packages/autocomplete-core
7477
cp -R packages/autocomplete-js/dist /tmp/workspace/packages/autocomplete-js
75-
cp -R packages/autocomplete-plugin-recent-searches/dist /tmp/workspace/packages/autocomplete-plugin-recent-searches
7678
cp -R packages/autocomplete-preset-algolia/dist /tmp/workspace/packages/autocomplete-preset-algolia
79+
cp -R packages/autocomplete-plugin-recent-searches/dist /tmp/workspace/packages/autocomplete-plugin-recent-searches
80+
cp -R packages/autocomplete-plugin-query-suggestions/dist /tmp/workspace/packages/autocomplete-plugin-query-suggestions
7781
- persist_to_workspace:
7882
root: *workspace_root
7983
paths:

bundlesize.config.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
},
1515
{
1616
"path": "packages/autocomplete-plugin-recent-searches/dist/umd/index.js",
17+
"maxSize": "2.5 kB"
18+
},
19+
{
20+
"path": "packages/autocomplete-plugin-query-suggestions/dist/umd/index.js",
1721
"maxSize": "2.25 kB"
1822
}
1923
]

examples/js/app.ts

Lines changed: 12 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,28 @@
1-
import { Hit } from '@algolia/client-search';
21
import algoliasearch from 'algoliasearch/lite';
3-
import {
4-
autocomplete,
5-
AutocompleteSource,
6-
getAlgoliaHits,
7-
reverseHighlightHit,
8-
} from '@algolia/autocomplete-js';
2+
import { autocomplete } from '@algolia/autocomplete-js';
93
import { createLocalStorageRecentSearchesPlugin } from '@algolia/autocomplete-plugin-recent-searches';
4+
import { createQuerySuggestionsPlugin } from '@algolia/autocomplete-plugin-query-suggestions';
105

116
const searchClient = algoliasearch(
127
'latency',
138
'6be0576ff61c053d5f9a3225e2a90f76'
149
);
1510

16-
type QuerySuggestionHit = { query: string };
17-
1811
const recentSearches = createLocalStorageRecentSearchesPlugin({
1912
key: 'recent',
2013
limit: 3,
2114
});
2215

23-
autocomplete<Hit<QuerySuggestionHit>>({
24-
container: '#autocomplete',
25-
debug: true,
26-
openOnFocus: true,
27-
// dropdownPlacement: 'start',
28-
plugins: [recentSearches],
29-
getSources({ query }) {
30-
return getAlgoliaHits<QuerySuggestionHit>({
31-
searchClient,
32-
queries: [
33-
{
34-
indexName: 'instant_search_demo_query_suggestions',
35-
query,
36-
params: {
37-
hitsPerPage: recentSearches.data.getAlgoliaQuerySuggestionsHitsPerPage(
38-
10
39-
),
40-
facetFilters: [
41-
...recentSearches.data.getAlgoliaQuerySuggestionsFacetFilters(),
42-
],
43-
},
44-
},
45-
],
46-
}).then(([hits]) => {
47-
return [
48-
{
49-
getItemInputValue({ item }) {
50-
return item.query;
51-
},
52-
getItems() {
53-
return hits;
54-
},
55-
templates: {
56-
item({ item }) {
57-
return `
58-
<div class="aa-ItemContent">
59-
<div class="aa-ItemSourceIcon">${searchIcon}</div>
60-
<div class="aa-ItemTitle">
61-
${reverseHighlightHit<Hit<QuerySuggestionHit>>({
62-
hit: item,
63-
attribute: 'query',
64-
})}
65-
</div>
66-
</div>
67-
`;
68-
},
69-
},
70-
} as AutocompleteSource<Hit<QuerySuggestionHit>>,
71-
];
72-
});
16+
const querySuggestions = createQuerySuggestionsPlugin({
17+
searchClient,
18+
indexName: 'instant_search_demo_query_suggestions',
19+
getSearchParams() {
20+
return recentSearches.data.getAlgoliaSearchParams();
7321
},
7422
});
7523

76-
const searchIcon = `
77-
<svg width="20" height="20" viewBox="0 0 20 20">
78-
<path
79-
d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z"
80-
stroke="currentColor"
81-
fill="none"
82-
fillRule="evenodd"
83-
strokeLinecap="round"
84-
strokeLinejoin="round"
85-
/>
86-
</svg>
87-
`;
24+
autocomplete({
25+
container: '#autocomplete',
26+
openOnFocus: true,
27+
plugins: [recentSearches, querySuggestions],
28+
});

examples/js/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"dependencies": {
1313
"@algolia/autocomplete-js": "1.0.0-alpha.34",
1414
"@algolia/autocomplete-plugin-recent-searches": "1.0.0-alpha.34",
15-
"@algolia/client-search": "4.5.1",
15+
"@algolia/autocomplete-plugin-query-suggestions": "1.0.0-alpha.34",
1616
"algoliasearch": "4.5.1"
1717
},
1818
"devDependencies": {

packages/autocomplete-core/src/getDefaultProps.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,10 @@ export function getDefaultProps<TItem>(
5151
});
5252
},
5353
getSources(options) {
54-
const getSourcesFromPlugins = plugins
55-
.map((plugin) => plugin.getSources)
56-
.filter((getSources) => getSources !== undefined);
57-
5854
return Promise.all(
59-
[...getSourcesFromPlugins, props.getSources].map((getSources) =>
60-
getNormalizedSources(getSources!, options)
61-
)
55+
[...plugins.map((plugin) => plugin.getSources), props.getSources]
56+
.filter(Boolean)
57+
.map((getSources) => getNormalizedSources(getSources!, options))
6258
)
6359
.then((nested) => flatten(nested))
6460
.then((sources) =>

packages/autocomplete-core/src/types/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ export interface AutocompleteOptions<TItem> {
217217
/**
218218
* The sources to get the suggestions from.
219219
*/
220-
getSources(
220+
getSources?(
221221
params: GetSourcesParams<TItem>
222222
): MaybePromise<Array<AutocompleteSource<TItem>>>;
223223
/**

packages/autocomplete-core/src/types/plugins.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ export type AutocompletePlugin<TItem, TData = unknown> = Partial<
77
* The subscribed properties are properties that are called when other sources
88
* are interacted with.
99
*/
10-
subscribed: {
10+
subscribed?: {
1111
onSelect: AutocompleteSource<TItem>['onSelect'];
1212
};
1313
/**
1414
* An extra plugin specific object to store variables and functions
1515
*/
16-
data: TData;
16+
data?: TData;
1717
};

packages/autocomplete-core/src/utils.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import { MaybePromise } from '@algolia/autocomplete-shared';
2+
13
import {
2-
InternalAutocompleteOptions,
3-
InternalAutocompleteSource,
4-
AutocompleteState,
54
AutocompleteCollection,
6-
AutocompleteOptions,
75
AutocompleteSource,
6+
AutocompleteState,
7+
GetSourcesParams,
8+
InternalAutocompleteOptions,
9+
InternalAutocompleteSource,
810
} from './types';
911

1012
export const noop = () => {};
@@ -45,8 +47,10 @@ function normalizeSource<TItem>(
4547
}
4648

4749
export function getNormalizedSources<TItem>(
48-
getSources: AutocompleteOptions<TItem>['getSources'],
49-
options
50+
getSources: (
51+
params: GetSourcesParams<TItem>
52+
) => MaybePromise<Array<AutocompleteSource<TItem>>>,
53+
options: GetSourcesParams<TItem>
5054
): Promise<Array<InternalAutocompleteSource<TItem>>> {
5155
return Promise.resolve(getSources(options)).then((sources) =>
5256
Promise.all(
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# @algolia/autocomplete-plugin-query-suggestions
2+
3+
A plugin to add Query Suggestions to Algolia Autocomplete.
4+
5+
## Installation
6+
7+
```sh
8+
yarn add @algolia/autocomplete-plugin-query-suggestions@alpha
9+
# or
10+
npm install @algolia/autocomplete-plugin-query-suggestions@alpha
11+
```
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"name": "@algolia/autocomplete-plugin-query-suggestions",
3+
"description": "A plugin to add query suggestions to Algolia Autocomplete.",
4+
"version": "1.0.0-alpha.34",
5+
"license": "MIT",
6+
"homepage": "https://github.com/algolia/autocomplete.js",
7+
"repository": "algolia/autocomplete.js",
8+
"author": {
9+
"name": "Algolia, Inc.",
10+
"url": "https://www.algolia.com"
11+
},
12+
"source": "src/index.ts",
13+
"types": "dist/esm/index.d.ts",
14+
"module": "dist/esm/index.js",
15+
"main": "dist/umd/index.js",
16+
"umd:main": "dist/umd/index.js",
17+
"unpkg": "dist/umd/index.js",
18+
"jsdelivr": "dist/umd/index.js",
19+
"sideEffects": false,
20+
"files": [
21+
"dist/"
22+
],
23+
"scripts": {
24+
"build:clean": "rm -rf ./dist",
25+
"build:esm": "babel src --root-mode upward --extensions '.ts,.tsx' --out-dir dist/esm --ignore '**/*/__tests__/'",
26+
"build:types": "tsc -p ./tsconfig.declaration.json --outDir ./dist/esm",
27+
"build:umd": "rollup --config",
28+
"build": "rm -rf ./dist && yarn build:umd && yarn build:esm && yarn build:types",
29+
"on:change": "concurrently \"yarn build:esm\" \"yarn build:types\"",
30+
"prepare": "yarn run build:esm",
31+
"watch": "watch \"yarn on:change\" --ignoreDirectoryPattern \"/dist/\""
32+
},
33+
"dependencies": {
34+
"@algolia/autocomplete-core": "1.0.0-alpha.34",
35+
"@algolia/autocomplete-js": "1.0.0-alpha.34"
36+
},
37+
"devDependencies": {
38+
"@algolia/client-search": "4.5.1",
39+
"algoliasearch": "4.5.1"
40+
},
41+
"peerDependencies": {
42+
"@algolia/client-search": "^4.5.1",
43+
"algoliasearch": "^4.5.1"
44+
}
45+
}

0 commit comments

Comments
 (0)