File: JsonSourceGenerationContext.cs
Web Access
Project: src\src\Aspire.Cli\Aspire.Cli.csproj (aspire)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using Aspire.Cli.Acquisition;
using Aspire.Cli.Caching;
using Aspire.Cli.Certificates;
using Aspire.Cli.Commands;
using Aspire.Cli.Configuration;
using Aspire.Cli.Documentation.ApiDocs;
using Aspire.Cli.Documentation.Docs;
using Aspire.Cli.Mcp.Tools;
using Aspire.Cli.Projects;
using Aspire.Cli.Telemetry;
using Aspire.Cli.Utils.EnvironmentChecker;
using Aspire.Cli.Backchannel;
 
namespace Aspire.Cli;
 
[JsonSourceGenerationOptions(
    WriteIndented = true,
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
    AllowTrailingCommas = true,
    ReadCommentHandling = JsonCommentHandling.Skip,
    PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
    PropertyNameCaseInsensitive = true,
    Converters = [typeof(FlexibleBooleanConverter)])]
[JsonSerializable(typeof(CliSettings))]
[JsonSerializable(typeof(JsonObject))]
[JsonSerializable(typeof(ListIntegrationsResponse))]
[JsonSerializable(typeof(Integration))]
[JsonSerializable(typeof(DoctorCheckResponse))]
[JsonSerializable(typeof(EnvironmentCheckResult))]
[JsonSerializable(typeof(DoctorCheckSummary))]
[JsonSerializable(typeof(AspireJsonConfiguration))]
[JsonSerializable(typeof(AspireConfigFile))]
[JsonSerializable(typeof(List<DevCertInfo>))]
[JsonSerializable(typeof(ConfigInfo))]
[JsonSerializable(typeof(FeatureInfo))]
[JsonSerializable(typeof(SettingsSchema))]
[JsonSerializable(typeof(PropertyInfo))]
[JsonSerializable(typeof(LlmsDocument[]))]
[JsonSerializable(typeof(LlmsSection))]
[JsonSerializable(typeof(DocsListItem[]))]
[JsonSerializable(typeof(SearchResult[]))]
[JsonSerializable(typeof(DocsContent))]
[JsonSerializable(typeof(ApiReferenceItem[]))]
[JsonSerializable(typeof(ApiListItem[]))]
[JsonSerializable(typeof(ApiSearchResult[]))]
[JsonSerializable(typeof(ApiContent))]
[JsonSerializable(typeof(IntegrationSearchResult[]))]
[JsonSerializable(typeof(string[]))]
[JsonSerializable(typeof(CandidateAppHostDisplayInfo))]
[JsonSerializable(typeof(List<CandidateAppHostDisplayInfo>))]
[JsonSerializable(typeof(InstallationInfo))]
[JsonSerializable(typeof(AppHostInfoCacheEntry))]
[JsonSerializable(typeof(AppHostProjectInspectionOutput))]
[JsonSerializable(typeof(InternalMicrosoftDetectorCacheEntry))]
[JsonSerializable(typeof(PipelineStepInfo[]))]
internal partial class JsonSourceGenerationContext : JsonSerializerContext
{
    private static JsonSourceGenerationContext? s_relaxedEscaping;
    private static JsonSourceGenerationContext? s_streaming;
 
    /// <summary>
    /// Gets a context configured with relaxed JSON escaping that preserves non-ASCII characters
    /// (e.g., Chinese, Japanese, Korean) instead of escaping them to \uXXXX sequences.
    /// Use this for JSON output that will be displayed to users.
    /// </summary>
    public static JsonSourceGenerationContext RelaxedEscaping => s_relaxedEscaping ??= new(new JsonSerializerOptions
    {
        WriteIndented = true,
        DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
        AllowTrailingCommas = true,
        ReadCommentHandling = JsonCommentHandling.Skip,
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        PropertyNameCaseInsensitive = true,
        Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
    });
 
    /// <summary>
    /// Gets a context configured for newline-delimited JSON output.
    /// </summary>
    public static JsonSourceGenerationContext Streaming => s_streaming ??= new(new JsonSerializerOptions
    {
        WriteIndented = false,
        DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
        AllowTrailingCommas = true,
        ReadCommentHandling = JsonCommentHandling.Skip,
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        PropertyNameCaseInsensitive = true,
        Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
    });
}