Skip to content

Bump the npm_and_yarn group across 1 directory with 8 updates - #5034

Open
dependabot[bot] wants to merge 2 commits into
mainfrom
dependabot/npm_and_yarn/ui/app/npm_and_yarn-d6946588d8
Open

Bump the npm_and_yarn group across 1 directory with 8 updates#5034
dependabot[bot] wants to merge 2 commits into
mainfrom
dependabot/npm_and_yarn/ui/app/npm_and_yarn-d6946588d8

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 10, 2026

Copy link
Copy Markdown
Contributor

Bumps the npm_and_yarn group with 7 updates in the /ui/app directory:

Package From To
react-router-dom 6.30.4 7.0.0
brace-expansion 1.1.14 1.1.18
fast-uri 3.1.2 3.1.5
immutable 5.1.5 5.1.9
js-yaml 4.3.0 4.3.1
nanoid 3.3.12 3.3.18
postcss 8.5.15 8.5.26

Updates react-router-dom from 6.30.4 to 7.0.0

Changelog

Sourced from react-router-dom's changelog.

7.0.0

Major Changes

  • Remove the original defer implementation in favor of using raw promises via single fetch and turbo-stream. This removes these exports from React Router: (#11744)

    • defer
    • AbortedDeferredError
    • type TypedDeferredData
    • UNSAFE_DeferredData
    • UNSAFE_DEFERRED_SYMBOL,
  • Use createRemixRouter/RouterProvider in entry.client instead of RemixBrowser (#11469)

  • Remove single_fetch future flag. (#11522)

  • Remove future.v7_startTransition flag (#11696)

  • Remove future.v7_normalizeFormMethod future flag (#11697)

  • Allow returning undefined from actions and loaders (#11680)

  • update minimum node version to 18 (#11690)

  • Remove future.v7_prependBasename from the ionternalized @remix-run/router package (#11726)

  • Remove future.v7_throwAbortReason from internalized @remix-run/router package (#11728)

  • Add exports field to all packages (#11675)

  • node package no longer re-exports from react-router (#11702)

  • updates the minimum React version to 18 (#11689)

    • Remove the future.v7_partialHydration flag (#11725)
      • This also removes the <RouterProvider fallbackElement> prop
        • To migrate, move the fallbackElement to a hydrateFallbackElement/HydrateFallback on your root route
      • Also worth nothing there is a related breaking changer with this future flag:
        • Without future.v7_partialHydration (when using fallbackElement), state.navigation was populated during the initial load
        • With future.v7_partialHydration, state.navigation remains in an "idle" state during the initial load
  • Remove future.v7_fetcherPersist flag (#11731)

Minor Changes

  • Add prefetching support to Link/NavLink when using Remix SSR (#11402)
  • Enhance ScrollRestoration so it can restore properly on an SSR'd document load (#11401)
  • Add built-in Remix-style hydration support to RouterProvider. When running from a Remix-SSR'd HTML payload with the proper window variables (__remixContext, __remixManifest, __remixRouteModules), you don't need to pass a router prop and RouterProvider will create the router for you internally. (#11396) (#11400)

Patch Changes

... (truncated)

Commits
Attestation changes

This version has no provenance attestation, while the previous version (6.30.4) was attested. Review the package versions before updating.


Updates brace-expansion from 1.1.14 to 1.1.18

Release notes

Sourced from brace-expansion's releases.

v1.1.15

  • Backport v5.0.6 change to v1 (#111) 0b09384

juliangruber/brace-expansion@v1.1.14...v1.1.15

Commits

Updates fast-uri from 3.1.2 to 3.1.5

Release notes

Sourced from fast-uri's releases.

v3.1.5

⚠️ Security Warning

Fix for GHSA-7p8r-x3mc-p8w7

Full Changelog: fastify/fast-uri@v3.1.4...v3.1.5

v3.1.4

⚠️ Security Release

Fix for GHSA-v2hh-gcrm-f6hx

Full Changelog: fastify/fast-uri@v3.1.3...v3.1.4

v3.1.3

⚠️ Security Release

Full Changelog: fastify/fast-uri@v3.1.2...v3.1.3

Commits

Updates immutable from 5.1.5 to 5.1.9

Release notes

Sourced from immutable's releases.

v5.1.9

What's Changed

Full Changelog: immutable-js/immutable-js@v5.1.8...v5.1.9

v5.1.8

What's Changed

Full Changelog: immutable-js/immutable-js@v5.1.7...v5.1.8

v5.1.7

What's Changed

internal

New Contributors

Full Changelog: immutable-js/immutable-js@v5.1.6...v5.1.7

v5.1.6

What's Changed

... (truncated)

Changelog

Sourced from immutable's changelog.

5.1.9

  • fix(List): a List grown past 32 elements while all its values are undefined no longer reads those values back as null (affected get, iteration, toArray, equals and hashCode)

5.1.8

4.3.9

5.1.7

  • fix(Repeat): lastIndexOf returned size instead of size - 1 by @​chatman-media in immutable-js/immutable-js#2227. Fixes CVE CVE-2026-29063
  • fix(IndexedCollection): has(index) on a lazy Seq of unknown size now checks index existence instead of searching for a value equal to the index #2203
  • [TypeScript]: reduce/reduceRight without an initial value now infer the result type from the collection's values when the reducer returns a value (e.g. list.reduce((a, b) => a + b) infers number), matching Array#reduce. Previously an explicit type argument was required. #2205

5.1.6

  • fix(reverseFactory): read reversedSequence.size in __iterator instead of this #2196
Commits
  • 329f7a6 5.1.9
  • 21fabd9 changelog
  • 009164f Merge pull request #2235 from immutable-js/fix/avoid-null-when-setsize33
  • 5b65bfb fix(List): preserve undefined values when grown past 32 elements
  • 50bf39e Update CHANGELOG.md for versions 5.1.8 and 4.3.9
  • 6496539 5.1.8
  • 808a83a Merge commit from fork
  • e51d49f perf(Map): index large hash-collision buckets for faster lookups
  • 25c58b0 fix typescript in tests
  • a1a1ee4 Merge commit from fork
  • Additional commits viewable in compare view

Updates js-yaml from 4.3.0 to 4.3.1

Changelog

Sourced from js-yaml's changelog.

4.3.1 - 2026-07-31

Security

  • [backport] Remove quadratic complexity from !!omap duplicate key detection.
Commits

Updates nanoid from 3.3.12 to 3.3.18

Release notes

Sourced from nanoid's releases.

3.3.18

3.3.17

  • Fixed infinite loop on zero size.

3.3.16

3.3.15

  • Fixed npm provenance error.

3.3.14

  • Fixed random pool corruption on big ID sizes.

3.3.13

  • Reduced npm package size.
Changelog

Sourced from nanoid's changelog.

3.3.18

3.3.17

  • Fixed infinite loop on zero size.

3.3.16

3.3.15

  • Fixed npm provenance error.

3.3.14

  • Fixed random pool corruption on big ID sizes.

3.3.13

  • Reduced npm package size.
Commits
Maintainer changes

This version was pushed to npm by GitHub Actions, a new releaser for nanoid since your current version.


Updates postcss from 8.5.15 to 8.5.26

Release notes

Sourced from postcss's releases.

8.5.26

  • Fixed list.split() regression (by @​lazerg).
  • Track symlinks in path protection in source map loading (by @​drengir1).

8.5.25

  • Fixed 8.5.17 visitor regression.
  • Fixed list.split() for non-string values (by @​amir-rezaei).

8.5.24

  • Preserve the BOM after the processing (by @​hdimer).

8.5.23

  • Do not load source map without opts.from for security reasons.

8.5.22

8.5.21

8.5.20

8.5.19

  • Fixed cleaning before for new nodes inserted to Root (by @​MahinAnowar).

8.5.18

  • Restricted loading previous source maps file to the opts.from folder for security reasons (use unsafeMap: true to disable the check).

8.5.17

  • Fixed Maximum call stack size exceeded error.
  • Fixed Prototype hijacking for postcss.fromJSON().
  • Fixed Input#origin() for unmapped end position (by @​chatman-media).

8.5.16

Changelog

Sourced from postcss's changelog.

8.5.26

  • Fixed list.split() regression (by @​lazerg).
  • Track symlinks in path protection in source map loading (by @​drengir1).

8.5.25

  • Fixed 8.5.17 visitor regression.
  • Fixed list.split() for non-string values (by @​amir-rezaei).

8.5.24

  • Preserve the BOM after the processing (by @​hdimer).

8.5.23

  • Do not load source map without opts.from for security reasons.

8.5.22

8.5.21

8.5.20

8.5.19

  • Fixed cleaning before for new nodes inserted to Root (by @​MahinAnowar).

8.5.18

  • Restricted loading previous source maps file to the opts.from folder for security reasons (use unsafeMap: true to disable the check).

8.5.17

  • Fixed Maximum call stack size exceeded error.
  • Fixed Prototype hijacking for postcss.fromJSON().
  • Fixed Input#origin() for unmapped end position (by @​chatman-media).

8.5.16

... (truncated)

Commits
Maintainer changes

This version was pushed to npm by GitHub Actions, a new releaser for postcss since your current version.


Updates react-router from 6.30.4 to 7.0.0

Release notes

Sourced from react-router's releases.

v7.0.0

See the changelog for release notes: https://github.com/remix-run/react-router/blob/main/CHANGELOG.md#v700

Changelog

Sourced from react-router's changelog.

7.0.0

Major Changes

  • Remove the original defer implementation in favor of using raw promises via single fetch and turbo-stream. This removes these exports from React Router: (#11744)

    • defer
    • AbortedDeferredError
    • type TypedDeferredData
    • UNSAFE_DeferredData
    • UNSAFE_DEFERRED_SYMBOL,
    • Collapse @remix-run/router into react-router (#11505)
    • Collapse react-router-dom into react-router
    • Collapse @remix-run/server-runtime into react-router
    • Collapse @remix-run/testing into react-router
  • Remove single fetch future flag. (#11522)

  • Drop support for Node 16, React Router SSR now requires Node 18 or higher (#11391)

  • Remove future.v7_startTransition flag (#11696)

    • Expose the underlying router promises from the following APIs for compsition in React 19 APIs: (#11521)
      • useNavigate()
      • useSubmit
      • useFetcher().load
      • useFetcher().submit
      • useRevalidator.revalidate
  • Remove future.v7_normalizeFormMethod future flag (#11697)

  • For Remix consumers migrating to React Router, the crypto global from the Web Crypto API is now required when using cookie and session APIs. This means that the following APIs are provided from react-router rather than platform-specific packages: (#11837)

    • createCookie
    • createCookieSessionStorage
    • createMemorySessionStorage
    • createSessionStorage

    For consumers running older versions of Node, the installGlobals function from @remix-run/node has been updated to define globalThis.crypto, using Node's require('node:crypto').webcrypto implementation.

    Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:

    • createCookieFactory
    • createSessionStorageFactory
    • createCookieSessionStorageFactory
    • createMemorySessionStorageFactory
  • Imports/Exports cleanup (#11840)

    • Removed the following exports that were previously public API from @remix-run/router
      • types
        • AgnosticDataIndexRouteObject
        • AgnosticDataNonIndexRouteObject

... (truncated)

Commits
Attestation changes

This version has no provenance attestation, while the previous version (6.30.4) was attested. Review the package versions before updating.


Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore <dependency name> major version will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
  • @dependabot ignore <dependency name> minor version will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
  • @dependabot ignore <dependency name> will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
  • @dependabot unignore <dependency name> will remove all of the ignore conditions of the specified dependency
  • @dependabot unignore <dependency name> <ignore condition> will remove the ignore condition of the specified dependency and ignore conditions
    You can disable automated security fix PRs for this repo from the Security Alerts page.

Bumps the npm_and_yarn group with 7 updates in the /ui/app directory:

| Package | From | To |
| --- | --- | --- |
| [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) | `6.30.4` | `7.0.0` |
| [brace-expansion](https://github.com/juliangruber/brace-expansion) | `1.1.14` | `1.1.18` |
| [fast-uri](https://github.com/fastify/fast-uri) | `3.1.2` | `3.1.5` |
| [immutable](https://github.com/immutable-js/immutable-js) | `5.1.5` | `5.1.9` |
| [js-yaml](https://github.com/nodeca/js-yaml) | `4.3.0` | `4.3.1` |
| [nanoid](https://github.com/ai/nanoid) | `3.3.12` | `3.3.18` |
| [postcss](https://github.com/postcss/postcss) | `8.5.15` | `8.5.26` |



Updates `react-router-dom` from 6.30.4 to 7.0.0
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/react-router-dom@7.0.0/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@7.0.0/packages/react-router-dom)

Updates `brace-expansion` from 1.1.14 to 1.1.18
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](juliangruber/brace-expansion@v1.1.14...v1.1.18)

Updates `fast-uri` from 3.1.2 to 3.1.5
- [Release notes](https://github.com/fastify/fast-uri/releases)
- [Commits](fastify/fast-uri@v3.1.2...v3.1.5)

Updates `immutable` from 5.1.5 to 5.1.9
- [Release notes](https://github.com/immutable-js/immutable-js/releases)
- [Changelog](https://github.com/immutable-js/immutable-js/blob/main/CHANGELOG.md)
- [Commits](immutable-js/immutable-js@v5.1.5...v5.1.9)

Updates `js-yaml` from 4.3.0 to 4.3.1
- [Changelog](https://github.com/nodeca/js-yaml/blob/4.3.1/CHANGELOG.md)
- [Commits](nodeca/js-yaml@4.3.0...4.3.1)

Updates `nanoid` from 3.3.12 to 3.3.18
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/3.3.18/CHANGELOG.md)
- [Commits](ai/nanoid@3.3.12...3.3.18)

Updates `postcss` from 8.5.15 to 8.5.26
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](postcss/postcss@8.5.15...8.5.26)

Updates `react-router` from 6.30.4 to 7.0.0
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/react-router@7.0.0/packages/react-router)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-version: 7.0.0
  dependency-type: direct:production
  dependency-group: npm_and_yarn
- dependency-name: brace-expansion
  dependency-version: 1.1.18
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: fast-uri
  dependency-version: 3.1.5
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: immutable
  dependency-version: 5.1.9
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: js-yaml
  dependency-version: 4.3.1
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: nanoid
  dependency-version: 3.3.18
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: postcss
  dependency-version: 8.5.26
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: react-router
  dependency-version: 7.0.0
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Aug 10, 2026
@dependabot
dependabot Bot requested a review from a team as a code owner August 10, 2026 14:26
Copilot AI balanced review requested due to automatic review settings August 10, 2026 14:26
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Aug 10, 2026
@github-actions github-actions Bot added the external PR from an external contributor label Aug 10, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot could not run the full agentic suite for this review because it was automatically requested on a bot-authored pull request. Request a review from Copilot under Reviewers to retry with the full agentic suite. Improved support for bot-authored pull requests is coming soon.

Updates the UI app’s routing dependency to a new major version of react-router-dom.

Changes:

  • Bumped react-router-dom from 6.30.4 to 7.0.0
Files not reviewed (1)
  • ui/app/package-lock.json: Generated file

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread ui/app/package.json
"react-markdown": "^8.0.3",
"react-redux": "^8.0.4",
"react-router-dom": "6.30.4",
"react-router-dom": "7.0.0",
Comment thread ui/app/package.json
"react-markdown": "^8.0.3",
"react-redux": "^8.0.4",
"react-router-dom": "6.30.4",
"react-router-dom": "7.0.0",
@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown

Unit Test Results

241 tests   241 ✅  27s ⏱️
 27 suites    0 💤
  1 files      0 ❌

Results for commit e9f754f.

♻️ This comment has been updated with latest results.

Copilot AI review requested due to automatic review settings August 12, 2026 10:23

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 1 out of 2 changed files in this pull request and generated no new comments.

Files not reviewed (1)
  • ui/app/package-lock.json: Generated file
Suppressed comments (2)

ui/app/package.json:25

  • This major UI dependency change leaves the UI component version at 0.8.31 and has no changelog entry. Bump the UI version according to semantic versioning and document this significant dependency/migration change in CHANGELOG.md so releases include it.
    "react-router-dom": "7.0.0",

ui/app/package.json:25

  • React Router 7 enables the v7 relative-splat behavior, but the UI still relies on the v6 behavior inside routes such as requests/* and users/*. For example, AirlockNewRequest and WorkspaceUsersAssignNew close with navigate("../"); under v7 this resolves against the current splat and can remain on the panel URL, while Airlock can append navigate("new") to an existing request ID. Migrate these splat routes to the v7 parent/child route structure or use explicit parent targets, and cover the affected open/close navigation flows before taking this major upgrade.
    "react-router-dom": "7.0.0",

@maxmartin-cgi

Copy link
Copy Markdown
Collaborator

/test-extended

@github-actions

Copy link
Copy Markdown

🤖 pr-bot 🤖

⚠️ When using /test-extended on external PRs, the SHA of the checked commit must be specified

(in response to this comment from maxmartin-cgi)

@maxmartin-cgi

Copy link
Copy Markdown
Collaborator

/test-extended e9f754f

@github-actions

Copy link
Copy Markdown

🤖 pr-bot 🤖

🏃 Running extended tests: https://github.com/microsoft/AzureTRE/actions/runs/31588032638 (with refid 9a03c73d)

(in response to this comment from maxmartin-cgi)

@marrobi

Copy link
Copy Markdown
Member

maxmartin-cgi as this is UI changes, e2e extended won't test other than it builds.

Looks like React 7 upgrade needs to stuff fixing, wonder if is a patch version.

@maxmartin-cgi

Copy link
Copy Markdown
Collaborator

Marcus Robinson (@marrobi) Alright I'll put a pin in this and look at getting it tested properly

@maxmartin-cgi

Copy link
Copy Markdown
Collaborator

Courtesy of @rudolphjacksonm/claude:

PR #5034 Dependency Upgrade Assessment

Pull request: microsoft/AzureTRE#5034
Reviewed head: e9f754fb982c9aedf3aeac01784c9ae655706cf2
Assessment: Do not merge in its current form.

Executive summary

The ordinary patch-level transitive updates in this pull request appear safe and require no AzureTRE application changes. The material concern is the direct upgrade of react-router-dom from 6.30.4 to 7.0.0.

The upgrade should not be merged as currently proposed because:

  1. 7.0.0 is an outdated initial v7 release covered by several subsequently published security-advisory ranges.
  2. React Router 7 permanently enables the routing behavior previously gated by future.v7_relativeSplatPath.
  3. AzureTRE uses relative navigate() calls within several multi-segment splat (*) routes.
  4. The current application compiles and all existing unit tests pass, but those tests do not verify the resulting browser locations for the affected flows.

The recommended approach is to test and correct v7 routing behavior deliberately, then upgrade to a currently patched v7 release rather than 7.0.0.


1. Pull request scope

Only two files change:

There are no application-source or test changes.

Direct dependency change

Package Before After Assessment
react-router-dom 6.30.4 7.0.0 Must revise before merge

Resolved lockfile changes

Package Before After Assessment
react-router 6.30.4 7.0.0 Follows react-router-dom; revise together
brace-expansion 1.1.14 1.1.18 Safe patch; no code changes
brace-expansion 2.1.0 2.1.4 Safe patch; no code changes
fast-uri 3.1.2 3.1.5 Safe security/correctness patch
immutable 5.1.5 5.1.9 Safe corrective patch
js-yaml 4.3.0 4.3.1 Safe patch; no code changes
nanoid 3.3.12 3.3.18 Safe corrective patch
postcss 8.5.15 8.5.26 Keep; validate the production CSS build

The React Router upgrade also removes @remix-run/router and adds:

  • @types/cookie
  • cookie
  • set-cookie-parser
  • turbo-stream

These are consequences of React Router's package consolidation, not independent application migrations.


2. React Router 6.30.4 to 7.x

Compatibility summary

Area Result
Existing imports Compatible
React version Compatible
Node version Compatible in the checked CI workflow
Data-router migration Not required
React Router framework mode Not required
Splat-route relative navigation Behavioral migration required
Tests for the changed behavior Missing
Exact target version 7.0.0 Should not be used

Existing APIs remain source-compatible

AzureTRE uses conventional declarative-router APIs such as:

  • BrowserRouter
  • Routes
  • Route
  • Link
  • useNavigate
  • useLocation
  • useParams

Representative locations include:

React Router 7 retains react-router-dom as a compatibility re-export. Moving imports from react-router-dom to react-router is optional cleanup, not a prerequisite.

No uses were found of migration-sensitive or removed APIs such as:

  • Switch
  • React Router Redirect
  • useHistory
  • Prompt
  • defer
  • React Router's json
  • loaders/actions
  • createBrowserRouter
  • RouterProvider
  • useFetcher
  • useSubmit

A broad API rewrite is therefore not required.

Runtime prerequisites

React Router 7 requires:

  • Node >=20
  • React >=18
  • React DOM >=18

AzureTRE declares React and React DOM ^18.3.1, satisfying the peer requirements. The application package declares Node >=21, and the relevant image-build workflow uses Node 24.

Relevant files:

The deployment script uses whichever Node version is installed on its host, so that environment should also be confirmed as Node 20 or newer:

Do not target 7.0.0

React Router 7.0.0 falls within several subsequently published advisory ranges. Relevant examples include:

Some React Router advisories only affect framework mode, SSR, or hydration features that AzureTRE does not use. Nevertheless, installing the exact PR lockfile produces high-severity audit findings rooted in:

  • react-router
  • react-router-dom
  • turbo-stream

Required package change: if the project proceeds to v7, update to a currently patched v7 release—7.18.2 at the time of this assessment—instead of 7.0.0. The final selected version must be installed and tested directly.


3. Breaking behavior: relative navigation inside splat routes

React Router 7 makes the behavior previously gated by future.v7_relativeSplatPath mandatory. Relative paths now take the current splat value into account in situations where React Router 6 did not.

AzureTRE has multiple multi-segment splat routes:

Airlock flow

The Airlock component uses relative destinations:

The risk appears when one of these actions is invoked while a child splat value is already active.

For example, from:

/workspaces/W/requests/OLD

a relative navigate("new") may follow the active splat and produce:

/workspaces/W/requests/OLD/new

instead of the apparent intended sibling location:

/workspaces/W/requests/new

Similarly, selecting request NEW while viewing OLD could produce /OLD/NEW.

Workspace-user flow

A similar structure exists for workspace users:

Panel-close navigation

These calls also warrant regression tests:

The navigate("../") calls may remain correct because they originate in explicit child routes. They should still be tested based on the resulting pathname rather than assumed safe.

Required response

Before merging the v7 upgrade:

  1. Add location-aware tests for these flows.
  2. Where a test exposes changed behavior, either:
    • restructure segment/* into a parent route plus an explicit * child, following the migration guide; or
    • use explicit route-relative or absolute navigation targets that cannot accidentally append to an active splat.

The exact code fix should be selected after testing both the root and workspace variants because the same Airlock component operates under more than one route prefix.


4. Recommended migration sequence

The safest approach is to introduce the v7 behavior while still using React Router 6.30.4.

At ui/app/src/index.tsx:24, configure the router temporarily as follows:

<BrowserRouter
  future={{
    v7_relativeSplatPath: true,
    v7_startTransition: true,
  }}
>

Then:

  1. Run route tests on React Router 6.30.4 with the future flags.
  2. Correct any splat-relative navigation failures.
  3. Upgrade directly to the chosen patched v7 release.
  4. Remove obsolete future flags if they are rejected or no longer needed under v7.
  5. Repeat lint, unit tests, production build, audit, and browser routing tests.

This separates behavioral changes from package/API changes and makes failures easier to diagnose.


5. Route tests to add

At minimum, assert the final pathname for the following cases:

Starting location/action Expected result
/workspaces/W/requests → New request /workspaces/W/requests/new
/workspaces/W/requests/OLD → New request /workspaces/W/requests/new, not /OLD/new
/workspaces/W/requests/OLD → select NEW /workspaces/W/requests/NEW, not /OLD/NEW
/requests/OLD → select NEW /requests/NEW, not /OLD/NEW
Close workspace Airlock panel /workspaces/W/requests
/workspaces/W/users → Assign New /workspaces/W/users/new
Close assignment panel /workspaces/W/users
Direct entry/refresh of workspace service Existing route continues to render
Direct entry/refresh of user resource Existing route continues to render
Direct entry/refresh of shared service Existing route continues to render

Existing tests mock router hooks or test broad rendering but do not establish these URL transitions:


6. Route cleanup

AzureTRE currently declares this route in ui/app/src/App.tsx:112:

path="/workspaces/:workspaceId//*"

It should be normalized to:

path="/workspaces/:workspaceId/*"

The double slash is pre-existing and appears to have been tolerated, so it is not introduced by this PR. It is nevertheless noncanonical and adds unnecessary ambiguity during a splat-routing migration. Direct navigation and refresh should be tested after changing it.


7. Other dependency bumps

brace-expansion 1.1.14 → 1.1.18 and 2.1.0 → 2.1.4

  • Breaking changes: None identified.
  • AzureTRE usage: Transitive development/tooling dependency, chiefly below minimatch and ESLint.
  • Required changes: None.

These releases contain security/performance hardening around pathological expansion behavior. Keep the updates and run lint normally.

fast-uri 3.1.2 → 3.1.5

  • Breaking changes: None identified.
  • AzureTRE usage: Transitive URI-validation dependency.
  • Required changes: None.

The releases improve URI canonicalization and parsing, including authority delimiters, encoded paths, and internationalized names.

immutable 5.1.5 → 5.1.9

  • Breaking changes: None identified.
  • AzureTRE usage: Transitive/optional build dependency; no direct imports found.
  • Required changes: None.

The patch releases fix sequence iteration, bounds handling, hash-collision behavior, and collection edge cases.

js-yaml 4.3.0 → 4.3.1

  • Breaking changes: None documented.
  • AzureTRE usage: Transitive tooling/configuration parsing.
  • Required changes: None.

Retain the patch and rely on existing lint/build coverage.

nanoid 3.3.12 → 3.3.18

  • Breaking changes: None identified.
  • AzureTRE usage: Pulled transitively by PostCSS rather than imported by application code.
  • Required changes: None.

The updates fix edge cases including zero or negative sizes and random-pool behavior.

postcss 8.5.15 → 8.5.26

  • Breaking changes: No public major API break in this patch range.
  • AzureTRE usage: Vite/CSS build pipeline; no custom PostCSS calls or configuration identified.
  • Required changes: None currently indicated.
  • Recommended validation: Production Vite build and a brief CSS/UI smoke test.

This range includes source-map boundary hardening, prototype-manipulation protections, stack-overflow prevention, and formatting/visitor fixes. Custom processors relying on unusual source-map locations or missing opts.from could observe differences, but AzureTRE does not appear to contain such code.


8. Lockfile observations

The lockfile root changes several declarations from "latest" to "*" even though package.json remains unchanged:

  • @vitejs/plugin-react-swc
  • vite-plugin-svgr
  • vite-tsconfig-paths
  • jsdom

The actual resolved versions of those packages do not change in this PR. This appears to be npm lockfile serialization rather than a real dependency bump.

No application changes are associated with those lines. Two reproducibility improvements are worth considering separately:

  1. Generate the lockfile using the repository's agreed npm version.
  2. Prefer npm ci over npm install in CI/deployment when the lockfile is authoritative.

These are maintenance recommendations, not blockers specific to the React Router upgrade.


9. Validation results

The exact PR snapshot was tested in an isolated environment. The generated src/config.json needed by the build was supplied from the tracked source configuration.

Validation Result
npm ci Passed
TypeScript/Vite production build Passed
Lint Passed
Vitest 241/241 tests passed across 27 files
npm audit Failed on high-severity findings in the React Router 7.0.0 chain

The production build emitted only the existing large-bundle warning.

These successful checks establish that:

  • the current APIs compile under v7;
  • no obvious import or type migration is missing;
  • the ordinary lockfile updates do not break the build.

They do not establish that relative navigation resolves correctly under active splat paths.


10. CI status

The visible lint, build, unit-test, CodeQL, and Copilot review checks succeeded.

The extended smoke workflow failed while deploying shared services, specifically during Deploy firewall:

Available public metadata does not indicate that the infrastructure failure was caused by React Router or the lockfile. Downstream E2E jobs were skipped, meaning the workflow did not provide routing confidence.

Action logs requiring repository authentication were not accessible during the review.


11. Copilot comments

React Router major-version migration

Copilot warns that React Router 6 to 7 is a major upgrade and requests corresponding migration changes or justification.

Assessment: valid.

A broad API rewrite is not needed, but the PR currently lacks:

  • handling or explicit validation of v7 splat-relative behavior;
  • route-location regression tests;
  • rationale for selecting the unpatched initial 7.0.0 release.

Lockfile not updated

Copilot says that the pinned package update should include an updated lockfile.

Assessment: incorrect/inapplicable.

ui/app/package-lock.json is included and resolves both react-router and react-router-dom to 7.0.0. The comment can be resolved with that clarification.

Suppressed splat-route observation

A later Copilot review identified splat-route navigation as a concern but did not post it as a separate inline discussion.

Assessment: substantively valid.

It corresponds to the v7_relativeSplatPath issue described above.


12. Required and recommended changes

Must be addressed before merge

  • Do not merge with react-router-dom@7.0.0.
  • Select a currently patched v7 release—7.18.2 at assessment time—and regenerate the lockfile.
  • Enable and test v7 relative-splat semantics, preferably first on React Router 6.30.4 using future flags.
  • Add location-aware tests for Airlock and workspace-user navigation.
  • Correct any navigation that appends to the active splat rather than selecting a sibling child.
  • Run the complete suite against the final selected React Router version, not just 7.0.0.

Recommended

  • Normalize /workspaces/:workspaceId//* to /workspaces/:workspaceId/*.
  • Test direct URL entry and refresh for all nested workspace/resource routes.
  • Confirm the Node version on deployment agents is at least Node 20.
  • Run a CSS/UI smoke test for the PostCSS update.
  • Investigate or rerun the failed firewall deployment so browser E2E stages can execute.
  • Consider using npm ci and bounded dependency ranges for more reproducible builds.

No associated code changes needed

  • React and React DOM.
  • Existing react-router-dom imports.
  • Declarative BrowserRouter, Routes, Route, Link, useNavigate, useLocation, and useParams usage outside the identified relative-splat cases.
  • Data-router, loader/action, SSR, hydration, framework-mode, RSC, and Single Fetch features.
  • brace-expansion, fast-uri, immutable, js-yaml, or nanoid.
  • PostCSS, based on current usage, beyond build/UI validation.

Final disposition

Request changes / hold the PR.

This is not a case where React Router 7 requires a wholesale source migration: AzureTRE's existing imports and declarative routing model still compile, and all 241 existing tests pass. The problem is narrower but important:

  • the PR selects an obsolete, vulnerable v7 release;
  • it crosses a known splat-routing behavior boundary;
  • AzureTRE contains the relative-navigation patterns affected by that boundary;
  • existing tests do not exercise the resulting URLs.

Preserve the ordinary patch-level lockfile upgrades, but revise the React Router portion into a deliberate migration with focused route tests and a patched v7 target.


References

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file external PR from an external contributor javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants