diff --git a/modules/openapi-generator/src/main/resources/typescript-fetch/modelOneOf.mustache b/modules/openapi-generator/src/main/resources/typescript-fetch/modelOneOf.mustache index 721f0fc7b76..1d35933047a 100644 --- a/modules/openapi-generator/src/main/resources/typescript-fetch/modelOneOf.mustache +++ b/modules/openapi-generator/src/main/resources/typescript-fetch/modelOneOf.mustache @@ -1,5 +1,5 @@ {{#hasImports}} -{{#imports}} +{{#oneOfArrays}} import type { {{{.}}} } from './{{.}}{{importFileExtension}}'; import { instanceOf{{{.}}}, @@ -7,7 +7,16 @@ import { {{{.}}}FromJSONTyped, {{{.}}}ToJSON, } from './{{.}}{{importFileExtension}}'; -{{/imports}} +{{/oneOfArrays}} +{{#oneOfModels}} +import type { {{{.}}} } from './{{.}}{{importFileExtension}}'; +import { + instanceOf{{{.}}}, + {{{.}}}FromJSON, + {{{.}}}FromJSONTyped, + {{{.}}}ToJSON, +} from './{{.}}{{importFileExtension}}'; +{{/oneOfModels}} {{/hasImports}} {{>modelOneOfInterfaces}} diff --git a/modules/openapi-generator/src/test/resources/3_0/typescript-fetch/oneOf.yaml b/modules/openapi-generator/src/test/resources/3_0/typescript-fetch/oneOf.yaml index ba0dd51d792..958b601804d 100644 --- a/modules/openapi-generator/src/test/resources/3_0/typescript-fetch/oneOf.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/typescript-fetch/oneOf.yaml @@ -25,6 +25,16 @@ paths: application/json: schema: $ref: '#/components/schemas/TestArrayResponse' + /test-discriminator: + get: + operationId: testDiscriminator + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/TestDiscriminatorResponse' components: schemas: TestArrayResponse: @@ -38,6 +48,15 @@ components: - type: array items: type: string + TestDiscriminatorResponse: + discriminator: + propertyName: discriminatorField + mapping: + optionOne: "#/components/schemas/OptionOne" + optionTwo: "#/components/schemas/OptionTwo" + oneOf: + - $ref: "#/components/schemas/OptionOne" + - $ref: "#/components/schemas/OptionTwo" TestResponse: oneOf: - $ref: "#/components/schemas/TestA" @@ -56,4 +75,22 @@ components: bar: type: string required: - - bar \ No newline at end of file + - bar + OptionOne: + type: object + properties: + discriminatorField: + enum: + - "optionOne" + type: string + required: + - discriminatorField + OptionTwo: + type: object + properties: + discriminatorField: + enum: + - "optionTwo" + type: string + required: + - discriminatorField \ No newline at end of file diff --git a/samples/client/petstore/typescript-fetch/builds/oneOf/.openapi-generator/FILES b/samples/client/petstore/typescript-fetch/builds/oneOf/.openapi-generator/FILES index 6bb15a3adfc..037062f16b8 100644 --- a/samples/client/petstore/typescript-fetch/builds/oneOf/.openapi-generator/FILES +++ b/samples/client/petstore/typescript-fetch/builds/oneOf/.openapi-generator/FILES @@ -1,9 +1,12 @@ apis/DefaultApi.ts apis/index.ts index.ts +models/OptionOne.ts +models/OptionTwo.ts models/TestA.ts models/TestArrayResponse.ts models/TestB.ts +models/TestDiscriminatorResponse.ts models/TestResponse.ts models/index.ts runtime.ts diff --git a/samples/client/petstore/typescript-fetch/builds/oneOf/apis/DefaultApi.ts b/samples/client/petstore/typescript-fetch/builds/oneOf/apis/DefaultApi.ts index be5025be118..4d855b758fb 100644 --- a/samples/client/petstore/typescript-fetch/builds/oneOf/apis/DefaultApi.ts +++ b/samples/client/petstore/typescript-fetch/builds/oneOf/apis/DefaultApi.ts @@ -16,11 +16,14 @@ import * as runtime from '../runtime'; import type { TestArrayResponse, + TestDiscriminatorResponse, TestResponse, } from '../models/index'; import { TestArrayResponseFromJSON, TestArrayResponseToJSON, + TestDiscriminatorResponseFromJSON, + TestDiscriminatorResponseToJSON, TestResponseFromJSON, TestResponseToJSON, } from '../models/index'; @@ -84,4 +87,31 @@ export class DefaultApi extends runtime.BaseAPI { return await response.value(); } + /** + */ + async testDiscriminatorRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise> { + const queryParameters: any = {}; + + const headerParameters: runtime.HTTPHeaders = {}; + + + let urlPath = `/test-discriminator`; + + const response = await this.request({ + path: urlPath, + method: 'GET', + headers: headerParameters, + query: queryParameters, + }, initOverrides); + + return new runtime.JSONApiResponse(response, (jsonValue) => TestDiscriminatorResponseFromJSON(jsonValue)); + } + + /** + */ + async testDiscriminator(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise { + const response = await this.testDiscriminatorRaw(initOverrides); + return await response.value(); + } + } diff --git a/samples/client/petstore/typescript-fetch/builds/oneOf/models/OptionOne.ts b/samples/client/petstore/typescript-fetch/builds/oneOf/models/OptionOne.ts new file mode 100644 index 00000000000..3c0c832ab9c --- /dev/null +++ b/samples/client/petstore/typescript-fetch/builds/oneOf/models/OptionOne.ts @@ -0,0 +1,76 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * testing oneOf without discriminator + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface OptionOne + */ +export interface OptionOne { + /** + * + * @type {string} + * @memberof OptionOne + */ + discriminatorField: OptionOneDiscriminatorFieldEnum; +} + + +/** + * @export + */ +export const OptionOneDiscriminatorFieldEnum = { + OptionOne: 'optionOne' +} as const; +export type OptionOneDiscriminatorFieldEnum = typeof OptionOneDiscriminatorFieldEnum[keyof typeof OptionOneDiscriminatorFieldEnum]; + + +/** + * Check if a given object implements the OptionOne interface. + */ +export function instanceOfOptionOne(value: object): value is OptionOne { + if (!('discriminatorField' in value) || value['discriminatorField'] === undefined) return false; + return true; +} + +export function OptionOneFromJSON(json: any): OptionOne { + return OptionOneFromJSONTyped(json, false); +} + +export function OptionOneFromJSONTyped(json: any, ignoreDiscriminator: boolean): OptionOne { + if (json == null) { + return json; + } + return { + + 'discriminatorField': json['discriminatorField'], + }; +} + +export function OptionOneToJSON(json: any): OptionOne { + return OptionOneToJSONTyped(json, false); +} + +export function OptionOneToJSONTyped(value?: OptionOne | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'discriminatorField': value['discriminatorField'], + }; +} + diff --git a/samples/client/petstore/typescript-fetch/builds/oneOf/models/OptionTwo.ts b/samples/client/petstore/typescript-fetch/builds/oneOf/models/OptionTwo.ts new file mode 100644 index 00000000000..a6cafacf2ad --- /dev/null +++ b/samples/client/petstore/typescript-fetch/builds/oneOf/models/OptionTwo.ts @@ -0,0 +1,76 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * testing oneOf without discriminator + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { mapValues } from '../runtime'; +/** + * + * @export + * @interface OptionTwo + */ +export interface OptionTwo { + /** + * + * @type {string} + * @memberof OptionTwo + */ + discriminatorField: OptionTwoDiscriminatorFieldEnum; +} + + +/** + * @export + */ +export const OptionTwoDiscriminatorFieldEnum = { + OptionTwo: 'optionTwo' +} as const; +export type OptionTwoDiscriminatorFieldEnum = typeof OptionTwoDiscriminatorFieldEnum[keyof typeof OptionTwoDiscriminatorFieldEnum]; + + +/** + * Check if a given object implements the OptionTwo interface. + */ +export function instanceOfOptionTwo(value: object): value is OptionTwo { + if (!('discriminatorField' in value) || value['discriminatorField'] === undefined) return false; + return true; +} + +export function OptionTwoFromJSON(json: any): OptionTwo { + return OptionTwoFromJSONTyped(json, false); +} + +export function OptionTwoFromJSONTyped(json: any, ignoreDiscriminator: boolean): OptionTwo { + if (json == null) { + return json; + } + return { + + 'discriminatorField': json['discriminatorField'], + }; +} + +export function OptionTwoToJSON(json: any): OptionTwo { + return OptionTwoToJSONTyped(json, false); +} + +export function OptionTwoToJSONTyped(value?: OptionTwo | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + + return { + + 'discriminatorField': value['discriminatorField'], + }; +} + diff --git a/samples/client/petstore/typescript-fetch/builds/oneOf/models/TestDiscriminatorResponse.ts b/samples/client/petstore/typescript-fetch/builds/oneOf/models/TestDiscriminatorResponse.ts new file mode 100644 index 00000000000..c6be9b26c5e --- /dev/null +++ b/samples/client/petstore/typescript-fetch/builds/oneOf/models/TestDiscriminatorResponse.ts @@ -0,0 +1,72 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * testing oneOf without discriminator + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import type { OptionOne } from './OptionOne'; +import { + instanceOfOptionOne, + OptionOneFromJSON, + OptionOneFromJSONTyped, + OptionOneToJSON, +} from './OptionOne'; +import type { OptionTwo } from './OptionTwo'; +import { + instanceOfOptionTwo, + OptionTwoFromJSON, + OptionTwoFromJSONTyped, + OptionTwoToJSON, +} from './OptionTwo'; + +/** + * @type TestDiscriminatorResponse + * + * @export + */ +export type TestDiscriminatorResponse = { discriminatorField: 'optionOne' } & OptionOne | { discriminatorField: 'optionTwo' } & OptionTwo; + +export function TestDiscriminatorResponseFromJSON(json: any): TestDiscriminatorResponse { + return TestDiscriminatorResponseFromJSONTyped(json, false); +} + +export function TestDiscriminatorResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): TestDiscriminatorResponse { + if (json == null) { + return json; + } + switch (json['discriminatorField']) { + case 'optionOne': + return Object.assign({}, OptionOneFromJSONTyped(json, true), { discriminatorField: 'optionOne' } as const); + case 'optionTwo': + return Object.assign({}, OptionTwoFromJSONTyped(json, true), { discriminatorField: 'optionTwo' } as const); + default: + return json; + } +} + +export function TestDiscriminatorResponseToJSON(json: any): any { + return TestDiscriminatorResponseToJSONTyped(json, false); +} + +export function TestDiscriminatorResponseToJSONTyped(value?: TestDiscriminatorResponse | null, ignoreDiscriminator: boolean = false): any { + if (value == null) { + return value; + } + switch (value['discriminatorField']) { + case 'optionOne': + return Object.assign({}, OptionOneToJSON(value), { discriminatorField: 'optionOne' } as const); + case 'optionTwo': + return Object.assign({}, OptionTwoToJSON(value), { discriminatorField: 'optionTwo' } as const); + default: + return json; + } +} + diff --git a/samples/client/petstore/typescript-fetch/builds/oneOf/models/index.ts b/samples/client/petstore/typescript-fetch/builds/oneOf/models/index.ts index 7ba8efbbf0e..79f8303e9ed 100644 --- a/samples/client/petstore/typescript-fetch/builds/oneOf/models/index.ts +++ b/samples/client/petstore/typescript-fetch/builds/oneOf/models/index.ts @@ -1,6 +1,9 @@ /* tslint:disable */ /* eslint-disable */ +export * from './OptionOne'; +export * from './OptionTwo'; export * from './TestA'; export * from './TestArrayResponse'; export * from './TestB'; +export * from './TestDiscriminatorResponse'; export * from './TestResponse';