File: Builder\PageActionEndpointConventionBuilderResourceCollectionExtensions.cs
Web Access
Project: src\src\Mvc\Mvc.RazorPages\src\Microsoft.AspNetCore.Mvc.RazorPages.csproj (Microsoft.AspNetCore.Mvc.RazorPages)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Endpoints;
using Microsoft.AspNetCore.Routing;
using static Microsoft.AspNetCore.Builder.RazorPagesEndpointRouteBuilderExtensions;
 
namespace Microsoft.AspNetCore.Builder;
 
/// <summary>
/// Extensions for <see cref="PageActionEndpointConventionBuilder"/>.
/// </summary>
public static class PageActionEndpointConventionBuilderResourceCollectionExtensions
{
    private const string ResourceCollectionResolverKey = "__ResourceCollectionResolver";
 
    /// <summary>
    /// Adds a <see cref="ResourceAssetCollection"/> metadata instance to the endpoints.
    /// </summary>
    /// <param name="builder">The <see cref="PageActionEndpointConventionBuilder"/>.</param>
    /// <param name="manifestPath">The manifest associated with the assets.</param>
    /// <returns></returns>
    public static PageActionEndpointConventionBuilder WithStaticAssets(
        this PageActionEndpointConventionBuilder builder,
        string? manifestPath = null)
    {
        ArgumentNullException.ThrowIfNull(builder);
 
        if (builder.Items.TryGetValue(EndpointRouteBuilderKey, out var endpointBuilder))
        {
            var (resolver, registered) = builder.Items.TryGetValue(ResourceCollectionResolverKey, out var value)
            ? ((ResourceCollectionResolver)value, true)
            : (new ResourceCollectionResolver((IEndpointRouteBuilder)endpointBuilder), false);
 
            resolver.ManifestName = manifestPath;
            if (!registered)
            {
                builder.Items[ResourceCollectionResolverKey] = resolver;
                var collection = resolver.ResolveResourceCollection();
                var importMap = resolver.ResolveImportMap();
 
                builder.Add(endpointBuilder =>
                {
                    endpointBuilder.Metadata.Add(collection);
                    endpointBuilder.Metadata.Add(importMap);
                });
            }
        }
 
        return builder;
    }
}