diff --git a/package.json b/package.json index e70dea6..6bd67b5 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,11 @@ "@babel/register": "^7.15.3", "ajv": "^8.6.3", "babel-plugin-add-module-exports": "^1.0.4", + "babel-plugin-transform-flow-enums": "^0.0.2", "eslint": "^8.1.0", "eslint-config-canonical": "^32.15.0", "eslint-plugin-eslint-plugin": "^4.0.2", + "flow-enums-runtime": "^0.0.6", "gitdown": "^3.1.4", "glob": "^7.2.0", "husky": "^7.0.4", diff --git a/src/rules/defineFlowType.js b/src/rules/defineFlowType.js index 5c696df..c820ef9 100644 --- a/src/rules/defineFlowType.js +++ b/src/rules/defineFlowType.js @@ -34,6 +34,9 @@ const create = (context) => { }; return { + // NOTE: For future contributors, if you ever need to add support for a new identifier, + // use `Identifier(node) {}` to find out which identifiers should be handled. + ClassImplements (node) { makeDefined(node.id); }, @@ -72,6 +75,22 @@ const create = (context) => { makeDefined(param); } }, + + EnumDeclaration(node) { + makeDefined(node.id); + }, + + EnumDefaultedMember(node) { + makeDefined(node.id); + }, + + EnumStringMember(node) { + makeDefined(node.id); + }, + + EnumNumberMember(node) { + makeDefined(node.id); + }, }; }; diff --git a/tests/rules/assertions/defineFlowType.js b/tests/rules/assertions/defineFlowType.js index 11287cc..ba098b2 100644 --- a/tests/rules/assertions/defineFlowType.js +++ b/tests/rules/assertions/defineFlowType.js @@ -150,6 +150,32 @@ type Foo = $ReadOnly<{}>`, }, }, }, + + // Enum types + { + code: 'enum Status { Active, Paused }', + errors: [ + '\'Status\' is not defined.', + '\'Active\' is not defined.', + '\'Paused\' is not defined.', + ], + }, + { + code: `enum Status { Active = 'active', Paused = 'paused' }`, + errors: [ + '\'Status\' is not defined.', + '\'Active\' is not defined.', + '\'Paused\' is not defined.', + ], + }, + { + code: `enum Status { Active = 1, Paused = 2 }`, + errors: [ + '\'Status\' is not defined.', + '\'Active\' is not defined.', + '\'Paused\' is not defined.', + ], + }, ]; const ALWAYS_INVALID = [ @@ -205,7 +231,10 @@ const ALWAYS_VALID = [ parser: require.resolve('@babel/eslint-parser'), parserOptions: { babelOptions: { - plugins: ['@babel/plugin-syntax-flow'], + plugins: [ + 'babel-plugin-transform-flow-enums', + '@babel/plugin-syntax-flow', + ], }, requireConfigFile: false, }, @@ -222,7 +251,10 @@ const ALWAYS_VALID = [ parser: require.resolve('@babel/eslint-parser'), parserOptions: { babelOptions: { - plugins: ['@babel/plugin-syntax-flow'], + plugins: [ + 'babel-plugin-transform-flow-enums', + '@babel/plugin-syntax-flow', + ], }, requireConfigFile: false, }, diff --git a/tests/rules/index.js b/tests/rules/index.js index 9392c26..43d8a6d 100644 --- a/tests/rules/index.js +++ b/tests/rules/index.js @@ -12,6 +12,7 @@ const ruleTester = new RuleTester({ parserOptions: { babelOptions: { plugins: [ + 'babel-plugin-transform-flow-enums', '@babel/plugin-transform-react-jsx', '@babel/plugin-syntax-flow', ],