diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java index 618f02017579ce..89e528d707de64 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java @@ -7,8 +7,8 @@ package com.facebook.react.bridge; -import androidx.annotation.NonNull; import com.facebook.proguard.annotations.DoNotStrip; +import javax.annotation.Nonnull; /** * A native module whose API can be provided to JS catalyst instances. {@link NativeModule}s whose @@ -29,7 +29,7 @@ interface NativeMethod { * @return the name of this module. This will be the name used to {@code require()} this module * from javascript. */ - @NonNull + @Nonnull String getName(); /** diff --git a/packages/react-native-codegen/DEFS.bzl b/packages/react-native-codegen/DEFS.bzl index 48201e82d063aa..7c405abb8e9290 100644 --- a/packages/react-native-codegen/DEFS.bzl +++ b/packages/react-native-codegen/DEFS.bzl @@ -167,6 +167,7 @@ def rn_codegen_modules( autoglob = False, labels = library_labels + ["codegen_rule"], language = "JAVA", + required_for_source_only_abi = True, visibility = ["PUBLIC"], deps = [ react_native_dep("third-party/java/jsr-305:jsr-305"), diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index fc96c5a372efd4..e41b60cf68d03e 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -220,7 +220,7 @@ export type NativeModuleSchema = $ReadOnly<{ type: 'NativeModule', aliases: NativeModuleAliasMap, spec: NativeModuleSpec, - moduleNames: $ReadOnlyArray, + moduleName: string, // Use for modules that are not used on other platforms. // TODO: It's clearer to define `restrictedToPlatforms` instead, but // `excludedPlatforms` is used here to be consistent with ComponentSchema. diff --git a/packages/react-native-codegen/src/generators/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/generators/__test_fixtures__/fixtures.js index b8659768393350..8a6963d001a6f3 100644 --- a/packages/react-native-codegen/src/generators/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/generators/__test_fixtures__/fixtures.js @@ -72,7 +72,7 @@ const SCHEMA_WITH_TM_AND_FC: SchemaType = { }, ], }, - moduleNames: ['Calculator'], + moduleName: 'Calculator', }, }, }; diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js index 159c05f1300689..ec42fa6ecacd7c 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleCpp.js @@ -240,7 +240,7 @@ module.exports = { const { aliases, spec: {properties}, - moduleNames, + moduleName, } = nativeModule; const resolveAlias = createAliasResolver(aliases); const hostFunctions = properties.map(property => @@ -254,8 +254,7 @@ module.exports = { return ModuleTemplate({ hasteModuleName, hostFunctions, - // TODO: What happens when there are more than one NativeModule requires? - moduleName: moduleNames[0], + moduleName, methods: properties.map( ({name: propertyName, typeAnnotation: nullableTypeAnnotation}) => { const [{params}] = unwrapNullable(nullableTypeAnnotation); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js index 7076ab94131171..05f22491f96d13 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleH.js @@ -324,7 +324,7 @@ module.exports = { const { aliases, spec: {properties}, - moduleNames: [moduleName], + moduleName, } = nativeModules[hasteModuleName]; const resolveAlias = createAliasResolver(aliases); const structs = createStructs(moduleName, aliases, resolveAlias); diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js index bb1ee1311ae2af..7be905514a699b 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJavaSpec.js @@ -30,11 +30,12 @@ function FileTemplate( config: $ReadOnly<{ packageName: string, className: string, + jsName: string, methods: string, imports: string, }>, ): string { - const {packageName, className, methods, imports} = config; + const {packageName, className, jsName, methods, imports} = config; return ` /** * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). @@ -52,10 +53,17 @@ package ${packageName}; ${imports} public abstract class ${className} extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = "${jsName}"; + public ${className}(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + ${methods} } `; @@ -441,6 +449,7 @@ module.exports = { const { aliases, excludedPlatforms, + moduleName, spec: {properties}, } = nativeModules[hasteModuleName]; if (excludedPlatforms != null && excludedPlatforms.includes('android')) { @@ -457,6 +466,7 @@ module.exports = { 'com.facebook.react.bridge.ReactModuleWithSpec', 'com.facebook.react.turbomodule.core.interfaces.TurboModule', 'com.facebook.proguard.annotations.DoNotStrip', + 'javax.annotation.Nonnull', ]); const methods = properties.map(method => { @@ -528,6 +538,7 @@ module.exports = { FileTemplate({ packageName: normalizedPackageName, className, + jsName: moduleName, methods: methods.filter(Boolean).join('\n\n'), imports: Array.from(imports) .sort() diff --git a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js index 490d6cd630eba2..fb62617998dd36 100644 --- a/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js +++ b/packages/react-native-codegen/src/generators/modules/GenerateModuleJniCpp.js @@ -91,12 +91,10 @@ const FileTemplate = ({ libraryName: string, include: string, modules: string, - moduleLookups: $ReadOnlyArray< - $ReadOnly<{ - hasteModuleName: string, - moduleName: string, - }>, - >, + moduleLookups: $ReadOnlyArray<{ + hasteModuleName: string, + moduleName: string, + }>, }>) => { return ` /** @@ -487,8 +485,10 @@ module.exports = { }) .join('\n'); - // $FlowFixMe[missing-type-arg] - const moduleLookups = Object.keys(nativeModules) + const moduleLookups: $ReadOnlyArray<{ + hasteModuleName: string, + moduleName: string, + }> = Object.keys(nativeModules) .filter(hasteModuleName => { const module = nativeModules[hasteModuleName]; return !( @@ -497,10 +497,8 @@ module.exports = { ); }) .sort((a, b) => { - const moduleA = nativeModules[a]; - const moduleB = nativeModules[b]; - const nameA = moduleA.moduleNames[0]; - const nameB = moduleB.moduleNames[0]; + const nameA = nativeModules[a].moduleName; + const nameB = nativeModules[b].moduleName; if (nameA < nameB) { return -1; } else if (nameA > nameB) { @@ -508,15 +506,10 @@ module.exports = { } return 0; }) - .flatMap<{moduleName: string, hasteModuleName: string}>( - (hasteModuleName: string) => { - const {moduleNames} = nativeModules[hasteModuleName]; - return moduleNames.map(moduleName => ({ - moduleName, - hasteModuleName, - })); - }, - ); + .map((hasteModuleName: string) => ({ + moduleName: nativeModules[hasteModuleName].moduleName, + hasteModuleName, + })); const fileName = `${libraryName}-generated.cpp`; const replacedTemplate = FileTemplate({ diff --git a/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js b/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js index b2b7e0cdfa9ae5..a0cd29d601e309 100644 --- a/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js +++ b/packages/react-native-codegen/src/generators/modules/__test_fixtures__/fixtures.js @@ -20,7 +20,7 @@ const EMPTY_NATIVE_MODULES: SchemaType = { spec: { properties: [], }, - moduleNames: ['SampleTurboModule'], + moduleName: 'SampleTurboModule', }, }, }; @@ -332,7 +332,7 @@ const SIMPLE_NATIVE_MODULES: SchemaType = { }, ], }, - moduleNames: ['SampleTurboModule'], + moduleName: 'SampleTurboModule', }, }, }; @@ -357,7 +357,7 @@ const TWO_MODULES_DIFFERENT_FILES: SchemaType = { }, ], }, - moduleNames: ['SampleTurboModule'], + moduleName: 'SampleTurboModule', }, NativeSampleTurboModule2: { type: 'NativeModule', @@ -389,7 +389,7 @@ const TWO_MODULES_DIFFERENT_FILES: SchemaType = { }, ], }, - moduleNames: ['SampleTurboModule2'], + moduleName: 'SampleTurboModule2', }, }, }; @@ -755,7 +755,7 @@ const COMPLEX_OBJECTS: SchemaType = { }, ], }, - moduleNames: ['SampleTurboModule'], + moduleName: 'SampleTurboModule', }, }, }; @@ -890,7 +890,7 @@ const NATIVE_MODULES_WITH_TYPE_ALIASES: SchemaType = { }, ], }, - moduleNames: ['AliasTurboModule'], + moduleName: 'AliasTurboModule', }, }, }; @@ -1222,7 +1222,7 @@ const REAL_MODULE_EXAMPLE: SchemaType = { }, ], }, - moduleNames: ['CameraRollManager'], + moduleName: 'CameraRollManager', }, NativeExceptionsManager: { type: 'NativeModule', @@ -1485,7 +1485,7 @@ const REAL_MODULE_EXAMPLE: SchemaType = { }, ], }, - moduleNames: ['ExceptionsManager'], + moduleName: 'ExceptionsManager', }, }, }; @@ -1638,7 +1638,7 @@ const CXX_ONLY_NATIVE_MODULES: SchemaType = { }, ], }, - moduleNames: ['SampleTurboModuleCxx'], + moduleName: 'SampleTurboModuleCxx', excludedPlatforms: ['iOS', 'android'], }, }, @@ -1652,7 +1652,7 @@ const SAMPLE_WITH_UPPERCASE_NAME: SchemaType = { spec: { properties: [], }, - moduleNames: ['SampleTurboModule'], + moduleName: 'SampleTurboModule', }, }, }; diff --git a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap index 159c207e5d0814..93ec0208c32cf5 100644 --- a/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap +++ b/packages/react-native-codegen/src/generators/modules/__tests__/__snapshots__/GenerateModuleJavaSpec-test.js.snap @@ -22,12 +22,20 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactModuleWithSpec; import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"SampleTurboModule\\"; + public NativeSampleTurboModuleSpec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + } ", @@ -61,13 +69,21 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; import javax.annotation.Nullable; public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"SampleTurboModule\\"; + public NativeSampleTurboModuleSpec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + @ReactMethod(isBlockingSynchronousMethod = true) @DoNotStrip public abstract WritableMap difficult(ReadableMap A); @@ -124,12 +140,20 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactModuleWithSpec; import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"SampleTurboModule\\"; + public NativeSampleTurboModuleSpec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + } ", @@ -159,12 +183,20 @@ import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactModuleWithSpec; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; public abstract class AliasTurboModuleSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"AliasTurboModule\\"; + public AliasTurboModuleSpec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + @ReactMethod @DoNotStrip public abstract void cropImage(ReadableMap cropData); @@ -198,12 +230,20 @@ import com.facebook.react.bridge.ReactModuleWithSpec; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; public abstract class NativeCameraRollManagerSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"CameraRollManager\\"; + public NativeCameraRollManagerSpec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + @ReactMethod @DoNotStrip public abstract void getPhotos(ReadableMap params, Promise promise); @@ -239,12 +279,20 @@ import com.facebook.react.bridge.ReactModuleWithSpec; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; public abstract class NativeExceptionsManagerSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"ExceptionsManager\\"; + public NativeExceptionsManagerSpec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + @ReactMethod @DoNotStrip public abstract void reportFatalException(String message, ReadableArray stack, double exceptionId); @@ -302,13 +350,21 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; +import javax.annotation.Nonnull; import javax.annotation.Nullable; public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"SampleTurboModule\\"; + public NativeSampleTurboModuleSpec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + protected abstract Map getTypedExportedConstants(); @Override @@ -411,12 +467,20 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactModuleWithSpec; import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; public abstract class NativeSampleTurboModuleSpec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"SampleTurboModule\\"; + public NativeSampleTurboModuleSpec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + @ReactMethod @DoNotStrip public abstract void voidFunc(); @@ -442,12 +506,20 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactModuleWithSpec; import com.facebook.react.turbomodule.core.interfaces.TurboModule; +import javax.annotation.Nonnull; public abstract class NativeSampleTurboModule2Spec extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule { + public static final String NAME = \\"SampleTurboModule2\\"; + public NativeSampleTurboModule2Spec(ReactApplicationContext reactContext) { super(reactContext); } + @Override + public @Nonnull String getName() { + return NAME; + } + @ReactMethod @DoNotStrip public abstract void voidFunc(); diff --git a/packages/react-native-codegen/src/parsers/__tests__/utils-test.js b/packages/react-native-codegen/src/parsers/__tests__/utils-test.js index ee276a291bbc35..15e60040324545 100644 --- a/packages/react-native-codegen/src/parsers/__tests__/utils-test.js +++ b/packages/react-native-codegen/src/parsers/__tests__/utils-test.js @@ -126,64 +126,67 @@ describe('createParserErrorCapturer', () => { describe('verifyPlatforms', () => { it('exclude android given an iOS only module', () => { - let result = verifyPlatforms('NativeSampleTurboModule', [ + let result = verifyPlatforms( + 'NativeSampleTurboModule', 'SampleTurboModuleIOS', - ]); + ); expect(result.cxxOnly).toBe(false); expect(result.excludedPlatforms).toEqual(['android']); - result = verifyPlatforms('NativeSampleTurboModuleIOS', [ - 'SampleTurboModule', - ]); + result = verifyPlatforms('NativeSampleTurboModuleIOS', 'SampleTurboModule'); expect(result.cxxOnly).toBe(false); expect(result.excludedPlatforms).toEqual(['android']); - result = verifyPlatforms('NativeSampleTurboModuleIOS', [ + result = verifyPlatforms( + 'NativeSampleTurboModuleIOS', 'SampleTurboModuleIOS', - ]); + ); expect(result.cxxOnly).toBe(false); expect(result.excludedPlatforms).toEqual(['android']); }); it('exclude iOS given an android only module', () => { - let result = verifyPlatforms('NativeSampleTurboModule', [ + let result = verifyPlatforms( + 'NativeSampleTurboModule', 'SampleTurboModuleAndroid', - ]); + ); expect(result.cxxOnly).toBe(false); expect(result.excludedPlatforms).toEqual(['iOS']); - result = verifyPlatforms('NativeSampleTurboModuleAndroid', [ + result = verifyPlatforms( + 'NativeSampleTurboModuleAndroid', 'SampleTurboModule', - ]); + ); expect(result.cxxOnly).toBe(false); expect(result.excludedPlatforms).toEqual(['iOS']); - result = verifyPlatforms('NativeSampleTurboModuleAndroid', [ + result = verifyPlatforms( + 'NativeSampleTurboModuleAndroid', 'SampleTurboModuleAndroid', - ]); + ); expect(result.cxxOnly).toBe(false); expect(result.excludedPlatforms).toEqual(['iOS']); }); it('exclude iOS and android given a Cxx only module', () => { - let result = verifyPlatforms('NativeSampleTurboModule', [ + let result = verifyPlatforms( + 'NativeSampleTurboModule', 'SampleTurboModuleCxx', - ]); + ); expect(result.cxxOnly).toBe(true); expect(result.excludedPlatforms).toEqual(['iOS', 'android']); - result = verifyPlatforms('NativeSampleTurboModuleCxx', [ - 'SampleTurboModule', - ]); + result = verifyPlatforms('NativeSampleTurboModuleCxx', 'SampleTurboModule'); expect(result.cxxOnly).toBe(true); expect(result.excludedPlatforms).toEqual(['iOS', 'android']); - result = verifyPlatforms('NativeSampleTurboModuleCxx', [ + result = verifyPlatforms( + 'NativeSampleTurboModuleCxx', 'SampleTurboModuleCxx', - ]); + ); expect(result.cxxOnly).toBe(true); expect(result.excludedPlatforms).toEqual(['iOS', 'android']); }); @@ -320,7 +323,7 @@ describe('buildSchemaFromConfigType', () => { type: 'NativeModule', aliases: {}, spec: {properties: []}, - moduleNames: [], + moduleName: '', }; const wrapComponentSchemaMock = jest.fn(); diff --git a/packages/react-native-codegen/src/parsers/error-utils.js b/packages/react-native-codegen/src/parsers/error-utils.js index d835d05773e75f..663d0f3cd90f5f 100644 --- a/packages/react-native-codegen/src/parsers/error-utils.js +++ b/packages/react-native-codegen/src/parsers/error-utils.js @@ -28,7 +28,7 @@ const { MoreThanOneModuleInterfaceParserError, UnsupportedFunctionParamTypeAnnotationParserError, UnsupportedArrayElementTypeAnnotationParserError, -} = require('./errors.js'); +} = require('./errors'); function throwIfModuleInterfaceIsMisnamed( nativeModuleName: string, @@ -153,7 +153,7 @@ function throwIfUntypedModule( hasteModuleName: string, callExpression: $FlowFixMe, methodName: string, - $moduleName: string, + moduleName: string, language: ParserType, ) { if (typeArguments == null) { @@ -161,7 +161,7 @@ function throwIfUntypedModule( hasteModuleName, callExpression, methodName, - $moduleName, + moduleName, language, ); } 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 c8c143c5cfdaf6..6c0f6c6f4aa6d0 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 @@ -25,9 +25,7 @@ exports[`RN Codegen Flow Parser can generate fixture ANDROID_ONLY_NATIVE_MODULE 'spec': { 'properties': [] }, - 'moduleNames': [ - 'SampleTurboModuleAndroid' - ], + 'moduleName': 'SampleTurboModuleAndroid', 'excludedPlatforms': [ 'iOS' ] @@ -243,9 +241,7 @@ exports[`RN Codegen Flow Parser can generate fixture CXX_ONLY_NATIVE_MODULE 1`] } ] }, - 'moduleNames': [ - 'SampleTurboModuleCxx' - ], + 'moduleName': 'SampleTurboModuleCxx', 'excludedPlatforms': [ 'iOS', 'android' @@ -264,9 +260,7 @@ exports[`RN Codegen Flow Parser can generate fixture EMPTY_NATIVE_MODULE 1`] = ` 'spec': { 'properties': [] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -326,9 +320,7 @@ exports[`RN Codegen Flow Parser can generate fixture IOS_ONLY_NATIVE_MODULE 1`] } ] }, - 'moduleNames': [ - 'SampleTurboModuleIOS' - ], + 'moduleName': 'SampleTurboModuleIOS', 'excludedPlatforms': [ 'android' ] @@ -528,9 +520,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_ALIASES } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -571,9 +561,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_ARRAY_WI } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -608,9 +596,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_ARRAY_WI } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -676,9 +662,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_BASIC_AR } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -770,9 +754,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_BASIC_PA } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -832,9 +814,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_CALLBACK } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -893,9 +873,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_COMPLEX_ } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1107,9 +1085,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_COMPLEX_ } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1213,9 +1189,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_COMPLEX_ } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1269,9 +1243,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_FLOAT_AN } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1362,9 +1334,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_NESTED_A } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1402,9 +1372,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_NULLABLE } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1493,9 +1461,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_OBJECT_W } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1567,9 +1533,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_PROMISE } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1606,9 +1570,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_ROOT_TAG } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1643,9 +1605,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_SIMPLE_O } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1706,9 +1666,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_UNION 1` } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1743,9 +1701,7 @@ exports[`RN Codegen Flow Parser can generate fixture NATIVE_MODULE_WITH_UNSAFE_O } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1908,9 +1864,7 @@ exports[`RN Codegen Flow Parser can generate fixture PROMISE_WITH_COMMONLY_USED_ } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" 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 8ccb82a50c832c..120d6fa8443fd1 100644 --- a/packages/react-native-codegen/src/parsers/flow/modules/index.js +++ b/packages/react-native-codegen/src/parsers/flow/modules/index.js @@ -18,11 +18,11 @@ import type { NativeModulePropertyShape, NativeModuleSchema, Nullable, -} from '../../../CodegenSchema.js'; +} from '../../../CodegenSchema'; import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils'; const {visit, isModuleRegistryCall, verifyPlatforms} = require('../../utils'); -const {resolveTypeAnnotation, getTypes} = require('../utils.js'); +const {resolveTypeAnnotation, getTypes} = require('../utils'); const { unwrapNullable, wrapNullable, @@ -54,7 +54,7 @@ const { const { UnsupportedTypeAnnotationParserError, IncorrectModuleRegistryCallArgumentTypeParserError, -} = require('../../errors.js'); +} = require('../../errors'); const { throwIfModuleInterfaceNotFound, @@ -67,7 +67,7 @@ const { throwIfMoreThanOneModuleInterfaceParserError, } = require('../../error-utils'); -const {FlowParser} = require('../parser.js'); +const {FlowParser} = require('../parser'); const language = 'Flow'; const parser = new FlowParser(); @@ -290,8 +290,8 @@ function buildModuleSchema( throwIfModuleInterfaceIsMisnamed(hasteModuleName, moduleSpec.id, language); - // Parse Module Names - const moduleName = tryParse((): string => { + // Parse Module Name + const moduleName = ((): string => { const callExpressions = []; visit(ast, { CallExpression(node) { @@ -358,9 +358,7 @@ function buildModuleSchema( ); return $moduleName; - }); - - const moduleNames: Array = moduleName == null ? [] : [moduleName]; + })(); // Some module names use platform suffix to indicate platform-exclusive modules. // Eventually this should be made explicit in the Flow type itself. @@ -368,7 +366,7 @@ function buildModuleSchema( // Note: this shape is consistent with ComponentSchema. const {cxxOnly, excludedPlatforms} = verifyPlatforms( hasteModuleName, - moduleNames, + moduleName, ); // $FlowFixMe[missing-type-arg] @@ -379,7 +377,6 @@ function buildModuleSchema( propertyShape: NativeModulePropertyShape, }>(property => { const aliasMap: {...NativeModuleAliasMap} = {}; - return tryParse(() => ({ aliasMap: aliasMap, propertyShape: buildPropertySchema( @@ -397,22 +394,20 @@ function buildModuleSchema( }) .filter(Boolean) .reduce( - (moduleSchema: NativeModuleSchema, {aliasMap, propertyShape}) => { - return { - type: 'NativeModule', - aliases: {...moduleSchema.aliases, ...aliasMap}, - spec: { - properties: [...moduleSchema.spec.properties, propertyShape], - }, - moduleNames: moduleSchema.moduleNames, - excludedPlatforms: moduleSchema.excludedPlatforms, - }; - }, + (moduleSchema: NativeModuleSchema, {aliasMap, propertyShape}) => ({ + type: 'NativeModule', + aliases: {...moduleSchema.aliases, ...aliasMap}, + spec: { + properties: [...moduleSchema.spec.properties, propertyShape], + }, + moduleName: moduleSchema.moduleName, + excludedPlatforms: moduleSchema.excludedPlatforms, + }), { type: 'NativeModule', aliases: {}, spec: {properties: []}, - moduleNames: moduleNames, + moduleName, excludedPlatforms: excludedPlatforms.length !== 0 ? [...excludedPlatforms] : undefined, }, 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 d49327021ef2e1..3e337fdf909704 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 @@ -23,9 +23,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture ANDROID_ONLY_NATIVE_M 'spec': { 'properties': [] }, - 'moduleNames': [ - 'SampleTurboModuleAndroid' - ], + 'moduleName': 'SampleTurboModuleAndroid', 'excludedPlatforms': [ 'iOS' ] @@ -241,9 +239,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture CXX_ONLY_NATIVE_MODUL } ] }, - 'moduleNames': [ - 'SampleTurboModuleCxx' - ], + 'moduleName': 'SampleTurboModuleCxx', 'excludedPlatforms': [ 'iOS', 'android' @@ -262,9 +258,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture EMPTY_NATIVE_MODULE 1 'spec': { 'properties': [] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -324,9 +318,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture IOS_ONLY_NATIVE_MODUL } ] }, - 'moduleNames': [ - 'SampleTurboModuleIOS' - ], + 'moduleName': 'SampleTurboModuleIOS', 'excludedPlatforms': [ 'android' ] @@ -526,9 +518,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_AL } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -569,9 +559,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_AR } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -606,9 +594,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_AR } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -649,9 +635,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_AR } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -686,9 +670,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_AR } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -754,9 +736,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_BA } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -822,9 +802,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_BA } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -916,9 +894,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_BA } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -978,9 +954,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_CA } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1039,9 +1013,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_CO } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1100,9 +1072,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_CO } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1314,9 +1284,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_CO } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1420,9 +1388,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_CO } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1476,9 +1442,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_FL } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1569,9 +1533,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_NE } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1609,9 +1571,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_NU } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1700,9 +1660,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_OB } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1774,9 +1732,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_PR } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1813,9 +1769,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_RO } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1850,9 +1804,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_SI } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1913,9 +1865,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_UN } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" @@ -1950,9 +1900,7 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_UN } ] }, - 'moduleNames': [ - 'SampleTurboModule' - ] + 'moduleName': 'SampleTurboModule' } } }" 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 16f249b1b7ccd2..5991c7c8e3b369 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -18,12 +18,12 @@ import type { NativeModuleTypeAnnotation, NativeModuleSchema, Nullable, -} from '../../../CodegenSchema.js'; +} from '../../../CodegenSchema'; import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils'; const {visit, isModuleRegistryCall, verifyPlatforms} = require('../../utils'); -const {resolveTypeAnnotation, getTypes} = require('../utils.js'); +const {resolveTypeAnnotation, getTypes} = require('../utils'); const { parseObjectProperty, @@ -55,7 +55,7 @@ const { UnsupportedGenericParserError, UnsupportedTypeAnnotationParserError, IncorrectModuleRegistryCallArgumentTypeParserError, -} = require('../../errors.js'); +} = require('../../errors'); const { throwIfUntypedModule, @@ -298,8 +298,8 @@ function buildModuleSchema( throwIfModuleInterfaceIsMisnamed(hasteModuleName, moduleSpec.id, language); - // Parse Module Names - const moduleName = tryParse((): string => { + // Parse Module Name + const moduleName = ((): string => { const callExpressions = []; visit(ast, { CallExpression(node) { @@ -366,9 +366,7 @@ function buildModuleSchema( ); return $moduleName; - }); - - const moduleNames: Array = moduleName == null ? [] : [moduleName]; + })(); // Some module names use platform suffix to indicate platform-exclusive modules. // Eventually this should be made explicit in the Flow type itself. @@ -376,7 +374,7 @@ function buildModuleSchema( // Note: this shape is consistent with ComponentSchema. const {cxxOnly, excludedPlatforms} = verifyPlatforms( hasteModuleName, - moduleNames, + moduleName, ); // $FlowFixMe[missing-type-arg] @@ -416,7 +414,7 @@ function buildModuleSchema( spec: { properties: [...moduleSchema.spec.properties, propertyShape], }, - moduleNames: moduleSchema.moduleNames, + moduleName: moduleSchema.moduleName, excludedPlatforms: moduleSchema.excludedPlatforms, }; }, @@ -424,7 +422,7 @@ function buildModuleSchema( type: 'NativeModule', aliases: {}, spec: {properties: []}, - moduleNames: moduleNames, + moduleName: moduleName, excludedPlatforms: excludedPlatforms.length !== 0 ? [...excludedPlatforms] : undefined, }, diff --git a/packages/react-native-codegen/src/parsers/utils.js b/packages/react-native-codegen/src/parsers/utils.js index ede91c81c2d729..2d7ca6fae8c760 100644 --- a/packages/react-native-codegen/src/parsers/utils.js +++ b/packages/react-native-codegen/src/parsers/utils.js @@ -61,14 +61,14 @@ function createParserErrorCapturer(): [ function verifyPlatforms( hasteModuleName: string, - moduleNames: string[], + moduleName: string, ): $ReadOnly<{ cxxOnly: boolean, excludedPlatforms: Array<'iOS' | 'android'>, }> { let cxxOnly = false; const excludedPlatforms = new Set<'iOS' | 'android'>(); - const namesToValidate = [...moduleNames, hasteModuleName]; + const namesToValidate = [moduleName, hasteModuleName]; namesToValidate.forEach(name => { if (name.endsWith('Android')) {