mirror of
https://github.com/zhigang1992/create-react-app.git
synced 2026-01-13 17:02:52 +08:00
289 lines
9.5 KiB
Bash
Executable File
289 lines
9.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Copyright (c) 2015-present, Facebook, Inc.
|
|
#
|
|
# This source code is licensed under the MIT license found in the
|
|
# LICENSE file in the root directory of this source tree.
|
|
|
|
# ******************************************************************************
|
|
# 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")"
|
|
|
|
# CLI and app temporary locations
|
|
# http://unix.stackexchange.com/a/84980
|
|
temp_app_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_app_path'`
|
|
|
|
# Load functions for working with local NPM registry (Verdaccio)
|
|
source local-registry.sh
|
|
|
|
function cleanup {
|
|
echo 'Cleaning up.'
|
|
cd "$root_path"
|
|
rm -rf "$temp_app_path"
|
|
# Restore the original NPM and Yarn registry URLs and stop Verdaccio
|
|
stopLocalRegistry
|
|
}
|
|
|
|
# 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
|
|
}
|
|
|
|
# Check for the existence of one or more files.
|
|
function exists {
|
|
for f in $*; do
|
|
test -e "$f"
|
|
done
|
|
}
|
|
|
|
# Check for accidental dependencies in package.json
|
|
function checkDependencies {
|
|
if ! awk '/"dependencies": {/{y=1;next}/},/{y=0; next}y' package.json | \
|
|
grep -v -q -E '^\s*"(@testing-library\/.+)|(react(-dom|-scripts)?)"'; then
|
|
echo "Dependencies are correct"
|
|
else
|
|
echo "There are extraneous dependencies in package.json"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Check for accidental dependencies in package.json
|
|
function checkTypeScriptDependencies {
|
|
if ! awk '/"dependencies": {/{y=1;next}/},/{y=0; next}y' package.json | \
|
|
grep -v -q -E '^\s*"(@testing-library\/.+)|(@types\/.+)|typescript|(react(-dom|-scripts)?)"'; then
|
|
echo "Dependencies are correct"
|
|
else
|
|
echo "There are extraneous dependencies in package.json"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# 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
|
|
|
|
if hash npm 2>/dev/null
|
|
then
|
|
npm i -g npm@latest
|
|
fi
|
|
|
|
# Bootstrap monorepo
|
|
yarn
|
|
|
|
# ******************************************************************************
|
|
# First, publish the monorepo.
|
|
# ******************************************************************************
|
|
|
|
# Start the local NPM registry
|
|
startLocalRegistry "$root_path"/tasks/verdaccio.yaml
|
|
|
|
# Publish the monorepo
|
|
publishToLocalRegistry
|
|
|
|
echo "Create React App Version: "
|
|
npx create-react-app --version
|
|
|
|
# ******************************************************************************
|
|
# Test --scripts-version with a distribution tag
|
|
# ******************************************************************************
|
|
|
|
cd "$temp_app_path"
|
|
npx create-react-app test-app-dist-tag --scripts-version=@latest
|
|
cd test-app-dist-tag
|
|
|
|
# Check corresponding scripts version is installed and no TypeScript is present.
|
|
exists node_modules/react-scripts
|
|
! exists node_modules/typescript
|
|
! exists src/index.tsx
|
|
exists src/index.js
|
|
checkDependencies
|
|
|
|
# ******************************************************************************
|
|
# Test --scripts-version with a version number
|
|
# ******************************************************************************
|
|
|
|
cd "$temp_app_path"
|
|
npx create-react-app test-app-version-number --scripts-version=1.0.17
|
|
cd test-app-version-number
|
|
|
|
# Check corresponding scripts version is installed.
|
|
exists node_modules/react-scripts
|
|
grep '"version": "1.0.17"' node_modules/react-scripts/package.json
|
|
checkDependencies
|
|
|
|
# ******************************************************************************
|
|
# Test --use-npm flag
|
|
# ******************************************************************************
|
|
|
|
cd "$temp_app_path"
|
|
npx create-react-app test-use-npm-flag --use-npm --scripts-version=1.0.17
|
|
cd test-use-npm-flag
|
|
|
|
# Check corresponding scripts version is installed.
|
|
exists node_modules/react-scripts
|
|
[ ! -e "yarn.lock" ] && echo "yarn.lock correctly does not exist"
|
|
grep '"version": "1.0.17"' node_modules/react-scripts/package.json
|
|
checkDependencies
|
|
|
|
# ******************************************************************************
|
|
# Test --typescript flag
|
|
# ******************************************************************************
|
|
|
|
cd "$temp_app_path"
|
|
npx create-react-app test-app-typescript --typescript
|
|
cd test-app-typescript
|
|
|
|
# Check corresponding template is installed.
|
|
exists node_modules/react-scripts
|
|
exists node_modules/typescript
|
|
exists src/index.tsx
|
|
exists tsconfig.json
|
|
exists src/react-app-env.d.ts
|
|
checkTypeScriptDependencies
|
|
|
|
# Check that the TypeScript template passes smoke tests, build, and normal tests
|
|
yarn start --smoke-test
|
|
yarn build
|
|
CI=true yarn test
|
|
|
|
# Check eject behaves and works
|
|
|
|
# Eject...
|
|
echo yes | npm run eject
|
|
|
|
# Temporary workaround for https://github.com/facebook/create-react-app/issues/6099
|
|
rm yarn.lock
|
|
yarn add @babel/plugin-transform-react-jsx-source @babel/plugin-syntax-jsx @babel/plugin-transform-react-jsx @babel/plugin-transform-react-jsx-self
|
|
|
|
# Ensure env file still exists
|
|
exists src/react-app-env.d.ts
|
|
|
|
# Check that the TypeScript template passes ejected smoke tests, build, and normal tests
|
|
yarn start --smoke-test
|
|
yarn build
|
|
CI=true yarn test
|
|
|
|
# ******************************************************************************
|
|
# Test --scripts-version with a tarball url
|
|
# ******************************************************************************
|
|
|
|
cd "$temp_app_path"
|
|
npx create-react-app test-app-tarball-url --scripts-version=https://registry.npmjs.org/react-scripts/-/react-scripts-1.0.17.tgz
|
|
cd test-app-tarball-url
|
|
|
|
# Check corresponding scripts version is installed.
|
|
exists node_modules/react-scripts
|
|
grep '"version": "1.0.17"' node_modules/react-scripts/package.json
|
|
checkDependencies
|
|
|
|
# ******************************************************************************
|
|
# Test --scripts-version with a custom fork of react-scripts
|
|
# ******************************************************************************
|
|
|
|
cd "$temp_app_path"
|
|
npx create-react-app test-app-fork --scripts-version=react-scripts-fork
|
|
cd test-app-fork
|
|
|
|
# Check corresponding scripts version is installed.
|
|
exists node_modules/react-scripts-fork
|
|
|
|
# ******************************************************************************
|
|
# Test project folder is deleted on failing package installation
|
|
# ******************************************************************************
|
|
|
|
cd "$temp_app_path"
|
|
# we will install a non-existing package to simulate a failed installation.
|
|
npx create-react-app test-app-should-not-exist --scripts-version=`date +%s` || true
|
|
# confirm that the project files were deleted
|
|
test ! -e test-app-should-not-exist/package.json
|
|
test ! -d test-app-should-not-exist/node_modules
|
|
|
|
# ******************************************************************************
|
|
# Test project folder is not deleted when creating app over existing folder
|
|
# ******************************************************************************
|
|
|
|
cd "$temp_app_path"
|
|
mkdir test-app-should-remain
|
|
echo '## Hello' > ./test-app-should-remain/README.md
|
|
# we will install a non-existing package to simulate a failed installation.
|
|
npx create-react-app test-app-should-remain --scripts-version=`date +%s` || true
|
|
# confirm the file exist
|
|
test -e test-app-should-remain/README.md
|
|
# confirm only README.md and error log are the only files in the directory
|
|
if [ "$(ls -1 ./test-app-should-remain | wc -l | tr -d '[:space:]')" != "2" ]; then
|
|
false
|
|
fi
|
|
|
|
# ******************************************************************************
|
|
# Test --scripts-version with a scoped fork tgz of react-scripts
|
|
# ******************************************************************************
|
|
|
|
cd $temp_app_path
|
|
curl "https://registry.npmjs.org/@enoah_netzach/react-scripts/-/react-scripts-0.9.0.tgz" -o enoah-scripts-0.9.0.tgz
|
|
npx create-react-app test-app-scoped-fork-tgz --scripts-version=$temp_app_path/enoah-scripts-0.9.0.tgz
|
|
cd test-app-scoped-fork-tgz
|
|
|
|
# Check corresponding scripts version is installed.
|
|
exists node_modules/@enoah_netzach/react-scripts
|
|
|
|
# ******************************************************************************
|
|
# Test nested folder path as the project name
|
|
# ******************************************************************************
|
|
|
|
# Testing a path that exists
|
|
cd "$temp_app_path"
|
|
mkdir test-app-nested-paths-t1
|
|
cd test-app-nested-paths-t1
|
|
mkdir -p test-app-nested-paths-t1/aa/bb/cc/dd
|
|
npx create-react-app test-app-nested-paths-t1/aa/bb/cc/dd
|
|
cd test-app-nested-paths-t1/aa/bb/cc/dd
|
|
yarn start --smoke-test
|
|
|
|
# Testing a path that does not exist
|
|
cd "$temp_app_path"
|
|
npx create-react-app test-app-nested-paths-t2/aa/bb/cc/dd
|
|
cd test-app-nested-paths-t2/aa/bb/cc/dd
|
|
yarn start --smoke-test
|
|
|
|
# Testing a path that is half exists
|
|
cd "$temp_app_path"
|
|
mkdir -p test-app-nested-paths-t3/aa
|
|
npx create-react-app test-app-nested-paths-t3/aa/bb/cc/dd
|
|
cd test-app-nested-paths-t3/aa/bb/cc/dd
|
|
yarn start --smoke-test
|
|
|
|
# ******************************************************************************
|
|
# Test when PnP is enabled
|
|
# ******************************************************************************
|
|
cd "$temp_app_path"
|
|
npx create-react-app test-app-pnp --use-pnp
|
|
cd test-app-pnp
|
|
! exists node_modules
|
|
exists .pnp.js
|
|
yarn start --smoke-test
|
|
yarn build
|
|
|
|
# Cleanup
|
|
cleanup
|