diff --git a/BUCK b/BUCK index c33ea5e8e6264f..f5983c1fc6b2a8 100644 --- a/BUCK +++ b/BUCK @@ -742,6 +742,7 @@ rn_library( "//xplat/js:node_modules__base64_19js", "//xplat/js:node_modules__deprecated_19react_19native_19prop_19types", "//xplat/js:node_modules__event_19target_19shim", + "//xplat/js:node_modules__flow_19enums_19runtime", "//xplat/js:node_modules__invariant", "//xplat/js:node_modules__memoize_19one", "//xplat/js:node_modules__nullthrows", diff --git a/Libraries/TurboModule/samples/NativeSampleTurboModule.js b/Libraries/TurboModule/samples/NativeSampleTurboModule.js index 813f2cbf5c367f..89d16f03625f43 100644 --- a/Libraries/TurboModule/samples/NativeSampleTurboModule.js +++ b/Libraries/TurboModule/samples/NativeSampleTurboModule.js @@ -13,6 +13,11 @@ import type {RootTag, TurboModule} from '../RCTExport'; import * as TurboModuleRegistry from '../TurboModuleRegistry'; +export enum EnumInt { + A = 23, + B = 42, +} + export interface Spec extends TurboModule { // Exported methods. +getConstants: () => {| @@ -22,6 +27,7 @@ export interface Spec extends TurboModule { |}; +voidFunc: () => void; +getBool: (arg: boolean) => boolean; + +getEnum?: (arg: EnumInt) => EnumInt; +getNumber: (arg: number) => number; +getString: (arg: string) => string; +getArray: (arg: Array) => Array; diff --git a/ReactCommon/react/nativemodule/samples/ReactCommon/NativeSampleTurboCxxModuleSpecJSI.cpp b/ReactCommon/react/nativemodule/samples/ReactCommon/NativeSampleTurboCxxModuleSpecJSI.cpp index d45de55ac6a8a6..4a40f935c880dd 100644 --- a/ReactCommon/react/nativemodule/samples/ReactCommon/NativeSampleTurboCxxModuleSpecJSI.cpp +++ b/ReactCommon/react/nativemodule/samples/ReactCommon/NativeSampleTurboCxxModuleSpecJSI.cpp @@ -31,6 +31,16 @@ static jsi::Value __hostFunction_NativeSampleTurboCxxModuleSpecJSI_getBool( ->getBool(rt, args[0].getBool())); } +static jsi::Value __hostFunction_NativeSampleTurboCxxModuleSpecJSI_getEnum( + jsi::Runtime &rt, + TurboModule &turboModule, + const jsi::Value *args, + size_t count) { + return jsi::Value( + static_cast(&turboModule) + ->getEnum(rt, args[0].getNumber())); +} + static jsi::Value __hostFunction_NativeSampleTurboCxxModuleSpecJSI_getNumber( jsi::Runtime &rt, TurboModule &turboModule, @@ -119,6 +129,8 @@ NativeSampleTurboCxxModuleSpecJSI::NativeSampleTurboCxxModuleSpecJSI( 0, __hostFunction_NativeSampleTurboCxxModuleSpecJSI_voidFunc}; methodMap_["getBool"] = MethodMetadata{ 1, __hostFunction_NativeSampleTurboCxxModuleSpecJSI_getBool}; + methodMap_["getEnum"] = MethodMetadata{ + 1, __hostFunction_NativeSampleTurboCxxModuleSpecJSI_getEnum}; methodMap_["getNumber"] = MethodMetadata{ 1, __hostFunction_NativeSampleTurboCxxModuleSpecJSI_getNumber}; methodMap_["getString"] = MethodMetadata{ diff --git a/ReactCommon/react/nativemodule/samples/ReactCommon/NativeSampleTurboCxxModuleSpecJSI.h b/ReactCommon/react/nativemodule/samples/ReactCommon/NativeSampleTurboCxxModuleSpecJSI.h index 400ee7e3d692a8..2b4b342586c975 100644 --- a/ReactCommon/react/nativemodule/samples/ReactCommon/NativeSampleTurboCxxModuleSpecJSI.h +++ b/ReactCommon/react/nativemodule/samples/ReactCommon/NativeSampleTurboCxxModuleSpecJSI.h @@ -23,6 +23,7 @@ class JSI_EXPORT NativeSampleTurboCxxModuleSpecJSI : public TurboModule { public: virtual void voidFunc(jsi::Runtime &rt) = 0; virtual bool getBool(jsi::Runtime &rt, bool arg) = 0; + virtual double getEnum(jsi::Runtime &rt, double arg) = 0; virtual double getNumber(jsi::Runtime &rt, double arg) = 0; virtual jsi::String getString(jsi::Runtime &rt, const jsi::String &arg) = 0; virtual jsi::Array getArray(jsi::Runtime &rt, const jsi::Array &arg) = 0; diff --git a/ReactCommon/react/nativemodule/samples/ReactCommon/SampleTurboCxxModule.cpp b/ReactCommon/react/nativemodule/samples/ReactCommon/SampleTurboCxxModule.cpp index a3d04f9438dfb6..9b3fff0c6850b1 100644 --- a/ReactCommon/react/nativemodule/samples/ReactCommon/SampleTurboCxxModule.cpp +++ b/ReactCommon/react/nativemodule/samples/ReactCommon/SampleTurboCxxModule.cpp @@ -26,6 +26,10 @@ bool SampleTurboCxxModule::getBool(jsi::Runtime &rt, bool arg) { return arg; } +double SampleTurboCxxModule::getEnum(jsi::Runtime &rt, double arg) { + return arg; +} + double SampleTurboCxxModule::getNumber(jsi::Runtime &rt, double arg) { return arg; } diff --git a/ReactCommon/react/nativemodule/samples/ReactCommon/SampleTurboCxxModule.h b/ReactCommon/react/nativemodule/samples/ReactCommon/SampleTurboCxxModule.h index 5c41f71ae4f9e6..8d397ae5a641eb 100644 --- a/ReactCommon/react/nativemodule/samples/ReactCommon/SampleTurboCxxModule.h +++ b/ReactCommon/react/nativemodule/samples/ReactCommon/SampleTurboCxxModule.h @@ -25,6 +25,7 @@ class SampleTurboCxxModule : public NativeSampleTurboCxxModuleSpecJSI { void voidFunc(jsi::Runtime &rt) override; bool getBool(jsi::Runtime &rt, bool arg) override; + double getEnum(jsi::Runtime &rt, double arg) override; double getNumber(jsi::Runtime &rt, double arg) override; jsi::String getString(jsi::Runtime &rt, const jsi::String &arg) override; jsi::Array getArray(jsi::Runtime &rt, const jsi::Array &arg) override; diff --git a/ReactCommon/react/nativemodule/samples/platform/android/NativeSampleTurboModuleSpec.java b/ReactCommon/react/nativemodule/samples/platform/android/NativeSampleTurboModuleSpec.java index 1dd66decb687e9..d3e50a5a3d68bf 100644 --- a/ReactCommon/react/nativemodule/samples/platform/android/NativeSampleTurboModuleSpec.java +++ b/ReactCommon/react/nativemodule/samples/platform/android/NativeSampleTurboModuleSpec.java @@ -66,6 +66,9 @@ public NativeSampleTurboModuleSpec(ReactApplicationContext reactContext) { @ReactMethod(isBlockingSynchronousMethod = true) public abstract boolean getBool(boolean arg); + @ReactMethod(isBlockingSynchronousMethod = true) + public abstract double getEnum(double arg); + protected abstract Map getTypedExportedConstants(); @Override diff --git a/ReactCommon/react/nativemodule/samples/platform/android/ReactCommon/SampleTurboModuleSpec.cpp b/ReactCommon/react/nativemodule/samples/platform/android/ReactCommon/SampleTurboModuleSpec.cpp index d8001bfb178b9e..b0a9b0786feb8a 100644 --- a/ReactCommon/react/nativemodule/samples/platform/android/ReactCommon/SampleTurboModuleSpec.cpp +++ b/ReactCommon/react/nativemodule/samples/platform/android/ReactCommon/SampleTurboModuleSpec.cpp @@ -36,6 +36,18 @@ __hostFunction_NativeSampleTurboModuleSpecJSI_getBool( rt, BooleanKind, "getBool", "(Z)Z", args, count, cachedMethodId); } +static facebook::jsi::Value +__hostFunction_NativeSampleTurboModuleSpecJSI_getEnum( + facebook::jsi::Runtime &rt, + TurboModule &turboModule, + const facebook::jsi::Value *args, + size_t count) { + static jmethodID cachedMethodId = nullptr; + return static_cast(turboModule) + .invokeJavaMethod( + rt, NumberKind, "getEnum", "(D)D", args, count, cachedMethodId); +} + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getNumber( facebook::jsi::Runtime &rt, @@ -195,6 +207,9 @@ NativeSampleTurboModuleSpecJSI::NativeSampleTurboModuleSpecJSI( methodMap_["getBool"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getBool}; + methodMap_["getEnum"] = + MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getEnum}; + methodMap_["getNumber"] = MethodMetadata{ 1, __hostFunction_NativeSampleTurboModuleSpecJSI_getNumber}; diff --git a/ReactCommon/react/nativemodule/samples/platform/android/SampleTurboModule.java b/ReactCommon/react/nativemodule/samples/platform/android/SampleTurboModule.java index 84a0f6dd086981..73a1ac70c7f22c 100644 --- a/ReactCommon/react/nativemodule/samples/platform/android/SampleTurboModule.java +++ b/ReactCommon/react/nativemodule/samples/platform/android/SampleTurboModule.java @@ -48,6 +48,14 @@ public boolean getBool(boolean arg) { return arg; } + @DoNotStrip + @SuppressWarnings("unused") + @Override + public double getEnum(double arg) { + log("getEnum", arg, arg); + return arg; + } + @Override protected Map getTypedExportedConstants() { Map result = new HashMap<>(); diff --git a/ReactCommon/react/nativemodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.h b/ReactCommon/react/nativemodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.h index ab91dbeaf893e1..9f75fdc612efac 100644 --- a/ReactCommon/react/nativemodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.h +++ b/ReactCommon/react/nativemodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.h @@ -22,6 +22,7 @@ - (void)voidFunc; - (NSNumber *)getBool:(BOOL)arg; +- (NSNumber *)getEnum:(double)arg; - (NSNumber *)getNumber:(double)arg; - (NSString *)getString:(NSString *)arg; - (NSArray> *)getArray:(NSArray *)arg; diff --git a/ReactCommon/react/nativemodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.mm b/ReactCommon/react/nativemodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.mm index d3edbda6813242..79feb93cca7297 100644 --- a/ReactCommon/react/nativemodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.mm +++ b/ReactCommon/react/nativemodule/samples/platform/ios/RCTNativeSampleTurboModuleSpec.mm @@ -30,6 +30,16 @@ .invokeObjCMethod(rt, BooleanKind, "getBool", @selector(getBool:), args, count); } +static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getEnum( + facebook::jsi::Runtime &rt, + TurboModule &turboModule, + const facebook::jsi::Value *args, + size_t count) +{ + return static_cast(turboModule) + .invokeObjCMethod(rt, NumberKind, "getEnum", @selector(getEnum:), args, count); +} + static facebook::jsi::Value __hostFunction_NativeSampleTurboModuleSpecJSI_getNumber( facebook::jsi::Runtime &rt, TurboModule &turboModule, @@ -136,6 +146,7 @@ { methodMap_["voidFunc"] = MethodMetadata{0, __hostFunction_NativeSampleTurboModuleSpecJSI_voidFunc}; methodMap_["getBool"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getBool}; + methodMap_["getEnum"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getEnum}; methodMap_["getNumber"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getNumber}; methodMap_["getString"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getString}; methodMap_["getArray"] = MethodMetadata{1, __hostFunction_NativeSampleTurboModuleSpecJSI_getArray}; diff --git a/ReactCommon/react/nativemodule/samples/platform/ios/RCTSampleTurboModule.mm b/ReactCommon/react/nativemodule/samples/platform/ios/RCTSampleTurboModule.mm index 11e57479cf6dfa..c3176f386c32f3 100644 --- a/ReactCommon/react/nativemodule/samples/platform/ios/RCTSampleTurboModule.mm +++ b/ReactCommon/react/nativemodule/samples/platform/ios/RCTSampleTurboModule.mm @@ -74,6 +74,11 @@ - (NSDictionary *)constantsToExport return @(arg); } +RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getEnum : (double)arg) +{ + return @(arg); +} + RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSNumber *, getNumber : (double)arg) { return @(arg); diff --git a/ReactCommon/react/nativemodule/samples/platform/ios/SampleTurboCxxModuleLegacyImpl.cpp b/ReactCommon/react/nativemodule/samples/platform/ios/SampleTurboCxxModuleLegacyImpl.cpp index e46412e86b6137..5b90e17106dd0b 100644 --- a/ReactCommon/react/nativemodule/samples/platform/ios/SampleTurboCxxModuleLegacyImpl.cpp +++ b/ReactCommon/react/nativemodule/samples/platform/ios/SampleTurboCxxModuleLegacyImpl.cpp @@ -39,6 +39,12 @@ std::vector SampleTurboCxxModuleLegacyImpl::getMethods() { return getBool(xplat::jsArgAsBool(args, 0)); }, CxxModule::SyncTag), + CxxModule::Method( + "getEnum", + [this](folly::dynamic args) { + return getEnum(xplat::jsArgAsDouble(args, 0)); + }, + CxxModule::SyncTag), CxxModule::Method( "getNumber", [this](folly::dynamic args) { @@ -114,6 +120,10 @@ bool SampleTurboCxxModuleLegacyImpl::getBool(bool arg) { return arg; } +double SampleTurboCxxModuleLegacyImpl::getEnum(double arg) { + return arg; +} + double SampleTurboCxxModuleLegacyImpl::getNumber(double arg) { return arg; } diff --git a/ReactCommon/react/nativemodule/samples/platform/ios/SampleTurboCxxModuleLegacyImpl.h b/ReactCommon/react/nativemodule/samples/platform/ios/SampleTurboCxxModuleLegacyImpl.h index d09e688b2cdd4f..b360a02d24f3df 100644 --- a/ReactCommon/react/nativemodule/samples/platform/ios/SampleTurboCxxModuleLegacyImpl.h +++ b/ReactCommon/react/nativemodule/samples/platform/ios/SampleTurboCxxModuleLegacyImpl.h @@ -27,6 +27,7 @@ class SampleTurboCxxModuleLegacyImpl // API void voidFunc(); bool getBool(bool arg); + double getEnum(double arg); double getNumber(double arg); std::string getString(const std::string &arg); folly::dynamic getArray(const folly::dynamic &arg); diff --git a/packages/babel-plugin-codegen/__tests__/__snapshots__/index-test.js.snap b/packages/babel-plugin-codegen/__tests__/__snapshots__/index-test.js.snap index 68440b3f72baa6..21c066d61f42c1 100644 --- a/packages/babel-plugin-codegen/__tests__/__snapshots__/index-test.js.snap +++ b/packages/babel-plugin-codegen/__tests__/__snapshots__/index-test.js.snap @@ -2,14 +2,14 @@ exports[`Babel plugin inline view configs can inline config for FullNativeComponent.js 1`] = ` "// @flow - const codegenNativeCommands = require('codegenNativeCommands'); + const codegenNativeComponent = require('codegenNativeComponent'); + import type { Int32, BubblingEventHandler, DirectEventHandler, WithDefault } from 'CodegenFlowtypes'; import type { NativeComponentType } from 'codegenNativeComponent'; import type { ViewProps } from 'ViewPropTypes'; -type ModuleProps = $ReadOnly<{| - ...ViewProps, +type ModuleProps = $ReadOnly<{| ...ViewProps, // Props boolean_default_true_optional_both?: WithDefault, // Events @@ -21,13 +21,17 @@ interface NativeCommands { +hotspotUpdate: (viewRef: React.ElementRef, x: Int32, y: Int32) => void, +scrollTo: (viewRef: React.ElementRef, y: Int32, animated: boolean) => void, } + const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + const { ConditionallyIgnoredEventHandlers } = require('react-native/Libraries/NativeComponent/ViewConfigIgnore'); + const { dispatchCommand } = require(\\"react-native/Libraries/ReactNative/RendererProxy\\"); + let nativeComponentName = 'RCTModule'; export const __INTERNAL_VIEW_CONFIG = { uiViewClassName: 'RCTModule', @@ -57,22 +61,24 @@ export const Commands = { hotspotUpdate(ref, x, y) { dispatchCommand(ref, \\"hotspotUpdate\\", [x, y]); }, + scrollTo(ref, y, animated) { dispatchCommand(ref, \\"scrollTo\\", [y, animated]); } + };" `; exports[`Babel plugin inline view configs can inline config for FullTypedNativeComponent.js 1`] = ` "// @flow - const codegenNativeCommands = require('codegenNativeCommands'); + const codegenNativeComponent = require('codegenNativeComponent'); + import type { NativeComponentType } from 'codegenNativeComponent'; import type { Int32, BubblingEventHandler, DirectEventHandler, WithDefault } from 'CodegenFlowtypes'; import type { ViewProps } from 'ViewPropTypes'; -type ModuleProps = $ReadOnly<{| - ...ViewProps, +type ModuleProps = $ReadOnly<{| ...ViewProps, // Props boolean_default_true_optional_both?: WithDefault, // Events @@ -84,13 +90,17 @@ interface NativeCommands { +hotspotUpdate: (viewRef: React.ElementRef, x: Int32, y: Int32) => void, +scrollTo: (viewRef: React.ElementRef, y: Int32, animated: boolean) => void, } + const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry'); + const { ConditionallyIgnoredEventHandlers } = require('react-native/Libraries/NativeComponent/ViewConfigIgnore'); + const { dispatchCommand } = require(\\"react-native/Libraries/ReactNative/RendererProxy\\"); + let nativeComponentName = 'RCTModule'; export const __INTERNAL_VIEW_CONFIG = { uiViewClassName: 'RCTModule', @@ -120,9 +130,11 @@ export const Commands = { hotspotUpdate(ref, x, y) { dispatchCommand(ref, \\"hotspotUpdate\\", [x, y]); }, + scrollTo(ref, y, animated) { dispatchCommand(ref, \\"scrollTo\\", [y, animated]); } + };" `; diff --git a/packages/rn-tester/js/examples/TurboModule/SampleTurboModuleExample.js b/packages/rn-tester/js/examples/TurboModule/SampleTurboModuleExample.js index e0235b5a4679cc..3c341eb0253abf 100644 --- a/packages/rn-tester/js/examples/TurboModule/SampleTurboModuleExample.js +++ b/packages/rn-tester/js/examples/TurboModule/SampleTurboModuleExample.js @@ -9,6 +9,7 @@ */ import NativeSampleTurboModule from 'react-native/Libraries/TurboModule/samples/NativeSampleTurboModule'; +import {EnumInt} from 'react-native/Libraries/TurboModule/samples/NativeSampleTurboModule'; import type {RootTag} from 'react-native/Libraries/ReactNative/RootTag'; import { StyleSheet, @@ -57,6 +58,10 @@ class SampleTurboModuleExample extends React.Component<{||}, State> { getConstants: () => NativeSampleTurboModule.getConstants(), voidFunc: () => NativeSampleTurboModule.voidFunc(), getBool: () => NativeSampleTurboModule.getBool(true), + getEnum: () => + NativeSampleTurboModule.getEnum + ? NativeSampleTurboModule.getEnum(EnumInt.A) + : null, getNumber: () => NativeSampleTurboModule.getNumber(99.95), getString: () => NativeSampleTurboModule.getString('Hello'), getArray: () => @@ -80,6 +85,7 @@ class SampleTurboModuleExample extends React.Component<{||}, State> { | 'callback' | 'getArray' | 'getBool' + | 'getEnum' | 'getConstants' | 'getNumber' | 'getObject' @@ -115,7 +121,23 @@ class SampleTurboModuleExample extends React.Component<{||}, State> { })); } - _renderResult(name: string): React.Node { + _renderResult( + name: + | 'callback' + | 'getArray' + | 'getBool' + | 'getEnum' + | 'getConstants' + | 'getNumber' + | 'getObject' + | 'getRootTag' + | 'getString' + | 'getUnsafeObject' + | 'getValue' + | 'promise' + | 'rejectPromise' + | 'voidFunc', + ): React.Node { const result = this.state.testResults[name] || {}; return (