@@ -42,13 +42,13 @@ export function isCallExpression(
4242}
4343
4444export function isNewExpression (
45- node : TSESTree . Node
45+ node : TSESTree . Node | null | undefined
4646) : node is TSESTree . NewExpression {
4747 return node ?. type === 'NewExpression' ;
4848}
4949
5050export function isMemberExpression (
51- node : TSESTree . Node
51+ node : TSESTree . Node | null | undefined
5252) : node is TSESTree . MemberExpression {
5353 return node ?. type === AST_NODE_TYPES . MemberExpression ;
5454}
@@ -60,31 +60,31 @@ export function isLiteral(
6060}
6161
6262export function isImportSpecifier (
63- node : TSESTree . Node
63+ node : TSESTree . Node | null | undefined
6464) : node is TSESTree . ImportSpecifier {
6565 return node ?. type === AST_NODE_TYPES . ImportSpecifier ;
6666}
6767
6868export function isImportNamespaceSpecifier (
69- node : TSESTree . Node
69+ node : TSESTree . Node | null | undefined
7070) : node is TSESTree . ImportNamespaceSpecifier {
7171 return node ?. type === AST_NODE_TYPES . ImportNamespaceSpecifier ;
7272}
7373
7474export function isImportDefaultSpecifier (
75- node : TSESTree . Node
75+ node : TSESTree . Node | null | undefined
7676) : node is TSESTree . ImportDefaultSpecifier {
7777 return node ?. type === AST_NODE_TYPES . ImportDefaultSpecifier ;
7878}
7979
8080export function isBlockStatement (
81- node : TSESTree . Node
81+ node : TSESTree . Node | null | undefined
8282) : node is TSESTree . BlockStatement {
8383 return node ?. type === AST_NODE_TYPES . BlockStatement ;
8484}
8585
8686export function isObjectPattern (
87- node : TSESTree . Node
87+ node : TSESTree . Node | null | undefined
8888) : node is TSESTree . ObjectPattern {
8989 return node ?. type === AST_NODE_TYPES . ObjectPattern ;
9090}
@@ -96,13 +96,13 @@ export function isProperty(
9696}
9797
9898export function isJSXAttribute (
99- node : TSESTree . Node
99+ node : TSESTree . Node | null | undefined
100100) : node is TSESTree . JSXAttribute {
101101 return node ?. type === AST_NODE_TYPES . JSXAttribute ;
102102}
103103
104104export function isExpressionStatement (
105- node : TSESTree . Node
105+ node : TSESTree . Node | null | undefined
106106) : node is TSESTree . ExpressionStatement {
107107 return node ?. type === AST_NODE_TYPES . ExpressionStatement ;
108108}
@@ -137,7 +137,7 @@ export function findClosestCallExpressionNode(
137137export function findClosestCallNode (
138138 node : TSESTree . Node ,
139139 name : string
140- ) : TSESTree . CallExpression {
140+ ) : TSESTree . CallExpression | null {
141141 if ( ! node . parent ) {
142142 return null ;
143143 }
@@ -208,12 +208,12 @@ export function hasChainedThen(node: TSESTree.Node): boolean {
208208 const parent = node . parent ;
209209
210210 // wait(...).then(...)
211- if ( isCallExpression ( parent ) ) {
211+ if ( isCallExpression ( parent ) && parent . parent ) {
212212 return hasThenProperty ( parent . parent ) ;
213213 }
214214
215215 // promise.then(...)
216- return hasThenProperty ( parent ) ;
216+ return ! ! parent && hasThenProperty ( parent ) ;
217217}
218218
219219export function isPromiseIdentifier (
@@ -252,6 +252,7 @@ export function isPromisesArrayResolved(node: TSESTree.Node): boolean {
252252 }
253253
254254 return (
255+ ! ! closestCallExpression . parent &&
255256 isArrayExpression ( closestCallExpression . parent ) &&
256257 isCallExpression ( closestCallExpression . parent . parent ) &&
257258 ( isPromiseAll ( closestCallExpression . parent . parent ) ||
@@ -281,6 +282,9 @@ export function isPromiseHandled(nodeIdentifier: TSESTree.Identifier): boolean {
281282 ) ;
282283
283284 for ( const node of suspiciousNodes ) {
285+ if ( ! node || ! node . parent ) {
286+ continue ;
287+ }
284288 if ( ASTUtils . isAwaitExpression ( node . parent ) ) {
285289 return true ;
286290 }
@@ -449,7 +453,10 @@ export function getReferenceNode(
449453 | TSESTree . MemberExpression
450454 | TSESTree . Identifier
451455) : 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+ ) {
453460 return getReferenceNode ( node . parent ) ;
454461 }
455462
@@ -518,9 +525,10 @@ export function getAssertNodeInfo(
518525 let matcher = ASTUtils . getPropertyName ( node ) ;
519526 const isNegated = matcher === 'not' ;
520527 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 ;
524532 }
525533
526534 if ( ! matcher ) {
@@ -539,6 +547,7 @@ export function hasClosestExpectResolvesRejects(node: TSESTree.Node): boolean {
539547 if (
540548 isCallExpression ( node ) &&
541549 ASTUtils . isIdentifier ( node . callee ) &&
550+ node . parent &&
542551 isMemberExpression ( node . parent ) &&
543552 node . callee . name === 'expect'
544553 ) {
0 commit comments