Skip to content

Commit 3994f53

Browse files
benamibBilel Benamirashortcuts
authoredMar 25, 2025··
feat(clients): add new realtime-personalization api (#4613)
Co-authored-by: Bilel Benamira <bilel.benamira@algolia.com> Co-authored-by: shortcuts <vannicattec@gmail.com>
1 parent d33037a commit 3994f53

File tree

30 files changed

+422
-101
lines changed

30 files changed

+422
-101
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
targets:
2+
$default:
3+
builders:
4+
json_serializable:
5+
options:
6+
any_map: false
7+
checked: true
8+
create_factory: true
9+
create_to_json: true
10+
disallow_unrecognized_keys: false
11+
explicit_to_json: true
12+
field_rename: none
13+
ignore_unannotated: false
14+
include_if_null: false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

‎clients/algoliasearch-client-javascript/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"packages/*"
88
],
99
"scripts": {
10-
"build": "lerna run build --skip-nx-cache --scope '@algolia/requester-testing' --scope '@algolia/logger-console' --scope 'algoliasearch' --scope '@algolia/client-composition' --scope '@algolia/composition' --include-dependencies",
10+
"build": "lerna run build --skip-nx-cache --scope '@algolia/requester-testing' --scope '@algolia/logger-console' --scope 'algoliasearch' --scope '@algolia/client-composition' --scope '@algolia/composition' --scope '@algolia/client-realtime-personalization' --include-dependencies",
1111
"clean": "lerna run clean",
1212
"release:publish": "tsc --project scripts/tsconfig.json && node scripts/dist/publish.js",
1313
"test": "lerna run test $*",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"version": "0.0.1-alpha.0",
3+
"repository": {
4+
"type": "git",
5+
"url": "git+https://github.com/algolia/algoliasearch-client-javascript.git"
6+
},
7+
"homepage": "https://github.com/algolia/algoliasearch-client-javascript/packages/client-realtime-personalization#readme",
8+
"type": "module",
9+
"license": "MIT",
10+
"author": "Algolia",
11+
"scripts": {
12+
"build": "yarn clean && yarn tsup && yarn rollup -c rollup.config.js",
13+
"clean": "rm -rf ./dist || true",
14+
"test:bundle": "publint . && attw --pack ."
15+
},
16+
"name": "@algolia/client-realtime-personalization",
17+
"description": "JavaScript client for client-realtime-personalization",
18+
"exports": {
19+
".": {
20+
"node": {
21+
"types": {
22+
"import": "./dist/node.d.ts",
23+
"module": "./dist/node.d.ts",
24+
"require": "./dist/node.d.cts"
25+
},
26+
"import": "./dist/builds/node.js",
27+
"module": "./dist/builds/node.js",
28+
"require": "./dist/builds/node.cjs"
29+
},
30+
"worker": {
31+
"types": "./dist/worker.d.ts",
32+
"default": "./dist/builds/worker.js"
33+
},
34+
"default": {
35+
"types": "./dist/browser.d.ts",
36+
"module": "./dist/builds/browser.js",
37+
"import": "./dist/builds/browser.js",
38+
"default": "./dist/builds/browser.umd.js"
39+
}
40+
},
41+
"./dist/builds/*": "./dist/builds/*.js"
42+
},
43+
"jsdelivr": "./dist/builds/browser.umd.js",
44+
"unpkg": "./dist/builds/browser.umd.js",
45+
"react-native": "./dist/builds/browser.js",
46+
"files": [
47+
"dist",
48+
"index.js",
49+
"index.d.ts"
50+
],
51+
"dependencies": {
52+
"@algolia/client-common": "5.22.0",
53+
"@algolia/requester-browser-xhr": "5.22.0",
54+
"@algolia/requester-fetch": "5.22.0",
55+
"@algolia/requester-node-http": "5.22.0"
56+
},
57+
"devDependencies": {
58+
"@arethetypeswrong/cli": "0.17.4",
59+
"@types/node": "22.13.11",
60+
"publint": "0.3.9",
61+
"rollup": "4.36.0",
62+
"tsup": "8.4.0",
63+
"typescript": "5.7.3"
64+
},
65+
"engines": {
66+
"node": ">= 14.0.0"
67+
}
68+
}

‎clients/algoliasearch-client-javascript/yarn.lock

+17
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,23 @@ __metadata:
122122
languageName: unknown
123123
linkType: soft
124124

125+
"@algolia/client-realtime-personalization@workspace:packages/client-realtime-personalization":
126+
version: 0.0.0-use.local
127+
resolution: "@algolia/client-realtime-personalization@workspace:packages/client-realtime-personalization"
128+
dependencies:
129+
"@algolia/client-common": "npm:5.22.0"
130+
"@algolia/requester-browser-xhr": "npm:5.22.0"
131+
"@algolia/requester-fetch": "npm:5.22.0"
132+
"@algolia/requester-node-http": "npm:5.22.0"
133+
"@arethetypeswrong/cli": "npm:0.17.4"
134+
"@types/node": "npm:22.13.11"
135+
publint: "npm:0.3.9"
136+
rollup: "npm:4.36.0"
137+
tsup: "npm:8.4.0"
138+
typescript: "npm:5.7.3"
139+
languageName: unknown
140+
linkType: soft
141+
125142
"@algolia/client-search@npm:5.22.0, @algolia/client-search@workspace:packages/client-search":
126143
version: 0.0.0-use.local
127144
resolution: "@algolia/client-search@workspace:packages/client-search"

‎config/clients.config.json

