swagger-typescript-api icon indicating copy to clipboard operation
swagger-typescript-api copied to clipboard

API client with discriminators is generated incorrectly

Open fastndead opened this issue 1 year ago • 0 comments

Hi, here's an example schema:

Example schema

openapi: 3.0.1
info:
title: Example API
version: v1
paths:
/pet:
  post:
    summary: Create pet
    requestBody:
      content:
        application/json:
          schema:
            type: object
            required:
              - data
            properties:
              data:
                type: object
                required:
                  - type
                  - payload
                discriminator:
                  propertyName: type
                  mapping:
                    CAT: '#/components/schemas/cat'
                    DOG: '#/components/schemas/dog'
                properties:
                  type:
                    $ref: '#/components/schemas/pet_kind'
                  payload:
                    type: object
                    oneOf:
                      - $ref: '#/components/schemas/cat'
                      - $ref: '#/components/schemas/dog'
    responses:
      '204':
        description: all good!

components:
schemas:
  cat:
    type: object
    properties:
      name:
        type: string
      breed:
        type: string
  dog:
    type: object
    properties:
      name:
        type: string
      breed:
        type: string
  pet_kind:
    type: string
    description: type of animal
    enum: [CAT, DOG]

it's a pretty simple schema with discriminator on the property type that determines the payload object. There's an enumb called pet_kind which has two options CAT and DOG.

Expected behaviour

It's expected, that the pet_kind enum would be generated as PetKind in the data definition section and would be referenced in the API client.

Actual begaviour

The pet_kind enum is generated correctly in the data definition secion:

/** type of animal */
export enum PetKind {
  CAT = "CAT",
  DOG = "DOG",
}

but is not referenced correctly in the API client, it is referenced as pet_kind which gives runtime and type errors:

    postPet: (
      data: {
        data: BaseNull & (BaseNullTypeMapping<pet_kind.CAT, Cat> | BaseNullTypeMapping<pet_kind.DOG, Dog>);
      },
      params: RequestParams = {},
    ) =>
      this.request<void, any>({
        path: `/pet`,
        method: "POST",
        body: data,
        type: ContentType.Json,
        ...params,
      }),
  };
}

fastndead avatar Feb 22 '24 10:02 fastndead