diff --git a/.github/.cache_version b/.github/.cache_version index 7ed6ff82de..1e8b314962 100644 --- a/.github/.cache_version +++ b/.github/.cache_version @@ -1 +1 @@ -5 +6 diff --git a/clients/algoliasearch-client-javascript/bundlesize.config.json b/clients/algoliasearch-client-javascript/bundlesize.config.json index aed2a5e850..b917f4a485 100644 --- a/clients/algoliasearch-client-javascript/bundlesize.config.json +++ b/clients/algoliasearch-client-javascript/bundlesize.config.json @@ -2,47 +2,47 @@ "files": [ { "path": "packages/algoliasearch/dist/algoliasearch.umd.browser.js", - "maxSize": "6.95KB" + "maxSize": "7.05KB" }, { "path": "packages/client-abtesting/dist/client-abtesting.umd.browser.js", - "maxSize": "3.75KB" + "maxSize": "3.85KB" }, { "path": "packages/client-analytics/dist/client-analytics.umd.browser.js", - "maxSize": "4.35KB" + "maxSize": "4.45KB" }, { "path": "packages/client-insights/dist/client-insights.umd.browser.js", - "maxSize": "3.60KB" + "maxSize": "3.70KB" }, { "path": "packages/client-personalization/dist/client-personalization.umd.browser.js", - "maxSize": "3.75KB" + "maxSize": "3.85KB" }, { "path": "packages/client-query-suggestions/dist/client-query-suggestions.umd.browser.js", - "maxSize": "3.80KB" + "maxSize": "3.90KB" }, { "path": "packages/client-search/dist/client-search.umd.browser.js", - "maxSize": "5.80KB" + "maxSize": "5.85KB" }, { "path": "packages/client-sources/dist/client-sources.umd.browser.js", - "maxSize": "3.60KB" + "maxSize": "3.70KB" }, { "path": "packages/recommend/dist/recommend.umd.browser.js", - "maxSize": "3.70KB" + "maxSize": "3.80KB" }, { "path": "packages/client-common/dist/client-common.esm.node.js", - "maxSize": "3.65KB" + "maxSize": "3.80KB" }, { "path": "packages/requester-browser-xhr/dist/requester-browser-xhr.esm.node.js", - "maxSize": "900B" + "maxSize": "825B" }, { "path": "packages/requester-node-http/dist/requester-node-http.esm.node.js", diff --git a/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts b/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts index d48ba4d09a..ce4a832332 100644 --- a/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts +++ b/clients/algoliasearch-client-javascript/packages/client-common/src/transporter/createTransporter.ts @@ -7,6 +7,8 @@ import type { StackFrame, TransporterOptions, Transporter, + Headers, + QueryParameters, } from '../types'; import { createStatefulHost } from './createStatefulHost'; @@ -217,9 +219,37 @@ export function createTransporter({ } function createRequest( - request: Request, - requestOptions: RequestOptions + baseRequest: Request, + methodOptions: { + headers: Headers; + queryParameters: QueryParameters; + }, + baseRequestOptions?: RequestOptions ): Promise { + const mergedData: Request['data'] = Array.isArray(baseRequest.data) + ? baseRequest.data + : { + ...baseRequest.data, + ...baseRequestOptions?.data, + }; + const request: Request = { + ...baseRequest, + data: mergedData, + }; + const requestOptions: RequestOptions = { + cacheable: baseRequestOptions?.cacheable, + timeout: baseRequestOptions?.timeout, + queryParameters: { + ...baseRequestOptions?.queryParameters, + ...methodOptions.queryParameters, + }, + headers: { + Accept: 'application/json', + ...baseRequestOptions?.headers, + ...methodOptions.headers, + }, + }; + if (request.method !== 'GET') { /** * On write requests, no cache mechanisms are applied, and we diff --git a/clients/algoliasearch-client-javascript/packages/client-common/src/types/CreateClient.ts b/clients/algoliasearch-client-javascript/packages/client-common/src/types/CreateClient.ts index 84b79f3c52..e471d9ef0b 100644 --- a/clients/algoliasearch-client-javascript/packages/client-common/src/types/CreateClient.ts +++ b/clients/algoliasearch-client-javascript/packages/client-common/src/types/CreateClient.ts @@ -1,3 +1,4 @@ +import type { Cache } from './Cache'; import type { Host } from './Host'; import type { Requester } from './Requester'; import type { @@ -20,3 +21,11 @@ export type CreateClientOptions = Pick< hosts?: Host[]; authMode?: AuthMode; }; + +export type InitClientOptions = Partial<{ + requester: Requester; + hosts: Host[]; + responsesCache: Cache; + requestsCache: Cache; + hostsCache: Cache; +}>; diff --git a/clients/algoliasearch-client-javascript/packages/client-common/src/types/Requester.ts b/clients/algoliasearch-client-javascript/packages/client-common/src/types/Requester.ts index 4100773061..63ee499e21 100644 --- a/clients/algoliasearch-client-javascript/packages/client-common/src/types/Requester.ts +++ b/clients/algoliasearch-client-javascript/packages/client-common/src/types/Requester.ts @@ -5,7 +5,7 @@ export type Method = 'DELETE' | 'GET' | 'PATCH' | 'POST' | 'PUT'; export type Request = { method: Method; path: string; - data?: Record; + data?: Array> | Record; cacheable?: boolean; }; diff --git a/clients/algoliasearch-client-javascript/packages/client-common/src/types/Transporter.ts b/clients/algoliasearch-client-javascript/packages/client-common/src/types/Transporter.ts index 52c7ba0213..8bc8b6567a 100644 --- a/clients/algoliasearch-client-javascript/packages/client-common/src/types/Transporter.ts +++ b/clients/algoliasearch-client-javascript/packages/client-common/src/types/Transporter.ts @@ -30,7 +30,7 @@ export type RequestOptions = { * Custom data for the request. This data are * going to be merged the transporter data. */ - data?: Record; + data?: Array> | Record; /** * If the given request should persist on the cache. Keep in mind, @@ -194,10 +194,15 @@ export type Transporter = { hosts: Host[]; /** - * Performs a read request using read hosts. + * Performs a request. + * The `baseRequest` and `baseRequestOptions` will be merged accordignly. */ request: ( - request: Request, - requestOptions: RequestOptions + baseRequest: Request, + methodOptions: { + headers: Headers; + queryParameters: QueryParameters; + }, + baseRequestOptions?: RequestOptions ) => Promise; }; diff --git a/templates/javascript/api-all.mustache b/templates/javascript/api-all.mustache index b37ae535ed..c0c1ad47b8 100644 --- a/templates/javascript/api-all.mustache +++ b/templates/javascript/api-all.mustache @@ -1,6 +1,5 @@ {{! This file will be renamed and moved to `builds/browser.ts` after generating the client }} - -import type { Host, Requester } from '@experimental-api-clients-automation/client-common'; +import type { InitClientOptions } from '@experimental-api-clients-automation/client-common'; import { createMemoryCache, createFallbackableCache, createBrowserLocalStorageCache } from '@experimental-api-clients-automation/client-common'; import { createXhrRequester } from '@experimental-api-clients-automation/requester-browser-xhr'; @@ -17,7 +16,7 @@ export * from '../src/{{apiName}}Api'; export function {{apiName}}Api( appId: string, apiKey: string,{{#hasRegionalHost}}region{{#fallbackToAliasHost}}?{{/fallbackToAliasHost}}: Region,{{/hasRegionalHost}} - options?: { requester?: Requester; hosts?: Host[] } + options?: InitClientOptions ): {{capitalizedApiName}}Api { if (!appId) { throw new Error("`appId` is missing."); @@ -46,9 +45,9 @@ export function {{apiName}}Api( requester: options?.requester ?? createXhrRequester(), userAgents: [{ segment: 'Browser' }], authMode: 'WithinQueryParameters', - responsesCache: createMemoryCache(), - requestsCache: createMemoryCache({ serializable: false }), - hostsCache: createFallbackableCache({ + responsesCache: options?.responsesCache ?? createMemoryCache(), + requestsCache: options?.requestsCache ?? createMemoryCache({ serializable: false }), + hostsCache: options?.hostsCache ?? createFallbackableCache({ caches: [ createBrowserLocalStorageCache({ key: `${apiClientVersion}-${appId}` }), createMemoryCache(), diff --git a/templates/javascript/api-single.mustache b/templates/javascript/api-single.mustache index 311240c892..f987d4bda3 100644 --- a/templates/javascript/api-single.mustache +++ b/templates/javascript/api-single.mustache @@ -9,6 +9,8 @@ import type { Headers, Host, Request, + RequestOptions, + QueryParameters, } from '@experimental-api-clients-automation/client-common'; {{#imports}} @@ -159,7 +161,7 @@ export function create{{capitalizedApiName}}Api(options: CreateClientOptions{{#h {{#allParams}} {{paramName}}, {{/allParams}} - }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props + }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props, {{/bodyParams.0}} {{#bodyParams.0}} {{^queryParams.0}} @@ -170,7 +172,7 @@ export function create{{capitalizedApiName}}Api(options: CreateClientOptions{{#h {{#allParams}} {{paramName}}, {{/allParams}} - }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props + }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props, {{/bodyParams.1}} {{/bodyParams.0.isArray}} {{^bodyParams.0.isArray}} @@ -184,7 +186,7 @@ export function create{{capitalizedApiName}}Api(options: CreateClientOptions{{#h {{#allParams}} {{paramName}}, {{/allParams}} - }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props + }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props, {{/pathParams.0}} {{/queryParams.0}} {{#queryParams.0}} @@ -192,10 +194,11 @@ export function create{{capitalizedApiName}}Api(options: CreateClientOptions{{#h {{#allParams}} {{paramName}}, {{/allParams}} - }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props + }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props, {{/queryParams.0}} {{/bodyParams.0}} {{/allParams.0}} + requestOptions?: RequestOptions ) : Promise<{{{returnType}}}> { const requestPath = '{{{path}}}'{{#pathParams}}.replace( {{=<% %>=}} @@ -203,8 +206,8 @@ export function create{{capitalizedApiName}}Api(options: CreateClientOptions{{#h <%={{ }}=%> encodeURIComponent(String({{paramName}})) ){{/pathParams}}; - let headers: Headers = { Accept: 'application/json' }; - let queryParameters: Record = {}; + const headers: Headers = {}; + const queryParameters: QueryParameters = {}; {{#allParams}} {{#required}} @@ -243,7 +246,7 @@ export function create{{capitalizedApiName}}Api(options: CreateClientOptions{{#h return transporter.request(request, { queryParameters, headers, - }); + }, requestOptions); } {{/operation}} diff --git a/templates/javascript/api.mustache b/templates/javascript/api.mustache index 9c0d7ffa65..ae2e1780dd 100644 --- a/templates/javascript/api.mustache +++ b/templates/javascript/api.mustache @@ -1,6 +1,5 @@ {{! This file will be renamed and moved to `builds/node.ts` after generating the client }} - -import type { Host, Requester } from '@experimental-api-clients-automation/client-common'; +import type { InitClientOptions } from '@experimental-api-clients-automation/client-common'; import { createMemoryCache, createNullCache } from '@experimental-api-clients-automation/client-common'; import { createHttpRequester } from '@experimental-api-clients-automation/requester-node-http'; @@ -16,7 +15,7 @@ export * from '../src/{{apiName}}Api'; export function {{apiName}}Api( appId: string, apiKey: string,{{#hasRegionalHost}}region{{#fallbackToAliasHost}}?{{/fallbackToAliasHost}}: Region,{{/hasRegionalHost}} - options?: { requester?: Requester; hosts?: Host[] } + options?: InitClientOptions ): {{capitalizedApiName}}Api { if (!appId) { throw new Error("`appId` is missing."); @@ -44,9 +43,9 @@ export function {{apiName}}Api( }, requester: options?.requester ?? createHttpRequester(), userAgents: [{ segment: 'Node.js', version: process.versions.node }], - responsesCache: createNullCache(), - requestsCache: createNullCache(), - hostsCache: createMemoryCache(), + responsesCache: options?.responsesCache ?? createNullCache(), + requestsCache: options?.requestsCache ?? createNullCache(), + hostsCache: options?.hostsCache ?? createMemoryCache(), ...options, }); }