Skip to content

Commit

Permalink
[TS] Add AbortSignal to fetch template (#3101)
Browse files Browse the repository at this point in the history
* Add support for AbortSignal in fetch template

* Update FetchClient.liquid

* hide AbortSignal support in fetch template behind config

Add UseAbortSignal (false by default) setting to enable
abortable fetch support

Co-authored-by: Rico Suter <mail@rsuter.com>
  • Loading branch information
nulladdict and RicoSuter authored Nov 11, 2020
1 parent 6f2b449 commit 087a632
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 1 deletion.
48 changes: 48 additions & 0 deletions src/NSwag.CodeGeneration.TypeScript.Tests/FetchTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,5 +105,53 @@ public async Task When_consumes_is_url_encoded_then_construct_url_encoded_reques
Assert.DoesNotContain("FormData", code);
Assert.Contains("\"Content-Type\": \"application/x-www-form-urlencoded\"", code);
}

[Fact]
public async Task When_abort_signal()
{
//// Arrange
var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
var document = await generator.GenerateForControllerAsync<UrlEncodedRequestConsumingController>();
var json = document.ToJson();

//// Act
var codeGen = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings
{
Template = TypeScriptTemplate.Fetch,
UseAbortSignal = true,
TypeScriptGeneratorSettings =
{
TypeScriptVersion = 2.7m
}
});
var code = codeGen.GenerateFile();

//// Assert
Assert.Contains("signal?: AbortSignal | undefined", code);
}

[Fact]
public async Task When_no_abort_signal()
{
//// Arrange
var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings());
var document = await generator.GenerateForControllerAsync<UrlEncodedRequestConsumingController>();
var json = document.ToJson();

//// Act
var codeGen = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings
{
Template = TypeScriptTemplate.Fetch,
TypeScriptGeneratorSettings =
{
TypeScriptVersion = 2.0m
}
});
var code = codeGen.GenerateFile();

//// Assert
Assert.DoesNotContain("signal?: AbortSignal | undefined", code);
Assert.DoesNotContain("signal", code);;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,5 +116,8 @@ public TypeScriptClientTemplateModel(

/// <summary>Gets whether the export keyword should be added to all classes and enums.</summary>
public bool ExportTypes => _settings.TypeScriptGeneratorSettings.ExportTypes;

/// <summary>Gets a value indicating whether to use the AbortSignal (Fetch template only, default: false).</summary>
public bool UseAbortSignal => _settings.UseAbortSignal;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
{% for operation in Operations -%}

{% template Client.Method.Documentation %}
{{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}): Promise<{{ operation.ResultType }}> {
{{ operation.MethodAccessModifier }}{{ operation.ActualOperationName }}({% for parameter in operation.Parameters %}{{ parameter.VariableName }}{% if GenerateOptionalParameters and parameter.IsOptional %}?{% endif %}: {{ parameter.Type }}{{ parameter.TypePostfix }}{% if parameter.IsLast == false %}, {% endif %}{% endfor %}{% if UseAbortSignal %}{% if operation.Parameters.size > 0 %}, {% endif %}signal?: AbortSignal | undefined{% endif %}): Promise<{{ operation.ResultType }}> {
{% template Client.RequestUrl %}

{% if operation.HasBody -%}
Expand All @@ -47,6 +47,9 @@
body: content_,
{% endif -%}
method: "{{ operation.HttpMethodUpper | upcase }}",
{% if UseAbortSignal -%}
signal,
{% endif -%}
headers: {
{% for parameter in operation.HeaderParameters -%}
"{{ parameter.Name }}": {{ parameter.VariableName }} !== undefined && {{ parameter.VariableName }} !== null ? "" + {{ parameter.VariableName }} : "",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ public TypeScriptClientGeneratorSettings()
/// <summary>Gets or sets the name of the exception class (default 'ApiException').</summary>
public string ExceptionClass { get; set; }

/// <summary>Gets or sets a value indicating whether to use the AbortSignal (Fetch template only, default: false).</summary>
public bool UseAbortSignal { get; set; } = false;

// TODO: Angular specific => move

/// <summary>Gets or sets the HTTP service class (applies only for the Angular template, default: HttpClient).</summary>
Expand Down

0 comments on commit 087a632

Please sign in to comment.