We are using NSwag to generate a TypeScript Client from our .NET API swagger.json. Our API allows for Date inputs from users.
Consider this example dto from the API:
public class CreateCustomDatesRequestDto
{
public DateTime UserDateOnlyField { get; set; }
public DateTime UserDateTimeField { get; set; }
public DateTimeOffset UserDateTimeOffsetField { get; set; }
}
Here is an example of the TypeScript generated using a dateTimeType
of "Date":
export class CreateCustomDatesRequestDto implements ICreateCustomDatesRequestDto {
userDateOnlyField!: Date;
userDateTimeField!: Date;
userDateTimeOffsetField!: Date;
...
init(_data?: any) {
if (_data) {
this.userDateOnlyField = _data["userDateOnlyField"] ? new Date(_data["userDateOnlyField"].toString()) : <any>undefined;
this.userDateTimeField = _data["userDateTimeField"] ? new Date(_data["userDateTimeField"].toString()) : <any>undefined;
this.userDateTimeOffsetField = _data["userDateTimeOffsetField"] ? new Date(_data["userDateTimeOffsetField"].toString()) : <any>undefined;
}
}
...
toJSON(data?: any) {
data = typeof data === 'object' ? data : {};
data["userDateOnlyField"] = this.userDateOnlyField ? this.userDateOnlyField.toISOString() : <any>undefined;
data["userDateTimeField"] = this.userDateTimeField ? this.userDateTimeField.toISOString() : <any>undefined;
data["userDateTimeOffsetField"] = this.userDateTimeOffsetField ? this.userDateTimeOffsetField.toISOString() : <any>undefined;
return data;
}
}
toISOString
returns the Date values at zero UTC offset. Our system has the requirement to accept both Date-only and DateTime inputs matching the user's local time with no timezone information, as well as DateTime inputs that capture the user's local timezone. We can achieve this in JavaScript by writing custom toUserDateString()
, toUserDateTimeString()
and toUserDateTimeOffsetString()
functions. What I would like to know is if it is possible to specify the NSwag toJSON conversion for a Date at the property level to use one of the custom functions without having to manually edit the generated Client.ts file? i.e. ideally the TypeScript generated would be as follows:
export class CreateCustomDatesRequestDto implements ICreateCustomDatesRequestDto {
userDateOnlyField!: Date;
userDateTimeField!: Date;
userDateTimeOffsetField!: Date;
...
init(_data?: any) {
if (_data) {
this.userDateOnlyField = _data["userDateOnlyField"] ? new Date(_data["userDateOnlyField"].toString()) : <any>undefined;
this.userDateTimeField = _data["userDateTimeField"] ? new Date(_data["userDateTimeField"].toString()) : <any>undefined;
this.userDateTimeOffsetField = _data["userDateTimeOffsetField"] ? new Date(_data["userDateTimeOffsetField"].toString()) : <any>undefined;
}
}
...
toJSON(data?: any) {
data = typeof data === 'object' ? data : {};
data["userDateOnlyField"] = this.userDateOnlyField ? this.userDateOnlyField.toUserDateString() : <any>undefined;
data["userDateTimeField"] = this.userDateTimeField ? this.userDateTimeField.toUserDateTimeString() : <any>undefined;
data["userDateTimeOffsetField"] = this.userDateTimeOffsetField ? this.userDateTimeOffsetField.toUserDateTimeOffsetString() : <any>undefined;
return data;
}
}
I would like to avoid having to override Date.prototype.toISOString()
.