diff --git a/src/JsonSchema/JsonSchema.csproj b/src/JsonSchema/JsonSchema.csproj
new file mode 100644
index 0000000000..c1c02ec32f
--- /dev/null
+++ b/src/JsonSchema/JsonSchema.csproj
@@ -0,0 +1,19 @@
+
+
+
+ Exe
+ net5.0
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/JsonSchema/Program.cs b/src/JsonSchema/Program.cs
new file mode 100644
index 0000000000..e8cc1548e5
--- /dev/null
+++ b/src/JsonSchema/Program.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Threading.Tasks;
+using CommandLine;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
+using NJsonSchema;
+using NJsonSchema.Generation;
+
+namespace JsonSchema
+{
+ class Program
+ {
+ public class Options
+ {
+ [Option('o', "outputFile", Required = false, HelpText = "Set path of the output file.")]
+ public string OutputFile { get; set; }
+ }
+
+ static async Task Main(string[] args)
+ {
+ Parser.Default.ParseArguments(args)
+ .WithParsedAsync(Execute);
+ }
+
+ private static async Task Execute(Options options)
+ {
+ var result = GenerateJsonSchema();
+
+ if (string.IsNullOrEmpty(options.OutputFile))
+ {
+ Console.WriteLine(result);
+ }
+ else
+ {
+ await System.IO.File.WriteAllTextAsync(options.OutputFile, result);
+ }
+ }
+
+ private static string GenerateJsonSchema()
+ {
+ var settings = new JsonSchemaGeneratorSettings()
+ {
+ SchemaType = SchemaType.JsonSchema,
+ AlwaysAllowAdditionalObjectProperties = true,
+ SerializerSettings = new JsonSerializerSettings(),
+ TypeNameGenerator = new UmbracoPrefixedTypeNameGenerator()
+ };
+ settings.SerializerSettings.Converters.Add(new StringEnumConverter());
+
+ var generator = new JsonSchemaGenerator(settings);
+
+ var schema = generator.Generate(typeof(UmbracoCmsConfigRoot));
+
+ return schema.ToJson(Formatting.Indented);
+ }
+ }
+}
diff --git a/src/JsonSchema/UmbracoCmsConfigRoot.cs b/src/JsonSchema/UmbracoCmsConfigRoot.cs
new file mode 100644
index 0000000000..3f4f2d4ab3
--- /dev/null
+++ b/src/JsonSchema/UmbracoCmsConfigRoot.cs
@@ -0,0 +1,53 @@
+using Umbraco.Cms.Core.Configuration.Models;
+
+namespace JsonSchema
+{
+ ///
+ /// Configuration of Open Source .NET CMS - Umbraco
+ ///
+ public class UmbracoCmsConfigRoot
+ {
+ public Cms CMS { get; set; }
+
+
+ ///
+ /// Configurations for the Umbraco CMS
+ ///
+ public class Cms
+ {
+ public ActiveDirectorySettings ActiveDirectory { get; set; }
+ public ContentSettings Content { get; set; }
+ public CoreDebugSettings CoreDebug { get; set; }
+ public ExceptionFilterSettings ExceptionFilter { get; set; }
+ public ModelsBuilderSettings ModelsBuilder { get; set; }
+ public GlobalSettings Global { get; set; }
+ public HealthChecksSettings HealthChecks { get; set; }
+ public HostingSettings Hosting { get; set; }
+ public ImagingSettings Imaging { get; set; }
+ public IndexCreatorSettings Examine { get; set; }
+ public KeepAliveSettings KeepAlive { get; set; }
+ public LoggingSettings Logging { get; set; }
+ public MemberPasswordConfigurationSettings MemberPassword { get; set; }
+ public NuCacheSettings NuCache { get; set; }
+ public RequestHandlerSettings RequestHandler { get; set; }
+ public RuntimeSettings Runtime { get; set; }
+ public SecuritySettings Security { get; set; }
+ public TourSettings Tours { get; set; }
+ public TypeFinderSettings TypeFinder { get; set; }
+ public UserPasswordConfigurationSettings UserPassword { get; set; }
+ public WebRoutingSettings WebRouting { get; set; }
+ public UmbracoPluginSettings Plugins { get; set; }
+ public UnattendedSettings Unattended { get; set; }
+ public RichTextEditorSettings RichTextEditor { get; set; }
+ public RuntimeMinificationSettings RuntimeMinification { get; set; }
+ }
+
+ ///
+ /// Configurations for the Umbraco Forms package to Umbraco CMS
+ ///
+ public class Forms
+ {
+
+ }
+ }
+}
diff --git a/src/JsonSchema/UmbracoPrefixedTypeNameGenerator.cs b/src/JsonSchema/UmbracoPrefixedTypeNameGenerator.cs
new file mode 100644
index 0000000000..b8a7233665
--- /dev/null
+++ b/src/JsonSchema/UmbracoPrefixedTypeNameGenerator.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using NJsonSchema;
+
+namespace JsonSchema
+{
+ public class UmbracoPrefixedTypeNameGenerator : DefaultTypeNameGenerator
+ {
+ private const string PREFIX = "umbraco";
+
+ public override string Generate(NJsonSchema.JsonSchema schema, string typeNameHint, IEnumerable reservedTypeNames)
+ {
+ return PREFIX + base.Generate(schema, typeNameHint, reservedTypeNames);
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Configuration/Models/ActiveDirectorySettings.cs b/src/Umbraco.Core/Configuration/Models/ActiveDirectorySettings.cs
index 700e3fe3e1..be06d33ba2 100644
--- a/src/Umbraco.Core/Configuration/Models/ActiveDirectorySettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/ActiveDirectorySettings.cs
@@ -1,11 +1,14 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.
+using Umbraco.Cms.Core.Configuration.Models;
+
namespace Umbraco.Cms.Core.Configuration.Models
{
///
/// Typed configuration options for active directory settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigActiveDirectory)]
public class ActiveDirectorySettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/Attributes/UmbracoOptionsAttribute.cs b/src/Umbraco.Core/Configuration/Models/Attributes/UmbracoOptionsAttribute.cs
new file mode 100644
index 0000000000..211b6b3d83
--- /dev/null
+++ b/src/Umbraco.Core/Configuration/Models/Attributes/UmbracoOptionsAttribute.cs
@@ -0,0 +1,16 @@
+using System;
+
+namespace Umbraco.Cms.Core.Configuration.Models
+{
+ [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
+ public class UmbracoOptionsAttribute : Attribute
+ {
+ public string ConfigurationKey { get; }
+ public bool BindNonPublicProperties { get; set; }
+
+ public UmbracoOptionsAttribute(string configurationKey)
+ {
+ ConfigurationKey = configurationKey;
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs b/src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs
index 9e6ab4cff1..739c309f80 100644
--- a/src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs
+++ b/src/Umbraco.Core/Configuration/Models/ConnectionStrings.cs
@@ -1,11 +1,14 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.
+using Umbraco.Cms.Core.Configuration.Models;
+
namespace Umbraco.Cms.Core.Configuration.Models
{
///
/// Typed configuration options for connection strings.
///
+ [UmbracoOptions("ConnectionStrings", BindNonPublicProperties = true)]
public class ConnectionStrings
{
// Backing field for UmbracoConnectionString to load from configuration value with key umbracoDbDSN.
diff --git a/src/Umbraco.Core/Configuration/Models/ContentSettings.cs b/src/Umbraco.Core/Configuration/Models/ContentSettings.cs
index 7da55cca99..1c54593ed2 100644
--- a/src/Umbraco.Core/Configuration/Models/ContentSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/ContentSettings.cs
@@ -10,6 +10,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for content settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigContent)]
public class ContentSettings
{
private const string DefaultPreviewBadge =
diff --git a/src/Umbraco.Core/Configuration/Models/CoreDebugSettings.cs b/src/Umbraco.Core/Configuration/Models/CoreDebugSettings.cs
index 1978e02f18..626a4c68f7 100644
--- a/src/Umbraco.Core/Configuration/Models/CoreDebugSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/CoreDebugSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for core debug settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigCoreDebug)]
public class CoreDebugSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/ExceptionFilterSettings.cs b/src/Umbraco.Core/Configuration/Models/ExceptionFilterSettings.cs
index 0a6bc32351..0a58036104 100644
--- a/src/Umbraco.Core/Configuration/Models/ExceptionFilterSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/ExceptionFilterSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for exception filter settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigExceptionFilter)]
public class ExceptionFilterSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs b/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs
index b27b60ec8e..5c6e53df92 100644
--- a/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs
@@ -8,6 +8,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for global settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigGlobal)]
public class GlobalSettings
{
internal const string
diff --git a/src/Umbraco.Core/Configuration/Models/HealthChecksSettings.cs b/src/Umbraco.Core/Configuration/Models/HealthChecksSettings.cs
index ba7ccf1371..0d232b9a9b 100644
--- a/src/Umbraco.Core/Configuration/Models/HealthChecksSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/HealthChecksSettings.cs
@@ -9,6 +9,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for healthchecks settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigHealthChecks)]
public class HealthChecksSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/HostingSettings.cs b/src/Umbraco.Core/Configuration/Models/HostingSettings.cs
index 981cf8a6db..0017611fc0 100644
--- a/src/Umbraco.Core/Configuration/Models/HostingSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/HostingSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for hosting settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigHosting)]
public class HostingSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/ImagingSettings.cs b/src/Umbraco.Core/Configuration/Models/ImagingSettings.cs
index 273e53f384..fde303343c 100644
--- a/src/Umbraco.Core/Configuration/Models/ImagingSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/ImagingSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for imaging settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigImaging)]
public class ImagingSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/IndexCreatorSettings.cs b/src/Umbraco.Core/Configuration/Models/IndexCreatorSettings.cs
index 52a40b0ee4..c140463b4a 100644
--- a/src/Umbraco.Core/Configuration/Models/IndexCreatorSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/IndexCreatorSettings.cs
@@ -8,6 +8,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for index creator settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigExamine)]
public class IndexCreatorSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/KeepAliveSettings.cs b/src/Umbraco.Core/Configuration/Models/KeepAliveSettings.cs
index 898798588c..14c2a29f93 100644
--- a/src/Umbraco.Core/Configuration/Models/KeepAliveSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/KeepAliveSettings.cs
@@ -9,6 +9,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for keep alive settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigKeepAlive)]
public class KeepAliveSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/LoggingSettings.cs b/src/Umbraco.Core/Configuration/Models/LoggingSettings.cs
index 3f762e7577..b9d6fd2897 100644
--- a/src/Umbraco.Core/Configuration/Models/LoggingSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/LoggingSettings.cs
@@ -8,6 +8,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for logging settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigLogging)]
public class LoggingSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/MemberPasswordConfigurationSettings.cs b/src/Umbraco.Core/Configuration/Models/MemberPasswordConfigurationSettings.cs
index 708a7e476d..84bfeb3d3d 100644
--- a/src/Umbraco.Core/Configuration/Models/MemberPasswordConfigurationSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/MemberPasswordConfigurationSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for member password settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigMemberPassword)]
public class MemberPasswordConfigurationSettings : IPasswordConfiguration
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/ModelsBuilderSettings.cs b/src/Umbraco.Core/Configuration/Models/ModelsBuilderSettings.cs
index 76e7adc4b4..ea2fa0623e 100644
--- a/src/Umbraco.Core/Configuration/Models/ModelsBuilderSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/ModelsBuilderSettings.cs
@@ -1,6 +1,7 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.
+using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Extensions;
namespace Umbraco.Cms.Core.Configuration.Models
@@ -8,6 +9,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for models builder settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigModelsBuilder, BindNonPublicProperties = true)]
public class ModelsBuilderSettings
{
private bool _flagOutOfDateModels = true;
diff --git a/src/Umbraco.Core/Configuration/Models/NuCacheSettings.cs b/src/Umbraco.Core/Configuration/Models/NuCacheSettings.cs
index aa67038702..e09d6adb24 100644
--- a/src/Umbraco.Core/Configuration/Models/NuCacheSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/NuCacheSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for NuCache settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigNuCache)]
public class NuCacheSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/RequestHandlerSettings.cs b/src/Umbraco.Core/Configuration/Models/RequestHandlerSettings.cs
index 5f5032f7c3..6f6a9c6236 100644
--- a/src/Umbraco.Core/Configuration/Models/RequestHandlerSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/RequestHandlerSettings.cs
@@ -10,6 +10,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for request handler settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigRequestHandler)]
public class RequestHandlerSettings
{
internal static readonly CharItem[] DefaultCharCollection =
diff --git a/src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs b/src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs
index cdd88ca409..a5d1ae7475 100644
--- a/src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs
@@ -3,6 +3,7 @@ using Umbraco.Cms.Core.Models.ContentEditing;
namespace Umbraco.Cms.Core.Configuration.Models
{
+ [UmbracoOptions(Constants.Configuration.ConfigRichTextEditor)]
public class RichTextEditorSettings
{
private static readonly string[] s_default_plugins = new[]
diff --git a/src/Umbraco.Core/Configuration/Models/RuntimeMinificationSettings.cs b/src/Umbraco.Core/Configuration/Models/RuntimeMinificationSettings.cs
index fa3519059a..f0fd4e71e1 100644
--- a/src/Umbraco.Core/Configuration/Models/RuntimeMinificationSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/RuntimeMinificationSettings.cs
@@ -4,6 +4,7 @@ using System.Text;
namespace Umbraco.Cms.Core.Configuration.Models
{
+ [UmbracoOptions(Constants.Configuration.ConfigRuntimeMinification)]
public class RuntimeMinificationSettings
{
public bool UseInMemoryCache { get; set; } = false;
diff --git a/src/Umbraco.Core/Configuration/Models/RuntimeSettings.cs b/src/Umbraco.Core/Configuration/Models/RuntimeSettings.cs
index c598dfb86b..64625f153b 100644
--- a/src/Umbraco.Core/Configuration/Models/RuntimeSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/RuntimeSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for runtime settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigRuntime)]
public class RuntimeSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs b/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs
index a20e42ed08..392e5f2118 100644
--- a/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for security settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigSecurity)]
public class SecuritySettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/TourSettings.cs b/src/Umbraco.Core/Configuration/Models/TourSettings.cs
index c61c2316b7..c73c4737b8 100644
--- a/src/Umbraco.Core/Configuration/Models/TourSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/TourSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for tour settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigTours)]
public class TourSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/TypeFinderSettings.cs b/src/Umbraco.Core/Configuration/Models/TypeFinderSettings.cs
index 9c8fc2b9d3..d942f47b4f 100644
--- a/src/Umbraco.Core/Configuration/Models/TypeFinderSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/TypeFinderSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for type finder settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigTypeFinder)]
public class TypeFinderSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/UmbracoPluginSettings.cs b/src/Umbraco.Core/Configuration/Models/UmbracoPluginSettings.cs
index 6dcad67ce2..19bab8141d 100644
--- a/src/Umbraco.Core/Configuration/Models/UmbracoPluginSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/UmbracoPluginSettings.cs
@@ -8,6 +8,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for the plugins.
///
+ [UmbracoOptions(Constants.Configuration.ConfigPlugins)]
public class UmbracoPluginSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/UnattendedSettings.cs b/src/Umbraco.Core/Configuration/Models/UnattendedSettings.cs
index 26c3ee72c4..00c0be4b3b 100644
--- a/src/Umbraco.Core/Configuration/Models/UnattendedSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/UnattendedSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for unattended settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigUnattended)]
public class UnattendedSettings
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/UserPasswordConfigurationSettings.cs b/src/Umbraco.Core/Configuration/Models/UserPasswordConfigurationSettings.cs
index f609181460..ccc9129a1c 100644
--- a/src/Umbraco.Core/Configuration/Models/UserPasswordConfigurationSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/UserPasswordConfigurationSettings.cs
@@ -6,6 +6,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for user password settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigUserPassword)]
public class UserPasswordConfigurationSettings : IPasswordConfiguration
{
///
diff --git a/src/Umbraco.Core/Configuration/Models/WebRoutingSettings.cs b/src/Umbraco.Core/Configuration/Models/WebRoutingSettings.cs
index 2fe33603ca..3c1c372c00 100644
--- a/src/Umbraco.Core/Configuration/Models/WebRoutingSettings.cs
+++ b/src/Umbraco.Core/Configuration/Models/WebRoutingSettings.cs
@@ -8,6 +8,7 @@ namespace Umbraco.Cms.Core.Configuration.Models
///
/// Typed configuration options for web routing settings.
///
+ [UmbracoOptions(Constants.Configuration.ConfigWebRouting)]
public class WebRoutingSettings
{
///
diff --git a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Configuration.cs b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Configuration.cs
index bd834a5427..b5edfdf818 100644
--- a/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Configuration.cs
+++ b/src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Configuration.cs
@@ -1,3 +1,5 @@
+using System;
+using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core.Configuration.Models;
@@ -11,12 +13,25 @@ namespace Umbraco.Cms.Core.DependencyInjection
public static partial class UmbracoBuilderExtensions
{
- private static OptionsBuilder AddOptions(IUmbracoBuilder builder, string key)
+ private static IUmbracoBuilder AddUmbracoOptions(this IUmbracoBuilder builder)
where TOptions : class
- => builder.Services.AddOptions()
- .Bind(builder.Config.GetSection(key))
+ {
+ var umbracoOptionsAttribute = typeof(TOptions).GetCustomAttribute();
+
+ if (umbracoOptionsAttribute is null)
+ {
+ throw new ArgumentException("typeof(TOptions) do not have the UmbracoOptionsAttribute");
+ }
+
+
+ builder.Services.AddOptions()
+ .Bind(builder.Config.GetSection(umbracoOptionsAttribute.ConfigurationKey),
+ o => o.BindNonPublicProperties = umbracoOptionsAttribute.BindNonPublicProperties)
.ValidateDataAnnotations();
+ return builder;
+ }
+
///
/// Add Umbraco configuration services and options
///
@@ -30,34 +45,33 @@ namespace Umbraco.Cms.Core.DependencyInjection
builder.Services.AddSingleton, UnattendedSettingsValidator>();
// Register configuration sections.
-
- builder.Services.Configure(builder.Config.GetSection(Constants.Configuration.ConfigModelsBuilder), o => o.BindNonPublicProperties = true);
- builder.Services.Configure(builder.Config.GetSection("ConnectionStrings"), o => o.BindNonPublicProperties = true);
-
- AddOptions(builder, Constants.Configuration.ConfigActiveDirectory);
- AddOptions(builder, Constants.Configuration.ConfigContent);
- AddOptions(builder, Constants.Configuration.ConfigCoreDebug);
- AddOptions(builder, Constants.Configuration.ConfigExceptionFilter);
- AddOptions(builder, Constants.Configuration.ConfigGlobal);
- AddOptions(builder, Constants.Configuration.ConfigHealthChecks);
- AddOptions(builder, Constants.Configuration.ConfigHosting);
- AddOptions(builder, Constants.Configuration.ConfigImaging);
- AddOptions(builder, Constants.Configuration.ConfigExamine);
- AddOptions(builder, Constants.Configuration.ConfigKeepAlive);
- AddOptions(builder, Constants.Configuration.ConfigLogging);
- AddOptions(builder, Constants.Configuration.ConfigMemberPassword);
- AddOptions(builder, Constants.Configuration.ConfigNuCache);
- AddOptions(builder, Constants.Configuration.ConfigRequestHandler);
- AddOptions(builder, Constants.Configuration.ConfigRuntime);
- AddOptions(builder, Constants.Configuration.ConfigSecurity);
- AddOptions(builder, Constants.Configuration.ConfigTours);
- AddOptions(builder, Constants.Configuration.ConfigTypeFinder);
- AddOptions(builder, Constants.Configuration.ConfigUserPassword);
- AddOptions(builder, Constants.Configuration.ConfigWebRouting);
- AddOptions(builder, Constants.Configuration.ConfigPlugins);
- AddOptions(builder, Constants.Configuration.ConfigUnattended);
- AddOptions(builder, Constants.Configuration.ConfigRichTextEditor);
- AddOptions(builder, Constants.Configuration.ConfigRuntimeMinification);
+ builder
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions()
+ .AddUmbracoOptions();
return builder;
}
diff --git a/src/umbraco.sln b/src/umbraco.sln
index b021dfccff..5093492d07 100644
--- a/src/umbraco.sln
+++ b/src/umbraco.sln
@@ -160,6 +160,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Tests.UnitTests", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Web.Common", "Umbraco.Web.Common\Umbraco.Web.Common.csproj", "{79E4293D-C92C-4649-AEC8-F1EFD95BDEB1}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonSchema", "JsonSchema\JsonSchema.csproj", "{2A5027D9-F71D-4957-929E-F7A56AA1B95A}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -234,6 +236,10 @@ Global
{79E4293D-C92C-4649-AEC8-F1EFD95BDEB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{79E4293D-C92C-4649-AEC8-F1EFD95BDEB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{79E4293D-C92C-4649-AEC8-F1EFD95BDEB1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2A5027D9-F71D-4957-929E-F7A56AA1B95A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2A5027D9-F71D-4957-929E-F7A56AA1B95A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2A5027D9-F71D-4957-929E-F7A56AA1B95A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2A5027D9-F71D-4957-929E-F7A56AA1B95A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE