Skip to content

🤖 Bip Bop - Fusion Framework Release - #5227

Merged
odinr merged 1 commit into
mainfrom
changeset-release/main
Aug 10, 2026
Merged

🤖 Bip Bop - Fusion Framework Release#5227
odinr merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@equinor/fusion-framework-module-state@2.0.0

Major Changes

  • 46f53ca: Add a pull option to PouchDbSyncStorage for controlling how remote changes are pulled during sync, switch the default storage created by createDefaultStorage() to use it, and expose createDefaultStorage itself so callers can reuse it with custom overrides.

    Previously, PouchDbSyncStorage always used a single bidirectional db.sync() connection, meaning every client kept a live _changes longpoll open for both push and pull. At production user counts this is a large number of concurrently open connections for a direction (pull) that's rarely needed in real time.

    The new pull option lets push stay live (so local writes are never delayed) while pull is scheduled instead of continuous:

    new PouchDbSyncStorage({
      localDb,
      remoteDb,
      syncOptions,
      // Push stays live; pull runs once now, then every 60s, and again whenever the tab regains focus.
      pull: { mode: "interval", intervalMs: 60000, refreshOnFocus: true },
    });
    • mode: 'live' (default, unchanged): behaves exactly as before, via db.sync().
    • mode: 'interval': keeps push live via db.replicate.to, and replaces the live pull with one-shot db.replicate.from calls run on intervalMs (default 60000) and, unless refreshOnFocus: false, whenever the document becomes visible again - regardless of whether the tab is currently visible.
    • mode: 'visible-interval': the same as 'interval', except the timer tick is skipped entirely while the tab is hidden (via the Page Visibility API) - a backgrounded tab has no user waiting on fresh data, so there's no reason to hold a connection open or make a request for it.

    createDefaultStorage() now uses pull: { mode: 'visible-interval', refreshOnFocus: true } by default (a 60s intervalMs), so apps using the framework's default state storage no longer keep a continuous pull connection open per idle tab, and pause polling entirely while a tab is backgrounded.

    createDefaultStorage is now also exported from @equinor/fusion-framework-module-state/default-storage, so a caller who wants the framework's default remote-resolution behavior (service discovery, auth, the per-user CouchDB proxy) but with different pull scheduling can call it directly instead of reimplementing that resolution:

    import { createDefaultStorage } from "@equinor/fusion-framework-module-state/default-storage";
    
    config.setStorage((args) =>
      createDefaultStorage(appKey, args, { intervalMs: 10000 }),
    );

    Breaking change: the scheduled pull dispatches a new onStateSync.poll event, added to the
    exported StateSyncEventType/StateSyncEvent union. Consumers with an exhaustive switch/if
    chain over StateSyncEventType (e.g. a default: assertNever(event) branch) need a new case for
    StateSyncEvent.Poll/event.type === 'onStateSync.poll', or that check will fail to compile
    after upgrading:

    // Before: exhaustive over 4 members
    switch (event.type) {
      case "onStateSync.change":
        /* ... */ break;
      case "onStateSync.complete":
        /* ... */ break;
      case "onStateSync.error":
        /* ... */ break;
      case "onStateSync.status":
        /* ... */ break;
      default:
        assertNever(event);
    }
    
    // After: add the new member
    switch (event.type) {
      case "onStateSync.change":
        /* ... */ break;
      case "onStateSync.complete":
        /* ... */ break;
      case "onStateSync.error":
        /* ... */ break;
      case "onStateSync.status":
        /* ... */ break;
      case "onStateSync.poll":
        /* ... */ break;
      default:
        assertNever(event);
    }

    Consumers that switch over a narrower type, or that only inspect specific event kinds (e.g. via
    StateSyncEvent.Change.is(event)), are unaffected.

Patch Changes

  • 55c95fa: Internal: bump @types/uuid from ^10.0.0 to ^11.0.0. Type-only dependency, not re-exported from this package's public API — no consumer-facing impact.

@equinor/fusion-framework-dev-portal@10.0.0

Minor Changes

Patch Changes

  • Updated dependencies [c9d7bd4]
    • @equinor/fusion-framework-module-services@8.1.0
    • @equinor/fusion-framework@8.0.14
    • @equinor/fusion-framework-app@13.0.0

@equinor/fusion-framework-module-services@8.1.0

Minor Changes

  • c9d7bd4: Add AppStateApiClient for the Fusion App State API, exposed via a new ./app-state subpath export and ApiProvider.createAppStateClient().

    The client follows the same versioned method pattern as bookmarks/context/notification: every method takes an API version as its first argument (currently only 'v1' is supported).

    import { AppStateApiClient } from "@equinor/fusion-framework-module-services/app-state";
    import { HttpClient } from "@equinor/fusion-framework-module-http/client";
    
    const httpClient = new HttpClient("https://app-state-api.example.com/");
    const client = new AppStateApiClient(httpClient, "json");
    
    const apps = await client.listMyApps("v1");
    await client.wipeMyAppState("v1", { appKey: "my-app" });

    Supported operations: listMyApps, getMyAppState, wipeMyAppState, wipeAllMyState, listAppUsers, getUserAppState, wipeUserAppState, wipeAllAppUsersState.

@equinor/fusion-framework-app@13.0.0

Patch Changes

  • Updated dependencies [55c95fa]
  • Updated dependencies [46f53ca]
    • @equinor/fusion-framework-module-state@2.0.0
    • @equinor/fusion-framework@8.0.14

@equinor/fusion-framework-cli@15.2.5

Patch Changes

  • Updated dependencies [4d64a3e]
    • @equinor/fusion-framework-dev-portal@10.0.0

@equinor/fusion-framework@8.0.14

Patch Changes

  • Updated dependencies [c9d7bd4]
    • @equinor/fusion-framework-module-services@8.1.0

@equinor/fusion-framework-react-app@14.0.0

Patch Changes

  • Updated dependencies [55c95fa]
  • Updated dependencies [46f53ca]
    • @equinor/fusion-framework-module-state@2.0.0
    • @equinor/fusion-framework-app@13.0.0

@equinor/fusion-framework-cookbook-app-react-ag-grid@2.0.12

Patch Changes

  • @equinor/fusion-framework-react-app@14.0.0

@equinor/fusion-framework-cookbook-app-react-context@5.0.7

Patch Changes

  • @equinor/fusion-framework-react-app@14.0.0

@equinor/fusion-framework-cookbook-app-react-context-custom-error@5.0.7

Patch Changes

  • @equinor/fusion-framework-react-app@14.0.0

@equinor/fusion-framework-cookbook-app-react-feature-flag@2.0.6

Patch Changes

  • @equinor/fusion-framework-react-app@14.0.0

@equinor/fusion-framework-cookbook-app-react-state@1.0.1

Patch Changes

  • 55c95fa: Internal: bump @types/uuid from ^10.0.0 to ^11.0.0.
  • 46f53ca: SyncStatusIndicator now recognizes the onStateSync.poll event kind, and the cookbook's default (non-FUSION_SPA_COUCHDB_URL) storage now overrides pull.intervalMs to 10s via createDefaultStorage, so a scheduled pull is visible while previewing the cookbook instead of waiting on the framework's 60s production default.
  • fd873c7: Internal: migrate routing to the Fusion route DSL (layout/index/route from @equinor/fusion-framework-react-router/routes), matching the pattern demonstrated in the router cookbook. Also fix the sidebar active-link check to match sub-paths (e.g. /todos/*) instead of only the exact page path.
  • Updated dependencies [55c95fa]
  • Updated dependencies [46f53ca]
    • @equinor/fusion-framework-module-state@2.0.0
    • @equinor/fusion-framework-react-app@14.0.0

poc-portal@1.1.94

Patch Changes

  • @equinor/fusion-framework-cli@15.2.5
  • @equinor/fusion-framework@8.0.14
  • @equinor/fusion-framework-react-app@14.0.0

portal@0.1.79

Patch Changes

  • @equinor/fusion-framework-cli@15.2.5

portal-analytics@0.4.47

Patch Changes

  • @equinor/fusion-framework-cli@15.2.5
  • @equinor/fusion-framework@8.0.14
  • @equinor/fusion-framework-app@13.0.0
  • @equinor/fusion-framework-react-app@14.0.0

@github-actions
github-actions Bot requested a review from a team as a code owner August 7, 2026 09:29
@github-actions
github-actions Bot marked this pull request as draft August 7, 2026 09:29
@github-actions
github-actions Bot force-pushed the changeset-release/main branch 7 times, most recently from 518e2df to f29156c Compare August 10, 2026 07:48
@github-actions
github-actions Bot force-pushed the changeset-release/main branch from f29156c to 5e441bd Compare August 10, 2026 07:58
@odinr
odinr marked this pull request as ready for review August 10, 2026 07:59
@github-actions github-actions Bot added 👨🏻‍🍳 cookbooks 👾 React 💾 CLI fusion framework CLI 📚 documentation Improvements or additions to documentation 🧬 Modules labels Aug 10, 2026
@odinr
odinr merged commit d47ce7c into main Aug 10, 2026
8 of 9 checks passed
@odinr
odinr deleted the changeset-release/main branch August 10, 2026 08:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

💾 CLI fusion framework CLI 👨🏻‍🍳 cookbooks 📚 documentation Improvements or additions to documentation 🧬 Modules 👾 React

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant