diff --git a/packages/react-native-codegen/src/parsers/error-utils.js b/packages/react-native-codegen/src/parsers/error-utils.js index 2c3c237328d..ea419933ec8 100644 --- a/packages/react-native-codegen/src/parsers/error-utils.js +++ b/packages/react-native-codegen/src/parsers/error-utils.js @@ -19,6 +19,7 @@ const { UnusedModuleInterfaceParserError, IncorrectModuleRegistryCallArityParserError, IncorrectModuleRegistryCallTypeParameterParserError, + UnsupportedObjectPropertyValueTypeAnnotationParserError, UntypedModuleRegistryCallParserError, UnsupportedModulePropertyParserError, } = require('./errors.js'); @@ -188,10 +189,36 @@ function throwIfModuleTypeIsUnsupported( } } +const UnsupportedObjectPropertyTypeToInvalidPropertyValueTypeMap = { + FunctionTypeAnnotation: 'FunctionTypeAnnotation', + VoidTypeAnnotation: 'void', + PromiseTypeAnnotation: 'Promise', +}; + +function throwIfPropertyValueTypeIsUnsupported( + moduleName: string, + propertyValue: $FlowFixMe, + propertyKey: string, + type: string, + language: ParserType, +) { + const invalidPropertyValueType = + UnsupportedObjectPropertyTypeToInvalidPropertyValueTypeMap[type]; + + throw new UnsupportedObjectPropertyValueTypeAnnotationParserError( + moduleName, + propertyValue, + propertyKey, + invalidPropertyValueType, + language, + ); +} + module.exports = { throwIfModuleInterfaceIsMisnamed, throwIfModuleInterfaceNotFound, throwIfMoreThanOneModuleRegistryCalls, + throwIfPropertyValueTypeIsUnsupported, throwIfUnusedModuleInterfaceParserError, throwIfWrongNumberOfCallExpressionArgs, throwIfIncorrectModuleRegistryCallTypeParameterParserError, diff --git a/packages/react-native-codegen/src/parsers/flow/modules/index.js b/packages/react-native-codegen/src/parsers/flow/modules/index.js index d9e6b13abe0..d69629734aa 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -63,7 +63,6 @@ const { UnsupportedEnumDeclarationParserError, UnsupportedUnionTypeAnnotationParserError, UnsupportedObjectPropertyTypeAnnotationParserError, - UnsupportedObjectPropertyValueTypeAnnotationParserError, IncorrectModuleRegistryCallArgumentTypeParserError, } = require('../../errors.js'); const {verifyPlatforms} = require('../../utils'); @@ -71,6 +70,7 @@ const {verifyPlatforms} = require('../../utils'); const { throwIfModuleInterfaceNotFound, throwIfModuleInterfaceIsMisnamed, + throwIfPropertyValueTypeIsUnsupported, throwIfUnusedModuleInterfaceParserError, throwIfWrongNumberOfCallExpressionArgs, throwIfIncorrectModuleRegistryCallTypeParameterParserError, @@ -309,44 +309,28 @@ function translateTypeAnnotation( ), ); - if (propertyTypeAnnotation.type === 'FunctionTypeAnnotation') { - throw new UnsupportedObjectPropertyValueTypeAnnotationParserError( + if ( + propertyTypeAnnotation.type === 'FunctionTypeAnnotation' || + propertyTypeAnnotation.type === 'PromiseTypeAnnotation' || + propertyTypeAnnotation.type === 'VoidTypeAnnotation' + ) { + throwIfPropertyValueTypeIsUnsupported( hasteModuleName, property.value, property.key, propertyTypeAnnotation.type, language, ); + } else { + return { + name: key.name, + optional, + typeAnnotation: wrapNullable( + isPropertyNullable, + propertyTypeAnnotation, + ), + }; } - - if (propertyTypeAnnotation.type === 'VoidTypeAnnotation') { - throw new UnsupportedObjectPropertyValueTypeAnnotationParserError( - hasteModuleName, - property.value, - property.key, - 'void', - language, - ); - } - - if (propertyTypeAnnotation.type === 'PromiseTypeAnnotation') { - throw new UnsupportedObjectPropertyValueTypeAnnotationParserError( - hasteModuleName, - property.value, - property.key, - 'Promise', - language, - ); - } - - return { - name: key.name, - optional, - typeAnnotation: wrapNullable( - isPropertyNullable, - propertyTypeAnnotation, - ), - }; }); }, ) 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 90b04f3c38d..a084949635f 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -63,13 +63,13 @@ const { UnsupportedEnumDeclarationParserError, UnsupportedUnionTypeAnnotationParserError, UnsupportedObjectPropertyTypeAnnotationParserError, - UnsupportedObjectPropertyValueTypeAnnotationParserError, IncorrectModuleRegistryCallArgumentTypeParserError, } = require('../../errors.js'); const {verifyPlatforms} = require('../../utils'); const { throwIfUntypedModule, + throwIfPropertyValueTypeIsUnsupported, throwIfModuleTypeIsUnsupported, throwIfUnusedModuleInterfaceParserError, throwIfModuleInterfaceNotFound, @@ -324,44 +324,28 @@ function translateTypeAnnotation( ), ); - if (propertyTypeAnnotation.type === 'FunctionTypeAnnotation') { - throw new UnsupportedObjectPropertyValueTypeAnnotationParserError( + if ( + propertyTypeAnnotation.type === 'FunctionTypeAnnotation' || + propertyTypeAnnotation.type === 'PromiseTypeAnnotation' || + propertyTypeAnnotation.type === 'VoidTypeAnnotation' + ) { + throwIfPropertyValueTypeIsUnsupported( hasteModuleName, property.typeAnnotation.typeAnnotation, property.key, propertyTypeAnnotation.type, language, ); + } else { + return { + name: key.name, + optional, + typeAnnotation: wrapNullable( + isPropertyNullable, + propertyTypeAnnotation, + ), + }; } - - if (propertyTypeAnnotation.type === 'VoidTypeAnnotation') { - throw new UnsupportedObjectPropertyValueTypeAnnotationParserError( - hasteModuleName, - property.typeAnnotation.typeAnnotation, - property.key, - 'void', - language, - ); - } - - if (propertyTypeAnnotation.type === 'PromiseTypeAnnotation') { - throw new UnsupportedObjectPropertyValueTypeAnnotationParserError( - hasteModuleName, - property.typeAnnotation.typeAnnotation, - property.key, - 'Promise', - language, - ); - } - - return { - name: key.name, - optional, - typeAnnotation: wrapNullable( - isPropertyNullable, - propertyTypeAnnotation, - ), - }; }); }, )