Skip to main content

Multi-feed UI components

The unified multi-feed platform extends AvantiPoint.Packages.UI.Razor so hosts can expose NuGet, npm, and OCI registries from a single public origin.

Today the Razor library provides a NuGet-focused operator and consumer experience:

ComponentPurpose
FeedInfoNuGet feed URL, dotnet nuget / NuGet.Config snippets
PackageSearchFull-text search, filters, pagination
PackageDetailVersions, README, dependencies, install commands

Multi-feed hosts add parallel npm and OCI experiences on the same public origin, using IFeedRegistry / IPublicBaseUrlProvider for correct URLs behind reverse proxies.

Design principles

  1. Protocol isolation — npm and OCI UI must not depend on NuGet Package entities or INuGetSearchService.
  2. Surface-aware URLs — components derive registry roots from IFeedRegistry + IPublicBaseUrlProvider (not hard-coded /v3 or /npm).
  3. Reuse patterns, not domain models — mirror NuGet component structure (connection card → browse → detail) with protocol-specific services.
  4. Optional surfaces — navigation and pages hide when UseNpm() / UseOci* is not registered.
  5. Blazor/Razor first — Primary UI components ship in the Razor library; a React surface is optional and maintained separately.

npm UI (FeedProtocol.Npm)

Registry root: {origin}/npm/ (from surface RoutePrefix via IPublicBaseUrlProvider).

Components

ComponentNuGet analogueResponsibility
NpmFeedInfoFeedInfoRegistry URL, .npmrc, npm config set registry, auth hints
NpmPackageSearchPackageSearchDB-backed browse/search
NpmPackageDetailPackageDetailVersions, dist-tags, install commands

Services

  • INpmPackageBrowseService — list/search packages for UI (uses NpmPackage / NpmVersion entities).

Register in startup:

builder.Services.AddNpmPackageBrowseUi();

OCI UI (FeedProtocol.Oci)

Registry roots: {origin}/v2/ (default) or {origin}/{segment}/v2/ (named).

Components

ComponentNuGet analogueResponsibility
OciFeedInfoFeedInfodocker login, helm registry login, ORAS hints
OciRepositoryCatalogPackageSearchRepository catalog from Distribution API
OciRepositoryDetailTag list for a repository
OciArtifactDetailPackageDetailManifest metadata and pull commands

Services

  • IOciRepositoryBrowseService — wraps Distribution API (catalog, tags, manifest summary).

Register in startup:

builder.Services.AddOciRepositoryBrowseUi();

Multi-surface shell

MultiFeedNavigation reads IFeedRegistry at render time and shows tabs only for registered surfaces:

  • NuGet/, /feed, /packages/{id}
  • npm/npm, /npm/feed, /npm/packages/{name}
  • OCI/oci, /oci/{segment}, /oci/repos/{name}

Sample hosts: OpenFeed (reference), Packages.Host (production host).

Component coverage

Multi-feed UI spans three areas, each mirroring the NuGet component pattern (connection card → browse → detail):

AreaComponentsRegistration
npm UINpmFeedInfo, NpmPackageSearch, NpmPackageDetailAddNpmPackageBrowseUi()
OCI UIOciFeedInfo, OciRepositoryCatalog, OciRepositoryDetail, OciArtifactDetailAddOciRepositoryBrowseUi()
Host shellMultiFeedNavigationRegister surfaces via IFeedRegistry; see sample hosts below