spiegel-keyman/developer/js/bundle.sh

133 lines
No EOL
4.5 KiB
Bash
Executable file

#!/usr/bin/env bash
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/build/jq.inc.sh"
. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh"
## END STANDARD BUILD SCRIPT INCLUDE
display_usage() {
echo "Usage: $0 --build-path path"
echo " $0 --help"
echo
echo "This script is called from the Keyman Developer installer build"
echo "and is not intended for standalone use."
echo
echo " --help displays this screen and exits"
echo " --build-path path temporary path where archive will be built"
}
BUILD_PATH=
# Process command-line arguments
while [[ $# -gt 0 ]] ; do
key="$1"
case $key in
-help|-h)
display_usage
exit
;;
--build-path)
shift
BUILD_PATH="$1"
;;
*)
echo "$0: invalid option: $key"
display_usage
exit 64
esac
shift # past the processed argument
done
if [[ -z $BUILD_PATH ]]; then
echo "Parameter --build-path is required"
display_usage
exit 64
fi
KEYMAN_WIX_TEMP_BASE="$BUILD_PATH"
KEYMAN_WIX_TEMP_MODELCOMPILER="$BUILD_PATH/ModelCompiler"
KEYMAN_MODELCOMPILER_TEMP=`mktemp -d`
# We copy the built model compiler into a temporary folder in order to prepare
# the node modules, as otherwise the workspace will interfere
cp -R "$KEYMAN_ROOT/developer/js/"* "$KEYMAN_MODELCOMPILER_TEMP/"
cd "$KEYMAN_MODELCOMPILER_TEMP"
# We use `npm pack` to extract only the aspects of the model-compiler actually
# needed for distribution. While we could use npm-bundle or similar, that adds
# extra, unwanted cruft; our approach gives us more control of the set of files
# distributed with the Keyman Developer installer.
#
# For users on other operating systems, node.js is a dependency and the compiler
# can be installed with `npm install @keymanapp/lexical-model-compiler`.
# We copy the files to a temp folder in order to exclude thumbs.db, .vs, etc
# from harvesting
rm -rf "$KEYMAN_WIX_TEMP_MODELCOMPILER"
# Step 1 - npm-pack the model compiler package, then unpack it in our bundling
# directory. This automatically strips the package to its barebones.
set_npm_version
npm pack
mv keymanapp-lexical-model-compiler*.tgz kmlmc.tgz
mv kmlmc.tgz "$KEYMAN_WIX_TEMP_BASE"
# We extract the npm-packed version of the model compiler in order to reproduce
# our needed bundle.
cd "$KEYMAN_WIX_TEMP_BASE"
tar xvzf kmlmc.tgz
# Creates the directory referenced by $(KEYMAN_WIX_TEMP_MODELCOMPILER).
mv package ModelCompiler
# Cleans up the npm pack artifacts, which are no longer needed.
rm kmlmc.tgz
# Step 2 - the model compiler has one in-repo dependency that will also need to
# be packed. Managing other in-repo dependencies will be simpler; they install
# into ModelCompiler's extracted bundle.
mkdir -p "$KEYMAN_MODELCOMPILER_TEMP/node_modules/@keymanapp/"
cp -R "$KEYMAN_ROOT/node_modules/@keymanapp/models-types" "$KEYMAN_MODELCOMPILER_TEMP/node_modules/@keymanapp/"
cd "$KEYMAN_MODELCOMPILER_TEMP/node_modules/@keymanapp/models-types"
set_npm_version
npm pack
mv keymanapp-models-types*.tgz kmtypes.tgz
mv kmtypes.tgz "$KEYMAN_WIX_TEMP_MODELCOMPILER"
# Step 3 - install just the bare essentials by using our packed local
# dependency, followed by all external production dependencies.
cd "$KEYMAN_WIX_TEMP_MODELCOMPILER"
# package-lock.json wasn't bundled; this is needed to keep dependency versions
# consistent.
# as of npm v8.x, even though we are only working with `dependencies`,
# `devDependencies` is still checked, and as these modules are present in
# devDependencies but are only available when in the repo path, we need to
# remove them before attempting to continue.
# Yuck! ref: https://github.com/npm/cli/issues/3975#issuecomment-985305678
# ref: https://github.com/npm/cli/issues/2921
# can't use npm uninstall because it depends on @keymanapp/models-types being
# present!
cat "$KEYMAN_MODELCOMPILER_TEMP/package.json" | "$JQ" \
'. | del(.devDependencies."@keymanapp/models-templates") | del(.devDependencies."@keymanapp/keyman-version") | del(.devDependencies."@keymanapp/models-wordbreakers")' \
> "package.json"
npm install kmtypes.tgz --production --no-optional
npm install --production --no-optional
# Clean up the npm pack artifacts for the dependencies.
rm kmtypes.tgz
# We don't need the unit tests
rm -rf "$KEYMAN_WIX_TEMP_MODELCOMPILER/tests"
rm -rf "$KEYMAN_MODELCOMPILER_TEMP"