From fdd510cdf1441aff26968fcf140bd25e8af3c700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vannicatte?= Date: Wed, 9 Oct 2024 16:53:54 +0200 Subject: [PATCH] chore(scripts): allow variadic compilation for javascript (#3933) --- .github/workflows/check.yml | 6 +-- playground/javascript/node/monitoring.ts | 24 +++++++++ playground/javascript/node/package.json | 4 +- ...ery-suggestions.ts => querySuggestions.ts} | 0 scripts/buildLanguages.ts | 51 +++++++++---------- scripts/cli/index.ts | 34 ++++++++++--- 6 files changed, 79 insertions(+), 40 deletions(-) create mode 100644 playground/javascript/node/monitoring.ts rename playground/javascript/node/{query-suggestions.ts => querySuggestions.ts} (100%) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index c3410df2b0..4f8d311c2d 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -222,7 +222,7 @@ jobs: run: ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).buildCommand }} - name: Build the playground - run: yarn cli build playground javascript + run: yarn cli build playground javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun }} - name: Run common and requester tests run: cd clients/algoliasearch-client-javascript && yarn test ${{ !contains(fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun, 'algoliasearch') && '--ignore algoliasearch' || '' }} @@ -279,13 +279,13 @@ jobs: run: yarn cli snippets javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun }} - name: Build the snippets to check validity - run: yarn cli build snippets javascript + run: yarn cli build snippets javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun }} - name: Generate code guides run: yarn cli guides javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun }} - name: Build the guides to check validity - run: yarn cli build guides javascript + run: yarn cli build guides javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun }} - name: Zip artifact before storing run: zip -r -y clients-javascript.zip clients/algoliasearch-client-javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).testsToStore }} ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).guidesToStore }} -x "**/node_modules**" "**/.yarn/cache/**" "**/.yarn/install-state.gz" "**/build/**" "**/dist/**" "**/.gradle/**" "**/bin/**" "**/.nx/**" diff --git a/playground/javascript/node/monitoring.ts b/playground/javascript/node/monitoring.ts new file mode 100644 index 0000000000..ea750a631f --- /dev/null +++ b/playground/javascript/node/monitoring.ts @@ -0,0 +1,24 @@ +import { ApiError } from '@algolia/client-common'; +import { monitoringClient } from '@algolia/monitoring'; + +const appId = process.env.ALGOLIA_APPLICATION_ID || '**** APP_ID *****'; +const apiKey = process.env.ALGOLIA_ADMIN_KEY || '**** MONITORING_KEY *****'; + +// Init client with appId and apiKey +const client = monitoringClient(appId, apiKey); + +async function testMonitoring() { + try { + const res = await client.getStatus(); + + console.log(`[OK]`, res); + } catch (e) { + if (e instanceof ApiError) { + return console.log(`[${e.status}] ${e.message}`, e.stackTrace, e); + } + + console.log('[ERROR]', e); + } +} + +testMonitoring(); diff --git a/playground/javascript/node/package.json b/playground/javascript/node/package.json index c898607069..4723eb6a7e 100644 --- a/playground/javascript/node/package.json +++ b/playground/javascript/node/package.json @@ -4,8 +4,7 @@ "private": true, "type": "module", "scripts": { - "start": "tsc && node --env-file=../../.env dist/$0.js", - "build": "tsc" + "start": "tsc && node --env-file=../../.env dist/$0.js" }, "dependencies": { "@algolia/client-abtesting": "link:../../../clients/algoliasearch-client-javascript/packages/client-abtesting", @@ -16,6 +15,7 @@ "@algolia/client-query-suggestions": "link:../../../clients/algoliasearch-client-javascript/packages/client-query-suggestions", "@algolia/client-search": "link:../../../clients/algoliasearch-client-javascript/packages/client-search", "@algolia/ingestion": "link:../../../clients/algoliasearch-client-javascript/packages/ingestion", + "@algolia/monitoring": "link:../../../clients/algoliasearch-client-javascript/packages/monitoring", "@algolia/recommend": "link:../../../clients/algoliasearch-client-javascript/packages/recommend", "@algolia/requester-node-http": "link:../../../clients/algoliasearch-client-javascript/packages/requester-node-http", "algoliasearch": "link:../../../clients/algoliasearch-client-javascript/packages/algoliasearch" diff --git a/playground/javascript/node/query-suggestions.ts b/playground/javascript/node/querySuggestions.ts similarity index 100% rename from playground/javascript/node/query-suggestions.ts rename to playground/javascript/node/querySuggestions.ts diff --git a/scripts/buildLanguages.ts b/scripts/buildLanguages.ts index ffa2cb7f02..0cfed5b742 100644 --- a/scripts/buildLanguages.ts +++ b/scripts/buildLanguages.ts @@ -1,6 +1,6 @@ import { existsSync } from 'node:fs'; -import { run, toAbsolutePath } from './common.js'; +import { createClientName, run, toAbsolutePath } from './common.js'; import { getLanguageFolder } from './config.js'; import { createSpinner } from './spinners.js'; import type { Generator, Language } from './types.js'; @@ -26,6 +26,10 @@ function getFolder(buildType: BuildType, language: Language): string { * Build code for a specific language. */ async function buildLanguage(language: Language, gens: Generator[], buildType: BuildType): Promise { + if (!gens || gens.length === 0) { + return; + } + const cwd = getFolder(buildType, language); const spinner = createSpinner(`building ${buildType} for '${language}'`); switch (language) { @@ -48,12 +52,20 @@ async function buildLanguage(language: Language, gens: Generator[], buildType: B packageName === 'algoliasearch' ? packageName : `@algolia/${packageName}`, ); await run(`yarn build:many '{${packageNames.join(',')},}'`, { cwd, language }); - } else if (buildType === 'playground') { - await run('yarn build', { cwd: `${cwd}/node`, language }); - } else { - await run('yarn tsc --noEmit', { cwd, language }); + break; + } + + let fileNames = ''; + + if (buildType !== 'guides') { + fileNames = gens.reduce((prev, curr) => `${prev} ${createClientName(curr.client, curr.language)}.ts`, ''); } + await run(`yarn tsc ${fileNames} --noEmit`, { + cwd: buildType === 'playground' ? `${cwd}/node` : `${cwd}/src`, + language, + }); + break; case 'java': case 'kotlin': @@ -89,10 +101,15 @@ async function buildLanguage(language: Language, gens: Generator[], buildType: B spinner.succeed(); } -export async function buildClients(generators: Generator[]): Promise { +export async function buildLanguages(generators: Generator[], scope: BuildType): Promise { const langs = [...new Set(generators.map((gen) => gen.language))]; const generatorsMap = generators.reduce( (map, gen) => { + // TODO: remove this when guides are mandatory and implemented in every clients + if (scope === 'guides' && !existsSync(toAbsolutePath(`docs/guides/${gen.language}`))) { + return map; + } + if (!(gen.language in map)) { map[gen.language] = []; } @@ -104,25 +121,5 @@ export async function buildClients(generators: Generator[]): Promise { {} as Record, ); - await Promise.all(langs.map((lang) => buildLanguage(lang, generatorsMap[lang], 'client'))); -} - -export async function buildPlaygrounds(languages: Language[]): Promise { - await Promise.all(languages.map((lang) => buildLanguage(lang, [], 'playground'))); -} - -export async function buildSnippets(languages: Language[]): Promise { - await Promise.all(languages.map((lang) => buildLanguage(lang, [], 'snippets'))); -} - -export async function buildGuides(languages: Language[]): Promise { - await Promise.all( - languages.map((lang) => { - if (!existsSync(toAbsolutePath(`docs/guides/${lang}`))) { - return Promise.resolve(); - } - - return buildLanguage(lang, [], 'guides'); - }), - ); + await Promise.all(langs.map((lang) => buildLanguage(lang, generatorsMap[lang], scope))); } diff --git a/scripts/cli/index.ts b/scripts/cli/index.ts index 205419f4de..b1f7dec092 100644 --- a/scripts/cli/index.ts +++ b/scripts/cli/index.ts @@ -1,7 +1,7 @@ import { Argument, program } from 'commander'; import semver from 'semver'; -import { buildClients, buildGuides, buildPlaygrounds, buildSnippets } from '../buildLanguages.js'; +import { buildLanguages } from '../buildLanguages.js'; import { CI, CLIENTS, LANGUAGES, run, setVerbose, toAbsolutePath } from '../common.js'; import { getLanguageFolder } from '../config.js'; import { ctsGenerateMany } from '../cts/generate.js'; @@ -82,40 +82,58 @@ buildCommand setVerbose(Boolean(verbose)); - await buildClients(generatorList({ language, client, clientList })); + await buildLanguages(generatorList({ language, client, clientList }), 'client'); }); buildCommand .command('playground') .description('Build a specified playground') .addArgument(args.language) + .addArgument(args.clients) .option(flags.verbose.flag, flags.verbose.description) - .action(async (langArg: LangArg, { verbose }) => { + .action(async (langArg: LangArg, clientArg: string[], { verbose }) => { + const { language, client, clientList } = transformSelection({ + langArg, + clientArg, + }); + setVerbose(Boolean(verbose)); - await buildPlaygrounds(langArg === ALL || langArg === undefined ? LANGUAGES : [langArg]); + await buildLanguages(generatorList({ language, client, clientList }), 'playground'); }); buildCommand .command('snippets') .description('Build a specified snippets') .addArgument(args.language) + .addArgument(args.clients) .option(flags.verbose.flag, flags.verbose.description) - .action(async (langArg: LangArg, { verbose }) => { + .action(async (langArg: LangArg, clientArg: string[], { verbose }) => { + const { language, client, clientList } = transformSelection({ + langArg, + clientArg, + }); + setVerbose(Boolean(verbose)); - await buildSnippets(langArg === ALL || langArg === undefined ? LANGUAGES : [langArg]); + await buildLanguages(generatorList({ language, client, clientList }), 'snippets'); }); buildCommand .command('guides') .description('Build a specified guides') .addArgument(args.language) + .addArgument(args.clients) .option(flags.verbose.flag, flags.verbose.description) - .action(async (langArg: LangArg, { verbose }) => { + .action(async (langArg: LangArg, clientArg: string[], { verbose }) => { + const { language, client, clientList } = transformSelection({ + langArg, + clientArg, + }); + setVerbose(Boolean(verbose)); - await buildGuides(langArg === ALL || langArg === undefined ? LANGUAGES : [langArg]); + await buildLanguages(generatorList({ language, client, clientList }), 'guides'); }); buildCommand