Skip to content

Commit d11d008

Browse files
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
1 parent b6b71cd commit d11d008

File tree

8 files changed

+309
-3
lines changed

8 files changed

+309
-3
lines changed

modules/openapi-generator/src/main/resources/typescript-fetch/modelOneOf.mustache

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
{{#hasImports}}
2-
{{#imports}}
2+
{{#oneOfArrays}}
33
import type { {{{.}}} } from './{{.}}{{importFileExtension}}';
44
import {
55
instanceOf{{{.}}},
66
{{{.}}}FromJSON,
77
{{{.}}}FromJSONTyped,
88
{{{.}}}ToJSON,
99
} from './{{.}}{{importFileExtension}}';
10-
{{/imports}}
10+
{{/oneOfArrays}}
11+
{{#oneOfModels}}
12+
import type { {{{.}}} } from './{{.}}{{importFileExtension}}';
13+
import {
14+
instanceOf{{{.}}},
15+
{{{.}}}FromJSON,
16+
{{{.}}}FromJSONTyped,
17+
{{{.}}}ToJSON,
18+
} from './{{.}}{{importFileExtension}}';
19+
{{/oneOfModels}}
1120

1221
{{/hasImports}}
1322
{{>modelOneOfInterfaces}}

modules/openapi-generator/src/test/resources/3_0/typescript-fetch/oneOf.yaml

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@ paths:
2525
application/json:
2626
schema:
2727
$ref: '#/components/schemas/TestArrayResponse'
28+
/test-discriminator:
29+
get:
30+
operationId: testDiscriminator
31+
responses:
32+
200:
33+
description: OK
34+
content:
35+
application/json:
36+
schema:
37+
$ref: '#/components/schemas/TestDiscriminatorResponse'
2838
components:
2939
schemas:
3040
TestArrayResponse:
@@ -38,6 +48,15 @@ components:
3848
- type: array
3949
items:
4050
type: string
51+
TestDiscriminatorResponse:
52+
discriminator:
53+
propertyName: discriminatorField
54+
mapping:
55+
optionOne: "#/components/schemas/OptionOne"
56+
optionTwo: "#/components/schemas/OptionTwo"
57+
oneOf:
58+
- $ref: "#/components/schemas/OptionOne"
59+
- $ref: "#/components/schemas/OptionTwo"
4160
TestResponse:
4261
oneOf:
4362
- $ref: "#/components/schemas/TestA"
@@ -56,4 +75,22 @@ components:
5675
bar:
5776
type: string
5877
required:
59-
- bar
78+
- bar
79+
OptionOne:
80+
type: object
81+
properties:
82+
discriminatorField:
83+
enum:
84+
- "optionOne"
85+
type: string
86+
required:
87+
- discriminatorField
88+
OptionTwo:
89+
type: object
90+
properties:
91+
discriminatorField:
92+
enum:
93+
- "optionTwo"
94+
type: string
95+
required:
96+
- discriminatorField
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
apis/DefaultApi.ts
22
apis/index.ts
33
index.ts
4+
models/OptionOne.ts
5+
models/OptionTwo.ts
46
models/TestA.ts
57
models/TestArrayResponse.ts
68
models/TestB.ts
9+
models/TestDiscriminatorResponse.ts
710
models/TestResponse.ts
811
models/index.ts
912
runtime.ts

samples/client/petstore/typescript-fetch/builds/oneOf/apis/DefaultApi.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616
import * as runtime from '../runtime';
1717
import type {
1818
TestArrayResponse,
19+
TestDiscriminatorResponse,
1920
TestResponse,
2021
} from '../models/index';
2122
import {
2223
TestArrayResponseFromJSON,
2324
TestArrayResponseToJSON,
25+
TestDiscriminatorResponseFromJSON,
26+
TestDiscriminatorResponseToJSON,
2427
TestResponseFromJSON,
2528
TestResponseToJSON,
2629
} from '../models/index';
@@ -84,4 +87,31 @@ export class DefaultApi extends runtime.BaseAPI {
8487
return await response.value();
8588
}
8689

90+
/**
91+
*/
92+
async testDiscriminatorRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<TestDiscriminatorResponse>> {
93+
const queryParameters: any = {};
94+
95+
const headerParameters: runtime.HTTPHeaders = {};
96+
97+
98+
let urlPath = `/test-discriminator`;
99+
100+
const response = await this.request({
101+
path: urlPath,
102+
method: 'GET',
103+
headers: headerParameters,
104+
query: queryParameters,
105+
}, initOverrides);
106+
107+
return new runtime.JSONApiResponse(response, (jsonValue) => TestDiscriminatorResponseFromJSON(jsonValue));
108+
}
109+
110+
/**
111+
*/
112+
async testDiscriminator(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<TestDiscriminatorResponse> {
113+
const response = await this.testDiscriminatorRaw(initOverrides);
114+
return await response.value();
115+
}
116+
87117
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/* tslint:disable */
2+
/* eslint-disable */
3+
/**
4+
* testing oneOf without discriminator
5+
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
6+
*
7+
* The version of the OpenAPI document: 1.0.0
8+
*
9+
*
10+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11+
* https://openapi-generator.tech
12+
* Do not edit the class manually.
13+
*/
14+
15+
import { mapValues } from '../runtime';
16+
/**
17+
*
18+
* @export
19+
* @interface OptionOne
20+
*/
21+
export interface OptionOne {
22+
/**
23+
*
24+
* @type {string}
25+
* @memberof OptionOne
26+
*/
27+
discriminatorField: OptionOneDiscriminatorFieldEnum;
28+
}
29+
30+
31+
/**
32+
* @export
33+
*/
34+
export const OptionOneDiscriminatorFieldEnum = {
35+
OptionOne: 'optionOne'
36+
} as const;
37+
export type OptionOneDiscriminatorFieldEnum = typeof OptionOneDiscriminatorFieldEnum[keyof typeof OptionOneDiscriminatorFieldEnum];
38+
39+
40+
/**
41+
* Check if a given object implements the OptionOne interface.
42+
*/
43+
export function instanceOfOptionOne(value: object): value is OptionOne {
44+
if (!('discriminatorField' in value) || value['discriminatorField'] === undefined) return false;
45+
return true;
46+
}
47+
48+
export function OptionOneFromJSON(json: any): OptionOne {
49+
return OptionOneFromJSONTyped(json, false);
50+
}
51+
52+
export function OptionOneFromJSONTyped(json: any, ignoreDiscriminator: boolean): OptionOne {
53+
if (json == null) {
54+
return json;
55+
}
56+
return {
57+
58+
'discriminatorField': json['discriminatorField'],
59+
};
60+
}
61+
62+
export function OptionOneToJSON(json: any): OptionOne {
63+
return OptionOneToJSONTyped(json, false);
64+
}
65+
66+
export function OptionOneToJSONTyped(value?: OptionOne | null, ignoreDiscriminator: boolean = false): any {
67+
if (value == null) {
68+
return value;
69+
}
70+
71+
return {
72+
73+
'discriminatorField': value['discriminatorField'],
74+
};
75+
}
76+
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/* tslint:disable */
2+
/* eslint-disable */
3+
/**
4+
* testing oneOf without discriminator
5+
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
6+
*
7+
* The version of the OpenAPI document: 1.0.0
8+
*
9+
*
10+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11+
* https://openapi-generator.tech
12+
* Do not edit the class manually.
13+
*/
14+
15+
import { mapValues } from '../runtime';
16+
/**
17+
*
18+
* @export
19+
* @interface OptionTwo
20+
*/
21+
export interface OptionTwo {
22+
/**
23+
*
24+
* @type {string}
25+
* @memberof OptionTwo
26+
*/
27+
discriminatorField: OptionTwoDiscriminatorFieldEnum;
28+
}
29+
30+
31+
/**
32+
* @export
33+
*/
34+
export const OptionTwoDiscriminatorFieldEnum = {
35+
OptionTwo: 'optionTwo'
36+
} as const;
37+
export type OptionTwoDiscriminatorFieldEnum = typeof OptionTwoDiscriminatorFieldEnum[keyof typeof OptionTwoDiscriminatorFieldEnum];
38+
39+
40+
/**
41+
* Check if a given object implements the OptionTwo interface.
42+
*/
43+
export function instanceOfOptionTwo(value: object): value is OptionTwo {
44+
if (!('discriminatorField' in value) || value['discriminatorField'] === undefined) return false;
45+
return true;
46+
}
47+
48+
export function OptionTwoFromJSON(json: any): OptionTwo {
49+
return OptionTwoFromJSONTyped(json, false);
50+
}
51+
52+
export function OptionTwoFromJSONTyped(json: any, ignoreDiscriminator: boolean): OptionTwo {
53+
if (json == null) {
54+
return json;
55+
}
56+
return {
57+
58+
'discriminatorField': json['discriminatorField'],
59+
};
60+
}
61+
62+
export function OptionTwoToJSON(json: any): OptionTwo {
63+
return OptionTwoToJSONTyped(json, false);
64+
}
65+
66+
export function OptionTwoToJSONTyped(value?: OptionTwo | null, ignoreDiscriminator: boolean = false): any {
67+
if (value == null) {
68+
return value;
69+
}
70+
71+
return {
72+
73+
'discriminatorField': value['discriminatorField'],
74+
};
75+
}
76+
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/* tslint:disable */
2+
/* eslint-disable */
3+
/**
4+
* testing oneOf without discriminator
5+
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
6+
*
7+
* The version of the OpenAPI document: 1.0.0
8+
*
9+
*
10+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
11+
* https://openapi-generator.tech
12+
* Do not edit the class manually.
13+
*/
14+
15+
import type { OptionOne } from './OptionOne';
16+
import {
17+
instanceOfOptionOne,
18+
OptionOneFromJSON,
19+
OptionOneFromJSONTyped,
20+
OptionOneToJSON,
21+
} from './OptionOne';
22+
import type { OptionTwo } from './OptionTwo';
23+
import {
24+
instanceOfOptionTwo,
25+
OptionTwoFromJSON,
26+
OptionTwoFromJSONTyped,
27+
OptionTwoToJSON,
28+
} from './OptionTwo';
29+
30+
/**
31+
* @type TestDiscriminatorResponse
32+
*
33+
* @export
34+
*/
35+
export type TestDiscriminatorResponse = { discriminatorField: 'optionOne' } & OptionOne | { discriminatorField: 'optionTwo' } & OptionTwo;
36+
37+
export function TestDiscriminatorResponseFromJSON(json: any): TestDiscriminatorResponse {
38+
return TestDiscriminatorResponseFromJSONTyped(json, false);
39+
}
40+
41+
export function TestDiscriminatorResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): TestDiscriminatorResponse {
42+
if (json == null) {
43+
return json;
44+
}
45+
switch (json['discriminatorField']) {
46+
case 'optionOne':
47+
return Object.assign({}, OptionOneFromJSONTyped(json, true), { discriminatorField: 'optionOne' } as const);
48+
case 'optionTwo':
49+
return Object.assign({}, OptionTwoFromJSONTyped(json, true), { discriminatorField: 'optionTwo' } as const);
50+
default:
51+
return json;
52+
}
53+
}
54+
55+
export function TestDiscriminatorResponseToJSON(json: any): any {
56+
return TestDiscriminatorResponseToJSONTyped(json, false);
57+
}
58+
59+
export function TestDiscriminatorResponseToJSONTyped(value?: TestDiscriminatorResponse | null, ignoreDiscriminator: boolean = false): any {
60+
if (value == null) {
61+
return value;
62+
}
63+
switch (value['discriminatorField']) {
64+
case 'optionOne':
65+
return Object.assign({}, OptionOneToJSON(value), { discriminatorField: 'optionOne' } as const);
66+
case 'optionTwo':
67+
return Object.assign({}, OptionTwoToJSON(value), { discriminatorField: 'optionTwo' } as const);
68+
default:
69+
return json;
70+
}
71+
}
72+
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
/* tslint:disable */
22
/* eslint-disable */
3+
export * from './OptionOne';
4+
export * from './OptionTwo';
35
export * from './TestA';
46
export * from './TestArrayResponse';
57
export * from './TestB';
8+
export * from './TestDiscriminatorResponse';
69
export * from './TestResponse';

0 commit comments

Comments
 (0)