Skip to content

Upgrading react-native 0.85 to 0.86

Breaking0.85.3 → 0.86.3Breaking1Security2Deprecated1New16Changed19Fixed83Other12

BreakingUpgrade verdict

1 breaking change and 2 security fixes.

  • 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.
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 ↗
Breaking1
Setting reportErrorsAsExceptions to anything other than false no longer does anything.
reportErrorsAsExceptions
Security2
Bumps fast-xml-parser from 4.5.0 to 4.5.4 to fix CVE-2026-25896.
fast-xml-parser
Bumps minimatch to fix CVE-2026-27903 and CVE-2026-27904.
minimatch
Deprecated1
Deprecates the second argument for the hook function passed to AppRegistry.setComponentProviderInstrumentationHook.
AppRegistry.setComponentProviderInstrumentationHook

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 }