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
{{ message }}
Repository navigation
A site cannot override an installed app's route for a role with an external route #348
An app that declares a route for a role always wins over the site's externalRoutes for that role, so a site cannot send a role an installed app declares to a destination of its own. Found while planning to move Learning's tab links onto route roles (openedx/frontend-app-learning#2190, part of #1905): once it does, an operator who wants Learning's dates or outline link to go somewhere else has no way to say so.
Note
The details below were generated by Claude (Claude Code) and reviewed before posting.
Claude Plan
How a role resolves today
getUrlByRouteRole walks siteConfig.apps in list order and each app's route tree depth-first, and returns the first route whose handle.roles includes the role. Only when no app declares the role does it read siteConfig.externalRoutes, again first match. There is no check for a second match and no warning, so when two apps declare the same role the one listed first in apps wins silently, and an external route for a role any app declares is never consulted.
resolveRouteByRole and getLinkProps build on it, so every link resolved through a role follows the same order.
ExternalRoute is a role and a URL; nothing on it or on the site config says it should take precedence.
What the docs say
The migration guide's URL Config changes: URLs "should now be expressed as part of the apps config as route roles, or as externalRoutes, and resolved in code via resolveRouteByRole()". It names both sources and does not say what happens when both declare a role.
Where it bites
Learning declares org.openedx.frontend.role.courseDates, courseOutline and courseProgress on its routes, which it must for the shell's course bar. Its progress tab is to link to the dates and outline tabs through those roles (Port the progress tab to frontend-base frontend-app-learning#2190). A site that then wants one of those links to go elsewhere cannot express that in site config: an external route for the role is never reached while Learning is installed.
The same holds for any app that declares a role for a page it serves and any site that wants to point that role elsewhere.
Questions
Should a site be able to override an installed app's route for a role with a destination of its own, without uninstalling the app?
If so, how does the site say so?
Should the resolver report when two sources declare the same role?
Activity