RicoSuter / NSwag

The Swagger/OpenAPI toolchain for .NET, ASP.NET Core and TypeScript.
http://NSwag.org
MIT License
6.73k stars 1.29k forks source link

In NSwag.MSBuild version 14.0.3, the ignoredParameterNames parameter stopped working when creating contracts for records. #4797

Open SavkinIvan opened 7 months ago

SavkinIvan commented 7 months ago

In version 13.18.2 with this config

 "codeGenerators": {
    "openApiToTypeScriptClient": {
      "className": "{controller}Client",
      "moduleName": "",
      "namespace": "",
      "typeScriptVersion": 3.9,
      "template": "Fetch",
      "promiseType": "Promise",
      "httpClass": "HttpClient",
      "withCredentials": false,
      "useSingletonProvider": false,
      "injectionTokenType": "OpaqueToken",
      "rxJsVersion": 6.0,
      "dateTimeType": "Date",
      "nullValue": "Undefined",
      "generateClientClasses": true,
      "generateClientInterfaces": true,
      "generateOptionalParameters": true,
      "exportTypes": true,
      "wrapDtoExceptions": false,
      "exceptionClass": "SwaggerException",
      "clientBaseClass": "OidcAuthBase",
      "wrapResponses": false,
      "wrapResponseMethods": [],
      "generateResponseClasses": true,
      "responseClass": "SwaggerResponse",
      "protectedMethods": [],
      "configurationClass": null,
      "useTransformOptionsMethod": true,
      "useTransformResultMethod": false,
      "generateDtoTypes": true,
      "operationGenerationMode": "MultipleClientsFromOperationId",
      "markOptionalProperties": true,
      "generateCloneMethod": true,
      "typeStyle": "Class",
      "enumStyle": "Enum",
      "useLeafType": false,
      "classTypes": [],
      "extendedClasses": [],
      "extensionCode": "ui/src/api-client/oidc-auth-base.nswag",
      "generateDefaultValues": true,
      "excludedTypeNames": [],
      "excludedParameterNames": [
        "equalityContract",
        "equalityContractQuery"
      ],
      "handleReferences": false,
      "generateTypeCheckFunctions": false,
      "generateConstructorInterface": true,
      "convertConstructorInterfaceData": false,
      "importRequiredTypes": true,
      "useGetBaseUrlMethod": false,
      "baseUrlTokenName": "API_BASE_URL",
      "queryNullValue": "",
      "useAbortSignal": false,
      "inlineNamedDictionaries": false,
      "inlineNamedAny": false,
      "includeHttpContext": false,
      "templateDirectory": null,
      "typeNameGeneratorType": null,
      "propertyNameGeneratorType": null,
      "enumNameGeneratorType": null,
      "serviceHost": null,
      "serviceSchemes": null,
      "output": "ui/src/api-client/api-client.ts",
      "newLineBehavior": "Auto"
    }

for record

public sealed record AppCompatibility(int AppId, int? CompatibleAppid);

I received an expected contract for ts, without equalityContract parameter

export class AppCompatibility implements IAppCompatibility {
    appId!: number;
    compatibleAppid?: number | undefined;

    constructor(data?: IAppCompatibility) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.appId = _data["appId"];
            this.compatibleAppid = _data["compatibleAppid"];
        }
    }

    static fromJS(data: any): AppCompatibility {
        data = typeof data === 'object' ? data : {};
        let result = new AppCompatibility();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["appId"] = this.appId;
        data["compatibleAppid"] = this.compatibleAppid;
        return data;
    }

    clone(): AppCompatibility {
        const json = this.toJSON();
        let result = new AppCompatibility();
        result.init(json);
        return result;
    }
}

export interface IAppCompatibility {
    appId: number;
    compatibleAppid?: number | undefined;
}

In the new version 14.0.3, despite the specified excludedParameterNames, I still get equalityContract in the generated contract, why?

export class AppCompatibility implements IAppCompatibility {
    equalityContract!: string;
    appId!: number;
    compatibleAppid?: number | undefined;

    constructor(data?: IAppCompatibility) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (<any>this)[property] = (<any>data)[property];
            }
        }
    }

    init(_data?: any) {
        if (_data) {
            this.equalityContract = _data["equalityContract"];
            this.appId = _data["appId"];
            this.compatibleAppid = _data["compatibleAppid"];
        }
    }

    static fromJS(data: any): AppCompatibility {
        data = typeof data === 'object' ? data : {};
        let result = new AppCompatibility();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["equalityContract"] = this.equalityContract;
        data["appId"] = this.appId;
        data["compatibleAppid"] = this.compatibleAppid;
        return data;
    }

    clone(): AppCompatibility {
        const json = this.toJSON();
        let result = new AppCompatibility();
        result.init(json);
        return result;
    }
}

export interface IAppCompatibility {
    equalityContract: string;
    appId: number;
    compatibleAppid?: number | undefined;
}
Madajevas commented 1 month ago

Just had this issue. For me it worked with parameter names as those are specified in open API json file. So to exclude something like:

"paths": {
  "/some/path": {
    "post": {
      // ...
      "parameters": [
        { "name": "X-EXCLUDE-ME", "in": "header", ... }
      ]
    }
  }
}

had to specify "X-EXCLUDE-ME" in config instead of generated parameter name (x_EXCLUDE_ME).

P.S. with configuration in .csproj it would look like so:

<ItemGroup>
  <OpenApiReference Include="api.json" CodeGenerator="NSwagCSharp" ClassName="ApiClient">
    <OutputPath>API.g.cs</OutputPath>
    <Options>/JsonLibrary:SystemTextJson /OperationGenerationMode:SingleClientFromPathSegments /ExcludedParameterNames:X-EXCLUDE-ME,X-SOMETHING-ELSE</Options>
  </OpenApiReference>
</ItemGroup>