+26-9
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
"personalization",
1111
"query-suggestions",
1212
"recommend",
13-
"search"
13+
"search",
14+
"realtime-personalization"
1415
],
1516
"folder": "clients/algoliasearch-client-csharp",
1617
"gitRepoId": "algoliasearch-client-csharp",
@@ -48,6 +49,10 @@
4849
{
4950
"name": "search",
5051
"output": "clients/algoliasearch-client-dart/packages/client_search"
52+
},
53+
{
54+
"name": "realtime-personalization",
55+
"output": "clients/algoliasearch-client-dart/packages/client_realtime_personalization"
5156
}
5257
],
5358
"folder": "clients/algoliasearch-client-dart",
@@ -76,7 +81,8 @@
7681
"personalization",
7782
"query-suggestions",
7883
"recommend",
79-
"search"
84+
"search",
85+
"realtime-personalization"
8086
],
8187
"folder": "clients/algoliasearch-client-go",
8288
"gitRepoId": "algoliasearch-client-go",
@@ -104,7 +110,8 @@
104110
"personalization",
105111
"query-suggestions",
106112
"recommend",
107-
"search"
113+
"search",
114+
"realtime-personalization"
108115
],
109116
"folder": "clients/algoliasearch-client-java",
110117
"gitRepoId": "algoliasearch-client-java",
@@ -176,6 +183,10 @@
176183
{
177184
"name": "composition-full",
178185
"output": "clients/algoliasearch-client-javascript/packages/client-composition"
186+
},
187+
{
188+
"name": "realtime-personalization",
189+
"output": "clients/algoliasearch-client-javascript/packages/client-realtime-personalization"
179190
}
180191
],
181192
"folder": "clients/algoliasearch-client-javascript",
@@ -203,7 +214,8 @@
203214
"personalization",
204215
"query-suggestions",
205216
"recommend",
206-
"search"
217+
"search",
218+
"realtime-personalization"
207219
],
208220
"folder": "clients/algoliasearch-client-kotlin",
209221
"gitRepoId": "algoliasearch-client-kotlin",
@@ -231,7 +243,8 @@
231243
"personalization",
232244
"query-suggestions",
233245
"recommend",
234-
"search"
246+
"search",
247+
"realtime-personalization"
235248
],
236249
"folder": "clients/algoliasearch-client-php",
237250
"gitRepoId": "algoliasearch-client-php",
@@ -259,7 +272,8 @@
259272
"personalization",
260273
"query-suggestions",
261274
"recommend",
262-
"search"
275+
"search",
276+
"realtime-personalization"
263277
],
264278
"folder": "clients/algoliasearch-client-python",
265279
"gitRepoId": "algoliasearch-client-python",
@@ -294,7 +308,8 @@
294308
"personalization",
295309
"query-suggestions",
296310
"recommend",
297-
"search"
311+
"search",
312+
"realtime-personalization"
298313
],
299314
"folder": "clients/algoliasearch-client-ruby",
300315
"gitRepoId": "algoliasearch-client-ruby",
@@ -322,7 +337,8 @@
322337
"personalization",
323338
"query-suggestions",
324339
"recommend",
325-
"search"
340+
"search",
341+
"realtime-personalization"
326342
],
327343
"folder": "clients/algoliasearch-client-scala",
328344
"gitRepoId": "algoliasearch-client-scala",
@@ -349,7 +365,8 @@
349365
"personalization",
350366
"query-suggestions",
351367
"recommend",
352-
"search"
368+
"search",
369+
"realtime-personalization"
353370
],
354371
"folder": "clients/algoliasearch-client-swift",
355372
"gitRepoId": "algoliasearch-client-swift",

