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 release ships a brand-new reactive state management module with optional
CouchDB/PouchDB sync, a new context-navigation plugin that decouples URL routing
from the context module, and a batch of Dependabot security fixes across module-state and the CLI/dev-portal/dev-server build output.
@equinor/fusion-framework-module-state@1.0.0 introduces reactive state
management with built-in synchronization and a comprehensive event system.
PouchDbSyncStorage β bidirectional sync with a remote CouchDB, with
configurable heartbeat, retry, and timeout options.
Event system β StateEntryCreatedEvent / Updated / Deleted, plus StateSyncChangeEvent / CompleteEvent / ErrorEvent / StatusEvent,
dispatched through the app's event module so onStateSync.* listeners
registered via useAppModule('event').addEventListener(...) actually fire.
StateProvider β reactive, observable-backed state management with a
pluggable storage interface.
@equinor/fusion-framework-app@12.0.0 adds enableState (importable from ./enable-state) to wire the module into an app with app-scoped storage
key prefixing.
@equinor/fusion-framework-react-app@13.0.0 adds the consumer-facing hooks:
useAppState is a persistent, cross-component-synchronized drop-in for useState, backed by the module's storage. useStateSyncEvents returns the
most recent sync events (oldest first, bounded to limit).
The app-react-state cookbook was merged with app-react-state-replication
into one comprehensive example covering the full surface β basics, object/list
state, and optional CouchDB replication (unset FUSION_SPA_COUCHDB_URL and it
runs with zero Docker setup).
Note: all of the above require the optional peer dependency @equinor/fusion-framework-module-state.
π§ New: Context Navigation Plugin
@equinor/fusion-framework-plugin-context-navigation@0.1.0 is a new
adapter-based, event-driven plugin that reconciles context selection with the
browser URL for portal hosts. Ships with query-param, path-segment, and
custom-URL adapters, plus two pre-wired source strategies:
app-first β the app sets context, the plugin encodes it to the URL.
context-first β the plugin decodes context from the URL on startup,
redirecting to a configurable null-context URL when no context resolves.
@equinor/fusion-framework-module-context@8.0.2's resolveInitialContext no
longer resolves context from the URL path itself β that responsibility moved
to the plugin. Migration: apps don't need to change anything; portal hosts
should enable @equinor/fusion-framework-plugin-context-navigation to restore
URL-based context resolution.
@equinor/fusion-framework-dev-portal@9.0.0 now uses the plugin instead of an
ad-hoc hook-based approach.
@equinor/fusion-framework-module-navigation@7.0.7 fixes basename boundary
matching (/apps/my-app no longer false-matches /apps/my-app-other/foo) and
trailing-slash handling, and replaces regex-based pathname normalization with
an iterative scan β closing a CodeQL-flagged ReDoS (Regular Expression Denial
of Service) vulnerability when processing user-controlled basename values.
π Security & Dependency Maintenance
module-state: happy-dom18.0.1 β 20.8.9 β resolves Happy DOM VM
context escape/RCE, ECMAScriptModuleCompiler code injection, and
cross-origin cookie disclosure advisories (dev/test only).
module-state: vitest^2.0.5 β ^4.1.0 β resolves the Vitest UI server
arbitrary file read/execute advisory (< 3.2.6).
module-state: uuid^11.0.3 β ^11.1.1 β ^14.0.1 β resolves a
missing buffer bounds check advisory and aligns with the version used
elsewhere in the monorepo.
plugin-context-navigation: vitest^3.1.1 β ^4.1.10, matching the
monorepo-wide version.
cli / dev-portal / dev-server: bumped pnpm.overrides for undici
(< 7.29.0), brace-expansion (< 2.1.4), fast-uri (< 3.1.5), and postcss (<= 8.5.22) β these packages bundle their dependency tree via
rollup/vite, so transitive overrides are changesetted even when only the
root lockfile resolution moves.
module: pinned explicit generic types on the reduce operator in createModuleConfigs so the accumulator type isn't inferred as unknown
under TypeScript 7's stricter inference β this was breaking builds for
consumers using composite project references.
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.
Uh oh!
There was an error while loading. Please reload this page.
This release ships a brand-new reactive state management module with optional
CouchDB/PouchDB sync, a new context-navigation plugin that decouples URL routing
from the context module, and a batch of Dependabot security fixes across
module-stateand the CLI/dev-portal/dev-server build output.ποΈ New:
@equinor/fusion-framework-module-state@equinor/fusion-framework-module-state@1.0.0introduces reactive statemanagement with built-in synchronization and a comprehensive event system.
PouchDbSyncStorageβ bidirectional sync with a remote CouchDB, withconfigurable heartbeat, retry, and timeout options.
StateEntryCreatedEvent/Updated/Deleted, plusStateSyncChangeEvent/CompleteEvent/ErrorEvent/StatusEvent,dispatched through the app's
eventmodule soonStateSync.*listenersregistered via
useAppModule('event').addEventListener(...)actually fire.StateProviderβ reactive, observable-backed state management with apluggable storage interface.
@equinor/fusion-framework-app@12.0.0addsenableState(importable from./enable-state) to wire the module into an app with app-scoped storagekey prefixing.
@equinor/fusion-framework-react-app@13.0.0adds the consumer-facing hooks:useAppStateis a persistent, cross-component-synchronized drop-in foruseState, backed by the module's storage.useStateSyncEventsreturns themost recent sync events (oldest first, bounded to
limit).The
app-react-statecookbook was merged withapp-react-state-replicationinto one comprehensive example covering the full surface β basics, object/list
state, and optional CouchDB replication (unset
FUSION_SPA_COUCHDB_URLand itruns with zero Docker setup).
Note: all of the above require the optional peer dependency
@equinor/fusion-framework-module-state.π§ New: Context Navigation Plugin
@equinor/fusion-framework-plugin-context-navigation@0.1.0is a newadapter-based, event-driven plugin that reconciles context selection with the
browser URL for portal hosts. Ships with query-param, path-segment, and
custom-URL adapters, plus two pre-wired source strategies:
app-firstβ the app sets context, the plugin encodes it to the URL.context-firstβ the plugin decodes context from the URL on startup,redirecting to a configurable null-context URL when no context resolves.
@equinor/fusion-framework-module-context@8.0.2'sresolveInitialContextnolonger resolves context from the URL path itself β that responsibility moved
to the plugin. Migration: apps don't need to change anything; portal hosts
should enable
@equinor/fusion-framework-plugin-context-navigationto restoreURL-based context resolution.
@equinor/fusion-framework-dev-portal@9.0.0now uses the plugin instead of anad-hoc hook-based approach.
@equinor/fusion-framework-module-navigation@7.0.7fixes basename boundarymatching (
/apps/my-appno longer false-matches/apps/my-app-other/foo) andtrailing-slash handling, and replaces regex-based pathname normalization with
an iterative scan β closing a CodeQL-flagged ReDoS (Regular Expression Denial
of Service) vulnerability when processing user-controlled basename values.
π Security & Dependency Maintenance
module-state:happy-dom18.0.1β20.8.9β resolves Happy DOM VMcontext escape/RCE,
ECMAScriptModuleCompilercode injection, andcross-origin cookie disclosure advisories (dev/test only).
module-state:vitest^2.0.5β^4.1.0β resolves the Vitest UI serverarbitrary file read/execute advisory (
< 3.2.6).module-state:uuid^11.0.3β^11.1.1β^14.0.1β resolves amissing buffer bounds check advisory and aligns with the version used
elsewhere in the monorepo.
plugin-context-navigation:vitest^3.1.1β^4.1.10, matching themonorepo-wide version.
cli/dev-portal/dev-server: bumpedpnpm.overridesforundici(
< 7.29.0),brace-expansion(< 2.1.4),fast-uri(< 3.1.5), andpostcss(<= 8.5.22) β these packages bundle their dependency tree viarollup/vite, so transitive overrides are changesetted even when only the
root lockfile resolution moves.
module: pinned explicit generic types on thereduceoperator increateModuleConfigsso the accumulator type isn't inferred asunknownunder TypeScript 7's stricter inference β this was breaking builds for
consumers using composite project references.
π¦ Released Packages
π Key PRs
happy-domsecurity bump β #5215vitestbump (module-state) β #5217undici/brace-expansion/fast-uri/postcss/uuidoverrides β #5218vitestbump (context-navigation) β #5222uuidbump to 14 β #5223π€ Bip Bop β Release notes assembled by Fusion Assistant. Your state, now with
less hand-rolled sync code.
All reactions