From 949fe29dd24c266dd2dacb99e0e8e413dd3dfb4d Mon Sep 17 00:00:00 2001 From: tarunrajput Date: Wed, 14 Jun 2023 12:54:43 +0530 Subject: [PATCH] refactor(codegen): add emitObjectProp in parser primitives --- .../__tests__/parsers-primitives-test.js | 105 ++++++++++++++++++ .../src/parsers/flow/components/events.js | 17 ++- .../src/parsers/parsers-primitives.js | 19 ++++ .../parsers/typescript/components/events.js | 23 ++-- 4 files changed, 139 insertions(+), 25 deletions(-) diff --git a/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js b/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js index a09730d1ce36bb..722d44299eba8b 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js @@ -42,12 +42,14 @@ const { typeEnumResolution, Visitor, emitStringProp, + emitObjectProp, } = require('../parsers-primitives.js'); const {MockedParser} = require('../parserMock'); const {emitUnion} = require('../parsers-primitives'); const {UnsupportedUnionTypeAnnotationParserError} = require('../errors'); const {FlowParser} = require('../flow/parser'); const {TypeScriptParser} = require('../typescript/parser'); +const {extractArrayElementType} = require('../flow/components/events'); const parser = new MockedParser(); const flowParser = new FlowParser(); @@ -1671,3 +1673,106 @@ describe('emitBoolProp', () => { }); }); }); + +describe('emitObjectProp', () => { + const name = 'someProp'; + describe('when property is optional', () => { + it('returns optional Object Prop', () => { + const typeAnnotation = { + type: 'GenericTypeAnnotation', + id: { + name: 'ObjectTypeAnnotation', + }, + properties: [ + { + key: { + name: 'someKey', + }, + optional: true, + value: { + type: 'StringTypeAnnotation', + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + }, + ], + }; + const result = emitObjectProp( + name, + true, + flowParser, + typeAnnotation, + extractArrayElementType, + ); + const expected = { + name: 'someProp', + optional: true, + typeAnnotation: { + properties: [ + { + name: 'someKey', + optional: true, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + ], + type: 'ObjectTypeAnnotation', + }, + }; + + expect(result).toEqual(expected); + }); + }); + + describe('when property is required', () => { + it('returns required Object Prop', () => { + const typeAnnotation = { + type: 'GenericTypeAnnotation', + id: { + name: 'ObjectTypeAnnotation', + }, + properties: [ + { + key: { + name: 'someKey', + }, + optional: false, + value: { + type: 'StringTypeAnnotation', + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + }, + ], + }; + const result = emitObjectProp( + name, + false, + flowParser, + typeAnnotation, + extractArrayElementType, + ); + const expected = { + name: 'someProp', + optional: false, + typeAnnotation: { + properties: [ + { + name: 'someKey', + optional: false, + typeAnnotation: { + type: 'StringTypeAnnotation', + }, + }, + ], + type: 'ObjectTypeAnnotation', + }, + }; + + expect(result).toEqual(expected); + }); + }); +}); diff --git a/packages/react-native-codegen/src/parsers/flow/components/events.js b/packages/react-native-codegen/src/parsers/flow/components/events.js index b40b7166d3a24c..67692c16bb2a92 100644 --- a/packages/react-native-codegen/src/parsers/flow/components/events.js +++ b/packages/react-native-codegen/src/parsers/flow/components/events.js @@ -33,6 +33,7 @@ const { emitMixedProp, emitStringProp, emitInt32Prop, + emitObjectProp, } = require('../../parsers-primitives'); function getPropertyType( @@ -64,18 +65,13 @@ function getPropertyType( parser, ); case 'ObjectTypeAnnotation': - return { + return emitObjectProp( name, optional, - typeAnnotation: { - type: 'ObjectTypeAnnotation', - properties: parser - .getObjectProperties(typeAnnotation) - .map(member => - buildPropertiesForEvent(member, parser, getPropertyType), - ), - }, - }; + parser, + typeAnnotation, + extractArrayElementType, + ); case 'UnionTypeAnnotation': return { name, @@ -315,4 +311,5 @@ function getEvents( module.exports = { getEvents, + extractArrayElementType, }; diff --git a/packages/react-native-codegen/src/parsers/parsers-primitives.js b/packages/react-native-codegen/src/parsers/parsers-primitives.js index db5668cc5706a4..845a42e073ffca 100644 --- a/packages/react-native-codegen/src/parsers/parsers-primitives.js +++ b/packages/react-native-codegen/src/parsers/parsers-primitives.js @@ -657,6 +657,24 @@ function emitMixedProp( }; } +function emitObjectProp( + name: string, + optional: boolean, + parser: Parser, + typeAnnotation: $FlowFixMe, + extractArrayElementType: ( + typeAnnotation: $FlowFixMe, + name: string, + parser: Parser, + ) => EventTypeAnnotation, +): NamedShape { + return { + name, + optional, + typeAnnotation: extractArrayElementType(typeAnnotation, name, parser), + }; +} + module.exports = { emitArrayType, emitBoolean, @@ -687,4 +705,5 @@ module.exports = { typeEnumResolution, translateArrayTypeAnnotation, Visitor, + emitObjectProp, }; diff --git a/packages/react-native-codegen/src/parsers/typescript/components/events.js b/packages/react-native-codegen/src/parsers/typescript/components/events.js index f03b9209fea01e..230b9b512a6b7f 100644 --- a/packages/react-native-codegen/src/parsers/typescript/components/events.js +++ b/packages/react-native-codegen/src/parsers/typescript/components/events.js @@ -35,6 +35,7 @@ const { emitMixedProp, emitStringProp, emitInt32Prop, + emitObjectProp, } = require('../../parsers-primitives'); function getPropertyType( /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's @@ -49,10 +50,7 @@ function getPropertyType( const topLevelType = parseTopLevelType(annotation); const typeAnnotation = topLevelType.type; const optional = optionalProperty || topLevelType.optional; - const type = - typeAnnotation.type === 'TSTypeReference' - ? typeAnnotation.typeName.name - : typeAnnotation.type; + const type = parser.extractTypeFromTypeAnnotation(typeAnnotation); switch (type) { case 'TSBooleanKeyword': @@ -66,18 +64,13 @@ function getPropertyType( case 'Float': return emitFloatProp(name, optional); case 'TSTypeLiteral': - return { + return emitObjectProp( name, optional, - typeAnnotation: { - type: 'ObjectTypeAnnotation', - properties: parser - .getObjectProperties(typeAnnotation) - .map(member => - buildPropertiesForEvent(member, parser, getPropertyType), - ), - }, - }; + parser, + typeAnnotation, + extractArrayElementType, + ); case 'TSUnionType': return { name, @@ -96,7 +89,6 @@ function getPropertyType( typeAnnotation: extractArrayElementType(typeAnnotation, name, parser), }; default: - (type: empty); throw new Error(`Unable to determine event type for "${name}": ${type}`); } } @@ -318,4 +310,5 @@ function getEvents( module.exports = { getEvents, + extractArrayElementType, };