@@ -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
}
@@ -195,12 +195,12 @@ export function hasChainedThen(node: TSESTree.Node): boolean {
195
195
const parent = node . parent ;
196
196
197
197
// wait(...).then(...)
198
- if ( isCallExpression ( parent ) ) {
198
+ if ( isCallExpression ( parent ) && parent . parent ) {
199
199
return hasThenProperty ( parent . parent ) ;
200
200
}
201
201
202
202
// promise.then(...)
203
- return hasThenProperty ( parent ) ;
203
+ return ! ! parent && hasThenProperty ( parent ) ;
204
204
}
205
205
206
206
export function isPromiseIdentifier (
@@ -239,6 +239,7 @@ export function isPromisesArrayResolved(node: TSESTree.Node): boolean {
239
239
}
240
240
241
241
return (
242
+ ! ! closestCallExpression . parent &&
242
243
isArrayExpression ( closestCallExpression . parent ) &&
243
244
isCallExpression ( closestCallExpression . parent . parent ) &&
244
245
( isPromiseAll ( closestCallExpression . parent . parent ) ||
@@ -268,6 +269,9 @@ export function isPromiseHandled(nodeIdentifier: TSESTree.Identifier): boolean {
268
269
) ;
269
270
270
271
for ( const node of suspiciousNodes ) {
272
+ if ( ! node || ! node . parent ) {
273
+ continue ;
274
+ }
271
275
if ( ASTUtils . isAwaitExpression ( node . parent ) ) {
272
276
return true ;
273
277
}
@@ -436,7 +440,10 @@ export function getReferenceNode(
436
440
| TSESTree . MemberExpression
437
441
| TSESTree . Identifier
438
442
) : TSESTree . CallExpression | TSESTree . MemberExpression | TSESTree . Identifier {
439
- if ( isMemberExpression ( node . parent ) || isCallExpression ( node . parent ) ) {
443
+ if (
444
+ node . parent &&
445
+ ( isMemberExpression ( node . parent ) || isCallExpression ( node . parent ) )
446
+ ) {
440
447
return getReferenceNode ( node . parent ) ;
441
448
}
442
449
@@ -505,9 +512,10 @@ export function getAssertNodeInfo(
505
512
let matcher = ASTUtils . getPropertyName ( node ) ;
506
513
const isNegated = matcher === 'not' ;
507
514
if ( isNegated ) {
508
- matcher = isMemberExpression ( node . parent )
509
- ? ASTUtils . getPropertyName ( node . parent )
510
- : null ;
515
+ matcher =
516
+ node . parent && isMemberExpression ( node . parent )
517
+ ? ASTUtils . getPropertyName ( node . parent )
518
+ : null ;
511
519
}
512
520
513
521
if ( ! matcher ) {
@@ -526,6 +534,7 @@ export function hasClosestExpectResolvesRejects(node: TSESTree.Node): boolean {
526
534
if (
527
535
isCallExpression ( node ) &&
528
536
ASTUtils . isIdentifier ( node . callee ) &&
537
+ node . parent &&
529
538
isMemberExpression ( node . parent ) &&
530
539
node . callee . name === 'expect'
531
540
) {
0 commit comments