diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index da5f08bb0b..b7958b2732 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -39,19 +39,19 @@ jobs: uses: ./.github/actions/cache - name: Generate search client - run: yarn generate:js:search + run: yarn generate javascript search - name: Build search client run: yarn client:build-js:search - name: Generate recommend client - run: yarn generate:js:recommend + run: yarn generate javascript recommend - name: Build recommend client run: yarn client:build-js:recommend - name: Generate personalization client - run: yarn generate:js:personalization + run: yarn generate javascript personalization - name: Build personalization client run: yarn client:build-js:personalization diff --git a/README.md b/README.md index 8007e509d9..5a8c08c678 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,21 @@ nvm use && yarn yarn generate ``` +Generic command: +```bash +yarn generate +``` + ### Search client ```bash -yarn generate:search +yarn generate all search ``` ### Recommend client ```bash -yarn generate:recommend +yarn generate all recommend ``` ## Build generated clients diff --git a/doc/contribution_addNewClient.md b/doc/contribution_addNewClient.md index 75facebddd..5a72b51359 100644 --- a/doc/contribution_addNewClient.md +++ b/doc/contribution_addNewClient.md @@ -20,10 +20,18 @@ Example for the JavaScript client openapi-generator author template -g typescript-node -o templates/algoliasearch-client-javascript/ ``` +## Add the language/client to the tool chain + +Add each client in the file `openapitools.json`, following the others client structure. +Then add it to the `scripts/multiplexer.sh` file to register it for the other commands. + +Don't forget to write tests for it using the [CTS](./CTS.md) ## Customize the template API clients require a custom Algolia logic in order to seamlessly work with our engine. +The first thing to do is strip as much code as possible, because the generation include lots of useless feature. + You will need to implement: - An `init` method diff --git a/package.json b/package.json index 31b4f5a3c0..e4244a71ea 100644 --- a/package.json +++ b/package.json @@ -23,21 +23,12 @@ "client:build": "yarn client:build-js", "cts:generate": "yarn workspace tests cts:generate", "cts:test": "yarn workspace tests test", - "lint:client:fix": "eslint --ext=ts ${CLIENT} --fix", "lint": "eslint --ext=ts .", "format:specs": "yarn prettier --write specs", - "generate:js:personalization": "yarn openapi-generator-cli generate --generator-key javascript-personalization && CLIENT=client-personalization yarn utils:import-js && CLIENT=clients/algoliasearch-client-javascript/client-personalization/ yarn lint:client:fix", - "generate:js:recommend": "yarn openapi-generator-cli generate --generator-key javascript-recommend && CLIENT=recommend yarn utils:import-js && CLIENT=clients/algoliasearch-client-javascript/recommend/ yarn lint:client:fix", - "generate:js:search": "yarn openapi-generator-cli generate --generator-key javascript-search && CLIENT=client-search yarn utils:import-js && CLIENT=clients/algoliasearch-client-javascript/client-search/ yarn lint:client:fix", - "generate:js": "yarn generate:js:search && yarn generate:js:recommend && yarn generate:js:personalization", - "generate:personalization": "yarn generate:js:personalization", - "generate:recommend": "yarn generate:js:recommend", - "generate:search": "yarn generate:js:search", - "generate": "yarn generate:js && yarn format:specs", + "generate": "./scripts/multiplexer.sh ./scripts/generate.sh ${0:-all} ${1:-all} && ./scripts/post-gen/global.sh", "playground:js:personalization": "yarn workspace javascript-playground start:personalization", "playground:js:recommend": "yarn workspace javascript-playground start:recommend", "playground:js:search": "yarn workspace javascript-playground start:search", - "utils:import-js": "mkdir -p -- clients/algoliasearch-client-javascript/${CLIENT}/utils && cp -R clients/algoliasearch-client-javascript/utils/ clients/algoliasearch-client-javascript/${CLIENT}/utils", "validate": "yarn swagger-cli validate specs/dist/search.yml && yarn swagger-cli validate specs/dist/recommend.yml && yarn swagger-cli validate specs/dist/personalization.yml" }, "devDependencies": { @@ -54,6 +45,7 @@ "eslint-plugin-jsdoc": "37.1.0", "eslint-plugin-prettier": "4.0.0", "eslint-plugin-unused-imports": "2.0.0", + "json": "11.0.0", "prettier": "2.5.0", "swagger-cli": "4.0.4", "typescript": "4.5.2" diff --git a/scripts/generate.sh b/scripts/generate.sh new file mode 100755 index 0000000000..c88f0ccbb8 --- /dev/null +++ b/scripts/generate.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# Break on non-zero code +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +# Move to the root (easier to locate other scripts) +cd ${DIR}/.. + +lang=$1 +client=$2 + +# run the pre generation script if it exists (spec v) +pregen="./scripts/pre-gen/${lang}.sh" +if [[ -f "$pregen" ]]; then + echo "Pre-gen for ${lang}-${client}" + $pregen $client +fi + +set +e +echo "Generating code for ${lang}-${client}" +log=$(yarn openapi-generator-cli generate --generator-key "${lang}-${client}") +if [[ $? != 0 ]]; then + echo "$log" + exit 1 +fi +set -e + +# run the post generation script if it exists (linting and additional files) +postgen="./scripts/post-gen/${lang}.sh" +if [[ -f "$postgen" ]]; then + echo "Post-gen for ${lang}-${client}" + $postgen $client +fi diff --git a/scripts/multiplexer.sh b/scripts/multiplexer.sh new file mode 100755 index 0000000000..bf36ec37e2 --- /dev/null +++ b/scripts/multiplexer.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# Call this script with multiplexer.sh +# to run the cmd for all the required lang-client combination + +# Break on non-zero code +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +# Move to the root (easier to locate other scripts) +cd ${DIR}/.. + +CMD=$1 +LANGUAGE=$2 +CLIENT=$3 + +LANGUAGES=(javascript) +CLIENTS=(search recommend personalization) + +if [[ $LANGUAGE == "all" ]]; then + LANGUAGE=("${LANGUAGES[@]}") +elif [[ " ${LANGUAGES[*]} " =~ " ${LANGUAGE} " ]]; then + LANGUAGE=($LANGUAGE) +else + echo "Unknown language ${LANGUAGE}" + exit 1 +fi + +if [[ $CLIENT == "all" ]]; then + CLIENT=("${CLIENTS[@]}") +elif [[ " ${CLIENTS[*]} " =~ " ${CLIENT} " ]]; then + CLIENT=($CLIENT) +else + echo "Unknown client ${CLIENT}" + exit 1 +fi + +for lang in "${LANGUAGE[@]}"; do + for client in "${CLIENT[@]}"; do + $CMD $lang $client + done +done diff --git a/scripts/post-gen/global.sh b/scripts/post-gen/global.sh new file mode 100755 index 0000000000..2974b33651 --- /dev/null +++ b/scripts/post-gen/global.sh @@ -0,0 +1 @@ +yarn format:specs diff --git a/scripts/post-gen/javascript.sh b/scripts/post-gen/javascript.sh new file mode 100755 index 0000000000..1e6e2bd53f --- /dev/null +++ b/scripts/post-gen/javascript.sh @@ -0,0 +1,7 @@ +client=$1 + +export CLIENT=$(cat openapitools.json | yarn json "generator-cli.generators.javascript-${client}.output" | sed 's/#{cwd}\///g') +mkdir -p $CLIENT/utils +cp -R clients/algoliasearch-client-javascript/utils/ $CLIENT/utils + +eslint --ext=ts ${CLIENT} --fix diff --git a/yarn.lock b/yarn.lock index 218431d335..e14bbac32d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,7 @@ __metadata: eslint-plugin-jsdoc: 37.1.0 eslint-plugin-prettier: 4.0.0 eslint-plugin-unused-imports: 2.0.0 + json: 11.0.0 prettier: 2.5.0 swagger-cli: 4.0.4 typescript: 4.5.2 @@ -4264,6 +4265,15 @@ fsevents@^2.3.2: languageName: node linkType: hard +"json@npm:11.0.0": + version: 11.0.0 + resolution: "json@npm:11.0.0" + bin: + json: lib/json.js + checksum: 0beb8689722fc30251638543caf791bedc1a25199c18eb0281de115a0dadb00a07d4d36cbd7ff7680e04157fcb2bba76f29ed940b1e4e92f60c6fbaa74523fce + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0"