From 47c9a0a59bd15b051945f106b9e7ea35457acab2 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Mon, 2 Jun 2025 08:57:36 +0200 Subject: [PATCH 1/2] feat(clients): add generic parameter --- .../codegen/utils/GenericPropagator.java | 12 ++ specs/search/paths/objects/objects.yml | 1 + .../javascript/clients/api-single.mustache | 2 +- .../client/api/operation/parameters.mustache | 2 +- .../client/model/clientMethodProps.mustache | 8 +- tests/output/javascript/yarn.lock | 122 +++++++++--------- 6 files changed, 80 insertions(+), 67 deletions(-) diff --git a/generators/src/main/java/com/algolia/codegen/utils/GenericPropagator.java b/generators/src/main/java/com/algolia/codegen/utils/GenericPropagator.java index 5b145c938ba..13c65eb76db 100644 --- a/generators/src/main/java/com/algolia/codegen/utils/GenericPropagator.java +++ b/generators/src/main/java/com/algolia/codegen/utils/GenericPropagator.java @@ -39,6 +39,10 @@ private static void setHasChildGeneric(IJsonSchemaValidationProperties property) setVendorExtension(property, "x-has-child-generic", true); } + private static void setHasGenericParameter(CodegenOperation ope) { + ope.vendorExtensions.put("x-has-generic-parameter", true); + } + /** * @return true if the vendor extensions of the property contains either x-propagated-generic or * x-has-child-generic @@ -224,9 +228,17 @@ public static void propagateGenericsToOperations(OperationsMap operations, List< public static void propagateGenericsToOperations(String language, String client, OperationsMap operations, List allModels) { Map models = convertToMap(language, client, allModels); for (CodegenOperation ope : operations.getOperations().getOperation()) { + for (CodegenParameter param : ope.requiredParams) { + if (param.vendorExtensions.containsKey("x-is-generic")) { + setHasGenericParameter(ope); + break; + } + } + if (ope.returnType == null) { continue; } + CodegenModel returnType = models.get(ope.returnType); if (returnType != null && hasGeneric(returnType)) { ope.vendorExtensions.put("x-is-generic", true); diff --git a/specs/search/paths/objects/objects.yml b/specs/search/paths/objects/objects.yml index 23dd01a01e5..4429b5d8b74 100644 --- a/specs/search/paths/objects/objects.yml +++ b/specs/search/paths/objects/objects.yml @@ -23,6 +23,7 @@ post: requestBody: required: true description: The record. A schemaless object with attributes that are useful in the context of search and discovery. + x-is-generic: true content: application/json: schema: diff --git a/templates/javascript/clients/api-single.mustache b/templates/javascript/clients/api-single.mustache index ae8a3babe75..19951d05540 100644 --- a/templates/javascript/clients/api-single.mustache +++ b/templates/javascript/clients/api-single.mustache @@ -101,7 +101,7 @@ export function create{{#lambda.titlecase}}{{clientName}}{{/lambda.titlecase}}({ {{/isCompositionFullClient}} {{#operation}} {{> client/api/operation/jsdoc}} - {{nickname}}{{#vendorExtensions.x-is-generic}}{{/vendorExtensions.x-is-generic}}( {{> client/api/operation/parameters}} ) : Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}{{#vendorExtensions.x-is-generic}}{{/vendorExtensions.x-is-generic}}> { + {{nickname}}{{#vendorExtensions.x-is-generic}}{{/vendorExtensions.x-is-generic}}{{#vendorExtensions.x-has-generic-parameter}}{{/vendorExtensions.x-has-generic-parameter}}( {{> client/api/operation/parameters}} ) : Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}{{#vendorExtensions.x-is-generic}}{{/vendorExtensions.x-is-generic}}> { {{#vendorExtensions.x-legacy-signature}} {{> client/api/operation/legacySearchCompatible/implementation}} {{/vendorExtensions.x-legacy-signature}} diff --git a/templates/javascript/clients/client/api/operation/parameters.mustache b/templates/javascript/clients/client/api/operation/parameters.mustache index 68a1190a6c8..523892e5cd5 100644 --- a/templates/javascript/clients/client/api/operation/parameters.mustache +++ b/templates/javascript/clients/client/api/operation/parameters.mustache @@ -1,6 +1,6 @@ {{#vendorExtensions}} {{#x-create-wrapping-object}} - { {{#allParams}}{{paramName}}, {{/allParams}} }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props{{^hasRequiredParams}} = {}{{/hasRequiredParams}}, + { {{#allParams}}{{paramName}}, {{/allParams}} }: {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props{{#x-has-generic-parameter}}{{/x-has-generic-parameter}}{{^hasRequiredParams}} = {}{{/hasRequiredParams}}, {{/x-create-wrapping-object}} {{#x-is-single-body-param}} {{#bodyParams}} diff --git a/templates/javascript/clients/client/model/clientMethodProps.mustache b/templates/javascript/clients/client/model/clientMethodProps.mustache index 0f836419967..43a490a3b72 100644 --- a/templates/javascript/clients/client/model/clientMethodProps.mustache +++ b/templates/javascript/clients/client/model/clientMethodProps.mustache @@ -24,16 +24,16 @@ import type { CreateIterablePromise } from '@algolia/client-common'; {{#vendorExtensions}} {{#x-create-wrapping-object}} /** - * Properties for the `{{nickname}}` method. + * Properties for the `{{nickname}}` method. {{{x-has-generic-parameter}}} */ -export type {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props = { +export type {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props{{#x-has-generic-parameter}}>{{/x-has-generic-parameter}} = { {{#allParams}} {{#description}} /** * {{{description}}} */ {{/description}} - {{paramName}}{{^required}}?{{/required}}: {{{dataType}}}; + {{paramName}}{{^required}}?{{/required}}: {{#vendorExtensions.x-is-generic}}T{{/vendorExtensions.x-is-generic}}{{^vendorExtensions.x-is-generic}}{{{dataType}}}{{/vendorExtensions.x-is-generic}}; {{/allParams}} } {{/x-create-wrapping-object}} @@ -237,4 +237,4 @@ export type WaitForCompositionTaskOptions = { }; {{/isCompositionFullClient}} -{{/apiInfo.apis.0}} \ No newline at end of file +{{/apiInfo.apis.0}} diff --git a/tests/output/javascript/yarn.lock b/tests/output/javascript/yarn.lock index 4af7fc031b3..7561101e38a 100644 --- a/tests/output/javascript/yarn.lock +++ b/tests/output/javascript/yarn.lock @@ -404,32 +404,32 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.15.3": - version: 22.15.3 - resolution: "@types/node@npm:22.15.3" +"@types/node@npm:22.15.21": + version: 22.15.21 + resolution: "@types/node@npm:22.15.21" dependencies: undici-types: "npm:~6.21.0" - checksum: 10/6b4ff03c36598432b419980f828281aa16383e2de6eb61f73275495ef8d2cbf8cb5607659b4cae5ff8b2b2ff69913ea07ffcc0be029e4280b6e8bc138dc6629b + checksum: 10/cb4189587cca445bfb8166c0ed39f9344d743f37f3da892f2999a99bbabda45dc773237e61ecb7d1dc83dd95718cb1b5715b0be5dd7953565b19019e36a7cf39 languageName: node linkType: hard -"@vitest/expect@npm:3.1.2": - version: 3.1.2 - resolution: "@vitest/expect@npm:3.1.2" +"@vitest/expect@npm:3.1.4": + version: 3.1.4 + resolution: "@vitest/expect@npm:3.1.4" dependencies: - "@vitest/spy": "npm:3.1.2" - "@vitest/utils": "npm:3.1.2" + "@vitest/spy": "npm:3.1.4" + "@vitest/utils": "npm:3.1.4" chai: "npm:^5.2.0" tinyrainbow: "npm:^2.0.0" - checksum: 10/3c414e376154c8095f40efe409bb5f2c9380ba05a15b20552ee2e29f73197ab73068177e3da298ac135ef72673d1ea92090c466c78443ee69a7438bc8ab65f4f + checksum: 10/2d438562fd75ee64f0506a785f9825962f765889e63179e6d64cad338ff8fb0466bafaec9e94e6dea814ebf7287209f605ce49e4cf487610d98ccba61fee061b languageName: node linkType: hard -"@vitest/mocker@npm:3.1.2": - version: 3.1.2 - resolution: "@vitest/mocker@npm:3.1.2" +"@vitest/mocker@npm:3.1.4": + version: 3.1.4 + resolution: "@vitest/mocker@npm:3.1.4" dependencies: - "@vitest/spy": "npm:3.1.2" + "@vitest/spy": "npm:3.1.4" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.17" peerDependencies: @@ -440,57 +440,57 @@ __metadata: optional: true vite: optional: true - checksum: 10/e6d730400daa7a97fb277159733df1366a932b5b06ac83d72e094e5383191c2597b4a5ae3538b28de6112b9e5d314cb50b44e031e79522f43f3dfc8ab022a584 + checksum: 10/1e50441da229ea4999aa686669fda1cc03bcfd93162a42f7660b6e5897b6e6e2e31f54a2028c6d5510fda552ff7c27cef88fecb7efee937df28a670e59c36ca4 languageName: node linkType: hard -"@vitest/pretty-format@npm:3.1.2, @vitest/pretty-format@npm:^3.1.2": - version: 3.1.2 - resolution: "@vitest/pretty-format@npm:3.1.2" +"@vitest/pretty-format@npm:3.1.4, @vitest/pretty-format@npm:^3.1.4": + version: 3.1.4 + resolution: "@vitest/pretty-format@npm:3.1.4" dependencies: tinyrainbow: "npm:^2.0.0" - checksum: 10/454d0a8c250dbe52f7ec9dab4968e7c769fa10c8318eb5c54cb4b6d5b524772c04856e1990279f2c6e76705ffa107fddcbc1973560ed3b88167c231ccfeada16 + checksum: 10/d8c831410d2cc755d899f31a5f7298ad336f4cddc3115d7da5174595098144a3282eee89a54fb05c6592d408bf4a86e66fa5636c9304816a6557b833d0f98748 languageName: node linkType: hard -"@vitest/runner@npm:3.1.2": - version: 3.1.2 - resolution: "@vitest/runner@npm:3.1.2" +"@vitest/runner@npm:3.1.4": + version: 3.1.4 + resolution: "@vitest/runner@npm:3.1.4" dependencies: - "@vitest/utils": "npm:3.1.2" + "@vitest/utils": "npm:3.1.4" pathe: "npm:^2.0.3" - checksum: 10/b09c1ff3a556f318585307e6bb8954d219d0d35d1e17708fdd5d5ae1a230e6f29eba4f37a86faa71192f72406bb96b576c1b620d49d686def87bc5dcb8bf5737 + checksum: 10/45307642d00f28cbd9f196d55238aeac6d2024de9503a66c120981a0acfa43dcb06a00fbf7f06388f26c8bd5e1ed70fa59514e1644f7ec2f4c770f67666e3c0e languageName: node linkType: hard -"@vitest/snapshot@npm:3.1.2": - version: 3.1.2 - resolution: "@vitest/snapshot@npm:3.1.2" +"@vitest/snapshot@npm:3.1.4": + version: 3.1.4 + resolution: "@vitest/snapshot@npm:3.1.4" dependencies: - "@vitest/pretty-format": "npm:3.1.2" + "@vitest/pretty-format": "npm:3.1.4" magic-string: "npm:^0.30.17" pathe: "npm:^2.0.3" - checksum: 10/dda969b697bdcd8616f17e98c74ad5e95a5f3c2284140aa72390ce668db34e70936ee0b8ebe89adb2e0dea332500689d54c8ff03f8adf1e00be70639ec9032bf + checksum: 10/f307f7a7572a76c20287efb474543021751107e41f069c34f9a90be8d9196ead3182ca41fb0a5f2879c753e341727ab6cbbb3a7cbb1fd7551cb110458359b475 languageName: node linkType: hard -"@vitest/spy@npm:3.1.2": - version: 3.1.2 - resolution: "@vitest/spy@npm:3.1.2" +"@vitest/spy@npm:3.1.4": + version: 3.1.4 + resolution: "@vitest/spy@npm:3.1.4" dependencies: tinyspy: "npm:^3.0.2" - checksum: 10/c2c638368fa4130f903901fdf4e86da6f90d5d6a8cf7ce880cdd24768a1f8e6b726ea3428501c97e00c34ac2e8e39ac09b3a03606dffd8081559e0a35c892ddc + checksum: 10/e883766dbe8f07f371cc434e10bf50b66d2a31eab37bb9e12ad93b5a1e7e753543cdf2fbee9c0168c574cb6e9f8001871bc9dee45721cbeb370cabad1b8d08a5 languageName: node linkType: hard -"@vitest/utils@npm:3.1.2": - version: 3.1.2 - resolution: "@vitest/utils@npm:3.1.2" +"@vitest/utils@npm:3.1.4": + version: 3.1.4 + resolution: "@vitest/utils@npm:3.1.4" dependencies: - "@vitest/pretty-format": "npm:3.1.2" + "@vitest/pretty-format": "npm:3.1.4" loupe: "npm:^3.1.3" tinyrainbow: "npm:^2.0.0" - checksum: 10/221faaaf6c69ef24eacdcf68581c833cb99bf3e5125945b5dec928af7ef1af4359aa520b90c42413a128b308037bf3217d8c41a41f44ca4aee3ac44e3f0d56b5 + checksum: 10/221d9d7dfc41e1c16521e4d998e2980b4a731b38172ba103eb70489eaaff149d479108a21a6f79118885ca2c10e51fbcae5a24e00f7459139dbfbcec39171b10 languageName: node linkType: hard @@ -718,7 +718,7 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.6.0": +"es-module-lexer@npm:^1.7.0": version: 1.7.0 resolution: "es-module-lexer@npm:1.7.0" checksum: 10/b6f3e576a3fed4d82b0d0ad4bbf6b3a5ad694d2e7ce8c4a069560da3db6399381eaba703616a182b16dde50ce998af64e07dcf49f2ae48153b9e07be3f107087 @@ -1001,11 +1001,11 @@ __metadata: "@algolia/client-composition": "link:../../../clients/algoliasearch-client-javascript/packages/client-composition" "@algolia/composition": "link:../../../clients/algoliasearch-client-javascript/packages/composition" "@algolia/requester-testing": "link:../../../clients/algoliasearch-client-javascript/packages/requester-testing" - "@types/node": "npm:22.15.3" + "@types/node": "npm:22.15.21" algoliasearch: "link:../../../clients/algoliasearch-client-javascript/packages/algoliasearch" dotenv: "npm:16.5.0" typescript: "npm:5.8.3" - vitest: "npm:3.1.2" + vitest: "npm:3.1.4" languageName: unknown linkType: soft @@ -1630,18 +1630,18 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:3.1.2": - version: 3.1.2 - resolution: "vite-node@npm:3.1.2" +"vite-node@npm:3.1.4": + version: 3.1.4 + resolution: "vite-node@npm:3.1.4" dependencies: cac: "npm:^6.7.14" debug: "npm:^4.4.0" - es-module-lexer: "npm:^1.6.0" + es-module-lexer: "npm:^1.7.0" pathe: "npm:^2.0.3" vite: "npm:^5.0.0 || ^6.0.0" bin: vite-node: vite-node.mjs - checksum: 10/8af0465810c6f27200dc899792002320995f3d85c432aaa411bf7ff15580c0b93c4a5153d8a93c7af89b496a6e1a7979a7777984e37ebd7311851ea7572eaac7 + checksum: 10/e4c198fe9447b4182b95601249a1e8be183380bbd2875034e8ed741a67895b8ad5c6324d6a6db7d60c2b0372f5209ca046604abfc0a70c04bffef00e5a4f6e19 languageName: node linkType: hard @@ -1700,17 +1700,17 @@ __metadata: languageName: node linkType: hard -"vitest@npm:3.1.2": - version: 3.1.2 - resolution: "vitest@npm:3.1.2" - dependencies: - "@vitest/expect": "npm:3.1.2" - "@vitest/mocker": "npm:3.1.2" - "@vitest/pretty-format": "npm:^3.1.2" - "@vitest/runner": "npm:3.1.2" - "@vitest/snapshot": "npm:3.1.2" - "@vitest/spy": "npm:3.1.2" - "@vitest/utils": "npm:3.1.2" +"vitest@npm:3.1.4": + version: 3.1.4 + resolution: "vitest@npm:3.1.4" + dependencies: + "@vitest/expect": "npm:3.1.4" + "@vitest/mocker": "npm:3.1.4" + "@vitest/pretty-format": "npm:^3.1.4" + "@vitest/runner": "npm:3.1.4" + "@vitest/snapshot": "npm:3.1.4" + "@vitest/spy": "npm:3.1.4" + "@vitest/utils": "npm:3.1.4" chai: "npm:^5.2.0" debug: "npm:^4.4.0" expect-type: "npm:^1.2.1" @@ -1723,14 +1723,14 @@ __metadata: tinypool: "npm:^1.0.2" tinyrainbow: "npm:^2.0.0" vite: "npm:^5.0.0 || ^6.0.0" - vite-node: "npm:3.1.2" + vite-node: "npm:3.1.4" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@types/debug": ^4.1.12 "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - "@vitest/browser": 3.1.2 - "@vitest/ui": 3.1.2 + "@vitest/browser": 3.1.4 + "@vitest/ui": 3.1.4 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -1750,7 +1750,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10/aa5638bf37b2811b01ad8ff0563cdec09202f7a28d9dbcb8eabb2e51cadefc57309cba4f5ff2bac4a72edda44055a844236fc4a09eb72127ef1bd34eb25d0808 + checksum: 10/e30f8df59d3e551c9a104dcf1e9937a0b1c3731072bcfe054a17124689852046b5c44bca0316b6ece0b301225f904709e2b990e8122d5bc7d08327d78785d6ac languageName: node linkType: hard From 4af4736079e435ab98c4383daf82556e5ec49345 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Tue, 3 Jun 2025 13:57:54 +0200 Subject: [PATCH 2/2] playground --- .../cts/tests/ParametersWithDataType.java | 4 + .../javascript/browser/eslint.config.js | 17 +-- playground/javascript/browser/src/App.css | 5 +- playground/javascript/browser/src/App.tsx | 2 +- playground/javascript/browser/src/Panel.tsx | 2 +- playground/javascript/browser/src/main.tsx | 10 +- playground/javascript/browser/vite.config.ts | 6 +- playground/javascript/node/algoliasearch.ts | 23 +++- playground/javascript/node/analytics.ts | 11 +- playground/javascript/node/composition.ts | 5 +- playground/javascript/node/compositionFull.ts | 5 +- playground/javascript/node/search.ts | 23 +++- specs/search/paths/objects/object.yml | 5 + specs/search/paths/objects/objects.yml | 4 + .../javascript/clients/api-single.mustache | 2 +- .../client/model/clientMethodProps.mustache | 6 +- tests/output/javascript/yarn.lock | 122 +++++++++--------- 17 files changed, 145 insertions(+), 107 deletions(-) diff --git a/generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java b/generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java index 0cd8c7ddaa4..9e9b84587cc 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java +++ b/generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java @@ -654,6 +654,10 @@ private void transferPrimitiveData(IJsonSchemaValidationProperties spec, Map , -) +); diff --git a/playground/javascript/browser/vite.config.ts b/playground/javascript/browser/vite.config.ts index 2328e170b0c..26f4e71e6e1 100644 --- a/playground/javascript/browser/vite.config.ts +++ b/playground/javascript/browser/vite.config.ts @@ -1,7 +1,7 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react-swc' +import react from '@vitejs/plugin-react-swc'; +import { defineConfig } from 'vite'; // https://vite.dev/config/ export default defineConfig({ plugins: [react()], -}) +}); diff --git a/playground/javascript/node/algoliasearch.ts b/playground/javascript/node/algoliasearch.ts index 9b69b523119..f61193fcb9d 100644 --- a/playground/javascript/node/algoliasearch.ts +++ b/playground/javascript/node/algoliasearch.ts @@ -16,7 +16,7 @@ async function testAlgoliasearch() { // Init client with appId and apiKey const client = algoliasearch(appId, apiKey); const clientLite = liteClient(appId, apiKey); - + client.addAlgoliaAgent('algoliasearch node playground', '0.0.1'); try { @@ -134,12 +134,21 @@ async function testAlgoliasearch() { async function testAlgoliasearchBridgeIngestion() { // Init client with appId and apiKey - const client = algoliasearch(appId, adminApiKey, { transformation: { region: 'eu'}}); - - await client.saveObjectsWithTransformation({indexName: "foo", objects: [{objectID: "foo", data: {baz: "baz", win: 42}}], waitForTasks: true }) - - await client.partialUpdateObjectsWithTransformation({indexName: "foo", objects: [{objectID: "foo", data: {baz: "baz", win: 42}}], waitForTasks: true, createIfNotExists: false }) + const client = algoliasearch(appId, adminApiKey, { transformation: { region: 'eu' } }); + + await client.saveObjectsWithTransformation({ + indexName: 'foo', + objects: [{ objectID: 'foo', data: { baz: 'baz', win: 42 } }], + waitForTasks: true, + }); + + await client.partialUpdateObjectsWithTransformation({ + indexName: 'foo', + objects: [{ objectID: 'foo', data: { baz: 'baz', win: 42 } }], + waitForTasks: true, + createIfNotExists: false, + }); } // testAlgoliasearch(); -testAlgoliasearchBridgeIngestion() +testAlgoliasearchBridgeIngestion(); diff --git a/playground/javascript/node/analytics.ts b/playground/javascript/node/analytics.ts index 5a18da03aa2..af2c95d7607 100644 --- a/playground/javascript/node/analytics.ts +++ b/playground/javascript/node/analytics.ts @@ -11,10 +11,13 @@ const client = analyticsClient(appId, apiKey, 'de'); async function testAnalytics() { try { - const res = await client.getTopFilterForAttribute({ - attribute: 'myAttribute1,myAttribute2', - index: analyticsIndex, - }, {timeouts: {read:20000, write: 30000}}); + const res = await client.getTopFilterForAttribute( + { + attribute: 'myAttribute1,myAttribute2', + index: analyticsIndex, + }, + { timeouts: { read: 20000, write: 30000 } }, + ); console.log(`[OK]`, res); } catch (e) { diff --git a/playground/javascript/node/composition.ts b/playground/javascript/node/composition.ts index 71320fff8b4..30ca7851397 100644 --- a/playground/javascript/node/composition.ts +++ b/playground/javascript/node/composition.ts @@ -9,7 +9,7 @@ const client = compositionClient(appId, apiKey); async function testComposition() { try { - console.log(appId, apiKey) + console.log(appId, apiKey); // create a new composition // const res = await client.multipleBatch({ // requests: [ @@ -36,8 +36,7 @@ async function testComposition() { // }); // console.log(`[OK]`, res); - console.log(await client.search({ compositionID: 'id1', requestBody: {} })) - + console.log(await client.search({ compositionID: 'id1', requestBody: {} })); } catch (e) { if (e instanceof ApiError) { return console.log(`[${e.status}] ${e.message}`, e.stackTrace, e); diff --git a/playground/javascript/node/compositionFull.ts b/playground/javascript/node/compositionFull.ts index 8aba1975b13..decd199da7c 100644 --- a/playground/javascript/node/compositionFull.ts +++ b/playground/javascript/node/compositionFull.ts @@ -9,7 +9,7 @@ const client = compositionClient(appId, apiKey); async function testComposition() { try { - console.log(appId, apiKey) + console.log(appId, apiKey); // create a new composition // const res = await client.multipleBatch({ // requests: [ @@ -36,8 +36,7 @@ async function testComposition() { // }); // console.log(`[OK]`, res); - console.log(await client.listCompositions()) - + console.log(await client.listCompositions()); } catch (e) { if (e instanceof ApiError) { return console.log(`[${e.status}] ${e.message}`, e.stackTrace, e); diff --git a/playground/javascript/node/search.ts b/playground/javascript/node/search.ts index fd0bc7d1b37..c150553cd3c 100644 --- a/playground/javascript/node/search.ts +++ b/playground/javascript/node/search.ts @@ -1,5 +1,6 @@ import { ApiError } from '@algolia/client-common'; -import { apiClientVersion, searchClient, SearchQuery } from '@algolia/client-search'; +import type { SearchQuery } from '@algolia/client-search'; +import { apiClientVersion, searchClient } from '@algolia/client-search'; const appId = process.env.ALGOLIA_APPLICATION_ID || '**** APP_ID *****'; const apiKey = process.env.ALGOLIA_ADMIN_KEY || '**** SEARCH_API_KEY *****'; @@ -15,15 +16,31 @@ client.addAlgoliaAgent('Node playground', '0.0.1'); const requests: SearchQuery[] = [{ indexName: searchIndex, query: searchQuery }]; console.log('version', apiClientVersion, 'requests', requests); +interface Animal { + name: string; + age: number; + objectID: string; +} + async function testSearch() { try { const req = await client.setSettings({ indexName: 'theIndexName', indexSettings: { distinct: true }, - }) - + }); console.log(`[OK]`, req); + + const a: Animal = { + name: 'Dog', + age: 5, + objectID: 'dog-123', + }; + + const ssss = await client.saveObject({ + indexName: 'theIndexName', + body: a, + }); } catch (e: any) { // Instance of if (e instanceof ApiError) { diff --git a/specs/search/paths/objects/object.yml b/specs/search/paths/objects/object.yml index 193a622bc4e..602e778faea 100644 --- a/specs/search/paths/objects/object.yml +++ b/specs/search/paths/objects/object.yml @@ -64,10 +64,15 @@ put: requestBody: required: true description: The record. A schemaless object with attributes that are useful in the context of search and discovery. + x-is-generic: true content: application/json: schema: type: object + example: + objectID: blackTShirt + name: Black T-shirt + color: '#000000' responses: '200': $ref: '../../../common/responses/UpdatedAtWithObjectId.yml' diff --git a/specs/search/paths/objects/objects.yml b/specs/search/paths/objects/objects.yml index 4429b5d8b74..9d7eda2385f 100644 --- a/specs/search/paths/objects/objects.yml +++ b/specs/search/paths/objects/objects.yml @@ -28,6 +28,10 @@ post: application/json: schema: type: object + example: + objectID: blackTShirt + name: Black T-shirt + color: '#000000' responses: '201': description: Created diff --git a/templates/javascript/clients/api-single.mustache b/templates/javascript/clients/api-single.mustache index 19951d05540..5062c57cd56 100644 --- a/templates/javascript/clients/api-single.mustache +++ b/templates/javascript/clients/api-single.mustache @@ -101,7 +101,7 @@ export function create{{#lambda.titlecase}}{{clientName}}{{/lambda.titlecase}}({ {{/isCompositionFullClient}} {{#operation}} {{> client/api/operation/jsdoc}} - {{nickname}}{{#vendorExtensions.x-is-generic}}{{/vendorExtensions.x-is-generic}}{{#vendorExtensions.x-has-generic-parameter}}{{/vendorExtensions.x-has-generic-parameter}}( {{> client/api/operation/parameters}} ) : Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}{{#vendorExtensions.x-is-generic}}{{/vendorExtensions.x-is-generic}}> { + {{nickname}}{{#vendorExtensions.x-is-generic}}{{/vendorExtensions.x-is-generic}}{{#vendorExtensions.x-has-generic-parameter}}{{/vendorExtensions.x-has-generic-parameter}}( {{> client/api/operation/parameters}} ) : Promise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}{{#vendorExtensions.x-is-generic}}{{/vendorExtensions.x-is-generic}}> { {{#vendorExtensions.x-legacy-signature}} {{> client/api/operation/legacySearchCompatible/implementation}} {{/vendorExtensions.x-legacy-signature}} diff --git a/templates/javascript/clients/client/model/clientMethodProps.mustache b/templates/javascript/clients/client/model/clientMethodProps.mustache index 43a490a3b72..904c463d167 100644 --- a/templates/javascript/clients/client/model/clientMethodProps.mustache +++ b/templates/javascript/clients/client/model/clientMethodProps.mustache @@ -24,9 +24,9 @@ import type { CreateIterablePromise } from '@algolia/client-common'; {{#vendorExtensions}} {{#x-create-wrapping-object}} /** - * Properties for the `{{nickname}}` method. {{{x-has-generic-parameter}}} + * Properties for the `{{nickname}}` method. */ -export type {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props{{#x-has-generic-parameter}}>{{/x-has-generic-parameter}} = { +export type {{#lambda.titlecase}}{{nickname}}{{/lambda.titlecase}}Props{{#x-has-generic-parameter}}{{/x-has-generic-parameter}} = { {{#allParams}} {{#description}} /** @@ -237,4 +237,4 @@ export type WaitForCompositionTaskOptions = { }; {{/isCompositionFullClient}} -{{/apiInfo.apis.0}} +{{/apiInfo.apis.0}} \ No newline at end of file diff --git a/tests/output/javascript/yarn.lock b/tests/output/javascript/yarn.lock index 7561101e38a..4af7fc031b3 100644 --- a/tests/output/javascript/yarn.lock +++ b/tests/output/javascript/yarn.lock @@ -404,32 +404,32 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:22.15.21": - version: 22.15.21 - resolution: "@types/node@npm:22.15.21" +"@types/node@npm:22.15.3": + version: 22.15.3 + resolution: "@types/node@npm:22.15.3" dependencies: undici-types: "npm:~6.21.0" - checksum: 10/cb4189587cca445bfb8166c0ed39f9344d743f37f3da892f2999a99bbabda45dc773237e61ecb7d1dc83dd95718cb1b5715b0be5dd7953565b19019e36a7cf39 + checksum: 10/6b4ff03c36598432b419980f828281aa16383e2de6eb61f73275495ef8d2cbf8cb5607659b4cae5ff8b2b2ff69913ea07ffcc0be029e4280b6e8bc138dc6629b languageName: node linkType: hard -"@vitest/expect@npm:3.1.4": - version: 3.1.4 - resolution: "@vitest/expect@npm:3.1.4" +"@vitest/expect@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/expect@npm:3.1.2" dependencies: - "@vitest/spy": "npm:3.1.4" - "@vitest/utils": "npm:3.1.4" + "@vitest/spy": "npm:3.1.2" + "@vitest/utils": "npm:3.1.2" chai: "npm:^5.2.0" tinyrainbow: "npm:^2.0.0" - checksum: 10/2d438562fd75ee64f0506a785f9825962f765889e63179e6d64cad338ff8fb0466bafaec9e94e6dea814ebf7287209f605ce49e4cf487610d98ccba61fee061b + checksum: 10/3c414e376154c8095f40efe409bb5f2c9380ba05a15b20552ee2e29f73197ab73068177e3da298ac135ef72673d1ea92090c466c78443ee69a7438bc8ab65f4f languageName: node linkType: hard -"@vitest/mocker@npm:3.1.4": - version: 3.1.4 - resolution: "@vitest/mocker@npm:3.1.4" +"@vitest/mocker@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/mocker@npm:3.1.2" dependencies: - "@vitest/spy": "npm:3.1.4" + "@vitest/spy": "npm:3.1.2" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.17" peerDependencies: @@ -440,57 +440,57 @@ __metadata: optional: true vite: optional: true - checksum: 10/1e50441da229ea4999aa686669fda1cc03bcfd93162a42f7660b6e5897b6e6e2e31f54a2028c6d5510fda552ff7c27cef88fecb7efee937df28a670e59c36ca4 + checksum: 10/e6d730400daa7a97fb277159733df1366a932b5b06ac83d72e094e5383191c2597b4a5ae3538b28de6112b9e5d314cb50b44e031e79522f43f3dfc8ab022a584 languageName: node linkType: hard -"@vitest/pretty-format@npm:3.1.4, @vitest/pretty-format@npm:^3.1.4": - version: 3.1.4 - resolution: "@vitest/pretty-format@npm:3.1.4" +"@vitest/pretty-format@npm:3.1.2, @vitest/pretty-format@npm:^3.1.2": + version: 3.1.2 + resolution: "@vitest/pretty-format@npm:3.1.2" dependencies: tinyrainbow: "npm:^2.0.0" - checksum: 10/d8c831410d2cc755d899f31a5f7298ad336f4cddc3115d7da5174595098144a3282eee89a54fb05c6592d408bf4a86e66fa5636c9304816a6557b833d0f98748 + checksum: 10/454d0a8c250dbe52f7ec9dab4968e7c769fa10c8318eb5c54cb4b6d5b524772c04856e1990279f2c6e76705ffa107fddcbc1973560ed3b88167c231ccfeada16 languageName: node linkType: hard -"@vitest/runner@npm:3.1.4": - version: 3.1.4 - resolution: "@vitest/runner@npm:3.1.4" +"@vitest/runner@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/runner@npm:3.1.2" dependencies: - "@vitest/utils": "npm:3.1.4" + "@vitest/utils": "npm:3.1.2" pathe: "npm:^2.0.3" - checksum: 10/45307642d00f28cbd9f196d55238aeac6d2024de9503a66c120981a0acfa43dcb06a00fbf7f06388f26c8bd5e1ed70fa59514e1644f7ec2f4c770f67666e3c0e + checksum: 10/b09c1ff3a556f318585307e6bb8954d219d0d35d1e17708fdd5d5ae1a230e6f29eba4f37a86faa71192f72406bb96b576c1b620d49d686def87bc5dcb8bf5737 languageName: node linkType: hard -"@vitest/snapshot@npm:3.1.4": - version: 3.1.4 - resolution: "@vitest/snapshot@npm:3.1.4" +"@vitest/snapshot@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/snapshot@npm:3.1.2" dependencies: - "@vitest/pretty-format": "npm:3.1.4" + "@vitest/pretty-format": "npm:3.1.2" magic-string: "npm:^0.30.17" pathe: "npm:^2.0.3" - checksum: 10/f307f7a7572a76c20287efb474543021751107e41f069c34f9a90be8d9196ead3182ca41fb0a5f2879c753e341727ab6cbbb3a7cbb1fd7551cb110458359b475 + checksum: 10/dda969b697bdcd8616f17e98c74ad5e95a5f3c2284140aa72390ce668db34e70936ee0b8ebe89adb2e0dea332500689d54c8ff03f8adf1e00be70639ec9032bf languageName: node linkType: hard -"@vitest/spy@npm:3.1.4": - version: 3.1.4 - resolution: "@vitest/spy@npm:3.1.4" +"@vitest/spy@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/spy@npm:3.1.2" dependencies: tinyspy: "npm:^3.0.2" - checksum: 10/e883766dbe8f07f371cc434e10bf50b66d2a31eab37bb9e12ad93b5a1e7e753543cdf2fbee9c0168c574cb6e9f8001871bc9dee45721cbeb370cabad1b8d08a5 + checksum: 10/c2c638368fa4130f903901fdf4e86da6f90d5d6a8cf7ce880cdd24768a1f8e6b726ea3428501c97e00c34ac2e8e39ac09b3a03606dffd8081559e0a35c892ddc languageName: node linkType: hard -"@vitest/utils@npm:3.1.4": - version: 3.1.4 - resolution: "@vitest/utils@npm:3.1.4" +"@vitest/utils@npm:3.1.2": + version: 3.1.2 + resolution: "@vitest/utils@npm:3.1.2" dependencies: - "@vitest/pretty-format": "npm:3.1.4" + "@vitest/pretty-format": "npm:3.1.2" loupe: "npm:^3.1.3" tinyrainbow: "npm:^2.0.0" - checksum: 10/221d9d7dfc41e1c16521e4d998e2980b4a731b38172ba103eb70489eaaff149d479108a21a6f79118885ca2c10e51fbcae5a24e00f7459139dbfbcec39171b10 + checksum: 10/221faaaf6c69ef24eacdcf68581c833cb99bf3e5125945b5dec928af7ef1af4359aa520b90c42413a128b308037bf3217d8c41a41f44ca4aee3ac44e3f0d56b5 languageName: node linkType: hard @@ -718,7 +718,7 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.7.0": +"es-module-lexer@npm:^1.6.0": version: 1.7.0 resolution: "es-module-lexer@npm:1.7.0" checksum: 10/b6f3e576a3fed4d82b0d0ad4bbf6b3a5ad694d2e7ce8c4a069560da3db6399381eaba703616a182b16dde50ce998af64e07dcf49f2ae48153b9e07be3f107087 @@ -1001,11 +1001,11 @@ __metadata: "@algolia/client-composition": "link:../../../clients/algoliasearch-client-javascript/packages/client-composition" "@algolia/composition": "link:../../../clients/algoliasearch-client-javascript/packages/composition" "@algolia/requester-testing": "link:../../../clients/algoliasearch-client-javascript/packages/requester-testing" - "@types/node": "npm:22.15.21" + "@types/node": "npm:22.15.3" algoliasearch: "link:../../../clients/algoliasearch-client-javascript/packages/algoliasearch" dotenv: "npm:16.5.0" typescript: "npm:5.8.3" - vitest: "npm:3.1.4" + vitest: "npm:3.1.2" languageName: unknown linkType: soft @@ -1630,18 +1630,18 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:3.1.4": - version: 3.1.4 - resolution: "vite-node@npm:3.1.4" +"vite-node@npm:3.1.2": + version: 3.1.2 + resolution: "vite-node@npm:3.1.2" dependencies: cac: "npm:^6.7.14" debug: "npm:^4.4.0" - es-module-lexer: "npm:^1.7.0" + es-module-lexer: "npm:^1.6.0" pathe: "npm:^2.0.3" vite: "npm:^5.0.0 || ^6.0.0" bin: vite-node: vite-node.mjs - checksum: 10/e4c198fe9447b4182b95601249a1e8be183380bbd2875034e8ed741a67895b8ad5c6324d6a6db7d60c2b0372f5209ca046604abfc0a70c04bffef00e5a4f6e19 + checksum: 10/8af0465810c6f27200dc899792002320995f3d85c432aaa411bf7ff15580c0b93c4a5153d8a93c7af89b496a6e1a7979a7777984e37ebd7311851ea7572eaac7 languageName: node linkType: hard @@ -1700,17 +1700,17 @@ __metadata: languageName: node linkType: hard -"vitest@npm:3.1.4": - version: 3.1.4 - resolution: "vitest@npm:3.1.4" - dependencies: - "@vitest/expect": "npm:3.1.4" - "@vitest/mocker": "npm:3.1.4" - "@vitest/pretty-format": "npm:^3.1.4" - "@vitest/runner": "npm:3.1.4" - "@vitest/snapshot": "npm:3.1.4" - "@vitest/spy": "npm:3.1.4" - "@vitest/utils": "npm:3.1.4" +"vitest@npm:3.1.2": + version: 3.1.2 + resolution: "vitest@npm:3.1.2" + dependencies: + "@vitest/expect": "npm:3.1.2" + "@vitest/mocker": "npm:3.1.2" + "@vitest/pretty-format": "npm:^3.1.2" + "@vitest/runner": "npm:3.1.2" + "@vitest/snapshot": "npm:3.1.2" + "@vitest/spy": "npm:3.1.2" + "@vitest/utils": "npm:3.1.2" chai: "npm:^5.2.0" debug: "npm:^4.4.0" expect-type: "npm:^1.2.1" @@ -1723,14 +1723,14 @@ __metadata: tinypool: "npm:^1.0.2" tinyrainbow: "npm:^2.0.0" vite: "npm:^5.0.0 || ^6.0.0" - vite-node: "npm:3.1.4" + vite-node: "npm:3.1.2" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@types/debug": ^4.1.12 "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - "@vitest/browser": 3.1.4 - "@vitest/ui": 3.1.4 + "@vitest/browser": 3.1.2 + "@vitest/ui": 3.1.2 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -1750,7 +1750,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10/e30f8df59d3e551c9a104dcf1e9937a0b1c3731072bcfe054a17124689852046b5c44bca0316b6ece0b301225f904709e2b990e8122d5bc7d08327d78785d6ac + checksum: 10/aa5638bf37b2811b01ad8ff0563cdec09202f7a28d9dbcb8eabb2e51cadefc57309cba4f5ff2bac4a72edda44055a844236fc4a09eb72127ef1bd34eb25d0808 languageName: node linkType: hard