-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathrun
executable file
·235 lines (206 loc) · 8.83 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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#!/usr/bin/env bash
# This script defines common commands used during building / developing `waspc` project
# and makes it easy to run them.
SCRIPT_DIR=$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)
PROJECT_ROOT=$SCRIPT_DIR
COMMAND=${1:-watch}
shift
ARGS=("$@") # NOTE: This is a bash array!
BOLD="\033[1m"
RESET="\033[0m"
LIGHT_CYAN="\033[96m"
YELLOW="\033[33m"
GREEN="\033[32m"
RED="\033[31m"
DEFAULT_COLOR="\033[39m"
WASP_PACKAGES_COMPILE="${SCRIPT_DIR}/tools/install_packages_to_data_dir.sh"
BUILD_HS_CMD="cabal build all"
BUILD_HS_FULL_CMD="cabal build all --enable-tests --enable-benchmarks"
BUILD_ALL_CMD="$WASP_PACKAGES_COMPILE && $BUILD_HS_CMD"
INSTALL_CMD="$WASP_PACKAGES_COMPILE && cabal install --overwrite-policy=always"
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_INSTALL_WASP_APP_RUNNER="cd $PROJECT_ROOT/../wasp-app-runner && npm install && npm run install:global"
TEST_HEADLESS_CMD="$TEST_INSTALL_WASP_APP_RUNNER && cd $PROJECT_ROOT/examples/todoApp && npm install && DEBUG=pw:webserver npx playwright test --config headless-tests"
TEST_CMD="cabal test && echo 'Running headless tests' && $TEST_HEADLESS_CMD && echo 'ALL TESTS PASSED' || { echo 'SOME TESTS FAILED'; exit 1; }"
RUN_CMD="cabal --project-dir=${PROJECT_ROOT} run wasp-cli ${ARGS[@]}"
GHCID_CMD="ghcid --command=cabal repl"
# ghc version below should be the one from `cabal.project` file, `with-compiler` field.
GHCUP_SET="ghcup set ghc 8.10.7 && ghcup set hls 2.2.0.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_HS_FULL_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')"
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 $" ${YELLOW}${BOLD}${1}${RESET}"
echo -e "$2" | fold -s -w 80 | awk -v indent=" " '{print indent $0}'
}
echo_bold "USAGE"
echo " run <command>"
echo ""
echo_bold "COMMANDS"
print_usage_cmd "build" \
"Builds the Haskell project."
print_usage_cmd "build:all" \
"Builds the Haskell project + all sub-projects (i.e. TS packages)."
print_usage_cmd "build:packages" \
"Builds the TypeScript projects under packages/."
echo ""
print_usage_cmd "wasp-cli <args>" \
"Runs the dev version of wasp executable while forwarding arguments. Builds the project (hs) first if needed. Doesn't require you to be in the waspc project to run it."
echo ""
print_usage_cmd "install" \
"Installs the wasp executable as 'wasp-cli' globally on the machine."
echo ""
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."
echo ""
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."
echo ""
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."
echo ""
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_HS_CMD"
;;
build:all)
echo_and_eval "$BUILD_ALL_CMD"
;;
build:packages)
echo_and_eval "$WASP_PACKAGES_COMPILE"
;;
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."
;;
ghcup-set)
echo_and_eval "$GHCUP_SET"
;;
*)
print_usage
exit 1
esac