From 999b8e607017e6a7bf8c80c7a629f3a493569d33 Mon Sep 17 00:00:00 2001 From: Damien Date: Wed, 28 Aug 2024 17:57:53 +0200 Subject: [PATCH] [JS] `extendedCompositions` --- .../JavascriptConfig.cs | 5 ++ .../TypescriptDefinitionGenerator.cs | 75 ++++++++----------- .../javascript.config.json | 12 ++- docs/generator/js.md | 3 + .../securite/utilisateur/utilisateur-item.ts | 2 +- .../securite/utilisateur/utilisateur-read.ts | 4 +- .../securite/utilisateur/utilisateur-write.ts | 4 +- .../angular/topmodel.config.schema.json | 4 + .../csharp/topmodel.config.schema.json | 4 + .../database/topmodel.config.schema.json | 4 + .../securite/utilisateur/utilisateur-item.ts | 2 +- .../securite/utilisateur/utilisateur-read.ts | 4 +- .../securite/utilisateur/utilisateur-write.ts | 4 +- .../focus/topmodel.config.schema.json | 4 + .../jpa/topmodel.config.schema.json | 4 + .../open-api/topmodel.config.schema.json | 4 + .../generators/pg/topmodel.config.schema.json | 4 + .../php/topmodel.config.schema.json | 4 + .../ssdt/topmodel.config.schema.json | 4 + .../translation/topmodel.config.schema.json | 4 + 20 files changed, 98 insertions(+), 57 deletions(-) diff --git a/TopModel.Generator.Javascript/JavascriptConfig.cs b/TopModel.Generator.Javascript/JavascriptConfig.cs index 35867060..bc90985e 100644 --- a/TopModel.Generator.Javascript/JavascriptConfig.cs +++ b/TopModel.Generator.Javascript/JavascriptConfig.cs @@ -50,6 +50,11 @@ public class JavascriptConfig : GeneratorConfigBase /// public EntityMode EntityMode { get; set; } = EntityMode.TYPED; + /// + /// Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées. + /// + public bool ExtendedCompositions { get; set; } + /// /// Chemin (ou alias commençant par '@') vers le fichier 'domain', relatif au répertoire de génération. /// diff --git a/TopModel.Generator.Javascript/TypescriptDefinitionGenerator.cs b/TopModel.Generator.Javascript/TypescriptDefinitionGenerator.cs index c56eb51e..da1002d0 100644 --- a/TopModel.Generator.Javascript/TypescriptDefinitionGenerator.cs +++ b/TopModel.Generator.Javascript/TypescriptDefinitionGenerator.cs @@ -192,6 +192,11 @@ protected override void HandleClass(string fileName, Class classe, string tag) case CompositionProperty cp1 when Config.IsListComposition(cp1) && cp1.Composition.Name == classe.Name: case AliasProperty { Property: CompositionProperty cp2 } when Config.IsListComposition(cp2) && cp2.Composition.Name == classe.Name: fw.Write("\"recursive-list\""); + if (Config.ExtendedCompositions) + { + fw.Write(","); + } + break; case CompositionProperty when Config.IsListComposition(property): case AliasProperty { Property: CompositionProperty } when Config.IsListComposition(property): @@ -211,82 +216,66 @@ protected override void HandleClass(string fileName, Class classe, string tag) _ => null }; - if (cp == null) + if (cp == null || cp.Domain != null && !Config.IsListComposition(cp)) { - fw.WriteLine($" name: \"{property.NameCamel}\","); - fw.WriteLine($" domain: {property.Domain.Name},"); - fw.WriteLine($" isRequired: {(property.Required && !((property.PrimaryKey || property is AliasProperty { AliasedPrimaryKey: true }) && property.Domain.AutoGeneratedValue)).ToString().ToFirstLower()},"); + fw.WriteLine(2, $"name: \"{property.NameCamel}\","); + fw.WriteLine(2, $"domain: {property.Domain.Name},"); var defaultValue = Config.GetValue(property, Classes); if (defaultValue != "undefined") { - fw.WriteLine($" defaultValue: {defaultValue},"); + fw.WriteLine(2, $"defaultValue: {defaultValue},"); + } + } + else if (cp.Composition.Name != classe.Name) + { + fw.Write(2, $"entity: {cp.Composition.NamePascal}Entity"); + + if (Config.ExtendedCompositions) + { + fw.Write(","); } + fw.WriteLine(); + } + + if (cp == null || cp.Domain != null && !Config.IsListComposition(cp) || Config.ExtendedCompositions) + { + fw.WriteLine(2, $"isRequired: {(property.Required && !((property.PrimaryKey || property is AliasProperty { AliasedPrimaryKey: true }) && property.Domain.AutoGeneratedValue)).ToString().ToFirstLower()},"); + if (Config.TranslateProperties == true) { - fw.WriteLine($" label: \"{property.ResourceKey}\"{(Config.GenerateComments ? "," : string.Empty)}"); + fw.WriteLine(2, $"label: \"{property.ResourceKey}\"{(Config.GenerateComments ? "," : string.Empty)}"); } else { - fw.WriteLine($" label: \"{property.Label}\"{(Config.GenerateComments ? "," : string.Empty)}"); + fw.WriteLine(2, $"label: \"{property.Label}\"{(Config.GenerateComments ? "," : string.Empty)}"); } if (Config.GenerateComments) { if (Config.TranslateProperties == true) { - fw.WriteLine($" comment: \"{property.CommentResourceKey}\""); + fw.WriteLine(2, $"comment: \"{property.CommentResourceKey}\""); } else { - fw.WriteLine($" comment: \"{property.Comment}\""); + fw.WriteLine(2, $"comment: \"{property.Comment}\""); } } } - else if (cp.Domain != null && !Config.IsListComposition(cp)) - { - fw.Write(" name: \""); - fw.Write(cp.NameCamel); - fw.Write("\""); - fw.Write(",\r\n domain: "); - fw.Write(cp.Domain.Name); - fw.Write(",\r\n isRequired: true"); - fw.Write(",\r\n label: \""); - if (Config.TranslateProperties == true) - { - fw.Write(classe.Namespace.ModuleCamel); - fw.Write("."); - fw.Write(classe.NameCamel); - fw.Write("."); - fw.Write(property.NameCamel); - } - else - { - fw.Write(property.Label); - } - fw.Write("\"\r\n"); - } - else if (cp.Composition.Name != classe.Name) - { - fw.Write(" entity: "); - fw.Write(cp.Composition.NamePascal); - fw.Write("Entity"); - fw.Write("\r\n"); - } - - fw.Write(" }"); + fw.Write(1, "}"); if (property != classe.Properties.Last()) { fw.Write(","); } - fw.Write("\r\n"); + fw.WriteLine(); } - fw.Write($"}}{(Config.EntityMode == EntityMode.TYPED ? string.Empty : " as const")}\r\n"); + fw.WriteLine($"}}{(Config.EntityMode == EntityMode.TYPED ? string.Empty : " as const")}"); if (classe.Reference) { diff --git a/TopModel.Generator.Javascript/javascript.config.json b/TopModel.Generator.Javascript/javascript.config.json index 9b67ae14..7f1684e7 100644 --- a/TopModel.Generator.Javascript/javascript.config.json +++ b/TopModel.Generator.Javascript/javascript.config.json @@ -91,13 +91,17 @@ "type": "string", "description": "Framework cible pour la génération.", "default": "focus", - "enum": ["angular", "angular_promise", "vanilla", "nuxt"] + "enum": [ "angular", "angular_promise", "vanilla", "nuxt" ] }, "entityMode": { "type": "string", "description": "Framework cible pour la génération.", "default": "typed", - "enum": ["untyped", "typed"] + "enum": [ "untyped", "typed" ] + }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." }, "entityTypesPath": { "type": "string", @@ -107,7 +111,7 @@ "resourceMode": { "type": "string", "description": "Mode de génération (JS, JSON ou JSON Schema).", - "enum": ["js", "json"] + "enum": [ "js", "json" ] }, "translateReferences": { "type": "boolean", @@ -130,7 +134,7 @@ "referenceMode": { "type": "string", "description": "Mode de génération des listes de références (définitions ou valeurs).", - "enum": ["definition", "values"], + "enum": [ "definition", "values" ], "default": "definition" } } diff --git a/docs/generator/js.md b/docs/generator/js.md index dd47d1fe..e66865e0 100644 --- a/docs/generator/js.md +++ b/docs/generator/js.md @@ -21,6 +21,7 @@ exemple : ```yaml fetchPath: "@api-services" ``` + ### ApiFilePath Par défaut, les fichiers d'api client sont placés dans le dossier `{module}`. Ils sont nommés d'après le fichier qui les contient, sauf dans le cas du mode `angular`, où le nom du fichier sera de la forme `{fileName}.service.ts`. @@ -37,6 +38,8 @@ Il est possible de générer les entités selon deux modes (`entityMode`) : `typ Le mode `typed` permet de générer la description des entités métier contenant des types. Ces types sont importés par défaut de `@focus4/stores`, mais ce chemin peut être surchargé avec la propriété `entityTypesPath`. +Vous pouvez également activer l'option `extendedCompositions` pour générer toutes les propriétés sur les compositions (`label`, `isRequired`, `comment`), qui ne sont pas générées par défaut. + #### Untyped Le mode `untyped` permet de générer la description des entités métier en tant que **`const`** non typés. diff --git a/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-item.ts b/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-item.ts index f1fecdcc..64e6e27c 100644 --- a/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-item.ts +++ b/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-item.ts @@ -47,8 +47,8 @@ export const UtilisateurItemEntity = { type: "field", name: "typeUtilisateurCode", domain: DO_CODE, - isRequired: true, defaultValue: "GEST", + isRequired: true, label: "securite.utilisateur.utilisateur.typeUtilisateurCode" } } as const diff --git a/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-read.ts b/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-read.ts index 5697f08b..db3ee138 100644 --- a/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-read.ts +++ b/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-read.ts @@ -67,8 +67,8 @@ export const UtilisateurReadEntity = { type: "field", name: "actif", domain: DO_BOOLEEN, - isRequired: true, defaultValue: true, + isRequired: true, label: "securite.utilisateur.utilisateur.actif" }, profilId: { @@ -82,8 +82,8 @@ export const UtilisateurReadEntity = { type: "field", name: "typeUtilisateurCode", domain: DO_CODE, - isRequired: true, defaultValue: "GEST", + isRequired: true, label: "securite.utilisateur.utilisateur.typeUtilisateurCode" }, dateCreation: { diff --git a/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-write.ts b/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-write.ts index 3fd98bd7..cfeff525 100644 --- a/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-write.ts +++ b/samples/generators/angular/src/appgenerated/model/securite/utilisateur/utilisateur-write.ts @@ -57,8 +57,8 @@ export const UtilisateurWriteEntity = { type: "field", name: "actif", domain: DO_BOOLEEN, - isRequired: true, defaultValue: true, + isRequired: true, label: "securite.utilisateur.utilisateur.actif" }, profilId: { @@ -72,8 +72,8 @@ export const UtilisateurWriteEntity = { type: "field", name: "typeUtilisateurCode", domain: DO_CODE, - isRequired: true, defaultValue: "GEST", + isRequired: true, label: "securite.utilisateur.utilisateur.typeUtilisateurCode" } } as const diff --git a/samples/generators/angular/topmodel.config.schema.json b/samples/generators/angular/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/angular/topmodel.config.schema.json +++ b/samples/generators/angular/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/csharp/topmodel.config.schema.json b/samples/generators/csharp/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/csharp/topmodel.config.schema.json +++ b/samples/generators/csharp/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/database/topmodel.config.schema.json b/samples/generators/database/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/database/topmodel.config.schema.json +++ b/samples/generators/database/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/focus/src/model/securite/utilisateur/utilisateur-item.ts b/samples/generators/focus/src/model/securite/utilisateur/utilisateur-item.ts index ce3a0d80..0d42e7ac 100644 --- a/samples/generators/focus/src/model/securite/utilisateur/utilisateur-item.ts +++ b/samples/generators/focus/src/model/securite/utilisateur/utilisateur-item.ts @@ -49,8 +49,8 @@ export const UtilisateurItemEntity: UtilisateurItemEntityType = { type: "field", name: "typeUtilisateurCode", domain: DO_CODE, - isRequired: true, defaultValue: "GEST", + isRequired: true, label: "securite.utilisateur.utilisateur.typeUtilisateurCode" } } diff --git a/samples/generators/focus/src/model/securite/utilisateur/utilisateur-read.ts b/samples/generators/focus/src/model/securite/utilisateur/utilisateur-read.ts index e49d553f..72f0c906 100644 --- a/samples/generators/focus/src/model/securite/utilisateur/utilisateur-read.ts +++ b/samples/generators/focus/src/model/securite/utilisateur/utilisateur-read.ts @@ -69,8 +69,8 @@ export const UtilisateurReadEntity: UtilisateurReadEntityType = { type: "field", name: "actif", domain: DO_BOOLEEN, - isRequired: true, defaultValue: true, + isRequired: true, label: "securite.utilisateur.utilisateur.actif" }, profilId: { @@ -84,8 +84,8 @@ export const UtilisateurReadEntity: UtilisateurReadEntityType = { type: "field", name: "typeUtilisateurCode", domain: DO_CODE, - isRequired: true, defaultValue: "GEST", + isRequired: true, label: "securite.utilisateur.utilisateur.typeUtilisateurCode" }, dateCreation: { diff --git a/samples/generators/focus/src/model/securite/utilisateur/utilisateur-write.ts b/samples/generators/focus/src/model/securite/utilisateur/utilisateur-write.ts index e59fb007..d90f98e4 100644 --- a/samples/generators/focus/src/model/securite/utilisateur/utilisateur-write.ts +++ b/samples/generators/focus/src/model/securite/utilisateur/utilisateur-write.ts @@ -59,8 +59,8 @@ export const UtilisateurWriteEntity: UtilisateurWriteEntityType = { type: "field", name: "actif", domain: DO_BOOLEEN, - isRequired: true, defaultValue: true, + isRequired: true, label: "securite.utilisateur.utilisateur.actif" }, profilId: { @@ -74,8 +74,8 @@ export const UtilisateurWriteEntity: UtilisateurWriteEntityType = { type: "field", name: "typeUtilisateurCode", domain: DO_CODE, - isRequired: true, defaultValue: "GEST", + isRequired: true, label: "securite.utilisateur.utilisateur.typeUtilisateurCode" } } diff --git a/samples/generators/focus/topmodel.config.schema.json b/samples/generators/focus/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/focus/topmodel.config.schema.json +++ b/samples/generators/focus/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/jpa/topmodel.config.schema.json b/samples/generators/jpa/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/jpa/topmodel.config.schema.json +++ b/samples/generators/jpa/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/open-api/topmodel.config.schema.json b/samples/generators/open-api/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/open-api/topmodel.config.schema.json +++ b/samples/generators/open-api/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/pg/topmodel.config.schema.json b/samples/generators/pg/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/pg/topmodel.config.schema.json +++ b/samples/generators/pg/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/php/topmodel.config.schema.json b/samples/generators/php/topmodel.config.schema.json index 8b7a1a58..65953ee2 100644 --- a/samples/generators/php/topmodel.config.schema.json +++ b/samples/generators/php/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/ssdt/topmodel.config.schema.json b/samples/generators/ssdt/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/ssdt/topmodel.config.schema.json +++ b/samples/generators/ssdt/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités", diff --git a/samples/generators/translation/topmodel.config.schema.json b/samples/generators/translation/topmodel.config.schema.json index c96a4298..7dcf64b3 100644 --- a/samples/generators/translation/topmodel.config.schema.json +++ b/samples/generators/translation/topmodel.config.schema.json @@ -464,6 +464,10 @@ "typed" ] }, + "extendedCompositions": { + "type": "boolean", + "description": "Génère `isRequired`, `label` (et `comment`) sur les compositions dans les entitées typées." + }, "entityTypesPath": { "type": "string", "description": "Chemin d'import des type d'entités",