From 90538909f988a8be9475cf12471269b70dbc179e Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Wed, 7 Dec 2022 06:35:01 -0800 Subject: [PATCH] Emit name constant as part of Java codegen Summary: We have the expected module name available as part of the codegen schema, so we can remove the need for developers to implement the `getName` method as part of their module implementation. Note that this method is not actually used when the TurboModules infra is used, as the moduleName from the turbo module manager is passed through to the TurboModule base class instead. Moving the method to codegen will make it easier to remove this method altogether once the old architecture is fully removed. Changelog: [Android][Added] Support generating `getName` in react-native-codegen for Java TurboModules Reviewed By: mdvacca Differential Revision: D41615387 fbshipit-source-id: 6b117645fa39e5e9ab014b21198496a52f6f2ae2 --- .../facebook/react/bridge/NativeModule.java | 4 +- packages/react-native-codegen/DEFS.bzl | 1 + .../react-native-codegen/src/CodegenSchema.js | 2 +- .../generators/__test_fixtures__/fixtures.js | 2 +- .../generators/modules/GenerateModuleCpp.js | 5 +- .../src/generators/modules/GenerateModuleH.js | 2 +- .../modules/GenerateModuleJavaSpec.js | 13 ++- .../modules/GenerateModuleJniCpp.js | 35 +++--- .../modules/__test_fixtures__/fixtures.js | 20 ++-- .../GenerateModuleJavaSpec-test.js.snap | 72 ++++++++++++ .../src/parsers/__tests__/utils-test.js | 45 ++++---- .../src/parsers/error-utils.js | 6 +- .../module-parser-snapshot-test.js.snap | 92 ++++------------ .../src/parsers/flow/modules/index.js | 41 +++---- ...script-module-parser-snapshot-test.js.snap | 104 +++++------------- .../src/parsers/typescript/modules/index.js | 20 ++-- .../react-native-codegen/src/parsers/utils.js | 4 +- 17 files changed, 221 insertions(+), 247 deletions(-) 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')) {