Developer
News and Updates
Get Support
Sign in
Get Support
Sign in
DOCUMENTATION
Cloud
Data Center
Resources
Sign in
Sign in
DOCUMENTATION
Cloud
Data Center
Resources
Sign in
Last updated May 28, 2026

Upgrade to React 19

From Jira 12.0, Confluence 11.0, Bitbucket 11.0, Bamboo 13.0, and Crowd 8.0, React is upgraded to v19. The com.atlassian.plugins:react web-resource plugin will provide React 19 instead of React 18.3.1. Continue to consume React from this web-resource — there is no need to bundle your own copy.

Changes in React 19

For the full list of new APIs, deprecations, and breaking changes, see the official React 19 Upgrade Guide.

The things most likely to break a P2 plugin:

  • Legacy APIs removed: ReactDOM.render, ReactDOM.unmountComponentAtNode, ReactDOM.findDOMNode, string refs, defaultProps on function components, legacy context, and propTypes from react. Use createRoot / root.unmount and standard ref callbacks instead.
  • Stricter typings — @types/react v19 ships breaking type changes.
  • Dependencies that don't yet support React 19 — most commonly older versions of @atlaskit/*, @compiled/react, react-transition-group, styled-components, enzyme, and similar React-dependent packages.

Migrating your plugin

  1. Run the official React 19 migration codemod to take care of the mechanical breaking-change rewrites (ReactDOM.rendercreateRoot, string refs, etc.):

    1
    2
    npx codemod@latest react/19/migration-recipe
    
  2. Run the official TypeScript codemod to fix up the new @types/react 19 typings:

    1
    2
    npx types-react-codemod@latest preset-19 .
    
  3. Run the check-react19-readiness scanner against your plugin to get a report of what the codemods couldn't fix automatically — including enzyme tests, legacy Storybook stories, and react-test-renderer usage that won't show up in production bundles.

  4. Resolve the issues the scanner reports. Migrate enzyme tests to @testing-library/react, update legacy Storybook stories/config, replace react-test-renderer, and remove any of the other removed/deprecated React APIs the scanner flagged in your own code.

  5. Upgrade any of your dependencies that rely on React to versions that support React 19 — for example @atlaskit/*, @compiled/react (use 0.21.1 or newer), react-transition-group, etc.

  6. Switch to the automatic (new) JSX transform if you're still on the classic one. It still compiles, but React 19 logs an outdated JSX transform warning at runtime.

  7. Update package.json to match the React the product now provides:

    • react^19.2.6
    • react-dom^19.2.6
    • @types/react^19.2.14
    • @types/react-dom^19.2.3

Troubleshooting

"jsxImportSource": "@compiled/react" breaks type inference

With React 19 and TypeScript 5+, the @compiled/react JSX import source breaks type inference.

Fix: upgrade @compiled/react to 0.21.1 or newer.

Property 'xxx' does not exist on type 'JSX.IntrinsicElements'

For example, custom elements like aui-spinner no longer type-check under the React 19 typings.

Fix: declare the custom elements you use in a JSX type shim (e.g. global.d.ts):

1
2
import 'react';

type CustomElement<Attrs extends string> = React.DetailedHTMLProps<
  React.HTMLAttributes<HTMLElement> & Partial<Record<Attrs, string>>,
  HTMLElement
>;

declare module 'react' {
  namespace JSX {
    interface IntrinsicElements {
      'aui-spinner': CustomElement<'size'>;
    }
  }
}

react-transition-group reports a missing React.findDOMNode method

findDOMNode was removed in React 19. Older react-transition-group versions still call it.

Fix: upgrade react-transition-group to ^4.4.5. See react-transition-group#918.

Further reading

Rate this page: