@@ -42,13 +42,13 @@ export function isCallExpression(
42
42
}
43
43
44
44
export function isNewExpression (
45
- node : TSESTree . Node
45
+ node : TSESTree . Node | null | undefined
46
46
) : node is TSESTree . NewExpression {
47
47
return node ?. type === 'NewExpression' ;
48
48
}
49
49
50
50
export function isMemberExpression (
51
- node : TSESTree . Node
51
+ node : TSESTree . Node | null | undefined
52
52
) : node is TSESTree . MemberExpression {
53
53
return node ?. type === AST_NODE_TYPES . MemberExpression ;
54
54
}
@@ -60,31 +60,31 @@ export function isLiteral(
60
60
}
61
61
62
62
export function isImportSpecifier (
63
- node : TSESTree . Node
63
+ node : TSESTree . Node | null | undefined
64
64
) : node is TSESTree . ImportSpecifier {
65
65
return node ?. type === AST_NODE_TYPES . ImportSpecifier ;
66
66
}
67
67
68
68
export function isImportNamespaceSpecifier (
69
- node : TSESTree . Node
69
+ node : TSESTree . Node | null | undefined
70
70
) : node is TSESTree . ImportNamespaceSpecifier {
71
71
return node ?. type === AST_NODE_TYPES . ImportNamespaceSpecifier ;
72
72
}
73
73
74
74
export function isImportDefaultSpecifier (
75
- node : TSESTree . Node
75
+ node : TSESTree . Node | null | undefined
76
76
) : node is TSESTree . ImportDefaultSpecifier {
77
77
return node ?. type === AST_NODE_TYPES . ImportDefaultSpecifier ;
78
78
}
79
79
80
80
export function isBlockStatement (
81
- node : TSESTree . Node
81
+ node : TSESTree . Node | null | undefined
82
82
) : node is TSESTree . BlockStatement {
83
83
return node ?. type === AST_NODE_TYPES . BlockStatement ;
84
84
}
85
85
86
86
export function isObjectPattern (
87
- node : TSESTree . Node
87
+ node : TSESTree . Node | null | undefined
88
88
) : node is TSESTree . ObjectPattern {
89
89
return node ?. type === AST_NODE_TYPES . ObjectPattern ;
90
90
}
@@ -96,13 +96,13 @@ export function isProperty(
96
96
}
97
97
98
98
export function isJSXAttribute (
99
- node : TSESTree . Node
99
+ node : TSESTree . Node | null | undefined
100
100
) : node is TSESTree . JSXAttribute {
101
101
return node ?. type === AST_NODE_TYPES . JSXAttribute ;
102
102
}
103
103
104
104
export function isExpressionStatement (
105
- node : TSESTree . Node
105
+ node : TSESTree . Node | null | undefined
106
106
) : node is TSESTree . ExpressionStatement {
107
107
return node ?. type === AST_NODE_TYPES . ExpressionStatement ;
108
108
}
@@ -137,7 +137,7 @@ export function findClosestCallExpressionNode(
137
137
export function findClosestCallNode (
138
138
node : TSESTree . Node ,
139
139
name : string
140
- ) : TSESTree . CallExpression {
140
+ ) : TSESTree . CallExpression | null {
141
141
if ( ! node . parent ) {
142
142
return null ;
143
143
}
@@ -208,12 +208,12 @@ export function hasChainedThen(node: TSESTree.Node): boolean {
208
208
const parent = node . parent ;
209
209
210
210
// wait(...).then(...)
211
- if ( isCallExpression ( parent ) ) {
211
+ if ( isCallExpression ( parent ) && parent . parent ) {
212
212
return hasThenProperty ( parent . parent ) ;
213
213
}
214
214
215
215
// promise.then(...)
216
- return hasThenProperty ( parent ) ;
216
+ return ! ! parent && hasThenProperty ( parent ) ;
217
217
}
218
218
219
219
export function isPromiseIdentifier (
@@ -252,6 +252,7 @@ export function isPromisesArrayResolved(node: TSESTree.Node): boolean {
252
252
}
253
253
254
254
return (
255
+ ! ! closestCallExpression . parent &&
255
256
isArrayExpression ( closestCallExpression . parent ) &&
256
257
isCallExpression ( closestCallExpression . parent . parent ) &&
257
258
( isPromiseAll ( closestCallExpression . parent . parent ) ||
@@ -281,6 +282,9 @@ export function isPromiseHandled(nodeIdentifier: TSESTree.Identifier): boolean {
281
282
) ;
282
283
283
284
for ( const node of suspiciousNodes ) {
285
+ if ( ! node || ! node . parent ) {
286
+ continue ;
287
+ }
284
288
if ( ASTUtils . isAwaitExpression ( node . parent ) ) {
285
289
return true ;
286
290
}
@@ -449,7 +453,10 @@ export function getReferenceNode(
449
453
| TSESTree . MemberExpression
450
454
| TSESTree . Identifier
451
455
) : TSESTree . CallExpression | TSESTree . MemberExpression | TSESTree . Identifier {
452
- if ( isMemberExpression ( node . parent ) || isCallExpression ( node . parent ) ) {
456
+ if (
457
+ node . parent &&
458
+ ( isMemberExpression ( node . parent ) || isCallExpression ( node . parent ) )
459
+ ) {
453
460
return getReferenceNode ( node . parent ) ;
454
461
}
455
462
@@ -518,9 +525,10 @@ export function getAssertNodeInfo(
518
525
let matcher = ASTUtils . getPropertyName ( node ) ;
519
526
const isNegated = matcher === 'not' ;
520
527
if ( isNegated ) {
521
- matcher = isMemberExpression ( node . parent )
522
- ? ASTUtils . getPropertyName ( node . parent )
523
- : null ;
528
+ matcher =
529
+ node . parent && isMemberExpression ( node . parent )
530
+ ? ASTUtils . getPropertyName ( node . parent )
531
+ : null ;
524
532
}
525
533
526
534
if ( ! matcher ) {
@@ -539,6 +547,7 @@ export function hasClosestExpectResolvesRejects(node: TSESTree.Node): boolean {
539
547
if (
540
548
isCallExpression ( node ) &&
541
549
ASTUtils . isIdentifier ( node . callee ) &&
550
+ node . parent &&
542
551
isMemberExpression ( node . parent ) &&
543
552
node . callee . name === 'expect'
544
553
) {
0 commit comments