Skip to content

Commit

Permalink
feat(enum): Add no-enum and no-const-enum rules.
Browse files Browse the repository at this point in the history
  • Loading branch information
cartant committed Mar 27, 2019
1 parent af9495d commit 06f2f59
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 0 deletions.
5 changes: 5 additions & 0 deletions fixtures/no-const-enum/default/fixture.ts.lint
@@ -0,0 +1,5 @@
const enum Foo { FOO = "F" };
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [no-const-enum]
enum Bar { BAR = "B" };

[no-const-enum]: const enum is forbidden
8 changes: 8 additions & 0 deletions fixtures/no-const-enum/default/tsconfig.json
@@ -0,0 +1,8 @@
{
"defaultSeverity": "error",
"jsRules": {},
"rules": {
"throw-error": { "severity": "error" }
},
"rulesDirectory": "../../../build/rules"
}
8 changes: 8 additions & 0 deletions fixtures/no-const-enum/default/tslint.json
@@ -0,0 +1,8 @@
{
"defaultSeverity": "error",
"jsRules": {},
"rules": {
"no-const-enum": { "severity": "error" }
},
"rulesDirectory": "../../../build/rules"
}
6 changes: 6 additions & 0 deletions fixtures/no-enum/default/fixture.ts.lint
@@ -0,0 +1,6 @@
const enum Foo { FOO = "F" };
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [no-enum]
enum Bar { BAR = "B" };
~~~~~~~~~~~~~~~~~~~~~~ [no-enum]

[no-enum]: enum is forbidden
8 changes: 8 additions & 0 deletions fixtures/no-enum/default/tsconfig.json
@@ -0,0 +1,8 @@
{
"defaultSeverity": "error",
"jsRules": {},
"rules": {
"throw-error": { "severity": "error" }
},
"rulesDirectory": "../../../build/rules"
}
8 changes: 8 additions & 0 deletions fixtures/no-enum/default/tslint.json
@@ -0,0 +1,8 @@
{
"defaultSeverity": "error",
"jsRules": {},
"rules": {
"no-enum": { "severity": "error" }
},
"rulesDirectory": "../../../build/rules"
}
42 changes: 42 additions & 0 deletions source/rules/noConstEnumRule.ts
@@ -0,0 +1,42 @@
/**
* @license Use of this source code is governed by an MIT-style license that
* can be found in the LICENSE file at https://github.com/cartant/tslint-etc
*/

import * as Lint from "tslint";
import * as ts from "typescript";
import { tsquery } from "@phenomnomnominal/tsquery";

export class Rule extends Lint.Rules.TypedRule {

public static metadata: Lint.IRuleMetadata = {
description: "Disallows the use of const enums.",
options: null,
optionsDescription: "Not configurable.",
requiresTypeInfo: false,
ruleName: "no-const-enum",
type: "functionality",
typescriptOnly: true
};

public static FAILURE_STRING = "const enum is forbidden";

public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] {
const failures: Lint.RuleFailure[] = [];
const constKeywords = tsquery(
sourceFile,
"EnumDeclaration > ConstKeyword"
);
constKeywords.forEach((node: ts.Node) => {
const enumDeclaration = node.parent as ts.EnumDeclaration;
failures.push(new Lint.RuleFailure(
sourceFile,
enumDeclaration.getStart(),
enumDeclaration.getStart() + enumDeclaration.getWidth(),
Rule.FAILURE_STRING,
this.ruleName
));
});
return failures;
}
}
41 changes: 41 additions & 0 deletions source/rules/noEnumRule.ts
@@ -0,0 +1,41 @@
/**
* @license Use of this source code is governed by an MIT-style license that
* can be found in the LICENSE file at https://github.com/cartant/tslint-etc
*/

import * as Lint from "tslint";
import * as ts from "typescript";
import { tsquery } from "@phenomnomnominal/tsquery";

export class Rule extends Lint.Rules.TypedRule {

public static metadata: Lint.IRuleMetadata = {
description: "Disallows the use of enums.",
options: null,
optionsDescription: "Not configurable.",
requiresTypeInfo: false,
ruleName: "no-enum",
type: "functionality",
typescriptOnly: true
};

public static FAILURE_STRING = "enum is forbidden";

public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] {
const failures: Lint.RuleFailure[] = [];
const enumDeclarations = tsquery(
sourceFile,
"EnumDeclaration"
);
enumDeclarations.forEach((node: ts.Node) => {
failures.push(new Lint.RuleFailure(
sourceFile,
node.getStart(),
node.getStart() + node.getWidth(),
Rule.FAILURE_STRING,
this.ruleName
));
});
return failures;
}
}

0 comments on commit 06f2f59

Please sign in to comment.