diff --git a/Libraries/ReactNative/ReactNativeRuntimeDiagnostics.js b/Libraries/ReactNative/ReactNativeRuntimeDiagnostics.js new file mode 100644 index 00000000000..82bea13749c --- /dev/null +++ b/Libraries/ReactNative/ReactNativeRuntimeDiagnostics.js @@ -0,0 +1,68 @@ +/** + * Copyright (c) Meta Platforms, Inc. and 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-local + * @format + */ + +'use strict'; + +/** + * Perform a set of runtime diagnostics, usually useful for test purpose. + * This is only meaningful for __DEV__ mode. + */ +export type RuntimeDiagnostics = {| + /** + * Check if the runtime diagnostics is enabled at all. + */ + isEnabled: () => boolean, + + /** + * If enabled, simulate early JavaScript errors during initialization. + */ + simulateEarlyJavaScriptErrors: () => void, +|}; + +export type RuntimeDiagnosticFlag = 'early_js_errors' | 'all'; + +const flags: Array = []; +let isEnabled = false; +let shouldEnableAll = false; + +if (__DEV__) { + if (typeof global.RN$DiagnosticFlags === 'string') { + global.RN$DiagnosticFlags.split(',').forEach(flag => { + switch (flag) { + case 'early_js_errors': + case 'all': + flags.push(flag); + break; + default: + throw Error( + `RuntimeDiagnosticsFlags: unknown flag was supplied: '${flag}'`, + ); + } + }); + isEnabled = flags.length > 0; + shouldEnableAll = flags.includes('all'); + } +} + +const ReactNativeRuntimeDiagnostics: RuntimeDiagnostics = { + isEnabled: () => isEnabled, + simulateEarlyJavaScriptErrors: () => { + if (__DEV__) { + if (!isEnabled) { + return; + } + if (shouldEnableAll || flags.includes('early_js_errors')) { + throw Error('[Runtime Diagnostics] Throwing a JavaScript error.'); + } + } + }, +}; + +module.exports = ReactNativeRuntimeDiagnostics;