diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-e2e-test.js b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-e2e-test.js index 540f388168ba..eb1a4b8f11b9 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-e2e-test.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/typescript-module-parser-e2e-test.js @@ -18,6 +18,7 @@ import type { const { MissingTypeParameterGenericParserError, UnnamedFunctionParamParserError, + UnsupportedEnumDeclarationParserError, UnsupportedGenericParserError, UnsupportedTypeAnnotationParserError, } = require('../../../errors'); @@ -146,6 +147,26 @@ describe('TypeScript Module Parser', () => { ]); }); + it.each([ + 'VALUE = -1.5', + 'ZERO = 0, VALUE = -1.5', + 'VALUE = -1e-2', + 'VALUE = -(1.5)', + ])('should reject fractional enum members: %s', members => { + const parser = () => + parseModule(` + import type {TurboModule} from 'RCTExport'; + import * as TurboModuleRegistry from 'TurboModuleRegistry'; + enum MyEnum { ${members} } + export interface Spec extends TurboModule { + useArg(arg: MyEnum): void; + } + export default TurboModuleRegistry.get('Foo'); + `); + + expect(parser).toThrow(UnsupportedEnumDeclarationParserError); + }); + it('should properly parse enums', () => { const parser = () => parseModule(` diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index a5925aecef32..35112d5bbdd7 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -362,12 +362,17 @@ function translateTypeAnnotation( } case 'TSEnumDeclaration': { if ( - typeAnnotation.members.some( - m => - m.initializer && - m.initializer.type === 'NumericLiteral' && - !Number.isInteger(m.initializer.value), - ) + typeAnnotation.members.some(m => { + const initializer = + m.initializer?.type === 'UnaryExpression' && + m.initializer.operator === '-' + ? m.initializer.argument + : m.initializer; + return ( + initializer?.type === 'NumericLiteral' && + !Number.isInteger(initializer.value) + ); + }) ) { throw new UnsupportedEnumDeclarationParserError( hasteModuleName,