From f2d538de148ff2bbabea1662c923936bfc4825b9 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Fri, 24 Mar 2023 13:16:09 -0400 Subject: [PATCH] Converted no-self-import from TSLint to ESLint (#652) * Converted no-self-import from TSLint to ESLint * Update packages/dtslint/src/rules/no-self-import.ts --- .../test/definition-parser.test.ts | 1 - packages/dtslint/dt.json | 2 - packages/dtslint/src/rules/no-self-import.ts | 40 ++++++++++++++++ .../dtslint/src/rules/noSelfImportRule.ts | 37 --------------- packages/dtslint/test/no-self-import.test.ts | 47 +++++++++++++++++++ .../dtslint/test/tsconfig.no-self-import.json | 7 +++ 6 files changed, 94 insertions(+), 40 deletions(-) create mode 100644 packages/dtslint/src/rules/no-self-import.ts delete mode 100644 packages/dtslint/src/rules/noSelfImportRule.ts create mode 100644 packages/dtslint/test/no-self-import.test.ts create mode 100644 packages/dtslint/test/tsconfig.no-self-import.json diff --git a/packages/definitions-parser/test/definition-parser.test.ts b/packages/definitions-parser/test/definition-parser.test.ts index 071fee59..802460c8 100644 --- a/packages/definitions-parser/test/definition-parser.test.ts +++ b/packages/definitions-parser/test/definition-parser.test.ts @@ -165,7 +165,6 @@ export * from 'buffer'; // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /// -/* tslint:disable-next-line:no-self-import */ import webpack = require('webpack'); export = webpack; ` diff --git a/packages/dtslint/dt.json b/packages/dtslint/dt.json index 6ba23dd3..f88fd1e3 100644 --- a/packages/dtslint/dt.json +++ b/packages/dtslint/dt.json @@ -1,8 +1,6 @@ { "extends": "./dtslint.json", "rules": { - "no-self-import": true, - "no-redundant-jsdoc": false, "no-redundant-jsdoc-2": true, diff --git a/packages/dtslint/src/rules/no-self-import.ts b/packages/dtslint/src/rules/no-self-import.ts new file mode 100644 index 00000000..d592dc2a --- /dev/null +++ b/packages/dtslint/src/rules/no-self-import.ts @@ -0,0 +1,40 @@ +import { ESLintUtils } from "@typescript-eslint/utils"; +import { createRule, getCommonDirectoryName } from "../util"; + +const rule = createRule({ + name: "no-self-import", + defaultOptions: [], + meta: { + type: "problem", + docs: { + description: "Forbids declaration files to import the current package using a global import.", + recommended: "error", + }, + messages: { + useRelativeImport: "Declaration file should not use a global import of itself. Use a relative import.", + }, + schema: [], + }, + create(context) { + if (!context.getFilename().endsWith(".d.ts")) { + return {}; + } + + const services = ESLintUtils.getParserServices(context); + const packageName = getCommonDirectoryName(services.program.getRootFileNames()); + + return { + // eslint-disable-next-line @typescript-eslint/naming-convention + ImportDeclaration(node) { + if (node.source.value === packageName || node.source.value.startsWith(packageName + "/")) { + context.report({ + messageId: "useRelativeImport", + node, + }); + } + }, + }; + }, +}); + +export = rule; diff --git a/packages/dtslint/src/rules/noSelfImportRule.ts b/packages/dtslint/src/rules/noSelfImportRule.ts deleted file mode 100644 index b40f6ffe..00000000 --- a/packages/dtslint/src/rules/noSelfImportRule.ts +++ /dev/null @@ -1,37 +0,0 @@ -import * as Lint from "tslint"; -import * as ts from "typescript"; - -import { failure, getCommonDirectoryName } from "../util"; - -export class Rule extends Lint.Rules.TypedRule { - static metadata: Lint.IRuleMetadata = { - ruleName: "no-self-import", - description: "Forbids declaration files to import the current package using a global import.", - optionsDescription: "Not configurable.", - options: null, - type: "functionality", - typescriptOnly: false, - }; - - applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] { - if (!sourceFile.isDeclarationFile) { - return []; - } - - const name = getCommonDirectoryName(program.getRootFileNames()); - return this.applyWithFunction(sourceFile, (ctx) => walk(ctx, name)); - } -} - -const failureMessage = failure( - Rule.metadata.ruleName, - "Declaration file should not use a global import of itself. Use a relative import." -); - -function walk(ctx: Lint.WalkContext, packageName: string): void { - for (const i of ctx.sourceFile.imports) { - if (i.text === packageName || i.text.startsWith(packageName + "/")) { - ctx.addFailureAtNode(i, failureMessage); - } - } -} diff --git a/packages/dtslint/test/no-self-import.test.ts b/packages/dtslint/test/no-self-import.test.ts new file mode 100644 index 00000000..d025764f --- /dev/null +++ b/packages/dtslint/test/no-self-import.test.ts @@ -0,0 +1,47 @@ +import { ESLintUtils } from "@typescript-eslint/utils"; +import path from "path"; + +import * as dtHeader from "../src/rules/no-self-import"; + +const ruleTester = new ESLintUtils.RuleTester({ + parser: "@typescript-eslint/parser", + parserOptions: { + tsconfigRootDir: __dirname, + project: "./tsconfig.no-self-import.json", + }, +}); + +ruleTester.run("no-self-import", dtHeader, { + invalid: [ + { + code: `import myself from "this-package";`, + errors: [ + { + line: 1, + messageId: "useRelativeImport", + }, + ], + filename: "this-package/index.d.ts", + }, + { + code: `import abc from "this-package/abc.d.ts";`, + errors: [ + { + line: 1, + messageId: "useRelativeImport", + }, + ], + filename: "this-package/index.d.ts", + }, + ], + valid: [ + { + code: `import other from "other-package";`, + filename: "this-package/index.d.ts", + }, + { + code: `import other from "other-package/this-package";`, + filename: "this-package/index.d.ts", + }, + ], +}); diff --git a/packages/dtslint/test/tsconfig.no-self-import.json b/packages/dtslint/test/tsconfig.no-self-import.json new file mode 100644 index 00000000..42a3d230 --- /dev/null +++ b/packages/dtslint/test/tsconfig.no-self-import.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "strict": true, + "target": "esnext" + }, + "files": ["this-package/index.d.ts"] +}