From 5c40d01056cd1ca9e0ecc5c90a0d4b164931af30 Mon Sep 17 00:00:00 2001 From: Jonathan Delgado Date: Sat, 15 Jun 2019 20:26:21 -0700 Subject: [PATCH] fix(eslint-plugin): [no-magic-numbers] add support for enums (#543) --- .../docs/rules/no-magic-numbers.md | 24 +++++++++++++ .../src/rules/no-magic-numbers.ts | 24 ++++++++++++- .../tests/rules/no-magic-numbers.test.ts | 36 +++++++++++++++++++ .../eslint-plugin/typings/eslint-rules.d.ts | 1 + 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/docs/rules/no-magic-numbers.md b/packages/eslint-plugin/docs/rules/no-magic-numbers.md index 2ff5aab519d..b5a1e92fd09 100644 --- a/packages/eslint-plugin/docs/rules/no-magic-numbers.md +++ b/packages/eslint-plugin/docs/rules/no-magic-numbers.md @@ -41,4 +41,28 @@ Examples of **correct** code for the `{ "ignoreNumericLiteralTypes": true }` opt type SmallPrimes = 2 | 3 | 5 | 7 | 11; ``` +### ignoreEnums + +A boolean to specify if enums used in Typescript are considered okay. `false` by default. + +Examples of **incorrect** code for the `{ "ignoreEnum": false }` option: + +```ts +/*eslint @typescript-eslint/no-magic-numbers: ["error", { "ignoreEnum": false }]*/ + +enum foo = { + SECOND = 1000, +} +``` + +Examples of **correct** code for the `{ "ignoreEnum": true }` option: + +```ts +/*eslint @typescript-eslint/no-magic-numbers: ["error", { "ignoreEnum": true }]*/ + +enum foo = { + SECOND = 1000, +} +``` + Taken with ❤️ [from ESLint core](https://github.com/eslint/eslint/blob/master/docs/rules/no-magic-numbers.md) diff --git a/packages/eslint-plugin/src/rules/no-magic-numbers.ts b/packages/eslint-plugin/src/rules/no-magic-numbers.ts index f298bfd68f2..1880aa19c9d 100644 --- a/packages/eslint-plugin/src/rules/no-magic-numbers.ts +++ b/packages/eslint-plugin/src/rules/no-magic-numbers.ts @@ -29,6 +29,9 @@ export default util.createRule({ ignoreNumericLiteralTypes: { type: 'boolean', }, + ignoreEnums: { + type: 'boolean', + }, }, }, ], @@ -41,6 +44,7 @@ export default util.createRule({ enforceConst: false, detectObjects: false, ignoreNumericLiteralTypes: false, + ignoreEnums: false, }, ], create(context, [options]) { @@ -85,6 +89,19 @@ export default util.createRule({ return false; } + /** + * Checks if the node parent is a Typescript enum member + * @param node the node to be validated. + * @returns true if the node parent is a Typescript enum member + * @private + */ + function isParentTSEnumDeclaration(node: TSESTree.Node): boolean { + return ( + typeof node.parent !== 'undefined' && + node.parent.type === AST_NODE_TYPES.TSEnumMember + ); + } + /** * Checks if the node parent is a Typescript literal type * @param node the node to be validated. @@ -133,7 +150,12 @@ export default util.createRule({ return { Literal(node) { - // Check TypeScript specific nodes + // Check if the node is a TypeScript enum declaration + if (options.ignoreEnums && isParentTSEnumDeclaration(node)) { + return; + } + + // Check TypeScript specific nodes for Numeric Literal if ( options.ignoreNumericLiteralTypes && isNumber(node) && diff --git a/packages/eslint-plugin/tests/rules/no-magic-numbers.test.ts b/packages/eslint-plugin/tests/rules/no-magic-numbers.test.ts index 2b184ad76b2..09b6c35d0b4 100644 --- a/packages/eslint-plugin/tests/rules/no-magic-numbers.test.ts +++ b/packages/eslint-plugin/tests/rules/no-magic-numbers.test.ts @@ -33,6 +33,14 @@ ruleTester.run('no-magic-numbers', rule, { code: 'type Foo = 1 | -1;', options: [{ ignoreNumericLiteralTypes: true }], }, + { + code: 'enum foo { SECOND = 1000 }', + options: [{ ignoreEnums: true }], + }, + { + code: 'enum foo { SECOND = 1000, NUM = "0123456789" }', + options: [{ ignoreEnums: true }], + }, ], invalid: [ @@ -130,5 +138,33 @@ ruleTester.run('no-magic-numbers', rule, { }, ], }, + { + code: 'enum foo { SECOND = 1000 }', + options: [{ ignoreEnums: false }], + errors: [ + { + messageId: 'noMagic', + data: { + raw: '1000', + }, + line: 1, + column: 21, + }, + ], + }, + { + code: 'enum foo { SECOND = 1000, NUM = "0123456789" }', + options: [{ ignoreEnums: false }], + errors: [ + { + messageId: 'noMagic', + data: { + raw: '1000', + }, + line: 1, + column: 21, + }, + ], + }, ], }); diff --git a/packages/eslint-plugin/typings/eslint-rules.d.ts b/packages/eslint-plugin/typings/eslint-rules.d.ts index 98ee285d1a2..774f0842aa5 100644 --- a/packages/eslint-plugin/typings/eslint-rules.d.ts +++ b/packages/eslint-plugin/typings/eslint-rules.d.ts @@ -180,6 +180,7 @@ declare module 'eslint/lib/rules/no-magic-numbers' { enforceConst?: boolean; detectObjects?: boolean; ignoreNumericLiteralTypes?: boolean; + ignoreEnums?: boolean; } ], {