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.
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:
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.@types/react v19 ships breaking type changes.@atlaskit/*, @compiled/react, react-transition-group, styled-components, enzyme, and similar React-dependent packages.Run the official React 19 migration codemod to take care of the mechanical breaking-change rewrites (ReactDOM.render → createRoot, string refs, etc.):
1 2npx codemod@latest react/19/migration-recipe
Run the official TypeScript codemod to fix up the new @types/react 19 typings:
1 2npx types-react-codemod@latest preset-19 .
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.
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.
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.
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.
tsconfig.json): set "jsx": "react-jsx" (or "react-jsxdev" for dev builds). See the TypeScript --jsx reference.@babel/preset-react (or @babel/plugin-transform-react-jsx) with "runtime": "automatic". See the @babel/plugin-transform-react-jsx docs.Update package.json to match the React the product now provides:
react → ^19.2.6react-dom → ^19.2.6@types/react → ^19.2.14@types/react-dom → ^19.2.3"jsxImportSource": "@compiled/react" breaks type inferenceWith 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 2import '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 methodfindDOMNode 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.
Rate this page: