From 54de2def1f5f4f5fc62b8cc72045ebc9b2fa1b58 Mon Sep 17 00:00:00 2001 From: MattMo Date: Fri, 17 Oct 2025 16:02:45 -0700 Subject: [PATCH] Fixed bugs and improved named parameter documentation for the javascript client generator. Package version is now 1.9.3 --- Rest.Net.Example/Program.cs | 2 +- Rest.Net/Rest.Net.csproj | 2 +- Rest.Net/RestJavascriptClientGenerator.cs | 46 +++++++++++++---------- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/Rest.Net.Example/Program.cs b/Rest.Net.Example/Program.cs index a08fad6..30997a8 100644 --- a/Rest.Net.Example/Program.cs +++ b/Rest.Net.Example/Program.cs @@ -103,7 +103,7 @@ namespace MontoyaTech.Rest.Net.Example File.WriteAllText("StaticClient.cs", listener.GenerateCSharpClient("StaticClient", staticCode: true)); - File.WriteAllText("StaticClient.js", listener.GenerateJavascriptClient("StaticClient", staticCode: true, useJsonNames: true, namedParameters: true)); + File.WriteAllText("StaticClient.js", listener.GenerateJavascriptClient("StaticClient", staticCode: true, useJsonNames: true, namedParameters: true, namedParameterMin: 1)); Console.WriteLine("Generated Client.cs, Client.js, StaticClient.cs, StaticClient.js"); diff --git a/Rest.Net/Rest.Net.csproj b/Rest.Net/Rest.Net.csproj index 15d02b1..f56033e 100644 --- a/Rest.Net/Rest.Net.csproj +++ b/Rest.Net/Rest.Net.csproj @@ -17,7 +17,7 @@ MontoyaTech.Rest.Net MontoyaTech.Rest.Net True - 1.9.2 + 1.9.3 Logo_Symbol_Black_Outline.png README.md diff --git a/Rest.Net/RestJavascriptClientGenerator.cs b/Rest.Net/RestJavascriptClientGenerator.cs index 3256d89..5c58afb 100644 --- a/Rest.Net/RestJavascriptClientGenerator.cs +++ b/Rest.Net/RestJavascriptClientGenerator.cs @@ -80,9 +80,10 @@ namespace MontoyaTech.Rest.Net { writer.WriteBreak().WriteLine("/**").Indent(); writer.WriteLine("Initializes this api client with a given baseUrl of where to send requests."); - writer.WriteLine("@param {string} baseUrl Base url of the server to make requests against."); - writer.WriteLine("@param {Function} urlHandler An optional function to process request urls before they are sent. This must return the url. Default is null."); - writer.WriteLine("@param {Function} requestHandler An optional function to process requests before they are sent. This must return the request. Default is null."); + writer.WriteLineAssert(this.NamedParameters, "@param {Object} params"); + writer.WriteLine($"@param {{string}} {(this.NamedParameters ? "params." : "")}baseUrl Base url of the server to make requests against."); + writer.WriteLine($"@param {{Function}} {(this.NamedParameters ? "params." : "")}urlHandler An optional function to process request urls before they are sent. This must return the url. Default is null."); + writer.WriteLine($"@param {{Function}} {(this.NamedParameters ? "params." : "")}requestHandler An optional function to process requests before they are sent. This must return the request. Default is null."); writer.Outdent().WriteLine("*/"); if (this.NamedParameters) writer.Write("static Init({ baseUrl, urlHandler = null, requestHandler = null } = {}) "); @@ -115,9 +116,10 @@ namespace MontoyaTech.Rest.Net { writer.WriteBreak().WriteLine("/**").Indent(); writer.WriteLine("Initializes this api client with a given baseUrl of where to send requests."); - writer.WriteLine("@param {string} baseUrl Base url of the server to make requests against."); - writer.WriteLine("@param {Function} urlHandler An optional function to process request urls before they are sent. This must return the url. Default is null."); - writer.WriteLine("@param {Function} requestHandler An optional function to process requests before they are sent. This must return the request. Default is null."); + writer.WriteLineAssert(this.NamedParameters, "@param {Object} params"); + writer.WriteLine($"@param {{string}} {(this.NamedParameters ? "params." : "")}baseUrl Base url of the server to make requests against."); + writer.WriteLine($"@param {{Function}} {(this.NamedParameters ? "params." : "")}urlHandler An optional function to process request urls before they are sent. This must return the url. Default is null."); + writer.WriteLine($"@param {{Function}} {(this.NamedParameters ? "params." : "")}requestHandler An optional function to process requests before they are sent. This must return the request. Default is null."); writer.Outdent().WriteLine("*/"); if (this.NamedParameters) writer.Write("constructor({ baseUrl, urlHandler = null, requestHandler = null } = {}) "); @@ -366,13 +368,18 @@ namespace MontoyaTech.Rest.Net writer.WriteBreak().WriteLine("/**").Indent(); writer.WriteLine("@function"); - //Docuemnt the fields + var parameterCount = fields.Length + properties.Length; + var namedParameters = this.NamedParameters && parameterCount > this.NamedParameterMin; + + writer.WriteLineAssert(namedParameters, "@param {Object} params"); + + //Document the fields foreach (var field in fields) { if (this.UseJsonNames) - writer.Write($"@param {{{this.GetTypeFullyResolvedName(field.FieldType)}}} {EscapeName(field.GetCustomAttribute()?.PropertyName ?? field.Name)}"); + writer.Write($"@param {{{this.GetTypeFullyResolvedName(field.FieldType)}}} {(namedParameters ? "params." : "")}{EscapeName(field.GetCustomAttribute()?.PropertyName ?? field.Name)}"); else - writer.Write($"@param {{{this.GetTypeFullyResolvedName(field.FieldType)}}} {EscapeName(field.Name)}"); + writer.Write($"@param {{{this.GetTypeFullyResolvedName(field.FieldType)}}} {(namedParameters ? "params." : "")}{EscapeName(field.Name)}"); writer.WriteSpacer().Write("Default is ").Write(this.GetTypeDefaultValue(field.FieldType)).WriteLine('.'); } @@ -381,9 +388,9 @@ namespace MontoyaTech.Rest.Net foreach (var property in properties) { if (this.UseJsonNames) - writer.Write($"@param {{{this.GetTypeFullyResolvedName(property.PropertyType)}}} {EscapeName(property.GetCustomAttribute()?.PropertyName ?? property.Name)}"); + writer.Write($"@param {{{this.GetTypeFullyResolvedName(property.PropertyType)}}} {(namedParameters ? "params." : "")}{EscapeName(property.GetCustomAttribute()?.PropertyName ?? property.Name)}"); else - writer.Write($"@param {{{this.GetTypeFullyResolvedName(property.PropertyType)}}} {EscapeName(property.Name)}"); + writer.Write($"@param {{{this.GetTypeFullyResolvedName(property.PropertyType)}}} {(namedParameters ? "params." : "")}{EscapeName(property.Name)}"); writer.WriteSpacer().Write("Default is ").Write(this.GetTypeDefaultValue(property.PropertyType)).WriteLine('.'); } @@ -391,9 +398,7 @@ namespace MontoyaTech.Rest.Net writer.Outdent().WriteLine("*/"); writer.Write("constructor("); - var parameterCount = fields.Length + properties.Length; - - writer.WriteAssert(this.UseJsonNames && parameterCount > this.NamedParameterMin, "{ "); + writer.WriteAssert(namedParameters, "{ "); //Write the default fields foreach (var field in fields) @@ -413,7 +418,7 @@ namespace MontoyaTech.Rest.Net writer.WriteSeparator().Write(EscapeName(property.Name)).Write(" = ").Write(this.GetTypeDefaultValue(property.PropertyType)); } - writer.WriteAssert(this.UseJsonNames && parameterCount > this.NamedParameterMin, " } = {}"); + writer.WriteAssert(namedParameters, " } = {}"); writer.WriteLine(") {").Indent(); //Init the default fields @@ -647,14 +652,19 @@ namespace MontoyaTech.Rest.Net writer.WriteLine("@async"); writer.WriteLine($"@name {(routeName == null ? methodInfo.Name : routeName.Name)}"); + int parameterCount = (parameters.Length - 1) + (routeRequest != null ? 1 : 0) + (routeResponse != null && routeResponse.Parameter ? 1 : 0); + var namedParameters = this.NamedParameters && parameterCount > this.NamedParameterMin; + + writer.WriteLineAssert(namedParameters, "@param {Object} params"); + //Generate parameter docs if (parameters != null) for (int i = 1; i < parameters.Length; i++) - writer.WriteLine($"@param {{{this.GetTypeFullyResolvedName(parameters[i].ParameterType)}}} {parameters[i].Name}"); + writer.WriteLine($"@param {{{this.GetTypeFullyResolvedName(parameters[i].ParameterType)}}} {(namedParameters ? "params." : "")}{parameters[i].Name}"); //Generate request doc if any if (routeRequest != null) - writer.WriteLine($"@param {{{(routeRequest.Dynamic ? "Any" : this.GetTypeFullyResolvedName(routeRequest.RequestType))}}} body"); + writer.WriteLine($"@param {{{(routeRequest.Dynamic ? "Any" : this.GetTypeFullyResolvedName(routeRequest.RequestType))}}} {(namedParameters ? "params." : "")}body"); //Generate response doc if any if (routeResponse != null) @@ -670,8 +680,6 @@ namespace MontoyaTech.Rest.Net else writer.Write($"async {(routeName == null ? methodInfo.Name : routeName.Name)}("); - int parameterCount = (parameters.Length - 1) + (routeRequest != null ? 1 : 0) + (routeResponse != null && routeResponse.Parameter ? 1 : 0); - writer.WriteAssert(this.NamedParameters && parameterCount > this.NamedParameterMin, "{ "); //Generate the functions parameters, skip the default context parameter.