From 3c6842a1902d02f53bef051d60f2ddd4b886b651 Mon Sep 17 00:00:00 2001 From: Eli White Date: Thu, 31 Oct 2024 00:18:32 -0700 Subject: [PATCH 1/2] Add NumberLiteralTypeAnnotation support (#47323) Summary: This change adds support for number literals as a type. The codegen already has parsing support for these types ``` +passNumber: (arg: number) => void; +passString: (arg: string) => void; +passStringLiteral: (arg: 'A String Literal') => void; ``` This change now also supports ``` +passNumberLiteral: (arg: 4) => void; ``` On the native side this is treated the same as `number`. It could be strengthened in the future. This is a pre-requisite for number literal unions and enums. Changelog: [Internal] Differential Revision: D65249334 --- .../src/CodegenSchema.d.ts | 7 +++++++ .../react-native-codegen/src/CodegenSchema.js | 7 +++++++ .../generators/modules/GenerateModuleCpp.js | 2 ++ .../src/generators/modules/GenerateModuleH.js | 2 ++ .../modules/GenerateModuleJavaSpec.js | 7 +++++++ .../modules/GenerateModuleJniCpp.js | 6 ++++++ .../GenerateModuleObjCpp/StructCollector.js | 2 ++ .../header/serializeConstantsStruct.js | 4 ++++ .../header/serializeRegularStruct.js | 4 ++++ .../serializeEventEmitter.js | 1 + .../GenerateModuleObjCpp/serializeMethod.js | 6 ++++++ .../modules/__test_fixtures__/fixtures.js | 1 + .../module-parser-snapshot-test.js.snap | 20 +++++++++++++++++++ .../src/parsers/flow/modules/index.js | 4 ++++ .../src/parsers/parsers-primitives.js | 12 +++++++++++ .../modules/__test_fixtures__/fixtures.js | 1 + ...script-module-parser-snapshot-test.js.snap | 20 +++++++++++++++++++ .../src/parsers/typescript/modules/index.js | 4 ++++ 18 files changed, 110 insertions(+) diff --git a/packages/react-native-codegen/src/CodegenSchema.d.ts b/packages/react-native-codegen/src/CodegenSchema.d.ts index d16379472faf..42f1a75143c1 100644 --- a/packages/react-native-codegen/src/CodegenSchema.d.ts +++ b/packages/react-native-codegen/src/CodegenSchema.d.ts @@ -286,6 +286,11 @@ export interface UnsafeAnyTypeAnnotation { readonly type: 'AnyTypeAnnotation', } +export interface NativeModuleNumberLiteralTypeAnnotation { + readonly type: 'NumberLiteralTypeAnnotation'; + readonly value: number; +} + export interface NativeModuleStringTypeAnnotation { readonly type: 'StringTypeAnnotation'; } @@ -380,6 +385,7 @@ export type NativeModuleEventEmitterBaseTypeAnnotation = | NativeModuleFloatTypeAnnotation | NativeModuleInt32TypeAnnotation | NativeModuleNumberTypeAnnotation + | NativeModuleNumberLiteralTypeAnnotation | NativeModuleStringTypeAnnotation | NativeModuleStringLiteralTypeAnnotation | NativeModuleStringLiteralUnionTypeAnnotation @@ -399,6 +405,7 @@ export type NativeModuleBaseTypeAnnotation = | NativeModuleStringLiteralTypeAnnotation | NativeModuleStringLiteralUnionTypeAnnotation | NativeModuleNumberTypeAnnotation + | NativeModuleNumberLiteralTypeAnnotation | NativeModuleInt32TypeAnnotation | NativeModuleDoubleTypeAnnotation | NativeModuleFloatTypeAnnotation diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index 6b3097804fa4..505291700fee 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -37,6 +37,11 @@ export type Int32TypeAnnotation = $ReadOnly<{ type: 'Int32TypeAnnotation', }>; +export type NumberLiteralTypeAnnotation = $ReadOnly<{ + type: 'NumberLiteralTypeAnnotation', + value: number, +}>; + export type StringTypeAnnotation = $ReadOnly<{ type: 'StringTypeAnnotation', }>; @@ -366,6 +371,7 @@ type NativeModuleEventEmitterBaseTypeAnnotation = | FloatTypeAnnotation | Int32TypeAnnotation | NativeModuleNumberTypeAnnotation + | NumberLiteralTypeAnnotation | StringTypeAnnotation | StringLiteralTypeAnnotation | StringLiteralUnionTypeAnnotation @@ -385,6 +391,7 @@ export type NativeModuleBaseTypeAnnotation = | StringLiteralTypeAnnotation | StringLiteralUnionTypeAnnotation | NativeModuleNumberTypeAnnotation + | NumberLiteralTypeAnnotation | Int32TypeAnnotation | DoubleTypeAnnotation | FloatTypeAnnotation diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js index 1aa3c73dbbb9..3c4e9b4fe9f9 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js @@ -186,6 +186,8 @@ function serializeArg( return wrap(val => `${val}.asNumber()`); case 'Int32TypeAnnotation': return wrap(val => `${val}.asNumber()`); + case 'NumberLiteralTypeAnnotation': + return wrap(val => `${val}.asNumber()`); case 'ArrayTypeAnnotation': return wrap(val => `${val}.asObject(rt).asArray(rt)`); case 'FunctionTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index f7c4d6748812..691229f68935 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -179,6 +179,8 @@ function translatePrimitiveJSTypeToCpp( return wrapOptional('jsi::String', isRequired); case 'NumberTypeAnnotation': return wrapOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapOptional('double', isRequired); case 'DoubleTypeAnnotation': return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js index 779b9ac3f5fb..8ff63e8c994a 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js @@ -136,6 +136,7 @@ function translateEventEmitterTypeToJavaType( case 'StringLiteralUnionTypeAnnotation': return 'String'; case 'NumberTypeAnnotation': + case 'NumberLiteralTypeAnnotation': case 'FloatTypeAnnotation': case 'DoubleTypeAnnotation': case 'Int32TypeAnnotation': @@ -203,6 +204,8 @@ function translateFunctionParamToJavaType( return wrapOptional('String', isRequired); case 'NumberTypeAnnotation': return wrapOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': return wrapOptional('double', isRequired); case 'DoubleTypeAnnotation': @@ -297,6 +300,8 @@ function translateFunctionReturnTypeToJavaType( return wrapOptional('String', isRequired); case 'NumberTypeAnnotation': return wrapOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapOptional('double', isRequired); case 'FloatTypeAnnotation': return wrapOptional('double', isRequired); case 'DoubleTypeAnnotation': @@ -373,6 +378,8 @@ function getFalsyReturnStatementFromReturnType( return ''; case 'NumberTypeAnnotation': return nullable ? 'return null;' : 'return 0;'; + case 'NumberLiteralTypeAnnotation': + return nullable ? 'return null;' : 'return 0;'; case 'FloatTypeAnnotation': return nullable ? 'return null;' : 'return 0.0;'; case 'DoubleTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js index 3beb1c3fa1ea..7d6de0a4f54e 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js @@ -197,6 +197,8 @@ function translateReturnTypeToKind( } case 'NumberTypeAnnotation': return 'NumberKind'; + case 'NumberLiteralTypeAnnotation': + return 'NumberKind'; case 'DoubleTypeAnnotation': return 'NumberKind'; case 'FloatTypeAnnotation': @@ -280,6 +282,8 @@ function translateParamTypeToJniType( } case 'NumberTypeAnnotation': return !isRequired ? 'Ljava/lang/Double;' : 'D'; + case 'NumberLiteralTypeAnnotation': + return !isRequired ? 'Ljava/lang/Double;' : 'D'; case 'DoubleTypeAnnotation': return !isRequired ? 'Ljava/lang/Double;' : 'D'; case 'FloatTypeAnnotation': @@ -360,6 +364,8 @@ function translateReturnTypeToJniType( } case 'NumberTypeAnnotation': return nullable ? 'Ljava/lang/Double;' : 'D'; + case 'NumberLiteralTypeAnnotation': + return nullable ? 'Ljava/lang/Double;' : 'D'; case 'DoubleTypeAnnotation': return nullable ? 'Ljava/lang/Double;' : 'D'; case 'FloatTypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js index 295514ca5265..db243d9f3024 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/StructCollector.js @@ -23,6 +23,7 @@ import type { NativeModuleObjectTypeAnnotation, NativeModuleTypeAliasTypeAnnotation, Nullable, + NumberLiteralTypeAnnotation, ReservedTypeAnnotation, StringLiteralTypeAnnotation, StringLiteralUnionTypeAnnotation, @@ -63,6 +64,7 @@ export type StructTypeAnnotation = | StringLiteralTypeAnnotation | StringLiteralUnionTypeAnnotation | NativeModuleNumberTypeAnnotation + | NumberLiteralTypeAnnotation | Int32TypeAnnotation | DoubleTypeAnnotation | FloatTypeAnnotation diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js index 9fe6e73fc700..9cee0665e8f3 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js @@ -100,6 +100,8 @@ function toObjCType( return 'NSString *'; case 'NumberTypeAnnotation': return wrapCxxOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapCxxOptional('double', isRequired); case 'FloatTypeAnnotation': return wrapCxxOptional('double', isRequired); case 'Int32TypeAnnotation': @@ -183,6 +185,8 @@ function toObjCValue( return value; case 'NumberTypeAnnotation': return wrapPrimitive('double'); + case 'NumberLiteralTypeAnnotation': + return wrapPrimitive('double'); case 'FloatTypeAnnotation': return wrapPrimitive('double'); case 'Int32TypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js index dbf0fbefb50f..9fca06510ad9 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js @@ -91,6 +91,8 @@ function toObjCType( return 'NSString *'; case 'NumberTypeAnnotation': return wrapCxxOptional('double', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapCxxOptional('double', isRequired); case 'FloatTypeAnnotation': return wrapCxxOptional('double', isRequired); case 'Int32TypeAnnotation': @@ -173,6 +175,8 @@ function toObjCValue( return RCTBridgingTo('String'); case 'NumberTypeAnnotation': return RCTBridgingTo('Double'); + case 'NumberLiteralTypeAnnotation': + return RCTBridgingTo('Double'); case 'FloatTypeAnnotation': return RCTBridgingTo('Double'); case 'Int32TypeAnnotation': diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js index ae3ff4e198ee..fd1afff066fb 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js @@ -25,6 +25,7 @@ function getEventEmitterTypeObjCType( case 'StringLiteralUnionTypeAnnotation': return 'NSString *_Nonnull'; case 'NumberTypeAnnotation': + case 'NumberLiteralTypeAnnotation': return 'NSNumber *_Nonnull'; case 'BooleanTypeAnnotation': return 'BOOL'; diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js index 3c024a65e44f..8e0a56472ff8 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleObjCpp/serializeMethod.js @@ -263,6 +263,8 @@ function getParamObjCType( return notStruct(wrapOptional('NSString *', !nullable)); case 'NumberTypeAnnotation': return notStruct(isRequired ? 'double' : 'NSNumber *'); + case 'NumberLiteralTypeAnnotation': + return notStruct(isRequired ? 'double' : 'NSNumber *'); case 'FloatTypeAnnotation': return notStruct(isRequired ? 'float' : 'NSNumber *'); case 'DoubleTypeAnnotation': @@ -344,6 +346,8 @@ function getReturnObjCType( return wrapOptional('NSString *', isRequired); case 'NumberTypeAnnotation': return wrapOptional('NSNumber *', isRequired); + case 'NumberLiteralTypeAnnotation': + return wrapOptional('NSNumber *', isRequired); case 'FloatTypeAnnotation': return wrapOptional('NSNumber *', isRequired); case 'DoubleTypeAnnotation': @@ -414,6 +418,8 @@ function getReturnJSType( return 'StringKind'; case 'NumberTypeAnnotation': return 'NumberKind'; + case 'NumberLiteralTypeAnnotation': + return 'NumberKind'; case 'FloatTypeAnnotation': return 'NumberKind'; case 'DoubleTypeAnnotation': diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js index 1130a84e9b2f..45c9179f5baa 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/__test_fixtures__/fixtures.js @@ -126,6 +126,7 @@ import * as TurboModuleRegistry from '../TurboModuleRegistry'; export interface Spec extends TurboModule { +passBool?: (arg: boolean) => void; +passNumber: (arg: number) => void; + +passNumberLiteral: (arg: 4) => void; +passString: (arg: string) => void; +passStringish: (arg: Stringish) => void; +passStringLiteral: (arg: 'A String Literal') => void; diff --git a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap index 0d1076908790..56df331cbeac 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/flow/modules/__tests__/__snapshots__/module-parser-snapshot-test.js.snap @@ -978,6 +978,26 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_BASIC_PA ] } }, + { + 'name': 'passNumberLiteral', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'returnTypeAnnotation': { + 'type': 'VoidTypeAnnotation' + }, + 'params': [ + { + 'name': 'arg', + 'optional': false, + 'typeAnnotation': { + 'type': 'NumberLiteralTypeAnnotation', + 'value': 4 + } + } + ] + } + }, { 'name': 'passString', 'optional': false, 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 4c6d2ef20232..501264ca3d6f 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -38,6 +38,7 @@ const { emitCommonTypes, emitDictionary, emitFunction, + emitNumberLiteral, emitPromise, emitRootTag, emitUnion, @@ -243,6 +244,9 @@ function translateTypeAnnotation( case 'UnionTypeAnnotation': { return emitUnion(nullable, hasteModuleName, typeAnnotation, parser); } + case 'NumberLiteralTypeAnnotation': { + return emitNumberLiteral(nullable, typeAnnotation.value); + } case 'StringLiteralTypeAnnotation': { return wrapNullable(nullable, { type: 'StringLiteralTypeAnnotation', diff --git a/packages/react-native-codegen/src/parsers/parsers-primitives.js b/packages/react-native-codegen/src/parsers/parsers-primitives.js index 5e366960201d..a0fa2c3f0ecf 100644 --- a/packages/react-native-codegen/src/parsers/parsers-primitives.js +++ b/packages/react-native-codegen/src/parsers/parsers-primitives.js @@ -31,6 +31,7 @@ import type { NativeModuleTypeAnnotation, NativeModuleUnionTypeAnnotation, Nullable, + NumberLiteralTypeAnnotation, ObjectTypeAnnotation, ReservedTypeAnnotation, StringLiteralTypeAnnotation, @@ -170,6 +171,16 @@ function emitMixed( }); } +function emitNumberLiteral( + nullable: boolean, + value: number, +): Nullable { + return wrapNullable(nullable, { + type: 'NumberLiteralTypeAnnotation', + value, + }); +} + function emitString(nullable: boolean): Nullable { return wrapNullable(nullable, { type: 'StringTypeAnnotation', @@ -762,6 +773,7 @@ module.exports = { emitInt32Prop, emitMixedProp, emitNumber, + emitNumberLiteral, emitGenericObject, emitDictionary, emitObject, diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js index 6927f6c77c65..1dead63de55f 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__test_fixtures__/fixtures.js @@ -113,6 +113,7 @@ import * as TurboModuleRegistry from '../TurboModuleRegistry'; export interface Spec extends TurboModule { readonly passBool?: (arg: boolean) => void; readonly passNumber: (arg: number) => void; + readonly passNumberLiteral: (arg: 4) => void; readonly passString: (arg: string) => void; readonly passStringish: (arg: Stringish) => void; readonly passStringLiteral: (arg: 'A String Literal') => void; diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap index 5ff8fc7f31f0..7358482aa08e 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap @@ -1123,6 +1123,26 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_BA ] } }, + { + 'name': 'passNumberLiteral', + 'optional': false, + 'typeAnnotation': { + 'type': 'FunctionTypeAnnotation', + 'returnTypeAnnotation': { + 'type': 'VoidTypeAnnotation' + }, + 'params': [ + { + 'name': 'arg', + 'optional': false, + 'typeAnnotation': { + 'type': 'NumberLiteralTypeAnnotation', + 'value': 4 + } + } + ] + } + }, { 'name': 'passString', 'optional': false, 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 8c4da2de883d..aaab3ddeeae8 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -37,6 +37,7 @@ const { emitCommonTypes, emitDictionary, emitFunction, + emitNumberLiteral, emitPromise, emitRootTag, emitStringLiteral, @@ -403,6 +404,9 @@ function translateTypeAnnotation( case 'StringLiteral': { return emitStringLiteral(nullable, literal.value); } + case 'NumericLiteral': { + return emitNumberLiteral(nullable, literal.value); + } default: { throw new UnsupportedTypeAnnotationParserError( hasteModuleName, From 037f822db489e2664fd8daf2c1cf55e15c569c83 Mon Sep 17 00:00:00 2001 From: Eli White Date: Thu, 31 Oct 2024 00:18:32 -0700 Subject: [PATCH 2/2] Fix CodegenSchema Enum type to not export array Summary: I need to reference this type somewhere else, but not an array of the type. Generally we prefer that all exported types are the object itself, and it used as a member type of arrays when used. Changelog: [Internal] Differential Revision: D65259014 --- packages/react-native-codegen/src/CodegenSchema.d.ts | 6 +++--- packages/react-native-codegen/src/CodegenSchema.js | 12 +++++------- .../src/generators/modules/GenerateModuleH.js | 4 ++-- .../react-native-codegen/src/parsers/flow/parser.js | 6 ++++-- packages/react-native-codegen/src/parsers/parser.js | 6 ++++-- .../react-native-codegen/src/parsers/parserMock.js | 6 ++++-- .../src/parsers/typescript/parser.js | 6 ++++-- 7 files changed, 26 insertions(+), 20 deletions(-) diff --git a/packages/react-native-codegen/src/CodegenSchema.d.ts b/packages/react-native-codegen/src/CodegenSchema.d.ts index 42f1a75143c1..0f1cf9baff3d 100644 --- a/packages/react-native-codegen/src/CodegenSchema.d.ts +++ b/packages/react-native-codegen/src/CodegenSchema.d.ts @@ -325,10 +325,10 @@ export interface NativeModuleBooleanTypeAnnotation { readonly type: 'BooleanTypeAnnotation'; } -export type NativeModuleEnumMembers = readonly { +export type NativeModuleEnumMember = { readonly name: string; readonly value: string | number; -}[]; +}; export type NativeModuleEnumMemberType = | 'NumberTypeAnnotation' @@ -344,7 +344,7 @@ export interface NativeModuleEnumDeclarationWithMembers { name: string; type: 'EnumDeclarationWithMembers'; memberType: NativeModuleEnumMemberType; - members: NativeModuleEnumMembers; + members: readonly NativeModuleEnumMember[]; } export interface NativeModuleGenericObjectTypeAnnotation { diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index 505291700fee..d8b72e48ffd1 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -309,12 +309,10 @@ export type NativeModuleNumberTypeAnnotation = $ReadOnly<{ type: 'NumberTypeAnnotation', }>; -export type NativeModuleEnumMembers = $ReadOnlyArray< - $ReadOnly<{ - name: string, - value: string | number, - }>, ->; +export type NativeModuleEnumMember = { + name: string, + value: string | number, +}; export type NativeModuleEnumMemberType = | 'NumberTypeAnnotation' @@ -330,7 +328,7 @@ export type NativeModuleEnumDeclarationWithMembers = { name: string, type: 'EnumDeclarationWithMembers', memberType: NativeModuleEnumMemberType, - members: NativeModuleEnumMembers, + members: $ReadOnlyArray, }; export type NativeModuleGenericObjectTypeAnnotation = $ReadOnly<{ diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index 691229f68935..9be6999ce5df 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -16,7 +16,7 @@ import type { import type { NativeModuleAliasMap, NativeModuleEnumMap, - NativeModuleEnumMembers, + NativeModuleEnumMember, NativeModuleEnumMemberType, NativeModuleEventEmitterShape, NativeModuleFunctionTypeAnnotation, @@ -409,7 +409,7 @@ struct Bridging<${enumName}> { function generateEnum( hasteModuleName: string, origEnumName: string, - members: NativeModuleEnumMembers, + members: $ReadOnlyArray, memberType: NativeModuleEnumMemberType, ): string { const enumName = getEnumName(hasteModuleName, origEnumName); diff --git a/packages/react-native-codegen/src/parsers/flow/parser.js b/packages/react-native-codegen/src/parsers/flow/parser.js index 3a435e47ba4b..1afcbed0d8a3 100644 --- a/packages/react-native-codegen/src/parsers/flow/parser.js +++ b/packages/react-native-codegen/src/parsers/flow/parser.js @@ -15,7 +15,7 @@ import type { NamedShape, NativeModuleAliasMap, NativeModuleEnumMap, - NativeModuleEnumMembers, + NativeModuleEnumMember, NativeModuleEnumMemberType, NativeModuleParamTypeAnnotation, Nullable, @@ -227,7 +227,9 @@ class FlowParser implements Parser { }); } - parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers { + parseEnumMembers( + typeAnnotation: $FlowFixMe, + ): $ReadOnlyArray { return typeAnnotation.members.map(member => ({ name: member.id.name, value: member.init?.value ?? member.id.name, diff --git a/packages/react-native-codegen/src/parsers/parser.js b/packages/react-native-codegen/src/parsers/parser.js index bfb160bc77f4..3e0b74ec6fda 100644 --- a/packages/react-native-codegen/src/parsers/parser.js +++ b/packages/react-native-codegen/src/parsers/parser.js @@ -15,7 +15,7 @@ import type { NamedShape, NativeModuleAliasMap, NativeModuleEnumMap, - NativeModuleEnumMembers, + NativeModuleEnumMember, NativeModuleEnumMemberType, NativeModuleParamTypeAnnotation, Nullable, @@ -240,7 +240,9 @@ export interface Parser { /** * Calculates enum's members */ - parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers; + parseEnumMembers( + typeAnnotation: $FlowFixMe, + ): $ReadOnlyArray; /** * Given a node, it returns true if it is a module interface diff --git a/packages/react-native-codegen/src/parsers/parserMock.js b/packages/react-native-codegen/src/parsers/parserMock.js index 1045acfea122..78a2a062f832 100644 --- a/packages/react-native-codegen/src/parsers/parserMock.js +++ b/packages/react-native-codegen/src/parsers/parserMock.js @@ -15,7 +15,7 @@ import type { NamedShape, NativeModuleAliasMap, NativeModuleEnumMap, - NativeModuleEnumMembers, + NativeModuleEnumMember, NativeModuleEnumMemberType, NativeModuleParamTypeAnnotation, Nullable, @@ -168,7 +168,9 @@ export class MockedParser implements Parser { return; } - parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers { + parseEnumMembers( + typeAnnotation: $FlowFixMe, + ): $ReadOnlyArray { return typeAnnotation.type === 'StringTypeAnnotation' ? [ { diff --git a/packages/react-native-codegen/src/parsers/typescript/parser.js b/packages/react-native-codegen/src/parsers/typescript/parser.js index 592929dbd434..5f97658f3c65 100644 --- a/packages/react-native-codegen/src/parsers/typescript/parser.js +++ b/packages/react-native-codegen/src/parsers/typescript/parser.js @@ -15,7 +15,7 @@ import type { NamedShape, NativeModuleAliasMap, NativeModuleEnumMap, - NativeModuleEnumMembers, + NativeModuleEnumMember, NativeModuleEnumMemberType, NativeModuleParamTypeAnnotation, Nullable, @@ -223,7 +223,9 @@ class TypeScriptParser implements Parser { }); } - parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers { + parseEnumMembers( + typeAnnotation: $FlowFixMe, + ): $ReadOnlyArray { return typeAnnotation.members.map(member => ({ name: member.id.name, value: member.initializer?.value ?? member.id.name,