Skip to content

Commit 57aa8b8

Browse files
rickhanloniifacebook-github-bot
authored andcommitted
Manual React Native sync for revisions 48b4ecc...b5e5ce8
Summary: This sync includes the changes from: - D56103750 - [TODO] A shim for SECRET_INTERNALS This sync includes the following changes: - **[b5e5ce8e0](facebook/react@b5e5ce8e0 )**: Update ReactNativeTypes for root options (part 2) ([#28857](facebook/react#28857)) //<Ricky>// - **[da6ba53b1](facebook/react@da6ba53b1 )**: [UMD] Remove umd builds ([#28735](facebook/react#28735)) //<Josh Story>// - **[0c245df1d](facebook/react@0c245df1d )**: Complete the typo fix ([#28856](facebook/react#28856)) //<Sebastian Silbermann>// - **[f82051d7a](facebook/react@f82051d7a )**: console test utils fix: match entire string, not just first letter ([#28855](facebook/react#28855)) //<Andrew Clark>// - **[4ca20fd36](facebook/react@4ca20fd36 )**: Test top level fragment inside lazy semantics ([#28852](facebook/react#28852)) //<Sebastian Markbåge>// - **[c0cf7c696](facebook/react@c0cf7c696 )**: Promote ASYNC_ITERATOR symbol to React Symbols ([#28851](facebook/react#28851)) //<Sebastian Markbåge>// - **[657428a9e](facebook/react@657428a9e )**: Add ReactNativeTypes for root options ([#28850](facebook/react#28850)) //<Ricky>// - **[7909d8eab](facebook/react@7909d8eab )**: [Flight] Encode ReadableStream and AsyncIterables ([#28847](facebook/react#28847)) //<Sebastian Markbåge>// - **[13eb61d05](facebook/react@13eb61d05 )**: Move enableUseDeferredValueInitialArg to canary ([#28818](facebook/react#28818)) //<Andrew Clark>// - **[8afa144bd](facebook/react@8afa144bd )**: Enable flag disableClientCache ([#28846](facebook/react#28846)) //<Jan Kassens>// - **[734956ace](facebook/react@734956ace )**: Devtools: Add support for useFormStatus ([#28413](facebook/react#28413)) //<Sebastian Silbermann>// - **[17e920c00](facebook/react@17e920c00 )**: [Flight Reply] Encode Typed Arrays and Blobs ([#28819](facebook/react#28819)) //<Sebastian Markbåge>// - **[0347fcd00](facebook/react@0347fcd00 )**: Add on(Caught|Uncaught|Recoverable) opts to RN ([#28836](facebook/react#28836)) //<Ricky>// - **[c113503ad](facebook/react@c113503ad )**: Flush direct streams in Bun ([#28837](facebook/react#28837)) //<Kenta Iwasaki>// - **[9defcd56b](facebook/react@9defcd56b )**: Remove redundant props assign ([#28829](facebook/react#28829)) //<Sebastian Silbermann>// - **[ed4023603](facebook/react@ed4023603 )**: Fix mistaken "react-server" condition ([#28835](facebook/react#28835)) //<Sebastian Markbåge>// - **[c8a035036](facebook/react@c8a035036 )**: [Fizz] hoistables should never flush before the preamble ([#28802](facebook/react#28802)) //<Josh Story>// - **[4f5c812a3](facebook/react@4f5c812a3 )**: DevTools: Rely on sourcemaps to compute hook name of built-in hooks in newer versions ([#28593](facebook/react#28593)) //<Sebastian Silbermann>// - **[435415962](facebook/react@435415962 )**: Backwards compatibility for string refs on WWW ([#28826](facebook/react#28826)) //<Jack Pope>// - **[608edcc90](facebook/react@608edcc90 )**: [tests] add `assertConsole<method>Dev` helpers ([#28732](facebook/react#28732)) //<Ricky>// - **[da69b6af9](facebook/react@da69b6af9 )**: ReactDOM.requestFormReset ([#28809](facebook/react#28809)) //<Andrew Clark>// - **[374b5d26c](facebook/react@374b5d26c )**: Scaffolding for requestFormReset API ([#28808](facebook/react#28808)) //<Andrew Clark>// - **[41950d14a](facebook/react@41950d14a )**: Automatically reset forms after action finishes ([#28804](facebook/react#28804)) //<Andrew Clark>// - **[dc6a7e01e](facebook/react@dc6a7e01e )**: [Float] Don't preload images inside `<noscript>` ([#28815](facebook/react#28815)) //<Josh Story>// - **[3f947b1b4](facebook/react@3f947b1b4 )**: [tests] Assert scheduler log empty in internalAct ([#28737](facebook/react#28737)) //<Ricky>// - **[bf09089f6](facebook/react@bf09089f6 )**: Remove Scheduler.log from ReactSuspenseFuzz-test ([#28812](facebook/react#28812)) //<Ricky>// - **[84cb3b4cb](facebook/react@84cb3b4cb )**: Hardcode disableIEWorkarounds for www ([#28811](facebook/react#28811)) //<Ricky>// - **[2243b40ab](facebook/react@2243b40ab )**: [tests] assertLog before act in useEffectEvent ([#28763](facebook/react#28763)) //<Ricky>// - **[dfc64c6e3](facebook/react@dfc64c6e3 )**: [tests] assertLog before act in ReactUse ([#28762](facebook/react#28762)) //<Ricky>// - **[42eff4bc7](facebook/react@42eff4bc7 )**: [tests] Fix assertions not flushed before act ([#28745](facebook/react#28745)) //<Ricky>// - **[ed3c65caf](facebook/react@ed3c65caf )**: Warn if outdated JSX transform is detected ([#28781](facebook/react#28781)) //<Andrew Clark>// - **[3f9e237a2](facebook/react@3f9e237a2 )**: Fix: Suspend while recovering from hydration error ([#28800](facebook/react#28800)) //<Andrew Clark>// - **[7f5d25e23](facebook/react@7f5d25e23 )**: Fix cloneElement using string ref w no owner ([#28797](facebook/react#28797)) //<Joseph Savona>// - **[bf40b0244](facebook/react@bf40b0244 )**: [Fizz] Stop publishing external-runtime to stable channel ([#28796](facebook/react#28796)) //<Josh Story>// - **[7f93cb41c](facebook/react@7f93cb41c )**: [DOM] Infer react-server entries bundles if not explicitly configured ([#28795](facebook/react#28795)) //<Josh Story>// - **[f61316535](facebook/react@f61316535 )**: Rename SECRET INTERNALS to `__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE` ([#28789](facebook/react#28789)) //<Sebastian Markbåge>// - **[9644d206e](facebook/react@9644d206e )**: Soften useFormState warning ([#28788](facebook/react#28788)) //<Ricky>// - **[c771016e1](facebook/react@c771016e1 )**: Rename The Secret Export of Server Internals ([#28786](facebook/react#28786)) //<Sebastian Markbåge>// - **[d50323eb8](facebook/react@d50323eb8 )**: Flatten ReactSharedInternals ([#28783](facebook/react#28783)) //<Sebastian Markbåge>// - **[f62cf8c62](facebook/react@f62cf8c62 )**: [Float] treat `props.async` in Float consistent with the rest of react-dom ([#26760](facebook/react#26760)) //<Josh Story>// - **[dfd3d5af8](facebook/react@dfd3d5af8 )**: Add support for transition{run,start,cancel} events ([#27345](facebook/react#27345)) //<Hugo Sales>// - **[1f8327f83](facebook/react@1f8327f83 )**: [Fiber] Use real event priority for hydration scheduling ([#28765](facebook/react#28765)) //<Josh Story>// - **[97c90ed88](facebook/react@97c90ed88 )**: [DOM] Shrink ReactDOMCurrentDispatcher method names ([#28770](facebook/react#28770)) //<Josh Story>// - **[9007fdc8f](facebook/react@9007fdc8f )**: [DOM] Shrink ReactDOMSharedInternals source representation ([#28771](facebook/react#28771)) //<Josh Story>// - **[14f50ad15](facebook/react@14f50ad15 )**: [Flight] Allow lazily resolving outlined models ([#28780](facebook/react#28780)) //<Sebastian Markbåge>// - **[4c12339ce](facebook/react@4c12339ce )**: [DOM] move `flushSync` out of the reconciler ([#28500](facebook/react#28500)) //<Josh Story>// - **[8e1462e8c](facebook/react@8e1462e8c )**: [Fiber] Move updatePriority tracking to renderers ([#28751](facebook/react#28751)) //<Josh Story>// - **[0b3b8a6a3](facebook/react@0b3b8a6a3 )**: jsx: Remove unnecessary hasOwnProperty check ([#28775](facebook/react#28775)) //<Andrew Clark>// - **[2acfb7b60](facebook/react@2acfb7b60 )**: [Flight] Support FormData from Server to Client ([#28754](facebook/react#28754)) //<Sebastian Markbåge>// - **[d1547defe](facebook/react@d1547defe )**: Fast JSX: Don't clone props object ([#28768](facebook/react#28768)) //<Andrew Clark>// - **[bfd8da807](facebook/react@bfd8da807 )**: Make class prop resolution faster ([#28766](facebook/react#28766)) //<Andrew Clark>// - **[cbb6f2b54](facebook/react@cbb6f2b54 )**: [Flight] Support Blobs from Server to Client ([#28755](facebook/react#28755)) //<Sebastian Markbåge>// - **[f33a6b69c](facebook/react@f33a6b69c )**: Track Owner for Server Components in DEV ([#28753](facebook/react#28753)) //<Sebastian Markbåge>// - **[e3ebcd54b](facebook/react@e3ebcd54b )**: Move string ref coercion to JSX runtime ([#28473](facebook/react#28473)) //<Andrew Clark>// - **[fd0da3eef](facebook/react@fd0da3eef )**: Remove _owner field from JSX elements in prod if string refs are disabled ([#28739](facebook/react#28739)) //<Sebastian Markbåge>// Changelog: [General][Changed] - React Native sync for revisions 48b4ecc...b5e5ce8 jest_e2e[run_all_tests] bypass-github-export-checks Reviewed By: kassens Differential Revision: D56251607 fbshipit-source-id: e16db2fa101fc7ed1e009158c76388206beabd5f
1 parent c0ea79d commit 57aa8b8

File tree

9 files changed

+217
-5
lines changed

9 files changed

+217
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @format
8+
* @flow strict
9+
*/
10+
11+
'use strict';
12+
13+
import type {ExtendedError} from './ExtendedError';
14+
15+
import {SyntheticError, handleException} from './ExceptionsManager';
16+
17+
type ErrorInfo = {
18+
+componentStack?: ?string,
19+
// $FlowFixMe[unclear-type] unknown props and state.
20+
+errorBoundary?: ?React$Component<any, any>,
21+
};
22+
23+
export function onUncaughtError(errorValue: mixed, errorInfo: ErrorInfo): void {
24+
let error;
25+
26+
// Typically, `errorValue` should be an error. However, other values such as
27+
// strings (or even null) are sometimes thrown.
28+
if (errorValue instanceof Error) {
29+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
30+
* this parameters */
31+
error = (errorValue: ExtendedError);
32+
} else if (typeof errorValue === 'string') {
33+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
34+
* this parameters */
35+
error = (new SyntheticError(errorValue): ExtendedError);
36+
} else {
37+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
38+
* this parameters */
39+
error = (new SyntheticError('Unspecified error'): ExtendedError);
40+
}
41+
try {
42+
// $FlowFixMe[incompatible-use] this is in try/catch.
43+
error.componentStack = errorInfo.componentStack;
44+
error.isComponentError = true;
45+
} catch {
46+
// Ignored.
47+
}
48+
49+
// Uncaught errors are fatal.
50+
handleException(error, true);
51+
}
52+
53+
export function onCaughtError(errorValue: mixed, errorInfo: ErrorInfo): void {
54+
let error;
55+
56+
// Typically, `errorValue` should be an error. However, other values such as
57+
// strings (or even null) are sometimes thrown.
58+
if (errorValue instanceof Error) {
59+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
60+
* this parameters */
61+
error = (errorValue: ExtendedError);
62+
} else if (typeof errorValue === 'string') {
63+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
64+
* this parameters */
65+
error = (new SyntheticError(errorValue): ExtendedError);
66+
} else {
67+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
68+
* this parameters */
69+
error = (new SyntheticError('Unspecified error'): ExtendedError);
70+
}
71+
try {
72+
// $FlowFixMe[incompatible-use] this is in try/catch.
73+
error.componentStack = errorInfo.componentStack;
74+
error.isComponentError = true;
75+
} catch {
76+
// Ignored.
77+
}
78+
79+
// Caught errors are not fatal.
80+
handleException(error, false);
81+
}
82+
83+
export function onRecoverableError(
84+
errorValue: mixed,
85+
errorInfo: ErrorInfo,
86+
): void {
87+
let error;
88+
89+
// Typically, `errorValue` should be an error. However, other values such as
90+
// strings (or even null) are sometimes thrown.
91+
if (errorValue instanceof Error) {
92+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
93+
* this parameters */
94+
error = (errorValue: ExtendedError);
95+
} else if (typeof errorValue === 'string') {
96+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
97+
* this parameters */
98+
error = (new SyntheticError(errorValue): ExtendedError);
99+
} else {
100+
/* $FlowFixMe[class-object-subtyping] added when improving typing for
101+
* this parameters */
102+
error = (new SyntheticError('Unspecified error'): ExtendedError);
103+
}
104+
try {
105+
// $FlowFixMe[incompatible-use] this is in try/catch.
106+
error.componentStack = errorInfo.componentStack;
107+
error.isComponentError = true;
108+
} catch {
109+
// Ignored.
110+
}
111+
112+
// Recoverable errors should only be warnings.
113+
// This will make it a soft error in LogBox.
114+
// TODO: improve the logging for recoverable errors in prod.
115+
console.warn(error);
116+
}

packages/react-native/Libraries/ReactNative/RendererImplementation.js

+20-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@ import type {HostComponent} from '../Renderer/shims/ReactNativeTypes';
1212
import type ReactFabricHostComponent from './ReactFabricPublicInstance/ReactFabricHostComponent';
1313
import type {Element, ElementRef, ElementType} from 'react';
1414

15+
import {
16+
onCaughtError,
17+
onRecoverableError,
18+
onUncaughtError,
19+
} from '../Core/ErrorHandlers';
1520
import {type RootTag} from './RootTag';
16-
1721
export function renderElement({
1822
element,
1923
rootTag,
@@ -31,9 +35,23 @@ export function renderElement({
3135
rootTag,
3236
null,
3337
useConcurrentRoot,
38+
{
39+
onCaughtError,
40+
onUncaughtError,
41+
onRecoverableError,
42+
},
3443
);
3544
} else {
36-
require('../Renderer/shims/ReactNative').render(element, rootTag);
45+
require('../Renderer/shims/ReactNative').render(
46+
element,
47+
rootTag,
48+
undefined,
49+
{
50+
onCaughtError,
51+
onUncaughtError,
52+
onRecoverableError,
53+
},
54+
);
3755
}
3856
}
3957

packages/react-native/Libraries/Renderer/shims/ReactFabric.js

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
* @flow
99
* @nolint
1010
* @generated SignedSource<<c1cc197c110e3a49a5e8f6bd5d32b23f>>
11+
* @generated SignedSource<<19f13c8d8dac82cd391ad408f5ad8893>>
12+
*
13+
* This file was sync'd from the facebook/react repository.
1114
*/
1215

1316
'use strict';

packages/react-native/Libraries/Renderer/shims/ReactFeatureFlags.js

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
* @flow strict-local
99
* @nolint
1010
* @generated SignedSource<<2881c8e89ef0f73f4cf6612cb518b197>>
11+
* @generated SignedSource<<f48352b25600c8534f28130f5256d937>>
12+
*
13+
* This file was sync'd from the facebook/react repository.
1114
*/
1215

1316
'use strict';

packages/react-native/Libraries/Renderer/shims/ReactNative.js

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
* @flow
99
* @nolint
1010
* @generated SignedSource<<0debd6e5a17dc037cb4661315a886de6>>
11+
* @generated SignedSource<<228cd610b28ff12c92264be0d9be9374>>
12+
*
13+
* This file was sync'd from the facebook/react repository.
1114
*/
1215

1316
'use strict';

packages/react-native/Libraries/Renderer/shims/ReactNativeTypes.js

+25-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
* @noformat
88
* @flow strict
99
* @nolint
10-
* @generated SignedSource<<b35184ab7e1e173fd34278def089e277>>
10+
* @generated SignedSource<<c41f61379973354629ee7bf55ba92541>>
11+
* @generated SignedSource<<39aa3fa373095c6b192fac24f5b6c30c>>
12+
*
13+
* This file was sync'd from the facebook/react repository.
1114
*/
1215

1316
import type {ElementRef, ElementType, Element, AbstractComponent} from 'react';
@@ -176,6 +179,25 @@ export type TouchedViewDataAtPoint = $ReadOnly<{
176179
...InspectorData,
177180
}>;
178181

182+
export type RenderRootOptions = {
183+
onUncaughtError?: (
184+
error: mixed,
185+
errorInfo: {+componentStack?: ?string},
186+
) => void,
187+
onCaughtError?: (
188+
error: mixed,
189+
errorInfo: {
190+
+componentStack?: ?string,
191+
// $FlowFixMe[unclear-type] unknown props and state.
192+
+errorBoundary?: ?React$Component<any, any>,
193+
},
194+
) => void,
195+
onRecoverableError?: (
196+
error: mixed,
197+
errorInfo: {+componentStack?: ?string},
198+
) => void,
199+
};
200+
179201
/**
180202
* Flat ReactNative renderer bundles are too big for Flow to parse efficiently.
181203
* Provide minimal Flow typing for the high-level RN API and call it a day.
@@ -204,6 +226,7 @@ export type ReactNativeType = {
204226
element: Element<ElementType>,
205227
containerTag: number,
206228
callback: ?() => void,
229+
options: ?RenderRootOptions,
207230
): ?ElementRef<ElementType>,
208231
unmountComponentAtNode(containerTag: number): void,
209232
unmountComponentAtNodeAndRemoveContainer(containerTag: number): void,
@@ -239,6 +262,7 @@ export type ReactFabricType = {
239262
containerTag: number,
240263
callback: ?() => void,
241264
concurrentRoot: ?boolean,
265+
options: ?RenderRootOptions,
242266
): ?ElementRef<ElementType>,
243267
unmountComponentAtNode(containerTag: number): void,
244268
getNodeFromInternalInstanceHandle(

packages/react-native/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
* @flow strict-local
99
* @nolint
1010
* @generated SignedSource<<73af5b3fe29d226634ed64bc861634df>>
11+
* @generated SignedSource<<b616e9e4f0bcab37292324fd9dd1b01d>>
12+
*
13+
* This file was sync'd from the facebook/react repository.
1114
*/
1215

1316
'use strict';

packages/react-native/Libraries/Renderer/shims/createReactNativeComponentClass.js

+3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
* @flow strict-local
99
* @nolint
1010
* @generated SignedSource<<ede54ac2fa1b9a09e234cdf098048989>>
11+
* @generated SignedSource<<c20bad591efa52fa416567851318b8ca>>
12+
*
13+
* This file was sync'd from the facebook/react repository.
1114
*/
1215

1316
'use strict';

packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap

+41-2
Original file line numberDiff line numberDiff line change
@@ -3889,6 +3889,26 @@ declare module.exports: symbolicateStackTrace;
38893889
"
38903890
`;
38913891

3892+
exports[`public API should not change unintentionally Libraries/Core/ErrorHandlers.js 1`] = `
3893+
"type ErrorInfo = {
3894+
+componentStack?: ?string,
3895+
+errorBoundary?: ?React$Component<any, any>,
3896+
};
3897+
declare export function onUncaughtError(
3898+
errorValue: mixed,
3899+
errorInfo: ErrorInfo
3900+
): void;
3901+
declare export function onCaughtError(
3902+
errorValue: mixed,
3903+
errorInfo: ErrorInfo
3904+
): void;
3905+
declare export function onRecoverableError(
3906+
errorValue: mixed,
3907+
errorInfo: ErrorInfo
3908+
): void;
3909+
"
3910+
`;
3911+
38923912
exports[`public API should not change unintentionally Libraries/Core/ExceptionsManager.js 1`] = `
38933913
"declare class SyntheticError extends Error {
38943914
name: string;
@@ -7121,6 +7141,23 @@ export type TouchedViewDataAtPoint = $ReadOnly<{
71217141
}>,
71227142
...InspectorData,
71237143
}>;
7144+
export type RenderRootOptions = {
7145+
onUncaughtError?: (
7146+
error: mixed,
7147+
errorInfo: { +componentStack?: ?string }
7148+
) => void,
7149+
onCaughtError?: (
7150+
error: mixed,
7151+
errorInfo: {
7152+
+componentStack?: ?string,
7153+
+errorBoundary?: ?React$Component<any, any>,
7154+
}
7155+
) => void,
7156+
onRecoverableError?: (
7157+
error: mixed,
7158+
errorInfo: { +componentStack?: ?string }
7159+
) => void,
7160+
};
71247161
export type ReactNativeType = {
71257162
findHostInstance_DEPRECATED<TElementType: ElementType>(
71267163
componentOrHandle: ?(ElementRef<TElementType> | number)
@@ -7144,7 +7181,8 @@ export type ReactNativeType = {
71447181
render(
71457182
element: Element<ElementType>,
71467183
containerTag: number,
7147-
callback: ?() => void
7184+
callback: ?() => void,
7185+
options: ?RenderRootOptions
71487186
): ?ElementRef<ElementType>,
71497187
unmountComponentAtNode(containerTag: number): void,
71507188
unmountComponentAtNodeAndRemoveContainer(containerTag: number): void,
@@ -7177,7 +7215,8 @@ export type ReactFabricType = {
71777215
element: Element<ElementType>,
71787216
containerTag: number,
71797217
callback: ?() => void,
7180-
concurrentRoot: ?boolean
7218+
concurrentRoot: ?boolean,
7219+
options: ?RenderRootOptions
71817220
): ?ElementRef<ElementType>,
71827221
unmountComponentAtNode(containerTag: number): void,
71837222
getNodeFromInternalInstanceHandle(

0 commit comments

Comments
 (0)