From 69cc340c5a619544952a849936d2f36346ccbac2 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Thu, 24 Jun 2021 13:24:57 +0200 Subject: [PATCH 1/2] Merge with official schema --- src/JsonSchema/Program.cs | 38 +- src/JsonSchema/UmbracoJsonSchemaGenerator.cs | 49 + .../UmbracoJsonSchemaGeneratorSettings.cs | 22 + .../umbraco/config/appsettings-schema.json | 1743 ++++++++++++++++- 4 files changed, 1774 insertions(+), 78 deletions(-) create mode 100644 src/JsonSchema/UmbracoJsonSchemaGenerator.cs create mode 100644 src/JsonSchema/UmbracoJsonSchemaGeneratorSettings.cs diff --git a/src/JsonSchema/Program.cs b/src/JsonSchema/Program.cs index 1b6c4b864e..3ee1136313 100644 --- a/src/JsonSchema/Program.cs +++ b/src/JsonSchema/Program.cs @@ -22,38 +22,28 @@ namespace JsonSchema static async Task Main(string[] args) { - Parser.Default.ParseArguments(args) - .WithParsedAsync(Execute); + try + { + Parser.Default.ParseArguments(args) + .WithParsedAsync(Execute); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + } private static async Task Execute(Options options) { - var result = GenerateJsonSchema(); + var generator = new UmbracoJsonSchemaGenerator(); + var schema = await generator.Generate(); var path = Path.Combine(Environment.CurrentDirectory, options.OutputFile); - await File.WriteAllTextAsync(path, result); - + await File.WriteAllTextAsync(path, schema); Console.WriteLine("File written at " + path); } - - private static string GenerateJsonSchema() - { - var settings = new JsonSchemaGeneratorSettings() - { - SchemaType = SchemaType.JsonSchema, - AlwaysAllowAdditionalObjectProperties = true, - SerializerSettings = new JsonSerializerSettings(), - TypeNameGenerator = new UmbracoPrefixedTypeNameGenerator(), - DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull - }; - settings.SerializerSettings.Converters.Add(new StringEnumConverter()); - - var generator = new JsonSchemaGenerator(settings); - - var schema = generator.Generate(typeof(AppSettings)); - - return schema.ToJson(Formatting.Indented); - } } } diff --git a/src/JsonSchema/UmbracoJsonSchemaGenerator.cs b/src/JsonSchema/UmbracoJsonSchemaGenerator.cs new file mode 100644 index 0000000000..2f477b6a4f --- /dev/null +++ b/src/JsonSchema/UmbracoJsonSchemaGenerator.cs @@ -0,0 +1,49 @@ +using System; +using System.Net.Http; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NJsonSchema.Generation; + +namespace JsonSchema +{ + public class UmbracoJsonSchemaGenerator + { + private readonly JsonSchemaGenerator _innerGenerator; + private static readonly HttpClient s_client = new HttpClient(); + + public UmbracoJsonSchemaGenerator() + { + _innerGenerator = new JsonSchemaGenerator(new UmbracoJsonSchemaGeneratorSettings()); + } + + public async Task Generate() + { + var umbracoSchema = GenerateUmbracoSchema(); + var officialSchema = await GetOfficialAppSettingsSchema().ConfigureAwait(false);; + + officialSchema.Merge(umbracoSchema); + + return officialSchema.ToString(); + } + + private async Task GetOfficialAppSettingsSchema() + { + + var response = s_client.GetAsync(new Uri("https://json.schemastore.org/appsettings.json")).GetAwaiter().GetResult(); + + + var result = await response.Content.ReadAsStringAsync(); + + return JsonConvert.DeserializeObject(result); + + } + + private JObject GenerateUmbracoSchema() + { + var schema = _innerGenerator.Generate(typeof(AppSettings)); + + return JsonConvert.DeserializeObject(schema.ToJson()); + } + } +} diff --git a/src/JsonSchema/UmbracoJsonSchemaGeneratorSettings.cs b/src/JsonSchema/UmbracoJsonSchemaGeneratorSettings.cs new file mode 100644 index 0000000000..8351deeeef --- /dev/null +++ b/src/JsonSchema/UmbracoJsonSchemaGeneratorSettings.cs @@ -0,0 +1,22 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using NJsonSchema.Generation; +using NJsonSchema.Generation.TypeMappers; +using Umbraco.Cms.Core; + +namespace JsonSchema +{ + public class UmbracoJsonSchemaGeneratorSettings : JsonSchemaGeneratorSettings + { + public UmbracoJsonSchemaGeneratorSettings() + { + AlwaysAllowAdditionalObjectProperties = true; + SerializerSettings = new JsonSerializerSettings(); + TypeNameGenerator = new UmbracoPrefixedTypeNameGenerator(); + DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; + + SerializerSettings.Converters.Add(new StringEnumConverter()); + } + } +} diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/appsettings-schema.json b/src/Umbraco.Web.UI.NetCore/umbraco/config/appsettings-schema.json index d0e1e765fb..adcdc9751d 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/appsettings-schema.json +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/appsettings-schema.json @@ -1,13 +1,1652 @@ { - "$schema": "http://json-schema.org/draft-04/schema#", "title": "AppSettings", + "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", - "properties": { - "Umbraco": { - "$ref": "#/definitions/umbracoUmbracoDefinition" - } - }, "definitions": { + "webOptimizer": { + "type": "object", + "description": "Settings for WebOptimizer.Core", + "properties": { + "enableCaching": { + "description": "Determines if the \"cache-control\" HTTP headers should be set and if conditional GET (304) requests should be supported. This could be helpful to disable while in development mode.", + "type": "boolean" + }, + "enableTagHelperBundling": { + "description": "Determines if `