kubb-labs / kubb

The ultimate toolkit for working with APIs.
https://kubb.dev
MIT License
643 stars 47 forks source link

Support discriminators #1121

Open vitorcamachoo opened 1 month ago

vitorcamachoo commented 1 month ago

What is the problem this feature would solve?

Our API is using the discriminators feature from the open API and Kubb does not support that making a possible migration to this tool impossible. Supporting discriminators would be really useful for the community. https://swagger.io/docs/specification/data-models/inheritance-and-polymorphism/

External documents/projects?

No response

What is the feature you are proposing to solve the problem?

No response

What alternatives have you considered?

No response

helt commented 3 weeks ago

@vitorcamachoo can you provide details where the current behavior of kubb is not as you expected? Ideally with a minimal schema that replicates the issue(s)?

vitorcamachoo commented 2 weeks ago

For the following schema:

---
openapi: 3.0.3
components:
  schemas:
    IssueEventParameters:
      type: object
      anyOf:
        - '$ref': '#/components/schemas/IssueEventParametersAcceptAssignment'
        - '$ref': '#/components/schemas/IssueEventParametersAddApprover'
        - '$ref': '#/components/schemas/IssueEventParametersAddTeam'
      discriminator:
        propertyName: eventType
        mapping:
          accept_assignment: '#/components/schemas/IssueEventParametersAcceptAssignment'
          add_approver: '#/components/schemas/IssueEventParametersAddApprover'
          add_team: '#/components/schemas/IssueEventParametersAddTeam'          

With the current Kubb version, it is being generated the following code:

import { IssueEventParametersAcceptAssignmentSchema } from './issueEventParametersAcceptAssignmentSchema';
import { IssueEventParametersAddApproverSchema } from './issueEventParametersAddApproverSchema';
import { IssueEventParametersAddTeamSchema } from './issueEventParametersAddTeamSchema';

export type IssueEventParametersSchema =
  | IssueEventParametersAcceptAssignmentSchema
  | IssueEventParametersAddApproverSchema
  | IssueEventParametersAddTeamSchema;
file: issueEventParametersAcceptAssignmentSchema

export type IssueEventParametersAcceptAssignmentSchema = {
  /**
   * @type object
   */
  parameters: {
    /**
     * @type string | undefined, uuid
     */
    issueAssignmentId?: string;
  };
};

The expectation of this last piece of code should be the following (it is missing the eventType property):

(generated by Orval)
import type { IssueEventParametersAcceptAssignmentSchemaEventType } from './issueEventParametersAcceptAssignmentSchemaEventType';
import type { IssueEventParametersAcceptAssignmentSchemaParameters } from './issueEventParametersAcceptAssignmentSchemaParameters';

export interface IssueEventParametersAcceptAssignmentSchema {
  eventType: IssueEventParametersAcceptAssignmentSchemaEventType;
  parameters: IssueEventParametersAcceptAssignmentSchemaParameters;
}