From c3ece412a5acd2173ecfb7a113c46b9cfbe3ddc2 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Sun, 2 Aug 2020 16:45:53 +1200 Subject: [PATCH 1/4] chore: simplify checks with optional chaining --- src/rules/prefer-to-have-length.ts | 3 +-- src/rules/require-to-throw-message.ts | 4 +--- src/rules/valid-expect.ts | 5 ++--- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/rules/prefer-to-have-length.ts b/src/rules/prefer-to-have-length.ts index f0bd52939..4da493aff 100644 --- a/src/rules/prefer-to-have-length.ts +++ b/src/rules/prefer-to-have-length.ts @@ -40,8 +40,7 @@ export default createRule({ if ( !matcher || !isParsedEqualityMatcherCall(matcher) || - !argument || - argument.type !== AST_NODE_TYPES.MemberExpression || + argument?.type !== AST_NODE_TYPES.MemberExpression || !isSupportedAccessor(argument.property, 'length') || argument.property.type !== AST_NODE_TYPES.Identifier ) { diff --git a/src/rules/require-to-throw-message.ts b/src/rules/require-to-throw-message.ts index 8a5a38e89..0e0978002 100644 --- a/src/rules/require-to-throw-message.ts +++ b/src/rules/require-to-throw-message.ts @@ -30,9 +30,7 @@ export default createRule({ const { matcher, modifier } = parseExpectCall(node); if ( - matcher && - matcher.arguments && - matcher.arguments.length === 0 && + matcher?.arguments?.length === 0 && ['toThrow', 'toThrowError'].includes(matcher.name) && (!modifier || !(modifier.name === ModifierName.not || modifier.negation)) diff --git a/src/rules/valid-expect.ts b/src/rules/valid-expect.ts index 7f658a8dc..b884670bc 100644 --- a/src/rules/valid-expect.ts +++ b/src/rules/valid-expect.ts @@ -250,9 +250,8 @@ export default createRule< const parentNode = matcher.node.parent; if ( + !parentNode?.parent || !modifier || - !parentNode || - !parentNode.parent || modifier.name === ModifierName.not ) { return; @@ -262,7 +261,7 @@ export default createRule< * for the array object, not for each individual assertion. */ const isParentArrayExpression = - parentNode.parent.type === AST_NODE_TYPES.ArrayExpression; + parentNode.parent?.type === AST_NODE_TYPES.ArrayExpression; const orReturned = alwaysAwait ? '' : ' or returned'; /** * An async assertion can be chained with `then` or `catch` statements. From 63984f5229b2d12b98f112b186681be370c069b1 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Sun, 2 Aug 2020 16:50:38 +1200 Subject: [PATCH 2/4] chore: mark `parent` as always defined on `ExpectMember` --- src/rules/utils.ts | 5 ++--- src/rules/valid-expect.ts | 8 ++------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/rules/utils.ts b/src/rules/utils.ts index 3fac9f46f..0d416b09d 100644 --- a/src/rules/utils.ts +++ b/src/rules/utils.ts @@ -300,11 +300,10 @@ interface ParsedExpectMember< * Represents a `MemberExpression` that comes after an `ExpectCall`. */ interface ExpectMember< - PropertyName extends ExpectPropertyName = ExpectPropertyName, - Parent extends TSESTree.Node | undefined = TSESTree.Node | undefined + PropertyName extends ExpectPropertyName = ExpectPropertyName > extends KnownMemberExpression { object: ExpectCall | ExpectMember; - parent: Parent; + parent: TSESTree.Node; } export const isExpectMember = < diff --git a/src/rules/valid-expect.ts b/src/rules/valid-expect.ts index b884670bc..09ecf65c7 100644 --- a/src/rules/valid-expect.ts +++ b/src/rules/valid-expect.ts @@ -230,7 +230,7 @@ export default createRule< return; } - if (matcher.node.parent && isExpectMember(matcher.node.parent)) { + if (isExpectMember(matcher.node.parent)) { context.report({ messageId: 'modifierUnknown', data: { modifierName: matcher.name }, @@ -249,11 +249,7 @@ export default createRule< const parentNode = matcher.node.parent; - if ( - !parentNode?.parent || - !modifier || - modifier.name === ModifierName.not - ) { + if (!modifier || modifier.name === ModifierName.not) { return; } /** From 15e00f5418a6318e4b1d012cd197bb98205c5350 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Sun, 2 Aug 2020 16:50:50 +1200 Subject: [PATCH 3/4] chore: action todo --- src/rules/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rules/utils.ts b/src/rules/utils.ts index 0d416b09d..107675d81 100644 --- a/src/rules/utils.ts +++ b/src/rules/utils.ts @@ -325,7 +325,7 @@ export type ParsedEqualityMatcherCall< Argument extends TSESTree.Expression = TSESTree.Expression, Matcher extends EqualityMatcher = EqualityMatcher > = Omit, 'arguments'> & { - // todo: probs should also type node parent as CallExpression + parent: TSESTree.CallExpression; arguments: [Argument]; }; From 1497b3572ba4eaecd31639e2ba25db14e2864932 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Sun, 2 Aug 2020 22:46:44 +1200 Subject: [PATCH 4/4] chore(valid-expect): use explict check instead of optional chain --- src/rules/valid-expect.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/rules/valid-expect.ts b/src/rules/valid-expect.ts index 09ecf65c7..2869ecc64 100644 --- a/src/rules/valid-expect.ts +++ b/src/rules/valid-expect.ts @@ -249,7 +249,11 @@ export default createRule< const parentNode = matcher.node.parent; - if (!modifier || modifier.name === ModifierName.not) { + if ( + !parentNode.parent || + !modifier || + modifier.name === ModifierName.not + ) { return; } /** @@ -257,7 +261,7 @@ export default createRule< * for the array object, not for each individual assertion. */ const isParentArrayExpression = - parentNode.parent?.type === AST_NODE_TYPES.ArrayExpression; + parentNode.parent.type === AST_NODE_TYPES.ArrayExpression; const orReturned = alwaysAwait ? '' : ' or returned'; /** * An async assertion can be chained with `then` or `catch` statements.