Files
react-native/Libraries/TurboModule/TurboModuleRegistry.js
T
Mike Vitousek 7f53bb95f7 Suppress errors and switch to new-generics in xplat
Summary:
The Flow team has been building a new implementation of the system that typechecks the body of generic functions and classes. This system is more sound than the previous approach and detects errors that were uncaught previously. This diff turns on the new generic system by setting generate_tests=false in the .flowconfig, and suppresses newly discovered errors.

This diff modifies and re-signs some generated modules, because syncing from www pulled in a ton of other changes that have runtime differences, and I'm not equipped to verify that the changes are safe to land.

Changelog: [Internal]

Reviewed By: panagosg7

Differential Revision: D24801184

fbshipit-source-id: bb31fe4c5a4107d183649b436a548df5ff42e217
2020-11-20 00:50:30 -08:00

73 lines
2.2 KiB
JavaScript

/**
* 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';
const NativeModules = require('../BatchedBridge/NativeModules');
import type {TurboModule} from './RCTExport';
import invariant from 'invariant';
const turboModuleProxy = global.__turboModuleProxy;
function requireModule<T: TurboModule>(name: string, schema?: ?$FlowFixMe): ?T {
// Bridgeless mode requires TurboModules
if (!global.RN$Bridgeless) {
// Backward compatibility layer during migration.
const legacyModule = NativeModules[name];
if (legacyModule != null) {
return ((legacyModule: $FlowFixMe): T);
}
}
if (turboModuleProxy != null) {
const module: ?T =
schema != null ? turboModuleProxy(name, schema) : turboModuleProxy(name);
return module;
}
return null;
}
export function get<T: TurboModule>(name: string): ?T {
/**
* What is Schema?
*
* @react-native/babel-plugin-codegen will parse the NativeModule
* spec, and pass in the generated schema as the second argument
* to this function. The schem will then be used to perform method
* dispatch on, and translate arguments/return to and from the Native
* TurboModule object.
*/
const schema = arguments.length === 2 ? arguments[1] : undefined;
// $FlowFixMe[incompatible-call]
return requireModule<T>(name, schema);
}
export function getEnforcing<T: TurboModule>(name: string): T {
/**
* What is Schema?
*
* @react-native/babel-plugin-codegen will parse the NativeModule
* spec, and pass in the generated schema as the second argument
* to this function. The schem will then be used to perform method
* dispatch on, and translate arguments/return to and from the Native
* TurboModule object.
*/
const schema = arguments.length === 2 ? arguments[1] : undefined;
// $FlowFixMe[incompatible-call]
const module = requireModule<T>(name, schema);
invariant(
module != null,
`TurboModuleRegistry.getEnforcing(...): '${name}' could not be found. ` +
'Verify that a module by this name is registered in the native binary.',
);
return module;
}