From 6ad17d7d1454369a66a257f6309ba7e4352c6efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Wed, 2 May 2018 11:39:47 +0200 Subject: [PATCH 01/16] feat: Update Client, Helper and InstantSearch --- package.json | 6 +++--- yarn.lock | 56 +++++++++++++++++++--------------------------------- 2 files changed, 23 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index ec2cbfff9..9fbeebfe3 100644 --- a/package.json +++ b/package.json @@ -51,10 +51,10 @@ "dependencies": { "@angular/common": "^4.4.5", "@angular/core": "^4.4.5", - "algoliasearch": "^3.24.7", - "algoliasearch-helper": "^2.23.0", + "algoliasearch": "^3.27.0", + "algoliasearch-helper": "^2.26.0", "instantsearch.css": "^7.0.0", - "instantsearch.js": "^2.7.0", + "instantsearch.js": "^2.8.0-beta.0", "lodash-es": "^4.17.4", "nouislider": "^10.0.0", "querystring-es3": "^0.2.1" diff --git a/yarn.lock b/yarn.lock index 600bc75c0..4a7e0a03c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -272,38 +272,18 @@ ajv@^6.1.0: json-schema-traverse "^0.3.0" uri-js "^3.0.2" -algoliasearch-helper@2.24.0, algoliasearch-helper@^2.23.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-2.24.0.tgz#6ebf91683a82799bc4019ee1ad92d0ad0f41167b" +algoliasearch-helper@2.26.0, algoliasearch-helper@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-2.26.0.tgz#cb784b692a5aacf17062493cb0b94f6d60d30d0f" dependencies: - events "^1.1.0" - lodash "^4.13.1" - qs "^6.2.1" + events "^1.1.1" + lodash "^4.17.5" + qs "^6.5.1" util "^0.10.3" -algoliasearch@3.25.1: - version "3.25.1" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.25.1.tgz#e543108b528e5c89338834473cb8fb082d13d11f" - dependencies: - agentkeepalive "^2.2.0" - debug "^2.6.8" - envify "^4.0.0" - es6-promise "^4.1.0" - events "^1.1.0" - foreach "^2.0.5" - global "^4.3.2" - inherits "^2.0.1" - isarray "^2.0.1" - load-script "^1.0.0" - object-keys "^1.0.11" - querystring-es3 "^0.2.1" - reduce "^1.0.1" - semver "^5.1.0" - tunnel-agent "^0.6.0" - -algoliasearch@^3.24.7: - version "3.26.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.26.0.tgz#5059cfe4b049ae1a1b9b7c25f5dbd3e75db6126a" +algoliasearch@3.27.0, algoliasearch@^3.27.0: + version "3.27.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.27.0.tgz#675b7f2d186e5785a1553369b15d47b53d4efb31" dependencies: agentkeepalive "^2.2.0" debug "^2.6.8" @@ -3000,7 +2980,7 @@ events@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/events/-/events-1.1.0.tgz#4b389fc200f910742ebff3abb2efe33690f45429" -events@^1.0.0, events@^1.1.0: +events@^1.0.0, events@^1.1.0, events@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -3971,12 +3951,12 @@ instantsearch.css@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/instantsearch.css/-/instantsearch.css-7.0.0.tgz#74fb9aa25ce64c80effc663fe92bc9ec785cc5e3" -instantsearch.js@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-2.7.0.tgz#7b94980f96e48dab67316ace8d4bdd29aee2ec7c" +instantsearch.js@^2.8.0-beta.0: + version "2.8.0-beta.0" + resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-2.8.0-beta.0.tgz#687643540217b992262033c483f05816bce45f79" dependencies: - algoliasearch "3.25.1" - algoliasearch-helper "2.24.0" + algoliasearch "3.27.0" + algoliasearch-helper "2.26.0" classnames "2.2.5" events "1.1.0" hogan.js "3.0.2" @@ -4948,6 +4928,10 @@ lodash@4.17.5, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, l version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +lodash@^4.17.5: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" @@ -6187,7 +6171,7 @@ q@^1.1.2, q@^1.4.1, q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" -qs@6.5.1, qs@^6.2.1, qs@^6.4.0, qs@~6.5.1: +qs@6.5.1, qs@^6.4.0, qs@^6.5.1, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" From 160e13aa9f289bc0ed56972831ab8b92c120c3f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Wed, 2 May 2018 11:40:37 +0200 Subject: [PATCH 02/16] feat: Add support for `searchClient` --- src/instantsearch/instantsearch.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/instantsearch/instantsearch.ts b/src/instantsearch/instantsearch.ts index 96eb9c5de..4c6e83fe3 100644 --- a/src/instantsearch/instantsearch.ts +++ b/src/instantsearch/instantsearch.ts @@ -11,14 +11,15 @@ import { } from "@angular/core"; import { isPlatformBrowser } from "@angular/common"; +import * as algoliasearch from "algoliasearch"; import instantsearch from "instantsearch.js/es"; import { Widget } from "../base-widget"; import { VERSION } from "../version"; export type InstantSearchConfig = { - appId: string; - apiKey: string; + appId?: string; + apiKey?: string; indexName: string; numberLocale?: string; @@ -28,6 +29,7 @@ export type InstantSearchConfig = { appId: string, apiKey: string ) => object; + searchClient?: object; searchParameters?: object | void; urlSync?: | boolean @@ -106,12 +108,13 @@ export class NgAisInstantSearch implements AfterViewInit, OnInit, OnDestroy { } // custom algolia client agent - if (!config.createAlgoliaClient) { - config.createAlgoliaClient = (algoliasearch, appId, apiKey) => { - const client = algoliasearch(appId, apiKey); - client.addAlgoliaAgent(`angular-instantsearch ${VERSION}`); - return client; - }; + if (!config.searchClient && !config.createAlgoliaClient) { + const client = algoliasearch(config.appId, config.apiKey); + client.addAlgoliaAgent(`angular-instantsearch ${VERSION}`); + + config.searchClient = client; + config.appId = undefined; + config.apiKey = undefined; } this.instantSearchInstance = instantsearch(config); From 0e09be7f97b59e8c596c0eafb9ee911846055f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 14:12:37 +0200 Subject: [PATCH 03/16] feat(dev-novel): Add `searchClient` support --- examples/dev-novel/wrap-with-hits.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/dev-novel/wrap-with-hits.ts b/examples/dev-novel/wrap-with-hits.ts index cd6b0bb46..ed7fc6e2f 100644 --- a/examples/dev-novel/wrap-with-hits.ts +++ b/examples/dev-novel/wrap-with-hits.ts @@ -15,6 +15,7 @@ export function wrapWithHits({ searchParameters = {}, methods = {}, searchFunction, + searchClient, appDeclarations = [] }: { template: string; @@ -22,6 +23,7 @@ export function wrapWithHits({ searchParameters?: {}; methods?: {}; searchFunction?: (helper: Helper) => void; + searchClient?: {}; appDeclarations?: any[]; }) { return (container: Element) => { @@ -117,9 +119,12 @@ export function wrapWithHits({ }) class AppComponent { config = { + ...(!searchClient && { + appId: "latency", + apiKey: "6be0576ff61c053d5f9a3225e2a90f76" + }), searchFunction, - apiKey: "6be0576ff61c053d5f9a3225e2a90f76", - appId: "latency", + searchClient, indexName: "instant_search", searchParameters: { hitsPerPage: 3, From 2219d85b500ac884acc41901baca376be640870e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 14:12:57 +0200 Subject: [PATCH 04/16] feat(dev-novel): Add search client stories --- examples/dev-novel/main.ts | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/examples/dev-novel/main.ts b/examples/dev-novel/main.ts index 80a006c6c..d1041a9f7 100644 --- a/examples/dev-novel/main.ts +++ b/examples/dev-novel/main.ts @@ -1,5 +1,6 @@ import { enableProdMode } from "@angular/core"; import { start, storiesOf } from "dev-novel"; +import * as algoliasearch from "algoliasearch"; import { wrapWithHits } from "./wrap-with-hits"; import { MenuSelect } from "./custom-widgets"; @@ -33,6 +34,57 @@ storiesOf("InstantSearch").add( }) ); +storiesOf("InstantSearch").add( + "with algoliasearch search client", + wrapWithHits({ + template: "", + searchClient: algoliasearch("latency", "6be0576ff61c053d5f9a3225e2a90f76"), + }) +); + +storiesOf("InstantSearch").add( + "with custom search client", + wrapWithHits({ + template: "", + searchClient: { + search(requests) { + return Promise.resolve({ + results: [ + { + hits: [ + { + objectID: "1", + image: "https://cdn-demo.algolia.com/bestbuy-0118/5477500_sb.jpg", + price: "99.99", + rating: 4, + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nunc lacus, vestibulum non rutrum a, dapibus interdum magna. Quisque semper orci erat, id placerat nunc convallis at. Praesent commodo, elit non fermentum blandit, augue dolor cursus metus, eu auctor leo erat sit amet ante. Interdum et malesuada fames ac ante ipsum primis in faucibus.", + _highlightResult: { + name: { + value: "Fake Result 1", + }, + }, + }, + { + objectID: "2", + image: "https://cdn-demo.algolia.com/bestbuy-0118/4397400_sb.jpg", + price: "39.99", + rating: 3, + description: "Morbi pretium urna et massa maximus maximus. Nunc risus lectus, mattis non malesuada quis, pretium eget ligula. Sed vulputate mauris congue, tempor velit et, pretium felis. Ut ullamcorper et ligula et congue. Nunc consequat massa massa. Etiam eu purus lorem. Ut bibendum nisi nec sapien imperdiet, vel laoreet velit porttitor.", + _highlightResult: { + name: { + value: "Fake Result 2", + }, + }, + }, + ], + }, + ], + }); + }, + }, + }) +); + storiesOf("Breadcrumb").add( "default", wrapWithHits({ From e7167388c19cb60de973c609e77640285176c755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 14:33:22 +0200 Subject: [PATCH 05/16] chore: Upgrade instantsearch beta --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 9fbeebfe3..73cb5b076 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "algoliasearch": "^3.27.0", "algoliasearch-helper": "^2.26.0", "instantsearch.css": "^7.0.0", - "instantsearch.js": "^2.8.0-beta.0", + "instantsearch.js": "^2.8.0-beta.1", "lodash-es": "^4.17.4", "nouislider": "^10.0.0", "querystring-es3": "^0.2.1" diff --git a/yarn.lock b/yarn.lock index 4a7e0a03c..ee5aec869 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3951,9 +3951,9 @@ instantsearch.css@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/instantsearch.css/-/instantsearch.css-7.0.0.tgz#74fb9aa25ce64c80effc663fe92bc9ec785cc5e3" -instantsearch.js@^2.8.0-beta.0: - version "2.8.0-beta.0" - resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-2.8.0-beta.0.tgz#687643540217b992262033c483f05816bce45f79" +instantsearch.js@^2.8.0-beta.1: + version "2.8.0-beta.1" + resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-2.8.0-beta.1.tgz#f51cd7a506500cfaef119c7b8dcb1b69b2148c5d" dependencies: algoliasearch "3.27.0" algoliasearch-helper "2.26.0" From 582135123ad463da6482d71494875a7e513a3855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 14:36:21 +0200 Subject: [PATCH 06/16] docs: Mention `searchClient` in the docs --- .../src/widgets/instantsearch.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/community-website/src/community-project-boilerplate-docgen/src/widgets/instantsearch.md b/community-website/src/community-project-boilerplate-docgen/src/widgets/instantsearch.md index 5afddace8..26fdd22d4 100644 --- a/community-website/src/community-project-boilerplate-docgen/src/widgets/instantsearch.md +++ b/community-website/src/community-project-boilerplate-docgen/src/widgets/instantsearch.md @@ -60,10 +60,14 @@ export class AppComponent {} > A hook that will be called each time a search needs to be done, with the helper as a parameter. It’s your responsibility to call `helper.search()`. This option allows you to avoid doing searches at page load for example. `createAlgoliaClient?: (algoliasearch: Function, appId: string, apiKey: string) => CustomClient` +> _Deprecated in favor of `searchClient`._ > Allows you to provide your own algolia client instead of the one instantiated internally. > Useful in situations where you need to setup complex mechanism on the client or if you need to share it easily. > We forward `algoliasearch` which is the original algoliasearch module imported inside angular-instantsearch. +`searchClient?: {}` +> The search client to plug to InstantSearch.js. + `searchParameters?: {}` > Additional parameters to pass to the Algolia API. From e677531785a77b321c2ccd3be549d7b464255280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 14:40:10 +0200 Subject: [PATCH 07/16] style: Remove trailing comas --- examples/dev-novel/main.ts | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/examples/dev-novel/main.ts b/examples/dev-novel/main.ts index d1041a9f7..a385fe06e 100644 --- a/examples/dev-novel/main.ts +++ b/examples/dev-novel/main.ts @@ -38,7 +38,7 @@ storiesOf("InstantSearch").add( "with algoliasearch search client", wrapWithHits({ template: "", - searchClient: algoliasearch("latency", "6be0576ff61c053d5f9a3225e2a90f76"), + searchClient: algoliasearch("latency", "6be0576ff61c053d5f9a3225e2a90f76") }) ); @@ -54,34 +54,38 @@ storiesOf("InstantSearch").add( hits: [ { objectID: "1", - image: "https://cdn-demo.algolia.com/bestbuy-0118/5477500_sb.jpg", + image: + "https://cdn-demo.algolia.com/bestbuy-0118/5477500_sb.jpg", price: "99.99", rating: 4, - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nunc lacus, vestibulum non rutrum a, dapibus interdum magna. Quisque semper orci erat, id placerat nunc convallis at. Praesent commodo, elit non fermentum blandit, augue dolor cursus metus, eu auctor leo erat sit amet ante. Interdum et malesuada fames ac ante ipsum primis in faucibus.", + description: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin nunc lacus, vestibulum non rutrum a, dapibus interdum magna. Quisque semper orci erat, id placerat nunc convallis at. Praesent commodo, elit non fermentum blandit, augue dolor cursus metus, eu auctor leo erat sit amet ante. Interdum et malesuada fames ac ante ipsum primis in faucibus.", _highlightResult: { name: { - value: "Fake Result 1", - }, - }, + value: "Fake Result 1" + } + } }, { objectID: "2", - image: "https://cdn-demo.algolia.com/bestbuy-0118/4397400_sb.jpg", + image: + "https://cdn-demo.algolia.com/bestbuy-0118/4397400_sb.jpg", price: "39.99", rating: 3, - description: "Morbi pretium urna et massa maximus maximus. Nunc risus lectus, mattis non malesuada quis, pretium eget ligula. Sed vulputate mauris congue, tempor velit et, pretium felis. Ut ullamcorper et ligula et congue. Nunc consequat massa massa. Etiam eu purus lorem. Ut bibendum nisi nec sapien imperdiet, vel laoreet velit porttitor.", + description: + "Morbi pretium urna et massa maximus maximus. Nunc risus lectus, mattis non malesuada quis, pretium eget ligula. Sed vulputate mauris congue, tempor velit et, pretium felis. Ut ullamcorper et ligula et congue. Nunc consequat massa massa. Etiam eu purus lorem. Ut bibendum nisi nec sapien imperdiet, vel laoreet velit porttitor.", _highlightResult: { name: { - value: "Fake Result 2", - }, - }, - }, - ], - }, - ], + value: "Fake Result 2" + } + } + } + ] + } + ] }); - }, - }, + } + } }) ); From e250f8427b17e471d47a7618bf7e5a6f1586fb0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 15:08:51 +0200 Subject: [PATCH 08/16] feat: Change `algoliasearch` import for Rollup --- src/instantsearch/instantsearch.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/instantsearch/instantsearch.ts b/src/instantsearch/instantsearch.ts index 4c6e83fe3..14ec2e6cd 100644 --- a/src/instantsearch/instantsearch.ts +++ b/src/instantsearch/instantsearch.ts @@ -11,12 +11,14 @@ import { } from "@angular/core"; import { isPlatformBrowser } from "@angular/common"; -import * as algoliasearch from "algoliasearch"; +import * as algoliasearchProxy from 'algoliasearch' import instantsearch from "instantsearch.js/es"; import { Widget } from "../base-widget"; import { VERSION } from "../version"; +const algoliasearch = algoliasearchProxy.default || algoliasearchProxy + export type InstantSearchConfig = { appId?: string; apiKey?: string; From 90ffec0adc9d17263854455b2f28d23a54e177eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 15:14:54 +0200 Subject: [PATCH 09/16] style: Fix lint --- src/instantsearch/instantsearch.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/instantsearch/instantsearch.ts b/src/instantsearch/instantsearch.ts index 14ec2e6cd..d58937ff6 100644 --- a/src/instantsearch/instantsearch.ts +++ b/src/instantsearch/instantsearch.ts @@ -11,13 +11,13 @@ import { } from "@angular/core"; import { isPlatformBrowser } from "@angular/common"; -import * as algoliasearchProxy from 'algoliasearch' +import * as algoliasearchProxy from "algoliasearch"; import instantsearch from "instantsearch.js/es"; import { Widget } from "../base-widget"; import { VERSION } from "../version"; -const algoliasearch = algoliasearchProxy.default || algoliasearchProxy +const algoliasearch = algoliasearchProxy.default || algoliasearchProxy; export type InstantSearchConfig = { appId?: string; From b151eeb36cf8e032a2dba28c8d4b32a1f45b59a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 15:15:13 +0200 Subject: [PATCH 10/16] feat: Add SearchClient type --- src/instantsearch/instantsearch.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/instantsearch/instantsearch.ts b/src/instantsearch/instantsearch.ts index d58937ff6..359c44eec 100644 --- a/src/instantsearch/instantsearch.ts +++ b/src/instantsearch/instantsearch.ts @@ -19,6 +19,11 @@ import { VERSION } from "../version"; const algoliasearch = algoliasearchProxy.default || algoliasearchProxy; +export type SearchClient = { + search: () => Promise; + searchForFacetValues?: () => Promise; +}; + export type InstantSearchConfig = { appId?: string; apiKey?: string; @@ -31,7 +36,7 @@ export type InstantSearchConfig = { appId: string, apiKey: string ) => object; - searchClient?: object; + searchClient?: SearchClient; searchParameters?: object | void; urlSync?: | boolean From f43fd4c5f3294e97ee46ffac7af49c8a702f74ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 15:16:16 +0200 Subject: [PATCH 11/16] feat: Add function signature for SearchClient type --- src/instantsearch/instantsearch.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/instantsearch/instantsearch.ts b/src/instantsearch/instantsearch.ts index 359c44eec..bfa3c9805 100644 --- a/src/instantsearch/instantsearch.ts +++ b/src/instantsearch/instantsearch.ts @@ -20,8 +20,8 @@ import { VERSION } from "../version"; const algoliasearch = algoliasearchProxy.default || algoliasearchProxy; export type SearchClient = { - search: () => Promise; - searchForFacetValues?: () => Promise; + search: (requests: object) => Promise; + searchForFacetValues?: (requests: object) => Promise; }; export type InstantSearchConfig = { From 9b15a829dfd0c8ce26f4252523a740662765037c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 16:25:30 +0200 Subject: [PATCH 12/16] feat: Type SearchClient and SearchParameters --- src/instantsearch/instantsearch.ts | 130 ++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 2 deletions(-) diff --git a/src/instantsearch/instantsearch.ts b/src/instantsearch/instantsearch.ts index bfa3c9805..eb5df6319 100644 --- a/src/instantsearch/instantsearch.ts +++ b/src/instantsearch/instantsearch.ts @@ -19,9 +19,135 @@ import { VERSION } from "../version"; const algoliasearch = algoliasearchProxy.default || algoliasearchProxy; +export type SearchRequest = { + indexName: string; + params: SearchParameters; +}; + +export type SearchForFacetValuesRequest = { + indexName: string; + params: SearchForFacetValuesParameters; +}; + +// Documentation: https://www.algolia.com/doc/api-reference/search-api-parameters/ +export type Parameters = { + // Attributes + attributesToRetrieve?: string[]; + restrictSearchableAttributes?: string[]; + + // Filtering + filters?: string; + facetFilters?: string[]; + optionalFilters?: string[]; + numericFilters?: string[]; + sumOrFiltersScores?: boolean; + + // Faceting + facets?: string[]; + maxValuesPerFacet?: number; + facetingAfterDistinct?: boolean; + sortFacetValuesBy?: string; + + // Highlighting / Snippeting + attributesToHighlight?: string[]; + attributesToSnippet?: string[]; + highlightPreTag?: string; + highlightPostTag?: string; + snippetEllipsisText?: string; + restrictHighlightAndSnippetArrays?: boolean; + + // Pagination + page?: number; + hitsPerPage?: number; + offset?: number; + length?: number; + + // Typos + minWordSizefor1Typo?: number; + minWordSizefor2Typos?: number; + typoTolerance?: string | boolean; + allowTyposOnNumericTokens?: boolean; + ignorePlurals?: boolean | string[]; + disableTypoToleranceOnAttributes?: string[]; + + // Geo-Search + aroundLatLng?: string; + aroundLatLngViaIP?: boolean; + aroundRadius?: number | "all"; + aroundPrecision?: number; + minimumAroundRadius?: number; + insideBoundingBox?: GeoRectangle | GeoRectangle[]; + insidePolygon?: GeoPolygon | GeoPolygon[]; + + // Query Strategy + queryType?: string; + removeWordsIfNoResults?: string; + advancedSyntax?: boolean; + optionalWords?: string | string[]; + removeStopWords?: boolean | string[]; + disableExactOnAttributes?: string[]; + exactOnSingleWordQuery?: string; + alternativesAsExact?: string[]; + + // Query Rules + enableRules?: boolean; + ruleContexts?: string[]; + + // Advanced + minProximity?: number; + responseFields?: string[]; + maxFacetHits?: number; + percentileComputation?: boolean; + distinct?: number | boolean; + getRankingInfo?: boolean; + clickAnalytics?: boolean; + analytics?: boolean; + analyticsTags?: string[]; + synonyms?: boolean; + replaceSynonymsInHighlight?: boolean; +}; + +export interface SearchParameters extends Parameters { + query: string; +}; + +export interface SearchForFacetValuesParameters extends Parameters { + facetQuery: string; + facetName: string; +}; + +export type GeoRectangle = [number, number, number, number]; +export type GeoPolygon = [number, number, number, number, number, number]; + +// Documentation: https://www.algolia.com/doc/rest-api/search/?language=javascript#search-multiple-indexes +export type SearchResponse = { + hits: Hit[]; + page?: number; + nbHits?: number; + nbPages?: number; + hitsPerPage?: number; + processingTimeMS?: number; + query?: string; + params?: string; + index?: string; +}; + +export type Hit = { + _highlightResult?: object; +} + +// Documentation: https://www.algolia.com/doc/rest-api/search/?language=javascript#search-for-facet-values +export type SearchForFacetValuesResponse = { + value: string; + highlighted?: string; + count?: number; +}; + export type SearchClient = { - search: (requests: object) => Promise; - searchForFacetValues?: (requests: object) => Promise; + search: (requests: SearchRequest[]) => Promise<{ results: SearchResponse[] }>; + searchForFacetValues?: ( + requests: SearchForFacetValuesRequest[] + ) => Promise<{ facetHits: SearchForFacetValuesResponse[] }>; }; export type InstantSearchConfig = { From 42b548072bec4bc153bfbcf9739f79a92c7a0b07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 16:34:44 +0200 Subject: [PATCH 13/16] feat: Use SearchParameters type for `searchParameters` option --- src/instantsearch/instantsearch.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/instantsearch/instantsearch.ts b/src/instantsearch/instantsearch.ts index eb5df6319..a1a0d6baf 100644 --- a/src/instantsearch/instantsearch.ts +++ b/src/instantsearch/instantsearch.ts @@ -21,16 +21,16 @@ const algoliasearch = algoliasearchProxy.default || algoliasearchProxy; export type SearchRequest = { indexName: string; - params: SearchParameters; + params: SearchRequestParameters; }; export type SearchForFacetValuesRequest = { indexName: string; - params: SearchForFacetValuesParameters; + params: SearchForFacetValuesRequestParameters; }; // Documentation: https://www.algolia.com/doc/api-reference/search-api-parameters/ -export type Parameters = { +export type SearchParameters = { // Attributes attributesToRetrieve?: string[]; restrictSearchableAttributes?: string[]; @@ -107,11 +107,11 @@ export type Parameters = { replaceSynonymsInHighlight?: boolean; }; -export interface SearchParameters extends Parameters { +export interface SearchRequestParameters extends SearchParameters { query: string; }; -export interface SearchForFacetValuesParameters extends Parameters { +export interface SearchForFacetValuesRequestParameters extends SearchParameters { facetQuery: string; facetName: string; }; @@ -163,7 +163,7 @@ export type InstantSearchConfig = { apiKey: string ) => object; searchClient?: SearchClient; - searchParameters?: object | void; + searchParameters?: SearchParameters | void; urlSync?: | boolean | { From 1c34e6bf33aaeee5cd494910bcc9672b4ec2872d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 16:57:42 +0200 Subject: [PATCH 14/16] feat: Add `createSSRSearchClient` as a `createSSRAlgoliaClient` alternative --- src/create-ssr-algolia-client.ts | 119 ++++++++++++++++++------------- 1 file changed, 70 insertions(+), 49 deletions(-) diff --git a/src/create-ssr-algolia-client.ts b/src/create-ssr-algolia-client.ts index 1c4943c67..5d4864bf8 100644 --- a/src/create-ssr-algolia-client.ts +++ b/src/create-ssr-algolia-client.ts @@ -13,64 +13,85 @@ export function createSSRAlgoliaClient({ httpClient, HttpHeaders, transferState, - makeStateKey + makeStateKey, }) { - return (_, appId, apiKey) => { - const client = algoliasearch(appId, apiKey, {}); - client.addAlgoliaAgent(`angular-instantsearch ${VERSION}`); + console.warn( + '`createSSRAlgoliaClient` is deprecated in favor of `createSSRSearchClient` to be plugged to `searchClient`.' + ); - client._request = (rawUrl, opts) => { - let headers = new HttpHeaders(); + return (_, appId, apiKey) => + createSSRSearchClient({ + appId, + apiKey, + httpClient, + HttpHeaders, + transferState, + makeStateKey, + }); +} - headers = headers.set( - "content-type", - opts.method === "POST" - ? "application/x-www-form-urlencoded" - : "application/json" - ); +export function createSSRSearchClient({ + appId, + apiKey, + httpClient, + HttpHeaders, + transferState, + makeStateKey +}) { + const client = algoliasearch(appId, apiKey, {}); + client.addAlgoliaAgent(`angular-instantsearch ${VERSION}`); - headers = headers.set("accept", "application/json"); + client._request = (rawUrl, opts) => { + let headers = new HttpHeaders(); - const url = - rawUrl + (rawUrl.includes("?") ? "&" : "?") + encode(opts.headers); + headers = headers.set( + "content-type", + opts.method === "POST" + ? "application/x-www-form-urlencoded" + : "application/json" + ); - const transferStateKey = makeStateKey(`ngais(${opts.body})`); + headers = headers.set("accept", "application/json"); - if (transferState.hasKey(transferStateKey)) { - const resp = JSON.parse(transferState.get(transferStateKey, {})); - return Promise.resolve({ - statusCode: resp.status, - body: resp.body, - headers: resp.headers - }); - } + const url = + rawUrl + (rawUrl.includes("?") ? "&" : "?") + encode(opts.headers); - return new Promise((resolve, reject) => { - httpClient - .request(opts.method, url, { - headers, - body: opts.body, - observe: "response" - }) - .subscribe( - resp => { - transferState.set(transferStateKey, JSON.stringify(resp)); - resolve({ - statusCode: resp.status, - body: resp.body, - headers: resp.headers - }); - }, - resp => - reject({ - statusCode: resp.status, - body: resp.body, - headers: resp.headers - }) - ); + const transferStateKey = makeStateKey(`ngais(${opts.body})`); + + if (transferState.hasKey(transferStateKey)) { + const resp = JSON.parse(transferState.get(transferStateKey, {})); + return Promise.resolve({ + statusCode: resp.status, + body: resp.body, + headers: resp.headers }); - }; + } - return client; + return new Promise((resolve, reject) => { + httpClient + .request(opts.method, url, { + headers, + body: opts.body, + observe: "response" + }) + .subscribe( + resp => { + transferState.set(transferStateKey, JSON.stringify(resp)); + resolve({ + statusCode: resp.status, + body: resp.body, + headers: resp.headers + }); + }, + resp => + reject({ + statusCode: resp.status, + body: resp.body, + headers: resp.headers + }) + ); + }); }; + + return client; } From 13ab84b7725e86e351dc93173c1eb4bbcf9c29ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 16:58:00 +0200 Subject: [PATCH 15/16] feat: Export `createSSRSearchClient` --- src/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index be7a02396..b591ff94d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -26,8 +26,11 @@ import { NgAisPanelModule } from "./panel/panel.module"; import { NgAisConfigureModule } from "./configure/configure.module"; // Custom SSR algoliasearchClient -import { createSSRAlgoliaClient } from "./create-ssr-algolia-client"; -export { createSSRAlgoliaClient }; +import { + createSSRAlgoliaClient, + createSSRSearchClient, +} from "./create-ssr-algolia-client"; +export { createSSRAlgoliaClient, createSSRSearchClient }; import { parseServerRequest } from "./parse-server-request"; export { parseServerRequest }; From 512d6c78341ee7350c33968b48821b1b25cd5597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Chalifour?= Date: Thu, 3 May 2018 17:03:00 +0200 Subject: [PATCH 16/16] fix: Lint --- src/instantsearch/instantsearch.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/instantsearch/instantsearch.ts b/src/instantsearch/instantsearch.ts index a1a0d6baf..f6efe81d3 100644 --- a/src/instantsearch/instantsearch.ts +++ b/src/instantsearch/instantsearch.ts @@ -109,12 +109,13 @@ export type SearchParameters = { export interface SearchRequestParameters extends SearchParameters { query: string; -}; +} -export interface SearchForFacetValuesRequestParameters extends SearchParameters { +export interface SearchForFacetValuesRequestParameters + extends SearchParameters { facetQuery: string; facetName: string; -}; +} export type GeoRectangle = [number, number, number, number]; export type GeoPolygon = [number, number, number, number, number, number]; @@ -134,7 +135,7 @@ export type SearchResponse = { export type Hit = { _highlightResult?: object; -} +}; // Documentation: https://www.algolia.com/doc/rest-api/search/?language=javascript#search-for-facet-values export type SearchForFacetValuesResponse = {