Skip to content
This repository has been archived by the owner on Mar 25, 2021. It is now read-only.

Add ban-ts-ignore rule. #3728

Merged
merged 6 commits into from
Aug 22, 2018
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/configs/all.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export const rules = {
["Symbol", "Avoid using the `Symbol` type. Did you mean `symbol`?"],
],
},
"ban-ts-ignore": true,
"member-access": [true, "check-accessor", "check-constructor", "check-parameter-property"],
"member-ordering": [true, {
"order": "statics-first",
Expand Down
52 changes: 52 additions & 0 deletions src/rules/banTsIgnoreRule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/**
* @license
* Copyright 2018 Palantir Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import { forEachComment } from "tsutils";
import * as ts from "typescript";
import * as Lint from "../index";
import { codeExamples } from "./code-examples/banTsIgnore.examples";

export class Rule extends Lint.Rules.AbstractRule {
/* tslint:disable:object-literal-sort-keys */
public static metadata: Lint.IRuleMetadata = {
ruleName: "ban-ts-ignore",
description: 'Bans "// @ts-ignore" comments from being used.',
optionsDescription: "Not configurable.",
options: null,
optionExamples: [true],
type: "typescript",
typescriptOnly: true,
codeExamples,
};
/* tslint:disable:object-literal-sort-keys */

public static FAILURE_STRING = 'Do not use "// @ts-ignore" comments because they suppress compilation errors.';

public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
return this.applyWithFunction(sourceFile, walk);
}
}

function walk(ctx: Lint.WalkContext<void>) {
const ignoreDiagnosticCommentRegEx = /^\s*\/\/\/?\s*@ts-ignore/;
forEachComment(ctx.sourceFile, (fullText, comment) => {
const commentText = fullText.slice(comment.pos, comment.end);
if (Boolean(commentText.match(ignoreDiagnosticCommentRegEx))) {
ctx.addFailure(comment.pos, comment.end, Rule.FAILURE_STRING);
}
});
}
37 changes: 37 additions & 0 deletions src/rules/code-examples/banTsIgnore.examples.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/**
* @license
* Copyright 2018 Palantir Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import * as Lint from "../../index";

// tslint:disable: object-literal-sort-keys
export const codeExamples = [
{
description: 'Disallows the use of "@ts-ignore"',
config: Lint.Utils.dedent`
"rules": { "ban-ts-ignore": true }
`,
pass: Lint.Utils.dedent`
console.log("hello");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think use the same code snippet from the fail example, but change the comment text to

// Compiler warns about unreachable code error

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Thanks!

`,
fail: Lint.Utils.dedent`
if (false) {
// @ts-ignore: Unreachable code error
console.log("hello");
}
`,
},
];
2 changes: 1 addition & 1 deletion src/rules/code-examples/curly.examples.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/**
* @license
* Copyright 2013 Palantir Technologies, Inc.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this change is not relevant. do not update copyright statements.

* Copyright 2018 Palantir Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
33 changes: 33 additions & 0 deletions test/rules/ban-ts-ignore/test.ts.lint
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
if (false) {
// @ts-ignore: Unreachable code error
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Do not use "// @ts-ignore" comments because they suppress compilation errors.]
console.log("hello"); // Random comments.
}

var x = 0;

/// @ts-ignore Triple-slash
~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Do not use "// @ts-ignore" comments because they suppress compilation errors.]
x();

/// @ts-ignore
~~~~~~~~~~~~~~ [Do not use "// @ts-ignore" comments because they suppress compilation errors.]
x(
2,
3);

// come comment

// @ts-ignore Multiple comments
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [Do not use "// @ts-ignore" comments because they suppress compilation errors.]

// some other comment

// @anohter

x();

x( // @ts-ignore inline
~~~~~~~~~~~~~~~~~~~~ [Do not use "// @ts-ignore" comments because they suppress compilation errors.]
2,
3);
6 changes: 6 additions & 0 deletions test/rules/ban-ts-ignore/tslint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"rules": {
"ban-ts-ignore": true
}
}