From 80524b3416be3ed36ae08880d20a385238595034 Mon Sep 17 00:00:00 2001 From: mohitcharkha Date: Thu, 13 Oct 2022 12:02:50 +0530 Subject: [PATCH] Extracted UnsupportedModulePropertyParserError into a throwIfModuleTypeIsUnsupported function in error-utils.js file --- .../src/parsers/__tests__/error-utils-test.js | 89 +++++++++++++++++++ .../src/parsers/error-utils.js | 52 +++++++++++ .../src/parsers/flow/modules/index.js | 18 ++-- .../src/parsers/typescript/modules/index.js | 19 ++-- 4 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js create mode 100644 packages/react-native-codegen/src/parsers/error-utils.js diff --git a/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js b/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js new file mode 100644 index 000000000000..8caf5921466d --- /dev/null +++ b/packages/react-native-codegen/src/parsers/__tests__/error-utils-test.js @@ -0,0 +1,89 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + * @flow strict-local + * @oncall react_native + */ + +'use strict'; + +describe('throwIfMoreThanOneModuleRegistryCalls', () => { + const {throwIfModuleTypeIsUnsupported} = require('../error-utils.js'); + const {UnsupportedModulePropertyParserError} = require('../errors.js'); + const hasteModuleName = 'moduleName'; + const property = {value: 'value', key: {name: 'name'}}; + it("don't throw error if module type is FunctionTypeAnnotation in Flow", () => { + const value = {type: 'FunctionTypeAnnotation'}; + const language = 'Flow'; + + expect(() => { + throwIfModuleTypeIsUnsupported( + hasteModuleName, + property.value, + property.key.name, + value.type, + language, + ); + }).not.toThrow(UnsupportedModulePropertyParserError); + }); + it('throw error if module type is unsupported in Flow', () => { + const value = {type: ''}; + const language = 'Flow'; + + expect(() => { + throwIfModuleTypeIsUnsupported( + hasteModuleName, + property.value, + property.key.name, + value.type, + language, + ); + }).toThrow(UnsupportedModulePropertyParserError); + }); + it("don't throw error if module type is TSFunctionType in TypeScript", () => { + const value = {type: 'TSFunctionType'}; + const language = 'TypeScript'; + + expect(() => { + throwIfModuleTypeIsUnsupported( + hasteModuleName, + property.value, + property.key.name, + value.type, + language, + ); + }).not.toThrow(UnsupportedModulePropertyParserError); + }); + it("don't throw error if module type is TSMethodSignature in TypeScript", () => { + const value = {type: 'TSMethodSignature'}; + const language = 'TypeScript'; + + expect(() => { + throwIfModuleTypeIsUnsupported( + hasteModuleName, + property.value, + property.key.name, + value.type, + language, + ); + }).not.toThrow(UnsupportedModulePropertyParserError); + }); + it('throw error if module type is unsupported in TypeScript', () => { + const value = {type: ''}; + const language = 'TypeScript'; + + expect(() => { + throwIfModuleTypeIsUnsupported( + hasteModuleName, + property.value, + property.key.name, + value.type, + language, + ); + }).toThrow(UnsupportedModulePropertyParserError); + }); +}); diff --git a/packages/react-native-codegen/src/parsers/error-utils.js b/packages/react-native-codegen/src/parsers/error-utils.js new file mode 100644 index 000000000000..fc4274e82347 --- /dev/null +++ b/packages/react-native-codegen/src/parsers/error-utils.js @@ -0,0 +1,52 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +'use strict'; + +import type {ParserType} from './errors'; + +const {UnsupportedModulePropertyParserError} = require('./errors.js'); + +function throwIfModuleTypeIsUnsupported( + nativeModuleName: string, + propertyValue: $FlowFixMe, + propertyName: string, + propertyValueType: string, + language: ParserType, +) { + if (language === 'Flow') { + if (propertyValueType !== 'FunctionTypeAnnotation') { + throw new UnsupportedModulePropertyParserError( + nativeModuleName, + propertyValue, + propertyName, + propertyValueType, + language, + ); + } + } else if (language === 'TypeScript') { + if ( + propertyValueType !== 'TSFunctionType' && + propertyValueType !== 'TSMethodSignature' + ) { + throw new UnsupportedModulePropertyParserError( + nativeModuleName, + propertyValue, + propertyName, + propertyValueType, + language, + ); + } + } +} + +module.exports = { + throwIfModuleTypeIsUnsupported, +}; 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 90ab99c40252..9673223067b5 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -61,7 +61,6 @@ const { UnsupportedFunctionReturnTypeAnnotationParserError, UnsupportedEnumDeclarationParserError, UnsupportedUnionTypeAnnotationParserError, - UnsupportedModulePropertyParserError, UnsupportedObjectPropertyTypeAnnotationParserError, UnsupportedObjectPropertyValueTypeAnnotationParserError, UnusedModuleInterfaceParserError, @@ -71,6 +70,7 @@ const { IncorrectModuleRegistryCallArityParserError, IncorrectModuleRegistryCallArgumentTypeParserError, } = require('../../errors.js'); +const {throwIfModuleTypeIsUnsupported} = require('../../error-utils'); const language = 'Flow'; @@ -530,15 +530,13 @@ function buildPropertySchema( ({nullable, typeAnnotation: value} = resolveTypeAnnotation(value, types)); - if (value.type !== 'FunctionTypeAnnotation') { - throw new UnsupportedModulePropertyParserError( - hasteModuleName, - property.value, - property.key.name, - value.type, - language, - ); - } + throwIfModuleTypeIsUnsupported( + hasteModuleName, + property.value, + property.key.name, + value.type, + language, + ); return { name: methodName, 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 8b4da89cf5a6..ee88a0589e62 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -61,7 +61,6 @@ const { UnsupportedFunctionReturnTypeAnnotationParserError, UnsupportedEnumDeclarationParserError, UnsupportedUnionTypeAnnotationParserError, - UnsupportedModulePropertyParserError, UnsupportedObjectPropertyTypeAnnotationParserError, UnsupportedObjectPropertyValueTypeAnnotationParserError, UnusedModuleInterfaceParserError, @@ -71,6 +70,7 @@ const { IncorrectModuleRegistryCallArityParserError, IncorrectModuleRegistryCallArgumentTypeParserError, } = require('../../errors.js'); +const {throwIfModuleTypeIsUnsupported} = require('../../error-utils'); const language = 'TypeScript'; @@ -563,16 +563,13 @@ function buildPropertySchema( const methodName: string = key.name; ({nullable, typeAnnotation: value} = resolveTypeAnnotation(value, types)); - - if (value.type !== 'TSFunctionType' && value.type !== 'TSMethodSignature') { - throw new UnsupportedModulePropertyParserError( - hasteModuleName, - property.value, - property.key.name, - value.type, - language, - ); - } + throwIfModuleTypeIsUnsupported( + hasteModuleName, + property.value, + property.key.name, + value.type, + language, + ); return { name: methodName,