Skip to content

Commit

Permalink
Improve prefer strict equal (#423)
Browse files Browse the repository at this point in the history
* feat: support optional `name` argument in `isParsedEqualityMatcherCall`

* feat: use `isParsedEqualityMatcherCall` in `prefer-strict-equal`
  • Loading branch information
G-Rath committed Oct 5, 2019
1 parent c1c696f commit 6606018
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 9 deletions.
18 changes: 15 additions & 3 deletions src/rules/prefer-strict-equal.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
import { createRule, isExpectCall, parseExpectCall } from './utils';
import {
EqualityMatcher,
createRule,
isExpectCall,
isParsedEqualityMatcherCall,
parseExpectCall,
} from './utils';

export default createRule({
name: __filename,
Expand All @@ -25,10 +31,16 @@ export default createRule({

const { matcher } = parseExpectCall(node);

if (matcher && matcher.name === 'toEqual') {
if (
matcher &&
isParsedEqualityMatcherCall(matcher, EqualityMatcher.toEqual)
) {
context.report({
fix: fixer => [
fixer.replaceText(matcher.node.property, 'toStrictEqual'),
fixer.replaceText(
matcher.node.property,
EqualityMatcher.toStrictEqual,
),
],
messageId: 'useToStrictEqual',
node: matcher.node.property,
Expand Down
18 changes: 12 additions & 6 deletions src/rules/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -326,8 +326,9 @@ type MatcherName = string /* & not ModifierName */;
type ExpectPropertyName = ModifierName | MatcherName;

export type ParsedEqualityMatcherCall<
Argument extends TSESTree.Expression = TSESTree.Expression
> = Omit<ParsedExpectMatcher<EqualityMatcher>, 'arguments'> & {
Argument extends TSESTree.Expression = TSESTree.Expression,
Matcher extends EqualityMatcher = EqualityMatcher
> = Omit<ParsedExpectMatcher<Matcher>, 'arguments'> & {
// todo: probs should also type node parent as CallExpression
arguments: [Argument];
};
Expand All @@ -338,16 +339,21 @@ export enum ModifierName {
resolves = 'resolves',
}

enum EqualityMatcher {
export enum EqualityMatcher {
toBe = 'toBe',
toEqual = 'toEqual',
toStrictEqual = 'toStrictEqual',
}

export const isParsedEqualityMatcherCall = (
export const isParsedEqualityMatcherCall = <
MatcherName extends EqualityMatcher = EqualityMatcher
>(
matcher: ParsedExpectMatcher,
): matcher is ParsedEqualityMatcherCall =>
EqualityMatcher.hasOwnProperty(matcher.name) &&
name?: MatcherName,
): matcher is ParsedEqualityMatcherCall<TSESTree.Expression, MatcherName> =>
(name
? matcher.name === name
: EqualityMatcher.hasOwnProperty(matcher.name)) &&
matcher.arguments !== null &&
matcher.arguments.length === 1;

Expand Down

0 comments on commit 6606018

Please sign in to comment.