mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Compare commits
57
Commits
@@ -46,7 +46,7 @@ references:
|
||||
# Dependency Anchors
|
||||
# -------------------------
|
||||
dependency_versions:
|
||||
xcode_version: &xcode_version "14.2.0"
|
||||
xcode_version: &xcode_version "14.3.0"
|
||||
nodelts_image: &nodelts_image "cimg/node:18.12.1"
|
||||
nodeprevlts_image: &nodeprevlts_image "cimg/node:16.18.1"
|
||||
|
||||
@@ -620,7 +620,7 @@ jobs:
|
||||
- run:
|
||||
name: Run Ruby Tests
|
||||
command: |
|
||||
cd scripts
|
||||
cd packages/react-native/scripts
|
||||
sh run_ruby_tests.sh
|
||||
- run_yarn
|
||||
- *attach_hermes_workspace
|
||||
|
||||
+4
-4
@@ -3,12 +3,12 @@ GEM
|
||||
specs:
|
||||
CFPropertyList (3.0.6)
|
||||
rexml
|
||||
activesupport (7.0.4.2)
|
||||
activesupport (7.0.4.3)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
addressable (2.8.1)
|
||||
addressable (2.8.3)
|
||||
public_suffix (>= 2.0.2, < 6.0)
|
||||
algoliasearch (1.27.5)
|
||||
httpclient (~> 2.8, >= 2.8.3)
|
||||
@@ -93,7 +93,7 @@ DEPENDENCIES
|
||||
cocoapods (~> 1.12)
|
||||
|
||||
RUBY VERSION
|
||||
ruby 3.2.0p0
|
||||
ruby 3.0.5p211
|
||||
|
||||
BUNDLED WITH
|
||||
2.4.7
|
||||
2.4.10
|
||||
|
||||
+2
-2
@@ -40,8 +40,7 @@
|
||||
"test-ios": "./scripts/objc-test.sh test",
|
||||
"test-typescript": "dtslint packages/react-native/types",
|
||||
"test-typescript-offline": "dtslint --localTs node_modules/typescript/lib packages/react-native/types",
|
||||
"bump-all-updated-packages": "node ./scripts/monorepo/bump-all-updated-packages",
|
||||
"align-package-versions": "node ./scripts/monorepo/align-package-versions.js"
|
||||
"bump-all-updated-packages": "node ./scripts/monorepo/bump-all-updated-packages"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
@@ -57,6 +56,7 @@
|
||||
"@definitelytyped/dtslint": "^0.0.127",
|
||||
"@jest/create-cache-key-function": "^29.2.1",
|
||||
"@reactions/component": "^2.0.2",
|
||||
"@react-native/metro-config": "^0.72.1",
|
||||
"@types/react": "^18.0.18",
|
||||
"@typescript-eslint/parser": "^5.30.5",
|
||||
"async": "^3.2.2",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/eslint-plugin-specs",
|
||||
"version": "0.72.2",
|
||||
"version": "0.72.3",
|
||||
"description": "ESLint rules to validate NativeModule and Component Specs",
|
||||
"main": "index.js",
|
||||
"repository": {
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
/**
|
||||
* 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
|
||||
* @noformat
|
||||
*/
|
||||
|
||||
/*:: import type {ConfigT} from 'metro-config'; */
|
||||
|
||||
const {getDefaultConfig: getBaseConfig, mergeConfig} = require('metro-config');
|
||||
|
||||
const INTERNAL_CALLSITES_REGEX = new RegExp(
|
||||
[
|
||||
'/Libraries/Renderer/implementations/.+\\.js$',
|
||||
'/Libraries/BatchedBridge/MessageQueue\\.js$',
|
||||
'/Libraries/YellowBox/.+\\.js$',
|
||||
'/Libraries/LogBox/.+\\.js$',
|
||||
'/Libraries/Core/Timers/.+\\.js$',
|
||||
'/Libraries/WebSocket/.+\\.js$',
|
||||
'/Libraries/vendor/.+\\.js$',
|
||||
'/node_modules/react-devtools-core/.+\\.js$',
|
||||
'/node_modules/react-refresh/.+\\.js$',
|
||||
'/node_modules/scheduler/.+\\.js$',
|
||||
'/node_modules/event-target-shim/.+\\.js$',
|
||||
'/node_modules/invariant/.+\\.js$',
|
||||
'/node_modules/react-native/index.js$',
|
||||
'/metro-runtime/.+\\.js$',
|
||||
'^\\[native code\\]$',
|
||||
].join('|'),
|
||||
);
|
||||
|
||||
/**
|
||||
* Get the base Metro configuration for a React Native project.
|
||||
*/
|
||||
function getDefaultConfig(
|
||||
projectRoot /*: string */
|
||||
) /*: ConfigT */ {
|
||||
const config = {
|
||||
resolver: {
|
||||
resolverMainFields: ['react-native', 'browser', 'main'],
|
||||
platforms: ['android', 'ios'],
|
||||
unstable_conditionNames: ['require', 'react-native'],
|
||||
},
|
||||
serializer: {
|
||||
getPolyfills: () => require('@react-native/js-polyfills')(),
|
||||
},
|
||||
server: {
|
||||
port: Number(process.env.RCT_METRO_PORT) || 8081,
|
||||
},
|
||||
symbolicator: {
|
||||
customizeFrame: (frame /*: $ReadOnly<{file: ?string, ...}>*/) => {
|
||||
const collapse = Boolean(
|
||||
frame.file && INTERNAL_CALLSITES_REGEX.test(frame.file),
|
||||
);
|
||||
return {collapse};
|
||||
},
|
||||
},
|
||||
transformer: {
|
||||
allowOptionalDependencies: true,
|
||||
assetRegistryPath: 'react-native/Libraries/Image/AssetRegistry',
|
||||
asyncRequireModulePath: require.resolve(
|
||||
'metro-runtime/src/modules/asyncRequire',
|
||||
),
|
||||
babelTransformerPath: require.resolve(
|
||||
'metro-react-native-babel-transformer',
|
||||
),
|
||||
getTransformOptions: async () => ({
|
||||
transform: {
|
||||
experimentalImportSupport: false,
|
||||
inlineRequires: true,
|
||||
},
|
||||
}),
|
||||
},
|
||||
watchFolders: [],
|
||||
};
|
||||
|
||||
return mergeConfig(
|
||||
getBaseConfig.getDefaultValues(projectRoot),
|
||||
config,
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = {getDefaultConfig, mergeConfig};
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "@react-native/metro-config",
|
||||
"version": "0.72.1",
|
||||
"description": "Metro configuration for React Native.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:facebook/react-native.git",
|
||||
"directory": "packages/metro-config"
|
||||
},
|
||||
"license": "MIT",
|
||||
"exports": "./index.js",
|
||||
"dependencies": {
|
||||
"@react-native/js-polyfills": "^0.72.1",
|
||||
"metro-config": "0.76.0",
|
||||
"metro-react-native-babel-transformer": "0.76.0",
|
||||
"metro-runtime": "0.76.0"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/codegen",
|
||||
"version": "0.72.3",
|
||||
"version": "0.72.4",
|
||||
"description": "⚛️ Code generation tools for React Native",
|
||||
"homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-codegen",
|
||||
"repository": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/gradle-plugin",
|
||||
"version": "0.72.5",
|
||||
"version": "0.72.6",
|
||||
"description": "⚛️ Gradle Plugin for React Native",
|
||||
"homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-gradle-plugin",
|
||||
"repository": {
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
*/
|
||||
|
||||
exports.version = {
|
||||
major: 1000,
|
||||
minor: 0,
|
||||
major: 0,
|
||||
minor: 72,
|
||||
patch: 0,
|
||||
prerelease: null,
|
||||
prerelease: 'rc.1',
|
||||
};
|
||||
|
||||
@@ -39,8 +39,12 @@ exports.checkVersions = function checkVersions(): void {
|
||||
}
|
||||
};
|
||||
|
||||
// Note: in OSS, the prerelease version is usually 0.Y.0-rc.W, so it is a string and not a number
|
||||
// Then we need to keep supporting that object shape.
|
||||
function _formatVersion(
|
||||
version: (typeof Platform)['constants']['reactNativeVersion'],
|
||||
version:
|
||||
| (typeof Platform)['constants']['reactNativeVersion']
|
||||
| {major: number, minor: number, patch: number, prerelease: ?string},
|
||||
): string {
|
||||
return (
|
||||
`${version.major}.${version.minor}.${version.patch}` +
|
||||
|
||||
+27
-1
@@ -9,7 +9,6 @@
|
||||
*/
|
||||
|
||||
import type {RootTag} from '../Types/RootTagTypes';
|
||||
import type {Spec as FabricUIManagerSpec} from './FabricUIManager';
|
||||
import type {Spec} from './NativeUIManager';
|
||||
|
||||
import {getFabricUIManager} from './FabricUIManager';
|
||||
@@ -175,6 +174,33 @@ const UIManager = {
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
dispatchViewManagerCommand(
|
||||
reactTag: number,
|
||||
commandName: number | string,
|
||||
commandArgs: any[],
|
||||
) {
|
||||
if (isFabricReactTag(reactTag)) {
|
||||
const FabricUIManager = nullthrows(getFabricUIManager());
|
||||
const shadowNode =
|
||||
FabricUIManager.findShadowNodeByTag_DEPRECATED(reactTag);
|
||||
if (shadowNode) {
|
||||
// Transform the accidental CommandID into a CommandName which is the stringified number.
|
||||
// The interop layer knows how to convert this number into the right method name.
|
||||
// Stringify a string is a no-op, so it's safe.
|
||||
commandName = `${commandName}`;
|
||||
FabricUIManager.dispatchCommand(shadowNode, commandName, commandArgs);
|
||||
}
|
||||
} else {
|
||||
UIManagerImpl.dispatchViewManagerCommand(
|
||||
reactTag,
|
||||
// We have some legacy components that are actually already using strings. ¯\_(ツ)_/¯
|
||||
// $FlowFixMe[incompatible-call]
|
||||
commandName,
|
||||
commandArgs,
|
||||
);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = UIManager;
|
||||
|
||||
+26
-3
@@ -3419,6 +3419,23 @@ function mountSafeCallback_NOT_REALLY_SAFE(context, callback) {
|
||||
return callback.apply(context, arguments);
|
||||
};
|
||||
}
|
||||
function warnForStyleProps(props, validAttributes) {
|
||||
{
|
||||
for (var key in validAttributes.style) {
|
||||
if (!(validAttributes[key] || props[key] === undefined)) {
|
||||
error(
|
||||
"You are setting the style `{ %s" +
|
||||
": ... }` as a prop. You " +
|
||||
"should nest it in a style object. " +
|
||||
"E.g. `{ style: { %s" +
|
||||
": ... } }`",
|
||||
key,
|
||||
key
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Modules provided by RN:
|
||||
var emptyObject = {};
|
||||
@@ -5100,7 +5117,8 @@ var _nativeFabricUIManage = nativeFabricUIManager,
|
||||
FabricDefaultPriority = _nativeFabricUIManage.unstable_DefaultEventPriority,
|
||||
FabricDiscretePriority = _nativeFabricUIManage.unstable_DiscreteEventPriority,
|
||||
fabricGetCurrentEventPriority =
|
||||
_nativeFabricUIManage.unstable_getCurrentEventPriority;
|
||||
_nativeFabricUIManage.unstable_getCurrentEventPriority,
|
||||
_setNativeProps = _nativeFabricUIManage.setNativeProps;
|
||||
var getViewConfigForType =
|
||||
ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get; // Counter for uniquely identifying views.
|
||||
// % 10 === 1 means it is a rootTag.
|
||||
@@ -5199,10 +5217,15 @@ var ReactFabricHostComponent = /*#__PURE__*/ (function() {
|
||||
|
||||
_proto.setNativeProps = function setNativeProps(nativeProps) {
|
||||
{
|
||||
error("Warning: setNativeProps is not currently supported in Fabric");
|
||||
warnForStyleProps(nativeProps, this.viewConfig.validAttributes);
|
||||
}
|
||||
|
||||
return;
|
||||
var updatePayload = create(nativeProps, this.viewConfig.validAttributes);
|
||||
var stateNode = this._internalInstanceHandle.stateNode;
|
||||
|
||||
if (stateNode != null && updatePayload != null) {
|
||||
_setNativeProps(stateNode.node, updatePayload);
|
||||
}
|
||||
}; // This API (addEventListener, removeEventListener) attempts to adhere to the
|
||||
// w3 Level2 Events spec as much as possible, treating HostComponent as a DOM node.
|
||||
//
|
||||
|
||||
+13
-1
@@ -1922,6 +1922,7 @@ var _nativeFabricUIManage = nativeFabricUIManager,
|
||||
FabricDiscretePriority = _nativeFabricUIManage.unstable_DiscreteEventPriority,
|
||||
fabricGetCurrentEventPriority =
|
||||
_nativeFabricUIManage.unstable_getCurrentEventPriority,
|
||||
_setNativeProps = _nativeFabricUIManage.setNativeProps,
|
||||
getViewConfigForType =
|
||||
ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get,
|
||||
nextReactTag = 2;
|
||||
@@ -1979,7 +1980,18 @@ var ReactFabricHostComponent = (function() {
|
||||
);
|
||||
}
|
||||
};
|
||||
_proto.setNativeProps = function() {};
|
||||
_proto.setNativeProps = function(nativeProps) {
|
||||
nativeProps = diffProperties(
|
||||
null,
|
||||
emptyObject,
|
||||
nativeProps,
|
||||
this.viewConfig.validAttributes
|
||||
);
|
||||
var stateNode = this._internalInstanceHandle.stateNode;
|
||||
null != stateNode &&
|
||||
null != nativeProps &&
|
||||
_setNativeProps(stateNode.node, nativeProps);
|
||||
};
|
||||
_proto.addEventListener_unstable = function(eventType, listener, options) {
|
||||
if ("string" !== typeof eventType)
|
||||
throw Error("addEventListener_unstable eventType must be a string");
|
||||
|
||||
+13
-1
@@ -1981,6 +1981,7 @@ var _nativeFabricUIManage = nativeFabricUIManager,
|
||||
FabricDiscretePriority = _nativeFabricUIManage.unstable_DiscreteEventPriority,
|
||||
fabricGetCurrentEventPriority =
|
||||
_nativeFabricUIManage.unstable_getCurrentEventPriority,
|
||||
_setNativeProps = _nativeFabricUIManage.setNativeProps,
|
||||
getViewConfigForType =
|
||||
ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get,
|
||||
nextReactTag = 2;
|
||||
@@ -2038,7 +2039,18 @@ var ReactFabricHostComponent = (function() {
|
||||
);
|
||||
}
|
||||
};
|
||||
_proto.setNativeProps = function() {};
|
||||
_proto.setNativeProps = function(nativeProps) {
|
||||
nativeProps = diffProperties(
|
||||
null,
|
||||
emptyObject,
|
||||
nativeProps,
|
||||
this.viewConfig.validAttributes
|
||||
);
|
||||
var stateNode = this._internalInstanceHandle.stateNode;
|
||||
null != stateNode &&
|
||||
null != nativeProps &&
|
||||
_setNativeProps(stateNode.node, nativeProps);
|
||||
};
|
||||
_proto.addEventListener_unstable = function(eventType, listener, options) {
|
||||
if ("string" !== typeof eventType)
|
||||
throw Error("addEventListener_unstable eventType must be a string");
|
||||
|
||||
@@ -21,10 +21,10 @@ NSDictionary* RCTGetReactNativeVersion(void)
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^(void){
|
||||
__rnVersion = @{
|
||||
RCTVersionMajor: @(1000),
|
||||
RCTVersionMinor: @(0),
|
||||
RCTVersionMajor: @(0),
|
||||
RCTVersionMinor: @(72),
|
||||
RCTVersionPatch: @(0),
|
||||
RCTVersionPrerelease: [NSNull null],
|
||||
RCTVersionPrerelease: @"rc.1",
|
||||
};
|
||||
});
|
||||
return __rnVersion;
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@
|
||||
|
||||
- (void)handleCommand:(NSString *)commandName args:(NSArray *)args
|
||||
{
|
||||
[_coordinator handleCommand:commandName args:args reactTag:_tag];
|
||||
[_coordinator handleCommand:commandName args:args reactTag:_tag paperView:self.paperView];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
VERSION_NAME=1000.0.0
|
||||
VERSION_NAME=0.72.0-rc.1
|
||||
GROUP=com.facebook.react
|
||||
|
||||
# JVM Versions
|
||||
|
||||
+40
-1
@@ -11,6 +11,7 @@ import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.KeyEvent;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.facebook.infer.annotation.Assertions;
|
||||
import com.facebook.react.devsupport.DoubleTapReloadRecognizer;
|
||||
@@ -33,6 +34,8 @@ public class ReactDelegate {
|
||||
|
||||
private ReactNativeHost mReactNativeHost;
|
||||
|
||||
private boolean mFabricEnabled = false;
|
||||
|
||||
public ReactDelegate(
|
||||
Activity activity,
|
||||
ReactNativeHost reactNativeHost,
|
||||
@@ -45,6 +48,20 @@ public class ReactDelegate {
|
||||
mReactNativeHost = reactNativeHost;
|
||||
}
|
||||
|
||||
public ReactDelegate(
|
||||
Activity activity,
|
||||
ReactNativeHost reactNativeHost,
|
||||
@Nullable String appKey,
|
||||
@Nullable Bundle launchOptions,
|
||||
boolean fabricEnabled) {
|
||||
mActivity = activity;
|
||||
mMainComponentName = appKey;
|
||||
mLaunchOptions = composeLaunchOptions(launchOptions);
|
||||
mDoubleTapReloadRecognizer = new DoubleTapReloadRecognizer();
|
||||
mReactNativeHost = reactNativeHost;
|
||||
mFabricEnabled = fabricEnabled;
|
||||
}
|
||||
|
||||
public void onHostResume() {
|
||||
if (getReactNativeHost().hasInstance()) {
|
||||
if (mActivity instanceof DefaultHardwareBackBtnHandler) {
|
||||
@@ -109,7 +126,9 @@ public class ReactDelegate {
|
||||
}
|
||||
|
||||
protected ReactRootView createRootView() {
|
||||
return new ReactRootView(mActivity);
|
||||
ReactRootView reactRootView = new ReactRootView(mActivity);
|
||||
reactRootView.setIsFabric(isFabricEnabled());
|
||||
return reactRootView;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -144,4 +163,24 @@ public class ReactDelegate {
|
||||
public ReactInstanceManager getReactInstanceManager() {
|
||||
return getReactNativeHost().getReactInstanceManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* Override this method if you wish to selectively toggle Fabric for a specific surface. This will
|
||||
* also control if Concurrent Root (React 18) should be enabled or not.
|
||||
*
|
||||
* @return true if Fabric is enabled for this Activity, false otherwise.
|
||||
*/
|
||||
protected boolean isFabricEnabled() {
|
||||
return mFabricEnabled;
|
||||
}
|
||||
|
||||
private @NonNull Bundle composeLaunchOptions(Bundle composedLaunchOptions) {
|
||||
if (isFabricEnabled()) {
|
||||
if (composedLaunchOptions == null) {
|
||||
composedLaunchOptions = new Bundle();
|
||||
}
|
||||
composedLaunchOptions.putBoolean("concurrentRoot", true);
|
||||
}
|
||||
return composedLaunchOptions;
|
||||
}
|
||||
}
|
||||
|
||||
+22
-7
@@ -16,6 +16,7 @@ import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import com.facebook.react.modules.core.PermissionAwareActivity;
|
||||
@@ -29,6 +30,7 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
||||
|
||||
protected static final String ARG_COMPONENT_NAME = "arg_component_name";
|
||||
protected static final String ARG_LAUNCH_OPTIONS = "arg_launch_options";
|
||||
protected static final String ARG_FABRIC_ENABLED = "arg_fabric_enabled";
|
||||
|
||||
private ReactDelegate mReactDelegate;
|
||||
|
||||
@@ -40,13 +42,16 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
||||
|
||||
/**
|
||||
* @param componentName The name of the react native component
|
||||
* @param fabricEnabled Flag to enable Fabric for ReactFragment
|
||||
* @return A new instance of fragment ReactFragment.
|
||||
*/
|
||||
private static ReactFragment newInstance(String componentName, Bundle launchOptions) {
|
||||
private static ReactFragment newInstance(
|
||||
String componentName, Bundle launchOptions, Boolean fabricEnabled) {
|
||||
ReactFragment fragment = new ReactFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putString(ARG_COMPONENT_NAME, componentName);
|
||||
args.putBundle(ARG_LAUNCH_OPTIONS, launchOptions);
|
||||
args.putBoolean(ARG_FABRIC_ENABLED, fabricEnabled);
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
@@ -57,15 +62,18 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
||||
super.onCreate(savedInstanceState);
|
||||
String mainComponentName = null;
|
||||
Bundle launchOptions = null;
|
||||
Boolean fabricEnabled = null;
|
||||
if (getArguments() != null) {
|
||||
mainComponentName = getArguments().getString(ARG_COMPONENT_NAME);
|
||||
launchOptions = getArguments().getBundle(ARG_LAUNCH_OPTIONS);
|
||||
fabricEnabled = getArguments().getBoolean(ARG_FABRIC_ENABLED);
|
||||
}
|
||||
if (mainComponentName == null) {
|
||||
throw new IllegalStateException("Cannot loadApp if component name is null");
|
||||
}
|
||||
mReactDelegate =
|
||||
new ReactDelegate(getActivity(), getReactNativeHost(), mainComponentName, launchOptions);
|
||||
new ReactDelegate(
|
||||
getActivity(), getReactNativeHost(), mainComponentName, launchOptions, fabricEnabled);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -85,7 +93,7 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
||||
|
||||
@Override
|
||||
public View onCreateView(
|
||||
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
mReactDelegate.loadApp();
|
||||
return mReactDelegate.getReactRootView();
|
||||
}
|
||||
@@ -140,7 +148,7 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(
|
||||
int requestCode, String[] permissions, int[] grantResults) {
|
||||
int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
if (mPermissionListener != null
|
||||
&& mPermissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
|
||||
@@ -170,12 +178,14 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
||||
/** Builder class to help instantiate a ReactFragment */
|
||||
public static class Builder {
|
||||
|
||||
String mComponentName;
|
||||
Bundle mLaunchOptions;
|
||||
@Nullable String mComponentName;
|
||||
@Nullable Bundle mLaunchOptions;
|
||||
@Nullable Boolean mFabricEnabled;
|
||||
|
||||
public Builder() {
|
||||
mComponentName = null;
|
||||
mLaunchOptions = null;
|
||||
mFabricEnabled = null;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -201,7 +211,12 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
||||
}
|
||||
|
||||
public ReactFragment build() {
|
||||
return ReactFragment.newInstance(mComponentName, mLaunchOptions);
|
||||
return ReactFragment.newInstance(mComponentName, mLaunchOptions, mFabricEnabled);
|
||||
}
|
||||
|
||||
public Builder setFabricEnabled(boolean fabricEnabled) {
|
||||
mFabricEnabled = fabricEnabled;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -75,6 +75,9 @@ public class ReactFeatureFlags {
|
||||
/** Feature Flag to enable the pending event queue in fabric before mounting views */
|
||||
public static boolean enableFabricPendingEventQueue = false;
|
||||
|
||||
/** Feature Flag to enable caching mechanism of text measurement at shadow node level */
|
||||
public static boolean enableTextMeasureCachePerShadowNode = false;
|
||||
|
||||
/**
|
||||
* Feature flag that controls how turbo modules are exposed to JS
|
||||
*
|
||||
|
||||
+4
@@ -7,6 +7,7 @@
|
||||
|
||||
package com.facebook.react.defaults
|
||||
|
||||
import android.os.Bundle
|
||||
import com.facebook.react.ReactActivity
|
||||
import com.facebook.react.ReactActivityDelegate
|
||||
import com.facebook.react.ReactRootView
|
||||
@@ -43,4 +44,7 @@ open class DefaultReactActivityDelegate(
|
||||
|
||||
override fun createRootView(): ReactRootView =
|
||||
ReactRootView(context).apply { setIsFabric(fabricEnabled) }
|
||||
|
||||
override fun createRootView(bundle: Bundle?): ReactRootView =
|
||||
ReactRootView(context).apply { setIsFabric(fabricEnabled) }
|
||||
}
|
||||
|
||||
+3
-3
@@ -15,8 +15,8 @@ import java.util.Map;
|
||||
|
||||
public class ReactNativeVersion {
|
||||
public static final Map<String, Object> VERSION = MapBuilder.<String, Object>of(
|
||||
"major", 1000,
|
||||
"minor", 0,
|
||||
"major", 0,
|
||||
"minor", 72,
|
||||
"patch", 0,
|
||||
"prerelease", null);
|
||||
"prerelease", "rc.1");
|
||||
}
|
||||
|
||||
+4
@@ -37,6 +37,10 @@ public class CustomLetterSpacingSpan extends MetricAffectingSpan implements Reac
|
||||
apply(paint);
|
||||
}
|
||||
|
||||
public float getSpacing() {
|
||||
return mLetterSpacing;
|
||||
}
|
||||
|
||||
private void apply(TextPaint paint) {
|
||||
if (!Float.isNaN(mLetterSpacing)) {
|
||||
paint.setLetterSpacing(mLetterSpacing);
|
||||
|
||||
+4
@@ -71,6 +71,10 @@ public class CustomStyleSpan extends MetricAffectingSpan implements ReactSpan {
|
||||
return mFontFamily;
|
||||
}
|
||||
|
||||
public @Nullable String getFontFeatureSettings() {
|
||||
return mFeatureSettings;
|
||||
}
|
||||
|
||||
private static void apply(
|
||||
Paint paint,
|
||||
int style,
|
||||
|
||||
+1
-5
@@ -31,8 +31,6 @@ public class ReactTextUpdate {
|
||||
private final int mSelectionEnd;
|
||||
private final int mJustificationMode;
|
||||
|
||||
public boolean mContainsMultipleFragments;
|
||||
|
||||
/**
|
||||
* @deprecated Use a non-deprecated constructor for ReactTextUpdate instead. This one remains
|
||||
* because it's being used by a unit test that isn't currently open source.
|
||||
@@ -142,13 +140,11 @@ public class ReactTextUpdate {
|
||||
int jsEventCounter,
|
||||
int textAlign,
|
||||
int textBreakStrategy,
|
||||
int justificationMode,
|
||||
boolean containsMultipleFragments) {
|
||||
int justificationMode) {
|
||||
|
||||
ReactTextUpdate reactTextUpdate =
|
||||
new ReactTextUpdate(
|
||||
text, jsEventCounter, false, textAlign, textBreakStrategy, justificationMode);
|
||||
reactTextUpdate.mContainsMultipleFragments = containsMultipleFragments;
|
||||
return reactTextUpdate;
|
||||
}
|
||||
|
||||
|
||||
+192
-136
@@ -11,6 +11,8 @@ import static com.facebook.react.uimanager.UIManagerHelper.getReactContext;
|
||||
import static com.facebook.react.views.text.TextAttributeProps.UNSET;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Typeface;
|
||||
import android.graphics.drawable.Drawable;
|
||||
@@ -50,15 +52,19 @@ import com.facebook.react.views.text.CustomLetterSpacingSpan;
|
||||
import com.facebook.react.views.text.CustomLineHeightSpan;
|
||||
import com.facebook.react.views.text.CustomStyleSpan;
|
||||
import com.facebook.react.views.text.ReactAbsoluteSizeSpan;
|
||||
import com.facebook.react.views.text.ReactBackgroundColorSpan;
|
||||
import com.facebook.react.views.text.ReactForegroundColorSpan;
|
||||
import com.facebook.react.views.text.ReactSpan;
|
||||
import com.facebook.react.views.text.ReactStrikethroughSpan;
|
||||
import com.facebook.react.views.text.ReactTextUpdate;
|
||||
import com.facebook.react.views.text.ReactTypefaceUtils;
|
||||
import com.facebook.react.views.text.ReactUnderlineSpan;
|
||||
import com.facebook.react.views.text.TextAttributes;
|
||||
import com.facebook.react.views.text.TextInlineImageSpan;
|
||||
import com.facebook.react.views.text.TextLayoutManager;
|
||||
import com.facebook.react.views.view.ReactViewBackgroundManager;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* A wrapper around the EditText that lets us better control what happens when an EditText gets
|
||||
@@ -82,7 +88,6 @@ public class ReactEditText extends AppCompatEditText
|
||||
// *TextChanged events should be triggered. This is less expensive than removing the text
|
||||
// listeners and adding them back again after the text change is completed.
|
||||
protected boolean mIsSettingTextFromJS;
|
||||
protected boolean mIsSettingTextFromCacheUpdate = false;
|
||||
private int mDefaultGravityHorizontal;
|
||||
private int mDefaultGravityVertical;
|
||||
|
||||
@@ -362,7 +367,7 @@ public class ReactEditText extends AppCompatEditText
|
||||
}
|
||||
|
||||
super.onSelectionChanged(selStart, selEnd);
|
||||
if (!mIsSettingTextFromCacheUpdate && mSelectionWatcher != null && hasFocus()) {
|
||||
if (mSelectionWatcher != null && hasFocus()) {
|
||||
mSelectionWatcher.onSelectionChanged(selStart, selEnd);
|
||||
}
|
||||
}
|
||||
@@ -512,6 +517,14 @@ public class ReactEditText extends AppCompatEditText
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFontFeatureSettings(String fontFeatureSettings) {
|
||||
if (!Objects.equals(fontFeatureSettings, getFontFeatureSettings())) {
|
||||
super.setFontFeatureSettings(fontFeatureSettings);
|
||||
mTypefaceDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void maybeUpdateTypeface() {
|
||||
if (!mTypefaceDirty) {
|
||||
return;
|
||||
@@ -523,6 +536,17 @@ public class ReactEditText extends AppCompatEditText
|
||||
ReactTypefaceUtils.applyStyles(
|
||||
getTypeface(), mFontStyle, mFontWeight, mFontFamily, getContext().getAssets());
|
||||
setTypeface(newTypeface);
|
||||
|
||||
// Match behavior of CustomStyleSpan and enable SUBPIXEL_TEXT_FLAG when setting anything
|
||||
// nonstandard
|
||||
if (mFontStyle != UNSET
|
||||
|| mFontWeight != UNSET
|
||||
|| mFontFamily != null
|
||||
|| getFontFeatureSettings() != null) {
|
||||
setPaintFlags(getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
|
||||
} else {
|
||||
setPaintFlags(getPaintFlags() & (~Paint.SUBPIXEL_TEXT_FLAG));
|
||||
}
|
||||
}
|
||||
|
||||
// VisibleForTesting from {@link TextInputEventsTestCase}.
|
||||
@@ -584,10 +608,8 @@ public class ReactEditText extends AppCompatEditText
|
||||
SpannableStringBuilder spannableStringBuilder =
|
||||
new SpannableStringBuilder(reactTextUpdate.getText());
|
||||
|
||||
manageSpans(spannableStringBuilder, reactTextUpdate.mContainsMultipleFragments);
|
||||
|
||||
// Mitigation for https://github.com/facebook/react-native/issues/35936 (S318090)
|
||||
stripAttributeEquivalentSpans(spannableStringBuilder);
|
||||
manageSpans(spannableStringBuilder);
|
||||
stripStyleEquivalentSpans(spannableStringBuilder);
|
||||
|
||||
mContainsImages = reactTextUpdate.containsImages();
|
||||
|
||||
@@ -615,7 +637,7 @@ public class ReactEditText extends AppCompatEditText
|
||||
}
|
||||
|
||||
// Update cached spans (in Fabric only).
|
||||
updateCachedSpannable(false);
|
||||
updateCachedSpannable();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -624,8 +646,7 @@ public class ReactEditText extends AppCompatEditText
|
||||
* will adapt to the new text, hence why {@link SpannableStringBuilder#replace} never removes
|
||||
* them.
|
||||
*/
|
||||
private void manageSpans(
|
||||
SpannableStringBuilder spannableStringBuilder, boolean skipAddSpansForMeasurements) {
|
||||
private void manageSpans(SpannableStringBuilder spannableStringBuilder) {
|
||||
Object[] spans = getText().getSpans(0, length(), Object.class);
|
||||
for (int spanIdx = 0; spanIdx < spans.length; spanIdx++) {
|
||||
Object span = spans[spanIdx];
|
||||
@@ -653,58 +674,170 @@ public class ReactEditText extends AppCompatEditText
|
||||
spannableStringBuilder.setSpan(span, spanStart, spanEnd, spanFlags);
|
||||
}
|
||||
}
|
||||
|
||||
// In Fabric only, apply necessary styles to entire span
|
||||
// If the Spannable was constructed from multiple fragments, we don't apply any spans that could
|
||||
// impact the whole Spannable, because that would override "local" styles per-fragment
|
||||
if (!skipAddSpansForMeasurements) {
|
||||
addSpansForMeasurement(getText());
|
||||
}
|
||||
}
|
||||
|
||||
private void stripAttributeEquivalentSpans(SpannableStringBuilder sb) {
|
||||
// We have already set a font size on the EditText itself. We can safely remove sizing spans
|
||||
// which are the same as the set font size, and not otherwise overlapped.
|
||||
final int effectiveFontSize = mTextAttributes.getEffectiveFontSize();
|
||||
ReactAbsoluteSizeSpan[] spans = sb.getSpans(0, sb.length(), ReactAbsoluteSizeSpan.class);
|
||||
// TODO: Replace with Predicate<T> and lambdas once Java 8 builds in OSS
|
||||
interface SpanPredicate<T> {
|
||||
boolean test(T span);
|
||||
}
|
||||
|
||||
outerLoop:
|
||||
for (ReactAbsoluteSizeSpan span : spans) {
|
||||
ReactAbsoluteSizeSpan[] overlappingSpans =
|
||||
sb.getSpans(sb.getSpanStart(span), sb.getSpanEnd(span), ReactAbsoluteSizeSpan.class);
|
||||
/**
|
||||
* Remove spans from the SpannableStringBuilder which can be represented by TextAppearance
|
||||
* attributes on the underlying EditText. This works around instability on Samsung devices with
|
||||
* the presence of spans https://github.com/facebook/react-native/issues/35936 (S318090)
|
||||
*/
|
||||
private void stripStyleEquivalentSpans(SpannableStringBuilder sb) {
|
||||
stripSpansOfKind(
|
||||
sb,
|
||||
ReactAbsoluteSizeSpan.class,
|
||||
new SpanPredicate<ReactAbsoluteSizeSpan>() {
|
||||
@Override
|
||||
public boolean test(ReactAbsoluteSizeSpan span) {
|
||||
return span.getSize() == mTextAttributes.getEffectiveFontSize();
|
||||
}
|
||||
});
|
||||
|
||||
for (ReactAbsoluteSizeSpan overlappingSpan : overlappingSpans) {
|
||||
if (span.getSize() != effectiveFontSize) {
|
||||
continue outerLoop;
|
||||
}
|
||||
stripSpansOfKind(
|
||||
sb,
|
||||
ReactBackgroundColorSpan.class,
|
||||
new SpanPredicate<ReactBackgroundColorSpan>() {
|
||||
@Override
|
||||
public boolean test(ReactBackgroundColorSpan span) {
|
||||
return span.getBackgroundColor() == mReactBackgroundManager.getBackgroundColor();
|
||||
}
|
||||
});
|
||||
|
||||
stripSpansOfKind(
|
||||
sb,
|
||||
ReactForegroundColorSpan.class,
|
||||
new SpanPredicate<ReactForegroundColorSpan>() {
|
||||
@Override
|
||||
public boolean test(ReactForegroundColorSpan span) {
|
||||
return span.getForegroundColor() == getCurrentTextColor();
|
||||
}
|
||||
});
|
||||
|
||||
stripSpansOfKind(
|
||||
sb,
|
||||
ReactStrikethroughSpan.class,
|
||||
new SpanPredicate<ReactStrikethroughSpan>() {
|
||||
@Override
|
||||
public boolean test(ReactStrikethroughSpan span) {
|
||||
return (getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) != 0;
|
||||
}
|
||||
});
|
||||
|
||||
stripSpansOfKind(
|
||||
sb,
|
||||
ReactUnderlineSpan.class,
|
||||
new SpanPredicate<ReactUnderlineSpan>() {
|
||||
@Override
|
||||
public boolean test(ReactUnderlineSpan span) {
|
||||
return (getPaintFlags() & Paint.UNDERLINE_TEXT_FLAG) != 0;
|
||||
}
|
||||
});
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
stripSpansOfKind(
|
||||
sb,
|
||||
CustomLetterSpacingSpan.class,
|
||||
new SpanPredicate<CustomLetterSpacingSpan>() {
|
||||
@Override
|
||||
public boolean test(CustomLetterSpacingSpan span) {
|
||||
return span.getSpacing() == mTextAttributes.getEffectiveLetterSpacing();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
stripSpansOfKind(
|
||||
sb,
|
||||
CustomStyleSpan.class,
|
||||
new SpanPredicate<CustomStyleSpan>() {
|
||||
@Override
|
||||
public boolean test(CustomStyleSpan span) {
|
||||
return span.getStyle() == mFontStyle
|
||||
&& Objects.equals(span.getFontFamily(), mFontFamily)
|
||||
&& span.getWeight() == mFontWeight
|
||||
&& Objects.equals(span.getFontFeatureSettings(), getFontFeatureSettings());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private <T> void stripSpansOfKind(
|
||||
SpannableStringBuilder sb, Class<T> clazz, SpanPredicate<T> shouldStrip) {
|
||||
T[] spans = sb.getSpans(0, sb.length(), clazz);
|
||||
|
||||
for (T span : spans) {
|
||||
if (shouldStrip.test(span)) {
|
||||
sb.removeSpan(span);
|
||||
}
|
||||
|
||||
sb.removeSpan(span);
|
||||
}
|
||||
}
|
||||
|
||||
private void unstripAttributeEquivalentSpans(
|
||||
SpannableStringBuilder workingText, Spannable originalText) {
|
||||
// We must add spans back for Fabric to be able to measure, at lower precedence than any
|
||||
// existing spans. Remove all spans, add the attributes, then re-add the spans over
|
||||
workingText.append(originalText);
|
||||
/**
|
||||
* Copy styles represented as attributes to the underlying span, for later measurement or other
|
||||
* usage outside the ReactEditText.
|
||||
*/
|
||||
private void addSpansFromStyleAttributes(SpannableStringBuilder workingText) {
|
||||
int spanFlags = Spannable.SPAN_INCLUSIVE_INCLUSIVE;
|
||||
|
||||
for (Object span : workingText.getSpans(0, workingText.length(), Object.class)) {
|
||||
workingText.removeSpan(span);
|
||||
}
|
||||
// Set all bits for SPAN_PRIORITY so that this span has the highest possible priority
|
||||
// (least precedence). This ensures the span is behind any overlapping spans.
|
||||
spanFlags |= Spannable.SPAN_PRIORITY;
|
||||
|
||||
workingText.setSpan(
|
||||
new ReactAbsoluteSizeSpan(mTextAttributes.getEffectiveFontSize()),
|
||||
0,
|
||||
workingText.length(),
|
||||
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
|
||||
spanFlags);
|
||||
|
||||
for (Object span : originalText.getSpans(0, originalText.length(), Object.class)) {
|
||||
workingText.setSpan(
|
||||
new ReactForegroundColorSpan(getCurrentTextColor()), 0, workingText.length(), spanFlags);
|
||||
|
||||
int backgroundColor = mReactBackgroundManager.getBackgroundColor();
|
||||
if (backgroundColor != Color.TRANSPARENT) {
|
||||
workingText.setSpan(
|
||||
span,
|
||||
originalText.getSpanStart(span),
|
||||
originalText.getSpanEnd(span),
|
||||
originalText.getSpanFlags(span));
|
||||
new ReactBackgroundColorSpan(backgroundColor), 0, workingText.length(), spanFlags);
|
||||
}
|
||||
|
||||
if ((getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) != 0) {
|
||||
workingText.setSpan(new ReactStrikethroughSpan(), 0, workingText.length(), spanFlags);
|
||||
}
|
||||
|
||||
if ((getPaintFlags() & Paint.UNDERLINE_TEXT_FLAG) != 0) {
|
||||
workingText.setSpan(new ReactUnderlineSpan(), 0, workingText.length(), spanFlags);
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
float effectiveLetterSpacing = mTextAttributes.getEffectiveLetterSpacing();
|
||||
if (!Float.isNaN(effectiveLetterSpacing)) {
|
||||
workingText.setSpan(
|
||||
new CustomLetterSpacingSpan(effectiveLetterSpacing),
|
||||
0,
|
||||
workingText.length(),
|
||||
spanFlags);
|
||||
}
|
||||
}
|
||||
|
||||
if (mFontStyle != UNSET
|
||||
|| mFontWeight != UNSET
|
||||
|| mFontFamily != null
|
||||
|| getFontFeatureSettings() != null) {
|
||||
workingText.setSpan(
|
||||
new CustomStyleSpan(
|
||||
mFontStyle,
|
||||
mFontWeight,
|
||||
getFontFeatureSettings(),
|
||||
mFontFamily,
|
||||
getContext().getAssets()),
|
||||
0,
|
||||
workingText.length(),
|
||||
spanFlags);
|
||||
}
|
||||
|
||||
float lineHeight = mTextAttributes.getEffectiveLineHeight();
|
||||
if (!Float.isNaN(lineHeight)) {
|
||||
workingText.setSpan(new CustomLineHeightSpan(lineHeight), 0, workingText.length(), spanFlags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -724,73 +857,6 @@ public class ReactEditText extends AppCompatEditText
|
||||
return true;
|
||||
}
|
||||
|
||||
// This is hacked in for Fabric. When we delete non-Fabric code, we might be able to simplify or
|
||||
// clean this up a bit.
|
||||
private void addSpansForMeasurement(Spannable spannable) {
|
||||
if (!mFabricViewStateManager.hasStateWrapper()) {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean originalDisableTextDiffing = mDisableTextDiffing;
|
||||
mDisableTextDiffing = true;
|
||||
|
||||
int start = 0;
|
||||
int end = spannable.length();
|
||||
|
||||
// Remove duplicate spans we might add here
|
||||
Object[] spans = spannable.getSpans(0, length(), Object.class);
|
||||
for (Object span : spans) {
|
||||
int spanFlags = spannable.getSpanFlags(span);
|
||||
boolean isInclusive =
|
||||
(spanFlags & Spanned.SPAN_INCLUSIVE_INCLUSIVE) == Spanned.SPAN_INCLUSIVE_INCLUSIVE
|
||||
|| (spanFlags & Spanned.SPAN_INCLUSIVE_EXCLUSIVE) == Spanned.SPAN_INCLUSIVE_EXCLUSIVE;
|
||||
if (isInclusive
|
||||
&& span instanceof ReactSpan
|
||||
&& spannable.getSpanStart(span) == start
|
||||
&& spannable.getSpanEnd(span) == end) {
|
||||
spannable.removeSpan(span);
|
||||
}
|
||||
}
|
||||
|
||||
List<TextLayoutManager.SetSpanOperation> ops = new ArrayList<>();
|
||||
|
||||
if (!Float.isNaN(mTextAttributes.getLetterSpacing())) {
|
||||
ops.add(
|
||||
new TextLayoutManager.SetSpanOperation(
|
||||
start, end, new CustomLetterSpacingSpan(mTextAttributes.getLetterSpacing())));
|
||||
}
|
||||
ops.add(
|
||||
new TextLayoutManager.SetSpanOperation(
|
||||
start, end, new ReactAbsoluteSizeSpan((int) mTextAttributes.getEffectiveFontSize())));
|
||||
if (mFontStyle != UNSET || mFontWeight != UNSET || mFontFamily != null) {
|
||||
ops.add(
|
||||
new TextLayoutManager.SetSpanOperation(
|
||||
start,
|
||||
end,
|
||||
new CustomStyleSpan(
|
||||
mFontStyle,
|
||||
mFontWeight,
|
||||
null, // TODO: do we need to support FontFeatureSettings / fontVariant?
|
||||
mFontFamily,
|
||||
getReactContext(ReactEditText.this).getAssets())));
|
||||
}
|
||||
if (!Float.isNaN(mTextAttributes.getEffectiveLineHeight())) {
|
||||
ops.add(
|
||||
new TextLayoutManager.SetSpanOperation(
|
||||
start, end, new CustomLineHeightSpan(mTextAttributes.getEffectiveLineHeight())));
|
||||
}
|
||||
|
||||
int priority = 0;
|
||||
for (TextLayoutManager.SetSpanOperation op : ops) {
|
||||
// Actual order of calling {@code execute} does NOT matter,
|
||||
// but the {@code priority} DOES matter.
|
||||
op.execute(spannable, priority);
|
||||
priority++;
|
||||
}
|
||||
|
||||
mDisableTextDiffing = originalDisableTextDiffing;
|
||||
}
|
||||
|
||||
protected boolean showSoftKeyboard() {
|
||||
return mInputMethodManager.showSoftInput(this, 0);
|
||||
}
|
||||
@@ -1060,7 +1126,9 @@ public class ReactEditText extends AppCompatEditText
|
||||
|
||||
float effectiveLetterSpacing = mTextAttributes.getEffectiveLetterSpacing();
|
||||
if (!Float.isNaN(effectiveLetterSpacing)) {
|
||||
setLetterSpacing(effectiveLetterSpacing);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
setLetterSpacing(effectiveLetterSpacing);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1075,7 +1143,7 @@ public class ReactEditText extends AppCompatEditText
|
||||
* TextLayoutManager.java with some very minor modifications. There's some duplication between
|
||||
* here and TextLayoutManager, so there might be an opportunity for refactor.
|
||||
*/
|
||||
private void updateCachedSpannable(boolean resetStyles) {
|
||||
private void updateCachedSpannable() {
|
||||
// Noops in non-Fabric
|
||||
if (mFabricViewStateManager == null || !mFabricViewStateManager.hasStateWrapper()) {
|
||||
return;
|
||||
@@ -1085,12 +1153,6 @@ public class ReactEditText extends AppCompatEditText
|
||||
return;
|
||||
}
|
||||
|
||||
if (resetStyles) {
|
||||
mIsSettingTextFromCacheUpdate = true;
|
||||
addSpansForMeasurement(getText());
|
||||
mIsSettingTextFromCacheUpdate = false;
|
||||
}
|
||||
|
||||
Editable currentText = getText();
|
||||
boolean haveText = currentText != null && currentText.length() > 0;
|
||||
|
||||
@@ -1132,8 +1194,7 @@ public class ReactEditText extends AppCompatEditText
|
||||
// ...
|
||||
// - android.app.Activity.dispatchKeyEvent (Activity.java:3447)
|
||||
try {
|
||||
Spannable text = (Spannable) currentText.subSequence(0, currentText.length());
|
||||
unstripAttributeEquivalentSpans(sb, text);
|
||||
sb.append(currentText.subSequence(0, currentText.length()));
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
ReactSoftExceptionLogger.logSoftException(TAG, e);
|
||||
}
|
||||
@@ -1149,11 +1210,9 @@ public class ReactEditText extends AppCompatEditText
|
||||
// Measure something so we have correct height, even if there's no string.
|
||||
sb.append("I");
|
||||
}
|
||||
|
||||
// Make sure that all text styles are applied when we're measurable the hint or "blank" text
|
||||
addSpansForMeasurement(sb);
|
||||
}
|
||||
|
||||
addSpansFromStyleAttributes(sb);
|
||||
TextLayoutManager.setCachedSpannabledForTag(getId(), sb);
|
||||
}
|
||||
|
||||
@@ -1168,7 +1227,7 @@ public class ReactEditText extends AppCompatEditText
|
||||
private class TextWatcherDelegator implements TextWatcher {
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
if (!mIsSettingTextFromCacheUpdate && !mIsSettingTextFromJS && mListeners != null) {
|
||||
if (!mIsSettingTextFromJS && mListeners != null) {
|
||||
for (TextWatcher listener : mListeners) {
|
||||
listener.beforeTextChanged(s, start, count, after);
|
||||
}
|
||||
@@ -1182,23 +1241,20 @@ public class ReactEditText extends AppCompatEditText
|
||||
TAG, "onTextChanged[" + getId() + "]: " + s + " " + start + " " + before + " " + count);
|
||||
}
|
||||
|
||||
if (!mIsSettingTextFromCacheUpdate) {
|
||||
if (!mIsSettingTextFromJS && mListeners != null) {
|
||||
for (TextWatcher listener : mListeners) {
|
||||
listener.onTextChanged(s, start, before, count);
|
||||
}
|
||||
if (!mIsSettingTextFromJS && mListeners != null) {
|
||||
for (TextWatcher listener : mListeners) {
|
||||
listener.onTextChanged(s, start, before, count);
|
||||
}
|
||||
|
||||
updateCachedSpannable(
|
||||
!mIsSettingTextFromJS && !mIsSettingTextFromState && start == 0 && before == 0);
|
||||
}
|
||||
|
||||
updateCachedSpannable();
|
||||
|
||||
onContentSizeChange();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s) {
|
||||
if (!mIsSettingTextFromCacheUpdate && !mIsSettingTextFromJS && mListeners != null) {
|
||||
if (!mIsSettingTextFromJS && mListeners != null) {
|
||||
for (TextWatcher listener : mListeners) {
|
||||
listener.afterTextChanged(s);
|
||||
}
|
||||
|
||||
+23
-10
@@ -13,6 +13,7 @@ import android.content.Context;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.graphics.BlendMode;
|
||||
import android.graphics.BlendModeColorFilter;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
@@ -68,6 +69,7 @@ import com.facebook.react.views.text.DefaultStyleValuesUtil;
|
||||
import com.facebook.react.views.text.ReactBaseTextShadowNode;
|
||||
import com.facebook.react.views.text.ReactTextUpdate;
|
||||
import com.facebook.react.views.text.ReactTextViewManagerCallback;
|
||||
import com.facebook.react.views.text.ReactTypefaceUtils;
|
||||
import com.facebook.react.views.text.TextAttributeProps;
|
||||
import com.facebook.react.views.text.TextInlineImageSpan;
|
||||
import com.facebook.react.views.text.TextLayoutManager;
|
||||
@@ -412,6 +414,11 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
|
||||
view.setFontStyle(fontStyle);
|
||||
}
|
||||
|
||||
@ReactProp(name = ViewProps.FONT_VARIANT)
|
||||
public void setFontVariant(ReactEditText view, @Nullable ReadableArray fontVariant) {
|
||||
view.setFontFeatureSettings(ReactTypefaceUtils.parseFontVariant(fontVariant));
|
||||
}
|
||||
|
||||
@ReactProp(name = ViewProps.INCLUDE_FONT_PADDING, defaultBoolean = true)
|
||||
public void setIncludeFontPadding(ReactEditText view, boolean includepad) {
|
||||
view.setIncludeFontPadding(includepad);
|
||||
@@ -935,6 +942,20 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
|
||||
view.setAutoFocus(autoFocus);
|
||||
}
|
||||
|
||||
@ReactProp(name = ViewProps.TEXT_DECORATION_LINE)
|
||||
public void setTextDecorationLine(ReactEditText view, @Nullable String textDecorationLineString) {
|
||||
view.setPaintFlags(
|
||||
view.getPaintFlags() & ~(Paint.STRIKE_THRU_TEXT_FLAG | Paint.UNDERLINE_TEXT_FLAG));
|
||||
|
||||
for (String token : textDecorationLineString.split(" ")) {
|
||||
if (token.equals("underline")) {
|
||||
view.setPaintFlags(view.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
|
||||
} else if (token.equals("line-through")) {
|
||||
view.setPaintFlags(view.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ReactPropGroup(
|
||||
names = {
|
||||
ViewProps.BORDER_WIDTH,
|
||||
@@ -1329,9 +1350,6 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
|
||||
TextLayoutManager.getOrCreateSpannableForText(
|
||||
view.getContext(), attributedString, mReactTextViewManagerCallback);
|
||||
|
||||
boolean containsMultipleFragments =
|
||||
attributedString.getArray("fragments").toArrayList().size() > 1;
|
||||
|
||||
int textBreakStrategy =
|
||||
TextAttributeProps.getTextBreakStrategy(
|
||||
paragraphAttributes.getString(ViewProps.TEXT_BREAK_STRATEGY));
|
||||
@@ -1344,8 +1362,7 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
|
||||
TextAttributeProps.getTextAlignment(
|
||||
props, TextLayoutManager.isRTL(attributedString), view.getGravityHorizontal()),
|
||||
textBreakStrategy,
|
||||
TextAttributeProps.getJustificationMode(props, currentJustificationMode),
|
||||
containsMultipleFragments);
|
||||
TextAttributeProps.getJustificationMode(props, currentJustificationMode));
|
||||
}
|
||||
|
||||
public Object getReactTextUpdate(ReactEditText view, ReactStylesDiffMap props, MapBuffer state) {
|
||||
@@ -1366,9 +1383,6 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
|
||||
TextLayoutManagerMapBuffer.getOrCreateSpannableForText(
|
||||
view.getContext(), attributedString, mReactTextViewManagerCallback);
|
||||
|
||||
boolean containsMultipleFragments =
|
||||
attributedString.getMapBuffer(TextLayoutManagerMapBuffer.AS_KEY_FRAGMENTS).getCount() > 1;
|
||||
|
||||
int textBreakStrategy =
|
||||
TextAttributeProps.getTextBreakStrategy(
|
||||
paragraphAttributes.getString(TextLayoutManagerMapBuffer.PA_KEY_TEXT_BREAK_STRATEGY));
|
||||
@@ -1381,7 +1395,6 @@ public class ReactTextInputManager extends BaseViewManager<ReactEditText, Layout
|
||||
TextAttributeProps.getTextAlignment(
|
||||
props, TextLayoutManagerMapBuffer.isRTL(attributedString), view.getGravityHorizontal()),
|
||||
textBreakStrategy,
|
||||
TextAttributeProps.getJustificationMode(props, currentJustificationMode),
|
||||
containsMultipleFragments);
|
||||
TextAttributeProps.getJustificationMode(props, currentJustificationMode));
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -19,6 +19,7 @@ public class ReactViewBackgroundManager {
|
||||
|
||||
private @Nullable ReactViewBackgroundDrawable mReactBackgroundDrawable;
|
||||
private View mView;
|
||||
private int mColor = Color.TRANSPARENT;
|
||||
|
||||
public ReactViewBackgroundManager(View view) {
|
||||
this.mView = view;
|
||||
@@ -56,6 +57,10 @@ public class ReactViewBackgroundManager {
|
||||
}
|
||||
}
|
||||
|
||||
public int getBackgroundColor() {
|
||||
return mColor;
|
||||
}
|
||||
|
||||
public void setBorderWidth(int position, float width) {
|
||||
getOrCreateReactViewBackground().setBorderWidth(position, width);
|
||||
}
|
||||
|
||||
@@ -429,6 +429,9 @@ void Binding::installFabricUIManager(
|
||||
"CalculateTransformedFramesEnabled",
|
||||
getFeatureFlagValue("calculateTransformedFramesEnabled"));
|
||||
|
||||
CoreFeatures::cacheLastTextMeasurement =
|
||||
getFeatureFlagValue("enableTextMeasureCachePerShadowNode");
|
||||
|
||||
// Props setter pattern feature
|
||||
CoreFeatures::enablePropIteratorSetter =
|
||||
getFeatureFlagValue("enableCppPropsIteratorSetter");
|
||||
|
||||
@@ -16,7 +16,15 @@ else
|
||||
source[:tag] = "v#{version}"
|
||||
end
|
||||
|
||||
react_native_path = ".."
|
||||
# We are using two different paths for react native because of the way how js_srcs_dir and output_dir options are used
|
||||
# output_dir option usage was introduced in https://github.com/facebook/react-native/pull/36210
|
||||
# React-rncore.podspec is the only podspec in the project that uses this option
|
||||
# We should rethink this approach in T148704916
|
||||
|
||||
# Relative path to react native from iOS project root (e.g. <ios-project-root>/../node_modules/react-native)
|
||||
react_native_dependency_path = ENV['REACT_NATIVE_PATH']
|
||||
# Relative path to react native from current podspec
|
||||
react_native_sources_path = '..'
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "React-rncore"
|
||||
@@ -33,10 +41,10 @@ Pod::Spec.new do |s|
|
||||
|
||||
|
||||
use_react_native_codegen!(s, {
|
||||
:react_native_path => react_native_path,
|
||||
:js_srcs_dir => "#{react_native_path}/Libraries",
|
||||
:react_native_path => react_native_sources_path,
|
||||
:js_srcs_dir => "#{react_native_sources_path}/Libraries",
|
||||
:library_name => "rncore",
|
||||
:library_type => "components",
|
||||
:output_dir => "#{react_native_path}/react-native/ReactCommon"
|
||||
:output_dir => "#{react_native_dependency_path}/ReactCommon"
|
||||
})
|
||||
end
|
||||
|
||||
@@ -15,10 +15,10 @@
|
||||
namespace facebook::react {
|
||||
|
||||
constexpr struct {
|
||||
int32_t Major = 1000;
|
||||
int32_t Minor = 0;
|
||||
int32_t Major = 0;
|
||||
int32_t Minor = 72;
|
||||
int32_t Patch = 0;
|
||||
std::string_view Prerelease = "";
|
||||
std::string_view Prerelease = "rc.1";
|
||||
} ReactNativeVersion;
|
||||
|
||||
} // namespace facebook::react
|
||||
|
||||
@@ -24,6 +24,9 @@ bool EmptyReactNativeConfig::getBool(const std::string ¶m) const {
|
||||
if (param == "react_fabric:enabled_layout_animations_ios") {
|
||||
return true;
|
||||
}
|
||||
if (param == "react_fabric:enable_nstextstorage_caching") {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -33,7 +33,10 @@ typedef void (^InterceptorBlock)(std::string eventName, folly::dynamic event);
|
||||
|
||||
- (NSString *)componentViewName;
|
||||
|
||||
- (void)handleCommand:(NSString *)commandName args:(NSArray *)args reactTag:(NSInteger)tag;
|
||||
- (void)handleCommand:(NSString *)commandName
|
||||
args:(NSArray *)args
|
||||
reactTag:(NSInteger)tag
|
||||
paperView:(UIView *)paperView;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
+49
-2
@@ -100,13 +100,23 @@ using namespace facebook::react;
|
||||
return RCTDropReactPrefixes(_componentData.name);
|
||||
}
|
||||
|
||||
- (void)handleCommand:(NSString *)commandName args:(NSArray *)args reactTag:(NSInteger)tag
|
||||
- (void)handleCommand:(NSString *)commandName
|
||||
args:(NSArray *)args
|
||||
reactTag:(NSInteger)tag
|
||||
paperView:(nonnull UIView *)paperView
|
||||
{
|
||||
Class managerClass = _componentData.managerClass;
|
||||
[self _lookupModuleMethodsIfNecessary];
|
||||
RCTModuleData *moduleData = [_bridge.batchedBridge moduleDataForName:RCTBridgeModuleNameForClass(managerClass)];
|
||||
id<RCTBridgeMethod> method;
|
||||
if ([commandName isKindOfClass:[NSNumber class]]) {
|
||||
|
||||
// We can't use `[NSString intValue]` as "0" is a valid command,
|
||||
// but also a falsy value. [NSNumberFormatter numberFromString] returns a
|
||||
// `NSNumber *` which is NULL when it's to be NULL
|
||||
// and it points to 0 when the string is @"0" (not a falsy value).
|
||||
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
|
||||
|
||||
if ([commandName isKindOfClass:[NSNumber class]] || [formatter numberFromString:commandName] != NULL) {
|
||||
method = moduleData ? moduleData.methods[[commandName intValue]] : _moduleMethods[[commandName intValue]];
|
||||
} else if ([commandName isKindOfClass:[NSString class]]) {
|
||||
method = moduleData ? moduleData.methodsByName[commandName] : _moduleMethodsByName[commandName];
|
||||
@@ -121,12 +131,14 @@ using namespace facebook::react;
|
||||
NSArray *newArgs = [@[ [NSNumber numberWithInteger:tag] ] arrayByAddingObjectsFromArray:args];
|
||||
|
||||
if (_bridge) {
|
||||
[self _addViewToRegistry:paperView withTag:tag];
|
||||
[_bridge.batchedBridge
|
||||
dispatchBlock:^{
|
||||
[method invokeWithBridge:self->_bridge module:self->_componentData.manager arguments:newArgs];
|
||||
[self->_bridge.uiManager setNeedsLayout];
|
||||
}
|
||||
queue:RCTGetUIManagerQueue()];
|
||||
[self _removeViewFromRegistryWithTag:tag];
|
||||
} else {
|
||||
// TODO T86826778 - Figure out which queue this should be dispatched to.
|
||||
[method invokeWithBridge:nil module:self->_componentData.manager arguments:newArgs];
|
||||
@@ -134,6 +146,41 @@ using namespace facebook::react;
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
- (void)_addViewToRegistry:(UIView *)view withTag:(NSInteger)tag
|
||||
{
|
||||
[self _addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
||||
if ([viewRegistry objectForKey:@(tag)] != NULL) {
|
||||
return;
|
||||
}
|
||||
NSMutableDictionary<NSNumber *, UIView *> *mutableViewRegistry =
|
||||
(NSMutableDictionary<NSNumber *, UIView *> *)viewRegistry;
|
||||
[mutableViewRegistry setObject:view forKey:@(tag)];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)_removeViewFromRegistryWithTag:(NSInteger)tag
|
||||
{
|
||||
[self _addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
||||
if ([viewRegistry objectForKey:@(tag)] == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
NSMutableDictionary<NSNumber *, UIView *> *mutableViewRegistry =
|
||||
(NSMutableDictionary<NSNumber *, UIView *> *)viewRegistry;
|
||||
[mutableViewRegistry removeObjectForKey:@(tag)];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)_addUIBlock:(RCTViewManagerUIBlock)block
|
||||
{
|
||||
__weak __typeof__(self) weakSelf = self;
|
||||
[_bridge.batchedBridge
|
||||
dispatchBlock:^{
|
||||
__typeof__(self) strongSelf = weakSelf;
|
||||
[strongSelf->_bridge.uiManager addUIBlock:block];
|
||||
}
|
||||
queue:RCTGetUIManagerQueue()];
|
||||
}
|
||||
|
||||
// This is copy-pasta from RCTModuleData.
|
||||
- (void)_lookupModuleMethodsIfNecessary
|
||||
|
||||
+30
-5
@@ -15,6 +15,19 @@ TextMeasurement ParagraphLayoutManager::measure(
|
||||
AttributedString const &attributedString,
|
||||
ParagraphAttributes const ¶graphAttributes,
|
||||
LayoutConstraints layoutConstraints) const {
|
||||
bool cacheLastTextMeasurement = CoreFeatures::cacheLastTextMeasurement;
|
||||
if (cacheLastTextMeasurement &&
|
||||
(layoutConstraints.maximumSize.width == availableWidth_ ||
|
||||
layoutConstraints.maximumSize.width ==
|
||||
cachedTextMeasurement_.size.width)) {
|
||||
/* Yoga has requested measurement for this size before. Let's use cached
|
||||
* value. `TextLayoutManager` might not have cached this because it could be
|
||||
* using different width to generate cache key. This happens because Yoga
|
||||
* switches between available width and exact width but since we already
|
||||
* know exact width, it is wasteful to calculate it again.
|
||||
*/
|
||||
return cachedTextMeasurement_;
|
||||
}
|
||||
if (CoreFeatures::cacheNSTextStorage) {
|
||||
size_t newHash = folly::hash::hash_combine(
|
||||
0,
|
||||
@@ -28,11 +41,23 @@ TextMeasurement ParagraphLayoutManager::measure(
|
||||
}
|
||||
}
|
||||
|
||||
return textLayoutManager_->measure(
|
||||
AttributedStringBox(attributedString),
|
||||
paragraphAttributes,
|
||||
layoutConstraints,
|
||||
hostTextStorage_);
|
||||
if (cacheLastTextMeasurement) {
|
||||
cachedTextMeasurement_ = textLayoutManager_->measure(
|
||||
AttributedStringBox(attributedString),
|
||||
paragraphAttributes,
|
||||
layoutConstraints,
|
||||
hostTextStorage_);
|
||||
|
||||
availableWidth_ = layoutConstraints.maximumSize.width;
|
||||
|
||||
return cachedTextMeasurement_;
|
||||
} else {
|
||||
return textLayoutManager_->measure(
|
||||
AttributedStringBox(attributedString),
|
||||
paragraphAttributes,
|
||||
layoutConstraints,
|
||||
hostTextStorage_);
|
||||
}
|
||||
}
|
||||
|
||||
LinesMeasurements ParagraphLayoutManager::measureLines(
|
||||
|
||||
+12
@@ -54,6 +54,18 @@ class ParagraphLayoutManager {
|
||||
std::shared_ptr<TextLayoutManager const> mutable textLayoutManager_{};
|
||||
std::shared_ptr<void> mutable hostTextStorage_{};
|
||||
|
||||
/* The width Yoga set as maximum width.
|
||||
* Yoga sometimes calls measure twice with two
|
||||
* different maximum width. One if available space.
|
||||
* The other one is exact space needed for the string.
|
||||
* This happens when node is dirtied but its size is not affected.
|
||||
* To deal with this inefficiency, we cache `TextMeasurement` for each
|
||||
* `ParagraphShadowNode`. If Yoga tries to re-measure with available width
|
||||
* or exact width, we provide it with the cached value.
|
||||
*/
|
||||
Float mutable availableWidth_{};
|
||||
TextMeasurement mutable cachedTextMeasurement_{};
|
||||
|
||||
size_t mutable hash_{};
|
||||
};
|
||||
} // namespace facebook::react
|
||||
|
||||
@@ -15,6 +15,7 @@ bool CoreFeatures::enableMapBuffer = false;
|
||||
bool CoreFeatures::blockPaintForUseLayoutEffect = false;
|
||||
bool CoreFeatures::useNativeState = false;
|
||||
bool CoreFeatures::cacheNSTextStorage = false;
|
||||
bool CoreFeatures::cacheLastTextMeasurement = false;
|
||||
|
||||
} // namespace react
|
||||
} // namespace facebook
|
||||
|
||||
@@ -39,6 +39,11 @@ class CoreFeatures {
|
||||
// creating it twice. Once when measuring text and once when rendering it.
|
||||
// This flag caches it inside ParagraphState.
|
||||
static bool cacheNSTextStorage;
|
||||
|
||||
// Yoga might measure multiple times the same Text with the same constraints
|
||||
// This flag enables a caching mechanism to avoid subsequents measurements
|
||||
// of the same Text with the same constrainst.
|
||||
static bool cacheLastTextMeasurement;
|
||||
};
|
||||
|
||||
} // namespace react
|
||||
|
||||
+5
-1
@@ -12,6 +12,7 @@
|
||||
#include <react/common/mapbuffer/JReadableMapBuffer.h>
|
||||
#include <react/jni/ReadableNativeMap.h>
|
||||
#include <react/renderer/attributedstring/conversions.h>
|
||||
#include <react/renderer/core/CoreFeatures.h>
|
||||
#include <react/renderer/core/conversions.h>
|
||||
#include <react/renderer/mapbuffer/MapBuffer.h>
|
||||
#include <react/renderer/mapbuffer/MapBufferBuilder.h>
|
||||
@@ -146,7 +147,10 @@ Size measureAndroidComponentMapBuffer(
|
||||
TextLayoutManager::TextLayoutManager(
|
||||
const ContextContainer::Shared &contextContainer)
|
||||
: contextContainer_(contextContainer),
|
||||
measureCache_(kSimpleThreadSafeCacheSizeCap) {}
|
||||
measureCache_(
|
||||
CoreFeatures::cacheLastTextMeasurement
|
||||
? 8096
|
||||
: kSimpleThreadSafeCacheSizeCap) {}
|
||||
|
||||
void *TextLayoutManager::getNativeTextLayoutManager() const {
|
||||
return self_;
|
||||
|
||||
+112
-83
@@ -52,47 +52,9 @@ static NSLineBreakMode RCTNSLineBreakModeFromEllipsizeMode(EllipsizeMode ellipsi
|
||||
textStorage = [self _textStorageForNSAttributesString:attributedString
|
||||
paragraphAttributes:paragraphAttributes
|
||||
size:maximumSize];
|
||||
} else {
|
||||
textStorage.layoutManagers.firstObject.textContainers.firstObject.size = maximumSize;
|
||||
}
|
||||
|
||||
NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject;
|
||||
NSTextContainer *textContainer = layoutManager.textContainers.firstObject;
|
||||
[layoutManager ensureLayoutForTextContainer:textContainer];
|
||||
|
||||
CGSize size = [layoutManager usedRectForTextContainer:textContainer].size;
|
||||
|
||||
size = (CGSize){RCTCeilPixelValue(size.width), RCTCeilPixelValue(size.height)};
|
||||
|
||||
__block auto attachments = TextMeasurement::Attachments{};
|
||||
|
||||
[textStorage
|
||||
enumerateAttribute:NSAttachmentAttributeName
|
||||
inRange:NSMakeRange(0, textStorage.length)
|
||||
options:0
|
||||
usingBlock:^(NSTextAttachment *attachment, NSRange range, BOOL *stop) {
|
||||
if (!attachment) {
|
||||
return;
|
||||
}
|
||||
|
||||
CGSize attachmentSize = attachment.bounds.size;
|
||||
CGRect glyphRect = [layoutManager boundingRectForGlyphRange:range inTextContainer:textContainer];
|
||||
|
||||
UIFont *font = [textStorage attribute:NSFontAttributeName atIndex:range.location effectiveRange:nil];
|
||||
|
||||
CGRect frame = {
|
||||
{glyphRect.origin.x,
|
||||
glyphRect.origin.y + glyphRect.size.height - attachmentSize.height + font.descender},
|
||||
attachmentSize};
|
||||
|
||||
auto rect = facebook::react::Rect{
|
||||
facebook::react::Point{frame.origin.x, frame.origin.y},
|
||||
facebook::react::Size{frame.size.width, frame.size.height}};
|
||||
|
||||
attachments.push_back(TextMeasurement::Attachment{rect, false});
|
||||
}];
|
||||
|
||||
return TextMeasurement{{size.width, size.height}, attachments};
|
||||
return [self _measureTextStorage:textStorage];
|
||||
}
|
||||
|
||||
- (TextMeasurement)measureAttributedString:(AttributedString)attributedString
|
||||
@@ -100,10 +62,14 @@ static NSLineBreakMode RCTNSLineBreakModeFromEllipsizeMode(EllipsizeMode ellipsi
|
||||
layoutConstraints:(LayoutConstraints)layoutConstraints
|
||||
textStorage:(NSTextStorage *_Nullable)textStorage
|
||||
{
|
||||
return [self measureNSAttributedString:[self _nsAttributedStringFromAttributedString:attributedString]
|
||||
paragraphAttributes:paragraphAttributes
|
||||
layoutConstraints:layoutConstraints
|
||||
textStorage:textStorage];
|
||||
if (textStorage) {
|
||||
return [self _measureTextStorage:textStorage];
|
||||
} else {
|
||||
return [self measureNSAttributedString:[self _nsAttributedStringFromAttributedString:attributedString]
|
||||
paragraphAttributes:paragraphAttributes
|
||||
layoutConstraints:layoutConstraints
|
||||
textStorage:nil];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)drawAttributedString:(AttributedString)attributedString
|
||||
@@ -111,13 +77,33 @@ static NSLineBreakMode RCTNSLineBreakModeFromEllipsizeMode(EllipsizeMode ellipsi
|
||||
frame:(CGRect)frame
|
||||
textStorage:(NSTextStorage *_Nullable)textStorage
|
||||
{
|
||||
BOOL createdStorageForFrame = NO;
|
||||
|
||||
if (!textStorage) {
|
||||
textStorage = [self textStorageForAttributesString:attributedString
|
||||
paragraphAttributes:paragraphAttributes
|
||||
size:frame.size];
|
||||
createdStorageForFrame = YES;
|
||||
}
|
||||
|
||||
NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject;
|
||||
NSTextContainer *textContainer = layoutManager.textContainers.firstObject;
|
||||
CGPoint origin = frame.origin;
|
||||
|
||||
if (!createdStorageForFrame) {
|
||||
CGRect rect = [layoutManager usedRectForTextContainer:textContainer];
|
||||
static auto threshold = 1.0 / RCTScreenScale() + 0.01; // Size of a pixel plus some small threshold.
|
||||
|
||||
// `rect`'s width is stored in double precesion.
|
||||
// `frame`'s width is also in double precesion but was stored as float in Yoga previously, precesion was lost.
|
||||
if (std::abs(RCTCeilPixelValue(rect.size.width) - frame.size.width) < threshold) {
|
||||
// `textStorage` passed to this method was used to calculate size of frame. If that's the case, it's
|
||||
// width is the same as frame's width. Origin must be adjusted, otherwise glyhps will be painted in wrong
|
||||
// place.
|
||||
// We could create new `NSTextStorage` for the specific frame, but that is expensive.
|
||||
origin.x -= RCTCeilPixelValue(rect.origin.x);
|
||||
}
|
||||
}
|
||||
|
||||
#if TARGET_OS_MACCATALYST
|
||||
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||
@@ -126,8 +112,8 @@ static NSLineBreakMode RCTNSLineBreakModeFromEllipsizeMode(EllipsizeMode ellipsi
|
||||
#endif
|
||||
|
||||
NSRange glyphRange = [layoutManager glyphRangeForTextContainer:textContainer];
|
||||
[layoutManager drawBackgroundForGlyphRange:glyphRange atPoint:frame.origin];
|
||||
[layoutManager drawGlyphsForGlyphRange:glyphRange atPoint:frame.origin];
|
||||
[layoutManager drawBackgroundForGlyphRange:glyphRange atPoint:origin];
|
||||
[layoutManager drawGlyphsForGlyphRange:glyphRange atPoint:origin];
|
||||
|
||||
#if TARGET_OS_MACCATALYST
|
||||
CGContextRestoreGState(context);
|
||||
@@ -178,35 +164,6 @@ static NSLineBreakMode RCTNSLineBreakModeFromEllipsizeMode(EllipsizeMode ellipsi
|
||||
return paragraphLines;
|
||||
}
|
||||
|
||||
- (NSTextStorage *)_textStorageForNSAttributesString:(NSAttributedString *)attributedString
|
||||
paragraphAttributes:(ParagraphAttributes)paragraphAttributes
|
||||
size:(CGSize)size
|
||||
{
|
||||
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:size];
|
||||
|
||||
textContainer.lineFragmentPadding = 0.0; // Note, the default value is 5.
|
||||
textContainer.lineBreakMode = paragraphAttributes.maximumNumberOfLines > 0
|
||||
? RCTNSLineBreakModeFromEllipsizeMode(paragraphAttributes.ellipsizeMode)
|
||||
: NSLineBreakByClipping;
|
||||
textContainer.maximumNumberOfLines = paragraphAttributes.maximumNumberOfLines;
|
||||
|
||||
NSLayoutManager *layoutManager = [NSLayoutManager new];
|
||||
layoutManager.usesFontLeading = NO;
|
||||
[layoutManager addTextContainer:textContainer];
|
||||
|
||||
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString];
|
||||
|
||||
[textStorage addLayoutManager:layoutManager];
|
||||
|
||||
if (paragraphAttributes.adjustsFontSizeToFit) {
|
||||
CGFloat minimumFontSize = !isnan(paragraphAttributes.minimumFontSize) ? paragraphAttributes.minimumFontSize : 4.0;
|
||||
CGFloat maximumFontSize = !isnan(paragraphAttributes.maximumFontSize) ? paragraphAttributes.maximumFontSize : 96.0;
|
||||
[textStorage scaleFontSizeToFitSize:size minimumFontSize:minimumFontSize maximumFontSize:maximumFontSize];
|
||||
}
|
||||
|
||||
return textStorage;
|
||||
}
|
||||
|
||||
- (NSTextStorage *)textStorageForAttributesString:(AttributedString)attributedString
|
||||
paragraphAttributes:(ParagraphAttributes)paragraphAttributes
|
||||
size:(CGSize)size
|
||||
@@ -246,15 +203,6 @@ static NSLineBreakMode RCTNSLineBreakModeFromEllipsizeMode(EllipsizeMode ellipsi
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSAttributedString *)_nsAttributedStringFromAttributedString:(AttributedString)attributedString
|
||||
{
|
||||
auto sharedNSAttributedString = _cache.get(attributedString, [](AttributedString attributedString) {
|
||||
return wrapManagedObject(RCTNSAttributedStringFromAttributedString(attributedString));
|
||||
});
|
||||
|
||||
return unwrapManagedObject(sharedNSAttributedString);
|
||||
}
|
||||
|
||||
- (void)getRectWithAttributedString:(AttributedString)attributedString
|
||||
paragraphAttributes:(ParagraphAttributes)paragraphAttributes
|
||||
enumerateAttribute:(NSString *)enumerateAttribute
|
||||
@@ -294,4 +242,85 @@ static NSLineBreakMode RCTNSLineBreakModeFromEllipsizeMode(EllipsizeMode ellipsi
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Private
|
||||
|
||||
- (NSTextStorage *)_textStorageForNSAttributesString:(NSAttributedString *)attributedString
|
||||
paragraphAttributes:(ParagraphAttributes)paragraphAttributes
|
||||
size:(CGSize)size
|
||||
{
|
||||
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:size];
|
||||
|
||||
textContainer.lineFragmentPadding = 0.0; // Note, the default value is 5.
|
||||
textContainer.lineBreakMode = paragraphAttributes.maximumNumberOfLines > 0
|
||||
? RCTNSLineBreakModeFromEllipsizeMode(paragraphAttributes.ellipsizeMode)
|
||||
: NSLineBreakByClipping;
|
||||
textContainer.maximumNumberOfLines = paragraphAttributes.maximumNumberOfLines;
|
||||
|
||||
NSLayoutManager *layoutManager = [NSLayoutManager new];
|
||||
layoutManager.usesFontLeading = NO;
|
||||
[layoutManager addTextContainer:textContainer];
|
||||
|
||||
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString];
|
||||
|
||||
[textStorage addLayoutManager:layoutManager];
|
||||
|
||||
if (paragraphAttributes.adjustsFontSizeToFit) {
|
||||
CGFloat minimumFontSize = !isnan(paragraphAttributes.minimumFontSize) ? paragraphAttributes.minimumFontSize : 4.0;
|
||||
CGFloat maximumFontSize = !isnan(paragraphAttributes.maximumFontSize) ? paragraphAttributes.maximumFontSize : 96.0;
|
||||
[textStorage scaleFontSizeToFitSize:size minimumFontSize:minimumFontSize maximumFontSize:maximumFontSize];
|
||||
}
|
||||
|
||||
return textStorage;
|
||||
}
|
||||
|
||||
- (NSAttributedString *)_nsAttributedStringFromAttributedString:(AttributedString)attributedString
|
||||
{
|
||||
auto sharedNSAttributedString = _cache.get(attributedString, [](AttributedString attributedString) {
|
||||
return wrapManagedObject(RCTNSAttributedStringFromAttributedString(attributedString));
|
||||
});
|
||||
|
||||
return unwrapManagedObject(sharedNSAttributedString);
|
||||
}
|
||||
|
||||
- (TextMeasurement)_measureTextStorage:(NSTextStorage *)textStorage
|
||||
{
|
||||
NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject;
|
||||
NSTextContainer *textContainer = layoutManager.textContainers.firstObject;
|
||||
[layoutManager ensureLayoutForTextContainer:textContainer];
|
||||
|
||||
CGSize size = [layoutManager usedRectForTextContainer:textContainer].size;
|
||||
|
||||
size = (CGSize){RCTCeilPixelValue(size.width), RCTCeilPixelValue(size.height)};
|
||||
|
||||
__block auto attachments = TextMeasurement::Attachments{};
|
||||
|
||||
[textStorage
|
||||
enumerateAttribute:NSAttachmentAttributeName
|
||||
inRange:NSMakeRange(0, textStorage.length)
|
||||
options:0
|
||||
usingBlock:^(NSTextAttachment *attachment, NSRange range, BOOL *stop) {
|
||||
if (!attachment) {
|
||||
return;
|
||||
}
|
||||
|
||||
CGSize attachmentSize = attachment.bounds.size;
|
||||
CGRect glyphRect = [layoutManager boundingRectForGlyphRange:range inTextContainer:textContainer];
|
||||
|
||||
UIFont *font = [textStorage attribute:NSFontAttributeName atIndex:range.location effectiveRange:nil];
|
||||
|
||||
CGRect frame = {
|
||||
{glyphRect.origin.x,
|
||||
glyphRect.origin.y + glyphRect.size.height - attachmentSize.height + font.descender},
|
||||
attachmentSize};
|
||||
|
||||
auto rect = facebook::react::Rect{
|
||||
facebook::react::Point{frame.origin.x, frame.origin.y},
|
||||
facebook::react::Size{frame.size.width, frame.size.height}};
|
||||
|
||||
attachments.push_back(TextMeasurement::Attachment{rect, false});
|
||||
}];
|
||||
|
||||
return TextMeasurement{{size.width, size.height}, attachments};
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1 +1,18 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
// This is the top level build.gradle.kts file used when the users
|
||||
// is doing a build from source. It's triggered as the user
|
||||
// will add an `includeBuild(../node_modules/react-native)` in
|
||||
// their settings.gradle.kts file.
|
||||
// More on this here: https://reactnative.dev/contributing/how-to-build-from-source
|
||||
plugins {
|
||||
id("com.android.library") version "7.4.2" apply false
|
||||
id("com.android.application") version "7.4.2" apply false
|
||||
id("de.undercouch.download") version "5.0.1" apply false
|
||||
kotlin("android") version "1.7.22" apply false
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
android.useAndroidX=true
|
||||
@@ -9,14 +9,15 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const {getDefaultConfig} = require('@react-native/metro-config');
|
||||
const {mergeConfig} = require('metro-config');
|
||||
const path = require('path');
|
||||
const getPolyfills = require('./rn-get-polyfills');
|
||||
|
||||
/**
|
||||
* This cli config is needed for development purposes, e.g. for running
|
||||
* integration tests during local development or on CI services.
|
||||
*/
|
||||
module.exports = {
|
||||
const config = {
|
||||
// Make Metro able to resolve required packages that might be imported from /packages/react-native
|
||||
watchFolders: [
|
||||
path.resolve(__dirname, '../../node_modules'),
|
||||
@@ -31,7 +32,6 @@ module.exports = {
|
||||
'react-native': __dirname,
|
||||
},
|
||||
},
|
||||
serializer: {
|
||||
getPolyfills,
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "react-native",
|
||||
"version": "1000.0.0",
|
||||
"version": "0.72.0-rc.1",
|
||||
"bin": "./cli.js",
|
||||
"description": "A framework for building native apps using React",
|
||||
"license": "MIT",
|
||||
@@ -79,15 +79,15 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@jest/create-cache-key-function": "^29.2.1",
|
||||
"@react-native-community/cli": "11.0.0-alpha.2",
|
||||
"@react-native-community/cli-platform-android": "11.0.0-alpha.2",
|
||||
"@react-native-community/cli-platform-ios": "11.0.0-alpha.2",
|
||||
"@react-native-community/cli": "11.1.1",
|
||||
"@react-native-community/cli-platform-android": "11.1.1",
|
||||
"@react-native-community/cli-platform-ios": "11.1.1",
|
||||
"@react-native/assets-registry": "^0.72.0",
|
||||
"@react-native/codegen": "^0.72.3",
|
||||
"@react-native/gradle-plugin": "^0.72.5",
|
||||
"@react-native/codegen": "^0.72.4",
|
||||
"@react-native/gradle-plugin": "^0.72.6",
|
||||
"@react-native/js-polyfills": "^0.72.1",
|
||||
"@react-native/normalize-colors": "^0.72.0",
|
||||
"@react-native/virtualized-lists": "^0.72.2",
|
||||
"@react-native/virtualized-lists": "^0.72.4",
|
||||
"abort-controller": "^3.0.0",
|
||||
"anser": "^1.4.9",
|
||||
"base64-js": "^1.1.2",
|
||||
@@ -98,8 +98,8 @@
|
||||
"jest-environment-node": "^29.2.1",
|
||||
"jsc-android": "^250231.0.0",
|
||||
"memoize-one": "^5.0.0",
|
||||
"metro-runtime": "0.75.1",
|
||||
"metro-source-map": "0.75.1",
|
||||
"metro-runtime": "0.76.0",
|
||||
"metro-source-map": "0.76.0",
|
||||
"mkdirp": "^0.5.1",
|
||||
"nullthrows": "^1.1.1",
|
||||
"pretty-format": "^26.5.2",
|
||||
@@ -133,4 +133,4 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,14 @@ require_relative "./test_utils/CodegenUtilsMock.rb"
|
||||
require_relative "./test_utils/CodegenScriptPhaseExtractorMock.rb"
|
||||
require_relative "./test_utils/FileUtilsMock.rb"
|
||||
|
||||
# mocking the min_ios_version_supported function
|
||||
# as it is not possible to require the original react_native_pod
|
||||
# without incurring in circular deps
|
||||
# TODO: move `min_ios_version_supported` to utils.rb
|
||||
def min_ios_version_supported
|
||||
return '12.4'
|
||||
end
|
||||
|
||||
class CodegenUtilsTests < Test::Unit::TestCase
|
||||
:base_path
|
||||
|
||||
@@ -527,7 +535,7 @@ class CodegenUtilsTests < Test::Unit::TestCase
|
||||
'source' => { :git => '' },
|
||||
'header_mappings_dir' => './',
|
||||
'platforms' => {
|
||||
'ios' => '11.0',
|
||||
'ios' => '12.4',
|
||||
},
|
||||
'source_files' => "**/*.{h,mm,cpp}",
|
||||
'pod_target_xcconfig' => {
|
||||
|
||||
@@ -111,7 +111,7 @@ class CodegenUtils
|
||||
'source' => { :git => '' },
|
||||
'header_mappings_dir' => './',
|
||||
'platforms' => {
|
||||
'ios' => '11.0',
|
||||
'ios' => min_ios_version_supported,
|
||||
},
|
||||
'source_files' => "**/*.{h,mm,cpp}",
|
||||
'pod_target_xcconfig' => {
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
hermes-2023-03-20-RNv0.72.0-49794cfc7c81fb8f69fd60c3bbf85a7480cc5a77
|
||||
@@ -1 +1,31 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
// This is the settings.gradle.kts file used when the users
|
||||
// is doing a build from source. It's triggered as the user
|
||||
// will add an `includeBuild(../node_modules/react-native)` in
|
||||
// their settings.gradle.kts file.
|
||||
// More on this here: https://reactnative.dev/contributing/how-to-build-from-source
|
||||
|
||||
pluginManagement {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
google()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = "react-native-github"
|
||||
|
||||
include(":packages:react-native:ReactAndroid")
|
||||
|
||||
project(":packages:react-native:ReactAndroid").projectDir = file("ReactAndroid/")
|
||||
|
||||
include(":packages:react-native:ReactAndroid:hermes-engine")
|
||||
|
||||
project(":packages:react-native:ReactAndroid:hermes-engine").projectDir =
|
||||
file("ReactAndroid/hermes-engine/")
|
||||
|
||||
@@ -1,17 +1,11 @@
|
||||
/**
|
||||
* Metro configuration for React Native
|
||||
* https://github.com/facebook/react-native
|
||||
*
|
||||
* @format
|
||||
*/
|
||||
const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
|
||||
|
||||
module.exports = {
|
||||
transformer: {
|
||||
getTransformOptions: async () => ({
|
||||
transform: {
|
||||
experimentalImportSupport: false,
|
||||
inlineRequires: true,
|
||||
},
|
||||
}),
|
||||
},
|
||||
};
|
||||
/**
|
||||
* Metro configuration
|
||||
* https://facebook.github.io/metro/docs/configuration
|
||||
*
|
||||
* @type {import('metro-config').MetroConfig}
|
||||
*/
|
||||
const config = {};
|
||||
|
||||
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
|
||||
|
||||
@@ -11,20 +11,22 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"react": "18.2.0",
|
||||
"react-native": "1000.0.0"
|
||||
"react-native": "0.72.0-rc.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.20.0",
|
||||
"@babel/preset-env": "^7.20.0",
|
||||
"@babel/runtime": "^7.12.5",
|
||||
"@react-native/eslint-config": "^0.72.1",
|
||||
"@react-native/metro-config": "^0.72.1",
|
||||
"@tsconfig/react-native": "^2.0.2",
|
||||
"@types/metro-config": "^0.76.1",
|
||||
"@types/react": "^18.0.24",
|
||||
"@types/react-test-renderer": "^18.0.0",
|
||||
"babel-jest": "^29.2.1",
|
||||
"eslint": "^8.19.0",
|
||||
"jest": "^29.2.1",
|
||||
"metro-react-native-babel-preset": "0.75.1",
|
||||
"metro-react-native-babel-preset": "0.76.0",
|
||||
"prettier": "^2.4.1",
|
||||
"react-test-renderer": "18.2.0",
|
||||
"typescript": "4.8.4"
|
||||
|
||||
@@ -30,9 +30,41 @@ RCT_REMAP_VIEW_PROPERTY(opacity, alpha, CGFloat)
|
||||
|
||||
RCT_EXPORT_VIEW_PROPERTY(onColorChanged, RCTBubblingEventBlock)
|
||||
|
||||
RCT_CUSTOM_VIEW_PROPERTY(cornerRadius, CGFloat, RNTLegacyView)
|
||||
{
|
||||
view.clipsToBounds = true;
|
||||
NSNumber *cornerRadius = (NSNumber *)json;
|
||||
view.layer.cornerRadius = [cornerRadius floatValue];
|
||||
}
|
||||
|
||||
RCT_EXPORT_METHOD(changeBackgroundColor : (nonnull NSNumber *)reactTag color : (NSString *)color)
|
||||
{
|
||||
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
||||
UIView *view = viewRegistry[reactTag];
|
||||
if (!view || ![view isKindOfClass:[RNTLegacyView class]]) {
|
||||
RCTLogError(@"Cannot find RNTLegacyView with tag #%@", reactTag);
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned rgbValue = 0;
|
||||
NSString *colorString = [NSString stringWithCString:std::string([color UTF8String]).c_str()
|
||||
encoding:[NSString defaultCStringEncoding]];
|
||||
NSScanner *scanner = [NSScanner scannerWithString:colorString];
|
||||
[scanner setScanLocation:1]; // bypass '#' character
|
||||
[scanner scanHexInt:&rgbValue];
|
||||
|
||||
UIColor *newColor = [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16) / 255.0
|
||||
green:((rgbValue & 0xFF00) >> 8) / 255.0
|
||||
blue:(rgbValue & 0xFF) / 255.0
|
||||
alpha:1.0];
|
||||
view.backgroundColor = newColor;
|
||||
}];
|
||||
}
|
||||
|
||||
- (UIView *)view
|
||||
{
|
||||
RNTLegacyView *view = [[RNTLegacyView alloc] init];
|
||||
view.backgroundColor = UIColor.redColor;
|
||||
return view;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,9 +8,11 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import * as React from 'react';
|
||||
import type {HostComponent} from 'react-native';
|
||||
import type {ViewProps} from 'react-native/Libraries/Components/View/ViewPropTypes';
|
||||
import {requireNativeComponent} from 'react-native';
|
||||
import {requireNativeComponent, UIManager} from 'react-native';
|
||||
import ReactNative from '../../../react-native/Libraries/Renderer/shims/ReactNative';
|
||||
|
||||
type ColorChangedEvent = {
|
||||
nativeEvent: {
|
||||
@@ -32,6 +34,22 @@ type NativeProps = $ReadOnly<{|
|
||||
|
||||
export type MyLegacyViewType = HostComponent<NativeProps>;
|
||||
|
||||
export function callNativeMethodToChangeBackgroundColor(
|
||||
viewRef: React.ElementRef<MyLegacyViewType> | null,
|
||||
color: string,
|
||||
) {
|
||||
if (!viewRef) {
|
||||
console.log('viewRef is null');
|
||||
return;
|
||||
}
|
||||
UIManager.dispatchViewManagerCommand(
|
||||
ReactNative.findNodeHandle(viewRef),
|
||||
UIManager.getViewManagerConfig('RNTMyLegacyNativeView').Commands
|
||||
.changeBackgroundColor,
|
||||
[color],
|
||||
);
|
||||
}
|
||||
|
||||
export default (requireNativeComponent(
|
||||
'RNTMyLegacyNativeView',
|
||||
): HostComponent<NativeProps>);
|
||||
|
||||
@@ -10,13 +10,14 @@
|
||||
|
||||
import * as React from 'react';
|
||||
import {useRef, useState} from 'react';
|
||||
import {View, Button, Text} from 'react-native';
|
||||
import {View, Button, Text, UIManager} from 'react-native';
|
||||
import RNTMyNativeView, {
|
||||
Commands as RNTMyNativeViewCommands,
|
||||
} from './MyNativeViewNativeComponent';
|
||||
import RNTMyLegacyNativeView from './MyLegacyViewNativeComponent';
|
||||
import type {MyLegacyViewType} from './MyLegacyViewNativeComponent';
|
||||
import type {MyNativeViewType} from './MyNativeViewNativeComponent';
|
||||
import {UIManager} from 'react-native';
|
||||
import {callNativeMethodToChangeBackgroundColor} from './MyLegacyViewNativeComponent';
|
||||
|
||||
const colors = [
|
||||
'#0000FF',
|
||||
@@ -27,6 +28,8 @@ const colors = [
|
||||
'#000033',
|
||||
];
|
||||
|
||||
const cornerRadiuses = [0, 20, 40, 60, 80, 100, 120];
|
||||
|
||||
class HSBA {
|
||||
hue: number;
|
||||
saturation: number;
|
||||
@@ -50,21 +53,58 @@ class HSBA {
|
||||
}
|
||||
}
|
||||
|
||||
function beautify(number: number): string {
|
||||
if (number % 1 === 0) {
|
||||
return number.toFixed();
|
||||
}
|
||||
return number.toFixed(2);
|
||||
}
|
||||
|
||||
type MeasureStruct = {
|
||||
x: number,
|
||||
y: number,
|
||||
width: number,
|
||||
height: number,
|
||||
};
|
||||
|
||||
const MeasureStructZero: MeasureStruct = {
|
||||
x: 0,
|
||||
y: 0,
|
||||
width: 0,
|
||||
height: 0,
|
||||
};
|
||||
|
||||
function getTextFor(measureStruct: MeasureStruct): string {
|
||||
return `x: ${beautify(measureStruct.x)}, y: ${beautify(
|
||||
measureStruct.y,
|
||||
)}, width: ${beautify(measureStruct.width)}, height: ${beautify(
|
||||
measureStruct.height,
|
||||
)}`;
|
||||
}
|
||||
|
||||
// This is an example component that migrates to use the new architecture.
|
||||
export default function MyNativeView(props: {}): React.Node {
|
||||
const containerRef = useRef<typeof View | null>(null);
|
||||
const ref = useRef<React.ElementRef<MyNativeViewType> | null>(null);
|
||||
const legacyRef = useRef<React.ElementRef<MyLegacyViewType> | null>(null);
|
||||
const [opacity, setOpacity] = useState(1.0);
|
||||
const [color, setColor] = useState('#FF0000');
|
||||
const [hsba, setHsba] = useState<HSBA>(new HSBA());
|
||||
const [cornerRadiusIndex, setCornerRadiusIndex] = useState<number>(0);
|
||||
const [legacyMeasure, setLegacyMeasure] =
|
||||
useState<MeasureStruct>(MeasureStructZero);
|
||||
const [legacyMeasureInWindow, setLegacyMeasureInWindow] =
|
||||
useState<MeasureStruct>(MeasureStructZero);
|
||||
const [legacyMeasureLayout, setLegacyMeasureLayout] =
|
||||
useState<MeasureStruct>(MeasureStructZero);
|
||||
return (
|
||||
<View style={{flex: 1}}>
|
||||
<View ref={containerRef} style={{flex: 1}}>
|
||||
<Text style={{color: 'red'}}>Fabric View</Text>
|
||||
<RNTMyNativeView ref={ref} style={{flex: 1}} opacity={opacity} />
|
||||
<Text style={{color: 'red'}}>Legacy View</Text>
|
||||
<RNTMyLegacyNativeView
|
||||
ref={legacyRef}
|
||||
style={{flex: 1}}
|
||||
opacity={opacity}
|
||||
color={color}
|
||||
onColorChanged={event =>
|
||||
setHsba(
|
||||
new HSBA(
|
||||
@@ -76,8 +116,10 @@ export default function MyNativeView(props: {}): React.Node {
|
||||
)
|
||||
}
|
||||
/>
|
||||
<Text>HSBA: {hsba.toString()}</Text>
|
||||
<Text>
|
||||
<Text style={{color: 'green', textAlign: 'center'}}>
|
||||
HSBA: {hsba.toString()}
|
||||
</Text>
|
||||
<Text style={{color: 'green', textAlign: 'center'}}>
|
||||
Constants From Interop Layer:{' '}
|
||||
{UIManager.RNTMyLegacyNativeView.Constants.PI}
|
||||
</Text>
|
||||
@@ -85,12 +127,13 @@ export default function MyNativeView(props: {}): React.Node {
|
||||
title="Change Background"
|
||||
onPress={() => {
|
||||
let newColor = colors[Math.floor(Math.random() * 5)];
|
||||
setColor(newColor);
|
||||
RNTMyNativeViewCommands.callNativeMethodToChangeBackgroundColor(
|
||||
// $FlowFixMe[incompatible-call]
|
||||
ref.current,
|
||||
newColor,
|
||||
);
|
||||
|
||||
callNativeMethodToChangeBackgroundColor(legacyRef.current, newColor);
|
||||
}}
|
||||
/>
|
||||
<Button
|
||||
@@ -105,6 +148,49 @@ export default function MyNativeView(props: {}): React.Node {
|
||||
ref.current?.measure((x, y, width, height) => {
|
||||
console.log(x, y, width, height);
|
||||
});
|
||||
|
||||
legacyRef.current?.measure((x, y, width, height) => {
|
||||
setLegacyMeasure({x, y, width, height});
|
||||
});
|
||||
legacyRef.current?.measureInWindow((x, y, width, height) => {
|
||||
setLegacyMeasureInWindow({x, y, width, height});
|
||||
});
|
||||
|
||||
if (containerRef.current) {
|
||||
legacyRef.current?.measureLayout(
|
||||
// $FlowFixMe[incompatible-call]
|
||||
containerRef.current,
|
||||
(x, y, width, height) => {
|
||||
setLegacyMeasureLayout({x, y, width, height});
|
||||
},
|
||||
);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
|
||||
<Text style={{color: 'green', textAlign: 'center'}}>
|
||||
> Interop Layer Measurements <
|
||||
</Text>
|
||||
<Text style={{color: 'green', textAlign: 'center'}}>
|
||||
measure {getTextFor(legacyMeasure)}
|
||||
</Text>
|
||||
<Text style={{color: 'green', textAlign: 'center'}}>
|
||||
InWindow {getTextFor(legacyMeasureInWindow)}
|
||||
</Text>
|
||||
<Text style={{color: 'green', textAlign: 'center'}}>
|
||||
InLayout {getTextFor(legacyMeasureLayout)}
|
||||
</Text>
|
||||
<Button
|
||||
title="Test setNativeProps"
|
||||
onPress={() => {
|
||||
const newCRIndex =
|
||||
cornerRadiusIndex + 1 >= cornerRadiuses.length
|
||||
? 0
|
||||
: cornerRadiusIndex + 1;
|
||||
setCornerRadiusIndex(newCRIndex);
|
||||
legacyRef.current?.setNativeProps({
|
||||
cornerRadius: cornerRadiuses[newCRIndex],
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</View>
|
||||
|
||||
+537
-541
File diff suppressed because it is too large
Load Diff
@@ -160,7 +160,7 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot";
|
||||
|
||||
- (NSURL *)sourceURLForBridge:(__unused RCTBridge *)bridge
|
||||
{
|
||||
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"packages/rn-tester/js/RNTesterApp.ios"];
|
||||
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"js/RNTesterApp.ios"];
|
||||
}
|
||||
|
||||
- (void)initializeFlipper:(UIApplication *)application
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
},
|
||||
"testTargets" : [
|
||||
{
|
||||
"enabled": false,
|
||||
"target" : {
|
||||
"containerPath" : "container:RNTesterPods.xcodeproj",
|
||||
"identifier" : "E7DB215222B2F332005AC45F",
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ public class RNTesterApplication extends Application implements ReactApplication
|
||||
new DefaultReactNativeHost(this) {
|
||||
@Override
|
||||
public String getJSMainModuleName() {
|
||||
return "packages/rn-tester/js/RNTesterApp.android";
|
||||
return "js/RNTesterApp.android";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+46
@@ -11,17 +11,23 @@ import android.graphics.Color;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.common.MapBuilder;
|
||||
import com.facebook.react.module.annotations.ReactModule;
|
||||
import com.facebook.react.uimanager.SimpleViewManager;
|
||||
import com.facebook.react.uimanager.ThemedReactContext;
|
||||
import com.facebook.react.uimanager.ViewProps;
|
||||
import com.facebook.react.uimanager.annotations.ReactProp;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/** Legacy View manager (non Fabric compatible) for {@link MyNativeView} components. */
|
||||
@ReactModule(name = MyLegacyViewManager.REACT_CLASS)
|
||||
public class MyLegacyViewManager extends SimpleViewManager<MyNativeView> {
|
||||
|
||||
public static final String REACT_CLASS = "RNTMyLegacyNativeView";
|
||||
private static final Integer COMMAND_CHANGE_BACKGROUND_COLOR = 42;
|
||||
private final ReactApplicationContext mCallerContext;
|
||||
|
||||
public MyLegacyViewManager(ReactApplicationContext reactContext) {
|
||||
@@ -52,4 +58,44 @@ public class MyLegacyViewManager extends SimpleViewManager<MyNativeView> {
|
||||
public void setColor(@NonNull MyNativeView view, @Nullable String color) {
|
||||
view.setBackgroundColor(Color.parseColor(color));
|
||||
}
|
||||
|
||||
@ReactProp(name = "cornerRadius")
|
||||
public void setCornerRadius(@NonNull MyNativeView view, @Nullable float cornerRadius) {
|
||||
view.setCornerRadius(cornerRadius);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Map<String, Object> getExportedViewConstants() {
|
||||
return Collections.singletonMap("PI", 3.14);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Map<String, Object> getExportedCustomBubblingEventTypeConstants() {
|
||||
Map<String, Object> eventTypeConstants = new HashMap<String, Object>();
|
||||
eventTypeConstants.putAll(
|
||||
MapBuilder.<String, Object>builder()
|
||||
.put(
|
||||
"onColorChanged",
|
||||
MapBuilder.of(
|
||||
"phasedRegistrationNames",
|
||||
MapBuilder.of(
|
||||
"bubbled", "onColorChanged", "captured", "onColorChangedCapture")))
|
||||
.build());
|
||||
return eventTypeConstants;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void receiveCommand(
|
||||
@NonNull MyNativeView view, String commandId, @Nullable ReadableArray args) {
|
||||
if (commandId.contentEquals(COMMAND_CHANGE_BACKGROUND_COLOR.toString())) {
|
||||
int sentColor = Color.parseColor(args.getString(0));
|
||||
view.setBackgroundColor(sentColor);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Map<String, Integer> getCommandsMap() {
|
||||
return MapBuilder.of("changeBackgroundColor", COMMAND_CHANGE_BACKGROUND_COLOR);
|
||||
}
|
||||
}
|
||||
|
||||
+39
@@ -8,11 +8,50 @@
|
||||
package com.facebook.react.uiapp.component;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.GradientDrawable;
|
||||
import android.view.View;
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
||||
|
||||
class MyNativeView extends View {
|
||||
|
||||
private int currentColor = 0;
|
||||
private GradientDrawable background;
|
||||
|
||||
public MyNativeView(Context context) {
|
||||
super(context);
|
||||
background = new GradientDrawable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBackgroundColor(int color) {
|
||||
if (color != currentColor) {
|
||||
background.setColor(color);
|
||||
currentColor = color;
|
||||
emitNativeEvent(color);
|
||||
setBackground(background);
|
||||
}
|
||||
}
|
||||
|
||||
public void setCornerRadius(float cornerRadius) {
|
||||
background.setCornerRadius(cornerRadius);
|
||||
setBackground(background);
|
||||
}
|
||||
|
||||
private void emitNativeEvent(int color) {
|
||||
WritableMap event = Arguments.createMap();
|
||||
WritableMap backgroundColor = Arguments.createMap();
|
||||
float[] hsv = new float[3];
|
||||
Color.colorToHSV(color, hsv);
|
||||
backgroundColor.putDouble("hue", hsv[0]);
|
||||
backgroundColor.putDouble("saturation", hsv[1]);
|
||||
backgroundColor.putDouble("brightness", hsv[2]);
|
||||
backgroundColor.putDouble("alpha", Color.alpha(color));
|
||||
event.putMap("backgroundColor", backgroundColor);
|
||||
ReactContext reactContext = (ReactContext) getContext();
|
||||
reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(getId(), "onColorChanged", event);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,14 +9,17 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const {getDefaultConfig} = require('@react-native/metro-config');
|
||||
const {mergeConfig} = require('metro-config');
|
||||
const path = require('path');
|
||||
const getPolyfills = require('../react-native/rn-get-polyfills');
|
||||
|
||||
/**
|
||||
* This cli config is needed for development purposes, e.g. for running
|
||||
* integration tests during local development or on CI services.
|
||||
*
|
||||
* @type {import('metro-config').MetroConfig}
|
||||
*/
|
||||
module.exports = {
|
||||
const config = {
|
||||
// Make Metro able to resolve required external dependencies
|
||||
watchFolders: [
|
||||
path.resolve(__dirname, '../../node_modules'),
|
||||
@@ -32,7 +35,6 @@ module.exports = {
|
||||
'react-native': path.resolve(__dirname, '../react-native'),
|
||||
},
|
||||
},
|
||||
serializer: {
|
||||
getPolyfills,
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"directory": "packages/rn-tester"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "../react-native/scripts/packager.sh",
|
||||
"start": "react-native start",
|
||||
"install-android-jsc": "../../gradlew :packages:rn-tester:android:app:installJscDebug",
|
||||
"install-android-hermes": "../../gradlew :packages:rn-tester:android:app:installHermesDebug",
|
||||
"clean-android": "rm -rf android/app/build",
|
||||
@@ -20,9 +20,9 @@
|
||||
"clean-ios": "rm -rf build/generated/ios Pods Podfile.lock"
|
||||
},
|
||||
"dependencies": {
|
||||
"flow-enums-runtime": "^0.0.5",
|
||||
"invariant": "^2.2.4",
|
||||
"nullthrows": "^1.1.1",
|
||||
"flow-enums-runtime": "^0.0.5"
|
||||
"nullthrows": "^1.1.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "18.2.0",
|
||||
|
||||
@@ -1886,6 +1886,19 @@ class VirtualizedList extends StateSafePureComponent<Props, State> {
|
||||
const focusedCellIndex = lastFocusedCellRenderer.props.index;
|
||||
const itemCount = props.getItemCount(props.data);
|
||||
|
||||
// The last cell we rendered may be at a new index. Bail if we don't know
|
||||
// where it is.
|
||||
if (
|
||||
focusedCellIndex >= itemCount ||
|
||||
this._keyExtractor(
|
||||
props.getItem(props.data, focusedCellIndex),
|
||||
focusedCellIndex,
|
||||
props,
|
||||
) !== this._lastFocusedCellKey
|
||||
) {
|
||||
return [];
|
||||
}
|
||||
|
||||
let first = focusedCellIndex;
|
||||
let heightOfCellsBeforeFocused = 0;
|
||||
for (
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/virtualized-lists",
|
||||
"version": "0.72.2",
|
||||
"version": "0.72.4",
|
||||
"description": "Virtualized lists for React Native.",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
@@ -7,15 +7,18 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
const {spawnSync} = require('child_process');
|
||||
const {writeFileSync, readFileSync} = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const checkForGitChanges = require('./check-for-git-changes');
|
||||
const forEachPackage = require('./for-each-package');
|
||||
|
||||
const ROOT_LOCATION = path.join(__dirname, '..', '..');
|
||||
const TEMPLATE_LOCATION = path.join(ROOT_LOCATION, 'template');
|
||||
const TEMPLATE_LOCATION = path.join(
|
||||
ROOT_LOCATION,
|
||||
'packages',
|
||||
'react-native',
|
||||
'template',
|
||||
);
|
||||
|
||||
const readJSONFile = pathToFile => JSON.parse(readFileSync(pathToFile));
|
||||
|
||||
@@ -90,14 +93,6 @@ const checkIfShouldUpdateDependencyPackageVersion = (
|
||||
};
|
||||
|
||||
const alignPackageVersions = () => {
|
||||
if (checkForGitChanges()) {
|
||||
console.log(
|
||||
'\u274c Found uncommitted changes. Please commit or stash them before running this script',
|
||||
);
|
||||
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
forEachPackage((_, __, packageManifest) => {
|
||||
checkIfShouldUpdateDependencyPackageVersion(
|
||||
ROOT_LOCATION,
|
||||
@@ -121,21 +116,6 @@ const alignPackageVersions = () => {
|
||||
{includeReactNative: true},
|
||||
);
|
||||
});
|
||||
|
||||
if (!checkForGitChanges()) {
|
||||
console.log(
|
||||
'\u2705 There were no changes. Every consumer package uses the actual version of dependency package.',
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('Running yarn to update lock file...');
|
||||
spawnSync('yarn', ['install'], {
|
||||
cwd: ROOT_LOCATION,
|
||||
shell: true,
|
||||
stdio: 'inherit',
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
};
|
||||
|
||||
alignPackageVersions();
|
||||
module.exports = alignPackageVersions;
|
||||
|
||||
@@ -14,6 +14,7 @@ const path = require('path');
|
||||
const {echo, exec, exit} = require('shelljs');
|
||||
const yargs = require('yargs');
|
||||
|
||||
const alignPackageVersions = require('../align-package-versions');
|
||||
const {
|
||||
PUBLISH_PACKAGES_TAG,
|
||||
GENERIC_COMMIT_MESSAGE,
|
||||
@@ -157,76 +158,80 @@ const main = async () => {
|
||||
.then(() => echo());
|
||||
}
|
||||
|
||||
if (checkForGitChanges()) {
|
||||
await inquirer
|
||||
.prompt([
|
||||
{
|
||||
type: 'list',
|
||||
name: 'commitChoice',
|
||||
message: 'Do you want to submit a commit with these changes?',
|
||||
choices: [
|
||||
{
|
||||
name: 'Yes, with generic message',
|
||||
value: COMMIT_WITH_GENERIC_MESSAGE_CHOICE,
|
||||
},
|
||||
{
|
||||
name: 'Yes, with custom message',
|
||||
value: COMMIT_WITH_CUSTOM_MESSAGE_CHOICE,
|
||||
},
|
||||
{
|
||||
name: 'No',
|
||||
value: NO_COMMIT_CHOICE,
|
||||
},
|
||||
],
|
||||
},
|
||||
])
|
||||
.then(({commitChoice}) => {
|
||||
switch (commitChoice) {
|
||||
case NO_COMMIT_CHOICE: {
|
||||
echo('Not submitting a commit, but keeping all changes');
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case COMMIT_WITH_GENERIC_MESSAGE_CHOICE: {
|
||||
exec(`git commit -am "${GENERIC_COMMIT_MESSAGE}"`, {
|
||||
cwd: ROOT_LOCATION,
|
||||
silent: true,
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case COMMIT_WITH_CUSTOM_MESSAGE_CHOICE: {
|
||||
// exec from shelljs currently does not support interactive input
|
||||
// https://github.com/shelljs/shelljs/wiki/FAQ#running-interactive-programs-with-exec
|
||||
execSync('git commit -a', {cwd: ROOT_LOCATION, stdio: 'inherit'});
|
||||
|
||||
const enteredCommitMessage = exec(
|
||||
'git log -n 1 --format=format:%B',
|
||||
{
|
||||
cwd: ROOT_LOCATION,
|
||||
silent: true,
|
||||
},
|
||||
).stdout.trim();
|
||||
const commitMessageWithTag =
|
||||
enteredCommitMessage + `\n\n${PUBLISH_PACKAGES_TAG}`;
|
||||
|
||||
exec(`git commit --amend -m "${commitMessageWithTag}"`, {
|
||||
cwd: ROOT_LOCATION,
|
||||
silent: true,
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
throw new Error('');
|
||||
}
|
||||
})
|
||||
.then(() => echo());
|
||||
if (!checkForGitChanges()) {
|
||||
echo('No changes have been made. Finishing the process...');
|
||||
exit(0);
|
||||
}
|
||||
|
||||
echo('Aligning new versions across monorepo...');
|
||||
alignPackageVersions();
|
||||
echo(chalk.green('Done!\n'));
|
||||
|
||||
await inquirer
|
||||
.prompt([
|
||||
{
|
||||
type: 'list',
|
||||
name: 'commitChoice',
|
||||
message: 'Do you want to submit a commit with these changes?',
|
||||
choices: [
|
||||
{
|
||||
name: 'Yes, with generic message',
|
||||
value: COMMIT_WITH_GENERIC_MESSAGE_CHOICE,
|
||||
},
|
||||
{
|
||||
name: 'Yes, with custom message',
|
||||
value: COMMIT_WITH_CUSTOM_MESSAGE_CHOICE,
|
||||
},
|
||||
{
|
||||
name: 'No',
|
||||
value: NO_COMMIT_CHOICE,
|
||||
},
|
||||
],
|
||||
},
|
||||
])
|
||||
.then(({commitChoice}) => {
|
||||
switch (commitChoice) {
|
||||
case NO_COMMIT_CHOICE: {
|
||||
echo('Not submitting a commit, but keeping all changes');
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case COMMIT_WITH_GENERIC_MESSAGE_CHOICE: {
|
||||
exec(`git commit -am "${GENERIC_COMMIT_MESSAGE}"`, {
|
||||
cwd: ROOT_LOCATION,
|
||||
silent: true,
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case COMMIT_WITH_CUSTOM_MESSAGE_CHOICE: {
|
||||
// exec from shelljs currently does not support interactive input
|
||||
// https://github.com/shelljs/shelljs/wiki/FAQ#running-interactive-programs-with-exec
|
||||
execSync('git commit -a', {cwd: ROOT_LOCATION, stdio: 'inherit'});
|
||||
|
||||
const enteredCommitMessage = exec('git log -n 1 --format=format:%B', {
|
||||
cwd: ROOT_LOCATION,
|
||||
silent: true,
|
||||
}).stdout.trim();
|
||||
const commitMessageWithTag =
|
||||
enteredCommitMessage + `\n\n${PUBLISH_PACKAGES_TAG}`;
|
||||
|
||||
exec(`git commit --amend -m "${commitMessageWithTag}"`, {
|
||||
cwd: ROOT_LOCATION,
|
||||
silent: true,
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
throw new Error('');
|
||||
}
|
||||
})
|
||||
.then(() => echo());
|
||||
|
||||
echo(chalk.green('Successfully finished the process of bumping packages'));
|
||||
exit(0);
|
||||
};
|
||||
|
||||
+17
-10
@@ -75,9 +75,9 @@ waitForWebSocketServer() {
|
||||
|
||||
runTests() {
|
||||
# shellcheck disable=SC1091
|
||||
source "./scripts/.tests.env"
|
||||
source "$ROOT/scripts/.tests.env"
|
||||
xcodebuild build test \
|
||||
-workspace packages/rn-tester/RNTesterPods.xcworkspace \
|
||||
-workspace RNTesterPods.xcworkspace \
|
||||
-scheme RNTester \
|
||||
-sdk iphonesimulator \
|
||||
-destination "platform=iOS Simulator,name=$IOS_DEVICE,OS=$IOS_TARGET_OS" \
|
||||
@@ -86,7 +86,7 @@ runTests() {
|
||||
|
||||
buildProject() {
|
||||
xcodebuild build \
|
||||
-workspace packages/rn-tester/RNTesterPods.xcworkspace \
|
||||
-workspace RNTesterPods.xcworkspace \
|
||||
-scheme RNTester \
|
||||
-sdk iphonesimulator
|
||||
}
|
||||
@@ -105,16 +105,21 @@ xcbeautifyFormat() {
|
||||
xcbeautify --report junit --report-path "$REPORTS_DIR/ios/results.xml"
|
||||
}
|
||||
|
||||
preloadBundles() {
|
||||
# Preload the RNTesterApp bundle for better performance in integration tests
|
||||
curl -s 'http://localhost:8081/packages/rn-tester/js/RNTesterApp.ios.bundle?platform=ios&dev=true' -o /dev/null
|
||||
curl -s 'http://localhost:8081/packages/rn-tester/js/RNTesterApp.ios.bundle?platform=ios&dev=true&minify=false' -o /dev/null
|
||||
preloadBundlesRNIntegrationTests() {
|
||||
# Preload IntegrationTests bundles (/)
|
||||
# TODO(T149119847): These need to be relocated into a dir with a Metro config
|
||||
curl -s 'http://localhost:8081/IntegrationTests/IntegrationTestsApp.bundle?platform=ios&dev=true' -o /dev/null
|
||||
curl -s 'http://localhost:8081/IntegrationTests/RCTRootViewIntegrationTestApp.bundle?platform=ios&dev=true' -o /dev/null
|
||||
}
|
||||
|
||||
preloadBundlesRNTester() {
|
||||
# Preload RNTesterApp bundles (packages/rn-tester/)
|
||||
curl -s 'http://localhost:8081/js/RNTesterApp.ios.bundle?platform=ios&dev=true' -o /dev/null
|
||||
curl -s 'http://localhost:8081/js/RNTesterApp.ios.bundle?platform=ios&dev=true&minify=false' -o /dev/null
|
||||
}
|
||||
|
||||
main() {
|
||||
cd "$ROOT" || exit
|
||||
cd "$ROOT/packages/rn-tester" || exit
|
||||
|
||||
# If first argument is "test", actually start the packager and run tests.
|
||||
# Otherwise, just build RNTester and exit
|
||||
@@ -122,13 +127,15 @@ main() {
|
||||
|
||||
# Start the WebSocket test server
|
||||
echo "Launch WebSocket Server"
|
||||
sh "./IntegrationTests/launchWebSocketServer.sh" &
|
||||
sh "$ROOT/IntegrationTests/launchWebSocketServer.sh" &
|
||||
waitForWebSocketServer
|
||||
|
||||
# Start the packager
|
||||
yarn start --max-workers=1 || echo "Can't start packager automatically" &
|
||||
waitForPackager
|
||||
preloadBundles
|
||||
preloadBundlesRNTester
|
||||
# TODO(T149119847)
|
||||
# preloadBundlesRNIntegrationTests
|
||||
|
||||
# Build and run tests.
|
||||
if [ -x "$(command -v xcbeautify)" ]; then
|
||||
|
||||
@@ -49,6 +49,8 @@ const yargs = require('yargs');
|
||||
const buildTag = process.env.CIRCLE_TAG;
|
||||
const otp = process.env.NPM_CONFIG_OTP;
|
||||
|
||||
const RN_PACKAGE_DIR = path.join(__dirname, '..', 'packages', 'react-native');
|
||||
|
||||
const argv = yargs
|
||||
.option('n', {
|
||||
alias: 'nightly',
|
||||
@@ -167,7 +169,7 @@ const tagFlag = nightlyBuild
|
||||
// use otp from envvars if available
|
||||
const otpFlag = otp ? `--otp ${otp}` : '';
|
||||
|
||||
if (exec(`npm publish ${tagFlag} ${otpFlag}`).code) {
|
||||
if (exec(`npm publish ${tagFlag} ${otpFlag}`, {cwd: RN_PACKAGE_DIR}).code) {
|
||||
echo('Failed to publish package to npm');
|
||||
exit(1);
|
||||
} else {
|
||||
|
||||
+11
-11
@@ -34,7 +34,7 @@ const {
|
||||
const {
|
||||
downloadHermesSourceTarball,
|
||||
expandHermesSourceTarball,
|
||||
} = require('./hermes/hermes-utils');
|
||||
} = require('../packages/react-native/scripts/hermes/hermes-utils.js');
|
||||
|
||||
const argv = yargs
|
||||
.option('t', {
|
||||
@@ -78,6 +78,7 @@ if (argv.target === 'RNTester') {
|
||||
// FIXME: make sure that the commands retains colors
|
||||
// (--ansi) doesn't always work
|
||||
// see also https://github.com/shelljs/shelljs/issues/86
|
||||
pushd('packages/rn-tester');
|
||||
|
||||
if (argv.platform === 'iOS') {
|
||||
console.info(
|
||||
@@ -91,19 +92,17 @@ if (argv.target === 'RNTester') {
|
||||
// in your local setup - also: if I'm on release branch, I pick the
|
||||
// hermes ref from the hermes ref file (see hermes-engine.podspec)
|
||||
exec(
|
||||
`cd packages/rn-tester && USE_HERMES=${
|
||||
`USE_HERMES=${
|
||||
argv.hermes ? 1 : 0
|
||||
} CI=${onReleaseBranch} RCT_NEW_ARCH_ENABLED=1 bundle exec pod install --ansi`,
|
||||
);
|
||||
|
||||
// if everything succeeded so far, we can launch Metro and the app
|
||||
// start the Metro server in a separate window
|
||||
launchPackagerInSeparateWindow();
|
||||
launchPackagerInSeparateWindow(pwd());
|
||||
|
||||
// launch the app on iOS simulator
|
||||
pushd('packages/rn-tester');
|
||||
exec('npx react-native run-ios --scheme RNTester --simulator "iPhone 14"');
|
||||
popd();
|
||||
} else {
|
||||
// we do the android path here
|
||||
|
||||
@@ -115,7 +114,7 @@ if (argv.target === 'RNTester') {
|
||||
} version of RNTester Android with the new Architecture enabled`,
|
||||
);
|
||||
exec(
|
||||
`./gradlew :packages:rn-tester:android:app:${
|
||||
`../../gradlew :packages:rn-tester:android:app:${
|
||||
argv.hermes ? 'installHermesDebug' : 'installJscDebug'
|
||||
} --quiet`,
|
||||
);
|
||||
@@ -126,7 +125,7 @@ if (argv.target === 'RNTester') {
|
||||
|
||||
// if everything succeeded so far, we can launch Metro and the app
|
||||
// start the Metro server in a separate window
|
||||
launchPackagerInSeparateWindow();
|
||||
launchPackagerInSeparateWindow(pwd());
|
||||
|
||||
// launch the app
|
||||
exec(
|
||||
@@ -136,6 +135,7 @@ if (argv.target === 'RNTester') {
|
||||
// just to make sure that the Android up won't have troubles finding the Metro server
|
||||
exec('adb reverse tcp:8081 tcp:8081');
|
||||
}
|
||||
popd();
|
||||
} else {
|
||||
console.info("We're going to test a fresh new RN project");
|
||||
|
||||
@@ -207,16 +207,16 @@ if (argv.target === 'RNTester') {
|
||||
localMavenPath,
|
||||
);
|
||||
|
||||
// create locally the node module
|
||||
exec('npm pack', {cwd: reactNativePackagePath});
|
||||
|
||||
const localNodeTGZPath = `${reactNativePackagePath}/react-native-${releaseVersion}.tgz`;
|
||||
exec(`node scripts/set-rn-template-version.js "file:${localNodeTGZPath}"`);
|
||||
|
||||
// create locally the node module
|
||||
exec('npm pack', {cwd: reactNativePackagePath});
|
||||
|
||||
pushd('/tmp/');
|
||||
// need to avoid the pod install step - we'll do it later
|
||||
exec(
|
||||
`node ${reactNativePackagePath}/cli.js init RNTestProject --template ${repoRoot} --skip-install`,
|
||||
`node ${reactNativePackagePath}/cli.js init RNTestProject --template ${localNodeTGZPath} --skip-install`,
|
||||
);
|
||||
|
||||
cd('RNTestProject');
|
||||
|
||||
@@ -97,11 +97,9 @@ function isPackagerRunning(
|
||||
}
|
||||
|
||||
// this is a very limited implementation of how this should work
|
||||
// literally, this is macos only
|
||||
// a more robust implementation can be found here:
|
||||
// https://github.com/react-native-community/cli/blob/7c003f2b1d9d80ec5c167614ba533a004272c685/packages/cli-platform-android/src/commands/runAndroid/index.ts#L195
|
||||
function launchPackagerInSeparateWindow() {
|
||||
exec("open -a 'Terminal' ./packages/react-native/scripts/packager.sh");
|
||||
function launchPackagerInSeparateWindow(folderPath) {
|
||||
const command = `tell application "Terminal" to do script "cd ${folderPath} && yarn start"`;
|
||||
exec(`osascript -e '${command}'`);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
||||
@@ -2248,47 +2248,48 @@
|
||||
optionalDependencies:
|
||||
npmlog "2 || ^3.1.0 || ^4.0.0"
|
||||
|
||||
"@react-native-community/cli-clean@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.0.0-alpha.2.tgz#31e9a896df86dd11de06c1daced00142126c8ec0"
|
||||
integrity sha512-IdZj/2CZYME/iWY4cAxKBWAr/pQTfj5I2NZp8Z4+u6/KrjP2PuoMkUcb+ONvwQCLpd9R62EnuaPzXVomH43d8A==
|
||||
"@react-native-community/cli-clean@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.1.1.tgz#5800088c516055f728fcdff349fe395616c8e4ad"
|
||||
integrity sha512-1zgMujcnI33J/rXi4KZI87WmAMPcBxBwq6mHVp1g2duuwXQ9lJjVWxsW7OJiZvFpPyJFvaQh+IZHGwFuHpfgVg==
|
||||
dependencies:
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
chalk "^4.1.2"
|
||||
execa "^1.0.0"
|
||||
execa "^5.0.0"
|
||||
prompts "^2.4.0"
|
||||
|
||||
"@react-native-community/cli-config@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.0.0-alpha.2.tgz#640373580782a23bdb53eedbd4084f485d2e0113"
|
||||
integrity sha512-ZlRbsEoi/DdrQdX+j0YLkhjdsYTENHBeqdPXhLsGp3OWdf7t4yRlsBDElXP8VhHuUeBBQ0tWaXGPiaZbPjLi6A==
|
||||
"@react-native-community/cli-config@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.1.1.tgz#0016cff3094e4d09e740f102c953085410f4dcc6"
|
||||
integrity sha512-YxcBx8RJIdz6LHo0ZN47L2LjNXelAFIf0FOb5PUqaGw5JwaYIUxaQhuGXLLPN8B9YG24/XAnZsedVTgMqib7Ag==
|
||||
dependencies:
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
chalk "^4.1.2"
|
||||
cosmiconfig "^5.1.0"
|
||||
deepmerge "^3.2.0"
|
||||
deepmerge "^4.3.0"
|
||||
glob "^7.1.3"
|
||||
joi "^17.2.1"
|
||||
|
||||
"@react-native-community/cli-debugger-ui@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.0.0-alpha.2.tgz#edd28413f8bf7c1b6ae7d7f2f168166afedbb719"
|
||||
integrity sha512-p5vlzQYsxaTL13hpIWgk1SEEgbnTO24ktg/8IqDHkuA3YKYI1ghEUq6BXdfvfAhWZnwX7NZdx6TOG/MSx/kpZg==
|
||||
"@react-native-community/cli-debugger-ui@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.1.1.tgz#fb86d388a120a057bc942ac0f72ebbd6e388f6cd"
|
||||
integrity sha512-MuIrq9FXm+EC00y6LPw0tAIpsghOTSqiQFn9x16hHEUSHkjTbTnkuEZpNinDJ0sV17+sbVl7OHTUokvlOGFWxw==
|
||||
dependencies:
|
||||
serve-static "^1.13.1"
|
||||
|
||||
"@react-native-community/cli-doctor@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.0.0-alpha.2.tgz#dcca2f8249cff3bab12bd784ebca75866df3f074"
|
||||
integrity sha512-mjpUc6gjxtkfgBan0TQLch0FEck7gweB0xVt+jcSY12En58o37hlrClCg/Grk3Kl0abGa79Ve61C5bwknTXdLA==
|
||||
"@react-native-community/cli-doctor@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.1.1.tgz#d42045d413c1e979ecee9ac1f5f7fc56b6c02b1f"
|
||||
integrity sha512-kt9TKETUjtd8wB0r5WUbaTHemaGuteoivbIWqgS95kYa5qwWz033iQ6JsHQ1XItDKiusE62Dg7voPgJHOm1rXg==
|
||||
dependencies:
|
||||
"@react-native-community/cli-config" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-platform-ios" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-config" "11.1.1"
|
||||
"@react-native-community/cli-platform-android" "11.1.1"
|
||||
"@react-native-community/cli-platform-ios" "11.1.1"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
chalk "^4.1.2"
|
||||
command-exists "^1.2.8"
|
||||
envinfo "^7.7.2"
|
||||
execa "^1.0.0"
|
||||
execa "^5.0.0"
|
||||
hermes-profile-transformer "^0.0.6"
|
||||
ip "^1.1.5"
|
||||
node-stream-zip "^1.9.1"
|
||||
@@ -2298,77 +2299,77 @@
|
||||
strip-ansi "^5.2.0"
|
||||
sudo-prompt "^9.0.0"
|
||||
wcwidth "^1.0.1"
|
||||
yaml "^2.2.1"
|
||||
|
||||
"@react-native-community/cli-hermes@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.0.0-alpha.2.tgz#62833e17f01ad1b36fccc96cf752edea1cd171a8"
|
||||
integrity sha512-JU5r7y+TOXFFG6tq6nG5bgOTG1kGwSdJkYvt87cBmQA+Y7b7vUdWijxedwJGexMs6PR3xU/iI7f8ZDKpLhlMpQ==
|
||||
"@react-native-community/cli-hermes@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.1.1.tgz#4766d8eef8f742b11839f65ce372408497cf8bcf"
|
||||
integrity sha512-a3iTLJ3nO3Qcf8yAneIHSDLXm8s8zhglREHOnydCAkHNuTDydflZjFyIg2X1PfPGSFe7KYQeGXycss38FwRPAA==
|
||||
dependencies:
|
||||
"@react-native-community/cli-platform-android" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-platform-android" "11.1.1"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
chalk "^4.1.2"
|
||||
hermes-profile-transformer "^0.0.6"
|
||||
ip "^1.1.5"
|
||||
|
||||
"@react-native-community/cli-platform-android@11.0.0-alpha.2", "@react-native-community/cli-platform-android@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.0.0-alpha.2.tgz#207d27ff535a92895aa512556a7c26e2f103d86c"
|
||||
integrity sha512-CmVxlROf03r+811jATYk9x8eQ6YU0nIGw7qy8CI/ggDypI3HpPsh9sGx34uysUHxh5QsjYGjcCOTvRePehqXOQ==
|
||||
"@react-native-community/cli-platform-android@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.1.1.tgz#843381104e61417f2d337598c6f5ff484d1fa1b2"
|
||||
integrity sha512-+qim4c00uomP0N2VxsE4Qk3ixYLeElsIuwN5DkrSRzKwGSJqzdvkChEof7mkW803OyCl6cEBT1yrRWpvtSZOHA==
|
||||
dependencies:
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
chalk "^4.1.2"
|
||||
execa "^1.0.0"
|
||||
execa "^5.0.0"
|
||||
glob "^7.1.3"
|
||||
logkitty "^0.7.1"
|
||||
|
||||
"@react-native-community/cli-platform-ios@11.0.0-alpha.2", "@react-native-community/cli-platform-ios@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.0.0-alpha.2.tgz#c003737bbac966432b17a16877935b9bbae78485"
|
||||
integrity sha512-wrNZS+59DgB0BjPTah81CUWu1wTiE5VPC/RRU34aPd2hhs3mEkwWB+CI0iVg0rHDd/dDEg9qDQXPpIqGwPjgMQ==
|
||||
"@react-native-community/cli-platform-ios@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.1.1.tgz#e502ac57de55163874c24fa86f26991c4f2063fc"
|
||||
integrity sha512-3bjwo2iSaAqWu4+w8337QuJNCMeAEvt5lceRZ1bCSX+n8QJutksQUflzXjpY6cIVFFrN8PCTefWiOOGQSC0MUg==
|
||||
dependencies:
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
chalk "^4.1.2"
|
||||
execa "^1.0.0"
|
||||
execa "^5.0.0"
|
||||
fast-xml-parser "^4.0.12"
|
||||
glob "^7.1.3"
|
||||
ora "^5.4.1"
|
||||
|
||||
"@react-native-community/cli-plugin-metro@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.0.0-alpha.2.tgz#73c5656879d9589911861e88f3ec777d99239a53"
|
||||
integrity sha512-ICb5HJoiwaIFiFMWkUzZcVYXp+8ePjRImUxG4sq/fG6ZZKjUl2Ylk6XBzuhOfOyFFKeVNYYJ8h2U6uCmFG0PIw==
|
||||
"@react-native-community/cli-plugin-metro@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.1.1.tgz#3b018ca86ba0f3e545575abba2f677bd981f9b56"
|
||||
integrity sha512-4lx+6b0crPpGfe7Ko5YuEVBIkrXlmuS+pm9c1gL9pEK/iAs6vYcEBGqeEWHctylvC62QdELGhvBasg5FLXZ8fA==
|
||||
dependencies:
|
||||
"@react-native-community/cli-server-api" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-server-api" "11.1.1"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
"@react-native/metro-config" "^0.72.1"
|
||||
chalk "^4.1.2"
|
||||
execa "^1.0.0"
|
||||
metro "0.75.1"
|
||||
metro-config "0.75.1"
|
||||
metro-core "0.75.1"
|
||||
metro-react-native-babel-transformer "0.75.1"
|
||||
metro-resolver "0.75.1"
|
||||
metro-runtime "0.75.1"
|
||||
execa "^5.0.0"
|
||||
metro "0.76.0"
|
||||
metro-config "0.76.0"
|
||||
metro-core "0.76.0"
|
||||
metro-resolver "0.76.0"
|
||||
readline "^1.3.0"
|
||||
|
||||
"@react-native-community/cli-server-api@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.0.0-alpha.2.tgz#45ebbb6b3c46b667f3aa65fe715c914ce446d968"
|
||||
integrity sha512-pK/13Z9OIi8Qjdx70n1EZn5bxvJ9LIRaSsOLep2B62nRWCsQ9y8rBhITUeXXfw3hBurdBJZgxcFBlENaNcbcPg==
|
||||
"@react-native-community/cli-server-api@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.1.1.tgz#2042acd650ce0911f20ffd0c673542ccd326f1e9"
|
||||
integrity sha512-vnXTXA1+HIrR2vedIR4Hp0uSGmRbmpigXqKPaCrVPbfM8uV57l/5FmaLnsfuIldbZesq5SxVdEz39y0U7yu8LQ==
|
||||
dependencies:
|
||||
"@react-native-community/cli-debugger-ui" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-debugger-ui" "11.1.1"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
compression "^1.7.1"
|
||||
connect "^3.6.5"
|
||||
errorhandler "^1.5.0"
|
||||
errorhandler "^1.5.1"
|
||||
nocache "^3.0.1"
|
||||
pretty-format "^26.6.2"
|
||||
serve-static "^1.13.1"
|
||||
ws "^7.5.1"
|
||||
|
||||
"@react-native-community/cli-tools@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.0.0-alpha.2.tgz#6e79d5ace5fa218892d9c6a8534f634e12af2b49"
|
||||
integrity sha512-KPlS5YIjEaYrbOeoMcAM/P7H09V+nw/oja1nrIn0bSJCG9tc4IXwHnCadXo1qDmsAcu9if6ZUC+AThYqOPly/A==
|
||||
"@react-native-community/cli-tools@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.1.1.tgz#6ec1b6bf714cb7bdb360ca4a213e969e10b644f2"
|
||||
integrity sha512-wkyzFxIncZCYfCHt1nwGE0pKspuP6yknNCF9nHxFXag0gPkTphpZWoV+uRVNRd+Fudx/qOtPiFAivGfw+8Pp2w==
|
||||
dependencies:
|
||||
appdirsjs "^1.2.4"
|
||||
chalk "^4.1.2"
|
||||
@@ -2380,30 +2381,30 @@
|
||||
semver "^6.3.0"
|
||||
shell-quote "^1.7.3"
|
||||
|
||||
"@react-native-community/cli-types@^11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.0.0-alpha.2.tgz#3d2563a0b43adfd38d12f4f303eab767f5002912"
|
||||
integrity sha512-rT3f6hJajlGwK/eqTUCDMH0g/tj5yezwWTO87bjxniUTbL2X3v8oYZxRWO8SxC6ifNtpUssUkXXzM1hUtJcmOw==
|
||||
"@react-native-community/cli-types@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.1.1.tgz#9a4ee87000e38e57e54f14bd6fff2561638ce196"
|
||||
integrity sha512-ShvZs+D0WSHQhsW96nMA2XtZ4z8xkqCR8q0CIYHOAdlDCbvwsMLGnbQr4gZ5EO7RXcPYc0Lk35SOr4fG2g94qA==
|
||||
dependencies:
|
||||
joi "^17.2.1"
|
||||
|
||||
"@react-native-community/cli@11.0.0-alpha.2":
|
||||
version "11.0.0-alpha.2"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.0.0-alpha.2.tgz#27336b0a4e4cb14ae20a42e1a8373f28f279ea67"
|
||||
integrity sha512-lpW+7MNFYHTZLvQjMO+6nQYrkpDSOuQa6pZcz3dTC+n7OL5GmmXIRB2iklJID76hNIZPca/27RPwfkMsW3eBGg==
|
||||
"@react-native-community/cli@11.1.1":
|
||||
version "11.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.1.1.tgz#08a347297513ddfd3a47898edb760f0bdb36a237"
|
||||
integrity sha512-WzPyOpDXeCX6aKOploz2GyI6AqNZgnD80r1cN3a4P2VSerEHefkjuKp/2+DHkrbScJxYfjGg6Ur2+/UDRkTSVQ==
|
||||
dependencies:
|
||||
"@react-native-community/cli-clean" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-config" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-debugger-ui" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-doctor" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-hermes" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-plugin-metro" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-server-api" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-tools" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-types" "^11.0.0-alpha.2"
|
||||
"@react-native-community/cli-clean" "11.1.1"
|
||||
"@react-native-community/cli-config" "11.1.1"
|
||||
"@react-native-community/cli-debugger-ui" "11.1.1"
|
||||
"@react-native-community/cli-doctor" "11.1.1"
|
||||
"@react-native-community/cli-hermes" "11.1.1"
|
||||
"@react-native-community/cli-plugin-metro" "11.1.1"
|
||||
"@react-native-community/cli-server-api" "11.1.1"
|
||||
"@react-native-community/cli-tools" "11.1.1"
|
||||
"@react-native-community/cli-types" "11.1.1"
|
||||
chalk "^4.1.2"
|
||||
commander "^9.4.1"
|
||||
execa "^1.0.0"
|
||||
execa "^5.0.0"
|
||||
find-up "^4.1.0"
|
||||
fs-extra "^8.1.0"
|
||||
graceful-fs "^4.1.3"
|
||||
@@ -2801,12 +2802,7 @@ abort-controller@^3.0.0:
|
||||
dependencies:
|
||||
event-target-shim "^5.0.0"
|
||||
|
||||
absolute-path@^0.0.0:
|
||||
version "0.0.0"
|
||||
resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7"
|
||||
integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=
|
||||
|
||||
accepts@^1.3.7, accepts@~1.3.3, accepts@~1.3.5:
|
||||
accepts@^1.3.7, accepts@~1.3.5:
|
||||
version "1.3.7"
|
||||
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
|
||||
integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
|
||||
@@ -2814,6 +2810,14 @@ accepts@^1.3.7, accepts@~1.3.3, accepts@~1.3.5:
|
||||
mime-types "~2.1.24"
|
||||
negotiator "0.6.2"
|
||||
|
||||
accepts@~1.3.7:
|
||||
version "1.3.8"
|
||||
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
|
||||
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
|
||||
dependencies:
|
||||
mime-types "~2.1.34"
|
||||
negotiator "0.6.3"
|
||||
|
||||
acorn-jsx@^5.3.2:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||
@@ -3709,17 +3713,6 @@ coveralls@^3.1.1:
|
||||
minimist "^1.2.5"
|
||||
request "^2.88.2"
|
||||
|
||||
cross-spawn@^6.0.0:
|
||||
version "6.0.5"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
|
||||
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
|
||||
dependencies:
|
||||
nice-try "^1.0.4"
|
||||
path-key "^2.0.1"
|
||||
semver "^5.5.0"
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||
@@ -3835,16 +3828,16 @@ deep-is@^0.1.3:
|
||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
|
||||
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
|
||||
|
||||
deepmerge@^3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.2.0.tgz#58ef463a57c08d376547f8869fdc5bcee957f44e"
|
||||
integrity sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==
|
||||
|
||||
deepmerge@^4.2.2:
|
||||
version "4.2.2"
|
||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
|
||||
integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
|
||||
|
||||
deepmerge@^4.3.0:
|
||||
version "4.3.1"
|
||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
|
||||
integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
|
||||
|
||||
defaults@^1.0.3:
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
|
||||
@@ -4016,12 +4009,12 @@ error-stack-parser@^2.0.6:
|
||||
dependencies:
|
||||
stackframe "^1.1.1"
|
||||
|
||||
errorhandler@^1.5.0:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.0.tgz#eaba64ca5d542a311ac945f582defc336165d9f4"
|
||||
integrity sha1-6rpkyl1UKjEayUX1gt78M2Fl2fQ=
|
||||
errorhandler@^1.5.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91"
|
||||
integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==
|
||||
dependencies:
|
||||
accepts "~1.3.3"
|
||||
accepts "~1.3.7"
|
||||
escape-html "~1.0.3"
|
||||
|
||||
es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5:
|
||||
@@ -4348,19 +4341,6 @@ event-target-shim@^5.0.0, event-target-shim@^5.0.1:
|
||||
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
|
||||
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
|
||||
|
||||
execa@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
|
||||
integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
|
||||
dependencies:
|
||||
cross-spawn "^6.0.0"
|
||||
get-stream "^4.0.0"
|
||||
is-stream "^1.1.0"
|
||||
npm-run-path "^2.0.0"
|
||||
p-finally "^1.0.0"
|
||||
signal-exit "^3.0.0"
|
||||
strip-eof "^1.0.0"
|
||||
|
||||
execa@^5.0.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
|
||||
@@ -4781,13 +4761,6 @@ get-stdin@^6.0.0:
|
||||
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
|
||||
integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
|
||||
|
||||
get-stream@^4.0.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
|
||||
integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
|
||||
dependencies:
|
||||
pump "^3.0.0"
|
||||
|
||||
get-stream@^5.1.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
|
||||
@@ -5354,11 +5327,6 @@ is-shared-array-buffer@^1.0.2:
|
||||
dependencies:
|
||||
call-bind "^1.0.2"
|
||||
|
||||
is-stream@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
|
||||
|
||||
is-stream@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
|
||||
@@ -6369,43 +6337,53 @@ metro-babel-transformer@0.75.1:
|
||||
metro-source-map "0.75.1"
|
||||
nullthrows "^1.1.1"
|
||||
|
||||
metro-cache-key@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.75.1.tgz#c27fde127e2278b544d7db7196f6d33d8dcde004"
|
||||
integrity sha512-SUC+vBhsE/I9lA9l42wsGsFj3bK3h11GLiePaIZueyh5qD16Y5X+9iC+vmgZT3rAsqFyF04Ty5RBxh+sErJmsg==
|
||||
|
||||
metro-cache@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.75.1.tgz#5f664127f9571816521c32179e3ec3583c4c4273"
|
||||
integrity sha512-uWfQRtEdUYIsKcfwGHU//eTKdxUQCyjjq0GCsZwMOvfipT5bihpam1VPEFk3W+UEFB+qQ3cZp2DvUX1WoEi+Mw==
|
||||
metro-babel-transformer@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.0.tgz#cb3854ee74a1ecba40680af1b6625aa46928c3c0"
|
||||
integrity sha512-yBF8eJluya2iofhu8nZDXr9It/7bUcgXiKpFPrkiOWcMFY/jqzEbcavQ8uK3lFeXNRyvj0iaKaFs7Qo+2QJfow==
|
||||
dependencies:
|
||||
metro-core "0.75.1"
|
||||
"@babel/core" "^7.20.0"
|
||||
hermes-parser "0.8.0"
|
||||
metro-source-map "0.76.0"
|
||||
nullthrows "^1.1.1"
|
||||
|
||||
metro-cache-key@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.0.tgz#0ab9513c8fc0392e7fde5d4473f220a9352e2cf0"
|
||||
integrity sha512-Oyz+Yo/CG56kMXsDuioLf80MHwUqRzhOjaFsDvam3+gpc9rIGhnFL4ODhc6Qlum5auPRMT9XsksScErouft2tA==
|
||||
|
||||
metro-cache@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.0.tgz#b68d284fa46e74fe6cc7b822a9f3028f8824f952"
|
||||
integrity sha512-J+OkOcIWrJisoXw6fXwWzeR1q4IuysMIKG8v/DWmKUOy8VI2c0gKXUW0mBfEWq6y3w0Czl94/xh1x7X0YLsTNg==
|
||||
dependencies:
|
||||
metro-core "0.76.0"
|
||||
rimraf "^3.0.2"
|
||||
|
||||
metro-config@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.75.1.tgz#1fbfdb491eb211327ccfecff026ca499503f4bcb"
|
||||
integrity sha512-zF1DLIxjS/LpJJtr7PhrMS+d4sPQsoMVgFFHv270sNOHNbltLa1Em8Epk/JGOozBzX4ijQOsL4PkBVyJN8WsEg==
|
||||
metro-config@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.0.tgz#fe38e555faa1c6fa7eb2fbe9fa504844b1156154"
|
||||
integrity sha512-5bfOtovHM7qjSobGBGRWXGh9+wMJlXHgot1LhjL3YTaNLUY42umbzdNC7dPcrGNLHH3MXTlG4cyNeCWZxtm6Hg==
|
||||
dependencies:
|
||||
cosmiconfig "^5.0.5"
|
||||
jest-validate "^26.5.2"
|
||||
metro "0.75.1"
|
||||
metro-cache "0.75.1"
|
||||
metro-core "0.75.1"
|
||||
metro-runtime "0.75.1"
|
||||
metro "0.76.0"
|
||||
metro-cache "0.76.0"
|
||||
metro-core "0.76.0"
|
||||
metro-runtime "0.76.0"
|
||||
|
||||
metro-core@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.75.1.tgz#6ed853160a28a9815d4220081d0bf9e5157d469a"
|
||||
integrity sha512-TGTBqqM3lZ4IA83HTNOsWXZ+sr/4Gi2RgTO9svJ0O1rYNc4UdDpe99EurYmbU709RJ8C7+zl3t8kHMB+1RNyuw==
|
||||
metro-core@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.0.tgz#16f8a73d40173ffe659a2de8b727bb2c84a2846e"
|
||||
integrity sha512-LRNWBpvHWcMeK+LZ74VZRo6QfU8izh6BmmqeW57HnZec69JQ1uODV6e7gQig6PWH89aMzhq8QKQr0dPDUGDYIg==
|
||||
dependencies:
|
||||
lodash.throttle "^4.1.1"
|
||||
metro-resolver "0.75.1"
|
||||
metro-resolver "0.76.0"
|
||||
|
||||
metro-file-map@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.75.1.tgz#43d7c84168a7f8db2a7e7fd75159191c7f7e1396"
|
||||
integrity sha512-fwXHBVe0ABihNvyvhFRU/tGz1N/yVkyrd1X9kOB6IP4/XQllt8GlxUV0aHvjYPYgxCjk+PzrVAbT65WBYYfEMA==
|
||||
metro-file-map@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.0.tgz#a27586bd4e22112864e76ba49bda6bb851bf5e49"
|
||||
integrity sha512-ifhMf75SlkSR8QcRBK1ecDwt9APZNEMWG7U8RIhtoDAtBYKuTbjjHNJiAwAU8UPE78m/Aryz6A+5cwpuAvSGrA==
|
||||
dependencies:
|
||||
abort-controller "^3.0.0"
|
||||
anymatch "^3.0.3"
|
||||
@@ -6423,15 +6401,15 @@ metro-file-map@0.75.1:
|
||||
optionalDependencies:
|
||||
fsevents "^2.3.2"
|
||||
|
||||
metro-hermes-compiler@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.75.1.tgz#5c5a6f71f1a06599a77f973986dbaea06f205f4a"
|
||||
integrity sha512-5JYhUrKaEfQnU3N/RFmne/cM8sl98Y8EzJEiBOKZkhumtx7381ajK+M1jO/pAgpHlsgGNQn3/0snh+7xsveyRQ==
|
||||
metro-hermes-compiler@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-hermes-compiler/-/metro-hermes-compiler-0.76.0.tgz#2c4cca498011cab799434527544c0303eb12b806"
|
||||
integrity sha512-ZW1jHtErMp327aPEkhHP69dLmtbzGj7ajsNFEwayoz/tZtyrTXT+f/8j6QVynIBMMpnAJkSIlinNo9fgIbE08w==
|
||||
|
||||
metro-inspector-proxy@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.75.1.tgz#0e54802c8e4786341ec62cfb5c1e2efc00487e79"
|
||||
integrity sha512-OzrP5eNZnO9/bu3RrWObC/PMCu0xm1svTolt2vgQjatt+Rf0JU6P8kqoyFB9F6WsV/9oieiHhtHecfXNb1PR+g==
|
||||
metro-inspector-proxy@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.0.tgz#01af31de7cd09d9ec5a204b73fc786e3f4ddc793"
|
||||
integrity sha512-1RCMmXzcvDsFvJyfRqzUl2B3r0FTgxW37WlH2c2tMhqVtGxobDGHn5cFySeaCLvKSHps0NELeB+1SF7MB9scxA==
|
||||
dependencies:
|
||||
connect "^3.6.5"
|
||||
debug "^2.2.0"
|
||||
@@ -6444,17 +6422,17 @@ metro-memory-fs@0.75.1:
|
||||
resolved "https://registry.yarnpkg.com/metro-memory-fs/-/metro-memory-fs-0.75.1.tgz#4f19ad6ed45f28af900d4684a02ea54c024c62ab"
|
||||
integrity sha512-cxyrdPfc/eHWRo4sTCAsLDjS+CztW7zRodtjBeMpm+m+VZOk1ntB/0ZSM7mPCOzVDUAZjUupuXte18TGo4/EXw==
|
||||
|
||||
metro-minify-terser@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.75.1.tgz#0a940cac616930b6449838040016d42b2136893b"
|
||||
integrity sha512-SLJpthrK5cowVgxckb0f+aEvFQIwGoJxHq8BE+QCZgfRfkuu5Yvf+lt0koWPFXG6r8ztU2eZE4j/QE429BGq5A==
|
||||
metro-minify-terser@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.0.tgz#49cef5fc0c2ae9b2ed76a8832132934c3a10de4c"
|
||||
integrity sha512-dxaE/pvFDFEvXoNHuiXbA2Tw/jT1MD3B4a9AM+aYPWJBh3PdT9XM1HdzumyJldtZpCn5yka4maYSrtuebKgOyw==
|
||||
dependencies:
|
||||
terser "^5.15.0"
|
||||
|
||||
metro-minify-uglify@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.75.1.tgz#311665b15c1a49f54b0a1bb9df3d2b0bbbcf5c23"
|
||||
integrity sha512-964Ft6eyXp+LVXJHn4B32mU3TyG8r8C4c3k1RlRQSuHqtTH//C/8J44c3ruyvAZnT2CuYMRl5xqmJge/gZODug==
|
||||
metro-minify-uglify@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.0.tgz#a34a64614b5abd364674dc6c0ff567d43d2b525c"
|
||||
integrity sha512-Fuoxr5wLw/2/BUmhJqmIsfNZK+x8BK/DDXID5CZvHmZj5PdN4MN2WGWkM/F4EOw2t1YxbJ1hFSXM8skfSZ7jkw==
|
||||
dependencies:
|
||||
uglify-es "^3.1.9"
|
||||
|
||||
@@ -6503,6 +6481,51 @@ metro-react-native-babel-preset@0.75.1:
|
||||
babel-plugin-transform-flow-enums "^0.0.2"
|
||||
react-refresh "^0.4.0"
|
||||
|
||||
metro-react-native-babel-preset@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.0.tgz#440a0e8965b2eb01afa391ef95575faeed67636b"
|
||||
integrity sha512-2sM6dy9uAbuQlg7l/VOdiudUUMFRkABJ1YLkZU6Fpqi/rJCXn4fbF0pO+TwCFbBYNIQBY50clv9RPvD2n64hXg==
|
||||
dependencies:
|
||||
"@babel/core" "^7.20.0"
|
||||
"@babel/plugin-proposal-async-generator-functions" "^7.0.0"
|
||||
"@babel/plugin-proposal-class-properties" "^7.0.0"
|
||||
"@babel/plugin-proposal-export-default-from" "^7.0.0"
|
||||
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0"
|
||||
"@babel/plugin-proposal-numeric-separator" "^7.0.0"
|
||||
"@babel/plugin-proposal-object-rest-spread" "^7.0.0"
|
||||
"@babel/plugin-proposal-optional-catch-binding" "^7.0.0"
|
||||
"@babel/plugin-proposal-optional-chaining" "^7.0.0"
|
||||
"@babel/plugin-syntax-dynamic-import" "^7.0.0"
|
||||
"@babel/plugin-syntax-export-default-from" "^7.0.0"
|
||||
"@babel/plugin-syntax-flow" "^7.18.0"
|
||||
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0"
|
||||
"@babel/plugin-syntax-optional-chaining" "^7.0.0"
|
||||
"@babel/plugin-transform-arrow-functions" "^7.0.0"
|
||||
"@babel/plugin-transform-async-to-generator" "^7.0.0"
|
||||
"@babel/plugin-transform-block-scoping" "^7.0.0"
|
||||
"@babel/plugin-transform-classes" "^7.0.0"
|
||||
"@babel/plugin-transform-computed-properties" "^7.0.0"
|
||||
"@babel/plugin-transform-destructuring" "^7.0.0"
|
||||
"@babel/plugin-transform-flow-strip-types" "^7.0.0"
|
||||
"@babel/plugin-transform-function-name" "^7.0.0"
|
||||
"@babel/plugin-transform-literals" "^7.0.0"
|
||||
"@babel/plugin-transform-modules-commonjs" "^7.0.0"
|
||||
"@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0"
|
||||
"@babel/plugin-transform-parameters" "^7.0.0"
|
||||
"@babel/plugin-transform-react-display-name" "^7.0.0"
|
||||
"@babel/plugin-transform-react-jsx" "^7.0.0"
|
||||
"@babel/plugin-transform-react-jsx-self" "^7.0.0"
|
||||
"@babel/plugin-transform-react-jsx-source" "^7.0.0"
|
||||
"@babel/plugin-transform-runtime" "^7.0.0"
|
||||
"@babel/plugin-transform-shorthand-properties" "^7.0.0"
|
||||
"@babel/plugin-transform-spread" "^7.0.0"
|
||||
"@babel/plugin-transform-sticky-regex" "^7.0.0"
|
||||
"@babel/plugin-transform-typescript" "^7.5.0"
|
||||
"@babel/plugin-transform-unicode-regex" "^7.0.0"
|
||||
"@babel/template" "^7.0.0"
|
||||
babel-plugin-transform-flow-enums "^0.0.2"
|
||||
react-refresh "^0.4.0"
|
||||
|
||||
metro-react-native-babel-transformer@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.75.1.tgz#d06861d519d5188cd9cffc2cdfff4ba54d891ce1"
|
||||
@@ -6516,18 +6539,28 @@ metro-react-native-babel-transformer@0.75.1:
|
||||
metro-source-map "0.75.1"
|
||||
nullthrows "^1.1.1"
|
||||
|
||||
metro-resolver@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.75.1.tgz#f54f410774f9b58ea766c65c3096ef3a399185e8"
|
||||
integrity sha512-zKhRcfTi5G9jcVFh2VPH1WFuabTl0WaZq5WJNK24Y3xVBTOfgr4MIN0iSz1XLwffPCqj3J8D8w6BPteID3DEoQ==
|
||||
metro-react-native-babel-transformer@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.0.tgz#8c8872f0d3a0ec9dad2480df53c92c10eac92c79"
|
||||
integrity sha512-mLyUiGq2qPoEwV3oncD82HOtM4wAl8YmXtGY17D4iqH6/5pE32lRnDDYt0WnJYACZDs3RB3MhTjGCM7rJNwn/A==
|
||||
dependencies:
|
||||
absolute-path "^0.0.0"
|
||||
invariant "^2.2.4"
|
||||
"@babel/core" "^7.20.0"
|
||||
babel-preset-fbjs "^3.4.0"
|
||||
hermes-parser "0.8.0"
|
||||
metro-babel-transformer "0.76.0"
|
||||
metro-react-native-babel-preset "0.76.0"
|
||||
metro-source-map "0.76.0"
|
||||
nullthrows "^1.1.1"
|
||||
|
||||
metro-runtime@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.75.1.tgz#e34936400ef4af28aa4e5f43c7fd7b6fbad68c1b"
|
||||
integrity sha512-AbmDCLPV2efz/LD3+k7bHTchUYmwEzB1L99UJYLYQksLlV1aoW+ri9hurXc/0mc55Jw6h4uKKe1nlAKJYZLJEg==
|
||||
metro-resolver@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.0.tgz#3fa778adbab30859023a89e7a1241f4eb68171f2"
|
||||
integrity sha512-bU6HvKzPJOHGoe9na+tUa0g3pZqMUaSGE+noFx2qeSMtoIgOYkDzmuU9ZOAGcUOz0qJJtGs+QmgM+nBqfSS/pQ==
|
||||
|
||||
metro-runtime@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.76.0.tgz#ccc4721010a24d4919bf50e9146d06d28266efb3"
|
||||
integrity sha512-mEt1uWCYVwyvHYhCfsRXp7mqIBgOAYkocgousH5jwi07MwSAAvaDCvyRBUgtFohDQpL4j4N/QxNYExDDqUuuQw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.0.0"
|
||||
react-refresh "^0.4.0"
|
||||
@@ -6546,6 +6579,20 @@ metro-source-map@0.75.1:
|
||||
source-map "^0.5.6"
|
||||
vlq "^1.0.0"
|
||||
|
||||
metro-source-map@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.0.tgz#0f05263dc4648f654feaab36dae799b7118b36c0"
|
||||
integrity sha512-tAXlHI6EOtRTkhXynZbe/as7pBDBxDaHftq/7pV3QCGyLeSaTNy6wzXI5ewr3kTuZxtBXktQH/Zl0rhKO8DGMA==
|
||||
dependencies:
|
||||
"@babel/traverse" "^7.20.0"
|
||||
"@babel/types" "^7.20.0"
|
||||
invariant "^2.2.4"
|
||||
metro-symbolicate "0.76.0"
|
||||
nullthrows "^1.1.1"
|
||||
ob1 "0.76.0"
|
||||
source-map "^0.5.6"
|
||||
vlq "^1.0.0"
|
||||
|
||||
metro-symbolicate@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.75.1.tgz#29fd71175d1607187ee2522c3702e4cc27050279"
|
||||
@@ -6558,10 +6605,22 @@ metro-symbolicate@0.75.1:
|
||||
through2 "^2.0.1"
|
||||
vlq "^1.0.0"
|
||||
|
||||
metro-transform-plugins@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.75.1.tgz#5e4b338dbbf80a13c0d22e2bed33211c7ea2560a"
|
||||
integrity sha512-XiurTRKY570ZEbEr7kY4vyX11uYXRKmUTVCVQ7+j4SHA6p6RS23d/2cHMUgwtzch6K9vk1zPT5GK3/eYRglWYw==
|
||||
metro-symbolicate@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.0.tgz#3745875473d4fab544d054b90522df6779b41d37"
|
||||
integrity sha512-duq4RbeHDUzYQu4nzU2zWfBdG1YEXpaMqpLSvsXn5WJF3KK+v+BbtBvmo0zrEvzeA7kczNMxtZ97Yev9rqeYrw==
|
||||
dependencies:
|
||||
invariant "^2.2.4"
|
||||
metro-source-map "0.76.0"
|
||||
nullthrows "^1.1.1"
|
||||
source-map "^0.5.6"
|
||||
through2 "^2.0.1"
|
||||
vlq "^1.0.0"
|
||||
|
||||
metro-transform-plugins@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.0.tgz#dbab337561444cd9cd0882365a5b13b03bb92433"
|
||||
integrity sha512-Pl84l7LZAI+RXVP3+Hv+vLQwv4I3dHE91lM+Lw1EVFSep6jvraVVbER5+5/lnb5j1OTEW4EtHXmFus3nnTckeg==
|
||||
dependencies:
|
||||
"@babel/core" "^7.20.0"
|
||||
"@babel/generator" "^7.20.0"
|
||||
@@ -6569,29 +6628,29 @@ metro-transform-plugins@0.75.1:
|
||||
"@babel/traverse" "^7.20.0"
|
||||
nullthrows "^1.1.1"
|
||||
|
||||
metro-transform-worker@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.75.1.tgz#72cad162d6421e1365d5872685ca9112b922d326"
|
||||
integrity sha512-at96L4h3/OIUIB1MRIm/jvYPk2J27tRZNEjzSnbTgTzR0329RVHySmblJmgBvWj7F8uqOAUepjuVGkRM50USYg==
|
||||
metro-transform-worker@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.0.tgz#b53ae1d7033b9dae550384afcedeec46905cc6f9"
|
||||
integrity sha512-diV1gXL+/5R/LFPH3UwuU+dNlzT59c0qCHZm2iFqJYaVHuXUgAjyw48gVfOGDbytXLLcswQQD6C594Sc0QNnPA==
|
||||
dependencies:
|
||||
"@babel/core" "^7.20.0"
|
||||
"@babel/generator" "^7.20.0"
|
||||
"@babel/parser" "^7.20.0"
|
||||
"@babel/types" "^7.20.0"
|
||||
babel-preset-fbjs "^3.4.0"
|
||||
metro "0.75.1"
|
||||
metro-babel-transformer "0.75.1"
|
||||
metro-cache "0.75.1"
|
||||
metro-cache-key "0.75.1"
|
||||
metro-hermes-compiler "0.75.1"
|
||||
metro-source-map "0.75.1"
|
||||
metro-transform-plugins "0.75.1"
|
||||
metro "0.76.0"
|
||||
metro-babel-transformer "0.76.0"
|
||||
metro-cache "0.76.0"
|
||||
metro-cache-key "0.76.0"
|
||||
metro-hermes-compiler "0.76.0"
|
||||
metro-source-map "0.76.0"
|
||||
metro-transform-plugins "0.76.0"
|
||||
nullthrows "^1.1.1"
|
||||
|
||||
metro@0.75.1:
|
||||
version "0.75.1"
|
||||
resolved "https://registry.yarnpkg.com/metro/-/metro-0.75.1.tgz#795b6466a5c4a65dd6816d1a2d7cefa22c25d453"
|
||||
integrity sha512-0Hlm3t99bIVie4bWqAZZTKqAFj1OgzAaaYZ0VqCyfeFfo0dyd86Ipaz8XlKSwpMPLiG/3LbG+pZJ5Z9ERV1nIw==
|
||||
metro@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.0.tgz#eedb7a48c79a222faa953de902f3d81e529eb4c2"
|
||||
integrity sha512-Pm9eMGyNQKnAaDOCmG+26YnodCh34gyl9ZD4UMKSBZA0ent2uUIZWGfZ5Bznljx1WH7JvPvn48VuZVJhctAhLQ==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.0.0"
|
||||
"@babel/core" "^7.20.0"
|
||||
@@ -6600,7 +6659,6 @@ metro@0.75.1:
|
||||
"@babel/template" "^7.0.0"
|
||||
"@babel/traverse" "^7.20.0"
|
||||
"@babel/types" "^7.20.0"
|
||||
absolute-path "^0.0.0"
|
||||
accepts "^1.3.7"
|
||||
async "^3.2.2"
|
||||
chalk "^4.0.0"
|
||||
@@ -6615,23 +6673,23 @@ metro@0.75.1:
|
||||
invariant "^2.2.4"
|
||||
jest-worker "^27.2.0"
|
||||
lodash.throttle "^4.1.1"
|
||||
metro-babel-transformer "0.75.1"
|
||||
metro-cache "0.75.1"
|
||||
metro-cache-key "0.75.1"
|
||||
metro-config "0.75.1"
|
||||
metro-core "0.75.1"
|
||||
metro-file-map "0.75.1"
|
||||
metro-hermes-compiler "0.75.1"
|
||||
metro-inspector-proxy "0.75.1"
|
||||
metro-minify-terser "0.75.1"
|
||||
metro-minify-uglify "0.75.1"
|
||||
metro-react-native-babel-preset "0.75.1"
|
||||
metro-resolver "0.75.1"
|
||||
metro-runtime "0.75.1"
|
||||
metro-source-map "0.75.1"
|
||||
metro-symbolicate "0.75.1"
|
||||
metro-transform-plugins "0.75.1"
|
||||
metro-transform-worker "0.75.1"
|
||||
metro-babel-transformer "0.76.0"
|
||||
metro-cache "0.76.0"
|
||||
metro-cache-key "0.76.0"
|
||||
metro-config "0.76.0"
|
||||
metro-core "0.76.0"
|
||||
metro-file-map "0.76.0"
|
||||
metro-hermes-compiler "0.76.0"
|
||||
metro-inspector-proxy "0.76.0"
|
||||
metro-minify-terser "0.76.0"
|
||||
metro-minify-uglify "0.76.0"
|
||||
metro-react-native-babel-preset "0.76.0"
|
||||
metro-resolver "0.76.0"
|
||||
metro-runtime "0.76.0"
|
||||
metro-source-map "0.76.0"
|
||||
metro-symbolicate "0.76.0"
|
||||
metro-transform-plugins "0.76.0"
|
||||
metro-transform-worker "0.76.0"
|
||||
mime-types "^2.1.27"
|
||||
node-fetch "^2.2.0"
|
||||
nullthrows "^1.1.1"
|
||||
@@ -6657,6 +6715,11 @@ mime-db@1.51.0, "mime-db@>= 1.36.0 < 2":
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
|
||||
integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
|
||||
|
||||
mime-db@1.52.0:
|
||||
version "1.52.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
|
||||
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
|
||||
|
||||
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24:
|
||||
version "2.1.34"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
|
||||
@@ -6664,6 +6727,13 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24:
|
||||
dependencies:
|
||||
mime-db "1.51.0"
|
||||
|
||||
mime-types@~2.1.34:
|
||||
version "2.1.35"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
|
||||
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
|
||||
dependencies:
|
||||
mime-db "1.52.0"
|
||||
|
||||
mime@1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
|
||||
@@ -6763,16 +6833,16 @@ negotiator@0.6.2:
|
||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
|
||||
integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
|
||||
|
||||
negotiator@0.6.3:
|
||||
version "0.6.3"
|
||||
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
|
||||
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
|
||||
|
||||
neo-async@^2.5.0:
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835"
|
||||
integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==
|
||||
|
||||
nice-try@^1.0.4:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
|
||||
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
|
||||
|
||||
nocache@^3.0.1:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.3.tgz#07a3f4094746d5211c298d1938dcb5c1e1e352ca"
|
||||
@@ -6841,13 +6911,6 @@ normalize-url@^6.0.1:
|
||||
semver "^7.3.4"
|
||||
validate-npm-package-name "^3.0.0"
|
||||
|
||||
npm-run-path@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
||||
integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
|
||||
dependencies:
|
||||
path-key "^2.0.0"
|
||||
|
||||
npm-run-path@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
|
||||
@@ -6885,6 +6948,11 @@ ob1@0.75.1:
|
||||
resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.75.1.tgz#ee1ee0ef0ebc14548ab6b945399299e4062d049a"
|
||||
integrity sha512-JEUNCFtUL4uhgg9++Q8jB9EqQBjFHiAZa/cb9fBWUHmalWH/VMI8zWt7ty0z/Z7IsrV0EK+RO1O9lLA7/gIuGA==
|
||||
|
||||
ob1@0.76.0:
|
||||
version "0.76.0"
|
||||
resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.0.tgz#d36e1a2f2e7ff4534cf25aaf2ab27b48161a408f"
|
||||
integrity sha512-ZLPDN2wCuFRAno0S2BSitMse+l0ipfjQQCDlYZMjZn9YnOGsRneifMlvN+3mWgTA8TOHsoAMYQdciBylgsfAmA==
|
||||
|
||||
object-assign@^4.1.0, object-assign@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||
@@ -7020,11 +7088,6 @@ p-cancelable@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
|
||||
integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
|
||||
|
||||
p-finally@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
|
||||
integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
|
||||
|
||||
p-limit@^2.0.0, p-limit@^2.1.0, p-limit@^2.2.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
|
||||
@@ -7151,11 +7214,6 @@ path-is-absolute@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
|
||||
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
|
||||
|
||||
path-key@^2.0.0, path-key@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
|
||||
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
|
||||
|
||||
path-key@^3.0.0, path-key@^3.1.0:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
|
||||
@@ -7756,7 +7814,7 @@ selenium-webdriver@4.1.2:
|
||||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
semver@^5.3.0, semver@^5.5.0, semver@^5.6.0:
|
||||
semver@^5.3.0, semver@^5.6.0:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
||||
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
||||
@@ -7829,13 +7887,6 @@ shallow-clone@^3.0.0:
|
||||
dependencies:
|
||||
kind-of "^6.0.2"
|
||||
|
||||
shebang-command@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
|
||||
integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
|
||||
dependencies:
|
||||
shebang-regex "^1.0.0"
|
||||
|
||||
shebang-command@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
||||
@@ -7843,11 +7894,6 @@ shebang-command@^2.0.0:
|
||||
dependencies:
|
||||
shebang-regex "^3.0.0"
|
||||
|
||||
shebang-regex@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
|
||||
integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
|
||||
|
||||
shebang-regex@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
|
||||
@@ -8153,11 +8199,6 @@ strip-bom@^4.0.0:
|
||||
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
|
||||
integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
|
||||
|
||||
strip-eof@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
|
||||
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
|
||||
|
||||
strip-final-newline@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
|
||||
@@ -8634,13 +8675,6 @@ which-module@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
|
||||
integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
|
||||
|
||||
which@^1.2.9:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
|
||||
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
|
||||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
which@^2.0.1:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
|
||||
@@ -8747,6 +8781,11 @@ yallist@^4.0.0:
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
yaml@^2.2.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4"
|
||||
integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==
|
||||
|
||||
yargs-parser@^18.1.2:
|
||||
version "18.1.3"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
|
||||
|
||||
Reference in New Issue
Block a user