react-native 0.84.0-nightly-20251211-80e384a80 → 0.84.0-nightly-20251212-dd390dbbe

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.
@@ -29,7 +29,7 @@ export default class ReactNativeVersion {
29
29
  static major: number = 0;
30
30
  static minor: number = 84;
31
31
  static patch: number = 0;
32
- static prerelease: string | null = 'nightly-20251211-80e384a80';
32
+ static prerelease: string | null = 'nightly-20251212-dd390dbbe';
33
33
 
34
34
  static getVersionString(): string {
35
35
  return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`;
@@ -367,7 +367,7 @@ export type BlendMode =
367
367
  | 'color'
368
368
  | 'luminosity';
369
369
 
370
- export type GradientValue = {
370
+ export type LinearGradientValue = {
371
371
  type: 'linear-gradient';
372
372
  // Angle or direction enums
373
373
  direction?: string | undefined;
@@ -377,6 +377,89 @@ export type GradientValue = {
377
377
  }>;
378
378
  };
379
379
 
380
+ export type GradientValue = LinearGradientValue;
381
+
382
+ type RadialExtent =
383
+ | 'closest-corner'
384
+ | 'closest-side'
385
+ | 'farthest-corner'
386
+ | 'farthest-side';
387
+ export type RadialGradientPosition =
388
+ | {
389
+ top: number | string;
390
+ left: number | string;
391
+ }
392
+ | {
393
+ top: number | string;
394
+ right: number | string;
395
+ }
396
+ | {
397
+ bottom: number | string;
398
+ left: number | string;
399
+ }
400
+ | {
401
+ bottom: number | string;
402
+ right: number | string;
403
+ };
404
+
405
+ export type RadialGradientShape = 'circle' | 'ellipse';
406
+ export type RadialGradientSize =
407
+ | RadialExtent
408
+ | {
409
+ x: string | number;
410
+ y: string | number;
411
+ };
412
+
413
+ type RadialGradientValue = {
414
+ type: 'radial-gradient';
415
+ shape: RadialGradientShape;
416
+ size: RadialGradientSize;
417
+ position: RadialGradientPosition;
418
+ colorStops: ReadonlyArray<{
419
+ color: ColorValue | null;
420
+ positions?: ReadonlyArray<string> | undefined;
421
+ }>;
422
+ };
423
+
424
+ export type BackgroundImageValue = LinearGradientValue | RadialGradientValue;
425
+
426
+ export type BackgroundSizeValue =
427
+ | {
428
+ x: string | number;
429
+ y: string | number;
430
+ }
431
+ | 'cover'
432
+ | 'contain';
433
+
434
+ export type BackgroundRepeatKeyword =
435
+ | 'repeat'
436
+ | 'space'
437
+ | 'round'
438
+ | 'no-repeat';
439
+
440
+ export type BackgroundPositionValue =
441
+ | {
442
+ top: number | string;
443
+ left: number | string;
444
+ }
445
+ | {
446
+ top: number | string;
447
+ right: number | string;
448
+ }
449
+ | {
450
+ bottom: number | string;
451
+ left: number | string;
452
+ }
453
+ | {
454
+ bottom: number | string;
455
+ right: number | string;
456
+ };
457
+
458
+ export type BackgroundRepeatValue = {
459
+ x: BackgroundRepeatKeyword;
460
+ y: BackgroundRepeatKeyword;
461
+ };
462
+
380
463
  /**
381
464
  * @see https://reactnative.dev/docs/view#style
382
465
  */
@@ -437,7 +520,19 @@ export interface ViewStyle extends FlexStyle, ShadowStyleIOS, TransformsStyle {
437
520
 
438
521
  mixBlendMode?: BlendMode | undefined;
439
522
  experimental_backgroundImage?:
440
- | ReadonlyArray<GradientValue>
523
+ | ReadonlyArray<BackgroundImageValue>
524
+ | string
525
+ | undefined;
526
+ experimental_backgroundSize?:
527
+ | ReadonlyArray<BackgroundSizeValue>
528
+ | string
529
+ | undefined;
530
+ experimental_backgroundPosition?:
531
+ | ReadonlyArray<BackgroundPositionValue>
532
+ | string
533
+ | undefined;
534
+ experimental_backgroundRepeat?:
535
+ | ReadonlyArray<BackgroundRepeatValue>
441
536
  | string
442
537
  | undefined;
443
538
  }
@@ -24,7 +24,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
24
24
  RCTVersionMajor: @(0),
25
25
  RCTVersionMinor: @(84),
26
26
  RCTVersionPatch: @(0),
27
- RCTVersionPrerelease: @"nightly-20251211-80e384a80",
27
+ RCTVersionPrerelease: @"nightly-20251212-dd390dbbe",
28
28
  };
29
29
  });
30
30
  return __rnVersion;
@@ -89,6 +89,7 @@
89
89
 
90
90
  if (_listenerCount > 0) {
91
91
  [self stopObserving];
92
+ _listenerCount = 0;
92
93
  }
93
94
  }
94
95
 
@@ -1,4 +1,4 @@
1
- VERSION_NAME=0.84.0-nightly-20251211-80e384a80
1
+ VERSION_NAME=0.84.0-nightly-20251212-dd390dbbe
2
2
  react.internal.publishingGroup=com.facebook.react
3
3
  react.internal.hermesPublishingGroup=com.facebook.hermes
4
4
 
@@ -15,6 +15,6 @@ public object ReactNativeVersion {
15
15
  "major" to 0,
16
16
  "minor" to 84,
17
17
  "patch" to 0,
18
- "prerelease" to "nightly-20251211-80e384a80"
18
+ "prerelease" to "nightly-20251212-dd390dbbe"
19
19
  )
20
20
  }
@@ -19,15 +19,16 @@ public open class PackagerConnectionSettings(private val appContext: Context) {
19
19
  private val preferences: SharedPreferences =
20
20
  PreferenceManager.getDefaultSharedPreferences(appContext)
21
21
  public val packageName: String = appContext.packageName
22
- private val _additionalOptionsForPackager: MutableMap<String, String> = mutableMapOf()
23
- private var _packagerOptionsUpdater: (Map<String, String>) -> Map<String, String> = { it }
24
- private var cachedHost: String? = null
22
+
23
+ init {
24
+ resetDebugServerHost()
25
+ }
25
26
 
26
27
  public open var debugServerHost: String
27
28
  get() {
28
29
  // Check cached host first. If empty try to detect emulator type and use default
29
30
  // hostname for those
30
- cachedHost?.let {
31
+ _cachedOrOverrideHost?.let {
31
32
  return it
32
33
  }
33
34
 
@@ -44,19 +45,19 @@ public open class PackagerConnectionSettings(private val appContext: Context) {
44
45
  )
45
46
  }
46
47
 
47
- cachedHost = host
48
+ _cachedOrOverrideHost = host
48
49
  return host
49
50
  }
50
51
  set(host) {
51
52
  if (host.isEmpty()) {
52
- cachedHost = null
53
+ _cachedOrOverrideHost = null
53
54
  } else {
54
- cachedHost = host
55
+ _cachedOrOverrideHost = host
55
56
  }
56
57
  }
57
58
 
58
59
  public open fun resetDebugServerHost() {
59
- cachedHost = null
60
+ _cachedOrOverrideHost = null
60
61
  }
61
62
 
62
63
  public fun setPackagerOptionsUpdater(queryMapper: (Map<String, String>) -> Map<String, String>) {
@@ -76,5 +77,11 @@ public open class PackagerConnectionSettings(private val appContext: Context) {
76
77
  private companion object {
77
78
  private val TAG = PackagerConnectionSettings::class.java.simpleName
78
79
  private const val PREFS_DEBUG_SERVER_HOST_KEY = "debug_http_host"
80
+
81
+ // The state for this class needs to be retained in the companion object.
82
+ // That's necessary in the case when there are multiple instances of PackagerConnectionSettings
83
+ private var _cachedOrOverrideHost: String? = null
84
+ private val _additionalOptionsForPackager: MutableMap<String, String> = mutableMapOf()
85
+ private var _packagerOptionsUpdater: (Map<String, String>) -> Map<String, String> = { it }
79
86
  }
80
87
  }
@@ -176,11 +176,24 @@ std::shared_ptr<TurboModule> TurboModuleManager::getTurboModule(
176
176
  return turboModule;
177
177
  }
178
178
 
179
+ // TODO(T248203434): Remove this workaround once fixed in fbjni
180
+ // NOTE: We use jstring instead of std::string for the method signature to
181
+ // work around a bug in fbjni's exception handling. When a Java method throws
182
+ // an exception, fbjni's JMethod::operator() needs to check for pending
183
+ // exceptions via FACEBOOK_JNI_THROW_PENDING_EXCEPTION(). However, if we pass
184
+ // std::string, fbjni creates a temporary local_ref<JString> for the argument.
185
+ // C++ destroys temporaries at the end of the full-expression, which happens
186
+ // AFTER the JNI call returns but BEFORE the exception check. The destructor
187
+ // calls JNI functions (GetObjectRefType) while there's a pending exception,
188
+ // which violates JNI rules and causes ART's CheckJNI to abort the process.
189
+ //
190
+ // By pre-converting to jstring here, we control the lifetime of the
191
+ // local_ref<JString> so it extends past the exception check.
179
192
  static auto getTurboJavaModule =
180
- javaPart->getClass()
181
- ->getMethod<jni::alias_ref<JTurboModule>(const std::string&)>(
182
- "getTurboJavaModule");
183
- auto moduleInstance = getTurboJavaModule(javaPart.get(), name);
193
+ javaPart->getClass()->getMethod<jni::alias_ref<JTurboModule>(jstring)>(
194
+ "getTurboJavaModule");
195
+ auto jname = jni::make_jstring(name);
196
+ auto moduleInstance = getTurboJavaModule(javaPart.get(), jname.get());
184
197
  if (moduleInstance) {
185
198
  TurboModulePerfLogger::moduleJSRequireEndingStart(moduleName);
186
199
  JavaTurboModule::InitParams params = {
@@ -243,11 +256,24 @@ std::shared_ptr<TurboModule> TurboModuleManager::getLegacyModule(
243
256
 
244
257
  TurboModulePerfLogger::moduleJSRequireBeginningEnd(moduleName);
245
258
 
259
+ // TODO(T248203434): Remove this workaround once fixed in fbjni
260
+ // NOTE: We use jstring instead of std::string for the method signature to
261
+ // work around a bug in fbjni's exception handling. When a Java method throws
262
+ // an exception, fbjni's JMethod::operator() needs to check for pending
263
+ // exceptions via FACEBOOK_JNI_THROW_PENDING_EXCEPTION(). However, if we pass
264
+ // std::string, fbjni creates a temporary local_ref<JString> for the argument.
265
+ // C++ destroys temporaries at the end of the full-expression, which happens
266
+ // AFTER the JNI call returns but BEFORE the exception check. The destructor
267
+ // calls JNI functions (GetObjectRefType) while there's a pending exception,
268
+ // which violates JNI rules and causes ART's CheckJNI to abort the process.
269
+ //
270
+ // By pre-converting to jstring here, we control the lifetime of the
271
+ // local_ref<JString> so it extends past the exception check.
246
272
  static auto getLegacyJavaModule =
247
- javaPart->getClass()
248
- ->getMethod<jni::alias_ref<JNativeModule>(const std::string&)>(
249
- "getLegacyJavaModule");
250
- auto moduleInstance = getLegacyJavaModule(javaPart.get(), name);
273
+ javaPart->getClass()->getMethod<jni::alias_ref<JNativeModule>(jstring)>(
274
+ "getLegacyJavaModule");
275
+ auto jname = jni::make_jstring(name);
276
+ auto moduleInstance = getLegacyJavaModule(javaPart.get(), jname.get());
251
277
 
252
278
  if (moduleInstance) {
253
279
  TurboModulePerfLogger::moduleJSRequireEndingStart(moduleName);
@@ -12,6 +12,7 @@
12
12
  <string name="menubar_description" gender="unknown">मेनु बार</string>
13
13
  <string name="menuitem_description" gender="unknown">मेनु वस्तु</string>
14
14
  <string name="scrollbar_description" gender="unknown">स्क्रोल बार</string>
15
+ <string name="spinbutton_description" gender="unknown">स्पिन बटन</string>
15
16
  <string name="rn_tab_description" gender="unknown">टयाब</string>
16
17
  <string name="timer_description" gender="unknown">टाइमर</string>
17
18
  <string name="state_busy_description" gender="unknown">व्यस्त</string>
@@ -22,7 +22,7 @@ constexpr struct {
22
22
  int32_t Major = 0;
23
23
  int32_t Minor = 84;
24
24
  int32_t Patch = 0;
25
- std::string_view Prerelease = "nightly-20251211-80e384a80";
25
+ std::string_view Prerelease = "nightly-20251212-dd390dbbe";
26
26
  } ReactNativeVersion;
27
27
 
28
28
  } // namespace facebook::react
@@ -77,6 +77,22 @@ inline void updateProp(const PropName propName, BaseViewProps &viewProps, const
77
77
  case BACKGROUND_COLOR:
78
78
  viewProps.backgroundColor = snapshot.props.backgroundColor;
79
79
  break;
80
+
81
+ case SHADOW_COLOR:
82
+ viewProps.shadowColor = snapshot.props.shadowColor;
83
+ break;
84
+
85
+ case SHADOW_OFFSET:
86
+ viewProps.shadowOffset = snapshot.props.shadowOffset;
87
+ break;
88
+
89
+ case SHADOW_OPACITY:
90
+ viewProps.shadowOpacity = snapshot.props.shadowOpacity;
91
+ break;
92
+
93
+ case SHADOW_RADIUS:
94
+ viewProps.shadowRadius = snapshot.props.shadowRadius;
95
+ break;
80
96
  }
81
97
  }
82
98
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native",
3
- "version": "0.84.0-nightly-20251211-80e384a80",
3
+ "version": "0.84.0-nightly-20251212-dd390dbbe",
4
4
  "description": "A framework for building native apps using React",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -160,13 +160,13 @@
160
160
  },
161
161
  "dependencies": {
162
162
  "@jest/create-cache-key-function": "^29.7.0",
163
- "@react-native/assets-registry": "0.84.0-nightly-20251211-80e384a80",
164
- "@react-native/codegen": "0.84.0-nightly-20251211-80e384a80",
165
- "@react-native/community-cli-plugin": "0.84.0-nightly-20251211-80e384a80",
166
- "@react-native/gradle-plugin": "0.84.0-nightly-20251211-80e384a80",
167
- "@react-native/js-polyfills": "0.84.0-nightly-20251211-80e384a80",
168
- "@react-native/normalize-colors": "0.84.0-nightly-20251211-80e384a80",
169
- "@react-native/virtualized-lists": "0.84.0-nightly-20251211-80e384a80",
163
+ "@react-native/assets-registry": "0.84.0-nightly-20251212-dd390dbbe",
164
+ "@react-native/codegen": "0.84.0-nightly-20251212-dd390dbbe",
165
+ "@react-native/community-cli-plugin": "0.84.0-nightly-20251212-dd390dbbe",
166
+ "@react-native/gradle-plugin": "0.84.0-nightly-20251212-dd390dbbe",
167
+ "@react-native/js-polyfills": "0.84.0-nightly-20251212-dd390dbbe",
168
+ "@react-native/normalize-colors": "0.84.0-nightly-20251212-dd390dbbe",
169
+ "@react-native/virtualized-lists": "0.84.0-nightly-20251212-dd390dbbe",
170
170
  "abort-controller": "^3.0.0",
171
171
  "anser": "^1.4.9",
172
172
  "ansi-regex": "^5.0.0",