Upgrading react-native 0.85 to 0.86
Breaking0.85.3 → 0.86.3Breaking1Security2Deprecated1New16Changed19Fixed83Other12
BreakingUpgrade verdict
1 breaking change and 2 security fixes.
In plain terms
- Setting reportErrorsAsExceptions to anything other than false no longer does anything.
- An underlying XML parsing library had a security flaw. It is updated to a safe version.
- A file-matching library used during builds had security flaws. It is updated to a fixed version.
- A rarely usable argument to a React Native instrumentation hook is deprecated and now warns if used.
Must act 4 items need code or config changes
react-native publishes an official migration guide for version 0.86. It covers more than the release notes do.
Upgrade Helper ↗What you must change
Breaking1
Setting reportErrorsAsExceptions to anything other than false no longer does anything.
reportErrorsAsExceptionsSecurity2
Bumps fast-xml-parser from 4.5.0 to 4.5.4 to fix CVE-2026-25896.
fast-xml-parserBumps minimatch to fix CVE-2026-27903 and CVE-2026-27904.
minimatchDeprecations to plan for
Deprecated1
Deprecates the second argument for the hook function passed to AppRegistry.setComponentProviderInstrumentationHook.
AppRegistry.setComponentProviderInstrumentationHookAPI changes
Generated by DepDelta from published .d.ts files. Not mixed with prose notes.
- added:
property PressableAndroidRippleConfig.alpha?: null | number | undefined
- changed:
property TextInputProps.autoComplete?: | 'additional-name' | 'address-line1' | 'address-line2' | 'birthdate-day' | 'birthdate-full' | 'birthdate-month' | 'birthdate-year' | 'cc-csc' | 'cc-exp' | 'cc-exp-day' | 'cc-exp-month' | 'cc-exp-year' | 'cc-number' | 'cc-name' | 'cc-given-name' | 'cc-middle-name' | 'cc-family-name' | 'cc-type' | 'country' | 'current-password' | 'email' | 'family-name' | 'ge… → property TextInputProps.autoComplete?: | '2fa-app-otp' | 'additional-name' | 'address-line1' | 'address-line2' | 'birthdate-day' | 'birthdate-full' | 'birthdate-month' | 'birthdate-year' | 'cc-csc' | 'cc-exp' | 'cc-exp-day' | 'cc-exp-month' | 'cc-exp-year' | 'cc-number' | 'cc-name' | 'cc-given-name' | 'cc-middle-name' | 'cc-family-name' | 'cc-type' | 'country' | 'current-password' | 'email' | 'em…
- added:
interface IPerformanceLogger - added:
method IPerformanceLogger.addTimespan(key: string, startTime: number, endTime: number, startExtras?: Extras, endExtras?: Extras): void - added:
method IPerformanceLogger.append(logger: IPerformanceLogger): void - added:
method IPerformanceLogger.clear(): void - added:
method IPerformanceLogger.clearCompleted(): void - added:
method IPerformanceLogger.close(): void - added:
method IPerformanceLogger.currentTimestamp(): number - added:
method IPerformanceLogger.getExtras(): { [key: string]: ExtraValue | null } - added:
method IPerformanceLogger.getPointExtras(): { [key: string]: Extras | null } - added:
method IPerformanceLogger.getPoints(): { [key: string]: number | null } - added:
method IPerformanceLogger.getTimespans(): { [key: string]: Timespan | null } - added:
method IPerformanceLogger.hasTimespan(key: string): boolean - added:
method IPerformanceLogger.isClosed(): boolean - added:
method IPerformanceLogger.logEverything(): void - added:
method IPerformanceLogger.markPoint(key: string, timestamp?: number, extras?: Extras): void - added:
method IPerformanceLogger.removeExtra(key: string): ExtraValue | null - added:
method IPerformanceLogger.setExtra(key: string, value: ExtraValue): void - added:
method IPerformanceLogger.startTimespan(key: string, timestamp?: number, extras?: Extras): void - added:
method IPerformanceLogger.stopTimespan(key: string, timestamp?: number, extras?: Extras): void - added:
type ExtraValue = number | string | boolean - added:
type Extras = { [key: string]: ExtraValue } - added:
type Timespan = { startTime: number; endTime?: number | undefined; totalTime?: number | undefined; startExtras?: Extras | undefined; endExtras?: Extras | undefined }
- changed:
type BackgroundSizeValue = { x: string | number; y: string | number } | 'cover' | 'contain' → type BackgroundSizeValue = { x: string | number; y: string | number }
- changed:
method BackHandlerStatic.addEventListener(eventName: BackPressEventName, handler: () => boolean | null | undefined): NativeEventSubscription → method BackHandlerStatic.addEventListener(eventName: BackPressEventName, handler: (event: HardwareBackPressEvent) => boolean | null | undefined): NativeEventSubscription - added:
interface HardwareBackPressEvent - added:
readonly property HardwareBackPressEvent.timeStamp: number - added:
readonly property HardwareBackPressEvent.type: string
- removed:
interface IPerformanceLogger - removed:
method IPerformanceLogger.addTimespan(key: string, startTime: number, endTime: number, startExtras?: Extras, endExtras?: Extras): void - removed:
method IPerformanceLogger.append(logger: IPerformanceLogger): void - removed:
method IPerformanceLogger.clear(): void - removed:
method IPerformanceLogger.clearCompleted(): void - removed:
method IPerformanceLogger.close(): void - removed:
method IPerformanceLogger.currentTimestamp(): number - removed:
method IPerformanceLogger.getExtras(): { [key: string]: ExtraValue | null } - removed:
method IPerformanceLogger.getPointExtras(): { [key: string]: Extras | null } - removed:
method IPerformanceLogger.getPoints(): { [key: string]: number | null } - removed:
method IPerformanceLogger.getTimespans(): { [key: string]: Timespan | null } - removed:
method IPerformanceLogger.hasTimespan(key: string): boolean - removed:
method IPerformanceLogger.isClosed(): boolean - removed:
method IPerformanceLogger.logEverything(): void - removed:
method IPerformanceLogger.markPoint(key: string, timestamp?: number, extras?: Extras): void - removed:
method IPerformanceLogger.removeExtra(key: string): ExtraValue | null - removed:
method IPerformanceLogger.setExtra(key: string, value: ExtraValue): void - removed:
method IPerformanceLogger.startTimespan(key: string, timestamp?: number, extras?: Extras): void - removed:
method IPerformanceLogger.stopTimespan(key: string, timestamp?: number, extras?: Extras): void - removed:
type ExtraValue = number | string | boolean - removed:
type Extras = { [key: string]: ExtraValue } - removed:
type Timespan = { startTime: number; endTime?: number | undefined; totalTime?: number | undefined; startExtras?: Extras | undefined; endExtras?: Extras | undefined }
- removed:
const $$LayoutConformance: (props: LayoutConformanceProps) => React.ReactNode - removed:
default $$LayoutConformance - removed:
type $$LayoutConformance = typeof $$LayoutConformance - added:
default LayoutConformance - added:
function LayoutConformance(props: LayoutConformanceProps): React.ReactNode
- changed:
type PressableAndroidRippleConfig = { color?: ColorValue; borderless?: boolean; radius?: number; foreground?: boolean } → type PressableAndroidRippleConfig = { color?: ColorValue; borderless?: boolean; radius?: number; foreground?: boolean; alpha?: number }
- changed:
static property TouchableNativeFeedback.Ripple: (color: string, borderless: boolean, rippleRadius?: null | undefined | number) => Readonly<{ borderless: boolean; color: number | undefined; rippleRadius: number | undefined; type: 'RippleAndroid' }> → static property TouchableNativeFeedback.Ripple: (color: ColorValue, borderless: boolean, rippleRadius?: null | undefined | number) => Readonly<{ borderless: boolean; color: ProcessedColorValue | undefined; rippleRadius: number | undefined; type: 'RippleAndroid' }>
- changed:
method XMLHttpRequest.setPerformanceLogger(performanceLogger: IPerformanceLogger): XMLHttpRequest → method XMLHttpRequest.setPerformanceLogger(performanceLogger: XHRPerformanceLogger): XMLHttpRequest
- changed:
type AppParameters = { initialProps: Readonly<{ [$$Key$$: string]: unknown }>; rootTag: RootTag; fabric?: boolean } → type AppParameters = { initialProps: Readonly<{ [$$Key$$: string]: unknown }>; rootTag: RootTag }
- added:
interface IPerformanceLogger - added:
method IPerformanceLogger.addTimespan(key: string, startTime: number, endTime: number, startExtras?: Extras, endExtras?: Extras): void - added:
method IPerformanceLogger.append(logger: IPerformanceLogger): void - added:
method IPerformanceLogger.clear(): void - added:
method IPerformanceLogger.clearCompleted(): void - added:
method IPerformanceLogger.close(): void - added:
method IPerformanceLogger.currentTimestamp(): number - added:
method IPerformanceLogger.getExtras(): Readonly<{ [key: string]: ExtraValue | undefined }> - added:
method IPerformanceLogger.getPointExtras(): Readonly<{ [key: string]: Extras | undefined }> - added:
method IPerformanceLogger.getPoints(): Readonly<{ [key: string]: number | undefined }> - added:
method IPerformanceLogger.getTimespans(): Readonly<{ [key: string]: Timespan | undefined }> - added:
method IPerformanceLogger.hasTimespan(key: string): boolean - added:
method IPerformanceLogger.isClosed(): boolean - added:
method IPerformanceLogger.logEverything(): void - added:
method IPerformanceLogger.markPoint(key: string, timestamp?: number, extras?: Extras): void - added:
method IPerformanceLogger.removeExtra(key: string): ExtraValue | undefined - added:
method IPerformanceLogger.setExtra(key: string, value: ExtraValue): void - added:
method IPerformanceLogger.startTimespan(key: string, timestamp?: number, extras?: Extras): void - added:
method IPerformanceLogger.stopTimespan(key: string, timestamp?: number, extras?: Extras): void - added:
type ExtraValue = number | string | boolean - added:
type Extras = { [key: string]: ExtraValue } - added:
type Timespan = { startTime: number; endTime?: number; totalTime?: number; startExtras?: Extras; endExtras?: Extras }
- removed:
const unmountComponentAtNodeAndRemoveContainer: (rootTag: RootTag) => void - removed:
const unstable_batchedUpdates: ReactNativeType['unstable_batchedUpdates'] - removed:
function dispatchCommand(handle: HostInstance, command: string, args: Array<unknown>): void - removed:
type unmountComponentAtNodeAndRemoveContainer = typeof unmountComponentAtNodeAndRemoveContainer - removed:
type unstable_batchedUpdates = typeof unstable_batchedUpdates - changed:
const findHostInstance_DEPRECATED: <TElementType extends React.ElementType>(componentOrHandle: null | undefined | (React.ComponentRef<TElementType> | number)) => null | undefined | HostInstance → const findHostInstance_DEPRECATED: typeof ReactFabric.findHostInstance_DEPRECATED - changed:
const findNodeHandle: <TElementType extends React.ElementType>(componentOrHandle: null | undefined | (React.ComponentRef<TElementType> | number)) => null | undefined | number → const findNodeHandle: typeof ReactFabric.findNodeHandle - changed:
const getNodeFromInternalInstanceHandle: ReactFabricType['getNodeFromInternalInstanceHandle'] → const getNodeFromInternalInstanceHandle: typeof ReactFabric.getNodeFromInternalInstanceHandle - changed:
const getPublicInstanceFromInternalInstanceHandle: ReactFabricType['getPublicInstanceFromInternalInstanceHandle'] → const getPublicInstanceFromInternalInstanceHandle: typeof ReactFabric.getPublicInstanceFromInternalInstanceHandle - changed:
const getPublicInstanceFromRootTag: ReactFabricType['getPublicInstanceFromRootTag'] → const getPublicInstanceFromRootTag: typeof ReactFabric.getPublicInstanceFromRootTag - changed:
const isChildPublicInstance: ReactNativeType['isChildPublicInstance'] → const isChildPublicInstance: typeof ReactFabric.isChildPublicInstance - changed:
const sendAccessibilityEvent: ReactNativeType['sendAccessibilityEvent'] → const sendAccessibilityEvent: typeof ReactFabric.sendAccessibilityEvent - changed:
function renderElement($$PARAM_0$$: { element: React.JSX.Element; rootTag: number; useFabric: boolean; useConcurrentRoot: boolean }): void → function renderElement($$PARAM_0$$: { element: React.JSX.Element; rootTag: RootTag }): void - added:
const dispatchCommand: typeof ReactFabric.dispatchCommand - added:
type dispatchCommand = typeof dispatchCommand
- removed:
const $$ReactNative: typeof ReactNative - removed:
default $$ReactNative - removed:
type $$ReactNative = typeof $$ReactNative
- removed:
type ReactNativeType = { findHostInstance_DEPRECATED<TElementType extends React.ElementType>(componentOrHandle: (React.ComponentRef<TElementType> | number) | undefined): PublicInstan…
- changed:
type BackgroundSizeValue = { x: string | number; y: string | number } | 'cover' | 'contain' → type BackgroundSizeValue = { x: string | number; y: string | number }
- added:
interface HardwareBackPressEvent - added:
readonly property HardwareBackPressEvent.timeStamp: number - added:
readonly property HardwareBackPressEvent.type: string
- removed:
interface IPerformanceLogger - removed:
method IPerformanceLogger.addTimespan(key: string, startTime: number, endTime: number, startExtras?: Extras, endExtras?: Extras): void - removed:
method IPerformanceLogger.append(logger: IPerformanceLogger): void - removed:
method IPerformanceLogger.clear(): void - removed:
method IPerformanceLogger.clearCompleted(): void - removed:
method IPerformanceLogger.close(): void - removed:
method IPerformanceLogger.currentTimestamp(): number - removed:
method IPerformanceLogger.getExtras(): Readonly<{ [key: string]: ExtraValue | undefined }> - removed:
method IPerformanceLogger.getPointExtras(): Readonly<{ [key: string]: Extras | undefined }> - removed:
method IPerformanceLogger.getPoints(): Readonly<{ [key: string]: number | undefined }> - removed:
method IPerformanceLogger.getTimespans(): Readonly<{ [key: string]: Timespan | undefined }> - removed:
method IPerformanceLogger.hasTimespan(key: string): boolean - removed:
method IPerformanceLogger.isClosed(): boolean - removed:
method IPerformanceLogger.logEverything(): void - removed:
method IPerformanceLogger.markPoint(key: string, timestamp?: number, extras?: Extras): void - removed:
method IPerformanceLogger.removeExtra(key: string): ExtraValue | undefined - removed:
method IPerformanceLogger.setExtra(key: string, value: ExtraValue): void - removed:
method IPerformanceLogger.startTimespan(key: string, timestamp?: number, extras?: Extras): void - removed:
method IPerformanceLogger.stopTimespan(key: string, timestamp?: number, extras?: Extras): void - removed:
type ExtraValue = number | string | boolean - removed:
type Extras = { [key: string]: ExtraValue } - removed:
type Timespan = { startTime: number; endTime?: number; totalTime?: number; startExtras?: Extras; endExtras?: Extras }
- removed:
const getCurrentTimestamp: () => number - removed:
default createPerformanceLogger - removed:
export { ExtraValue } - removed:
export { Extras } - removed:
export { IPerformanceLogger } - removed:
export { Timespan } - removed:
function createPerformanceLogger(): IPerformanceLogger - removed:
type getCurrentTimestamp = typeof getCurrentTimestamp
- removed:
export { unstable_batchedUpdates } from './Libraries/ReactNative/RendererProxy' - added:
export { DEFAULT_INITIAL_NUM_TO_RENDER as unstable_DEFAULT_INITIAL_NUM_TO_RENDER } from './src/private/components/virtualcollection/FlingConstants' - added:
export { Item as unstable_VirtualItem } from './src/private/components/virtualcollection/Virtual' - added:
export { VirtualArray as unstable_VirtualArray } from './src/private/components/virtualcollection/Virtual' - added:
export { VirtualCollection as unstable_VirtualCollection } from './src/private/components/virtualcollection/Virtual' - added:
export { VirtualCollectionGenerator as unstable_VirtualCollectionGenerator } from './src/private/components/virtualcollection/VirtualCollectionView' - added:
export { VirtualCollectionLayoutComponent as unstable_VirtualCollectionLayoutComponent } from './src/private/components/virtualcollection/VirtualCollectionView' - added:
export { VirtualCollectionViewComponent as unstable_VirtualCollectionViewComponent } from './src/private/components/virtualcollection/VirtualCollectionView' - added:
export { createVirtualCollectionView as unstable_createVirtualCollectionView } from './src/private/components/virtualcollection/VirtualCollectionView' - added:
export { default as unstable_VirtualColumn } from './src/private/components/virtualcollection/column/VirtualColumn' - added:
export { default as unstable_VirtualColumnGenerator } from './src/private/components/virtualcollection/column/VirtualColumnGenerator' - added:
export { default as unstable_VirtualRow } from './src/private/components/virtualcollection/row/VirtualRow' - added:
export { default as unstable_getScrollParent } from './src/private/components/virtualcollection/dom/getScrollParent' - added:
function unstable_batchedUpdates<T>(fn: (bookkeeping: T) => void, bookkeeping: T): void
- added:
const DEFAULT_INITIAL_NUM_TO_RENDER: 7 - added:
const FALLBACK_ESTIMATED_HEIGHT: number - added:
const FALLBACK_ESTIMATED_WIDTH: number - added:
const INITIAL_NUM_TO_RENDER: number - added:
type DEFAULT_INITIAL_NUM_TO_RENDER = typeof DEFAULT_INITIAL_NUM_TO_RENDER - added:
type FALLBACK_ESTIMATED_HEIGHT = typeof FALLBACK_ESTIMATED_HEIGHT - added:
type FALLBACK_ESTIMATED_WIDTH = typeof FALLBACK_ESTIMATED_WIDTH - added:
type INITIAL_NUM_TO_RENDER = typeof INITIAL_NUM_TO_RENDER
- added:
class VirtualArray<T extends Item> implements VirtualCollection<T> - added:
constructor VirtualArray(input: Readonly<ArrayLike<T>>) - added:
interface Item - added:
interface VirtualCollection<T extends Item> - added:
method VirtualCollection.at(index: number): T - added:
readonly property VirtualArray.at: (index: number) => T - added:
readonly property VirtualArray.size: number - added:
readonly property VirtualCollection.size: number
- added:
function createVirtualCollectionView<TLayoutProps extends {}>(VirtualLayout: VirtualCollectionLayoutComponent<TLayoutProps>, $$PARAM_1$$: VirtualCollectionGenerator): VirtualCollectionViewComponent<TLayoutProps> - added:
type VirtualCollectionGenerator = Readonly<{ initial: Readonly<{ itemCount: number; spacerStyle: (itemCount: number) => ViewStyleProp }>; next: (event: ModeChangeEvent) => { itemCount: number;… - added:
type VirtualCollectionLayoutComponent<TLayoutProps extends {}> = (props: Omit<TLayoutProps, keyof { children: ReadonlyArray<React.ReactNode>; spacer: React.ReactNode }> & { children: ReadonlyArray<React.ReactNode>; spacer: R… - added:
type VirtualCollectionViewComponent<TLayoutProps extends {}> = <TItem extends Item>(props: Omit<TLayoutProps, keyof { children: (item: TItem, key: string) => React.ReactNode; items: VirtualCollection<TItem>; itemToKey?: ($…
- added:
const $$VirtualColumn: <TItem extends Item>(props: { children: (item: TItem, key: string) => React.ReactNode; items: VirtualCollection<TItem>; itemToKey?: ($$PARAM_0$$: TItem) => str… - added:
default $$VirtualColumn - added:
type $$VirtualColumn = typeof $$VirtualColumn
- added:
const $$VirtualColumnGenerator: typeof VirtualColumnGenerator - added:
default $$VirtualColumnGenerator - added:
type $$VirtualColumnGenerator = typeof $$VirtualColumnGenerator
- added:
default getScrollParent - added:
function getScrollParent(node: ReactNativeElement): ReactNativeElement | null
- added:
const $$VirtualRow: <TItem extends Item>(props: { children: (item: TItem, key: string) => React.ReactNode; items: VirtualCollection<TItem>; itemToKey?: ($$PARAM_0$$: TItem) => str… - added:
default $$VirtualRow - added:
type $$VirtualRow = typeof $$VirtualRow
- removed:
property Event.COMPOSED_PATH_KEY: boolean - removed:
property Event.CURRENT_TARGET_KEY: EventTarget | null - removed:
property Event.EVENT_PHASE_KEY: boolean - removed:
property Event.IN_PASSIVE_LISTENER_FLAG_KEY: boolean - removed:
property Event.IS_TRUSTED_KEY: boolean - removed:
property Event.STOP_IMMEDIATE_PROPAGATION_FLAG_KEY: boolean - removed:
property Event.STOP_PROPAGATION_FLAG_KEY: boolean - removed:
property Event.TARGET_KEY: EventTarget | null
- removed:
method EventTarget.EVENT_TARGET_GET_THE_PARENT_KEY(): EventTarget | null - removed:
method EventTarget.INTERNAL_DISPATCH_METHOD_KEY(event: Event): void
- changed:
class ReadOnlyNode → class ReadOnlyNode extends ReadOnlyNodeBase - added:
type ReadOnlyNodeWithEventTarget = ReadOnlyNode & EventTarget
- added:
function getCurrentProps(node: ReadOnlyNode): { [$$Key$$: string]: unknown }