-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
run
executable file
·209 lines (191 loc) · 8.02 KB
/
run
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#!/usr/bin/env bash
# This script defines common commands used during building / developing
# and makes it easy to run them.
SCRIPT_DIR=$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)
PROJECT_ROOT=$SCRIPT_DIR
THIS=$0
COMMAND=${1:-watch}
shift
ARGS=("$@") # NOTE: This is a bash array!
BOLD="\033[1m"
UNDERLINED="\033[4m"
RESET="\033[0m"
LIGHT_CYAN="\033[96m"
GREEN="\033[32m"
RED="\033[31m"
DEFAULT_COLOR="\033[39m"
BUILD_CMD="cabal build all"
INSTALL_CMD="${SCRIPT_DIR}/tools/install_packages_to_data_dir.sh && cabal install --overwrite-policy=always"
BUILD_ALL_CMD="cabal build all --enable-tests --enable-benchmarks"
TEST_UNIT_CMD="cabal test waspc-test"
TEST_CLI_CMD="cabal test cli-test"
TEST_E2E_CMD="cabal test e2e-test"
TEST_E2E_DELETE_GOLDENS="rm -rf $PROJECT_ROOT/e2e-test/test-outputs/*-golden"
TEST_E2E_ACCEPT_ALL_CMD="$TEST_E2E_DELETE_GOLDENS && $TEST_E2E_CMD"
TEST_HEADLESS_CMD="cd headless-test && npm install && npx playwright test"
TEST_CMD="cabal test && echo 'Running headless tests' && $TEST_HEADLESS_CMD && echo 'ALL TESTS PASSED' || { echo 'SOME TESTS FAILED'; exit 1; }"
RUN_CMD="cabal run wasp-cli ${ARGS[@]}"
GHCID_CMD="ghcid --command=cabal repl"
GHCUP_SET="ghcup set ghc 8.10.7 && ghcup set hls 2.2.0"
DEV_TOOLS_BIN="$PROJECT_ROOT/.bin"
function install_dev_tool () {
echo "cabal --project-file=$PROJECT_ROOT/dev-tool.project install $1 --installdir=$DEV_TOOLS_BIN --install-method=copy --overwrite-policy=always"
}
function dev_tool_path () {
echo "$DEV_TOOLS_BIN/$1"
}
STAN_CMD="$BUILD_ALL_CMD && $(install_dev_tool stan) && $(dev_tool_path stan) report ${ARGS[@]}"
HLINT_CMD="$(install_dev_tool hlint) && $(dev_tool_path hlint) . ${ARGS[@]}"
PRUNE_JUICE_CMD="$(install_dev_tool prune-juice) && $(dev_tool_path prune-juice) ${ARGS[@]}"
ORMOLU_BASE_CMD="$(install_dev_tool ormolu) && $(dev_tool_path ormolu) --color always --check-idempotence"
ORMOLU_CHECK_CMD="$ORMOLU_BASE_CMD --mode check "'$'"(git ls-files '*.hs' '*.hs-boot')"
ORMOLU_FORMAT_CMD="$ORMOLU_BASE_CMD --mode inplace "'$'"(git ls-files '*.hs' '*.hs-boot')"
WASP_PACKAGES_COMPILE="$SCRIPT_DIR/tools/install_packages_to_data_dir.sh"
echo_and_eval () {
echo -e $"${LIGHT_CYAN}Running:${DEFAULT_COLOR}" $1 "\n"
eval $1
}
echo_bold () { echo -e $"${BOLD}${1}${RESET}"; }
print_usage () {
print_usage_cmd () {
echo -e $" ${UNDERLINED}${1}${RESET}"
echo -e " $2";
}
echo_bold "Usage: run <command>"
echo "Commands:"
print_usage_cmd "build" \
"Builds the project."
print_usage_cmd "install" \
"Installs the project locally using cabal (runs '${SCRIPT_DIR}/tools/install_packages_to_data_dir.sh' and 'cabal install')."
print_usage_cmd "test" \
"Executes all tests (unit + e2e + headless). Builds the project first if needed."
print_usage_cmd "test:unit [pattern]" \
"Executes only unit tests. Builds the project first if needed. If pattern is provided, it will run only tests whose description/name matches the pattern. Check https://github.com/UnkindPartition/tasty#patterns to learn more about valid patterns."
print_usage_cmd "test:cli" \
"Executes only cli unit tests. Builds the project first if needed."
print_usage_cmd "test:e2e" \
"Executes only e2e tests. Builds the project first if needed."
print_usage_cmd "test:e2e:accept-all" \
"Accepts any diffs in the generated code in e2e tests. Does so by deleting current golden output and re-running e2e tests to produce new golden output."
print_usage_cmd "test:headless" \
"Executes headless tests, where example wasp apps are e2e tested using Playwright."
print_usage_cmd "wasp-cli <args>" \
"Runs the wasp executable while forwarding arguments. Builds the project first if needed."
print_usage_cmd "ghcid" \
"Runs ghcid, which watches source file changes and reports errors. Does not watch tests."
print_usage_cmd "ghcid-test" \
"Runs ghcid on both source and tests."
print_usage_cmd "code-check" \
"Checks code by running it through formatter, linter and static analysis."
print_usage_cmd "stan <args>" \
"Runs static code analysis on the code, generating stan.html. Builds the project first if needed."
print_usage_cmd "hlint <args>" \
"Runs linter on the codebase."
print_usage_cmd "prune-juice <args>" \
"Runs prune-juice on the codebase, which detects unused dependencies."
print_usage_cmd "ormolu:check" \
"Runs the code formatter and reports if code is correctly formatted or not."
print_usage_cmd "ormolu:format" \
"Runs the code formatter and formats the code in place."
print_usage_cmd "module-graph" \
"Creates graph of modules in the project. Needs graphmod (available on hackage) and graphviz (your os distribution) installed."
print_usage_cmd "wasp-packages:compile" \
"Compiles the TS projects under packages/."
print_usage_cmd "ghcup-set" \
"Sets the correct version of GHC and Cabal for this project (via GHCup)."
}
exitStatusToString () {
if (( $1 == 0 )); then echo "${GREEN}OK${RESET}"; else echo "${RED}FAIL${RESET}"; fi
}
case $COMMAND in
build)
echo_and_eval "$BUILD_CMD"
;;
install)
echo_and_eval "$INSTALL_CMD"
;;
ghcid)
echo_and_eval "$GHCID_CMD"
;;
ghcid-test)
# --color always is needed for Tasty to turn on the coloring.
# NOTE: I did not put this into variable because I was not able to put single quotes
# around :main --color always that way and it was not working.
ghcid -T=':main --color always' --command=cabal repl test/TastyDiscoverDriver.hs
;;
test)
echo_and_eval "$TEST_CMD"
;;
test:unit)
TEST_PATTERN="${ARGS[0]}"
if [[ -z "$TEST_PATTERN" ]]
then
echo_and_eval "$TEST_UNIT_CMD"
else
echo_and_eval "$TEST_UNIT_CMD --test-options \"-p \\\"$TEST_PATTERN\\\"\""
fi
;;
test:cli)
echo_and_eval "$TEST_CLI_CMD"
;;
test:e2e)
echo_and_eval "$TEST_E2E_CMD"
;;
test:e2e:accept-all)
echo_and_eval "$TEST_E2E_ACCEPT_ALL_CMD"
;;
test:headless)
echo_and_eval "$TEST_HEADLESS_CMD"
;;
wasp-cli)
echo_and_eval "$RUN_CMD"
;;
stan)
echo_and_eval "$STAN_CMD"
;;
hlint)
echo_and_eval "$HLINT_CMD"
;;
prune-juice)
echo_and_eval "$PRUNE_JUICE_CMD"
;;
ormolu:check)
echo_and_eval "$ORMOLU_CHECK_CMD"
;;
ormolu:format)
echo_and_eval "$ORMOLU_FORMAT_CMD"
;;
code-check)
echo_and_eval "$ORMOLU_CHECK_CMD"
ORMOLU_RESULT=$?
echo_and_eval "$HLINT_CMD"
HLINT_RESULT=$?
echo_and_eval "$STAN_CMD"
STAN_RESULT=$?
TOTAL_RESULT=$(($ORMOLU_RESULT || $HLINT_RESULT || $STAN_RESULT))
echo
echo
echo "======================================"
echo " SUMMARY"
echo "======================================"
echo
echo -e "Formatter (ormolu): $(exitStatusToString $ORMOLU_RESULT)"
echo -e "Linter (hlint): $(exitStatusToString $HLINT_RESULT)"
echo -e "Static analysis (stan): $(exitStatusToString $STAN_RESULT)"
echo "-----------------------"
echo -e "All together: $(exitStatusToString $TOTAL_RESULT)"
exit $TOTAL_RESULT
;;
module-graph)
echo_and_eval "graphmod --quiet --prune-edges $PROJECT_ROOT/src/**/*.hs | dot -Gsize=60,60! -Tpng -o module-graph.png" && echo "Printed module graph to module-graph.png."
;;
wasp-packages:compile)
echo_and_eval "$WASP_PACKAGES_COMPILE"
;;
ghcup-set)
echo_and_eval "$GHCUP_SET"
;;
*)
print_usage
exit 1
esac