diff --git a/package.json b/package.json index 7c0296587..9f0a680fe 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,7 @@ }, { "path": "packages/algoliasearch/dist/algoliasearch-lite.umd.js", - "maxSize": "4.35KB" + "maxSize": "4.4KB" }, { "path": "packages/recommend/dist/recommend.umd.js", diff --git a/packages/algoliasearch/src/builds/browser.ts b/packages/algoliasearch/src/builds/browser.ts index 232fce240..55b836db3 100644 --- a/packages/algoliasearch/src/builds/browser.ts +++ b/packages/algoliasearch/src/builds/browser.ts @@ -57,6 +57,7 @@ import { copySettings, copySynonyms, createSearchClient, + customRequest, deleteApiKey, DeleteApiKeyResponse, deleteBy, @@ -190,7 +191,7 @@ import { import { LogLevelEnum } from '@algolia/logger-common'; import { createConsoleLogger } from '@algolia/logger-console'; import { createBrowserXhrRequester } from '@algolia/requester-browser-xhr'; -import { createUserAgent, RequestOptions } from '@algolia/transporter'; +import { createUserAgent, Request, RequestOptions } from '@algolia/transporter'; import { AlgoliaSearchOptions, InitAnalyticsOptions, InitPersonalizationOptions } from '../types'; @@ -273,6 +274,7 @@ export default function algoliasearch( searchDictionaryEntries, setDictionarySettings, waitAppTask, + customRequest, initIndex: base => (indexName: string): SearchIndex => { return initIndex(base)(indexName, { methods: { @@ -677,6 +679,10 @@ export type SearchClient = BaseSearchClient & { taskID: number, requestOptions?: RequestOptions ) => Readonly>; + readonly customRequest: ( + request: Request, + requestOptions?: RequestOptions + ) => Readonly>; readonly initAnalytics: (options?: InitAnalyticsOptions) => AnalyticsClient; readonly initPersonalization: (options?: InitPersonalizationOptions) => PersonalizationClient; /** diff --git a/packages/algoliasearch/src/builds/browserLite.ts b/packages/algoliasearch/src/builds/browserLite.ts index 3b0241902..3baa84310 100644 --- a/packages/algoliasearch/src/builds/browserLite.ts +++ b/packages/algoliasearch/src/builds/browserLite.ts @@ -4,6 +4,7 @@ import { createInMemoryCache } from '@algolia/cache-in-memory'; import { AuthMode, version } from '@algolia/client-common'; import { createSearchClient, + customRequest, findAnswers, FindAnswersOptions, FindAnswersResponse, @@ -25,7 +26,7 @@ import { import { LogLevelEnum } from '@algolia/logger-common'; import { createConsoleLogger } from '@algolia/logger-console'; import { createBrowserXhrRequester } from '@algolia/requester-browser-xhr'; -import { createUserAgent, RequestOptions } from '@algolia/transporter'; +import { createUserAgent, Request, RequestOptions } from '@algolia/transporter'; import { AlgoliaSearchOptions } from '../types'; @@ -67,6 +68,7 @@ export default function algoliasearch( searchForFacetValues: multipleSearchForFacetValues, multipleQueries, multipleSearchForFacetValues, + customRequest, initIndex: base => (indexName: string): SearchIndex => { return initIndex(base)(indexName, { methods: { search, searchForFacetValues, findAnswers }, @@ -109,6 +111,10 @@ export type SearchClient = BaseSearchClient & { }>, requestOptions?: RequestOptions ) => Readonly>; + readonly customRequest: ( + request: Request, + requestOptions?: RequestOptions + ) => Readonly>; }; export { WithoutCredentials, AlgoliaSearchOptions } from '../types'; diff --git a/packages/algoliasearch/src/builds/node.ts b/packages/algoliasearch/src/builds/node.ts index 4c4c37377..31ab4f35f 100644 --- a/packages/algoliasearch/src/builds/node.ts +++ b/packages/algoliasearch/src/builds/node.ts @@ -56,6 +56,7 @@ import { copySettings, copySynonyms, createSearchClient, + customRequest, deleteApiKey, DeleteApiKeyResponse, deleteBy, @@ -192,7 +193,7 @@ import { import { createNullLogger } from '@algolia/logger-common'; import { Destroyable } from '@algolia/requester-common'; import { createNodeHttpRequester } from '@algolia/requester-node-http'; -import { createUserAgent, RequestOptions } from '@algolia/transporter'; +import { createUserAgent, Request, RequestOptions } from '@algolia/transporter'; import { AlgoliaSearchOptions, InitAnalyticsOptions, InitPersonalizationOptions } from '../types'; @@ -276,6 +277,7 @@ export default function algoliasearch( searchDictionaryEntries, setDictionarySettings, waitAppTask, + customRequest, initIndex: base => (indexName: string): SearchIndex => { return initIndex(base)(indexName, { methods: { @@ -685,6 +687,10 @@ export type SearchClient = BaseSearchClient & { taskID: number, requestOptions?: RequestOptions ) => Readonly>; + readonly customRequest: ( + request: Request, + requestOptions?: RequestOptions + ) => Readonly>; readonly initAnalytics: (options?: InitAnalyticsOptions) => AnalyticsClient; readonly initPersonalization: (options?: InitPersonalizationOptions) => PersonalizationClient; /** diff --git a/packages/client-search/src/__tests__/integration/search.test.ts b/packages/client-search/src/__tests__/integration/search.test.ts index cf6dea388..577609beb 100644 --- a/packages/client-search/src/__tests__/integration/search.test.ts +++ b/packages/client-search/src/__tests__/integration/search.test.ts @@ -1,4 +1,4 @@ -import { createObjectNotFoundError, SearchResponse } from '../..'; +import { createObjectNotFoundError, ListApiKeysResponse, SearchResponse } from '../..'; import { waitResponses } from '../../../../client-common/src/__tests__/helpers'; import { TestSuite } from '../../../../client-common/src/__tests__/TestSuite'; @@ -263,3 +263,9 @@ test('decompounding at query time', async () => { expect(results.explain).toMatchObject(explain); }); + +it('allows custom request', async () => { + const client = testSuite.makeSearchClient(); + const res = await client.customRequest({ method: 'GET', path: '/1/keys' }); + expect(res.keys.length).toBeGreaterThan(0); +}); diff --git a/packages/client-search/src/methods/client/customRequest.ts b/packages/client-search/src/methods/client/customRequest.ts new file mode 100644 index 000000000..65ec0850e --- /dev/null +++ b/packages/client-search/src/methods/client/customRequest.ts @@ -0,0 +1,14 @@ +import { MethodEnum } from '@algolia/requester-common'; +import { Request, RequestOptions } from '@algolia/transporter'; + +import { SearchClient } from '../..'; + +export const customRequest = (base: SearchClient) => { + return (request: Request, requestOptions?: RequestOptions): Readonly> => { + if (request.method === MethodEnum.Get) { + return base.transporter.read(request, requestOptions); + } + + return base.transporter.write(request, requestOptions); + }; +}; diff --git a/packages/client-search/src/methods/client/index.ts b/packages/client-search/src/methods/client/index.ts index 9cc3f64f2..95c828da4 100644 --- a/packages/client-search/src/methods/client/index.ts +++ b/packages/client-search/src/methods/client/index.ts @@ -10,6 +10,7 @@ export * from './copyIndex'; export * from './copyRules'; export * from './copySettings'; export * from './copySynonyms'; +export * from './customRequest'; export * from './deleteApiKey'; export * from './deleteDictionaryEntries'; export * from './generateSecuredApiKey';