From 6242c917398c069add8ee6d7595918d87f88223c Mon Sep 17 00:00:00 2001 From: Alex Zherdev Date: Fri, 12 Apr 2019 11:47:55 -0700 Subject: [PATCH 1/4] Support named imports and destructured requires --- create-ava-rule.js | 135 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 6 deletions(-) diff --git a/create-ava-rule.js b/create-ava-rule.js index 3806cf02..23591122 100644 --- a/create-ava-rule.js +++ b/create-ava-rule.js @@ -4,7 +4,7 @@ const enhance = require('enhance-visitors'); const deepStrictEqual = require('deep-strict-equal'); const util = require('./util'); -const avaImportDeclarationAst = { +const avaImportDeclarationAsts = [{ type: 'ImportDeclaration', specifiers: [ { @@ -19,9 +19,66 @@ const avaImportDeclarationAst = { type: 'Literal', value: 'ava' } -}; +}, { + type: 'ImportDeclaration', + specifiers: [ + { + type: 'ImportSpecifier', + imported: { + type: 'Identifier', + name: 'serial' + }, + local: { + type: 'Identifier', + name: 'test' + } + } + ], + source: { + type: 'Literal', + value: 'ava' + } +}, { + type: 'ImportDeclaration', + specifiers: [ + { + type: 'ImportSpecifier', + imported: { + type: 'Identifier', + name: 'serial' + }, + local: { + type: 'Identifier', + name: 'test' + } + } + ], + source: { + type: 'Literal', + value: 'ava' + } +}, { + type: 'ImportDeclaration', + specifiers: [ + { + type: 'ImportSpecifier', + imported: { + type: 'Identifier', + name: 'serial' + }, + local: { + type: 'Identifier', + name: 'serial' + } + } + ], + source: { + type: 'Literal', + value: 'ava' + } +}]; -const avaVariableDeclaratorAst = { +const avaVariableDeclaratorAsts = [{ type: 'VariableDeclarator', id: { type: 'Identifier', @@ -40,7 +97,73 @@ const avaVariableDeclaratorAst = { } ] } -}; +}, { + type: 'VariableDeclarator', + id: { + type: 'ObjectPattern', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'serial' + }, + value: { + type: 'Identifier', + name: 'serial' + }, + kind: 'init', + method: false, + shorthand: true, + computed: false + }] + }, + init: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'require' + }, + arguments: [ + { + type: 'Literal', + value: 'ava' + } + ] + } +}, { + type: 'VariableDeclarator', + id: { + type: 'ObjectPattern', + properties: [{ + type: 'Property', + key: { + type: 'Identifier', + name: 'serial' + }, + value: { + type: 'Identifier', + name: 'test' + }, + kind: 'init', + method: false, + shorthand: false, + computed: false + }] + }, + init: { + type: 'CallExpression', + callee: { + type: 'Identifier', + name: 'require' + }, + arguments: [ + { + type: 'Literal', + value: 'ava' + } + ] + } +}]; function isTestFunctionCall(node) { if (node.type === 'Identifier') { @@ -65,12 +188,12 @@ module.exports = () => { /* eslint quote-props: [2, "as-needed"] */ const predefinedRules = { ImportDeclaration: node => { - if (!isTestFile && deepStrictEqual(espurify(node), avaImportDeclarationAst)) { + if (!isTestFile && avaImportDeclarationAsts.some(ast => deepStrictEqual(espurify(node), ast))) { isTestFile = true; } }, VariableDeclarator: node => { - if (!isTestFile && deepStrictEqual(espurify(node), avaVariableDeclaratorAst)) { + if (!isTestFile && avaVariableDeclaratorAsts.some(ast => console.log(JSON.stringify(espurify(node), null, 2)) || deepStrictEqual(espurify(node), ast))) { isTestFile = true; } }, From ad046cac86266181bb385b4c811d8c11da2bbc04 Mon Sep 17 00:00:00 2001 From: Alex Zherdev Date: Sun, 14 Apr 2019 12:28:25 -0700 Subject: [PATCH 2/4] Remove console.log --- create-ava-rule.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/create-ava-rule.js b/create-ava-rule.js index 23591122..0c648943 100644 --- a/create-ava-rule.js +++ b/create-ava-rule.js @@ -193,7 +193,7 @@ module.exports = () => { } }, VariableDeclarator: node => { - if (!isTestFile && avaVariableDeclaratorAsts.some(ast => console.log(JSON.stringify(espurify(node), null, 2)) || deepStrictEqual(espurify(node), ast))) { + if (!isTestFile && avaVariableDeclaratorAsts.some(ast => deepStrictEqual(espurify(node), ast))) { isTestFile = true; } }, From 470678f799f3537e4276bbf7f79f9a8dc3697641 Mon Sep 17 00:00:00 2001 From: Alex Zherdev Date: Tue, 9 Jul 2019 22:00:30 -0700 Subject: [PATCH 3/4] Add tests for create-ava-rule.js --- test/create-ava-rule.js | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 test/create-ava-rule.js diff --git a/test/create-ava-rule.js b/test/create-ava-rule.js new file mode 100644 index 00000000..1bc76a34 --- /dev/null +++ b/test/create-ava-rule.js @@ -0,0 +1,65 @@ +import test from 'ava'; +import avaRuleTester from 'eslint-ava-rule-tester'; +import {visitIf} from 'enhance-visitors'; +import createAvaRule from '../create-ava-rule'; + +const rule = { + create: context => { + const ava = createAvaRule(); + + return ava.merge({ + 'Program:exit': node => { + if (!ava.isInTestFile()) { + context.report({node, message: 'not a test file'}); + } + } + }); + } +}; + +const ruleTester = avaRuleTester(test, { + env: { + es6: true, + }, + parserOptions: { + sourceType: 'module' + } +}); + +ruleTester.run('rule-fixture', rule, { + valid: [ + 'const test = require(\'ava\');', + 'const {serial} = require(\'ava\');', + 'const {serial: test} = require(\'ava\');', + 'import test from \'ava\';', + 'import {serial} from \'ava\';', + 'import {serial as test} from \'ava\';' + ], + + invalid: [ + { + code: 'const test2 = require(\'ava\');', + errors: [{message: 'not a test file'}] + }, + { + code: 'const {serial2} = require(\'ava\');', + errors: [{message: 'not a test file'}] + }, + { + code: 'const {serial2: test} = require(\'ava\');', + errors: [{message: 'not a test file'}] + }, + { + code: 'import test2 from \'ava\';', + errors: [{message: 'not a test file'}] + }, + { + code: 'import {serial2} from \'ava\';', + errors: [{message: 'not a test file'}] + }, + { + code: 'import {serial2 as test} from \'ava\';', + errors: [{message: 'not a test file'}] + } + ] +}); From 44e89e06c0a4185861ca3b2b64ba947f06187c52 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Mon, 16 Sep 2019 20:53:30 +0700 Subject: [PATCH 4/4] Update create-ava-rule.js --- test/create-ava-rule.js | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/test/create-ava-rule.js b/test/create-ava-rule.js index 1bc76a34..b9a6b298 100644 --- a/test/create-ava-rule.js +++ b/test/create-ava-rule.js @@ -26,6 +26,12 @@ const ruleTester = avaRuleTester(test, { } }); +const errors = [ + { + message: 'not a test file' + } +]; + ruleTester.run('rule-fixture', rule, { valid: [ 'const test = require(\'ava\');', @@ -39,27 +45,27 @@ ruleTester.run('rule-fixture', rule, { invalid: [ { code: 'const test2 = require(\'ava\');', - errors: [{message: 'not a test file'}] + errors }, { code: 'const {serial2} = require(\'ava\');', - errors: [{message: 'not a test file'}] + errors }, { code: 'const {serial2: test} = require(\'ava\');', - errors: [{message: 'not a test file'}] + errors }, { code: 'import test2 from \'ava\';', - errors: [{message: 'not a test file'}] + errors }, { code: 'import {serial2} from \'ava\';', - errors: [{message: 'not a test file'}] + errors }, { code: 'import {serial2 as test} from \'ava\';', - errors: [{message: 'not a test file'}] + errors } ] });