diff --git a/src/rules/noDuplicateImportsRule.ts b/src/rules/noDuplicateImportsRule.ts index b102207cfa2..26d6b4c226d 100644 --- a/src/rules/noDuplicateImportsRule.ts +++ b/src/rules/noDuplicateImportsRule.ts @@ -15,7 +15,12 @@ * limitations under the License. */ -import { isImportDeclaration, isLiteralExpression, isModuleDeclaration } from "tsutils"; +import { + isImportDeclaration, + isLiteralExpression, + isModuleDeclaration, + isNamespaceImport, +} from "tsutils"; import * as ts from "typescript"; import * as Lint from "../index"; @@ -45,21 +50,28 @@ export class Rule extends Lint.Rules.AbstractRule { } function walk(ctx: Lint.WalkContext): void { - walkWorker(ctx, ctx.sourceFile.statements, new Set()); + walkWorker(ctx, ctx.sourceFile.statements, new Set(), new Set()); } function walkWorker( ctx: Lint.WalkContext, statements: ReadonlyArray, - seen: Set, + seenNamedImports: Set, + seenNamespaceImports: Set, ): void { for (const statement of statements) { if (isImportDeclaration(statement) && isLiteralExpression(statement.moduleSpecifier)) { const { text } = statement.moduleSpecifier; - if (seen.has(text)) { + const seenSet = + Boolean(statement.importClause) && + Boolean(statement.importClause!.namedBindings) && + isNamespaceImport(statement.importClause!.namedBindings!) + ? seenNamespaceImports + : seenNamedImports; + if (seenSet.has(text)) { ctx.addFailureAtNode(statement, Rule.FAILURE_STRING(text)); } - seen.add(text); + seenSet.add(text); } if ( @@ -73,7 +85,8 @@ function walkWorker( walkWorker( ctx, (statement.body as ts.ModuleBlock).statements, - ts.isExternalModule(ctx.sourceFile) ? seen : new Set(), + ts.isExternalModule(ctx.sourceFile) ? seenNamedImports : new Set(), + ts.isExternalModule(ctx.sourceFile) ? seenNamespaceImports : new Set(), ); } } diff --git a/test/rules/no-duplicate-imports/test.d.ts.lint b/test/rules/no-duplicate-imports/test.d.ts.lint index 5c5b614baa9..89d54bb9eb8 100644 --- a/test/rules/no-duplicate-imports/test.d.ts.lint +++ b/test/rules/no-duplicate-imports/test.d.ts.lint @@ -1,7 +1,6 @@ import * as fs from 'fs'; declare module "foo" { import {readFile} from 'fs'; - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Multiple imports from 'fs' can be combined into one.] } declare module "*"; diff --git a/test/rules/no-duplicate-imports/test.ts.lint b/test/rules/no-duplicate-imports/test.ts.lint index 7a5c5def8de..3d37f4dbee7 100644 --- a/test/rules/no-duplicate-imports/test.ts.lint +++ b/test/rules/no-duplicate-imports/test.ts.lint @@ -1,8 +1,8 @@ import * as fs from 'fs'; import {readFile} from 'fs'; -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [err % ('fs')] import * as path from 'path'; +import { join } from 'path'; import {writeFileSync as wfs} from 'fs'; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [err % ('fs')]