diff --git a/TopModel.Generator.Csharp/CSharpApiClientGenerator.cs b/TopModel.Generator.Csharp/CSharpApiClientGenerator.cs index 68347819..e1f2a5d9 100644 --- a/TopModel.Generator.Csharp/CSharpApiClientGenerator.cs +++ b/TopModel.Generator.Csharp/CSharpApiClientGenerator.cs @@ -39,7 +39,7 @@ protected override void HandleFile(string filePath, string fileName, string tag, using var fw = new CSharpWriter(filePath, _logger); var hasBody = endpoints.Any(e => e.GetJsonBodyParam() != null); - var hasReturn = endpoints.Any(e => e.Returns != null && !new[] { "string", "byte[]" }.Contains(Config.GetType(e.Returns))); + var hasReturn = endpoints.Any(e => e.Returns != null && !new[] { "string", "byte[]" }.Contains(Config.GetType(e.Returns)?.TrimEnd('?'))); var hasJson = hasReturn || hasBody; var usings = new List(); @@ -157,7 +157,7 @@ protected override void HandleFile(string filePath, string fileName, string tag, fw.Write(" public async Task"); - var returnType = endpoint.Returns != null ? Config.GetType(endpoint.Returns) : null; + var returnType = endpoint.Returns != null ? Config.GetType(endpoint.Returns, nonNullable: endpoint.Returns.Required) : null; if (returnType?.StartsWith("IAsyncEnumerable") ?? false) { returnType = returnType.Replace("IAsyncEnumerable", "IEnumerable"); @@ -172,7 +172,7 @@ protected override void HandleFile(string filePath, string fileName, string tag, foreach (var param in endpoint.Params) { - fw.Write($"{Config.GetType(param, nonNullable: param.IsRouteParam() || param.IsQueryParam() && Config.GetValue(param, Classes) != "null")} {param.GetParamName().Verbatim()}"); + fw.Write($"{Config.GetType(param, nonNullable: param.IsJsonBodyParam() || param.IsRouteParam() || param.IsQueryParam() && Config.GetValue(param, Classes) != "null")} {param.GetParamName().Verbatim()}"); if (param.IsQueryParam()) { @@ -199,10 +199,10 @@ protected override void HandleFile(string filePath, string fileName, string tag, foreach (var qp in endpoint.GetQueryParams().Where(qp => !Config.GetType(qp).Contains("[]"))) { - var toString = Config.GetType(qp) switch + var toString = Config.GetType(qp)?.TrimEnd('?') switch { "string" => string.Empty, - "Guid" or "Guid?" => "?.ToString()", + "Guid" => "?.ToString()", _ => $"?.ToString(CultureInfo.InvariantCulture)" }; @@ -240,7 +240,7 @@ protected override void HandleFile(string filePath, string fileName, string tag, if (returnType != null) { - if (returnType == "string") + if (returnType.TrimEnd('?') == "string") { fw.WriteLine(2, $"return (await res.Content.ReadAsStringAsync()).Trim('\"');"); } diff --git a/TopModel.Generator.Csharp/CSharpApiServerGenerator.cs b/TopModel.Generator.Csharp/CSharpApiServerGenerator.cs index d6358a74..5e654c6c 100644 --- a/TopModel.Generator.Csharp/CSharpApiServerGenerator.cs +++ b/TopModel.Generator.Csharp/CSharpApiServerGenerator.cs @@ -136,7 +136,7 @@ private string GetParam(IProperty param) sb.Append("[FromBody] "); } - sb.Append($@"{Config.GetType(param, nonNullable: param.IsRouteParam() || param.IsQueryParam() && !param.Endpoint.IsMultipart && Config.GetValue(param, Classes) != "null")} {param.GetParamName().Verbatim()}"); + sb.Append($@"{Config.GetType(param, nonNullable: param.IsJsonBodyParam() || param.IsRouteParam() || param.IsQueryParam() && !param.Endpoint.IsMultipart && Config.GetValue(param, Classes) != "null")} {param.GetParamName().Verbatim()}"); if (param.IsQueryParam() && !param.Endpoint.IsMultipart) { diff --git a/TopModel.Generator.Csharp/CSharpClassGenerator.cs b/TopModel.Generator.Csharp/CSharpClassGenerator.cs index 4e8f2e73..5b6170cd 100644 --- a/TopModel.Generator.Csharp/CSharpClassGenerator.cs +++ b/TopModel.Generator.Csharp/CSharpClassGenerator.cs @@ -227,7 +227,7 @@ private void GenerateConstProperties(CSharpWriter w, Class item) foreach (var uk in item.UniqueKeys.Where(uk => uk.Count == 1 - && Config.GetType(uk.Single()) == "string" + && Config.GetType(uk.Single())?.TrimEnd('?') == "string" && refValue.Value.ContainsKey(uk.Single()))) { var prop = uk.Single(); @@ -366,7 +366,7 @@ private void GenerateProperty(CSharpWriter w, IProperty property, HashSet().Any(p => p.Required || p.PrimaryKey || Config.GetType(p) == "string" && p.Domain.Length != null)) + if (item.Properties.OfType().Any(p => p.Required || p.PrimaryKey || Config.GetType(p)?.TrimEnd('?') == "string" && p.Domain.Length != null)) { usings.Add("System.ComponentModel.DataAnnotations"); } @@ -546,7 +546,7 @@ private string GetNamespace(Class classe, string tag) { if (property is CompositionProperty cp) { - var type = Config.GetType(property); + var type = Config.GetType(property, nonNullable: true); var genericType = type.Split('<').First(); if (cp.Domain == null) diff --git a/TopModel.Generator.Csharp/CsharpConfig.cs b/TopModel.Generator.Csharp/CsharpConfig.cs index eb9586ad..44c0731d 100644 --- a/TopModel.Generator.Csharp/CsharpConfig.cs +++ b/TopModel.Generator.Csharp/CsharpConfig.cs @@ -12,6 +12,8 @@ namespace TopModel.Generator.Csharp; /// public class CsharpConfig : GeneratorConfigBase { + private readonly string[] _builtInNonNullableTypes = ["bool", "short", "ushort", "int", "uint", "long", "ulong", "double", "float", "decimal", "Guid", "DateTime", "DateOnly", "TimeOnly", "TimeSpan"]; + private string? _referencesModelPath; /// @@ -107,6 +109,23 @@ public class CsharpConfig : GeneratorConfigBase /// public string DomainNamespace { get; set; } = "{app}.Common"; + [YamlMember(Alias = "nonNullableTypes")] + public object? NonNullableTypesParam { get; set; } + + /// + /// Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être). + /// La plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur. + /// Ce paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, + /// soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à <nullable>enable</nullable>). + /// + public IList NonNullableTypes => NonNullableTypesParam switch + { + IEnumerable list => _builtInNonNullableTypes.Concat(list.OfType()).Distinct().ToList(), + _ => _builtInNonNullableTypes + }; + + public bool IsNullableEnabled => NonNullableTypesParam?.Equals(true) ?? false; + /// /// Retire les attributs de colonnes sur les alias. /// @@ -470,7 +489,7 @@ public string GetReturnTypeName(IProperty? prop) return NoAsyncControllers ? "void" : "async Task"; } - var typeName = GetType(prop, nonNullable: (prop as IFieldProperty)?.Required ?? true); + var typeName = GetType(prop, nonNullable: prop.Required); return typeName.StartsWith("IAsyncEnumerable") || NoAsyncControllers ? typeName : $"async Task<{typeName}>"; @@ -480,14 +499,10 @@ public string GetType(IProperty prop, IEnumerable? availableClasses = nul { var type = base.GetType(prop, availableClasses, useClassForAssociation); - if (!nonNullable && prop is IFieldProperty f && GetEnumType(f, f is RegularProperty) == type) + if (!nonNullable && (IsNullableEnabled || NonNullableTypes.Contains(type) || prop is IFieldProperty f && GetEnumType(f, f is RegularProperty) == type)) { type += "?"; } - else if (nonNullable && type.EndsWith("?")) - { - type = type[0..^1]; - } return type; } diff --git a/TopModel.Generator.Csharp/MapperGenerator.cs b/TopModel.Generator.Csharp/MapperGenerator.cs index d772a99e..ff8260a8 100644 --- a/TopModel.Generator.Csharp/MapperGenerator.cs +++ b/TopModel.Generator.Csharp/MapperGenerator.cs @@ -103,8 +103,8 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla } w.WriteLine($"({string.Join(", ", mapper.Params.Select(mp => mp.Match( - c => $"{(c.Class.Abstract ? "I" : string.Empty)}{c.Class.NamePascal} {c.Name}{(!c.Required ? " = null" : string.Empty)}", - p => $"{Config.GetType(p.Property)} {p.Property.NameCamel}{(!mp.GetRequired() ? $" = {Config.GetValue(p.Property, Classes)}" : string.Empty)}")))})"); + c => $"{(c.Class.Abstract ? "I" : string.Empty)}{c.Class.NamePascal}{(!c.Required && Config.IsNullableEnabled ? "?" : string.Empty)} {c.Name}{(!c.Required ? " = null" : string.Empty)}", + p => $"{Config.GetType(p.Property, nonNullable: mp.GetRequired() || Config.GetValue(p.Property, Classes) != "null")} {p.Property.NameCamel}{(!mp.GetRequired() ? $" = {Config.GetValue(p.Property, Classes)}" : string.Empty)}")))})"); if (classe.Abstract) { @@ -113,7 +113,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla w.WriteLine(1, "{"); - foreach (var param in mapper.Params.Where(p => p.GetRequired())) + foreach (var param in mapper.Params.Where(p => p.GetRequired() && (p.IsT0 || !Config.NonNullableTypes.Contains(Config.GetImplementation(p.AsT1.Property.Domain)?.Type ?? string.Empty)))) { w.WriteLine(2, $"ArgumentNullException.ThrowIfNull({param.GetNameCamel()});"); } @@ -237,7 +237,7 @@ protected override void HandleFile(string fileName, string tag, IList<(Class Cla } else { - w.WriteLine(1, $"public static {mapper.Class.NamePascal} {mapper.Name}(this {(classe.Abstract ? "I" : string.Empty)}{classe.NamePascal} source, {mapper.Class.NamePascal} dest = null)"); + w.WriteLine(1, $"public static {mapper.Class.NamePascal} {mapper.Name}(this {(classe.Abstract ? "I" : string.Empty)}{classe.NamePascal} source, {mapper.Class.NamePascal}{(Config.IsNullableEnabled ? "?" : string.Empty)} dest = null)"); } w.WriteLine(1, "{"); diff --git a/TopModel.Generator.Csharp/csharp.config.json b/TopModel.Generator.Csharp/csharp.config.json index 5d4e1387..b545b967 100644 --- a/TopModel.Generator.Csharp/csharp.config.json +++ b/TopModel.Generator.Csharp/csharp.config.json @@ -164,6 +164,22 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ true ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." diff --git a/docs/generator/csharp.md b/docs/generator/csharp.md index 66529749..7d99040b 100644 --- a/docs/generator/csharp.md +++ b/docs/generator/csharp.md @@ -14,6 +14,10 @@ Le générateur C# peut générer les fichiers suivants : Le code généré n'a aucune dépendance externe à part EF Core et Kinetix, et uniquement s'ils sont explicitement demandés dans la configuration. +### Types C# + +Tous les types C# écrits par le générateur doivent être nullables (sauf si le type est utilisé pour un paramètre ou un type de retour obligatoire d'endpoint ou de mapper). C'est le générateur qui va s'occuper d'ajouter un `?` derrière le type si nécessaire, donc en particulier tous les types définis dans les domaines ne doivent pas le renseigner (ce qui n'était pas le cas pour avant la 1.41). Le générateur connaît la plupart des types non-nullables courants (comme `int`, `bool`, `DateTime`), mais il est possible de lui en spécifier d'autre via la propriété `nonNullableTypes`. Enfin, si vous souhaitez utiliser `nullable: enable` en C# pour rendre tous les types non-nullables par défaut, vous pouvez renseigner `nonNullableTypes: true` pour que le code généré soit compatible. + ### Génération des classes Le générateur C# fait peu de différences à la génération entre une classe persistée et non persistée. Seule l'annotation `[Table]` est ajoutée en plus sur une classe persistée, et les annotations `[Column]` sont conservées à moins de les désactiver explicitement sur les alias via le paramètre de config `noColumnOnAlias`. @@ -234,6 +238,14 @@ _(en preview, documentation à venir)_ _Valeur par défaut_: `{app}.Common` +- `nonNullableTypes` + + Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un `?` pour l'être). + + La plupart des types standard comme `int`, `bool` ou `DateTime` sont déjà connus du générateur. + + Ce paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à <nullable>enable</nullable>). + - `noColumnOnAlias` Retire les attributs de colonnes sur les alias (ça ne plaît pas à EF Core mais ça peut être utile pour d'autres ORMs pour mapper directement les colonnes) diff --git a/samples/generators/angular/topmodel.config.schema.json b/samples/generators/angular/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/angular/topmodel.config.schema.json +++ b/samples/generators/angular/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/csharp/topmodel.config.schema.json b/samples/generators/csharp/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/csharp/topmodel.config.schema.json +++ b/samples/generators/csharp/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/database/topmodel.config.schema.json b/samples/generators/database/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/database/topmodel.config.schema.json +++ b/samples/generators/database/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/focus/topmodel.config.schema.json b/samples/generators/focus/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/focus/topmodel.config.schema.json +++ b/samples/generators/focus/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/jpa/topmodel.config.schema.json b/samples/generators/jpa/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/jpa/topmodel.config.schema.json +++ b/samples/generators/jpa/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/open-api/topmodel.config.schema.json b/samples/generators/open-api/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/open-api/topmodel.config.schema.json +++ b/samples/generators/open-api/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/pg/topmodel.config.schema.json b/samples/generators/pg/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/pg/topmodel.config.schema.json +++ b/samples/generators/pg/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/php/topmodel.config.schema.json b/samples/generators/php/topmodel.config.schema.json index 9172a9ea..0437e466 100644 --- a/samples/generators/php/topmodel.config.schema.json +++ b/samples/generators/php/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/ssdt/topmodel.config.schema.json b/samples/generators/ssdt/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/ssdt/topmodel.config.schema.json +++ b/samples/generators/ssdt/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/generators/translation/topmodel.config.schema.json b/samples/generators/translation/topmodel.config.schema.json index 09ebf539..fb73c0cd 100644 --- a/samples/generators/translation/topmodel.config.schema.json +++ b/samples/generators/translation/topmodel.config.schema.json @@ -252,6 +252,24 @@ "type": "string", "description": "Namespace de l'enum de domaine pour Kinetix. Par défaut : '{app}.Common'." }, + "nonNullableTypes": { + "oneOf": [ + { + "type": "boolean", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "enum": [ + true + ] + }, + { + "type": "array", + "description": "Types C# que le générateur doit considérer comme étant non nullables (nécessitant donc l'ajout d'un '?' pour l'être).\r\nLa plupart des types standard comme 'int', 'bool' ou 'DateTime' sont déjà connus du générateur.\r\nCe paramètre permet soit de spécifier une liste de types non-nullables supplémentaires, soit 'true' pour considérer que tous les types sont non-nullables (pour correspondre à enable).", + "items": { + "type": "string" + } + } + ] + }, "noColumnOnAlias": { "type": "boolean", "description": "Retire les attributs de colonnes sur les alias." @@ -276,6 +294,14 @@ "type": "string" } }, + "mapperLocationPriority": { + "type": "string", + "description": "Détermine le type de classe prioritaire pour déterminer la localisation des mappers générés (`persistent` ou `non-persistent`). Par défaut : 'persistent'", + "enum": [ + "persistent", + "non-persistent" + ] + }, "enumsForStaticReferences": { "type": "boolean", "description": "Utilise des enums au lieu de strings pour les PKs de listes de référence statiques." @@ -295,6 +321,10 @@ false, "dtos-only" ] + }, + "usePrimaryConstructors": { + "type": "boolean", + "description": "Utilise les constructeurs principaux pour la génération des classes avec dépendances (clients d'API, accesseurs de références)." } } } diff --git a/samples/model/meta/domain.tmd b/samples/model/meta/domain.tmd index 4e4234d0..2f81a5a5 100644 --- a/samples/model/meta/domain.tmd +++ b/samples/model/meta/domain.tmd @@ -9,7 +9,7 @@ domain: ts: type: boolean csharp: - type: bool? + type: bool java: type: Boolean sql: @@ -60,7 +60,7 @@ domain: ts: type: string csharp: - type: DateOnly? + type: DateOnly java: type: LocalDate imports: @@ -82,7 +82,7 @@ domain: imports: - "./common/utils/today" csharp: - type: DateTime? + type: DateTime values: overrides: now: DateTime.UtcNow @@ -105,7 +105,7 @@ domain: name: DO_DATE_CREATION label: Date de création csharp: - type: DateTime? + type: DateTime values: overrides: now: DateTime.UtcNow @@ -133,7 +133,7 @@ domain: name: DO_DATE_MODIFICATION label: Date de modification csharp: - type: DateTime? + type: DateTime values: overrides: now: DateTime.UtcNow @@ -184,7 +184,7 @@ domain: ts: type: number csharp: - type: long? + type: long java: type: Long sql: @@ -199,7 +199,7 @@ domain: ts: type: number csharp: - type: int? + type: int java: type: Integer sql: