@@ -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 }
@@ -195,12 +195,12 @@ export function hasChainedThen(node: TSESTree.Node): boolean {
195195 const parent = node . parent ;
196196
197197 // wait(...).then(...)
198- if ( isCallExpression ( parent ) ) {
198+ if ( isCallExpression ( parent ) && parent . parent ) {
199199 return hasThenProperty ( parent . parent ) ;
200200 }
201201
202202 // promise.then(...)
203- return hasThenProperty ( parent ) ;
203+ return ! ! parent && hasThenProperty ( parent ) ;
204204}
205205
206206export function isPromiseIdentifier (
@@ -239,6 +239,7 @@ export function isPromisesArrayResolved(node: TSESTree.Node): boolean {
239239 }
240240
241241 return (
242+ ! ! closestCallExpression . parent &&
242243 isArrayExpression ( closestCallExpression . parent ) &&
243244 isCallExpression ( closestCallExpression . parent . parent ) &&
244245 ( isPromiseAll ( closestCallExpression . parent . parent ) ||
@@ -268,6 +269,9 @@ export function isPromiseHandled(nodeIdentifier: TSESTree.Identifier): boolean {
268269 ) ;
269270
270271 for ( const node of suspiciousNodes ) {
272+ if ( ! node || ! node . parent ) {
273+ continue ;
274+ }
271275 if ( ASTUtils . isAwaitExpression ( node . parent ) ) {
272276 return true ;
273277 }
@@ -436,7 +440,10 @@ export function getReferenceNode(
436440 | TSESTree . MemberExpression
437441 | TSESTree . Identifier
438442) : 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+ ) {
440447 return getReferenceNode ( node . parent ) ;
441448 }
442449
@@ -505,9 +512,10 @@ export function getAssertNodeInfo(
505512 let matcher = ASTUtils . getPropertyName ( node ) ;
506513 const isNegated = matcher === 'not' ;
507514 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 ;
511519 }
512520
513521 if ( ! matcher ) {
@@ -526,6 +534,7 @@ export function hasClosestExpectResolvesRejects(node: TSESTree.Node): boolean {
526534 if (
527535 isCallExpression ( node ) &&
528536 ASTUtils . isIdentifier ( node . callee ) &&
537+ node . parent &&
529538 isMemberExpression ( node . parent ) &&
530539 node . callee . name === 'expect'
531540 ) {
0 commit comments