diff --git a/Libraries/TurboModule/RCTExport.js b/Libraries/TurboModule/RCTExport.js new file mode 100644 index 0000000000..bf608d6fe8 --- /dev/null +++ b/Libraries/TurboModule/RCTExport.js @@ -0,0 +1,35 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict + * @format + */ + +'use strict'; + +/** + * NOTE: This is React Native specific export type. + * + * RCTExport is an interface type that allows native code generation for React + * Native native modules. It exists as a hint to the codegen tool that any + * interface that extends it needs to be codegen'ed. Example usage: + * + * export interface RCTFoobar extends RCTExport {} + * + * Native definition for RCTFoobar will then be generated. + * + * The type param T is a placeholder for future codegen hinting, like versioning + * information, native base classes, etc. For now, simply use `void` type as + * there's nothing to give hint about. + */ + +// eslint-disable-next-line no-unused-vars +export interface RCTExport { + +getConstants?: () => {}; +} + +// eslint-disable-next-line lint/react-native-modules +export interface TurboModule extends RCTExport {} diff --git a/Libraries/TurboModule/TurboModuleRegistry.js b/Libraries/TurboModule/TurboModuleRegistry.js new file mode 100644 index 0000000000..54afa00afa --- /dev/null +++ b/Libraries/TurboModule/TurboModuleRegistry.js @@ -0,0 +1,35 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + * @format + */ + +'use strict'; + +import type {TurboModule} from 'RCTExport'; +import invariant from 'invariant'; +import {NativeModules} from 'react-native'; + +// TODO +function get(name: string): ?T { + // Backward compatibility layer during migration. + if (NativeModules[name] != null) { + return ((NativeModules[name]: any): T); + } + + const module: ?T = global.__turboModuleProxy(name); + return module; +} + +function getEnforcing(name: string): T { + const module = get(name); + invariant(module != null, `${name} is not available in this app.`); + return module; +} + +export {get}; +export {getEnforcing};