Fix typescript-fetch missing imports for oneof field with discriminator (#21477)

* fix: add support for discriminator in oneOf schemas and update model imports

* chore: generate samples

* fix: enhance model imports for oneOf arrays in mustache templates

* fix: correct import formatting in mustache templates and TypeScript files
This commit is contained in:
Gregory Merlet 2025-06-27 15:26:30 +02:00 committed by GitHub
parent b6b71cd4da
commit d11d008e71
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 309 additions and 3 deletions

View File

@ -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}}

View File

@ -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"
@ -57,3 +76,21 @@ components:
type: string
required:
- bar
OptionOne:
type: object
properties:
discriminatorField:
enum:
- "optionOne"
type: string
required:
- discriminatorField
OptionTwo:
type: object
properties:
discriminatorField:
enum:
- "optionTwo"
type: string
required:
- discriminatorField

View File

@ -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

View File

@ -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<runtime.ApiResponse<TestDiscriminatorResponse>> {
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<TestDiscriminatorResponse> {
const response = await this.testDiscriminatorRaw(initOverrides);
return await response.value();
}
}

View File

@ -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'],
};
}

View File

@ -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'],
};
}

View File

@ -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;
}
}

View File

@ -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';