react-native 0.73.3 → 0.73.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,6 @@
12
12
  exports.version = {
13
13
  major: 0,
14
14
  minor: 73,
15
- patch: 3,
15
+ patch: 5,
16
16
  prerelease: null,
17
17
  };
@@ -158,6 +158,8 @@
158
158
  [attributedText insertAttributedString:propertyAttributedText atIndex:0];
159
159
  }
160
160
 
161
+ [self postprocessAttributedText:attributedText];
162
+
161
163
  NSAttributedString *newAttributedText;
162
164
  if (![_previousAttributedText isEqualToAttributedString:attributedText]) {
163
165
  // We have to follow `set prop` pattern:
@@ -191,6 +193,52 @@
191
193
  }];
192
194
  }
193
195
 
196
+ - (void)postprocessAttributedText:(NSMutableAttributedString *)attributedText
197
+ {
198
+ __block CGFloat maximumLineHeight = 0;
199
+
200
+ [attributedText enumerateAttribute:NSParagraphStyleAttributeName
201
+ inRange:NSMakeRange(0, attributedText.length)
202
+ options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
203
+ usingBlock:^(NSParagraphStyle *paragraphStyle, __unused NSRange range, __unused BOOL *stop) {
204
+ if (!paragraphStyle) {
205
+ return;
206
+ }
207
+
208
+ maximumLineHeight = MAX(paragraphStyle.maximumLineHeight, maximumLineHeight);
209
+ }];
210
+
211
+ if (maximumLineHeight == 0) {
212
+ // `lineHeight` was not specified, nothing to do.
213
+ return;
214
+ }
215
+
216
+ __block CGFloat maximumFontLineHeight = 0;
217
+
218
+ [attributedText enumerateAttribute:NSFontAttributeName
219
+ inRange:NSMakeRange(0, attributedText.length)
220
+ options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
221
+ usingBlock:^(UIFont *font, NSRange range, __unused BOOL *stop) {
222
+ if (!font) {
223
+ return;
224
+ }
225
+
226
+ if (maximumFontLineHeight <= font.lineHeight) {
227
+ maximumFontLineHeight = font.lineHeight;
228
+ }
229
+ }];
230
+
231
+ if (maximumLineHeight < maximumFontLineHeight) {
232
+ return;
233
+ }
234
+
235
+ CGFloat baseLineOffset = maximumLineHeight / 2.0 - maximumFontLineHeight / 2.0;
236
+
237
+ [attributedText addAttribute:NSBaselineOffsetAttributeName
238
+ value:@(baseLineOffset)
239
+ range:NSMakeRange(0, attributedText.length)];
240
+ }
241
+
194
242
  #pragma mark -
195
243
 
196
244
  - (NSAttributedString *)measurableAttributedText
@@ -23,7 +23,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
23
23
  __rnVersion = @{
24
24
  RCTVersionMajor: @(0),
25
25
  RCTVersionMinor: @(73),
26
- RCTVersionPatch: @(3),
26
+ RCTVersionPatch: @(5),
27
27
  RCTVersionPrerelease: [NSNull null],
28
28
  };
29
29
  });
@@ -179,15 +179,20 @@ RCT_EXPORT_MODULE()
179
179
  _componentDataByName[componentData.name] = componentData;
180
180
  }
181
181
  }
182
-
182
+ // Preload the a11yManager as the RCTUIManager needs it to listen for notification
183
+ // By eagerly preloading it in the setBridge method, we make sure that the manager is
184
+ // properly initialized in the Main Thread and that we do not incur in any race condition
185
+ // or concurrency problem.
186
+ id<RCTBridgeModule> a11yManager = [self->_bridge moduleForName:@"AccessibilityManager"
187
+ lazilyLoadIfNecessary:YES];
188
+ __weak NSObject * a11yManagerWeakObject = a11yManager;
183
189
  // This dispatch_async avoids a deadlock while configuring native modules
184
- dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
185
- id a11yManager = [self->_bridge moduleForName:@"AccessibilityManager"
186
- lazilyLoadIfNecessary:YES];
190
+ dispatch_async(dispatch_get_main_queue(), ^{
191
+ __strong NSObject * a11yManagerStrongObject = a11yManagerWeakObject;
187
192
  [[NSNotificationCenter defaultCenter] addObserver:self
188
193
  selector:@selector(didReceiveNewContentSizeMultiplier)
189
194
  name:@"RCTAccessibilityManagerDidUpdateMultiplierNotification"
190
- object:a11yManager];
195
+ object:a11yManagerStrongObject];
191
196
  });
