You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This branch is where we roll out React 19 support for Fusion Framework. It’s meant for application teams that are already on React 18 (or heading there soon) and want to kick the tyres on the next generation of the stack.
We’re aiming to ship the final React 19-compatible release in early 2026, so this preview is the best place to try things out and tell us what feels good (or not) before everything is locked in.
Warning
This is a preview on the next tag. Things can still move around – APIs, types, and behaviour may change before the final release. Treat it as a safe playground, not a long‑term production baseline (a fancy sandbox, not your production pillow 🧪).
Important
When testing this preview, install all @equinor/fusion-framework-* packages with the @next tag. Mixing @next and latest will give you type errors and subtle runtime bugs because the peer dependency ranges won’t line up.
Note
This work is part of Upgrade to React 19 (#3663) and related routing/navigation improvements. It’s built for apps running on React 18 or 19.
🚨 Breaking changes
React 19 & React 18+ requirement
Several React‑facing packages now target React 19 and require React 18 or 19 as peer dependencies:
TypeScript types may not fully resolve with React Router v7, requiring type assertions (as any) in some cases when using useRouter with RouterProvider. This is a known limitation and will be addressed in future updates.
New Features:
Added NavigationProvider and INavigationProvider exports
Improved history implementations with state management
React app bootstrap
@equinor/fusion-framework-react-app now requires React 18+ and uses React 18's createRoot API:
renderComponent and renderApp functions are no longer deprecated
These functions now use the createRoot API internally
Tip
Make sure you’re on React 18+ and then rely on renderApp/renderComponent instead of wiring ReactDOM.render yourself. The helpers now use createRoot for you, so you can delete some boilerplate and pretend it was always this clean ✨.
✨ New features
React Router DSL API
New package @equinor/fusion-framework-react-router provides a DSL on top of React Router v7 that plugs straight into Fusion.
Key features:
Feature
Description
Fusion Navigation Integration
Automatically connects to Fusion navigation module for history and basename management
File-based Route DSL
Uses declarative helpers (layout, index, route, prefix) to define routes in a type-safe, file-based style
Fusion Context Injection
Automatically injects Fusion modules and custom context into all route loaders, actions, and components via a typed fusion object
Lazy Loading
Supports automatic code splitting with lazy route loading using import.meta.resolve()
Route Schema Generation
Generates route schemas for documentation and app manifests
Vite Plugin Support
Optional Vite plugin for static analysis and optimized route tree generation
Backward compatibility: plain React Router objects still work
Important
The Router component accepts both the new DSL format and traditional React Router RouteObject[] arrays. Existing applications using navigation.createRouter() or plain React Router route objects can migrate incrementally.
You can pass standard React Router route objects directly to Router while migrating to the DSL:
import{Router}from'@equinor/fusion-framework-react-router';importtype{RouteObject}from'react-router';// Traditional React Router route objects still workconstroutes: RouteObject[]=[{path: '/',element: <RootLayout/>,children: [{index: true,element: <HomePage/>,},{path: 'products',element: <ProductsPage/>,loader: async({ fusion })=>{// Fusion context is automatically injectedconst{ http }=fusion.modules;returnhttp.fetch('/api/products');},},],},];exportdefaultfunctionAppRouter(){return<Routerroutes={routes}/>;}
// Example: Using fusion in a loaderexportasyncfunctionclientLoader({ fusion, params }){const{ http, context }=fusion.modules;constuser=fusion.context.user;returnhttp.fetch(`/api/products/${params.id}`);}// Example: Using fusion in a componentexportdefaultfunctionProductPage({ loaderData, fusion }){const{ http }=fusion.modules;// Component logic...}
Migration path:
Tip
New applications: Start with the DSL from day one
Existing applications: Continue using RouteObject[] arrays and migrate to DSL incrementally
Deprecated: NavigationProvider.createRouter() is deprecated but still works (emits telemetry warnings)
CLI enhancements
Raw Imports Support
@equinor/fusion-framework-cli now automatically includes the rawImportsPlugin in Vite configurations, enabling ?raw imports for markdown files:
importreadmeContentfrom'../../README.md?raw';
Serve Command
New app serve command to serve built applications with the dev-portal:
@equinor/fusion-framework-cookbook-app-react-styling: New cookbook demonstrating React 19 compatible version of @equinor/fusion-react-styles
Documentation
Added React Router module documentation page to vue-press
Improved Fusion React Router README with clearer quick start, route DSL overview, and examples
Testing
Added test suite for renderApp function in @equinor/fusion-framework-react-app using Vitest and React Testing Library
📝 Summary
This pre-release includes:
Major React 19 upgrade across multiple packages
New React Router DSL API package for modern route definitions
CLI enhancements with raw imports support and serve command
Multiple type exports for better TypeScript support and tree-shaking
Navigation module refactor with React Router v7
Cookbook migrations to demonstrate new routing patterns
✅ Quick upgrade checklist for existing apps
Upgrade React first: Move your app to react/react-dom^18.0.0 || ^19.0.0 and align @types/react across the workspace.
Stick to one tag: Upgrade all @equinor/fusion-framework-* dependencies to the same @next version – don’t mix latest and next (future you will thank you 💚).
Modernise your bootstrap: If you use @equinor/fusion-framework-react-app, make sure your entrypoint uses the renderApp/renderComponent helpers (now backed by createRoot).
Adopt the router integration: For apps with navigation + routing, prefer @equinor/fusion-framework-react-router’s Router + DSL helpers (layout, index, route, prefix) over hand‑rolled React Router wiring.
Plan navigation migration: If you rely on NavigationProvider.createRouter, keep it for now but treat it as legacy. New code should use the router package; migrate existing routes over time.
Compare with cookbooks: Use the updated cookbooks (app-react-bookmark-advanced, app-react-charts, app-react-people, app-react-styling) as working examples of recommended setup.
Install all Fusion Framework packages with the @next tag to prevent type mismatches. Do not mix @next and latest versions. All @equinor/fusion-framework-* packages must use the same tag (@next) to ensure type compatibility and prevent runtime errors.
# Upgrade all Fusion Framework packages to @next
pnpm upgrade -r @equinor/fusion-framework-*@next
# Or install specific packages
pnpm add @equinor/fusion-framework-react@next @equinor/fusion-framework-react-router@next
💬 Feedback
Tried the React 19 preview and have thoughts, ideas, or sharp edges to report? Please drop any feedback you have in this thread – everything from "it just worked 🎉" to "this API feels weird" is valuable.
If something’s on your mind while testing (confusing error, docs gap, migration friction, missing helper, etc.), write it down here rather than keeping it in your head. Even small comments help us shape the final release.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
Fusion Framework React 19 preview 🚀
Tag:
nextBranch:
react-19This branch is where we roll out React 19 support for Fusion Framework. It’s meant for application teams that are already on React 18 (or heading there soon) and want to kick the tyres on the next generation of the stack.
We’re aiming to ship the final React 19-compatible release in early 2026, so this preview is the best place to try things out and tell us what feels good (or not) before everything is locked in.
Warning
This is a preview on the
nexttag. Things can still move around – APIs, types, and behaviour may change before the final release. Treat it as a safe playground, not a long‑term production baseline (a fancy sandbox, not your production pillow 🧪).Important
When testing this preview, install all
@equinor/fusion-framework-*packages with the@nexttag. Mixing@nextandlatestwill give you type errors and subtle runtime bugs because the peer dependency ranges won’t line up.Note
This work is part of Upgrade to React 19 (#3663) and related routing/navigation improvements. It’s built for apps running on React 18 or 19.
🚨 Breaking changes
React 19 & React 18+ requirement
Several React‑facing packages now target React 19 and require React 18 or 19 as peer dependencies:
View all affected packages (14 packages)
@equinor/fusion-framework-react-app@equinor/fusion-framework-react@equinor/fusion-framework-react-router@equinor/fusion-framework-react-module@equinor/fusion-framework-react-module-http@equinor/fusion-framework-react-module-context@equinor/fusion-framework-react-module-event@equinor/fusion-framework-react-module-bookmark@equinor/fusion-framework-react-module-signalr@equinor/fusion-framework-react-components-bookmark@equinor/fusion-framework-react-components-people-provider@equinor/fusion-observable@equinor/fusion-query@equinor/fusion-framework-dev-portalImportant
Peer dependencies now require
reactandreact-domin the range^18.0.0 || ^19.0.0. React 16 and 17 are no longer supported for these packages.What this means in practice:
@nexttag and test against this preview.Navigation module refactor
@equinor/fusion-framework-module-navigationhas undergone a complete refactor with React Router v7 upgrade:Breaking Changes:
@remix-run/routerupgraded from v1.8.0 to v1.23.0as anyassertions in some cases (see warning below)NavigationConfiguratorandINavigationConfiguratorexported from separate interface filescreateHistorypathlib/create-history./typesto./lib/typesnavigatordeprecatedhistoryinsteadCaution
TypeScript types may not fully resolve with React Router v7, requiring type assertions (
as any) in some cases when usinguseRouterwithRouterProvider. This is a known limitation and will be addressed in future updates.New Features:
NavigationProviderandINavigationProviderexportsenableNavigationhelper functionNavigateEvent,NavigatedEvent)React app bootstrap
@equinor/fusion-framework-react-appnow requires React 18+ and uses React 18'screateRootAPI:renderComponentandrenderAppfunctions are no longer deprecatedcreateRootAPI internallyTip
Make sure you’re on React 18+ and then rely on
renderApp/renderComponentinstead of wiringReactDOM.renderyourself. The helpers now usecreateRootfor you, so you can delete some boilerplate and pretend it was always this clean ✨.✨ New features
React Router DSL API
New package
@equinor/fusion-framework-react-routerprovides a DSL on top of React Router v7 that plugs straight into Fusion.Key features:
layout,index,route,prefix) to define routes in a type-safe, file-based stylefusionobjectimport.meta.resolve()Using the DSL (recommended for new apps):
Backward compatibility: plain React Router objects still work
Important
The
Routercomponent accepts both the new DSL format and traditional React RouterRouteObject[]arrays. Existing applications usingnavigation.createRouter()or plain React Router route objects can migrate incrementally.You can pass standard React Router route objects directly to
Routerwhile migrating to the DSL:What gets injected:
fusion.modules(all Fusion modules),fusion.context(custom context)loaderData,actionData,fusionas propserror,fusionas propsMigration path:
Tip
New applications: Start with the DSL from day one
Existing applications: Continue using
RouteObject[]arrays and migrate to DSL incrementallyDeprecated:
NavigationProvider.createRouter()is deprecated but still works (emits telemetry warnings)CLI enhancements
Raw Imports Support
@equinor/fusion-framework-clinow automatically includes therawImportsPluginin Vite configurations, enabling?rawimports for markdown files:Serve Command
New
app servecommand to serve built applications with the dev-portal:Type exports
Observable
@equinor/fusion-observablenow exportsactionsvia a dedicated export path for better tree-shaking:React app
@equinor/fusion-framework-react-appnow exports theFusiontype:React module
@equinor/fusion-framework-react-modulenow exports the following types:ModulesModulesInstanceTypeAnyModuleModulesInstanceTelemetry
@equinor/fusion-framework-module-telemetrynow exports theTelemetryScopeenum:Import plugins
Markdown raw plugin
@equinor/fusion-importsnow exportscreateMarkdownRawPluginfor esbuild markdown?rawimport support:Import meta resolve plugin
@equinor/fusion-importsnow exportscreateImportMetaResolvePluginfor Vite plugin support:Vite plugin for raw imports
New package
@equinor/fusion-framework-vite-plugin-raw-importsfor handling?rawimports in library mode:Note
The plugin is automatically included when using
@equinor/fusion-framework-clifor building applications.Navigation module deprecation
@equinor/fusion-framework-module-navigationnow deprecatesNavigationProvider.createRoutermethod in favor of@equinor/fusion-framework-react-router.The
createRoutermethod now emits a deprecation warning via telemetry when called.Tip
Replace
navigation.createRouter(routes)with the React Router DSL from@equinor/fusion-framework-react-router/routes.📦 Package updates
Dev portal
react-router-domfrom v6 to v7.9.5 for React 19 compatibility (backward-compatible upgrade)Cookbooks
Multiple cookbooks have been migrated to use the new React Router DSL API:
@equinor/fusion-framework-cookbook-app-react-bookmark-advanced@equinor/fusion-framework-cookbook-app-react-charts@equinor/fusion-framework-cookbook-app-react-peopleNew cookbook
@equinor/fusion-framework-cookbook-app-react-styling: New cookbook demonstrating React 19 compatible version of@equinor/fusion-react-stylesDocumentation
Testing
renderAppfunction in@equinor/fusion-framework-react-appusing Vitest and React Testing Library📝 Summary
This pre-release includes:
✅ Quick upgrade checklist for existing apps
react/react-dom^18.0.0 || ^19.0.0and align@types/reactacross the workspace.@equinor/fusion-framework-*dependencies to the same@nextversion – don’t mixlatestandnext(future you will thank you 💚).@equinor/fusion-framework-react-app, make sure your entrypoint uses therenderApp/renderComponenthelpers (now backed bycreateRoot).@equinor/fusion-framework-react-router’sRouter+ DSL helpers (layout,index,route,prefix) over hand‑rolled React Router wiring.NavigationProvider.createRouter, keep it for now but treat it as legacy. New code should use the router package; migrate existing routes over time.app-react-bookmark-advanced,app-react-charts,app-react-people,app-react-styling) as working examples of recommended setup.🔗 Related Issues
Main/Parent Issue
Sub-issues
📦 Installation
This pre-release is published with the
nexttag.Warning
Install all Fusion Framework packages with the
@nexttag to prevent type mismatches. Do not mix@nextandlatestversions. All@equinor/fusion-framework-*packages must use the same tag (@next) to ensure type compatibility and prevent runtime errors.💬 Feedback
Tried the React 19 preview and have thoughts, ideas, or sharp edges to report? Please drop any feedback you have in this thread – everything from "it just worked 🎉" to "this API feels weird" is valuable.
If something’s on your mind while testing (confusing error, docs gap, migration friction, missing helper, etc.), write it down here rather than keeping it in your head. Even small comments help us shape the final release.
Beta Was this translation helpful? Give feedback.
All reactions