diff --git a/TopModel.Generator.Javascript/GeneratorRegistration.cs b/TopModel.Generator.Javascript/GeneratorRegistration.cs index 4fd12064..ce4e203e 100644 --- a/TopModel.Generator.Javascript/GeneratorRegistration.cs +++ b/TopModel.Generator.Javascript/GeneratorRegistration.cs @@ -37,6 +37,11 @@ public void Register(IServiceCollection services, JavascriptConfig config, int n if (config.ModelRootPath != null) { + if (!config.ModelRootPath.Contains("{module}")) + { + config.ModelRootPath = Path.Combine(config.ModelRootPath, "{module}"); + } + services.AddGenerator(config, number); services.AddGenerator(config, number); @@ -59,6 +64,11 @@ public void Register(IServiceCollection services, JavascriptConfig config, int n if (config.ResourceRootPath != null && (config.TranslateProperties == true || config.TranslateReferences == true)) { + if (!config.ResourceRootPath.Contains("{lang}")) + { + config.ResourceRootPath = Path.Combine(config.ResourceRootPath, "{lang}"); + } + services.AddGenerator(config, number); } } diff --git a/TopModel.Generator.Javascript/JavascriptConfig.cs b/TopModel.Generator.Javascript/JavascriptConfig.cs index 38bf1d96..3b9034d8 100644 --- a/TopModel.Generator.Javascript/JavascriptConfig.cs +++ b/TopModel.Generator.Javascript/JavascriptConfig.cs @@ -11,12 +11,12 @@ namespace TopModel.Generator.Javascript; public class JavascriptConfig : GeneratorConfigBase { /// - /// Localisation du modèle, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré. + /// Localisation du modèle, relative au répertoire de génération. Si non renseigné, aucun modèle ne sera généré. Si '{module}' n'est pas présent dans le chemin, alors il sera ajouté à la fin. /// public string? ModelRootPath { get; set; } /// - /// Localisation des ressources i18n, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré. + /// Localisation des ressources i18n, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré. Si '{lang}' n'est pas présent dans le chemin, alors il sera ajouté à la fin. /// public string? ResourceRootPath { get; set; } @@ -80,24 +80,31 @@ public class JavascriptConfig : GeneratorConfigBase /// public bool GenerateMainResourceFiles { get; set; } - public override string[] PropertiesWithModuleVariableSupport => new[] - { - nameof(ApiClientFilePath) - }; + public override string[] PropertiesWithModuleVariableSupport => + [ + nameof(ModelRootPath), + nameof(ApiClientFilePath), + nameof(ResourceRootPath) + ]; - public override string[] PropertiesWithFileNameVariableSupport => new[] - { + public override string[] PropertiesWithFileNameVariableSupport => + [ nameof(ApiClientFilePath) - }; + ]; - public override string[] PropertiesWithTagVariableSupport => new[] - { + public override string[] PropertiesWithTagVariableSupport => + [ nameof(ModelRootPath), nameof(ResourceRootPath), nameof(ApiClientRootPath), nameof(FetchPath), nameof(DomainPath) - }; + ]; + + public override string[] PropertiesWithLangVariableSupport => + [ + nameof(ResourceRootPath) + ]; protected override bool UseNamedEnums => false; @@ -107,8 +114,7 @@ public virtual string GetClassFileName(Class classe, string tag) { return Path.Combine( OutputDirectory, - ResolveVariables(ModelRootPath!, tag), - classe.Namespace.ModulePathKebab, + ResolveVariables(ModelRootPath!, tag, classe.Namespace.ModulePathKebab), $"{classe.Name.ToKebabCase()}.ts") .Replace("\\", "/"); } @@ -117,8 +123,7 @@ public virtual string GetCommentResourcesFilePath(Namespace ns, string tag, stri { return Path.Combine( OutputDirectory, - ResolveVariables(ResourceRootPath!, tag), - lang, + ResolveVariables(ResourceRootPath!, tag, ns.RootModule.ToKebabCase(), lang), $"{ns.RootModule.ToKebabCase()}.comments{(ResourceMode == ResourceMode.JS ? ".ts" : ".json")}") .Replace("\\", "/"); } @@ -208,7 +213,11 @@ public virtual string GetMainResourceFilePath(string tag, string lang) public virtual string GetReferencesFileName(Namespace ns, string tag) { - return Path.Combine(OutputDirectory, ResolveVariables(ModelRootPath!, tag), ns.ModulePathKebab, "references.ts").Replace("\\", "/"); + return Path.Combine( + OutputDirectory, + ResolveVariables(ModelRootPath!, tag, ns.ModulePathKebab), + "references.ts") + .Replace("\\", "/"); } public virtual string GetRelativePath(string path, string fileName) @@ -222,8 +231,7 @@ public virtual string GetResourcesFilePath(Namespace ns, string tag, string lang { return Path.Combine( OutputDirectory, - ResolveVariables(ResourceRootPath!, tag), - lang, + ResolveVariables(ResourceRootPath!, tag, ns.RootModule.ToKebabCase(), lang), $"{ns.RootModule.ToKebabCase()}{(ResourceMode == ResourceMode.JS ? ".ts" : ".json")}") .Replace("\\", "/"); } diff --git a/TopModel.Generator.Javascript/javascript.config.json b/TopModel.Generator.Javascript/javascript.config.json index 249b3537..f1bb7464 100644 --- a/TopModel.Generator.Javascript/javascript.config.json +++ b/TopModel.Generator.Javascript/javascript.config.json @@ -63,11 +63,11 @@ }, "modelRootPath": { "type": "string", - "description": "Localisation du modèle, relative au répertoire de génération. Si non renseigné, aucun modèle ne sera généré." + "description": "Localisation du modèle, relative au répertoire de génération. Si non renseigné, aucun modèle ne sera généré. Si '{module}' n'est pas présent dans le chemin, alors il sera ajouté à la fin." }, "resourceRootPath": { "type": "string", - "description": "Localisation des ressources i18n, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré" + "description": "Localisation des ressources i18n, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré. Si '{lang}' n'est pas présent dans le chemin, alors il sera ajouté à la fin." }, "apiClientRootPath": { "type": "string", diff --git a/samples/generators/angular/topmodel.config.schema.json b/samples/generators/angular/topmodel.config.schema.json index 6080561e..97c70b09 100644 --- a/samples/generators/angular/topmodel.config.schema.json +++ b/samples/generators/angular/topmodel.config.schema.json @@ -159,11 +159,11 @@ }, "modelRootPath": { "type": "string", - "description": "Localisation du modèle, relative au répertoire de génération. Si non renseigné, aucun modèle ne sera généré." + "description": "Localisation du modèle, relative au répertoire de génération. Si non renseigné, aucun modèle ne sera généré. Si '{module}' n'est pas présent dans le chemin, alors il sera ajouté à la fin." }, "resourceRootPath": { "type": "string", - "description": "Localisation des ressources i18n, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré" + "description": "Localisation des ressources i18n, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré. Si '{lang}' n'est pas présent dans le chemin, alors il sera ajouté à la fin." }, "apiClientRootPath": { "type": "string", diff --git a/samples/generators/focus/topmodel.config.schema.json b/samples/generators/focus/topmodel.config.schema.json index 6080561e..97c70b09 100644 --- a/samples/generators/focus/topmodel.config.schema.json +++ b/samples/generators/focus/topmodel.config.schema.json @@ -159,11 +159,11 @@ }, "modelRootPath": { "type": "string", - "description": "Localisation du modèle, relative au répertoire de génération. Si non renseigné, aucun modèle ne sera généré." + "description": "Localisation du modèle, relative au répertoire de génération. Si non renseigné, aucun modèle ne sera généré. Si '{module}' n'est pas présent dans le chemin, alors il sera ajouté à la fin." }, "resourceRootPath": { "type": "string", - "description": "Localisation des ressources i18n, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré" + "description": "Localisation des ressources i18n, relative au répertoire de génération. Si non renseigné, aucun fichier ne sera généré. Si '{lang}' n'est pas présent dans le chemin, alors il sera ajouté à la fin." }, "apiClientRootPath": { "type": "string", diff --git a/samples/generators/jpa/topmodel.config.schema.json b/samples/generators/jpa/topmodel.config.schema.json index dac5defb..49be12cd 100644 --- a/samples/generators/jpa/topmodel.config.schema.json +++ b/samples/generators/jpa/topmodel.config.schema.json @@ -219,16 +219,17 @@ { "type": "string", "description": "Mode de génération de l'API Client ('Client' ou 'Server')", - "default": "RestClient", + "default": "restClient", "enum": [ - "RestTemplate", - "RestClient" + "RrestTemplate", + "RestClient", + "FeignClient" ] }, { "type": "string", "description": "Mode de génération de l'API ('RestTemplate' ou 'RestClient')", - "default": "RestClient", + "default": "restClient", "pattern": "^\\{[^\\}]+\\}$" } ] diff --git a/samples/model/angular.topmodel.lock b/samples/model/angular.topmodel.lock index 108fb8eb..d9b1a778 100644 --- a/samples/model/angular.topmodel.lock +++ b/samples/model/angular.topmodel.lock @@ -4,7 +4,7 @@ version: 2.2.1 custom: - ../../../TopModel.Generator.Javascript: 571f6c4e09ca0841e5b731496f3dc036 + ../../../TopModel.Generator.Javascript: 427ee5726835e07eed75a535e18ef04c generatedFiles: - ../generators/angular/src/appgenerated/api/securite/profil/profil.service.ts - ../generators/angular/src/appgenerated/api/securite/utilisateur/utilisateur.service.ts diff --git a/samples/model/focus.topmodel.lock b/samples/model/focus.topmodel.lock index fc605fca..d1d304b5 100644 --- a/samples/model/focus.topmodel.lock +++ b/samples/model/focus.topmodel.lock @@ -4,7 +4,7 @@ version: 2.2.1 custom: - ../../../TopModel.Generator.Javascript: 571f6c4e09ca0841e5b731496f3dc036 + ../../../TopModel.Generator.Javascript: 427ee5726835e07eed75a535e18ef04c generatedFiles: - ../generators/focus/src/locale/common.ts - ../generators/focus/src/locale/securite.ts