From 5e5cfce18aa3d231d4e2275059440888251b5863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vannicatte?= Date: Fri, 15 Apr 2022 14:52:28 +0200 Subject: [PATCH] fix(script): restore previous CLI build logic --- .../rollup.config.js | 12 +- scripts/buildClients.ts | 103 ++++++++++-------- scripts/index.ts | 11 +- 3 files changed, 71 insertions(+), 55 deletions(-) diff --git a/clients/algoliasearch-client-javascript/rollup.config.js b/clients/algoliasearch-client-javascript/rollup.config.js index d3cb43a9c7..4b9bcfc68c 100644 --- a/clients/algoliasearch-client-javascript/rollup.config.js +++ b/clients/algoliasearch-client-javascript/rollup.config.js @@ -95,14 +95,18 @@ function getUtilConfigs() { ]; } -function isClientBuilt(client) { +function shouldBuildUtil(utilClient) { + if (process.env.SKIP_UTILS === 'true') { + return false; + } + // Checking existence of `dist` folder doesn't really guarantee the built files are up-to-date. // However, on the CI, it's very likely. // For the local environment, we simply return `false`, which will trigger unnecessary builds. // We can come back here and improve this part (checking if `dist` folder exists and if it's up-to-date). return process.env.CI - ? fs.existsSync(path.resolve('packages', client, 'dist')) - : false; + ? !fs.existsSync(path.resolve('packages', utilClient, 'dist')) + : true; } function getPackageConfigs() { @@ -168,7 +172,7 @@ function getPackageConfigs() { }); return [ - ...getUtilConfigs().filter((config) => !isClientBuilt(config.package)), + ...getUtilConfigs().filter((config) => shouldBuildUtil(config.package)), ...configs, ]; } diff --git a/scripts/buildClients.ts b/scripts/buildClients.ts index fe4b866dd3..7a8a256149 100644 --- a/scripts/buildClients.ts +++ b/scripts/buildClients.ts @@ -1,47 +1,40 @@ -import { - createGeneratorKey, - GENERATORS, - LANGUAGES, - run, - toAbsolutePath, -} from './common'; +import { run } from './common'; import { getLanguageFolder } from './config'; import { createSpinner } from './oraLog'; +import type { Generator } from './types'; + +const multiBuildLanguage = new Set(['javascript']); /** - * Build all client for a language at the same time, for those who live in the same folder. + * Build only a specific client for one language, used by javascript for example. */ -async function buildPerLanguage({ - language, - client, - verbose, -}: { - language: string; - client: string; - verbose: boolean; -}): Promise { - const spinner = createSpinner(`building '${language}'`, verbose).start(); - const cwd = toAbsolutePath(getLanguageFolder(language)); - const generator = - client === 'all' - ? null - : GENERATORS[createGeneratorKey({ language, client })]; - +async function buildPerClient( + { language, key, additionalProperties: { packageName } }: Generator, + verbose: boolean +): Promise { + const spinner = createSpinner(`building ${key}`, verbose).start(); switch (language) { case 'javascript': - await run(`yarn clean`, { cwd, verbose }); + await run(`yarn workspace ${packageName} clean`, { verbose }); await run( - `yarn build ${ - client === 'all' - ? '' - : generator?.additionalProperties.buildFile ?? client - }`, - { - cwd, - verbose, - } + `SKIP_UTILS=true yarn workspace algoliasearch-client-javascript build ${packageName}`, + { verbose } ); break; + default: + } + spinner.succeed(); +} + +/** + * Build all client for a language at the same time, for those who live in the same folder. + */ +async function buildAllClients( + language: string, + verbose: boolean +): Promise { + const spinner = createSpinner(`building '${language}'`, verbose).start(); + switch (language) { case 'java': await run( `./gradle/gradlew --no-daemon -p ${getLanguageFolder( @@ -60,19 +53,37 @@ async function buildPerLanguage({ } export async function buildClients( - language: string, - client: string, + generators: Generator[], verbose: boolean ): Promise { - const languages = language === 'all' ? LANGUAGES : [language]; + const langs = [...new Set(generators.map((gen) => gen.language))]; + + if (langs.includes('javascript')) { + const spinner = createSpinner( + "building 'JavaScript' utils", + verbose + ).start(); + + await run('yarn workspace algoliasearch-client-javascript clean:utils', { + verbose, + }); + await run('yarn workspace algoliasearch-client-javascript build:utils', { + verbose, + }); + + spinner.succeed(); + } - await Promise.all( - languages.map((lang) => - buildPerLanguage({ - language: lang, - client, - verbose, - }) - ) - ); + await Promise.all([ + Promise.all( + generators + .filter(({ language }) => multiBuildLanguage.has(language)) + .map((gen) => buildPerClient(gen, verbose)) + ), + Promise.all( + langs + .filter((lang) => !multiBuildLanguage.has(lang)) + .map((lang) => buildAllClients(lang, verbose)) + ), + ]); } diff --git a/scripts/index.ts b/scripts/index.ts index 3243752eb2..caf2030dab 100644 --- a/scripts/index.ts +++ b/scripts/index.ts @@ -151,13 +151,14 @@ buildCommand ) => { language = await promptLanguage(language, interactive); - const shouldBuildJs = language === 'javascript' || language === 'all'; - const clientList = shouldBuildJs - ? [...CLIENTS_JS_UTILS, ...CLIENTS_JS] - : CLIENTS; + const clientList = + language === 'javascript' || language === 'all' ? CLIENTS_JS : CLIENTS; client = await promptClient(client, interactive, clientList); - await buildClients(language, client, Boolean(verbose)); + await buildClients( + generatorList({ language, client, clientList }), + Boolean(verbose) + ); } );