From 08655926f8931e557b537feef4f6397d721d19b4 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Sat, 3 Sep 2016 19:14:56 +0100 Subject: [PATCH] Fix local end-to-end testing flow (#566) --- package.json | 2 +- tasks/cra.sh | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ tasks/e2e.sh | 11 +++--- tasks/release.sh | 7 ++++ 4 files changed, 105 insertions(+), 6 deletions(-) create mode 100755 tasks/cra.sh diff --git a/package.json b/package.json index cc63214d209..9eac7bd0dbc 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "scripts": { "build": "node scripts/build.js", - "create-react-app": "node global-cli/index.js --scripts-version \"$PWD/`tasks/clean_pack.sh`\"", + "create-react-app": "tasks/cra.sh", "e2e": "tasks/e2e.sh", "start": "node scripts/start.js", "test": "node scripts/test.js --env=jsdom" diff --git a/tasks/cra.sh b/tasks/cra.sh new file mode 100755 index 00000000000..726c6de8499 --- /dev/null +++ b/tasks/cra.sh @@ -0,0 +1,91 @@ +#!/bin/bash +# Copyright (c) 2015-present, Facebook, Inc. +# All rights reserved. +# +# This source code is licensed under the BSD-style license found in the +# LICENSE file in the root directory of this source tree. An additional grant +# of patent rights can be found in the PATENTS file in the same directory. + +# ****************************************************************************** +# This creates an app with the global CLI and `react-scripts` from the source. +# It is useful for testing the end-to-end flow locally. +# ****************************************************************************** + +# Start in tasks/ even if run from root directory +cd "$(dirname "$0")" + +function cleanup { + echo 'Cleaning up.' + cd $root_path + # Uncomment when snapshot testing is enabled by default: + # rm ./template/src/__snapshots__/App.test.js.snap + rm -rf $clean_path +} + +# Error messages are redirected to stderr +function handle_error { + echo "$(basename $0): ERROR! An error was encountered executing line $1." 1>&2; + cleanup + echo 'Exiting with error.' 1>&2; + exit 1 +} + +function handle_exit { + cleanup + echo 'Exiting without error.' 1>&2; + exit +} + +# Exit the script with a helpful error message when any error is encountered +trap 'set +x; handle_error $LINENO $BASH_COMMAND' ERR + +# Cleanup before exit on any termination signal +trap 'set +x; handle_exit' SIGQUIT SIGTERM SIGINT SIGKILL SIGHUP + +# Echo every command being executed +set -x + +# Go to root +cd .. +root_path=$PWD + +# ****************************************************************************** +# Pack react-scripts so we can verify they work. +# ****************************************************************************** + +# Packing react-scripts takes some work because we want to clean it up first. +# Create a temporary clean folder that contains production only code. +# Do not overwrite any files in the current folder. +clean_path=`mktemp -d 2>/dev/null || mktemp -d -t 'clean_path'` + +# Copy some of the project files to the temporary folder. +# Exclude folders that definitely won’t be part of the package from processing. +# We will strip the dev-only code there, `npm pack`, and copy the package back. +cd $root_path +rsync -av --exclude='.git' --exclude=$clean_path\ + --exclude='node_modules' --exclude='build'\ + './' $clean_path >/dev/null + +# Open the clean folder +cd $clean_path +# Now remove all the code relevant to development of Create React App. +files="$(find -L . -name "*.js" -type f)" +for file in $files; do + sed -i.bak '/\/\/ @remove-on-publish-begin/,/\/\/ @remove-on-publish-end/d' $file + rm $file.bak +done + +# Finally, pack react-scripts +cp -rf $root_path/node_modules $clean_path +scripts_path=$clean_path/`npm pack` + +# ****************************************************************************** +# Now that we have packed them, call the global CLI. +# ****************************************************************************** + +# Go back to the root directory and run the command from here +cd $root_path +node global-cli/index.js --scripts-version=$scripts_path "$@" + +# Cleanup +cleanup diff --git a/tasks/e2e.sh b/tasks/e2e.sh index b49c4934197..0cd92b0d25e 100755 --- a/tasks/e2e.sh +++ b/tasks/e2e.sh @@ -6,6 +6,11 @@ # LICENSE file in the root directory of this source tree. An additional grant # of patent rights can be found in the PATENTS file in the same directory. +# ****************************************************************************** +# This is an end-to-end test intended to run on CI. +# You can also run it locally but it's slow. +# ****************************************************************************** + # Start in tasks/ even if run from root directory cd "$(dirname "$0")" @@ -14,7 +19,7 @@ function cleanup { cd $root_path # Uncomment when snapshot testing is enabled by default: # rm ./template/src/__snapshots__/App.test.js.snap - rm -rf $temp_cli_path $temp_app_path + rm -rf $temp_cli_path $temp_app_path $clean_path } # Error messages are redirected to stderr @@ -102,10 +107,6 @@ for file in $files; do rm $file.bak done -# A hacky way to avoid bundling dependencies. -# Packing with them enabled takes too much memory, and Travis crashes. -perl -i -p0e 's/bundledDependencies.*?]/bundledDependencies": []/s' package.json - # Finally, pack react-scripts npm install scripts_path=$clean_path/`npm pack` diff --git a/tasks/release.sh b/tasks/release.sh index 01779cfb9be..83c9fefada0 100755 --- a/tasks/release.sh +++ b/tasks/release.sh @@ -6,6 +6,13 @@ # LICENSE file in the root directory of this source tree. An additional grant # of patent rights can be found in the PATENTS file in the same directory. +# ****************************************************************************** +# This releases an update to the `react-scripts` package. +# Don't use `npm publish` for it. +# Read the release instructions: +# https://github.com/facebookincubator/create-react-app/blob/master/CONTRIBUTING.md#cutting-a-release +# ****************************************************************************** + # Start in tasks/ even if run from root directory cd "$(dirname "$0")"