Merge commit 'a50fa552a7e07f611d626fae99a6ef80845d9d4d' into amgleitman/0.64-merge-2020-mm-dd

This commit is contained in:
Adam Gleitman 2021-08-17 13:53:56 -07:00
Родитель ce04f7ed7a a50fa552a7
Коммит 0dd5ae73b4
76 изменённых файлов: 947 добавлений и 346 удалений

Просмотреть файл

@ -86,4 +86,4 @@ untyped-import
untyped-type-import
[version]
^0.125.0
^0.126.1

Просмотреть файл

@ -89,4 +89,4 @@ untyped-import
untyped-type-import
[version]
^0.125.0
^0.126.1

Просмотреть файл

@ -89,4 +89,4 @@ untyped-import
untyped-type-import
[version]
^0.125.0
^0.126.1

Просмотреть файл

@ -6,7 +6,6 @@
*
* @flow
* @format
* @preventMunge
*/
'use strict';

Просмотреть файл

@ -112,13 +112,6 @@ class MessageQueue {
return this.flushedQueue();
}
// Deprecated. T61834641: Remove me once native clients have updated
callFunctionReturnResultAndFlushedQueue(
module: string,
method: string,
args: any[],
): void {}
invokeCallbackAndReturnFlushedQueue(
cbID: number,
args: any[],

Просмотреть файл

@ -23,4 +23,38 @@ export interface Spec extends TurboModule {
+release: (blobId: string) => void;
}
export default (TurboModuleRegistry.get<Spec>('BlobModule'): ?Spec);
const NativeModule = TurboModuleRegistry.get<Spec>('BlobModule');
let constants = null;
let NativeBlobModule = null;
if (NativeModule != null) {
NativeBlobModule = {
getConstants(): {|BLOB_URI_SCHEME: ?string, BLOB_URI_HOST: ?string|} {
if (constants == null) {
constants = NativeModule.getConstants();
}
return constants;
},
addNetworkingHandler(): void {
NativeModule.addNetworkingHandler();
},
addWebSocketHandler(id: number): void {
NativeModule.addWebSocketHandler(id);
},
removeWebSocketHandler(id: number): void {
NativeModule.removeWebSocketHandler(id);
},
sendOverSocket(blob: Object, socketID: number): void {
NativeModule.sendOverSocket(blob, socketID);
},
createFromParts(parts: Array<Object>, withId: string): void {
NativeModule.createFromParts(parts, withId);
},
release(blobId: string): void {
NativeModule.release(blobId);
},
};
}
export default (NativeBlobModule: ?Spec);

Просмотреть файл

@ -31,6 +31,40 @@ export interface Spec extends TurboModule {
+setHidden: (hidden: boolean) => void;
}
export default (TurboModuleRegistry.getEnforcing<Spec>(
'StatusBarManager',
): Spec);
const NativeModule = TurboModuleRegistry.getEnforcing<Spec>('StatusBarManager');
let constants = null;
const NativeStatusBarManager = {
getConstants(): {|
+HEIGHT: number,
+DEFAULT_BACKGROUND_COLOR?: number,
|} {
if (constants == null) {
constants = NativeModule.getConstants();
}
return constants;
},
setColor(color: number, animated: boolean): void {
NativeModule.setColor(color, animated);
},
setTranslucent(translucent: boolean): void {
NativeModule.setTranslucent(translucent);
},
/**
* - statusBarStyles can be:
* - 'default'
* - 'dark-content'
*/
setStyle(statusBarStyle?: ?string): void {
NativeModule.setStyle(statusBarStyle);
},
setHidden(hidden: boolean): void {
NativeModule.setHidden(hidden);
},
};
export default NativeStatusBarManager;

Просмотреть файл

@ -38,6 +38,53 @@ export interface Spec extends TurboModule {
+setHidden: (hidden: boolean, withAnimation: string) => void;
}
export default (TurboModuleRegistry.getEnforcing<Spec>(
'StatusBarManager',
): Spec);
const NativeModule = TurboModuleRegistry.getEnforcing<Spec>('StatusBarManager');
let constants = null;
const NativeStatusBarManager = {
getConstants(): {|
+HEIGHT: number,
+DEFAULT_BACKGROUND_COLOR?: number,
|} {
if (constants == null) {
constants = NativeModule.getConstants();
}
return constants;
},
// TODO(T47754272) Can we remove this method?
getHeight(callback: (result: {|height: number|}) => void): void {
NativeModule.getHeight(callback);
},
setNetworkActivityIndicatorVisible(visible: boolean): void {
NativeModule.setNetworkActivityIndicatorVisible(visible);
},
addListener(eventType: string): void {
NativeModule.addListener(eventType);
},
removeListeners(count: number): void {
NativeModule.removeListeners(count);
},
/**
* - statusBarStyles can be:
* - 'default'
* - 'dark-content'
* - 'light-content'
*/
setStyle(statusBarStyle?: ?string, animated: boolean): void {
NativeModule.setStyle(statusBarStyle, animated);
},
/**
* - withAnimation can be: 'none' | 'fade' | 'slide'
*/
setHidden(hidden: boolean, withAnimation: string): void {
NativeModule.setHidden(hidden, withAnimation);
},
};
export default NativeStatusBarManager;

Просмотреть файл

@ -1133,8 +1133,7 @@ function InternalTextInput(props: Props): React.Node {
const style = [props.style];
const autoCapitalize = props.autoCapitalize || 'sentences';
let children = props.children;
let childCount = 0;
React.Children.forEach(children, () => ++childCount);
const childCount = React.Children.count(children);
invariant(
!(props.value && childCount),
'Cannot specify both value and children.',

Просмотреть файл

@ -32,14 +32,16 @@ import NativeToastAndroid from './NativeToastAndroid';
* ```
*/
const ToastAndroidConstants = NativeToastAndroid.getConstants();
const ToastAndroid = {
// Toast duration constants
SHORT: (NativeToastAndroid.getConstants().SHORT: number),
LONG: (NativeToastAndroid.getConstants().LONG: number),
SHORT: (ToastAndroidConstants.SHORT: number),
LONG: (ToastAndroidConstants.LONG: number),
// Toast gravity constants
TOP: (NativeToastAndroid.getConstants().TOP: number),
BOTTOM: (NativeToastAndroid.getConstants().BOTTOM: number),
CENTER: (NativeToastAndroid.getConstants().CENTER: number),
TOP: (ToastAndroidConstants.TOP: number),
BOTTOM: (ToastAndroidConstants.BOTTOM: number),
CENTER: (ToastAndroidConstants.CENTER: number),
show: function(message: string, duration: number): void {
NativeToastAndroid.show(message, duration);

Просмотреть файл

@ -278,18 +278,6 @@ type AndroidViewProps = $ReadOnly<{|
*/
renderToHardwareTextureAndroid?: ?boolean,
/**
* Views that are only used to layout their children or otherwise don't draw
* anything may be automatically removed from the native hierarchy as an
* optimization. Set this property to `false` to disable this optimization and
* ensure that this `View` exists in the native view hierarchy.
*
* @platform android
*
* See https://reactnative.dev/docs/view.html#collapsable
*/
collapsable?: ?boolean,
/**
* Whether this `View` needs to rendered offscreen and composited with an
* alpha in order to preserve 100% correct colors and blending behavior.
@ -508,6 +496,19 @@ export type ViewProps = $ReadOnly<{|
*/
accessibilityActions?: ?$ReadOnlyArray<AccessibilityActionInfo>,
/**
* Views that are only used to layout their children or otherwise don't draw
* anything may be automatically removed from the native hierarchy as an
* optimization. Set this property to `false` to disable this optimization and
* ensure that this `View` exists in the native view hierarchy.
*
* @platform android
* In Fabric, this prop is used in ios as well.
*
* See https://reactnative.dev/docs/view.html#collapsable
*/
collapsable?: ?boolean,
/**
* Used to locate this view in end-to-end tests.
*

Просмотреть файл

@ -11,7 +11,6 @@
'use strict';
import type {ExtendedError} from './Devtools/parseErrorStack';
import * as LogBoxData from '../LogBox/Data/LogBoxData';
import type {ExceptionData} from './NativeExceptionsManager';
class SyntheticError extends Error {
@ -104,7 +103,8 @@ function reportException(
console.error(data.message);
}
if (isHandledByLogBox) {
if (__DEV__ && isHandledByLogBox) {
const LogBoxData = require('../LogBox/Data/LogBoxData');
LogBoxData.addException({
...data,
isComponentError: !!e.isComponentError,

Просмотреть файл

@ -56,6 +56,7 @@ class InspectorOverlay extends React.Component<Props> {
<View
onStartShouldSetResponder={this.shouldSetResponser}
onResponderMove={this.findViewForTouchEvent}
nativeID="inspectorOverlay"
style={[styles.inspector, {height: Dimensions.get('window').height}]}>
{content}
</View>

Просмотреть файл

@ -12,8 +12,6 @@
import Platform from '../Utilities/Platform';
import RCTLog from '../Utilities/RCTLog';
import * as LogBoxData from './Data/LogBoxData';
import {parseLogBoxLog, parseInterpolation} from './Data/parseLogBoxLog';
import type {IgnorePattern} from './Data/LogBoxData';
@ -23,6 +21,9 @@ let LogBox;
* LogBox displays logs in the app.
*/
if (__DEV__) {
const LogBoxData = require('./Data/LogBoxData');
const {parseLogBoxLog, parseInterpolation} = require('./Data/parseLogBoxLog');
// LogBox needs to insert itself early,
// in order to access the component stacks appended by React DevTools.
const {error, warn} = console;

Просмотреть файл

@ -11,6 +11,7 @@
'use strict';
const AppContainer = require('../ReactNative/AppContainer');
const {RootTagContext} = require('../ReactNative/RootTag');
const I18nManager = require('../ReactNative/I18nManager');
const NativeEventEmitter = require('../EventEmitter/NativeEventEmitter');
import NativeModalManager from './NativeModalManager';
@ -21,6 +22,7 @@ const ScrollView = require('../Components/ScrollView/ScrollView');
const StyleSheet = require('../StyleSheet/StyleSheet');
const View = require('../Components/View/View');
import type {RootTag} from '../ReactNative/RootTag';
import type {ViewProps} from '../Components/View/ViewPropTypes';
import type {DirectEventHandler} from '../Types/CodegenTypes';
import type EmitterSubscription from '../vendor/emitter/EmitterSubscription';
@ -156,9 +158,7 @@ class Modal extends React.Component<Props> {
hardwareAccelerated: false,
};
static contextTypes: any | {|rootTag: React$PropType$Primitive<number>|} = {
rootTag: PropTypes.number,
};
static contextType: React.Context<RootTag> = RootTagContext;
_identifier: number;
_eventSubscription: ?EmitterSubscription;
@ -224,9 +224,7 @@ class Modal extends React.Component<Props> {
}
const innerChildren = __DEV__ ? (
<AppContainer rootTag={this.context.rootTag}>
{this.props.children}
</AppContainer>
<AppContainer rootTag={this.context}>{this.props.children}</AppContainer>
) : (
this.props.children
);

Просмотреть файл

@ -19,4 +19,19 @@ export interface Spec extends TurboModule {
|};
}
export default (TurboModuleRegistry.getEnforcing<Spec>('SourceCode'): Spec);
const NativeModule = TurboModuleRegistry.getEnforcing<Spec>('SourceCode');
let constants = null;
const NativeSourceCode = {
getConstants(): {|
scriptURL: string,
|} {
if (constants == null) {
constants = NativeModule.getConstants();
}
return constants;
},
};
export default NativeSourceCode;

Просмотреть файл

@ -91,7 +91,7 @@ export type PressEvent = ResponderSyntheticEvent<
button?: ?number, // TODO(macOS GH#774)
changedTouches: $ReadOnlyArray<$PropertyType<PressEvent, 'nativeEvent'>>,
ctrlKey?: ?boolean, // TODO(macOS GH#774)
force: number,
force?: number,
identifier: number,
locationX: number,
locationY: number,

Просмотреть файл

@ -43,7 +43,18 @@ export interface Spec extends TurboModule {
}
const NativeModule: Spec = TurboModuleRegistry.getEnforcing<Spec>('DeviceInfo');
let constants = null;
const NativeDeviceInfo = NativeModule;
const NativeDeviceInfo = {
getConstants(): {|
+Dimensions: DimensionsPayload,
+isIPhoneX_deprecated?: boolean,
|} {
if (constants == null) {
constants = NativeModule.getConstants();
}
return constants;
},
};
export default NativeDeviceInfo;

Просмотреть файл

@ -251,6 +251,7 @@ PODS:
- glog
- RCT-Folly (= 2020.01.13.00)
- React-callinvoker (= 1000.0.0)
- React-jsi (= 1000.0.0)
- React-jsinspector (= 1000.0.0)
- React-perflogger (= 1000.0.0)
- React-runtimeexecutor (= 1000.0.0)
@ -523,8 +524,8 @@ SPEC CHECKSUMS:
CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845
CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f
DoubleConversion: 2b45d0f8e156a5b02354c8a4062de64d41ccb4e0
FBLazyVector: 612364849df0026a8fdea446ac929d32f9f0a423
FBReactNativeSpec: 30d621de10913f14a0a5905ce088ea18b85c2dbb
FBLazyVector: 473624d6d8a95dddea531181b5fe074296b849d4
FBReactNativeSpec: aa5face1bbc5054a321b7a71a7a9f63fb9b9ed7f
Flipper: be611d4b742d8c87fbae2ca5f44603a02539e365
Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41
Flipper-Folly: c12092ea368353b58e992843a990a3225d4533c3
@ -535,34 +536,34 @@ SPEC CHECKSUMS:
glog: 789873d01e4b200777d0a09bc23d548446758699
OpenSSL-Universal: 8b48cc0d10c1b2923617dfe5c178aa9ed2689355
RCT-Folly: 55d0039b24e192081ec0b2257f7bd9f42e382fb7
RCTRequired: 6d90ba4846a58d45539e8118ebf7a06d2db379cc
RCTTypeSafety: 9e0a77a9f2c4e0688c985ec1243307d6777805ab
React: 7070d4f9baf939baedfcd1358acdaf0a259b023d
React-ART: 531f0b78884eecc02b0088330e1b820ca7ef186f
React-callinvoker: 94940d7aa248934637b2a6020aab6c1de893e5c7
React-Core: 84250af569c182909120182e89914ae17be2b6ed
React-CoreModules: 2c51a966aa8dfb075c85caee7fdc0f1a02062f8a
React-cxxreact: f5a570f0eeea78b7eabf322dc01ed7c54b092320
React-jsi: f63877d063edf2a614d67f454ea68825953079ff
React-jsiexecutor: ba971320209048169e0d9e7b0d1d25758e266a2f
React-jsinspector: 9a3e9449f88a9abe091b13f6b8a214dd26465b26
React-perflogger: 0fad4dd40022e77107f74a593204945d78b52876
React-RCTActionSheet: 5890411c18dcd860bd792882fb20b81f22f25bc4
React-RCTAnimation: ae52c02def54ee24f7522088bffbe33874265ca8
React-RCTBlob: 6bfe0eab854c0ea95dea90a9f2d9b555502503e0
React-RCTImage: 16232a23bdb07d5a06705f95b3b40ee28ba3054c
React-RCTLinking: 3d4dcd2e7f15dd11bb18861bdf7b4781f76d4d64
React-RCTNetwork: 0cbd4b96fcf726438f9814631e447cfe4db714c9
React-RCTPushNotification: 61f472384037a2d15fa3c76e069ccde9979c8a89
React-RCTSettings: a9952a40a7d89e4f3aec025185f197e58a1a22a2
React-RCTTest: b86c663b9dc6b0dccd6b37a794b6a7d8c164c4f3
React-RCTText: ee61e09fc11975b5669bcddc36549ee848ad3b83
React-RCTVibration: 37bb78ecacc0cfeb619b3b46a436b31246b8fcb1
React-runtimeexecutor: a0adc3b14832a771a58bdee656a775a096be3d7a
RCTRequired: c2b55a638af545470baa7e1953525cbdd249f071
RCTTypeSafety: 6f8075941c3b0a18fe2dc4b343aea938d0bad5e2
React: 8ebf7e7f105fbcea86199badd55a6bb67a5b8afa
React-ART: a75138364a2681f5189fe24af2a645a4f9069353
React-callinvoker: 497cecd63f6e72c269c808e8529b36e31816175f
React-Core: 21186234ce1a0dfdd68bb885f36953f03f6ad595
React-CoreModules: 20deecbc9727971b94d8b7e36addba9ee5b3df7b
React-cxxreact: 78dadb6f1c308aac81c14cc5fa55eee1bf4e509a
React-jsi: 04aa49b53eb6627f22a208b7a453b7c695c23f13
React-jsiexecutor: 68b861e21c43a19980374229f98003860e389eb7
React-jsinspector: b75196b3c0ed12a6608798366cd627fd93d8aef5
React-perflogger: 1e95f386e69d2531429be35018b9e3a7e7319f0d
React-RCTActionSheet: 2f5024fba47f6bbae7cd7035bcfe3a2a9ceab828
React-RCTAnimation: c5daba3acc6601ed49befc73314f3a4a3dffac7e
React-RCTBlob: e88442441bf43cb1733faf5ee0369cb77ef9a9c5
React-RCTImage: 0d6613af0b99b24bb2f10d951c36d682b15ba90f
React-RCTLinking: b47cd2eda4ad15424f1ad02f4eb9ff027f212f6c
React-RCTNetwork: 1bdb44306b36686fcdf51fb353cd5bea1910c9dc
React-RCTPushNotification: 0d9ef4d1acc93d00828de47763834ef9f7e825c7
React-RCTSettings: 606a93f1f422bb1e33e8178715edcbeb00ef0e29
React-RCTTest: 61a59b3db0d728bd3f2e4c477aa39f5308f58d3d
React-RCTText: 377bcb96f1626badf03d4e7cb08efc1e49ca8654
React-RCTVibration: a68e8de67fd7d6fe24f027965291dff20a7e1ecf
React-runtimeexecutor: b5c501cbb838fb190272567117469ba89ca4095c
React-TurboModuleCxx-RNW: 18bb71af41fe34c8b12a56bef60aae7ee32b0817
React-TurboModuleCxx-WinRTPort: c5ee8d0f7fd49453996a980a8646afb251339acb
ReactCommon: 37c88457c9e4896daaa6a7aa699f9d54ae5e148e
Yoga: 8838387cf620983b4e0e6e6c0486c6041b3faee3
React-TurboModuleCxx-WinRTPort: bbf5afaa8aa712919a56b270bee8a83a74d7c6f5
ReactCommon: d4fccf43589bf37d7e3b94c32ce3722a0889d98c
Yoga: 4fec242f984a794825ad52bc24af3c0c91da2d7d
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
PODFILE CHECKSUM: 7d43a928a9b9ad27329da110adbfadd923a39ba8

Просмотреть файл

@ -115,7 +115,10 @@ NSString *kBundleNameJS = @"RNTesterApp";
}
__typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf->_turboModuleManager installJSBindingWithRuntime:&runtime];
facebook::react::RuntimeExecutor syncRuntimeExecutor = [&](std::function<void(facebook::jsi::Runtime &runtime_)> &&callback) {
callback(runtime);
};
[strongSelf->_turboModuleManager installJSBindingWithRuntimeExecutor:syncRuntimeExecutor];
}
})
);

Просмотреть файл

@ -178,7 +178,10 @@
}
__typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf->_turboModuleManager installJSBindingWithRuntime:&runtime];
facebook::react::RuntimeExecutor syncRuntimeExecutor = [&](std::function<void(facebook::jsi::Runtime &runtime_)> &&callback) {
callback(runtime);
};
[strongSelf->_turboModuleManager installJSBindingWithRuntimeExecutor:syncRuntimeExecutor];
}
})
);

Просмотреть файл

@ -20,12 +20,24 @@ static NSURL *mainBundleURL()
static NSURL *localhostBundleURL()
{
return [NSURL URLWithString:[NSString stringWithFormat:@"http://localhost:8081/%@.bundle?platform=%@&dev=true&minify=false&app=com.apple.dt.xctest.tool", testFile, kRCTPlatformName]]; // TODO(macOS ISS#3536887)
return [NSURL
URLWithString:
[NSString
stringWithFormat:
@"http://localhost:8081/%@.bundle?platform=%@&dev=true&minify=false&modulesOnly=false&runMdoule=true&app=com.apple.dt.xctest.tool",
testFile,
kRCTPlatformName]]; // TODO(macOS GH#774)
}
static NSURL *ipBundleURL()
{
return [NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.1.1:8081/%@.bundle?platform=%@&dev=true&minify=false&app=com.apple.dt.xctest.tool", testFile, kRCTPlatformName]]; // TODO(macOS ISS#3536887)
return [NSURL
URLWithString:
[NSString
stringWithFormat:
@"http://192.168.1.1:8081/%@.bundle?platform=%@&dev=true&minify=false&modulesOnly=false&runMdoule=true&app=com.apple.dt.xctest.tool",
testFile,
kRCTPlatformName]]; // TODO(macOS GH#774)
}
@implementation NSBundle (RCTBundleURLProviderTests)
@ -50,16 +62,14 @@ static NSURL *ipBundleURL()
{
[super setUp];
RCTSwapInstanceMethods([NSBundle class],
@selector(URLForResource:withExtension:),
@selector(RCT_URLForResource:withExtension:));
RCTSwapInstanceMethods(
[NSBundle class], @selector(URLForResource:withExtension:), @selector(RCT_URLForResource:withExtension:));
}
- (void)tearDown
{
RCTSwapInstanceMethods([NSBundle class],
@selector(URLForResource:withExtension:),
@selector(RCT_URLForResource:withExtension:));
RCTSwapInstanceMethods(
[NSBundle class], @selector(URLForResource:withExtension:), @selector(RCT_URLForResource:withExtension:));
[super tearDown];
}

Просмотреть файл

@ -167,7 +167,7 @@ function ForceTouchExample() {
style={styles.wrapper}
testID="pressable_3dtouch_button"
onStartShouldSetResponder={() => true}
onResponderMove={event => setForce(event.nativeEvent.force)}
onResponderMove={event => setForce(event.nativeEvent?.force || 1)}
onResponderRelease={event => setForce(0)}>
<Text style={styles.button}>Press Me</Text>
</View>

Просмотреть файл

@ -47,6 +47,11 @@ extern NSString *const kRCTPlatformName; // TODO(macOS GH#774)
*/
- (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot fallbackURLProvider:(NSURL * (^)(void))fallbackURLProvider;
/**
* Returns the jsBundleURL for a given split bundle entrypoint in development
*/
- (NSURL *)jsBundleURLForSplitBundleRoot:(NSString *)bundleRoot;
/**
* Returns the jsBundleURL for a given bundle entrypoint and
* the fallback offline JS bundle if the packager is not running.
@ -91,15 +96,30 @@ extern NSString *const kRCTPlatformName; // TODO(macOS GH#774)
+ (instancetype)sharedSettings;
/**
Given a hostname for the packager and a bundle root, returns the URL to the js bundle. Generally you should use the
instance method -jsBundleURLForBundleRoot:fallbackResource: which includes logic to guess if the packager is running
and fall back to a pre-packaged bundle if it is not.
* Given a hostname for the packager and a bundle root, returns the URL to the js bundle. Generally you should use the
* instance method -jsBundleURLForBundleRoot:fallbackResource: which includes logic to guess if the packager is running
* and fall back to a pre-packaged bundle if it is not.
*
* The options here mirror some of Metro's Bundling Options:
* - enableDev: Whether to keep or remove `__DEV__` blocks from the bundle.
* - enableMinification: Enables or disables minification. Usually production bundles are minified and development
* bundles are not.
* - modulesOnly: When true, will only send module definitions without polyfills and without the require-runtime.
* - runModule: When true, will run the main module after defining all modules. This is used in the main bundle but not
* in split bundles.
*/
+ (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot
packagerHost:(NSString *)packagerHost
enableDev:(BOOL)enableDev
enableMinification:(BOOL)enableMinification;
+ (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot
packagerHost:(NSString *)packagerHost
enableDev:(BOOL)enableDev
enableMinification:(BOOL)enableMinification
modulesOnly:(BOOL)modulesOnly
runModule:(BOOL)runModule;
/**
* Given a hostname for the packager and a resource path (including "/"), return the URL to the resource.
* In general, please use the instance method to decide if the packager is running and fallback to the pre-packaged

Просмотреть файл

@ -151,6 +151,16 @@ static NSURL *serverRootWithHostPort(NSString *hostPort)
}
}
- (NSURL *)jsBundleURLForSplitBundleRoot:(NSString *)bundleRoot
{
return [RCTBundleURLProvider jsBundleURLForBundleRoot:bundleRoot
packagerHost:[self packagerServerHost]
enableDev:[self enableDev]
enableMinification:[self enableMinification]
modulesOnly:YES
runModule:NO];
}
- (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot
fallbackResource:(NSString *)resourceName
fallbackExtension:(NSString *)extension
@ -192,13 +202,31 @@ static NSURL *serverRootWithHostPort(NSString *hostPort)
packagerHost:(NSString *)packagerHost
enableDev:(BOOL)enableDev
enableMinification:(BOOL)enableMinification
{
return [self jsBundleURLForBundleRoot:bundleRoot
packagerHost:packagerHost
enableDev:enableDev
enableMinification:enableMinification
modulesOnly:NO
runModule:YES];
}
+ (NSURL *)jsBundleURLForBundleRoot:(NSString *)bundleRoot
packagerHost:(NSString *)packagerHost
enableDev:(BOOL)enableDev
enableMinification:(BOOL)enableMinification
modulesOnly:(BOOL)modulesOnly
runModule:(BOOL)runModule
{
NSString *path = [NSString stringWithFormat:@"/%@.bundle", bundleRoot];
// When we support only iOS 8 and above, use queryItems for a better API.
NSString *query = [NSString stringWithFormat:@"platform=%@&dev=%@&minify=%@",
NSString *query = [NSString stringWithFormat:@"platform=%@&dev=%@&minify=%@&modulesOnly=%@&runMdoule=%@",
kRCTPlatformName, // TODO(macOS GH#774)
enableDev ? @"true" : @"false",
enableMinification ? @"true" : @"false"];
enableMinification ? @"true" : @"false",
modulesOnly ? @"true" : @"false",
runModule ? @"true" : @"false"];
NSString *bundleID = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleIdentifierKey];
if (bundleID) {
query = [NSString stringWithFormat:@"%@&app=%@", query, bundleID];

Просмотреть файл

@ -8,6 +8,7 @@
#import <Foundation/Foundation.h>
#import <React/RCTInvalidating.h>
#import "RCTDefines.h"
@protocol RCTBridgeMethod;
@protocol RCTBridgeModule;
@ -94,3 +95,6 @@ typedef id<RCTBridgeModule> (^RCTBridgeModuleProvider)(void);
@property (nonatomic, assign, readonly) BOOL implementsPartialBatchDidFlush;
@end
RCT_EXTERN void RCTSetIsMainQueueExecutionOfConstantsToExportDisabled(BOOL val);
RCT_EXTERN BOOL RCTIsMainQueueExecutionOfConstantsToExportDisabled();

Просмотреть файл

@ -29,6 +29,17 @@ int32_t getUniqueId()
return counter++;
}
}
static BOOL isMainQueueExecutionOfConstantToExportDisabled = NO;
void RCTSetIsMainQueueExecutionOfConstantsToExportDisabled(BOOL val)
{
isMainQueueExecutionOfConstantToExportDisabled = val;
}
BOOL RCTIsMainQueueExecutionOfConstantsToExportDisabled()
{
return isMainQueueExecutionOfConstantToExportDisabled;
}
@implementation RCTModuleData {
NSDictionary<NSString *, id> *_constantsToExport;
@ -389,7 +400,8 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init);
* require.
*/
BridgeNativeModulePerfLogger::moduleJSRequireEndingStart([moduleName UTF8String]);
if (_requiresMainQueueSetup) {
if (!RCTIsMainQueueExecutionOfConstantsToExportDisabled() && _requiresMainQueueSetup) {
if (!RCTIsMainQueue()) {
RCTLogWarn(@"Required dispatch_sync to load constants for %@. This may lead to deadlocks", _moduleClass);
}
@ -400,6 +412,7 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init);
} else {
_constantsToExport = [_instance constantsToExport] ?: @{};
}
RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"");
} else {
/**

Просмотреть файл

@ -67,9 +67,14 @@ RCT_EXPORT_MODULE()
- (facebook::react::ModuleConstants<JS::NativeAppState::Constants>)getConstants
{
return facebook::react::typedConstants<JS::NativeAppState::Constants>({
__block facebook::react::ModuleConstants<JS::NativeAppState::Constants> constants;
RCTUnsafeExecuteOnMainQueueSync(^{
constants = facebook::react::typedConstants<JS::NativeAppState::Constants>({
.initialAppState = RCTCurrentAppState(),
});
});
return constants;
}
#pragma mark - Lifecycle

Просмотреть файл

@ -138,9 +138,11 @@ NSDictionary *RCTExportedDimensions(RCTPlatformView *rootView)
- (NSDictionary<NSString *, id> *)getConstants
{
return @{
__block NSDictionary<NSString *, id> *constants;
RCTUnsafeExecuteOnMainQueueSync(^{
constants = @{
#if !TARGET_OS_OSX // TODO(macOS GH#774)
@"Dimensions" : RCTExportedDimensions(_bridge),
@"Dimensions" : RCTExportedDimensions(self->_bridge),
#else // [TODO(macOS GH#774)
@"Dimensions": RCTExportedDimensions(nil),
#endif // ]TODO(macOS GH#774)
@ -150,6 +152,9 @@ NSDictionary *RCTExportedDimensions(RCTPlatformView *rootView)
// Use <SafeAreaView> instead.
@"isIPhoneX_deprecated" : @(RCTIsIPhoneX()),
};
});
return constants;
}
- (void)didReceiveNewContentSizeMultiplier

Просмотреть файл

@ -58,9 +58,11 @@ RCT_EXPORT_MODULE(PlatformConstants)
- (ModuleConstants<JS::NativePlatformConstantsIOS::Constants>)getConstants
{
__block ModuleConstants<JS::NativePlatformConstantsIOS::Constants> constants;
RCTUnsafeExecuteOnMainQueueSync(^{
UIDevice *device = [UIDevice currentDevice];
auto versions = RCTGetReactNativeVersion();
return typedConstants<JS::NativePlatformConstantsIOS::Constants>({
constants = typedConstants<JS::NativePlatformConstantsIOS::Constants>({
.forceTouchAvailable = RCTForceTouchAvailable() ? true : false,
.osVersion = [device systemVersion],
.systemName = [device systemName],
@ -74,6 +76,9 @@ RCT_EXPORT_MODULE(PlatformConstants)
? folly::Optional<double>{}
: [versions[@"prerelease"] doubleValue]}),
});
});
return constants;
}
- (std::shared_ptr<TurboModule>)getTurboModule:(const ObjCTurboModule::InitParams &)params

Просмотреть файл

@ -185,10 +185,15 @@ RCT_EXPORT_METHOD(setNetworkActivityIndicatorVisible : (BOOL)visible)
- (facebook::react::ModuleConstants<JS::NativeStatusBarManagerIOS::Constants>)getConstants
{
return facebook::react::typedConstants<JS::NativeStatusBarManagerIOS::Constants>({
__block facebook::react::ModuleConstants<JS::NativeStatusBarManagerIOS::Constants> constants;
RCTUnsafeExecuteOnMainQueueSync(^{
constants = facebook::react::typedConstants<JS::NativeStatusBarManagerIOS::Constants>({
.HEIGHT = RCTSharedApplication().statusBarFrame.size.height,
.DEFAULT_BACKGROUND_COLOR = folly::none,
});
});
return constants;
}
- (facebook::react::ModuleConstants<JS::NativeStatusBarManagerIOS::Constants>)constantsToExport

Просмотреть файл

@ -265,10 +265,24 @@ struct RCTInstanceCallback : public InstanceCallback {
_moduleDataByID = [NSMutableArray new];
[RCTBridge setCurrentBridge:self];
#if !TARGET_OS_OSX // TODO(macOS GH#774)
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleMemoryWarning)
name:UIApplicationDidReceiveMemoryWarningNotification
object:nil];
#endif // TODO(macOS GH#774)
}
return self;
}
- (void)dealloc
{
#if !TARGET_OS_OSX // TODO(macOS GH#774)
[[NSNotificationCenter defaultCenter] removeObserver:self];
#endif // TODO9macOS GH#774)
}
+ (void)runRunLoop
{
@autoreleasepool {
@ -302,6 +316,20 @@ struct RCTInstanceCallback : public InstanceCallback {
}
}
- (void)handleMemoryWarning
{
if (!_valid || !_loading) {
return;
}
// We need to hold a local retaining pointer to react instance
// in case if some other tread resets it.
auto reactInstance = _reactInstance;
if (reactInstance) {
reactInstance->handleMemoryPressure(15 /* TRIM_MEMORY_RUNNING_CRITICAL */);
}
}
/**
* Ensure block is run on the JS thread. If we're already on the JS thread, the block will execute synchronously.
* If we're not on the JS thread, the block is dispatched to that thread. Any errors encountered while executing
@ -911,7 +939,9 @@ struct RCTInstanceCallback : public InstanceCallback {
if (self.valid && ![moduleData.moduleClass isSubclassOfClass:[RCTCxxModule class]]) {
[self->_performanceLogger appendStartForTag:RCTPLNativeModuleMainThread];
(void)[moduleData instance];
if (!RCTIsMainQueueExecutionOfConstantsToExportDisabled()) {
[moduleData gatherConstants];
}
[self->_performanceLogger appendStopForTag:RCTPLNativeModuleMainThread];
}
};

Просмотреть файл

@ -114,7 +114,7 @@ class LayoutAnimationDelegateProxy : public LayoutAnimationStatusDelegate, publi
if (_layoutAnimationsEnabled) {
_layoutAnimationDelegateProxy = std::make_shared<LayoutAnimationDelegateProxy>((__bridge void *)self);
_animationDriver = std::make_unique<LayoutAnimationDriver>(_layoutAnimationDelegateProxy.get());
_animationDriver = std::make_shared<LayoutAnimationDriver>(_layoutAnimationDelegateProxy.get());
_uiRunLoopObserver =
toolbox.mainRunLoopObserverFactory(RunLoopObserver::Activity::BeforeWaiting, _layoutAnimationDelegateProxy);
_uiRunLoopObserver->setDelegate(_layoutAnimationDelegateProxy.get());
@ -152,12 +152,7 @@ class LayoutAnimationDelegateProxy : public LayoutAnimationStatusDelegate, publi
auto props = convertIdToFollyDynamic(initialProps);
_scheduler->startSurface(
surfaceId,
RCTStringFromNSString(moduleName),
props,
layoutConstraints,
layoutContext,
(_animationDriver ? _animationDriver.get() : nullptr));
surfaceId, RCTStringFromNSString(moduleName), props, layoutConstraints, layoutContext, _animationDriver);
_scheduler->renderTemplateToSurface(
surfaceId, props.getDefault("navigationConfig").getDefault("initialUITemplate", "").getString());
}

Просмотреть файл

@ -655,9 +655,9 @@ public class ReactInstanceManager {
}
}
/** Temporary: due to T62192299, log sources of destroy calls. TODO T62192299: delete */
/** Temporary: due to T67035147, log sources of destroy calls. TODO T67035147: delete */
private void logOnDestroy() {
FLog.e(
FLog.d(
TAG,
"ReactInstanceManager.destroy called",
new RuntimeException("ReactInstanceManager.destroy called"));
@ -669,7 +669,6 @@ public class ReactInstanceManager {
UiThreadUtil.assertOnUiThread();
PrinterHolder.getPrinter().logMessage(ReactDebugOverlayTags.RN_CORE, "RNCore: Destroy");
// TODO T62192299: remove when investigation is complete
logOnDestroy();
if (mHasStartedDestroying) {
@ -1134,8 +1133,7 @@ public class ReactInstanceManager {
}
private void attachRootViewToInstance(final ReactRoot reactRoot) {
// TODO: downgrade back to FLog.d once T62192299 is resolved.
FLog.e(ReactConstants.TAG, "ReactInstanceManager.attachRootViewToInstance()");
FLog.d(ReactConstants.TAG, "ReactInstanceManager.attachRootViewToInstance()");
Systrace.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "attachRootViewToInstance");
@Nullable
@ -1281,39 +1279,15 @@ public class ReactInstanceManager {
reactContext.initializeWithInstance(catalystInstance);
if (ReactFeatureFlags.enableTurboModuleDebugLogs) {
// TODO(T46487253): Remove after task is closed
FLog.e(
ReactConstants.TAG,
"ReactInstanceManager.createReactContext: mJSIModulePackage "
+ (mJSIModulePackage != null ? "not null" : "null"));
}
if (mJSIModulePackage != null) {
catalystInstance.addJSIModules(
mJSIModulePackage.getJSIModules(
reactContext, catalystInstance.getJavaScriptContextHolder()));
if (ReactFeatureFlags.enableTurboModuleDebugLogs) {
// TODO(T46487253): Remove after task is closed
FLog.e(
ReactConstants.TAG,
"ReactInstanceManager.createReactContext: ReactFeatureFlags.useTurboModules == "
+ (ReactFeatureFlags.useTurboModules == false ? "false" : "true"));
}
if (ReactFeatureFlags.useTurboModules) {
JSIModule turboModuleManager =
catalystInstance.getJSIModule(JSIModuleType.TurboModuleManager);
if (ReactFeatureFlags.enableTurboModuleDebugLogs) {
// TODO(T46487253): Remove after task is closed
FLog.e(
ReactConstants.TAG,
"ReactInstanceManager.createReactContext: TurboModuleManager "
+ (turboModuleManager == null ? "not created" : "created"));
}
catalystInstance.setTurboModuleManager(turboModuleManager);
TurboModuleRegistry registry = (TurboModuleRegistry) turboModuleManager;

Просмотреть файл

@ -523,8 +523,6 @@ public class ReactRootView extends FrameLayout implements RootView, ReactRoot {
mShouldLogContentAppeared = true;
// TODO T62192299: remove this
FLog.e(TAG, "runApplication: call AppRegistry.runApplication");
catalystInstance.getJSModule(AppRegistry.class).runApplication(jsAppModuleName, appParams);
} finally {
Systrace.endSection(TRACE_TAG_REACT_JAVA_BRIDGE);

Просмотреть файл

@ -10,7 +10,6 @@ package com.facebook.react.animated;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import com.facebook.common.logging.FLog;
import com.facebook.fbreact.specs.NativeAnimatedModuleSpec;
import com.facebook.infer.annotation.Assertions;
import com.facebook.react.bridge.Arguments;
@ -21,7 +20,6 @@ import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.UIManager;
import com.facebook.react.bridge.UIManagerListener;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.common.annotations.VisibleForTesting;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.modules.core.DeviceEventManagerModule;
@ -108,23 +106,23 @@ public class NativeAnimatedModule extends NativeAnimatedModuleSpec
protected void doFrameGuarded(final long frameTimeNanos) {
try {
NativeAnimatedNodesManager nodesManager = getNodesManager();
if (nodesManager.hasActiveAnimations()) {
if (nodesManager != null && nodesManager.hasActiveAnimations()) {
nodesManager.runUpdates(frameTimeNanos);
}
// This is very unlikely to ever be hit.
if (nodesManager == null && mReactChoreographer == null) {
return;
}
// TODO: Would be great to avoid adding this callback in case there are no active
// animations
// and no outstanding tasks on the operations queue. Apparently frame callbacks can
// only
// be posted from the UI thread and therefore we cannot schedule them directly from
// @Override
// animations and no outstanding tasks on the operations queue. Apparently frame
// callbacks can only be posted from the UI thread and therefore we cannot schedule
// them directly from other threads.
Assertions.assertNotNull(mReactChoreographer)
.postFrameCallback(
ReactChoreographer.CallbackType.NATIVE_ANIMATED_MODULE,
mAnimatedFrameCallback);
} catch (Exception ex) {
// TODO T57341690 remove this when T57341690 is resolved
FLog.e(ReactConstants.TAG, "Exception while executing animated frame callback.", ex);
throw new RuntimeException(ex);
}
}
@ -246,7 +244,8 @@ public class NativeAnimatedModule extends NativeAnimatedModuleSpec
@Override
public void onHostDestroy() {
// do nothing
// Is it possible for onHostDestroy to be called without a corresponding onHostPause?
clearFrameCallback();
}
@Override
@ -254,6 +253,13 @@ public class NativeAnimatedModule extends NativeAnimatedModuleSpec
return NAME;
}
/**
* Returns a {@link NativeAnimatedNodesManager}, either the existing instance or a new one. Will
* return null if and only if the {@link ReactApplicationContext} is also null.
*
* @return {@link NativeAnimatedNodesManager}
*/
@Nullable
private NativeAnimatedNodesManager getNodesManager() {
if (mNodesManager == null) {
ReactApplicationContext reactApplicationContext = getReactApplicationContextIfActiveOrWarn();

Просмотреть файл

@ -582,16 +582,6 @@ public class CatalystInstanceImpl implements CatalystInstance {
public NativeModule getNativeModule(String moduleName) {
if (getTurboModuleRegistry() != null) {
TurboModule turboModule = getTurboModuleRegistry().getModule(moduleName);
if (ReactFeatureFlags.enableTurboModuleDebugLogs) {
// TODO(T46487253): Remove after task is closed
FLog.e(
ReactConstants.TAG,
"CatalystInstanceImpl.getNativeModule: TurboModule "
+ moduleName
+ (turboModule == null ? " not" : "")
+ " found");
}
if (turboModule != null) {
return (NativeModule) turboModule;
}
@ -724,9 +714,6 @@ public class CatalystInstanceImpl implements CatalystInstance {
}
private void onNativeException(Exception e) {
// TODO T62192299: remove this after investigation
FLog.e(ReactConstants.TAG, "CatalystInstanceImpl caught native exception", e);
mNativeModuleCallExceptionHandler.handleException(e);
mReactQueueConfiguration
.getUIQueueThread()

Просмотреть файл

@ -23,9 +23,6 @@ public class ReactFeatureFlags {
*/
public static volatile boolean useTurboModules = false;
/** Should we output debug logs to debug the TurboModule infra? */
public static volatile boolean enableTurboModuleDebugLogs = false;
/*
* This feature flag enables logs for Fabric
*/
@ -89,4 +86,7 @@ public class ReactFeatureFlags {
/** Feature flag to configure initialization of Fabric surfaces. */
public static boolean enableFabricStartSurfaceWithLayoutMetrics = true;
/** Feature flag to have FabricUIManager teardown stop all active surfaces. */
public static boolean enableFabricStopAllSurfacesOnTeardown = false;
}

Просмотреть файл

@ -9,7 +9,6 @@ package com.facebook.react.devsupport;
import android.view.View;
import androidx.annotation.Nullable;
import com.facebook.common.logging.FLog;
import com.facebook.react.bridge.DefaultNativeModuleCallExceptionHandler;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReadableArray;
@ -158,9 +157,6 @@ public class DisabledDevSupportManager implements DevSupportManager {
@Override
public void handleException(Exception e) {
// TODO T62192299: remove this after investigation
FLog.e("DisabledDevSupportManager", "Caught exception", e);
mDefaultNativeModuleCallExceptionHandler.handleException(e);
}
}

Просмотреть файл

@ -13,6 +13,7 @@ import com.facebook.jni.HybridData;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.bridge.JavaScriptContextHolder;
import com.facebook.react.bridge.NativeMap;
import com.facebook.react.bridge.RuntimeExecutor;
import com.facebook.react.bridge.queue.MessageQueueThread;
import com.facebook.react.fabric.events.EventBeatManager;
import com.facebook.react.uimanager.PixelUtil;
@ -35,6 +36,7 @@ public class Binding {
private native void installFabricUIManager(
long jsContextNativePointer,
RuntimeExecutor runtimeExecutor,
Object uiManager,
EventBeatManager eventBeatManager,
MessageQueueThread jsMessageQueueThread,
@ -72,8 +74,10 @@ public class Binding {
public native void driveCxxAnimations();
// TODO (T67721598) Remove the jsContext param once we've migrated to using RuntimeExecutor
public void register(
@NonNull JavaScriptContextHolder jsContext,
@NonNull RuntimeExecutor runtimeExecutor,
@NonNull FabricUIManager fabricUIManager,
@NonNull EventBeatManager eventBeatManager,
@NonNull MessageQueueThread jsMessageQueueThread,
@ -82,6 +86,7 @@ public class Binding {
fabricUIManager.setBinding(this);
installFabricUIManager(
jsContext.get(),
runtimeExecutor,
fabricUIManager,
eventBeatManager,
jsMessageQueueThread,

Просмотреть файл

@ -74,8 +74,10 @@ public class FabricJSIModuleProvider implements JSIModuleProvider<UIManager> {
.getCatalystInstance()
.getReactQueueConfiguration()
.getJSQueueThread();
binding.register(
mJSContext,
mReactApplicationContext.getCatalystInstance().getRuntimeExecutor(),
uiManager,
eventBeatManager,
jsMessageQueueThread,

Просмотреть файл

@ -244,6 +244,7 @@ public class FabricUIManager implements UIManager, LifecycleEventListener {
@ThreadConfined(ANY)
public void stopSurface(int surfaceID) {
mBinding.stopSurface(surfaceID);
mReactContextForRootTag.remove(surfaceID);
}
@Override
@ -286,6 +287,15 @@ public class FabricUIManager implements UIManager, LifecycleEventListener {
// memory immediately.
mDispatchUIFrameCallback.stop();
// Stop all attached surfaces
if (ReactFeatureFlags.enableFabricStopAllSurfacesOnTeardown) {
FLog.e(TAG, "stop all attached surfaces");
for (int surfaceId : mReactContextForRootTag.keySet()) {
FLog.e(TAG, "stop attached surface: " + surfaceId);
stopSurface(surfaceId);
}
}
mBinding.unregister();
mBinding = null;
@ -421,8 +431,9 @@ public class FabricUIManager implements UIManager, LifecycleEventListener {
@SuppressWarnings("unused")
@AnyThread
@ThreadConfined(ANY)
private MountItem createBatchMountItem(MountItem[] items, int size, int commitNumber) {
return new BatchMountItem(items, size, commitNumber);
private MountItem createBatchMountItem(
int rootTag, MountItem[] items, int size, int commitNumber) {
return new BatchMountItem(rootTag, items, size, commitNumber);
}
@DoNotStrip
@ -483,16 +494,21 @@ public class FabricUIManager implements UIManager, LifecycleEventListener {
@ThreadConfined(UI)
public void synchronouslyUpdateViewOnUIThread(int reactTag, @NonNull ReadableMap props) {
UiThreadUtil.assertOnUiThread();
long time = SystemClock.uptimeMillis();
int commitNumber = mCurrentSynchronousCommitNumber++;
// We are on the UI thread so this is safe to call. We try to flush any existing
// mount instructions that are queued.
tryDispatchMountItems();
try {
ReactMarker.logFabricMarker(
ReactMarkerConstants.FABRIC_UPDATE_UI_MAIN_THREAD_START, null, commitNumber);
if (ENABLE_FABRIC_LOGS) {
FLog.d(TAG, "SynchronouslyUpdateViewOnUIThread for tag %d", reactTag);
}
scheduleMountItem(
updatePropsMountItem(reactTag, props), commitNumber, time, 0, 0, 0, 0, 0, 0);
updatePropsMountItem(reactTag, props).execute(mMountingManager);
} catch (Exception ex) {
// TODO T42943890: Fix animations in Fabric and remove this try/catch
ReactSoftException.logSoftException(
@ -771,6 +787,22 @@ public class FabricUIManager implements UIManager, LifecycleEventListener {
}
}
// Make sure surface associated with this MountItem has been started, and not stopped.
// TODO T68118357: clean up this logic and simplify this method overall
if (mountItem instanceof BatchMountItem) {
BatchMountItem batchMountItem = (BatchMountItem) mountItem;
int rootTag = batchMountItem.getRootTag();
if (mReactContextForRootTag.get(rootTag) == null) {
ReactSoftException.logSoftException(
TAG,
new ReactNoCrashSoftException(
"dispatchMountItems: skipping batched item: surface not available ["
+ rootTag
+ "]"));
continue;
}
}
// TODO: if early ViewCommand dispatch ships 100% as a feature, this can be removed.
// This try/catch catches Retryable errors that can only be thrown by ViewCommands, which
// won't be executed here in Early Dispatch mode.

Просмотреть файл

@ -73,10 +73,6 @@ std::shared_ptr<Scheduler> Binding::getScheduler() {
return scheduler_;
}
LayoutAnimationDriver *Binding::getAnimationDriver() {
return (animationDriver_ ? animationDriver_.get() : nullptr);
}
void Binding::startSurface(
jint surfaceId,
jni::alias_ref<jstring> moduleName,
@ -97,7 +93,7 @@ void Binding::startSurface(
initialProps->consume(),
{},
context,
getAnimationDriver());
animationDriver_);
}
void Binding::startSurfaceWithConstraints(
@ -144,7 +140,7 @@ void Binding::startSurfaceWithConstraints(
initialProps->consume(),
constraints,
context,
getAnimationDriver());
animationDriver_);
}
void Binding::renderTemplateToSurface(jint surfaceId, jstring uiTemplate) {
@ -214,6 +210,7 @@ void Binding::setConstraints(
void Binding::installFabricUIManager(
jlong jsContextNativePointer,
jni::alias_ref<JRuntimeExecutor::javaobject> runtimeExecutorHolder,
jni::alias_ref<jobject> javaUIManager,
EventBeatManager *eventBeatManager,
jni::alias_ref<JavaMessageQueueThread::javaobject> jsMessageQueueThread,
@ -247,8 +244,15 @@ void Binding::installFabricUIManager(
auto sharedJSMessageQueueThread =
std::make_shared<JMessageQueueThread>(jsMessageQueueThread);
bool useRuntimeExecutor =
config->getBool("react_fabric:use_shared_runtime_executor_android");
RuntimeExecutor runtimeExecutor;
if (useRuntimeExecutor) {
runtimeExecutor = runtimeExecutorHolder->cthis()->get();
} else {
Runtime *runtime = (Runtime *)jsContextNativePointer;
RuntimeExecutor runtimeExecutor =
runtimeExecutor =
[runtime, sharedJSMessageQueueThread](
std::function<void(facebook::jsi::Runtime & runtime)> &&callback) {
sharedJSMessageQueueThread->runOnQueue(
@ -256,6 +260,7 @@ void Binding::installFabricUIManager(
callback(*runtime);
});
};
}
// TODO: T31905686 Create synchronous Event Beat
jni::global_ref<jobject> localJavaUIManager = javaUIManager_;
@ -297,9 +302,10 @@ void Binding::installFabricUIManager(
toolbox.asynchronousEventBeatFactory = asynchronousBeatFactory;
if (enableLayoutAnimations_) {
animationDriver_ = std::make_unique<LayoutAnimationDriver>(this);
animationDriver_ = std::make_shared<LayoutAnimationDriver>(this);
}
scheduler_ = std::make_shared<Scheduler>(toolbox, getAnimationDriver(), this);
scheduler_ = std::make_shared<Scheduler>(
toolbox, (animationDriver_ ? animationDriver_.get() : nullptr), this);
}
void Binding::uninstallFabricUIManager() {
@ -844,11 +850,15 @@ void Binding::schedulerDidFinishTransaction(
static auto createMountItemsBatchContainer =
jni::findClassStatic(UIManagerJavaDescriptor)
->getMethod<alias_ref<JMountItem>(
jtypeArray<JMountItem::javaobject>, jint, jint)>(
jint, jtypeArray<JMountItem::javaobject>, jint, jint)>(
"createBatchMountItem");
auto batch = createMountItemsBatchContainer(
localJavaUIManager, mountItemsArray.get(), position, commitNumber);
localJavaUIManager,
surfaceId,
mountItemsArray.get(),
position,
commitNumber);
static auto scheduleMountItem = jni::findClassStatic(UIManagerJavaDescriptor)
->getMethod<void(

Просмотреть файл

@ -10,6 +10,7 @@
#include <fbjni/fbjni.h>
#include <react/animations/LayoutAnimationDriver.h>
#include <react/jni/JMessageQueueThread.h>
#include <react/jni/JRuntimeExecutor.h>
#include <react/jni/ReadableNativeMap.h>
#include <react/scheduler/Scheduler.h>
#include <react/scheduler/SchedulerDelegate.h>
@ -50,6 +51,7 @@ class Binding : public jni::HybridClass<Binding>,
void installFabricUIManager(
jlong jsContextNativePointer,
jni::alias_ref<JRuntimeExecutor::javaobject> runtimeExecutorHolder,
jni::alias_ref<jobject> javaUIManager,
EventBeatManager *eventBeatManager,
jni::alias_ref<JavaMessageQueueThread::javaobject> jsMessageQueueThread,
@ -110,7 +112,7 @@ class Binding : public jni::HybridClass<Binding>,
virtual void onAnimationStarted() override;
virtual void onAllAnimationsComplete() override;
LayoutAnimationDriver *getAnimationDriver();
std::unique_ptr<LayoutAnimationDriver> animationDriver_;
std::shared_ptr<LayoutAnimationDriver> animationDriver_;
std::shared_ptr<Scheduler> scheduler_;
std::mutex schedulerMutex_;

Просмотреть файл

@ -26,13 +26,14 @@ import com.facebook.systrace.Systrace;
@DoNotStrip
public class BatchMountItem implements MountItem {
private final int mRootTag;
@NonNull private final MountItem[] mMountItems;
private final int mSize;
private final int mCommitNumber;
public BatchMountItem(MountItem[] items, int size, int commitNumber) {
public BatchMountItem(int rootTag, MountItem[] items, int size, int commitNumber) {
if (items == null) {
throw new NullPointerException();
}
@ -40,6 +41,7 @@ public class BatchMountItem implements MountItem {
throw new IllegalArgumentException(
"Invalid size received by parameter size: " + size + " items.size = " + items.length);
}
mRootTag = rootTag;
mMountItems = items;
mSize = size;
mCommitNumber = commitNumber;
@ -68,6 +70,10 @@ public class BatchMountItem implements MountItem {
Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE);
}
public int getRootTag() {
return mRootTag;
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();

Просмотреть файл

@ -16,6 +16,7 @@ import android.media.MediaMetadataRetriever;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
@ -47,6 +48,7 @@ import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
// TODO #6015104: rename to something less iOSish
@ -68,21 +70,32 @@ public class CameraRollManager extends NativeCameraRollManagerSpec {
private static final String ASSET_TYPE_VIDEOS = "Videos";
private static final String ASSET_TYPE_ALL = "All";
private static final String[] PROJECTION = {
private static final String SELECTION_BUCKET = Images.Media.BUCKET_DISPLAY_NAME + " = ?";
private static final String SELECTION_DATE_TAKEN = Images.Media.DATE_TAKEN + " < ?";
private static final String SELECTION_MEDIA_SIZE = Images.Media.SIZE + " < ?";
private static final int IMAGES_MEDIA_LATITUDE_LONGITUDE_DEPRECATED_API_LEVEL = 29;
private static final String[] PROJECTION_LIST;
static {
ArrayList<String> projection_list =
new ArrayList<>(
Arrays.asList(
Images.Media._ID,
Images.Media.MIME_TYPE,
Images.Media.BUCKET_DISPLAY_NAME,
Images.Media.DATE_TAKEN,
MediaStore.MediaColumns.WIDTH,
MediaStore.MediaColumns.HEIGHT,
Images.Media.LONGITUDE,
Images.Media.LATITUDE,
MediaStore.MediaColumns.DATA
};
private static final String SELECTION_BUCKET = Images.Media.BUCKET_DISPLAY_NAME + " = ?";
private static final String SELECTION_DATE_TAKEN = Images.Media.DATE_TAKEN + " < ?";
private static final String SELECTION_MEDIA_SIZE = Images.Media.SIZE + " < ?";
MediaStore.MediaColumns.DATA));
if (Build.VERSION.SDK_INT < IMAGES_MEDIA_LATITUDE_LONGITUDE_DEPRECATED_API_LEVEL) {
projection_list.add(Images.Media.LATITUDE);
projection_list.add(Images.Media.LONGITUDE);
PROJECTION_LIST = projection_list.toArray(new String[0]);
} else {
PROJECTION_LIST = projection_list.toArray(new String[0]);
}
}
public CameraRollManager(ReactApplicationContext reactContext) {
super(reactContext);
@ -351,7 +364,7 @@ public class CameraRollManager extends NativeCameraRollManagerSpec {
Cursor media =
resolver.query(
MediaStore.Files.getContentUri("external"),
PROJECTION,
PROJECTION_LIST,
selection.toString(),
selectionArgs.toArray(new String[selectionArgs.size()]),
Images.Media.DATE_TAKEN
@ -413,7 +426,9 @@ public class CameraRollManager extends NativeCameraRollManagerSpec {
resolver, media, node, idIndex, widthIndex, heightIndex, dataIndex, mimeTypeIndex);
if (imageInfoSuccess) {
putBasicNodeInfo(media, node, mimeTypeIndex, groupNameIndex, dateTakenIndex);
if (Build.VERSION.SDK_INT < IMAGES_MEDIA_LATITUDE_LONGITUDE_DEPRECATED_API_LEVEL) {
putLocationInfo(media, node, longitudeIndex, latitudeIndex);
}
edge.putMap("node", node);
edges.pushMap(edge);

Просмотреть файл

@ -19,7 +19,6 @@ import com.facebook.react.bridge.JSIModule;
import com.facebook.react.bridge.JavaScriptContextHolder;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.common.ReactConstants;
import com.facebook.react.config.ReactFeatureFlags;
import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder;
import com.facebook.react.turbomodule.core.interfaces.TurboModule;
import com.facebook.react.turbomodule.core.interfaces.TurboModuleRegistry;
@ -142,15 +141,6 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry {
/*
* Always return null after cleanup has started, so that getModule(moduleName) returns null.
*/
if (ReactFeatureFlags.enableTurboModuleDebugLogs) {
// TODO(T46487253): Remove after task is closed
FLog.e(
ReactConstants.TAG,
"TurboModuleManager.getOrMaybeCreateTurboModuleHolder: Tried to require TurboModule "
+ moduleName
+ " after cleanup initiated");
}
return null;
}

Просмотреть файл

@ -104,8 +104,8 @@ public class DisplayMetricsHolder {
}
public static Map<String, Map<String, Object>> getDisplayMetricsMap(double fontScale) {
Assertions.assertNotNull(
sWindowDisplayMetrics != null || sScreenDisplayMetrics != null,
Assertions.assertCondition(
sWindowDisplayMetrics != null && sScreenDisplayMetrics != null,
"DisplayMetricsHolder must be initialized with initDisplayMetricsIfNotInitialized or initDisplayMetrics");
final Map<String, Map<String, Object>> result = new HashMap<>();
result.put("windowPhysicalPixels", getPhysicalPixelsMap(sWindowDisplayMetrics, fontScale));
@ -114,8 +114,8 @@ public class DisplayMetricsHolder {
}
public static WritableNativeMap getDisplayMetricsNativeMap(double fontScale) {
Assertions.assertNotNull(
sWindowDisplayMetrics != null || sScreenDisplayMetrics != null,
Assertions.assertCondition(
sWindowDisplayMetrics != null && sScreenDisplayMetrics != null,
"DisplayMetricsHolder must be initialized with initDisplayMetricsIfNotInitialized or initDisplayMetrics");
final WritableNativeMap result = new WritableNativeMap();
result.putMap(

Просмотреть файл

@ -73,6 +73,10 @@ public class ReactSliderManager extends SimpleViewManager<ReactSlider>
YogaMeasureMode heightMode) {
if (!mMeasured) {
SeekBar reactSlider = new ReactSlider(getThemedContext(), null, STYLE);
// reactSlider is used for measurements purposes, it is not necessary to set a
// StateListAnimator.
// It is not safe to access StateListAnimator from a background thread.
reactSlider.setStateListAnimator(null);
final int spec =
View.MeasureSpec.makeMeasureSpec(
ViewGroup.LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED);

Просмотреть файл

@ -41,16 +41,12 @@ void JReactMarker::logPerfMarker(
const char *tag) {
switch (markerId) {
case ReactMarker::RUN_JS_BUNDLE_START:
LOG(ERROR) << "logMarker RUN_JS_BUNDLE_START"; // TODO T62192299: delete
JReactMarker::logMarker("RUN_JS_BUNDLE_START", tag);
break;
case ReactMarker::RUN_JS_BUNDLE_STOP:
LOG(ERROR) << "logMarker RUN_JS_BUNDLE_END"; // TODO T62192299: delete
JReactMarker::logMarker("RUN_JS_BUNDLE_END", tag);
break;
case ReactMarker::CREATE_REACT_CONTEXT_STOP:
LOG(ERROR)
<< "logMarker CREATE_REACT_CONTEXT_END"; // TODO T62192299: delete
JReactMarker::logMarker("CREATE_REACT_CONTEXT_END");
break;
case ReactMarker::JS_BUNDLE_STRING_CONVERT_START:

Просмотреть файл

@ -149,6 +149,7 @@ rn_xplat_cxx_library(
"//xplat/folly:headers_only",
"//xplat/folly:memory",
"//xplat/folly:molly",
"//xplat/jsi:jsi",
react_native_xplat_target("callinvoker:callinvoker"),
react_native_xplat_target("jsinspector:jsinspector"),
react_native_xplat_target("microprofiler:microprofiler"),

Просмотреть файл

@ -222,7 +222,11 @@ ModuleRegistry &Instance::getModuleRegistry() {
}
void Instance::handleMemoryPressure(int pressureLevel) {
if (nativeToJsBridge_) {
// This class resets `nativeToJsBridge_` only in the destructor,
// hence a race is not possible there.
nativeToJsBridge_->handleMemoryPressure(pressureLevel);
}
}
std::shared_ptr<CallInvoker> Instance::getJSCallInvoker() {

Просмотреть файл

@ -11,6 +11,7 @@
#include <folly/MoveWrapper.h>
#include <folly/json.h>
#include <glog/logging.h>
#include <jsi/jsi.h>
#include <reactperflogger/BridgeNativeModulePerfLogger.h>
#include "Instance.h"
@ -337,17 +338,35 @@ std::shared_ptr<CallInvoker> NativeToJsBridge::getDecoratedNativeCallInvoker(
}
RuntimeExecutor NativeToJsBridge::getRuntimeExecutor() {
auto runtimeExecutor =
[this, isDestroyed = m_destroyed](
std::function<void(jsi::Runtime & runtime)> &&callback) {
auto runtimeExecutor = [this, isDestroyed = m_destroyed](
std::function<void(jsi::Runtime & runtime)>
&&callback) {
if (*isDestroyed) {
return;
}
runOnExecutorQueue(
[callback = std::move(callback)](JSExecutor *executor) {
jsi::Runtime *runtime =
(jsi::Runtime *)executor->getJavaScriptContext();
runOnExecutorQueue([callback = std::move(callback)](JSExecutor *executor) {
jsi::Runtime *runtime = (jsi::Runtime *)executor->getJavaScriptContext();
try {
callback(*runtime);
} catch (jsi::JSError &originalError) {
auto errorUtils = runtime->global().getProperty(*runtime, "ErrorUtils");
if (errorUtils.isUndefined() || !errorUtils.isObject() ||
!errorUtils.getObject(*runtime).hasProperty(
*runtime, "reportFatalError")) {
// ErrorUtils was not set up. This probably means the bundle didn't
// load properly.
throw jsi::JSError(
*runtime,
"ErrorUtils is not set up properly. Something probably went wrong trying to load the JS bundle. Trying to report error " +
originalError.getMessage(),
originalError.getStack());
}
// TODO(janzer): Rewrite this function to return the processed error
// instead of just reporting it through the native module
auto func = errorUtils.asObject(*runtime).getPropertyAsFunction(
*runtime, "reportFatalError");
func.call(*runtime, originalError.value(), jsi::Value(true));
}
});
};
return runtimeExecutor;

Просмотреть файл

@ -44,4 +44,5 @@ Pod::Spec.new do |s|
s.dependency "React-callinvoker", version
s.dependency "React-runtimeexecutor", version
s.dependency "React-perflogger", version
s.dependency "React-jsi", version
end

Просмотреть файл

@ -92,7 +92,9 @@ ViewProps::ViewProps(ViewProps const &sourceProps, RawProps const &rawProps)
rawProps,
"collapsable",
sourceProps.collapsable,
true)){};
true)),
elevation(
convertRawProp(rawProps, "elevation", sourceProps.elevation, {})){};
#pragma mark - Convenience Methods

Просмотреть файл

@ -59,6 +59,8 @@ class ViewProps : public YogaStylableProps, public AccessibilityProps {
bool collapsable{true};
int elevation{};
#pragma mark - Convenience Methods
BorderMetrics resolveBorderMetrics(LayoutMetrics const &layoutMetrics) const;

Просмотреть файл

@ -43,6 +43,7 @@ void ViewShadowNode::initialize() noexcept {
viewProps.pointerEvents == PointerEventsMode::None ||
!viewProps.nativeId.empty() || viewProps.accessible ||
viewProps.opacity != 1.0 || viewProps.transform != Transform{} ||
viewProps.elevation != 0 ||
(viewProps.zIndex != 0 &&
viewProps.yogaStyle.positionType() == YGPositionTypeAbsolute) ||
viewProps.getClipsContentToBounds() ||

Просмотреть файл

@ -21,7 +21,7 @@ namespace react {
MountingCoordinator::MountingCoordinator(
ShadowTreeRevision baseRevision,
MountingOverrideDelegate *delegate)
std::weak_ptr<MountingOverrideDelegate const> delegate)
: surfaceId_(baseRevision.getRootShadowNode().getSurfaceId()),
baseRevision_(baseRevision),
mountingOverrideDelegate_(delegate) {
@ -115,8 +115,10 @@ better::optional<MountingTransaction> MountingCoordinator::pullTransaction()
const {
std::lock_guard<std::mutex> lock(mutex_);
bool shouldOverridePullTransaction = mountingOverrideDelegate_ != nullptr &&
mountingOverrideDelegate_->shouldOverridePullTransaction();
auto mountingOverrideDelegate = mountingOverrideDelegate_.lock();
bool shouldOverridePullTransaction = mountingOverrideDelegate &&
mountingOverrideDelegate->shouldOverridePullTransaction();
if (!shouldOverridePullTransaction && !lastRevision_.has_value()) {
return {};
@ -143,7 +145,7 @@ better::optional<MountingTransaction> MountingCoordinator::pullTransaction()
// even if there's no `lastRevision_`. Consider cases of animation frames
// in between React tree updates.
if (shouldOverridePullTransaction) {
transaction = mountingOverrideDelegate_->pullTransaction(
transaction = mountingOverrideDelegate->pullTransaction(
surfaceId_, number_, telemetry, std::move(diffMutations));
} else if (lastRevision_.hasValue()) {
transaction = MountingTransaction{

Просмотреть файл

@ -40,7 +40,7 @@ class MountingCoordinator final {
*/
MountingCoordinator(
ShadowTreeRevision baseRevision,
MountingOverrideDelegate *delegate);
std::weak_ptr<MountingOverrideDelegate const> delegate);
/*
* Returns the id of the surface that the coordinator belongs to.
@ -102,7 +102,7 @@ class MountingCoordinator final {
mutable better::optional<ShadowTreeRevision> lastRevision_{};
mutable MountingTransaction::Number number_{0};
mutable std::condition_variable signal_;
mutable MountingOverrideDelegate *mountingOverrideDelegate_{nullptr};
std::weak_ptr<MountingOverrideDelegate const> mountingOverrideDelegate_;
#ifdef RN_SHADOW_TREE_INTROSPECTION
void validateTransactionAgainstStubViewTree(

Просмотреть файл

@ -222,7 +222,7 @@ ShadowTree::ShadowTree(
LayoutContext const &layoutContext,
RootComponentDescriptor const &rootComponentDescriptor,
ShadowTreeDelegate const &delegate,
MountingOverrideDelegate *mountingOverrideDelegate)
std::weak_ptr<MountingOverrideDelegate const> mountingOverrideDelegate)
: surfaceId_(surfaceId), delegate_(delegate) {
const auto noopEventEmitter = std::make_shared<const ViewEventEmitter>(
nullptr, -1, std::shared_ptr<const EventDispatcher>());

Просмотреть файл

@ -40,7 +40,7 @@ class ShadowTree final {
LayoutContext const &layoutContext,
RootComponentDescriptor const &rootComponentDescriptor,
ShadowTreeDelegate const &delegate,
MountingOverrideDelegate *mountingOverrideDelegate);
std::weak_ptr<MountingOverrideDelegate const> mountingOverrideDelegate);
~ShadowTree();

Просмотреть файл

@ -104,7 +104,7 @@ TEST(StateReconciliationTest, testStateReconciliation) {
LayoutContext{},
rootComponentDescriptor,
shadowTreeDelegate,
nullptr};
{}};
shadowTree.commit(
[&](RootShadowNode::Shared const &oldRootShadowNode) {

Просмотреть файл

@ -127,6 +127,7 @@ Scheduler::~Scheduler() {
// The thread-safety of this operation is guaranteed by this requirement.
uiManager_->setDelegate(nullptr);
uiManager_->setAnimationDelegate(nullptr);
// Then, let's verify that the requirement was satisfied.
auto surfaceIds = std::vector<SurfaceId>{};
@ -173,7 +174,8 @@ void Scheduler::startSurface(
const folly::dynamic &initialProps,
const LayoutConstraints &layoutConstraints,
const LayoutContext &layoutContext,
MountingOverrideDelegate *mountingOverrideDelegate) const {
std::weak_ptr<MountingOverrideDelegate const> mountingOverrideDelegate)
const {
SystraceSection s("Scheduler::startSurface");
auto shadowTree = std::make_unique<ShadowTree>(

Просмотреть файл

@ -46,7 +46,8 @@ class Scheduler final : public UIManagerDelegate {
const folly::dynamic &initialProps,
const LayoutConstraints &layoutConstraints = {},
const LayoutContext &layoutContext = {},
MountingOverrideDelegate *mountingOverrideDelegate = nullptr) const;
std::weak_ptr<MountingOverrideDelegate const> mountingOverrideDelegate =
{}) const;
void renderTemplateToSurface(
SurfaceId surfaceId,

Просмотреть файл

@ -318,8 +318,7 @@ void UIManager::shadowTreeDidFinishTransaction(
#pragma mark - UIManagerAnimationDelegate
void UIManager::setAnimationDelegate(
UIManagerAnimationDelegate *delegate) const {
void UIManager::setAnimationDelegate(UIManagerAnimationDelegate *delegate) {
animationDelegate_ = delegate;
}

Просмотреть файл

@ -46,7 +46,7 @@ class UIManager final : public ShadowTreeDelegate {
* The delegate is stored as a raw pointer, so the owner must null
* the pointer before being destroyed.
*/
void setAnimationDelegate(UIManagerAnimationDelegate *delegate) const;
void setAnimationDelegate(UIManagerAnimationDelegate *delegate);
void animationTick();
@ -140,7 +140,7 @@ class UIManager final : public ShadowTreeDelegate {
SharedComponentDescriptorRegistry componentDescriptorRegistry_;
UIManagerDelegate *delegate_;
mutable UIManagerAnimationDelegate *animationDelegate_{nullptr};
UIManagerAnimationDelegate *animationDelegate_{nullptr};
UIManagerBinding *uiManagerBinding_;
ShadowTreeRegistry shadowTreeRegistry_{};
};

Просмотреть файл

@ -401,32 +401,63 @@ JSError::JSError(std::string what, Runtime& rt, Value&& value)
}
void JSError::setValue(Runtime& rt, Value&& value) {
value_ = std::make_shared<jsi::Value>(std::move(value));
value_ = std::make_shared<Value>(std::move(value));
try {
if ((message_.empty() || stack_.empty()) && value_->isObject()) {
auto obj = value_->getObject(rt);
if (message_.empty()) {
jsi::Value message = obj.getProperty(rt, "message");
if (!message.isUndefined()) {
message_ =
callGlobalFunction(rt, "String", message).getString(rt).utf8(rt);
try {
Value message = obj.getProperty(rt, "message");
if (!message.isUndefined() && !message.isString()) {
message = callGlobalFunction(rt, "String", message);
}
if (message.isString()) {
message_ = message.getString(rt).utf8(rt);
} else if (!message.isUndefined()) {
message_ = "String(e.message) is a " + kindToString(message, &rt);
}
} catch (const std::exception& ex) {
message_ = std::string("[Exception while creating message string: ") +
ex.what() + "]";
}
}
if (stack_.empty()) {
jsi::Value stack = obj.getProperty(rt, "stack");
if (!stack.isUndefined()) {
stack_ =
callGlobalFunction(rt, "String", stack).getString(rt).utf8(rt);
try {
Value stack = obj.getProperty(rt, "stack");
if (!stack.isUndefined() && !stack.isString()) {
stack = callGlobalFunction(rt, "String", stack);
}
if (stack.isString()) {
stack_ = stack.getString(rt).utf8(rt);
} else if (!stack.isUndefined()) {
stack_ = "String(e.stack) is a " + kindToString(stack, &rt);
}
} catch (const std::exception& ex) {
message_ = std::string("[Exception while creating stack string: ") +
ex.what() + "]";
}
}
}
if (message_.empty()) {
message_ =
callGlobalFunction(rt, "String", *value_).getString(rt).utf8(rt);
try {
if (value_->isString()) {
message_ = value_->getString(rt).utf8(rt);
} else {
Value message = callGlobalFunction(rt, "String", *value_);
if (message.isString()) {
message_ = message.getString(rt).utf8(rt);
} else {
message_ = "String(e) is a " + kindToString(message, &rt);
}
}
} catch (const std::exception& ex) {
message_ = std::string("[Exception while creating message string: ") +
ex.what() + "]";
}
}
if (stack_.empty()) {
@ -436,13 +467,6 @@ void JSError::setValue(Runtime& rt, Value&& value) {
if (what_.empty()) {
what_ = message_ + "\n\n" + stack_;
}
} catch (const std::exception& ex) {
message_ = std::string("[Exception while creating message string: ") +
ex.what() + "]";
stack_ = std::string("Exception while creating stack string: ") +
ex.what() + "]";
what_ =
std::string("Exception while getting value fields: ") + ex.what() + "]";
} catch (...) {
message_ = "[Exception caught creating message string]";
stack_ = "[Exception caught creating stack string]";

Просмотреть файл

@ -981,19 +981,6 @@ TEST_P(JSITest, JSErrorsCanBeConstructedWithStack) {
}
TEST_P(JSITest, JSErrorDoesNotInfinitelyRecurse) {
Value globalString = rt.global().getProperty(rt, "String");
rt.global().setProperty(rt, "String", Value::undefined());
try {
eval("throw Error('whoops')");
FAIL() << "expected exception";
} catch (const JSError& ex) {
EXPECT_EQ(
ex.getMessage(),
"[Exception while creating message string: callGlobalFunction: "
"JS global property 'String' is undefined, expected a Function]");
}
rt.global().setProperty(rt, "String", globalString);
Value globalError = rt.global().getProperty(rt, "Error");
rt.global().setProperty(rt, "Error", Value::undefined());
try {
@ -1272,6 +1259,70 @@ TEST_P(JSITest, SymbolTest) {
EXPECT_FALSE(Value::strictEquals(rt, eval("Symbol('a')"), eval("'a'")));
}
TEST_P(JSITest, JSErrorTest) {
// JSError creation can lead to further errors. Make sure these
// cases are handled and don't cause weird crashes or other issues.
//
// Getting message property can throw
EXPECT_THROW(
eval("var GetMessageThrows = {get message() { throw Error('ex'); }};"
"throw GetMessageThrows;"),
JSIException);
EXPECT_THROW(
eval("var GetMessageThrows = {get message() { throw GetMessageThrows; }};"
"throw GetMessageThrows;"),
JSIException);
// Converting exception message to String can throw
EXPECT_THROW(
eval(
"Object.defineProperty("
" globalThis, 'String', {configurable:true, get() { var e = Error(); e.message = 23; throw e; }});"
"var e = Error();"
"e.message = 17;"
"throw e;"),
JSIException);
EXPECT_THROW(
eval(
"var e = Error();"
"Object.defineProperty("
" e, 'message', {configurable:true, get() { throw Error('getter'); }});"
"throw e;"),
JSIException);
EXPECT_THROW(
eval("var e = Error();"
"String = function() { throw Error('ctor'); };"
"throw e;"),
JSIException);
// Converting an exception message to String can return a non-String
EXPECT_THROW(
eval("String = function() { return 42; };"
"var e = Error();"
"e.message = 17;"
"throw e;"),
JSIException);
// Exception can be non-Object
EXPECT_THROW(eval("throw 17;"), JSIException);
EXPECT_THROW(eval("throw undefined;"), JSIException);
// Converting exception with no message or stack property to String can throw
EXPECT_THROW(
eval("var e = {toString() { throw new Error('errstr'); }};"
"throw e;"),
JSIException);
}
//----------------------------------------------------------------------
// Test that multiple levels of delegation in DecoratedHostObjects works.

Просмотреть файл

@ -40,7 +40,6 @@ class JSI_EXPORT ObjCTurboModule : public TurboModule {
id<RCTTurboModule> instance;
std::shared_ptr<CallInvoker> jsInvoker;
std::shared_ptr<CallInvoker> nativeInvoker;
// Does the NativeModule dispatch async methods to the JS thread?
bool isSyncModule;
};
@ -61,16 +60,20 @@ class JSI_EXPORT ObjCTurboModule : public TurboModule {
void setMethodArgConversionSelector(NSString *methodName, int argIndex, NSString *fnName);
private:
// Does the NativeModule dispatch async methods to the JS thread?
const bool isSyncModule_;
/**
* TODO(ramanpreet):
* Investigate an optimization that'll let us get rid of this NSMutableDictionary.
*/
NSMutableDictionary<NSString *, NSMutableArray *> *methodArgConversionSelectors_;
NSDictionary<NSString *, NSArray<NSString *> *> *methodArgumentTypeNames_;
const bool isSyncModule_;
bool isMethodSync(TurboModuleMethodValueKind returnType);
NSString *getArgumentTypeName(NSString *methodName, int argIndex);
bool isMethodSync(TurboModuleMethodValueKind returnType);
BOOL hasMethodArgConversionSelector(NSString *methodName, int argIndex);
SEL getMethodArgConversionSelector(NSString *methodName, int argIndex);
NSString *getArgumentTypeName(NSString *methodName, int argIndex);
NSInvocation *getMethodInvocation(
jsi::Runtime &runtime,
TurboModuleMethodValueKind returnType,
@ -86,9 +89,6 @@ class JSI_EXPORT ObjCTurboModule : public TurboModule {
NSInvocation *inv,
NSMutableArray *retainedObjectsForInvocation);
BOOL hasMethodArgConversionSelector(NSString *methodName, int argIndex);
SEL getMethodArgConversionSelector(NSString *methodName, int argIndex);
using PromiseInvocationBlock = void (^)(RCTPromiseResolveBlock resolveWrapper, RCTPromiseRejectBlock rejectWrapper);
jsi::Value
createPromise(jsi::Runtime &runtime, std::shared_ptr<react::CallInvoker> jsInvoker, PromiseInvocationBlock invoke);

Просмотреть файл

@ -361,7 +361,7 @@ jsi::Value ObjCTurboModule::performMethodInvocation(
};
if (wasMethodSync) {
nativeInvoker_->invokeSync([block]() -> void { block(); });
block();
} else {
asyncCallCounter = getUniqueId();
TurboModulePerfLogger::asyncMethodCallDispatch(moduleName, methodName);

Просмотреть файл

@ -11,6 +11,8 @@
#import "RCTTurboModule.h"
#import <ReactCommon/RuntimeExecutor.h>
@protocol RCTTurboModuleManagerDelegate <NSObject>
// TODO: Move to xplat codegen.
@ -45,7 +47,7 @@
delegate:(id<RCTTurboModuleManagerDelegate>)delegate
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker;
- (void)installJSBindingWithRuntime:(facebook::jsi::Runtime *)runtime;
- (void)installJSBindingWithRuntimeExecutor:(facebook::react::RuntimeExecutor)runtimeExecutor;
- (void)invalidate;

Просмотреть файл

@ -21,6 +21,7 @@
#import <React/RCTModuleData.h>
#import <React/RCTPerformanceLogger.h>
#import <React/RCTUtils.h>
#import <ReactCommon/RuntimeExecutor.h>
#import <ReactCommon/TurboCxxModule.h>
#import <ReactCommon/TurboModuleBinding.h>
#import <ReactCommon/TurboModulePerfLogger.h>
@ -147,7 +148,6 @@ static Class getFallbackClassFromName(const char *name)
}
@implementation RCTTurboModuleManager {
jsi::Runtime *_runtime;
std::shared_ptr<CallInvoker> _jsInvoker;
__weak id<RCTTurboModuleManagerDelegate> _delegate;
__weak RCTBridge *_bridge;
@ -640,18 +640,15 @@ static Class getFallbackClassFromName(const char *name)
return requiresMainQueueSetup;
}
- (void)installJSBindingWithRuntime:(jsi::Runtime *)runtime
- (void)installJSBindingWithRuntimeExecutor:(facebook::react::RuntimeExecutor)runtimeExecutor
{
_runtime = runtime;
if (!_runtime) {
if (!runtimeExecutor) {
// jsi::Runtime doesn't exist when attached to Chrome debugger.
return;
}
__weak __typeof(self) weakSelf = self;
TurboModuleBinding::install(*_runtime, [weakSelf](const std::string &name) -> std::shared_ptr<TurboModule> {
auto turboModuleProvider = [weakSelf](const std::string &name) -> std::shared_ptr<react::TurboModule> {
if (!weakSelf) {
return nullptr;
}
@ -686,6 +683,10 @@ static Class getFallbackClassFromName(const char *name)
}
return turboModule;
};
runtimeExecutor([turboModuleProvider = std::move(turboModuleProvider)](jsi::Runtime &runtime) {
react::TurboModuleBinding::install(runtime, std::move(turboModuleProvider));
});
}

Просмотреть файл

@ -8,6 +8,7 @@
#import "RCTSampleTurboModule.h"
#import <React/RCTUIKit.h> // TODO(macOS GH#774)
#import <React/RCTUtils.h>
using namespace facebook::react;
@ -45,6 +46,8 @@ RCT_EXPORT_MODULE()
- (NSDictionary *)getConstants
{
__block NSDictionary *constants;
RCTUnsafeExecuteOnMainQueueSync(^{
#if !TARGET_OS_OSX // TODO(macOS GH#774)
UIScreen *mainScreen = UIScreen.mainScreen;
CGSize screenSize = mainScreen.bounds.size;
@ -53,11 +56,14 @@ RCT_EXPORT_MODULE()
CGSize screenSize = mainScreen.frame.size;
#endif // ]TODO(macOS GH#774)
return @{
constants = @{
@"const1" : @YES,
@"const2" : @(screenSize.width),
@"const3" : @"something",
};
});
return constants;
}
// TODO: Remove once fully migrated to TurboModule.

Просмотреть файл

@ -144,7 +144,7 @@
"eslint-plugin-react-hooks": "^3.0.0",
"eslint-plugin-react-native": "3.8.1",
"eslint-plugin-relay": "1.7.1",
"flow-bin": "^0.125.1",
"flow-bin": "^0.126.1",
"flow-remove-types": "1.2.3",
"hermes-engine-darwin": "~0.5.0",
"jest": "^26.0.1",

Просмотреть файл

@ -69,4 +69,4 @@ untyped-import
untyped-type-import
[version]
^0.125.0
^0.126.1

210
yarn.lock
Просмотреть файл

@ -1950,6 +1950,14 @@ cache-base@^1.0.1:
union-value "^1.0.0"
unset-value "^1.0.0"
call-bind@^1.0.0, call-bind@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
dependencies:
function-bind "^1.1.1"
get-intrinsic "^1.0.2"
caller-callsite@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
@ -2514,7 +2522,7 @@ defaults@^1.0.3:
dependencies:
clone "^1.0.2"
define-properties@^1.1.2:
define-properties@^1.1.2, define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
@ -2694,6 +2702,29 @@ errorhandler@^1.5.0:
accepts "~1.3.7"
escape-html "~1.0.3"
es-abstract@^1.10.0:
version "1.18.5"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.5.tgz#9b10de7d4c206a3581fd5b2124233e04db49ae19"
integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==
dependencies:
call-bind "^1.0.2"
es-to-primitive "^1.2.1"
function-bind "^1.1.1"
get-intrinsic "^1.1.1"
has "^1.0.3"
has-symbols "^1.0.2"
internal-slot "^1.0.3"
is-callable "^1.2.3"
is-negative-zero "^2.0.1"
is-regex "^1.1.3"
is-string "^1.0.6"
object-inspect "^1.11.0"
object-keys "^1.1.1"
object.assign "^4.1.2"
string.prototype.trimend "^1.0.4"
string.prototype.trimstart "^1.0.4"
unbox-primitive "^1.0.1"
es-abstract@^1.11.0:
version "1.13.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
@ -2726,6 +2757,15 @@ es-to-primitive@^1.1.1, es-to-primitive@^1.2.0:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
es-to-primitive@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
dependencies:
is-callable "^1.1.4"
is-date-object "^1.0.1"
is-symbol "^1.0.2"
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@ -3279,10 +3319,10 @@ flat-cache@^1.2.1:
rimraf "~2.6.2"
write "^0.2.1"
flow-bin@^0.125.1:
version "0.125.1"
resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.125.1.tgz#7edbc71e7dc39ddef18086ef75c714bbf1c5917f"
integrity sha512-jEury9NTXylxQEOAXLWEE945BjBwYcMwwKVnb+5XORNwMQE7i5hQYF0ysYfsaaYOa7rW/U16rHBfwLuaZfWV7A==
flow-bin@^0.126.1:
version "0.126.1"
resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.126.1.tgz#2726595e1891dc35b379b5994627432df4ead52c"
integrity sha512-RI05x7rVzruRVJQN3M4vLEjZMwUHJKhGz9FmL8HN7WiSo66/131EyJS6Vo8PkKyM2pgT9GRWfGP/tXlqS54XUg==
flow-parser@0.*:
version "0.89.0"
@ -3419,6 +3459,15 @@ get-caller-file@^2.0.1:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
dependencies:
function-bind "^1.1.1"
has "^1.0.3"
has-symbols "^1.0.1"
get-port@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/get-port/-/get-port-2.1.0.tgz#8783f9dcebd1eea495a334e1a6a251e78887ab1a"
@ -3560,6 +3609,11 @@ has-ansi@^2.0.0:
dependencies:
ansi-regex "^2.0.0"
has-bigints@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@ -3575,6 +3629,18 @@ has-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
has-symbols@^1.0.1, has-symbols@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
has-tostringtag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
dependencies:
has-symbols "^1.0.2"
has-unicode@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
@ -3776,6 +3842,15 @@ inquirer@^5.2.0:
strip-ansi "^4.0.0"
through "^2.3.6"
internal-slot@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
dependencies:
get-intrinsic "^1.1.0"
has "^1.0.3"
side-channel "^1.0.4"
interpret@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
@ -3817,6 +3892,21 @@ is-arrayish@^0.2.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
is-bigint@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
dependencies:
has-bigints "^1.0.1"
is-boolean-object@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
dependencies:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@ -3827,6 +3917,11 @@ is-callable@^1.1.3, is-callable@^1.1.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
is-callable@^1.2.3:
version "1.2.4"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
@ -3910,6 +4005,18 @@ is-generator-fn@^2.0.0:
resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.0.0.tgz#038c31b774709641bda678b1f06a4e3227c10b3e"
integrity sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g==
is-negative-zero@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
is-number-object@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
dependencies:
has-tostringtag "^1.0.0"
is-number@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@ -3946,6 +4053,14 @@ is-regex@^1.0.4:
dependencies:
has "^1.0.1"
is-regex@^1.1.3:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
dependencies:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
is-resolvable@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
@ -3961,6 +4076,13 @@ is-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
is-string@^1.0.5, is-string@^1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
dependencies:
has-tostringtag "^1.0.0"
is-symbol@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
@ -3968,6 +4090,13 @@ is-symbol@^1.0.2:
dependencies:
has-symbols "^1.0.0"
is-symbol@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
dependencies:
has-symbols "^1.0.2"
is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@ -5671,7 +5800,12 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
object-keys@^1.0.11:
object-inspect@^1.11.0, object-inspect@^1.9.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1"
integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==
object-keys@^1.0.11, object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@ -5698,6 +5832,16 @@ object.assign@^4.1.0:
has-symbols "^1.0.0"
object-keys "^1.0.11"
object.assign@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
dependencies:
call-bind "^1.0.0"
define-properties "^1.1.3"
has-symbols "^1.0.1"
object-keys "^1.1.1"
object.fromentries@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.0.tgz#49a543d92151f8277b3ac9600f1e930b189d30ab"
@ -6348,6 +6492,14 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
regexp.prototype.flags@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
regexpp@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
@ -6809,6 +6961,15 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
dependencies:
call-bind "^1.0.0"
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@ -7098,6 +7259,22 @@ string.prototype.matchall@^2.0.0:
has-symbols "^1.0.0"
regexp.prototype.flags "^1.2.0"
string.prototype.trimend@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
string.prototype.trimstart@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@ -7487,6 +7664,16 @@ ultron@~1.1.0:
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==
unbox-primitive@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
dependencies:
function-bind "^1.1.1"
has-bigints "^1.0.1"
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@ -7695,6 +7882,17 @@ whatwg-url@^8.0.0:
tr46 "^2.0.0"
webidl-conversions "^5.0.0"
which-boxed-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
dependencies:
is-bigint "^1.0.1"
is-boolean-object "^1.1.0"
is-number-object "^1.0.4"
is-string "^1.0.5"
is-symbol "^1.0.3"
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"