Debugging
$Flow$DebugPrint
, $Flow$DebugThrow
, $Flow$DebugSleep
β
Throw and sleep are not very useful in normal code. Throw kills Flow and sleep adds delay in seconds. More useful is debug print which prints debug information:
// @flow strict
const x = 10;
declare var flowDebugPrint: $Flow$DebugPrint;
flowDebugPrint(x);
Output:
π universe [master] y flow
yarn run v1.16.0
$ /Users/mrtnzlml/Work/kiwi-private/incubator/universe/node_modules/.bin/flow
Error ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ src/test.js:4:1
{
"reason":{
"pos":{
"source":"/Users/mrtnzlml/Work/kiwi-private/incubator/universe/src/test.js",
"type":"SourceFile",
"start":{"line":4,"column":16},
"end":{"line":4,"column":16}
},
"desc":"number"
},
"kind":"NumT",
"literal":"10"
}
1β // @flow strict
2β const x = 10;
3β declare var flowDebugPrint: $Flow$DebugPrint;
4β flowDebugPrint(x);
5β
Found 1 error
Advanced debuggingβ
yarn flow
errors may be sometimes very cryptic:
Error ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ src/apps/autobooking/queries/Autobooking.js:27:26
Cannot call await with context.dataLoaders.autobooking.getResult(...) bound to p because property autobooking is missing
in Promise [1].
src/apps/autobooking/queries/Autobooking.js
24β { bid }: argsType,
25β context: GraphqlContextType
26β ): Promise<AutobookingType> => {
27β const result = await context.dataLoaders.autobooking.getResult(bid)
28β const { autobooking, status } = result
29β
30β if (autobooking === null) {
src/apps/autobooking/Datasource.js
[1] 19β ): Promise<{|
20β +autobooking: Autobooking | null,
21β +status: string
22β |}> {
It helps to inspect the whole stacktrace using yarn flow --show-all-branches
:
Error ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ src/apps/autobooking/queries/Autobooking.js:27:26
Cannot call await with context.dataLoaders.autobooking.getResult(...) bound to p because:
β’ Either cannot return object literal because in property status of type argument R [1]:
β’ Either string [2] is incompatible with string literal pending [3].
β’ Or string [2] is incompatible with string literal check_failed [4].
β’ Or string [2] is incompatible with string literal ready [5].
β’ Or string [2] is incompatible with string literal started [6].
β’ Or string [2] is incompatible with string literal too_expensive [7].
β’ Or property autobooking is missing in Promise [8].
src/apps/autobooking/queries/Autobooking.js
24β { bid }: argsType,
25β context: GraphqlContextType
26β ): Promise<AutobookingType> => {
27β const result = await context.dataLoaders.autobooking.getResult(bid)
28β const { autobooking, status } = result
29β
30β if (autobooking === null) {
/private/tmp/flow/flowlib_2c621631/core.js
[1] 583β declare class Promise<+R> {
src/apps/autobooking/Datasource.js
[8] 19β ): Promise<{|
20β +autobooking: Autobooking | null,
[2] 21β +status: string
22β |}> {
src/apps/autobooking/apiTypes/Autobooking.js
[3][4][5][6][7] 7β status: 'pending' | 'check_failed' | 'ready' | 'started' | 'too_expensive'
You can eventually use yarn flow check --traces 100