From 2c31e25c1c94291a9d4622c18d3118581e82652d Mon Sep 17 00:00:00 2001 From: Marve10s Date: Sun, 25 Oct 2026 22:29:43 +0300 Subject: [PATCH] Reject negative fractional enum values in TypeScript Codegen --- .../typescript-module-parser-e2e-test.js | 21 +++++++++++++++++++ .../src/parsers/typescript/modules/index.js | 17 +++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) 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,