diff --git a/config/clients.config.json b/config/clients.config.json index 776fddbf60..7e60e6b9e3 100644 --- a/config/clients.config.json +++ b/config/clients.config.json @@ -14,6 +14,7 @@ "javascript": { "folder": "clients/algoliasearch-client-javascript", "gitRepoId": "algoliasearch-client-javascript", + "utilsPackageVersion": "0.2.0", "modelFolder": "model", "apiFolder": "src", "customGenerator": "algolia-javascript", diff --git a/config/openapitools.json b/config/openapitools.json index cd8651ee2d..a3cafe4501 100644 --- a/config/openapitools.json +++ b/config/openapitools.json @@ -9,8 +9,7 @@ "npmName": "@experimental-api-clients-automation/client-search", "buildFile": "client-search", "packageVersion": "0.2.0", - "packageName": "@experimental-api-clients-automation/client-search", - "utilsPackageVersion": "0.2.0" + "packageName": "@experimental-api-clients-automation/client-search" } }, "javascript-algoliasearch-lite": { @@ -20,8 +19,7 @@ "npmName": "@experimental-api-clients-automation/algoliasearch-lite", "buildFile": "algoliasearch-lite", "packageVersion": "0.2.0", - "packageName": "@experimental-api-clients-automation/algoliasearch-lite", - "utilsPackageVersion": "0.2.0" + "packageName": "@experimental-api-clients-automation/algoliasearch-lite" } }, "javascript-recommend": { @@ -31,8 +29,7 @@ "npmName": "@experimental-api-clients-automation/recommend", "buildFile": "recommend", "packageVersion": "0.2.0", - "packageName": "@experimental-api-clients-automation/recommend", - "utilsPackageVersion": "0.2.0" + "packageName": "@experimental-api-clients-automation/recommend" } }, "javascript-personalization": { @@ -42,7 +39,6 @@ "buildFile": "client-personalization", "packageVersion": "0.2.0", "packageName": "@experimental-api-clients-automation/client-personalization", - "utilsPackageVersion": "0.2.0", "hasRegionalHost": true } }, @@ -53,7 +49,6 @@ "buildFile": "client-analytics", "packageVersion": "0.2.0", "packageName": "@experimental-api-clients-automation/client-analytics", - "utilsPackageVersion": "0.2.0", "hasRegionalHost": true } }, @@ -64,7 +59,6 @@ "buildFile": "client-insights", "packageVersion": "0.2.0", "packageName": "@experimental-api-clients-automation/client-insights", - "utilsPackageVersion": "0.2.0", "hasRegionalHost": true } }, @@ -75,7 +69,6 @@ "buildFile": "client-abtesting", "packageVersion": "0.2.0", "packageName": "@experimental-api-clients-automation/client-abtesting", - "utilsPackageVersion": "0.2.0", "hasRegionalHost": true } }, @@ -86,7 +79,6 @@ "buildFile": "client-query-suggestions", "packageVersion": "0.2.0", "packageName": "@experimental-api-clients-automation/client-query-suggestions", - "utilsPackageVersion": "0.2.0", "hasRegionalHost": true } }, @@ -97,7 +89,6 @@ "buildFile": "client-sources", "packageVersion": "0.2.0", "packageName": "@experimental-api-clients-automation/client-sources", - "utilsPackageVersion": "0.2.0", "hasRegionalHost": true } }, @@ -109,7 +100,6 @@ "buildFile": "client-predict", "packageVersion": "0.2.0", "packageName": "@experimental-api-clients-automation/client-predict", - "utilsPackageVersion": "0.2.0", "hasRegionalHost": true } }, diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java index 0d309227c0..b2e39aea23 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaGenerator.java @@ -52,7 +52,7 @@ public Map postProcessOperationsWithModels( ); additionalProperties.put( "packageVersion", - Utils.getPackageVersion("java") + Utils.getClientConfigField("java", "packageVersion") ); } catch (GenerationException e) { e.printStackTrace(); diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaJavascriptGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java similarity index 96% rename from generators/src/main/java/com/algolia/codegen/AlgoliaJavascriptGenerator.java rename to generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java index 5b4e7c45cc..0c6315662f 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaJavascriptGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java @@ -10,7 +10,7 @@ import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.languages.TypeScriptNodeClientCodegen; -public class AlgoliaJavascriptGenerator extends TypeScriptNodeClientCodegen { +public class AlgoliaJavaScriptGenerator extends TypeScriptNodeClientCodegen { private String CLIENT; @@ -82,6 +82,10 @@ public Map postProcessOperationsWithModels( Utils.getClientNameKebabCase(results), additionalProperties ); + additionalProperties.put( + "utilsPackageVersion", + Utils.getClientConfigField("javascript", "utilsPackageVersion") + ); } catch (GenerationException e) { e.printStackTrace(); System.exit(1); diff --git a/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java b/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java index 51c6b93e10..01bc8b96f3 100644 --- a/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java +++ b/generators/src/main/java/com/algolia/codegen/AlgoliaPhpGenerator.java @@ -57,7 +57,7 @@ public Map postProcessOperationsWithModels( Utils.generateServer(client, additionalProperties); additionalProperties.put( "packageVersion", - Utils.getPackageVersion("php") + Utils.getClientConfigField("php", "packageVersion") ); } catch (GenerationException e) { e.printStackTrace(); diff --git a/generators/src/main/java/com/algolia/codegen/Utils.java b/generators/src/main/java/com/algolia/codegen/Utils.java index 8e3c14c767..04edbb4320 100644 --- a/generators/src/main/java/com/algolia/codegen/Utils.java +++ b/generators/src/main/java/com/algolia/codegen/Utils.java @@ -153,20 +153,21 @@ public static void generateServer( } } - // Get the package version from clients.config.json (doesn't work for JavaScript) - public static String getPackageVersion(String language) + /** Get the `field` value in the `config/clients.config.json` file for the given language */ + public static String getClientConfigField(String language, String field) throws GenerationException { - if (language.equals("javascript")) { + if (language.equals("javascript") && field.equals("packageVersion")) { throw new GenerationException( - "Cannot use getPackageVersion with language=\"javascript\", " + - "read openapitools.json instead" + "Cannot read 'packageVersion' with language=\"javascript\", " + + "read configs/openapitools.json instead" ); } + try { JsonNode config = Json .mapper() .readTree(new File("config/clients.config.json")); - return config.get(language).get("packageVersion").asText(); + return config.get(language).get(field).asText(); } catch (IOException e) { throw new GenerationException( "Couldn't read packageVersion from clients.config.json", diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/CtsManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/CtsManager.java index 5ca987b797..a7bd4fb291 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/manager/CtsManager.java +++ b/generators/src/main/java/com/algolia/codegen/cts/manager/CtsManager.java @@ -1,5 +1,6 @@ package com.algolia.codegen.cts.manager; +import com.algolia.codegen.GenerationException; import com.algolia.codegen.Utils; import com.fasterxml.jackson.databind.JsonNode; import java.util.*; @@ -9,10 +10,16 @@ public abstract class CtsManager { public abstract void addSupportingFiles(List supportingFiles); - protected void addExtraToBundle(Map bundle) {} + protected void addExtraToBundle(Map bundle) + throws GenerationException {} public void addDataToBundle(Map bundle) { - this.addExtraToBundle(bundle); + try { + this.addExtraToBundle(bundle); + } catch (GenerationException e) { + e.printStackTrace(); + System.exit(1); + } } protected Object[] getFilteredPackageVersions(List packages) { diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/JavaCtsManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/JavaCtsManager.java index bfc2413ca9..d88c73f09f 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/manager/JavaCtsManager.java +++ b/generators/src/main/java/com/algolia/codegen/cts/manager/JavaCtsManager.java @@ -1,5 +1,6 @@ package com.algolia.codegen.cts.manager; +import com.algolia.codegen.GenerationException; import com.algolia.codegen.Utils; import java.util.*; import org.openapitools.codegen.SupportingFile; @@ -12,14 +13,11 @@ public void addSupportingFiles(List supportingFiles) { ); } - protected void addExtraToBundle(Map bundle) { + protected void addExtraToBundle(Map bundle) + throws GenerationException { bundle.put( "packageVersion", - Utils - .readJsonFile("config/clients.config.json") - .get("java") - .get("packageVersion") - .asText() + Utils.getClientConfigField("java", "packageVersion") ); } } diff --git a/generators/src/main/java/com/algolia/codegen/cts/manager/JavaScriptCtsManager.java b/generators/src/main/java/com/algolia/codegen/cts/manager/JavaScriptCtsManager.java index 0ac2d66c90..5b4c9f9719 100644 --- a/generators/src/main/java/com/algolia/codegen/cts/manager/JavaScriptCtsManager.java +++ b/generators/src/main/java/com/algolia/codegen/cts/manager/JavaScriptCtsManager.java @@ -1,5 +1,6 @@ package com.algolia.codegen.cts.manager; +import com.algolia.codegen.GenerationException; import com.algolia.codegen.Utils; import com.fasterxml.jackson.databind.JsonNode; import java.util.*; @@ -44,24 +45,12 @@ private List getPackageDependencies() { return result; } - protected void addExtraToBundle(Map bundle) { + protected void addExtraToBundle(Map bundle) + throws GenerationException { bundle.put("packageDependencies", this.getPackageDependencies()); - bundle.put("utilsPackageVersion", this.getUtilsPackageVersion()); - } - - private String getUtilsPackageVersion() { - JsonNode openApiToolsConfig = Utils.readJsonFile( - "config/openapitools.json" + bundle.put( + "utilsPackageVersion", + Utils.getClientConfigField("javascript", "utilsPackageVersion") ); - - String utilsPackageVersion = openApiToolsConfig - .get("generator-cli") - .get("generators") - .get("javascript-search") - .get("additionalProperties") - .get("utilsPackageVersion") - .asText(); - - return utilsPackageVersion; } } diff --git a/generators/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig b/generators/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig index 637ad727d7..aa0352702a 100644 --- a/generators/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig +++ b/generators/src/main/resources/META-INF/services/org.openapitools.codegen.CodegenConfig @@ -1,4 +1,4 @@ com.algolia.codegen.AlgoliaJavaGenerator -com.algolia.codegen.AlgoliaJavascriptGenerator +com.algolia.codegen.AlgoliaJavaScriptGenerator com.algolia.codegen.AlgoliaPhpGenerator com.algolia.codegen.cts.AlgoliaCtsGenerator diff --git a/scripts/__tests__/common.test.ts b/scripts/__tests__/common.test.ts index 27558fe0fa..43d53ccd3a 100644 --- a/scripts/__tests__/common.test.ts +++ b/scripts/__tests__/common.test.ts @@ -1,6 +1,7 @@ import execa from 'execa'; import { gitCommit } from '../common'; +import { getClientsConfigField } from '../config'; jest.mock('execa'); @@ -51,3 +52,27 @@ describe('gitCommit', () => { ); }); }); + +describe('config', () => { + describe('getClientsConfigField', () => { + it('throws if the field is not found', () => { + expect(() => { + getClientsConfigField('javascript', 'packageVersion'); + }).toThrowErrorMatchingInlineSnapshot( + `"Unable to find 'packageVersion' for 'javascript'"` + ); + + expect(() => { + getClientsConfigField('java', 'utilsPackageVersion'); + }).toThrowErrorMatchingInlineSnapshot( + `"Unable to find 'utilsPackageVersion' for 'java'"` + ); + }); + + it('find the field if it exists', () => { + expect(getClientsConfigField('java', ['tests', 'extension'])).toEqual( + '.test.java' + ); + }); + }); +}); diff --git a/scripts/ci/githubActions/setRunVariables.ts b/scripts/ci/githubActions/setRunVariables.ts index b44db3a2fd..ea7760041a 100644 --- a/scripts/ci/githubActions/setRunVariables.ts +++ b/scripts/ci/githubActions/setRunVariables.ts @@ -60,7 +60,7 @@ export const DEPENDENCIES = { ...CLIENTS_COMMON_FILES, JS_CLIENT_FOLDER, 'templates/javascript', - 'generators/src/main/java/com/algolia/codegen/AlgoliaJavascriptGenerator.java', + 'generators/src/main/java/com/algolia/codegen/AlgoliaJavaScriptGenerator.java', `:!${JS_CLIENT_FOLDER}/.github`, `:!${JS_CLIENT_FOLDER}/README.md`, 'tests/CTS/methods/requests/templates/javascript', diff --git a/scripts/config.ts b/scripts/config.ts index f55dc0f791..c9267c8f67 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -1,39 +1,58 @@ import clientsConfig from '../config/clients.config.json'; import openapiConfig from '../config/openapitools.json'; -import type { Language } from './types'; +import type { Language, LanguageConfig } from './types'; + +export function getClientsConfigField( + language: Language, + pathToField: string[] | string +): any { + const config: LanguageConfig = clientsConfig[language]; + const path = Array.isArray(pathToField) ? pathToField : [pathToField]; + + return path.reduce((current, key) => { + if (!current || !current[key]) { + throw new Error(`Unable to find '${pathToField}' for '${language}'`); + } + + return current[key]; + }, config); +} export function getLanguageFolder(language: Language): string { - return clientsConfig[language].folder; + return getClientsConfigField(language, 'folder'); } export function getLanguageApiFolder(language: Language): string { - return clientsConfig[language].apiFolder; + return getClientsConfigField(language, 'apiFolder'); } export function getLanguageModelFolder(language: Language): string { - return clientsConfig[language].modelFolder; + return getClientsConfigField(language, 'modelFolder'); } export function getTestExtension(language: Language): string { - return clientsConfig[language].tests.extension; + return getClientsConfigField(language, ['tests', 'extension']); } export function getTestOutputFolder(language: Language): string { - return clientsConfig[language].tests.outputFolder; + return getClientsConfigField(language, ['tests', 'outputFolder']); } export function getCustomGenerator(language: Language): string { - return clientsConfig[language].customGenerator; + return getClientsConfigField(language, 'customGenerator'); } -// Returns the version of the package from clients.config.json, except for JavaScript where it returns the version of javascript-search +/** + * Returns the version of the package from clients.config.json, except for JavaScript where it returns the version of javascript-search. + */ export function getPackageVersionDefault(language: Language): string { if (language === 'javascript') { return openapiConfig['generator-cli'].generators['javascript-search'] .additionalProperties.packageVersion; } - return clientsConfig[language].packageVersion; + + return getClientsConfigField(language, 'packageVersion'); } export function getGitHubUrl( diff --git a/scripts/release/process-release.ts b/scripts/release/process-release.ts index b63e9909dc..523ca01528 100755 --- a/scripts/release/process-release.ts +++ b/scripts/release/process-release.ts @@ -21,6 +21,7 @@ import { LANGUAGES, } from '../common'; import { + getClientsConfigField, getGitHubUrl, getLanguageFolder, getPackageVersionDefault, @@ -113,13 +114,9 @@ async function updateVersionForJavascript( if (!versionsToRelease.javascript) { return; } + + // Sets the new version of the JavaScript client const jsVersion = versionsToRelease.javascript; - const nextUtilsPackageVersion = - semver.inc( - openapiConfig['generator-cli'].generators['javascript-search'] - .additionalProperties.utilsPackageVersion, - jsVersion.releaseType - ) || ''; Object.values(GENERATORS) .filter((gen) => gen.language === 'javascript') .forEach((gen) => { @@ -136,12 +133,34 @@ async function updateVersionForJavascript( ); } additionalProperties.packageVersion = newVersion; - additionalProperties.utilsPackageVersion = nextUtilsPackageVersion; }); + await fsp.writeFile( toAbsolutePath('config/openapitools.json'), JSON.stringify(openapiConfig, null, 2) ); + + // Sets the new version of the utils package + const utilsPackageVersion = getClientsConfigField( + 'javascript', + 'utilsPackageVersion' + ); + const nextUtilsPackageVersion = semver.inc( + utilsPackageVersion, + jsVersion.releaseType + ); + + if (!nextUtilsPackageVersion) { + throw new Error( + `Failed to bump version ${utilsPackageVersion} by ${jsVersion.releaseType}.` + ); + } + + clientsConfig.javascript.utilsPackageVersion = nextUtilsPackageVersion; + await fsp.writeFile( + toAbsolutePath('config/clients.config.json'), + JSON.stringify(clientsConfig, null, 2) + ); } async function updateConfigFiles( diff --git a/scripts/types.ts b/scripts/types.ts index 8e1ec44d99..c6720b3a94 100644 --- a/scripts/types.ts +++ b/scripts/types.ts @@ -1,5 +1,24 @@ import type config from '../config/clients.config.json'; +/** + * Config. + */ +export type ClientsConfig = Record; + +export type LanguageConfig = { + folder: string; + gitRepoId: string; + modelFolder: string; + apiFolder: string; + customGenerator: string; + packageVersion?: string; + utilsPackageVersion?: string; + tests: { + extension: string; + outputFolder: string; + }; +}; + export type Generator = Record & { language: Language; client: string; diff --git a/website/docs/automation/add-new-api-client.md b/website/docs/automation/add-new-api-client.md index 990e719164..ec86aaf639 100644 --- a/website/docs/automation/add-new-api-client.md +++ b/website/docs/automation/add-new-api-client.md @@ -57,13 +57,12 @@ Generators are referenced by key with the following pattern `-