‎generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ public String getName() {
2828
public void processOpts() {
2929
String client = (String) additionalProperties.get("client");
3030

31-
additionalProperties.put("packageName", client.equals("query-suggestions") ? "suggestions" : client);
31+
additionalProperties.put("packageName", client.equals("query-suggestions") ? "suggestions" : Helpers.camelize(client));
3232
additionalProperties.put("enumClassPrefix", true);
33-
additionalProperties.put("is" + Helpers.capitalize(Helpers.camelize((String) additionalProperties.get("client"))) + "Client", true);
33+
additionalProperties.put("is" + Helpers.capitalize(Helpers.camelize(client)) + "Client", true);
3434

3535
String outputFolder = "algolia" + File.separator + client;
3636
setOutputDir(getOutputDir() + File.separator + outputFolder);

‎generators/src/main/java/com/algolia/codegen/cts/AlgoliaCTSGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public Map<String, Object> postProcessSupportingFileData(Map<String, Object> obj
145145
// We can put whatever we want in the bundle, and it will be accessible in the template
146146
bundle.put("mode", mode);
147147
bundle.put("is" + Helpers.capitalize(Helpers.camelize(client)) + "Client", true);
148-
bundle.put("isStandaloneClient", client.contains("search") || client.contains("composition"));
148+
bundle.put("isStandaloneClient", client.contains("search") || client.contains("composition") || client.contains("realtime"));
149149
bundle.put("isSearchClient", client.contains("search")); // just so algoliasearch is treated as a search client too
150150
bundle.put("client", Helpers.createClientName(importClientName, language) + "Client");
151151
bundle.put("clientPrefix", Helpers.createClientName(importClientName, language));

‎generators/src/main/java/com/algolia/codegen/cts/manager/GoCTSManager.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ public String getClient() {
2323

2424
@Override
2525
public void addDataToBundle(Map<String, Object> bundle) throws GeneratorException {
26-
Object clientPrefix = bundle.get("clientPrefix");
26+
String clientPrefix = (String) bundle.get("clientPrefix");
2727
bundle.put("clientName", Helpers.toPascalCase(this.client));
2828

2929
if (clientPrefix.equals("query-suggestions")) {
3030
bundle.put("clientPrefix", "suggestions");
31+
} else {
32+
bundle.put("clientPrefix", Helpers.camelize(clientPrefix));
3133
}
3234

3335
bundle.put("clientImport", clientPrefix);

‎generators/src/main/java/com/algolia/codegen/cts/manager/JavascriptCTSManager.java

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ public void addDataToBundle(Map<String, Object> bundle) throws GeneratorExceptio
5656
bundle.put("clientName", "compositionClient");
5757
bundle.put("importPackage", "@algolia/client-composition");
5858
break;
59+
case "realtime-personalization":
60+
bundle.put("clientName", "realtimePersonalizationClient");
61+
bundle.put("importPackage", "@algolia/client-realtime-personalization");
62+
break;
5963
case "algoliasearch":
6064
bundle.put("clientName", "liteClient");
6165
bundle.put("importPackage", "algoliasearch/lite");

‎generators/src/main/java/com/algolia/codegen/cts/tests/TestsRequest.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,15 @@ public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation>
8181
List<Object> blocksE2E = new ArrayList<>();
8282
ParametersWithDataType paramsType = new ParametersWithDataType(models, language, client, false);
8383

84-
bundle.put("e2eAppID", client.startsWith("composition") ? "METIS_APPLICATION_ID" : "ALGOLIA_APPLICATION_ID");
84+
bundle.put(
85+
"e2eAppID",
86+
client.startsWith("composition") || client.startsWith("realtime") ? "METIS_APPLICATION_ID" : "ALGOLIA_APPLICATION_ID"
87+
);
8588
bundle.put(
8689
"e2eApiKey",
87-
client.startsWith("composition") ? "METIS_API_KEY" : (client.equals("monitoring") ? "MONITORING_API_KEY" : "ALGOLIA_ADMIN_KEY")
90+
client.startsWith("composition") || client.startsWith("realtime")
91+
? "METIS_API_KEY"
92+
: (client.equals("monitoring") ? "MONITORING_API_KEY" : "ALGOLIA_ADMIN_KEY")
8893
);
8994
bundle.put("useEchoRequester", true);
9095

‎playground/javascript/node/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"@algolia/client-insights": "link:../../../clients/algoliasearch-client-javascript/packages/client-insights",
1515
"@algolia/client-personalization": "link:../../../clients/algoliasearch-client-javascript/packages/client-personalization",
1616
"@algolia/client-query-suggestions": "link:../../../clients/algoliasearch-client-javascript/packages/client-query-suggestions",
17+
"@algolia/client-realtime-personalization": "link:../../../clients/algoliasearch-client-javascript/packages/client-realtime-personalization",
1718
"@algolia/client-search": "link:../../../clients/algoliasearch-client-javascript/packages/client-search",
1819
"@algolia/composition": "link:../../../clients/algoliasearch-client-javascript/packages/composition",
1920
"@algolia/ingestion": "link:../../../clients/algoliasearch-client-javascript/packages/ingestion",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { ApiError } from '@algolia/client-common';
2+
import { realtimePersonalizationClient } from '@algolia/client-realtime-personalization';
3+
4+
const appId = process.env.METIS_APPLICATION_ID || '**** APP_ID *****';
5+
const apiKey = process.env.METIS_API_KEY || '**** ADMIN_KEY *****';
6+
7+
// Init client with appId and apiKey
8+
const client = realtimePersonalizationClient(appId, apiKey, 'us');
9+
10+
async function testRealtimePersonalization() {
11+
try {
12+
console.log(appId, apiKey);
13+
14+
const resp = await client.getUser({userToken: "foo"});
15+
16+
console.log(resp);
17+
18+
} catch (e) {
19+
if (e instanceof ApiError) {
20+
return console.log(`[${e.status}] ${e.message}`, e.stackTrace, e);
21+
}
22+
23+
console.log('[ERROR]', e);
24+
}
25+
}
26+
27+
testRealtimePersonalization();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
strategy:
2+
type: string
3+
enum:
4+
- session
5+
- hybrid
6+
example: 'session'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# path
2+
UserToken:
3+
name: userToken
4+
in: path
5+
required: true
6+
description: Unique identifier representing a user for which to fetch the personalization profile.
7+
schema:
8+
$ref: '../../common/schemas/SearchParams.yml#/userToken'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
user:
2+
type: object
3+
additionalProperties: false
4+
required:
5+
- version
6+
- userID
7+
- search
8+
properties:
9+
version:
10+
type: string
11+
description: Version of the response format.
12+
userID:
13+
type: string
14+
description: User ID of the user.
15+
search:
16+
type: object
17+
description: |
18+
Index personalization filters by index name.
19+
additionalProperties:
20+
$ref: '#/searchFilters'
21+
22+
searchFilters:
23+
type: object
24+
additionalProperties: false
25+
properties:
26+
indices:
27+
type: array
28+
items:
29+
type: string
30+
example: ['storefront', 'storefront_price_asc', 'storefront_price_desc']
31+
strategy:
32+
$ref: '../enums.yml#/strategy'
33+
filters:
34+
$ref: '#/searchFilter'
35+
36+
searchFilter:
37+
type: object
38+
additionalProperties: false
39+
properties:
40+
session:
41+
type: array
42+
items:
43+
type: string
44+
example: ['brand:Dyson<score=12>']
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
get:
2+
tags:
3+
- users
4+
operationId: getUser
5+
x-acl:
6+
- recommendation
7+
summary: Retrieve the user's personalization profile
8+
description: Retrieves the user's personalization profiles containing search filters.
9+
parameters:
10+
- $ref: '../common/parameters.yml#/UserToken'
11+
responses:
12+
'200':
13+
description: OK
14+
content:
15+
application/json:
16+
schema:
17+
$ref: '../common/schemas/user.yml#/user'
18+
'400':
19+
$ref: '../../common/responses/BadRequest.yml'
20+
'402':
21+
$ref: '../../common/responses/FeatureNotEnabled.yml'
22+
'403':
23+
$ref: '../../common/responses/MethodNotAllowed.yml'
24+
'404':
25+
$ref: '../../common/responses/IndexNotFound.yml'
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
openapi: 3.0.2
2+
info:
3+
title: Realtime Personalization API
4+
description: TODO
5+
version: 0.0.1
6+
externalDocs:
7+
# TODO: Update the URL
8+
url: https://www.algolia.com/doc/guides/personalization/what-is-personalization/
9+
description: |
10+
Related guide: Algolia Realtime Personalization.
11+
components:
12+
securitySchemes:
13+
appId:
14+
$ref: '../common/securitySchemes.yml#/appId'
15+
apiKey:
16+
$ref: '../common/securitySchemes.yml#/apiKey'
17+
servers:
18+
- url: https://ai-personalization.{region}.algolia.com
19+
variables:
20+
region:
21+
description: |
22+
Use the URL that matches your [analytics region](https://dashboard.algolia.com/account/infrastructure/analytics).
23+
enum: [eu, us]
24+
default: eu
25+
security:
26+
- appId: []
27+
apiKey: []
28+
tags:
29+
- name: users
30+
x-displayName: Users
31+
description: |
32+
User profiles contains the search filters each user has for the different facets in your index.
33+
x-tagGroups:
34+
- name: General
35+
tags:
36+
- filters
37+
paths:
38+
# ######################
39+
# ### Custom request ###
40+
# ######################
41+
/{path}:
42+
$ref: '../common/paths/customRequest.yml'
43+
44+
# ###############
45+
# ### Helpers ###
46+
# ###############
47+
/setClientApiKey:
48+
$ref: '../common/helpers/setClientApiKey.yml#/method'
49+
50+
/2/realtime/users/{userToken}:
51+
$ref: 'paths/getUser.yml'

‎templates/dart/lib.mustache

+1-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,4 @@ export 'package:algolia_client_core/algolia_client_core.dart';
77
{{/apis}}{{/apiInfo}}
88
{{#models}}{{#model}}export '{{sourceFolder}}/{{modelPackage}}/{{classFilename}}.dart';
99
{{/model}}{{/models}}
10-
{{^isCompositionClient}}
11-
export 'src/extension.dart';
12-
{{/isCompositionClient}}
10+
export 'src/extension.dart';
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
const client = {{{clientName}}}("ALGOLIA_APPLICATION_ID", "ALGOLIA_API_KEY"){{^isSearchClient}}{{^isCompositionClient}}{{^isCompositionFullClient}}.{{{initMethod}}}({{#hasRegionalHost}} {region: '{{defaultRegion}}'} {{/hasRegionalHost}}){{/isCompositionFullClient}}{{/isCompositionClient}}{{/isSearchClient}};
1+
const client = {{{clientName}}}("ALGOLIA_APPLICATION_ID", "ALGOLIA_API_KEY"{{#isStandaloneClient}}{{#hasRegionalHost}}, '{{defaultRegion}}' {{/hasRegionalHost}}{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({{#hasRegionalHost}} {region: '{{defaultRegion}}'} {{/hasRegionalHost}}){{/isStandaloneClient}};

‎templates/javascript/tests/client/client.mustache

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const appId = 'test-app-id';
1010
const apiKey = 'test-api-key';
1111

1212
function createClient() {
13-
return {{{clientName}}}(appId, apiKey{{#isStandaloneClient}}, { requester: nodeEchoRequester() }{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({ options: { requester: nodeEchoRequester() }, {{#hasRegionalHost}} region:'{{{defaultRegion}}}' {{/hasRegionalHost}} });{{/isStandaloneClient}};
13+
return {{{clientName}}}(appId, apiKey{{#isStandaloneClient}}, {{#hasRegionalHost}}'{{{defaultRegion}}}', {{/hasRegionalHost}} { requester: nodeEchoRequester() }{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({ options: { requester: nodeEchoRequester() }, {{#hasRegionalHost}} region:'{{{defaultRegion}}}' {{/hasRegionalHost}} });{{/isStandaloneClient}};
1414
}
1515

1616
{{#blocksClient}}
@@ -20,8 +20,8 @@ function createClient() {
2020
{{^isCompositionClient}}
2121
describe('init', () => {
2222
test('sets authMode', async () => {
23-
const qpClient = {{{clientName}}}('foo', 'bar'{{#isStandaloneClient}}, { requester: nodeEchoRequester(), authMode: 'WithinQueryParameters' }{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({ options: { requester: nodeEchoRequester(), authMode: 'WithinQueryParameters' }, {{#hasRegionalHost}} region:'{{{defaultRegion}}}' {{/hasRegionalHost}} });{{/isStandaloneClient}};
24-
const headerClient = {{{clientName}}}('foo', 'bar'{{#isStandaloneClient}}, { requester: nodeEchoRequester(), authMode: 'WithinHeaders' }{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({ options: { requester: nodeEchoRequester(), authMode: 'WithinHeaders' }, {{#hasRegionalHost}} region:'{{{defaultRegion}}}' {{/hasRegionalHost}} });{{/isStandaloneClient}};
23+
const qpClient = {{{clientName}}}('foo', 'bar'{{#isStandaloneClient}},{{#hasRegionalHost}}'{{{defaultRegion}}}', {{/hasRegionalHost}} { requester: nodeEchoRequester(), authMode: 'WithinQueryParameters' }{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({ options: { requester: nodeEchoRequester(), authMode: 'WithinQueryParameters' }, {{#hasRegionalHost}} region:'{{{defaultRegion}}}' {{/hasRegionalHost}} });{{/isStandaloneClient}};
24+
const headerClient = {{{clientName}}}('foo', 'bar'{{#isStandaloneClient}},{{#hasRegionalHost}}'{{{defaultRegion}}}', {{/hasRegionalHost}} { requester: nodeEchoRequester(), authMode: 'WithinHeaders' }{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({ options: { requester: nodeEchoRequester(), authMode: 'WithinHeaders' }, {{#hasRegionalHost}} region:'{{{defaultRegion}}}' {{/hasRegionalHost}} });{{/isStandaloneClient}};
2525

2626
const qpResult = (await qpClient.customGet({
2727
path: '1/foo',

‎templates/javascript/tests/client/createClient.mustache

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
'{{parametersWithDataTypeMap.appId.value}}',
33
'{{parametersWithDataTypeMap.apiKey.value}}'
44
{{#isStandaloneClient}},
5+
{{#hasRegionalHost}}'{{{parametersWithDataTypeMap.region.value}}}', {{/hasRegionalHost}}
56
{
67
{{#useEchoRequester}}
78
requester: nodeEchoRequester(),

‎templates/javascript/tests/requests/requests.mustache

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const appId = process.env.ALGOLIA_APPLICATION_ID || 'test_app_id';
1010
const apiKey = process.env.ALGOLIA_SEARCH_KEY || 'test_api_key';
1111

1212
const clientOptions: ClientOptions = { requester: nodeEchoRequester() }; // this makes sure the types are correctly exported
13-
const client = {{{clientName}}}(appId, apiKey{{#isStandaloneClient}}, { requester: nodeEchoRequester() }{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({ options: clientOptions, {{#hasRegionalHost}} region:'{{{defaultRegion}}}' {{/hasRegionalHost}} });{{/isStandaloneClient}};
13+
const client = {{{clientName}}}(appId, apiKey{{#isStandaloneClient}}, {{#hasRegionalHost}}'{{{defaultRegion}}}', {{/hasRegionalHost}} { requester: nodeEchoRequester() }{{/isStandaloneClient}}){{^isStandaloneClient}}.{{{initMethod}}}({ options: clientOptions, {{#hasRegionalHost}} region:'{{{defaultRegion}}}' {{/hasRegionalHost}} });{{/isStandaloneClient}};
1414

1515
{{#blocksRequests}}
1616
describe('{{operationId}}', () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
[
2+
{
3+
"testName": "throws when incorrect region is given",
4+
"autoCreateClient": false,
5+
"steps": [
6+
{
7+
"type": "createClient",
8+
"parameters": {
9+
"appId": "my-app-id",
10+
"apiKey": "my-api-key",
11+
"region": "not_a_region"
12+
},
13+
"expected": {
14+
"error": "`region` is required and must be one of the following: eu, us"
15+
}
16+
}
17+
]
18+
}
19+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[
2+
{
3+
"parameters": {
4+
"userToken": "foo"
5+
},
6+
"request": {
7+
"path": "/2/realtime/users/foo",
8+
"method": "GET"
9+
}
10+
}
11+
]

‎tests/output/dart/pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ dependencies:
1717
algolia_client_core: any
1818
dev_dependencies:
1919
lints: ^4.0.0
20+
algolia_client_realtime_personalization: any

‎tests/output/dart/pubspec_overrides.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ dependency_overrides:
1111
path: ../../../clients/algoliasearch-client-dart/packages/client_recommend
1212
algolia_client_composition:
1313
path: ../../../clients/algoliasearch-client-dart/packages/client_composition
14+
algolia_client_realtime_personalization:
15+
path: ../../../clients/algoliasearch-client-dart/packages/client_realtime_personalization

‎tests/output/javascript/yarn.lock

+68-77
Original file line numberDiff line numberDiff line change
@@ -397,32 +397,32 @@ __metadata:
397397
languageName: node
398398
linkType: hard
399399

400-
"@types/node@npm:22.13.1":
401-
version: 22.13.1
402-
resolution: "@types/node@npm:22.13.1"
400+
"@types/node@npm:22.13.11":
401+
version: 22.13.11
402+
resolution: "@types/node@npm:22.13.11"
403403
dependencies:
404404
undici-types: "npm:~6.20.0"
405-
checksum: 10/d8ba7068b0445643c0fa6e4917cdb7a90e8756a9daff8c8a332689cd5b2eaa01e4cd07de42e3cd7e6a6f465eeda803d5a1363d00b5ab3f6cea7950350a159497
405+
checksum: 10/5e556eda347f3395669bd6fa7a10c77722f06befe0a6b51b97ed7a4bd0f92b24aa867ee611b547614f17dfc5a0bb7946a75263bd1f302bcac3039729d22acab5
406406
languageName: node
407407
linkType: hard
408408

409-
"@vitest/expect@npm:3.0.5":
410-
version: 3.0.5
411-
resolution: "@vitest/expect@npm:3.0.5"
409+
"@vitest/expect@npm:3.0.9":
410+
version: 3.0.9
411+
resolution: "@vitest/expect@npm:3.0.9"
412412
dependencies:
413-
"@vitest/spy": "npm:3.0.5"
414-
"@vitest/utils": "npm:3.0.5"
415-
chai: "npm:^5.1.2"
413+
"@vitest/spy": "npm:3.0.9"
414+
"@vitest/utils": "npm:3.0.9"
415+
chai: "npm:^5.2.0"
416416
tinyrainbow: "npm:^2.0.0"
417-
checksum: 10/e9dfaed51e3a2952306fa621b4fe6c4323b367c8b731fc57d661d971628df89d1bfa163be79e4de3004d6e2e32c99b496efb8d065db6cf41d6be01dc2b833f8d
417+
checksum: 10/09fc02ae3a639d5db23705a393ef571001f7f1006f7527529ec7807699b739788d5b54b71cb917c56379874b006f2de49933585694927b23c0d50787f96b9e94
418418
languageName: node
419419
linkType: hard
420420

421-
"@vitest/mocker@npm:3.0.5":
422-
version: 3.0.5
423-
resolution: "@vitest/mocker@npm:3.0.5"
421+
"@vitest/mocker@npm:3.0.9":
422+
version: 3.0.9
423+
resolution: "@vitest/mocker@npm:3.0.9"
424424
dependencies:
425-
"@vitest/spy": "npm:3.0.5"
425+
"@vitest/spy": "npm:3.0.9"
426426
estree-walker: "npm:^3.0.3"
427427
magic-string: "npm:^0.30.17"
428428
peerDependencies:
@@ -433,66 +433,57 @@ __metadata:
433433
optional: true
434434
vite:
435435
optional: true
436-
checksum: 10/84f3f8bbefdde91467d4bb6e5ea62227fdd86dce5567d0a2a04329033e1ed6cffe140d5b1cd58d323792d4116ba67562539d22c80910d60310eede940c94eb8b
436+
checksum: 10/ef9e4e11e6c3f1d41884641a72298bd64e8440d2925e60ae5d5c8297a7b744ca41a8b6ab227dbcf523a82de6577ab610109ea155471fd1c722a157e59041d9dc
437437
languageName: node
438438
linkType: hard
439439

440-
"@vitest/pretty-format@npm:3.0.5":
441-
version: 3.0.5
442-
resolution: "@vitest/pretty-format@npm:3.0.5"
440+
"@vitest/pretty-format@npm:3.0.9, @vitest/pretty-format@npm:^3.0.9":
441+
version: 3.0.9
442+
resolution: "@vitest/pretty-format@npm:3.0.9"
443443
dependencies:
444444
tinyrainbow: "npm:^2.0.0"
445-
checksum: 10/1ffbee16e9aa2cd7862bc6b83c30b7b53031d29ddae0302d09e6b1f6bfa0e4338e5c74a2dfaeed1bab317aff300c4fd309004dbaa69baf9ebe71f6806b132e96
445+
checksum: 10/cfcdda2c72cf16a5e76ad2c9b014a4e36fea3988389613497cad5a2491ebc380ded4397afc95c32a2bd2734b0386996df76f6c5cbfc6be561262b8d112fb7a27
446446
languageName: node
447447
linkType: hard
448448

449-
"@vitest/pretty-format@npm:^3.0.5":
450-
version: 3.0.7
451-
resolution: "@vitest/pretty-format@npm:3.0.7"
449+
"@vitest/runner@npm:3.0.9":
450+
version: 3.0.9
451+
resolution: "@vitest/runner@npm:3.0.9"
452452
dependencies:
453-
tinyrainbow: "npm:^2.0.0"
454-
checksum: 10/700479370765a8db24403e9abda808397c137873244531f50d91c9fc6434299b416f6742e0d6512e8a0c5786dad676f17091584f3f48bfce5c2ccb7cec1f4f64
455-
languageName: node
456-
linkType: hard
457-
458-
"@vitest/runner@npm:3.0.5":
459-
version: 3.0.5
460-
resolution: "@vitest/runner@npm:3.0.5"
461-
dependencies:
462-
"@vitest/utils": "npm:3.0.5"
463-
pathe: "npm:^2.0.2"
464-
checksum: 10/7aedf5d445aec3da83790cc94e135f64a1c407e437276694ca5a0567db055f49481b2622ab24faabb4482a1829d18dbc5cae31738b5a015669651cda8e0e7238
453+
"@vitest/utils": "npm:3.0.9"
454+
pathe: "npm:^2.0.3"
455+
checksum: 10/67036d3c5053aab8f2c7eb36c65a850cdc8dc395e5b27913417f39bfde82140eaf1c07204bda5809b8c44306fb0bedade2735c4f21026c2797fe4b562f47a812
465456
languageName: node
466457
linkType: hard
467458

468-
"@vitest/snapshot@npm:3.0.5":
469-
version: 3.0.5
470-
resolution: "@vitest/snapshot@npm:3.0.5"
459+
"@vitest/snapshot@npm:3.0.9":
460+
version: 3.0.9
461+
resolution: "@vitest/snapshot@npm:3.0.9"
471462
dependencies:
472-
"@vitest/pretty-format": "npm:3.0.5"
463+
"@vitest/pretty-format": "npm:3.0.9"
473464
magic-string: "npm:^0.30.17"
474-
pathe: "npm:^2.0.2"
475-
checksum: 10/3c6a3165556dc4a3fc50c9532dc047b5bf57df1bbad657ca7e34ca65e9aeb61740a0eaebe9eb6200a30d92f457a402ce3d22b21700a1763a5ec4bddf81733709
465+
pathe: "npm:^2.0.3"
466+
checksum: 10/367c9390e7170b965494aff09dd69d7f678ad676d79a36c651a6237984290de53839de1a2bf5a60a6e5457a012a5f92b24298957d609705bc2d06fb5c21703aa
476467
languageName: node
477468
linkType: hard
478469

479-
"@vitest/spy@npm:3.0.5":
480-
version: 3.0.5
481-
resolution: "@vitest/spy@npm:3.0.5"
470+
"@vitest/spy@npm:3.0.9":
471+
version: 3.0.9
472+
resolution: "@vitest/spy@npm:3.0.9"
482473
dependencies:
483474
tinyspy: "npm:^3.0.2"
484-
checksum: 10/ed85319cd03f3f35121e84ce31721316daf94a7c01d493dff746ff5469d12e40b218cc728d57c5a71612c5a3882e8e66d9cefe82b82c2044d5f257954ec7e9d8
475+
checksum: 10/967b403293c9325292be4843753bf8ae516ec158df2372a14bec98c9bfb233fa6bbf76cb319cf1a9ea1b5ab795e3abff68ca66fa7523045562d7449a95ed8bf9
485476
languageName: node
486477
linkType: hard
487478

488-
"@vitest/utils@npm:3.0.5":
489-
version: 3.0.5
490-
resolution: "@vitest/utils@npm:3.0.5"
479+
"@vitest/utils@npm:3.0.9":
480+
version: 3.0.9
481+
resolution: "@vitest/utils@npm:3.0.9"
491482
dependencies:
492-
"@vitest/pretty-format": "npm:3.0.5"
493-
loupe: "npm:^3.1.2"
483+
"@vitest/pretty-format": "npm:3.0.9"
484+
loupe: "npm:^3.1.3"
494485
tinyrainbow: "npm:^2.0.0"
495-
checksum: 10/4e85a7514592df63870eb4ec27c434034cc91c9e63c052bcb2304c4cc2f4fbb49350099280480313e93526247d020b42bea52436cf7f93fee0bd98cfac51a644
486+
checksum: 10/c77e2a4a5c62dabc57c0d27536428e6b4f9a7998b59161deb82cf797e1d6cb61a7531bef19f079c4bdca7b48fd656b48e4d1bcfb4a5bdf3c177931670a287163
496487
languageName: node
497488
linkType: hard
498489

@@ -596,7 +587,7 @@ __metadata:
596587
languageName: node
597588
linkType: hard
598589

599-
"chai@npm:^5.1.2":
590+
"chai@npm:^5.2.0":
600591
version: 5.2.0
601592
resolution: "chai@npm:5.2.0"
602593
dependencies:
@@ -991,11 +982,11 @@ __metadata:
991982
"@algolia/client-composition": "link:../../../clients/algoliasearch-client-javascript/packages/client-composition"
992983
"@algolia/composition": "link:../../../clients/algoliasearch-client-javascript/packages/composition"
993984
"@algolia/requester-testing": "link:../../../clients/algoliasearch-client-javascript/packages/requester-testing"
994-
"@types/node": "npm:22.13.1"
985+
"@types/node": "npm:22.13.11"
995986
algoliasearch: "link:../../../clients/algoliasearch-client-javascript/packages/algoliasearch"
996987
dotenv: "npm:16.4.7"
997988
typescript: "npm:5.7.3"
998-
vitest: "npm:3.0.5"
989+
vitest: "npm:3.0.9"
999990
languageName: unknown
1000991
linkType: soft
1001992

@@ -1006,7 +997,7 @@ __metadata:
1006997
languageName: node
1007998
linkType: hard
1008999

1009-
"loupe@npm:^3.1.0, loupe@npm:^3.1.2":
1000+
"loupe@npm:^3.1.0, loupe@npm:^3.1.3":
10101001
version: 3.1.3
10111002
resolution: "loupe@npm:3.1.3"
10121003
checksum: 10/9e98c34daf0eba48ccc603595e51f2ae002110982d84879cf78c51de2c632f0c571dfe82ce4210af60c32203d06b443465c269bda925076fe6d9b612cc65c321
@@ -1228,7 +1219,7 @@ __metadata:
12281219
languageName: node
12291220
linkType: hard
12301221

1231-
"pathe@npm:^2.0.2":
1222+
"pathe@npm:^2.0.3":
12321223
version: 2.0.3
12331224
resolution: "pathe@npm:2.0.3"
12341225
checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d
@@ -1612,18 +1603,18 @@ __metadata:
16121603
languageName: node
16131604
linkType: hard
16141605

1615-
"vite-node@npm:3.0.5":
1616-
version: 3.0.5
1617-
resolution: "vite-node@npm:3.0.5"
1606+
"vite-node@npm:3.0.9":
1607+
version: 3.0.9
1608+
resolution: "vite-node@npm:3.0.9"
16181609
dependencies:
16191610
cac: "npm:^6.7.14"
16201611
debug: "npm:^4.4.0"
16211612
es-module-lexer: "npm:^1.6.0"
1622-
pathe: "npm:^2.0.2"
1613+
pathe: "npm:^2.0.3"
16231614
vite: "npm:^5.0.0 || ^6.0.0"
16241615
bin:
16251616
vite-node: vite-node.mjs
1626-
checksum: 10/804d3a4a794f9fa7d5c7b433e96b0813eee39b8c0d4da5c8fe28c9a2aa226702ec711e272a66a5208944f26a35e46d931fc09b1404b04db1cf607f58af1baf6b
1617+
checksum: 10/2ea7f6d15c0776509aa4055a2dab65833d434364fd43a66c294912618867f715f48f27e1a91156045503b3169462519617fbf0d78239ebd8ea4333794dbf0a18
16271618
languageName: node
16281619
linkType: hard
16291620

@@ -1679,36 +1670,36 @@ __metadata:
16791670
languageName: node
16801671
linkType: hard
16811672

1682-
"vitest@npm:3.0.5":
1683-
version: 3.0.5
1684-
resolution: "vitest@npm:3.0.5"
1673+
"vitest@npm:3.0.9":
1674+
version: 3.0.9
1675+
resolution: "vitest@npm:3.0.9"
16851676
dependencies:
1686-
"@vitest/expect": "npm:3.0.5"
1687-
"@vitest/mocker": "npm:3.0.5"
1688-
"@vitest/pretty-format": "npm:^3.0.5"
1689-
"@vitest/runner": "npm:3.0.5"
1690-
"@vitest/snapshot": "npm:3.0.5"
1691-
"@vitest/spy": "npm:3.0.5"
1692-
"@vitest/utils": "npm:3.0.5"
1693-
chai: "npm:^5.1.2"
1677+
"@vitest/expect": "npm:3.0.9"
1678+
"@vitest/mocker": "npm:3.0.9"
1679+
"@vitest/pretty-format": "npm:^3.0.9"
1680+
"@vitest/runner": "npm:3.0.9"
1681+
"@vitest/snapshot": "npm:3.0.9"
1682+
"@vitest/spy": "npm:3.0.9"
1683+
"@vitest/utils": "npm:3.0.9"
1684+
chai: "npm:^5.2.0"
16941685
debug: "npm:^4.4.0"
16951686
expect-type: "npm:^1.1.0"
16961687
magic-string: "npm:^0.30.17"
1697-
pathe: "npm:^2.0.2"
1688+
pathe: "npm:^2.0.3"
16981689
std-env: "npm:^3.8.0"
16991690
tinybench: "npm:^2.9.0"
17001691
tinyexec: "npm:^0.3.2"
17011692
tinypool: "npm:^1.0.2"
17021693
tinyrainbow: "npm:^2.0.0"
17031694
vite: "npm:^5.0.0 || ^6.0.0"
1704-
vite-node: "npm:3.0.5"
1695+
vite-node: "npm:3.0.9"
17051696
why-is-node-running: "npm:^2.3.0"
17061697
peerDependencies:
17071698
"@edge-runtime/vm": "*"
17081699
"@types/debug": ^4.1.12
17091700
"@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0
1710-
"@vitest/browser": 3.0.5
1711-
"@vitest/ui": 3.0.5
1701+
"@vitest/browser": 3.0.9
1702+
"@vitest/ui": 3.0.9
17121703
happy-dom: "*"
17131704
jsdom: "*"
17141705
peerDependenciesMeta:
@@ -1728,7 +1719,7 @@ __metadata:
17281719
optional: true
17291720
bin:
17301721
vitest: vitest.mjs
1731-
checksum: 10/63bf6474d314e0694489d23236a6aebd4f2173b40e47f861824668fe4b3dde5b6b95d30134acc7b1a0694c0b82b4996deb7ebc7c0ae62cb58823ff51cdcadbe1
1722+
checksum: 10/fdecd56e6bdf145ca433c38572bf3b94adcfb59408fa140aa40d887cedc0b9d859b3f1095e1d06beef3ba9efcf7763aa9614d17fe755ebf3b2956ba0af3a067c
17321723
languageName: node
17331724
linkType: hard
17341725

‎yarn.lock

+7
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ __metadata:
148148
languageName: node
149149
linkType: soft
150150

151+
"@algolia/client-realtime-personalization@link:../../../clients/algoliasearch-client-javascript/packages/client-realtime-personalization::locator=javascript-playground%40workspace%3Aplayground%2Fjavascript%2Fnode":
152+
version: 0.0.0-use.local
153+
resolution: "@algolia/client-realtime-personalization@link:../../../clients/algoliasearch-client-javascript/packages/client-realtime-personalization::locator=javascript-playground%40workspace%3Aplayground%2Fjavascript%2Fnode"
154+
languageName: node
155+
linkType: soft
156+
151157
"@algolia/client-search@link:../../../clients/algoliasearch-client-javascript/packages/client-search::locator=javascript-playground%40workspace%3Aplayground%2Fjavascript%2Fnode":
152158
version: 0.0.0-use.local
153159
resolution: "@algolia/client-search@link:../../../clients/algoliasearch-client-javascript/packages/client-search::locator=javascript-playground%40workspace%3Aplayground%2Fjavascript%2Fnode"
@@ -5478,6 +5484,7 @@ __metadata:
54785484
"@algolia/client-insights": "link:../../../clients/algoliasearch-client-javascript/packages/client-insights"
54795485
"@algolia/client-personalization": "link:../../../clients/algoliasearch-client-javascript/packages/client-personalization"
54805486
"@algolia/client-query-suggestions": "link:../../../clients/algoliasearch-client-javascript/packages/client-query-suggestions"
5487+
"@algolia/client-realtime-personalization": "link:../../../clients/algoliasearch-client-javascript/packages/client-realtime-personalization"
54815488
"@algolia/client-search": "link:../../../clients/algoliasearch-client-javascript/packages/client-search"
54825489
"@algolia/composition": "link:../../../clients/algoliasearch-client-javascript/packages/composition"
54835490
"@algolia/ingestion": "link:../../../clients/algoliasearch-client-javascript/packages/ingestion"

0 commit comments

Comments
 (0)
Please sign in to comment.