angular-cn/build.sh

511 lines
15 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -u -e -o pipefail
readonly currentDir=$(cd $(dirname $0); pwd)
source ${currentDir}/scripts/ci/_travis-fold.sh
# TODO(i): wrap into subshell, so that we don't pollute CWD, but not yet to minimize diff collision with Jason
cd ${currentDir}
PACKAGES=(core
compiler
common
animations
platform-browser
platform-browser-dynamic
fix(forms): make composition event buffering configurable (#15256) This commit fixes a regression where `ngModel` no longer syncs letter by letter on Android devices, and instead syncs at the end of every word. This broke when we introduced buffering of IME events so IMEs like Pinyin keyboards or Katakana keyboards wouldn't display composition strings. Unfortunately, iOS devices and Android devices have opposite event behavior. Whereas iOS devices fire composition events for IME keyboards only, Android fires composition events for Latin-language keyboards. For this reason, languages like English don't work as expected on Android if we always buffer. So to support both platforms, composition string buffering will only be turned on by default for non-Android devices. However, we have also added a `COMPOSITION_BUFFER_MODE` token to make this configurable by the application. In some cases, apps might might still want to receive intermediate values. For example, some inputs begin searching based on Latin letters before a character selection is made. As a provider, this is fairly flexible. If you want to turn composition buffering off, simply provide the token at the top level: ```ts providers: [ {provide: COMPOSITION_BUFFER_MODE, useValue: false} ] ``` Or, if you want to change the mode based on locale or platform, you can use a factory: ```ts import {shouldUseBuffering} from 'my/lib'; .... providers: [ {provide: COMPOSITION_BUFFER_MODE, useFactory: shouldUseBuffering} ] ``` Closes #15079. PR Close #15256
2017-03-20 20:38:33 -04:00
forms
http
platform-server
platform-webworker
platform-webworker-dynamic
upgrade
router
compiler-cli
language-service
benchpress)
2017-03-02 16:54:35 -05:00
NODE_PACKAGES=(compiler-cli
benchpress)
BUILD_ALL=true
BUNDLE=true
VERSION_PREFIX=$(node -p "require('./package.json').version")
VERSION_SUFFIX="-$(git log --oneline -1 | awk '{print $1}')"
REMOVE_BENCHPRESS=false
BUILD_EXAMPLES=true
2017-03-02 16:54:35 -05:00
COMPILE_SOURCE=true
TYPECHECK_ALL=true
BUILD_TOOLS=true
for ARG in "$@"; do
case "$ARG" in
--quick-bundle=*)
COMPILE_SOURCE=false
TYPECHECK_ALL=false
BUILD_EXAMPLES=false
BUILD_TOOLS=false
;;
--packages=*)
PACKAGES_STR=${ARG#--packages=}
PACKAGES=( ${PACKAGES_STR//,/ } )
BUILD_ALL=false
;;
--bundle=*)
BUNDLE=( "${ARG#--bundle=}" )
;;
--publish)
VERSION_SUFFIX=""
REMOVE_BENCHPRESS=true
;;
--examples=*)
BUILD_EXAMPLES=${ARG#--examples=}
;;
2017-03-02 16:54:35 -05:00
--compile=*)
COMPILE_SOURCE=${ARG#--compile=}
;;
--typecheck=*)
TYPECHECK_ALL=${ARG#--typecheck=}
;;
--tools=*)
BUILD_TOOLS=${ARG#--tools=}
;;
*)
echo "Unknown option $ARG."
exit 1
;;
esac
done
2017-03-02 16:54:35 -05:00
#######################################
# Verifies a directory isn't in the ignored list
# Arguments:
# param1 - Path to check
# Returns:
# Boolean
#######################################
isIgnoredDirectory() {
name=$(basename ${1})
if [[ -f "${1}" || "${name}" == "src" || "${name}" == "test" || "${name}" == "integrationtest" ]]; then
return 0
else
return 1
fi
}
#######################################
# Check if array contains an element
# Arguments:
# param1 - Element to check
# param2 - Array to look for element in
# Returns:
# None
#######################################
containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
return 1
}
#######################################
# Downlevel ES2015 to ESM/ES5
# Arguments:
2017-03-02 16:54:35 -05:00
# param1 - Source folder
# param2 - Naming suffix to apply. Must end in ".ts" (defaults to .es5.ts)
# Returns:
# None
#######################################
downlevelES2015() {
2017-03-02 16:54:35 -05:00
# Iterate over the files in this directory, converting to .es5.ts
regex="(.+).js"
for file in ${1}/*.js ; do
if [[ ${file} =~ $regex ]]; then
ts_file="${BASH_REMATCH[1]}${2:-".es5.ts"}"
cp ${file} ${ts_file}
echo "====== $TSC ${ts_file} --target es5 --module es2015 --noLib --sourceMap --importHelpers"
($TSC ${ts_file} --target es5 --module es2015 --noLib --sourceMap --importHelpers) > /dev/null 2>&1 || true
mapSources "${BASH_REMATCH[1]}${2:-".es5.js"}"
2017-03-02 16:54:35 -05:00
rm -f ${ts_file}
fi
done
# Recurse for sub directories
for DIR in ${1}/* ; do
isIgnoredDirectory ${DIR} && continue
downlevelES2015 ${DIR}
done
}
#######################################
# Rollup index files recursively, ignoring blacklisted directories
# Arguments:
# param1 - Base source folder
# param2 - Destination directory
# param3 - Config file
2017-03-02 16:54:35 -05:00
# Returns:
# None
#######################################
rollupIndex() {
# Iterate over the files in this directory, rolling up each into ${2} directory
local regex=".+/(.+)/index.js"
2017-03-02 16:54:35 -05:00
if [[ "${1}/index.js" =~ $regex ]]; then
in_file="${1}/index.js"
out_file="${2}/${BASH_REMATCH[1]}.js"
echo "====== $ROLLUP -i ${in_file} -o ${out_file}"
if [[ -f "${3}" ]]; then
$ROLLUP -i ${in_file} -o ${out_file} -c ${3} --sourcemap
else
$ROLLUP -i ${in_file} -o ${out_file} --sourcemap
fi
2017-03-02 16:54:35 -05:00
cat ${LICENSE_BANNER} > ${out_file}.tmp
cat ${out_file} >> ${out_file}.tmp
mv ${out_file}.tmp ${out_file}
mapSources "${out_file}"
2017-03-02 16:54:35 -05:00
# Recurse for sub directories
for DIR in ${1}/* ; do
isIgnoredDirectory ${DIR} && continue
# NOTE: We need to re-run this regex and use the new match as Bash doesn't have closures
if [[ "${1}/index.js" =~ $regex ]]; then
rollupIndex ${DIR} ${2}/${BASH_REMATCH[1]} "$(dirname $3)/${BASH_REMATCH[1]}/rollup.config.js"
2017-03-02 16:54:35 -05:00
fi
done
fi
}
#######################################
# Recursively runs rollup on any entry point that has a "rollup.config.js" file
# Arguments:
# param1 - Base source folder containing rollup.config.js
# Returns:
# None
#######################################
runRollup() {
local regex="dest: ['\"](.+)['\"],*"
if [[ -f "${1}/rollup.config.js" ]]; then
2017-03-02 16:54:35 -05:00
cd ${1}
echo "====== $ROLLUP -c ${1}/rollup.config.js"
$ROLLUP -c rollup.config.js --sourcemap
local dest_line=$(cat "${1}/rollup.config.js" | grep 'dest:')
if [[ ${dest_line} =~ $regex ]]; then
mapSources "${BASH_REMATCH[1]}"
fi
2017-03-02 16:54:35 -05:00
# Recurse for sub directories
for DIR in ${1}/* ; do
isIgnoredDirectory ${DIR} && continue
runRollup ${DIR}
done
fi
}
#######################################
# Adds banners to all files in a directory
# Arguments:
# param1 - Directory to add license banners to
# Returns:
# None
#######################################
addBanners() {
for file in ${1}/*; do
if [[ -f ${file} && "${file##*.}" != "map" ]]; then
2017-03-02 16:54:35 -05:00
cat ${LICENSE_BANNER} > ${file}.tmp
cat ${file} >> ${file}.tmp
mv ${file}.tmp ${file}
fi
done
}
#######################################
# Minifies files in a directory
# Arguments:
# param1 - Directory to minify
# Returns:
# None
#######################################
minify() {
# Iterate over the files in this directory, rolling up each into ${2} directory
regex="(.+).js"
files=(${1}/*)
echo "${files[@]}"
for file in "${files[@]}"; do
echo "${file}"
base_file=$( basename "${file}" )
if [[ "${base_file}" =~ $regex && "${base_file##*.}" != "map" ]]; then
local out_file=$(dirname "${file}")/${BASH_REMATCH[1]}.min.js
$UGLIFYJS -c --screw-ie8 --comments -o ${out_file} --source-map ${out_file}.map --source-map-include-sources ${file}
mapSources "${out_file}"
2017-03-02 16:54:35 -05:00
fi
done
}
#######################################
# Recursively compile package
# Arguments:
# param1 - Source directory
# param2 - Out dir
# param3 - Package Name
# param4 - Is child (are we recursing?)
# Returns:
# None
#######################################
compilePackage() {
echo "====== [${3}]: COMPILING: ${NGC} -p ${1}/tsconfig-build.json"
# For NODE_PACKAGES items (not getting rolled up)
if containsElement "${PACKAGE}" "${NODE_PACKAGES[@]}"; then
$TSC -p ${1}/tsconfig-build.json
else
local package_name=$(basename "${2}")
$NGC -p ${1}/tsconfig-build.json
echo "====== Create ${1}/../${package_name}.d.ts re-export file for Closure"
echo "$(cat ${LICENSE_BANNER}) ${N} export * from './${package_name}/index'" > ${2}/../${package_name}.d.ts
echo "{\"__symbolic\":\"module\",\"version\":3,\"metadata\":{},\"exports\":[{\"from\":\"./${package_name}/index\"}],\"flatModuleIndexRedirect\":true}" > ${2}/../${package_name}.metadata.json
2017-03-02 16:54:35 -05:00
fi
for DIR in ${1}/* ; do
[ -d "${DIR}" ] || continue
BASE_DIR=$(basename "${DIR}")
# Skip over directories that are not nested entry points
[[ -e ${DIR}/tsconfig-build.json && "${BASE_DIR}" != "integrationtest" ]] || continue
compilePackage ${DIR} ${2}/${BASE_DIR} ${3} true
done
}
#######################################
# Moves typings and metadata files appropriately
2017-03-02 16:54:35 -05:00
# Arguments:
# param1 - Source of typings & metadata files
# param2 - Root of destination directory
# param3 - Package name (needed to correspond to name of d.ts and metadata.json files)
2017-03-02 16:54:35 -05:00
# Returns:
# None
#######################################
moveTypings() {
if [[ -f ${1}/index.d.ts && -f ${1}/index.metadata.json ]]; then
2017-03-02 16:54:35 -05:00
mv ${1}/index.d.ts ${1}/${2}.d.ts
mv ${1}/index.metadata.json ${1}/${2}.metadata.json
fi
}
#######################################
# Adds a package.json in directories where needed (secondary entry point typings).
# This is read by NGC to be able to find the flat module index.
# Arguments:
# param1 - Source directory of typings files
# Returns:
# None
#######################################
addNgcPackageJson() {
for DIR in ${1}/* ; do
[ -d "${DIR}" ] || continue
# Confirm there is an index.d.ts and index.metadata.json file. If so, create
# the package.json and recurse.
if [[ -f ${DIR}/index.d.ts && -f ${DIR}/index.metadata.json ]]; then
echo '{"typings": "index.d.ts"}' > ${DIR}/package.json
addNgcPackageJson ${DIR}
fi
done
}
#######################################
# This is read by NGC to be able to find the flat module index.
# Arguments:
# param1 - JavaScript file on which to re-map sources
# Returns:
# None
#######################################
mapSources() {
if [[ -f "${1}.map" ]]; then
$MAP_SOURCES -f "${1}"
fi
}
VERSION="${VERSION_PREFIX}${VERSION_SUFFIX}"
echo "====== BUILDING: Version ${VERSION}"
2017-03-02 16:54:35 -05:00
N="
"
TSC=`pwd`/node_modules/.bin/tsc
NGC="node --max-old-space-size=3000 dist/packages-dist/tsc-wrapped/src/main"
MAP_SOURCES="node `pwd`/scripts/build/map_sources.js "
UGLIFYJS=`pwd`/node_modules/.bin/uglifyjs
TSCONFIG=./tools/tsconfig.json
2017-03-02 16:54:35 -05:00
ROLLUP=`pwd`/node_modules/.bin/rollup
if [[ ${BUILD_TOOLS} == true ]]; then
travisFoldStart "build tools" "no-xtrace"
echo "====== (tools)COMPILING: \$(npm bin)/tsc -p ${TSCONFIG} ====="
rm -rf ./dist/tools/
mkdir -p ./dist/tools/
$(npm bin)/tsc -p ${TSCONFIG}
travisFoldEnd "build tools"
fi
2017-03-02 16:54:35 -05:00
if [[ ${BUILD_ALL} == true && ${TYPECHECK_ALL} == true ]]; then
travisFoldStart "clean dist" "no-xtrace"
rm -rf ./dist/all/
2017-03-02 16:54:35 -05:00
rm -rf ./dist/packages
travisFoldEnd "clean dist"
travisFoldStart "copy e2e files" "no-xtrace"
mkdir -p ./dist/all/
(
echo "====== Copying files needed for e2e tests ====="
cp -r ./modules/playground ./dist/all/
cp -r ./modules/playground/favicon.ico ./dist/
#rsync -aP ./modules/playground/* ./dist/all/playground/
mkdir ./dist/all/playground/vendor
cd ./dist/all/playground/vendor
ln -s ../../../../node_modules/core-js/client/core.js .
ln -s ../../../../node_modules/zone.js/dist/zone.js .
ln -s ../../../../node_modules/zone.js/dist/long-stack-trace-zone.js .
ln -s ../../../../node_modules/systemjs/dist/system.src.js .
ln -s ../../../../node_modules/base64-js .
ln -s ../../../../node_modules/reflect-metadata/Reflect.js .
ln -s ../../../../node_modules/rxjs .
ln -s ../../../../node_modules/angular/angular.js .
ln -s ../../../../node_modules/hammerjs/hammer.js .
)
(
echo "====== Copying files needed for benchmarks ====="
cp -r ./modules/benchmarks ./dist/all/
cp -r ./modules/benchmarks/favicon.ico ./dist/
mkdir ./dist/all/benchmarks/vendor
cd ./dist/all/benchmarks/vendor
ln -s ../../../../node_modules/core-js/client/core.js .
ln -s ../../../../node_modules/zone.js/dist/zone.js .
ln -s ../../../../node_modules/zone.js/dist/long-stack-trace-zone.js .
ln -s ../../../../node_modules/systemjs/dist/system.src.js .
ln -s ../../../../node_modules/reflect-metadata/Reflect.js .
ln -s ../../../../node_modules/rxjs .
ln -s ../../../../node_modules/angular/angular.js .
ln -s ../../../../bower_components/polymer .
ln -s ../../../../node_modules/incremental-dom/dist/incremental-dom-cjs.js
)
travisFoldEnd "copy e2e files"
2017-03-02 16:54:35 -05:00
TSCONFIG="packages/tsconfig.json"
travisFoldStart "tsc -p ${TSCONFIG}" "no-xtrace"
$TSC -p ${TSCONFIG}
travisFoldEnd "tsc -p ${TSCONFIG}"
2017-03-02 16:54:35 -05:00
TSCONFIG="modules/tsconfig.json"
travisFoldStart "tsc -p ${TSCONFIG}" "no-xtrace"
$TSC -p ${TSCONFIG}
2017-03-02 16:54:35 -05:00
travisFoldEnd "tsc -p ${TSCONFIG}"
fi
if [[ ${BUILD_ALL} == true ]]; then
rm -rf ./dist/packages
if [[ ${BUNDLE} == true ]]; then
rm -rf ./dist/packages-dist
fi
fi
if [[ ${BUILD_TOOLS} == true || ${BUILD_ALL} == true ]]; then
echo "====== (tsc-wrapped)COMPILING: \$(npm bin)/tsc -p packages/tsc-wrapped/tsconfig.json ====="
$(npm bin)/tsc -p packages/tsc-wrapped/tsconfig.json
echo "====== (tsc-wrapped)COMPILING: \$(npm bin)/tsc -p packages/tsc-wrapped/tsconfig-build.json ====="
$(npm bin)/tsc -p packages/tsc-wrapped/tsconfig-build.json
cp ./packages/tsc-wrapped/package.json ./dist/packages-dist/tsc-wrapped
cp ./packages/tsc-wrapped/README.md ./dist/packages-dist/tsc-wrapped
fi
for PACKAGE in ${PACKAGES[@]}
do
travisFoldStart "build package: ${PACKAGE}" "no-xtrace"
PWD=`pwd`
2017-03-02 16:54:35 -05:00
ROOT_DIR=${PWD}/packages
SRC_DIR=${ROOT_DIR}/${PACKAGE}
ROOT_OUT_DIR=${PWD}/dist/packages
OUT_DIR=${ROOT_OUT_DIR}/${PACKAGE}
NPM_DIR=${PWD}/dist/packages-dist/${PACKAGE}
MODULES_DIR=${NPM_DIR}/@angular
BUNDLES_DIR=${NPM_DIR}/bundles
LICENSE_BANNER=${ROOT_DIR}/license-banner.txt
2017-03-02 16:54:35 -05:00
if [[ ${COMPILE_SOURCE} == true ]]; then
rm -rf ${OUT_DIR}
rm -f ${ROOT_OUT_DIR}/${PACKAGE}.js
compilePackage ${SRC_DIR} ${OUT_DIR} ${PACKAGE}
fi
2017-03-02 16:54:35 -05:00
if [[ ${BUNDLE} == true ]]; then
echo "====== BUNDLING ${PACKAGE}: ${SRC_DIR} ====="
rm -rf ${NPM_DIR} && mkdir -p ${NPM_DIR}
2017-03-02 16:54:35 -05:00
if ! containsElement "${PACKAGE}" "${NODE_PACKAGES[@]}"; then
2017-03-02 16:54:35 -05:00
echo "====== Copy ${PACKAGE} typings"
rsync -a --exclude=*.js --exclude=*.js.map ${OUT_DIR}/ ${NPM_DIR}
moveTypings ${NPM_DIR} ${PACKAGE}
2017-03-02 16:54:35 -05:00
(
cd ${SRC_DIR}
echo "====== Rollup ${PACKAGE}"
rollupIndex ${OUT_DIR} ${MODULES_DIR} ${ROOT_DIR}
2017-03-02 16:54:35 -05:00
echo "====== Downleveling ES2015 to ESM/ES5"
downlevelES2015 ${MODULES_DIR}
2017-03-02 16:54:35 -05:00
echo "====== Run rollup conversions on ${PACKAGE}"
runRollup ${SRC_DIR}
addBanners ${BUNDLES_DIR}
minify ${BUNDLES_DIR}
2017-03-02 16:54:35 -05:00
) 2>&1 | grep -v "as external dependency"
else
echo "====== Copy ${PACKAGE} node tool"
rsync -a ${OUT_DIR}/ ${NPM_DIR}
fi
echo "====== Copy ${PACKAGE} package.json and .externs.js files"
2017-03-02 16:54:35 -05:00
rsync -am --include="package.json" --include="*/" --exclude=* ${SRC_DIR}/ ${NPM_DIR}/
rsync -am --include="*.externs.js" --include="*/" --exclude=* ${SRC_DIR}/ ${NPM_DIR}/
2017-03-02 16:54:35 -05:00
cp ${ROOT_DIR}/README.md ${NPM_DIR}/
fi
2017-03-02 16:54:35 -05:00
if [[ -d ${NPM_DIR} ]]; then
2016-06-21 17:44:36 -04:00
(
2017-03-02 16:54:35 -05:00
echo "====== VERSION: Updating version references"
cd ${NPM_DIR}
echo "====== EXECUTE: perl -p -i -e \"s/0\.0\.0\-PLACEHOLDER/${VERSION}/g\" $""(grep -ril 0\.0\.0\-PLACEHOLDER .)"
perl -p -i -e "s/0\.0\.0\-PLACEHOLDER/${VERSION}/g" $(grep -ril 0\.0\.0\-PLACEHOLDER .) < /dev/null 2> /dev/null
)
fi
travisFoldEnd "build package: ${PACKAGE}"
done
if [[ ${BUILD_EXAMPLES} == true ]]; then
travisFoldStart "build examples" "no-xtrace"
2017-03-02 16:54:35 -05:00
echo "====== Building examples: ./packages/examples/build.sh ====="
./packages/examples/build.sh
travisFoldEnd "build examples"
fi
if [[ ${REMOVE_BENCHPRESS} == true ]]; then
travisFoldStart "remove benchpress" "no-xtrace"
echo ""
echo "==== Removing benchpress from publication"
rm -r dist/packages-dist/benchpress
travisFoldEnd "remove benchpress"
fi
# Print return arrows as a log separator
travisFoldReturnArrows