diff --git a/src/rules/__tests__/no-if.js b/src/rules/__tests__/no-if.test.ts similarity index 98% rename from src/rules/__tests__/no-if.js rename to src/rules/__tests__/no-if.test.ts index 680ce8c55..f6e59fee4 100644 --- a/src/rules/__tests__/no-if.js +++ b/src/rules/__tests__/no-if.test.ts @@ -1,7 +1,7 @@ -import { RuleTester } from 'eslint'; +import { TSESLint } from '@typescript-eslint/experimental-utils'; import rule from '../no-if'; -const ruleTester = new RuleTester({ +const ruleTester = new TSESLint.RuleTester({ parserOptions: { ecmaVersion: 6, }, diff --git a/src/rules/no-if.js b/src/rules/no-if.ts similarity index 58% rename from src/rules/no-if.js rename to src/rules/no-if.ts index 320729711..f08daa375 100644 --- a/src/rules/no-if.js +++ b/src/rules/no-if.ts @@ -1,28 +1,44 @@ -import { getDocsUrl, isTestCase } from './util'; +import { TestCaseName, createRule, getNodeName, isTestCase } from './tsUtils'; +import { + AST_NODE_TYPES, + TSESTree, +} from '@typescript-eslint/experimental-utils'; -const isTestArrowFunction = node => - node !== undefined && - node.type === 'ArrowFunctionExpression' && - isTestCase(node.parent); +const testCaseNames = new Set([ + ...Object.keys(TestCaseName), + 'it.only', + 'it.skip', + 'test.only', + 'test.skip', +]); -export default { +const isTestArrowFunction = (node: TSESTree.ArrowFunctionExpression) => + node.parent !== undefined && + node.parent.type === AST_NODE_TYPES.CallExpression && + testCaseNames.has(getNodeName(node.parent.callee)); + +export default createRule({ + name: __filename, meta: { docs: { description: 'Disallow conditional logic', category: 'Best Practices', recommended: false, - uri: getDocsUrl('jest/no-if'), }, messages: { noIf: 'Tests should not contain if statements.', noConditional: 'Tests should not contain conditional statements.', }, + schema: [], + type: 'suggestion', }, - + defaultOptions: [], create(context) { - const stack = []; + const stack: Array = []; - function validate(node) { + function validate( + node: TSESTree.ConditionalExpression | TSESTree.IfStatement, + ) { const lastElementInStack = stack[stack.length - 1]; if (stack.length === 0 || lastElementInStack === false) { @@ -30,7 +46,9 @@ export default { } const messageId = - node.type === 'ConditionalExpression' ? 'noConditional' : 'noIf'; + node.type === AST_NODE_TYPES.ConditionalExpression + ? 'noConditional' + : 'noIf'; context.report({ messageId, @@ -67,4 +85,4 @@ export default { }, }; }, -}; +});