From ab1f74fc68379451438fd2a3b4a18f9fc8c75217 Mon Sep 17 00:00:00 2001
From: Dan Abramov <dan.abramov@gmail.com>
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 cc63214d2..9eac7bd0d 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 000000000..726c6de84
--- /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 b49c49341..0cd92b0d2 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 01779cfb9..83c9fefad 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")"
 
-- 
GitLab