From f1ecd2b7eb16efc4887f87ff83f77a385ae5c177 Mon Sep 17 00:00:00 2001 From: Daniil Dubrava Date: Fri, 20 Nov 2020 14:42:15 +0300 Subject: [PATCH 1/3] fix(eslint-plugin): [triple-slash-reference] remove invalid assumption that module reference is always TSExternalModuleReference --- .../src/rules/triple-slash-reference.ts | 30 +++++++++++++++---- .../rules/triple-slash-reference.test.ts | 22 ++++++++++++++ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/packages/eslint-plugin/src/rules/triple-slash-reference.ts b/packages/eslint-plugin/src/rules/triple-slash-reference.ts index 1bb16c229a11..76aca28b9cc0 100644 --- a/packages/eslint-plugin/src/rules/triple-slash-reference.ts +++ b/packages/eslint-plugin/src/rules/triple-slash-reference.ts @@ -1,4 +1,5 @@ import { + AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; @@ -60,9 +61,11 @@ export default util.createRule({ importName: string; }[] = []; - function hasMatchingReference(source: TSESTree.Literal): void { + function hasMatchingReference( + value: string | number | bigint | boolean | RegExp | null, + ): void { references.forEach(reference => { - if (reference.importName === source.value) { + if (reference.importName === value) { context.report({ node: reference.comment, messageId: 'tripleSlashReference', @@ -76,14 +79,29 @@ export default util.createRule({ return { ImportDeclaration(node): void { if (programNode) { - hasMatchingReference(node.source); + hasMatchingReference(node.source.value); } }, TSImportEqualsDeclaration(node): void { if (programNode) { - const source = (node.moduleReference as TSESTree.TSExternalModuleReference) - .expression as TSESTree.Literal; - hasMatchingReference(source); + const source = node.moduleReference; + let value: string | number | bigint | boolean | RegExp | null; + + switch (source.type) { + case AST_NODE_TYPES.Identifier: + value = source.name; + break; + + case AST_NODE_TYPES.TSQualifiedName: + value = (source.left as TSESTree.Identifier).name; + break; + + case AST_NODE_TYPES.TSExternalModuleReference: + value = (source.expression as TSESTree.Literal).value; + break; + } + + hasMatchingReference(value); } }, Program(node): void { diff --git a/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts b/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts index ab10ba5f6d97..8dd71212fbb0 100644 --- a/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts +++ b/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts @@ -54,6 +54,28 @@ ruleTester.run('triple-slash-reference', rule, { `, options: [{ path: 'always', types: 'always', lib: 'always' }], }, + { + code: ` + /// + /// + /// + import foo = foo; + import bar = bar; + import baz = baz; + `, + options: [{ path: 'always', types: 'always', lib: 'always' }], + }, + { + code: ` + /// + /// + /// + import foo = foo.foo; + import bar = bar.bar.bar.bar; + import baz = baz.baz; + `, + options: [{ path: 'always', types: 'always', lib: 'always' }], + }, { code: "import * as foo from 'foo';", options: [{ path: 'never' }], From cc264a650d7a9a27de96ff25293bd441d1469f0f Mon Sep 17 00:00:00 2001 From: Daniil Dubrava Date: Sat, 21 Nov 2020 13:25:33 +0300 Subject: [PATCH 2/3] Revert "fix(eslint-plugin): [triple-slash-reference] remove invalid assumption that module reference is always TSExternalModuleReference" This reverts commit f1ecd2b7eb16efc4887f87ff83f77a385ae5c177. --- .../src/rules/triple-slash-reference.ts | 30 ++++--------------- .../rules/triple-slash-reference.test.ts | 22 -------------- 2 files changed, 6 insertions(+), 46 deletions(-) diff --git a/packages/eslint-plugin/src/rules/triple-slash-reference.ts b/packages/eslint-plugin/src/rules/triple-slash-reference.ts index 76aca28b9cc0..1bb16c229a11 100644 --- a/packages/eslint-plugin/src/rules/triple-slash-reference.ts +++ b/packages/eslint-plugin/src/rules/triple-slash-reference.ts @@ -1,5 +1,4 @@ import { - AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; @@ -61,11 +60,9 @@ export default util.createRule({ importName: string; }[] = []; - function hasMatchingReference( - value: string | number | bigint | boolean | RegExp | null, - ): void { + function hasMatchingReference(source: TSESTree.Literal): void { references.forEach(reference => { - if (reference.importName === value) { + if (reference.importName === source.value) { context.report({ node: reference.comment, messageId: 'tripleSlashReference', @@ -79,29 +76,14 @@ export default util.createRule({ return { ImportDeclaration(node): void { if (programNode) { - hasMatchingReference(node.source.value); + hasMatchingReference(node.source); } }, TSImportEqualsDeclaration(node): void { if (programNode) { - const source = node.moduleReference; - let value: string | number | bigint | boolean | RegExp | null; - - switch (source.type) { - case AST_NODE_TYPES.Identifier: - value = source.name; - break; - - case AST_NODE_TYPES.TSQualifiedName: - value = (source.left as TSESTree.Identifier).name; - break; - - case AST_NODE_TYPES.TSExternalModuleReference: - value = (source.expression as TSESTree.Literal).value; - break; - } - - hasMatchingReference(value); + const source = (node.moduleReference as TSESTree.TSExternalModuleReference) + .expression as TSESTree.Literal; + hasMatchingReference(source); } }, Program(node): void { diff --git a/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts b/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts index 8dd71212fbb0..ab10ba5f6d97 100644 --- a/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts +++ b/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts @@ -54,28 +54,6 @@ ruleTester.run('triple-slash-reference', rule, { `, options: [{ path: 'always', types: 'always', lib: 'always' }], }, - { - code: ` - /// - /// - /// - import foo = foo; - import bar = bar; - import baz = baz; - `, - options: [{ path: 'always', types: 'always', lib: 'always' }], - }, - { - code: ` - /// - /// - /// - import foo = foo.foo; - import bar = bar.bar.bar.bar; - import baz = baz.baz; - `, - options: [{ path: 'always', types: 'always', lib: 'always' }], - }, { code: "import * as foo from 'foo';", options: [{ path: 'never' }], From d6d15bf94a8db57d1cc3375f7cd3f6379e8cc59e Mon Sep 17 00:00:00 2001 From: Daniil Dubrava Date: Sat, 21 Nov 2020 13:31:56 +0300 Subject: [PATCH 3/3] fix(eslint-plugin): [triple-slash-reference] ignore not TSExternalModuleReference --- .../src/rules/triple-slash-reference.ts | 9 +++++--- .../rules/triple-slash-reference.test.ts | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/triple-slash-reference.ts b/packages/eslint-plugin/src/rules/triple-slash-reference.ts index 1bb16c229a11..08c3ad6291b2 100644 --- a/packages/eslint-plugin/src/rules/triple-slash-reference.ts +++ b/packages/eslint-plugin/src/rules/triple-slash-reference.ts @@ -1,4 +1,5 @@ import { + AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree, } from '@typescript-eslint/experimental-utils'; @@ -81,9 +82,11 @@ export default util.createRule({ }, TSImportEqualsDeclaration(node): void { if (programNode) { - const source = (node.moduleReference as TSESTree.TSExternalModuleReference) - .expression as TSESTree.Literal; - hasMatchingReference(source); + const reference = node.moduleReference; + + if (reference.type === AST_NODE_TYPES.TSExternalModuleReference) { + hasMatchingReference(reference.expression as TSESTree.Literal); + } } }, Program(node): void { diff --git a/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts b/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts index ab10ba5f6d97..8dd71212fbb0 100644 --- a/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts +++ b/packages/eslint-plugin/tests/rules/triple-slash-reference.test.ts @@ -54,6 +54,28 @@ ruleTester.run('triple-slash-reference', rule, { `, options: [{ path: 'always', types: 'always', lib: 'always' }], }, + { + code: ` + /// + /// + /// + import foo = foo; + import bar = bar; + import baz = baz; + `, + options: [{ path: 'always', types: 'always', lib: 'always' }], + }, + { + code: ` + /// + /// + /// + import foo = foo.foo; + import bar = bar.bar.bar.bar; + import baz = baz.baz; + `, + options: [{ path: 'always', types: 'always', lib: 'always' }], + }, { code: "import * as foo from 'foo';", options: [{ path: 'never' }],