192
197
  [[NSNotificationCenter defaultCenter] addObserver:self
193
198
  selector:@selector(namedOrientationDidChange)
@@ -20,6 +20,7 @@ folly_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_C
20
20
  folly_compiler_flags = folly_flags + ' ' + '-Wno-comma -Wno-shorten-64-to-32'
21
21
  folly_version = '2022.05.16.00'
22
22
  boost_compiler_flags = '-Wno-documentation'
23
+ new_arch_flags = ENV['RCT_NEW_ARCH_ENABLED'] == '1' ? ' -DRCT_NEW_ARCH_ENABLED=1' : ''
23
24
 
24
25
  header_search_paths = [
25
26
  "\"$(PODS_TARGET_SRCROOT)/ReactCommon\"",
@@ -52,13 +53,13 @@ Pod::Spec.new do |s|
52
53
  s.source_files = "Fabric/**/*.{c,h,m,mm,S,cpp}"
53
54
  s.exclude_files = "**/tests/*",
54
55
  "**/android/*",
55
- s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags
56
+ s.compiler_flags = folly_compiler_flags + ' ' + boost_compiler_flags + new_arch_flags
56
57
  s.header_dir = header_dir
57
58
  s.module_name = module_name
58
59
  s.framework = ["JavaScriptCore", "MobileCoreServices"]
59
60
  s.pod_target_xcconfig = {
60
61
  "HEADER_SEARCH_PATHS" => header_search_paths,
61
- "OTHER_CFLAGS" => "$(inherited) -DRN_FABRIC_ENABLED" + " " + folly_flags,
62
+ "OTHER_CFLAGS" => "$(inherited) -DRN_FABRIC_ENABLED" + " " + folly_flags + new_arch_flags,
62
63
  "CLANG_CXX_LANGUAGE_STANDARD" => "c++20"
63
64
  }.merge!(ENV['USE_FRAMEWORKS'] != nil ? {
64
65
  "PUBLIC_HEADERS_FOLDER_PATH" => "#{module_name}.framework/Headers/#{header_dir}"
@@ -1,4 +1,4 @@
1
- VERSION_NAME=0.73.3
1
+ VERSION_NAME=0.73.5
2
2
  react.internal.publishingGroup=com.facebook.react
3
3
 
4
4
  android.useAndroidX=true
@@ -10,6 +10,8 @@ package com.facebook.react.bridge.queue;
10
10
  import android.os.Handler;
11
11
  import android.os.Looper;
12
12
  import android.os.Message;
13
+ import com.facebook.common.logging.FLog;
14
+ import com.facebook.react.common.ReactConstants;
13
15
 
14
16
  /** Handler that can catch and dispatch Exceptions to an Exception handler. */
15
17
  public class MessageQueueThreadHandler extends Handler {
@@ -26,6 +28,15 @@ public class MessageQueueThreadHandler extends Handler {
26
28
  try {
27
29
  super.dispatchMessage(msg);
28
30
  } catch (Exception e) {
31
+ if (e instanceof NullPointerException) {
32
+ FLog.e(
33
+ ReactConstants.TAG,
34
+ "Caught NullPointerException when dispatching message in MessageQueueThreadHandler. This is likely caused by runnable"
35
+ + "(msg.callback) being nulled in Android Handler after dispatching and before handling (see T170239922 for more details)."
36
+ + "Currently we observe that it only happen once which is during initialisation. Due to fixing probably involve Android "
37
+ + "System code, we decide to ignore here for now and print an error message for debugging purpose in case this cause more serious issues in future.");
38
+ return;
39
+ }
29
40
  mExceptionHandler.handleException(e);
30
41
  }
31
42
  }
@@ -17,6 +17,6 @@ public class ReactNativeVersion {
17
17
  public static final Map<String, Object> VERSION = MapBuilder.<String, Object>of(
18
18
  "major", 0,
19
19
  "minor", 73,
20
- "patch", 3,
20
+ "patch", 5,
21
21
  "prerelease", null);
22
22
  }
@@ -206,7 +206,15 @@ import java.util.Set;
206
206
  }
207
207
  for (String oldKey : keysToNormalize) {
208
208
  Object value = events.get(oldKey);
209
- String newKey = "top" + oldKey.substring(0, 1).toUpperCase() + oldKey.substring(1);
209
+ String baseKey = "";
210
+ if (oldKey.startsWith("on")) {
211
+ // Drop "on" prefix.
212
+ baseKey = oldKey.substring(2);
213
+ } else {
214
+ // Capitalize first letter.
215
+ baseKey = oldKey.substring(0, 1).toUpperCase() + oldKey.substring(1);
216
+ }
217
+ String newKey = "top" + baseKey;
210
218
  events.put(newKey, value);
211
219
  }
212
220
  }
@@ -17,7 +17,7 @@ namespace facebook::react {
17
17
  constexpr struct {
18
18
  int32_t Major = 0;
19
19
  int32_t Minor = 73;
20
- int32_t Patch = 3;
20
+ int32_t Patch = 5;
21
21
  std::string_view Prerelease = "";
22
22
  } ReactNativeVersion;
23
23
 
@@ -16,18 +16,26 @@
16
16
 
17
17
  namespace facebook::react {
18
18
 
19
+ static bool hasPrefix(const std::string& str, const std::string& prefix) {
20
+ return str.compare(0, prefix.length(), prefix) == 0;
21
+ }
22
+
19
23
  // TODO(T29874519): Get rid of "top" prefix once and for all.
20
24
  /*
21
- * Capitalizes the first letter of the event type and adds "top" prefix if
22
- * necessary (e.g. "layout" becames "topLayout").
25
+ * Replaces "on" with "top" if present. Or capitalizes the first letter and adds
26
+ * "top" prefix. E.g. "eventName" becomes "topEventName", "onEventName" also
27
+ * becomes "topEventName".
23
28
  */
24
29
  static std::string normalizeEventType(std::string type) {
25
30
  auto prefixedType = std::move(type);
26
- if (prefixedType.find("top", 0) != 0) {
27
- prefixedType.insert(0, "top");
28
- prefixedType[3] = static_cast<char>(toupper(prefixedType[3]));
31
+ if (facebook::react::hasPrefix(prefixedType, "top")) {
32
+ return prefixedType;
33
+ }
34
+ if (facebook::react::hasPrefix(prefixedType, "on")) {
35
+ return "top" + prefixedType.substr(2);
29
36
  }
30
- return prefixedType;
37
+ prefixedType[0] = static_cast<char>(toupper(prefixedType[0]));
38
+ return "top" + prefixedType;
31
39
  }
32
40
 
33
41
  std::mutex& EventEmitter::DispatchMutex() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native",
3
- "version": "0.73.3",
3
+ "version": "0.73.5",
4
4
  "description": "A framework for building native apps using React",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -93,12 +93,12 @@
93
93
  },
94
94
  "dependencies": {
95
95
  "@jest/create-cache-key-function": "^29.6.3",
96
- "@react-native-community/cli": "12.3.2",
97
- "@react-native-community/cli-platform-android": "12.3.2",
98
- "@react-native-community/cli-platform-ios": "12.3.2",
96
+ "@react-native-community/cli": "12.3.6",
97
+ "@react-native-community/cli-platform-android": "12.3.6",
98
+ "@react-native-community/cli-platform-ios": "12.3.6",
99
99
  "@react-native/assets-registry": "0.73.1",
100
- "@react-native/community-cli-plugin": "0.73.14",
101
- "@react-native/codegen": "0.73.2",
100
+ "@react-native/community-cli-plugin": "0.73.17",
101
+ "@react-native/codegen": "0.73.3",
102
102
  "@react-native/gradle-plugin": "0.73.4",
103
103
  "@react-native/js-polyfills": "0.73.1",
104
104
  "@react-native/normalize-colors": "0.73.2",
@@ -104,6 +104,10 @@ class NewArchitectureHelper
104
104
  current_config = hash["pod_target_xcconfig"] != nil ? hash["pod_target_xcconfig"] : {}
105
105
  current_headers = current_config["HEADER_SEARCH_PATHS"] != nil ? current_config["HEADER_SEARCH_PATHS"] : ""
106
106
 
107
+ flags_to_add = new_arch_enabled ?
108
+ "#{@@folly_compiler_flags} -DRCT_NEW_ARCH_ENABLED=1" :
109
+ "#{@@folly_compiler_flags}"
110
+
107
111
  header_search_paths = ["\"$(PODS_ROOT)/boost\" \"$(PODS_ROOT)/Headers/Private/Yoga\""]
108
112
  if ENV['USE_FRAMEWORKS']
109
113
  header_search_paths << "\"$(PODS_ROOT)/DoubleConversion\""
@@ -123,7 +127,7 @@ class NewArchitectureHelper
123
127
  }
124
128
  end
125
129
  header_search_paths_string = header_search_paths.join(" ")
126
- spec.compiler_flags = compiler_flags.empty? ? @@folly_compiler_flags : "#{compiler_flags} #{@@folly_compiler_flags}"
130
+ spec.compiler_flags = compiler_flags.empty? ? "$(inherited) #{flags_to_add}" : "$(inherited) #{compiler_flags} #{flags_to_add}"
127
131
  current_config["HEADER_SEARCH_PATHS"] = current_headers.empty? ?
128
132
  header_search_paths_string :
129
133
  "#{current_headers} #{header_search_paths_string}"
@@ -32,7 +32,13 @@ const REACT_NATIVE_PACKAGE_ROOT_FOLDER = path.join(__dirname, '..', '..');
32
32
 
33
33
  const CODEGEN_DEPENDENCY_NAME = '@react-native/codegen';
34
34
  const CODEGEN_REPO_PATH = `${REACT_NATIVE_REPOSITORY_ROOT}/packages/react-native-codegen`;
35
- const CODEGEN_NPM_PATH = `${REACT_NATIVE_PACKAGE_ROOT_FOLDER}/../${CODEGEN_DEPENDENCY_NAME}`;
35
+ // This is a change for 0.73-stable only since this piece of code was replaced:
36
+ // https://github.com/facebook/react-native/commit/9071a3a0b0e11ad711927651bcb2412f553b6fe9
37
+ const CODEGEN_NPM_PATH = path.dirname(
38
+ require.resolve(path.join(CODEGEN_DEPENDENCY_NAME, 'package.json'), {
39
+ paths: [REACT_NATIVE_PACKAGE_ROOT_FOLDER],
40
+ }),
41
+ );
36
42
  const CORE_LIBRARIES_WITH_OUTPUT_FOLDER = {
37
43
  rncore: path.join(REACT_NATIVE_PACKAGE_ROOT_FOLDER, 'ReactCommon'),
38
44
  FBReactNativeSpec: null,
@@ -189,33 +195,34 @@ function handleThirdPartyLibraries(
189
195
  codegenConfigKey,
190
196
  ) {
191
197
  // Determine which of these are codegen-enabled libraries
192
- const configDir =
193
- baseCodegenConfigFileDir ||
194
- path.join(REACT_NATIVE_PACKAGE_ROOT_FOLDER, '..');
198
+ const configDir = baseCodegenConfigFileDir || process.cwd();
195
199
  console.log(
196
200
  `\n\n[Codegen] >>>>> Searching for codegen-enabled libraries in ${configDir}`,
197
201
  );
198
202
 
199
203
  // Handle third-party libraries
204
+ const resolveOptions = {paths: [configDir]};
200
205
  Object.keys(dependencies).forEach(dependency => {
201
206
  if (dependency === REACT_NATIVE_DEPENDENCY_NAME) {
202
207
  // react-native should already be added.
203
208
  return;
204
209
  }
205
- const codegenConfigFileDir = path.join(configDir, dependency);
206
- const configFilePath = path.join(
207
- codegenConfigFileDir,
208
- codegenConfigFilename,
209
- );
210
- if (fs.existsSync(configFilePath)) {
210
+
211
+ try {
212
+ const configFilePath = require.resolve(
213
+ `${dependency}/${codegenConfigFilename}`,
214
+ resolveOptions,
215
+ );
211
216
  const configFile = JSON.parse(fs.readFileSync(configFilePath));
212
217
  extractLibrariesFromJSON(
213
218
  configFile,
214
219
  libraries,
215
220
  codegenConfigKey,
216
221
  dependency,
217
- codegenConfigFileDir,
222
+ path.dirname(configFilePath),
218
223
  );
224
+ } catch (_) {
225
+ // ignore
219
226
  }
220
227
  });
221
228
  }
@@ -13,7 +13,7 @@
13
13
  # ./with-environment.sh command
14
14
 
15
15
  # Start with a default
16
- NODE_BINARY=$(command -v node)
16
+ NODE_BINARY=$(command -v node || echo "")
17
17
  export NODE_BINARY
18
18
 
19
19
  # Override the default with the global environment
@@ -1 +1 @@
1
- hermes-2023-11-17-RNv0.73.0-21043a3fc062be445e56a2c10ecd8be028dd9cc5
1
+ hermes-2024-02-20-RNv0.73.5-18f99ace4213052c5e7cdbcd39ee9766cd5df7e4
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -11,15 +11,15 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "react": "18.2.0",
14
- "react-native": "0.73.3"
14
+ "react-native": "0.73.5"
15
15
  },
16
16
  "devDependencies": {
17
17
  "@babel/core": "^7.20.0",
18
18
  "@babel/preset-env": "^7.20.0",
19
19
  "@babel/runtime": "^7.20.0",
20
- "@react-native/babel-preset": "0.73.20",
20
+ "@react-native/babel-preset": "0.73.21",
21
21
  "@react-native/eslint-config": "0.73.2",
22
- "@react-native/metro-config": "0.73.4",
22
+ "@react-native/metro-config": "0.73.5",
23
23
  "@react-native/typescript-config": "0.73.1",
24
24
  "@types/react": "^18.2.6",
25
25
  "@types/react-test-renderer": "^18.0.0",