Skip to content

Instantly share code, notes, and snippets.

@arijusg
Last active June 18, 2020 09:44
Show Gist options
  • Save arijusg/3f2e4f42c0b2401b548aefc2e2ca0395 to your computer and use it in GitHub Desktop.
Save arijusg/3f2e4f42c0b2401b548aefc2e2ca0395 to your computer and use it in GitHub Desktop.
Generate Typescript interfaces for multiple swagger api project files
#!/bin/bash
set -e
# Root
ROOT_PATH=${PWD}
ROOT_PROJECTS="${ROOT_PATH}/projects"
ROOT_DIST="${ROOT_PATH}/dist"
function print() {
if [ -z "$1" ]; then
echo "########## Error: No message provided ##########"
exit 1
fi
echo "########## ${1} ##########"
}
function print-error() {
if [ -z "$1" ]; then
print "########## Error: No message provided ##########"
exit 1
fi
print "########## Error: ${1} ##########"
}
function cleanup() {
rm -f ${ROOT_PATH}/shared/api-interfaces/index.ts
}
function generate-api-interfaces() {
if [ -z "$1" ]; then
print-error "project path was not provided"
exit 1
fi
local PROJECT_BASE_PATH=$1
local PROJECT_NAME=$(basename ${PROJECT_BASE_PATH})
# convert PROJECT_NAME to CamelCase
local UNDERSCORE_PROJECT_NAME="${PROJECT_NAME//-/_}"
local CAMEL_CASE_PROJECT_NAME=$(echo ${UNDERSCORE_PROJECT_NAME} | awk -F _ '{printf "%s", $1; for(i=2; i<=NF; i++) printf "%s", toupper(substr($i,1,1)) substr($i,2); print"";}')
local FIRST_PART=$(echo ${CAMEL_CASE_PROJECT_NAME} | cut -c1 | tr [a-z] [A-Z])
local SECOND_PART=$(echo ${CAMEL_CASE_PROJECT_NAME} | cut -c2-)
local PROJECT_NAME_PASCAL=${FIRST_PART}${SECOND_PART}
npx swagger-cli bundle -o ${PROJECT_BASE_PATH}/api/${PROJECT_NAME}.json ${PROJECT_BASE_PATH}/api/${PROJECT_NAME}.yaml
mkdir -p ${ROOT_PATH}/shared/api-interfaces/${PROJECT_NAME}
npx sw2dts ${PROJECT_BASE_PATH}/api/${PROJECT_NAME}.json >${ROOT_PATH}/shared/api-interfaces/${PROJECT_NAME}/${PROJECT_NAME}.ts
echo "export * as ${PROJECT_NAME_PASCAL} from './${PROJECT_NAME}/${PROJECT_NAME}';" >>${ROOT_PATH}/shared/api-interfaces/index.ts
rm ${PROJECT_BASE_PATH}/api/${PROJECT_NAME}.json
}
# Build all projects
cleanup
for PROJECT_DIR in $(find ${ROOT_PROJECTS} -maxdepth 1 -mindepth 1 -type d); do
generate-api-interfaces ${PROJECT_DIR}
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment