spiegel-keyman/developer/server/build.sh
Marc Durdin 15f4aa8af2 chore(web): update npm version refs for publishing packages
Note that the version entry will be added to the local package.json
which will then be dirty. This version entry should not be committed.
2022-05-16 08:46:09 +10:00

189 lines
5.1 KiB
Bash
Executable file

#!/usr/bin/env bash
#
# Compiles Keyman Developer Server for deployment
#
# Exit on command failure and when using unset variables:
set -eu
## START STANDARD BUILD SCRIPT INCLUDE
# adjust relative paths as necessary
THIS_SCRIPT="$(greadlink -f "${BASH_SOURCE[0]}" 2>/dev/null || readlink -f "${BASH_SOURCE[0]}")"
. "$(dirname "$THIS_SCRIPT")/../../resources/build/build-utils.sh"
. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh"
## END STANDARD BUILD SCRIPT INCLUDE
EX_USAGE=64
. "$KEYMAN_ROOT/resources/build/jq.inc.sh"
pushd "$(dirname "$THIS_SCRIPT")"
# Build the main script.
build () {
npm run build || fail "Could not build top-level JavaScript file."
}
display_usage ( ) {
echo "Usage: $0 [--production|--watch] [--test|--tdd]"
echo " $0 --help"
echo
echo " --help displays this screen and exits"
echo " --production, -p builds production release in build/"
echo " --skip-package-install, -S don't run npm install (not valid with --production)"
echo " --test, -t runs unit tests after building"
#echo " --watch, -w builds dev server in watch mode"
echo " --tdd runs unit tests WITHOUT building"
echo " --no-build-addins don't build/copy Win32 addins"
echo " --no-build-kmw don't build KeymanWeb"
echo " --no-copy-kmw don't copy KeymanWeb"
}
################################ Main script ################################
run_tests=0
production=0
build=1
install_dependencies=1
build_keymanweb=1
copy_keymanweb=1
build_addins=1
# Process command-line arguments
while [[ $# -gt 0 ]] ; do
key="$1"
case $key in
--help|-h|-?)
display_usage
exit
;;
--production|-p)
production=1
;;
--skip-package-install|-S)
install_dependencies=0
;;
--no-build-kmw)
build_keymanweb=0
;;
--no-build-addins)
build_addins=0
;;
--no-copy-kmw)
copy_keymanweb=0
;;
--test)
run_tests=1
;;
--tdd)
run_tests=1
build=0
install_dependencies=0
;;
*)
echo "$0: invalid option: $key"
display_usage
exit $EX_USAGE
esac
shift # past the processed argument
done
# ----------------------------------------
# Install dependencies
# ----------------------------------------
# Check if Node.JS/npm is installed.
type npm >/dev/null ||\
fail "Build environment setup error detected! Please ensure Node.js is installed!"
if (( install_dependencies )) ; then
verify_npm_setup
# See https://github.com/bubenshchykov/ngrok/issues/254, https://github.com/bubenshchykov/ngrok/pull/255
# TODO: this is horrible; is there a way we can avoid this?
rm -f "$KEYMAN_ROOT"/node_modules/ngrok/bin/ngrok.exe
fi
# ----------------------------------------
# Rebuild and bundle addins
# ----------------------------------------
if (( build_addins )); then
. ./build-addins.inc.sh
# If we have an x64 version of node installed
if [[ $(isNodeX64) ]]; then
build_addins
fi
# Build with the Keyman Developer x86 version of node
PATH="$KEYMAN_ROOT/developer/inst/dist:$PATH" build_addins
fi
# ----------------------------------------
# Build and bundle KeymanWeb
# ----------------------------------------
if (( build_keymanweb )); then
pushd "$KEYMAN_ROOT/web/source"
./build.sh -no_minify
popd
fi
if (( copy_keymanweb )); then
SRC="$KEYMAN_ROOT/web/release/unminified"
DST="$(dirname "$THIS_SCRIPT")/src/site/resource"
rm -rf "$DST"
mkdir -p "$DST/osk"
mkdir -p "$DST/ui"
cp "$SRC/web/"*.js "$SRC/web/"*.js.map "$DST/"
cp -R "$SRC/web/osk/"* "$DST/osk/"
cp -R "$SRC/web/ui/"* "$DST/ui/"
cp "$KEYMAN_ROOT/web/LICENSE" "$DST/"
cp "$KEYMAN_ROOT/web/README.md" "$DST/"
fi
# ----------------------------------------
# Build the project
# ----------------------------------------
npm run build || fail "Compilation failed."
echo "Typescript compilation successful."
# ----------------------------------------
# Unit tests
# ----------------------------------------
if (( run_tests )); then
npm test || fail "Tests failed"
fi
# ----------------------------------------
# Deploy to dist/
# ----------------------------------------
if (( production )) ; then
# We need to build in a tmp folder so that npm doesn't get confused by our
# monorepo setup, and so we can copy the relevant node_modules in, because
# we'll need them in order to build the deployable version.
PRODBUILDTEMP=`mktemp -d`
echo "Preparing in $PRODBUILDTEMP"
# Remove @keymanapp devDependencies because they won't install outside the
# monorepo context
cat package.json | "$JQ" \
'. | del(.devDependencies."@keymanapp/resources-gosh") | del(.devDependencies."@keymanapp/keyman-version")' \
> "$PRODBUILDTEMP/package.json"
pushd "$PRODBUILDTEMP"
npm install --omit=dev --omit=optional
# See https://github.com/bubenshchykov/ngrok/issues/254, https://github.com/bubenshchykov/ngrok/pull/255
rm -f node_modules/ngrok/bin/ngrok.exe
popd
# We'll build in the build/ folder
rm -rf build/
mkdir build/
cp -R dist/* build/
cp -R "$PRODBUILDTEMP"/* build/
rm -rf "$PRODBUILDTEMP"
fi