Skip to content

Commit 77ce394

Browse files
committed
[JS] Fix handling of oneOf when you have explicitly used a discriminator.
* added a branch that uses the discriminator to generate the actual object and then bail early See #23025
1 parent d6c2905 commit 77ce394

68 files changed

Lines changed: 4036 additions & 7 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/openapi-generator/src/main/resources/Javascript/partial_model_oneof.mustache

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,42 @@ class {{classname}} {
2121
}
2222
var match = 0;
2323
var errorMessages = [];
24+
{{#discriminator}}
25+
// if discriminator exists, use it.
26+
if (instance && typeof instance === 'object' && instance['{{{discriminator.propertyBaseName}}}'] !== undefined) {
27+
var discriminatorValue = instance['{{{discriminator.propertyBaseName}}}'];
28+
switch (discriminatorValue) {
29+
{{#discriminator.mappedModels}}
30+
case '{{mappingName}}':
31+
try {
32+
{{modelName}}.validateJSON(instance);
33+
this.actualInstance = {{modelName}}.constructFromObject(instance);
34+
return;
35+
} catch(err) {
36+
throw new Error("Failed to construct {{modelName}} using discriminator value '{{mappingName}}': " + err);
37+
}
38+
{{/discriminator.mappedModels}}
39+
{{^discriminator.mappedModels}}
40+
{{#composedSchemas.oneOf}}
41+
{{^isPrimitiveType}}
42+
case '{{{dataType}}}':
43+
try {
44+
{{{dataType}}}.validateJSON(instance);
45+
this.actualInstance = {{{dataType}}}.constructFromObject(instance);
46+
return;
47+
} catch(err) {
48+
throw new Error("Failed to construct {{{dataType}}} using discriminator value '{{{dataType}}}': " + err);
49+
}
50+
{{/isPrimitiveType}}
51+
{{/composedSchemas.oneOf}}
52+
{{/discriminator.mappedModels}}
53+
default:
54+
throw new Error("Unrecognized discriminator value '" + discriminatorValue + "' constructing `{{{classname}}}`. Expected one of: {{#discriminator.mappedModels}}{{mappingName}}{{^-last}}, {{/-last}}{{/discriminator.mappedModels}}{{^discriminator.mappedModels}}{{#composedSchemas.oneOf}}{{^isPrimitiveType}}{{{dataType}}}{{^-last}}, {{/-last}}{{/isPrimitiveType}}{{/composedSchemas.oneOf}}{{/discriminator.mappedModels}}.");
55+
}
56+
}
57+
// else try to construct using oneOf
58+
59+
{{/discriminator}}
2460
{{#composedSchemas.oneOf}}
2561
{{#description}}
2662
// {{{description}}}
@@ -199,7 +235,7 @@ class {{classname}} {
199235
this.actualInstance = instance;
200236
{{/isPrimitiveType}}
201237
{{^isPrimitiveType}}
202-
if (typeof instance === "{{{dataType}}}") {
238+
if (instance instanceof {{{dataType}}}) {
203239
this.actualInstance = instance;
204240
} else {
205241
// plain JS object

modules/openapi-generator/src/test/resources/3_0/javascript/petstore-with-fake-endpoints-models-for-testing.yaml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1997,6 +1997,57 @@ components:
19971997
required:
19981998
- className
19991999
- size
2000+
Bird:
2001+
oneOf:
2002+
- $ref: '#/components/schemas/Parrot'
2003+
- $ref: '#/components/schemas/Finch'
2004+
discriminator:
2005+
propertyName: birdType
2006+
Parrot:
2007+
type: object
2008+
properties:
2009+
birdType:
2010+
type: string
2011+
speech:
2012+
type: string
2013+
required:
2014+
- birdType
2015+
Finch:
2016+
type: object
2017+
properties:
2018+
birdType:
2019+
type: string
2020+
beakSize:
2021+
type: integer
2022+
required:
2023+
- birdType
2024+
Fish:
2025+
oneOf:
2026+
- $ref: '#/components/schemas/Salmon'
2027+
- $ref: '#/components/schemas/Tuna'
2028+
discriminator:
2029+
propertyName: fishType
2030+
mapping:
2031+
atlantic_salmon: '#/components/schemas/Salmon'
2032+
yellowfin_tuna: '#/components/schemas/Tuna'
2033+
Salmon:
2034+
type: object
2035+
properties:
2036+
fishType:
2037+
type: string
2038+
length:
2039+
type: number
2040+
required:
2041+
- fishType
2042+
Tuna:
2043+
type: object
2044+
properties:
2045+
fishType:
2046+
type: string
2047+
weight:
2048+
type: number
2049+
required:
2050+
- fishType
20002051
NestedOneOf:
20012052
type: object
20022053
properties:

samples/client/petstore/javascript-apollo/.openapi-generator/FILES

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ docs/ArrayOfArrayOfNumberOnly.md
1010
docs/ArrayOfNumberOnly.md
1111
docs/ArrayTest.md
1212
docs/BasquePig.md
13+
docs/Bird.md
1314
docs/Capitalization.md
1415
docs/Cat.md
1516
docs/Category.md
@@ -27,6 +28,8 @@ docs/FakeApi.md
2728
docs/FakeClassnameTags123Api.md
2829
docs/File.md
2930
docs/FileSchemaTestClass.md
31+
docs/Finch.md
32+
docs/Fish.md
3033
docs/Foo.md
3134
docs/FooGetDefaultResponse.md
3235
docs/FormatTest.md
@@ -49,16 +52,19 @@ docs/OuterEnumDefaultValue.md
4952
docs/OuterEnumInteger.md
5053
docs/OuterEnumIntegerDefaultValue.md
5154
docs/OuterObjectWithEnumProperty.md
55+
docs/Parrot.md
5256
docs/Pet.md
5357
docs/PetApi.md
5458
docs/Pig.md
5559
docs/ReadOnlyFirst.md
5660
docs/Return.md
61+
docs/Salmon.md
5762
docs/SpecialModelName.md
5863
docs/StoreApi.md
5964
docs/StringOrBoolean.md
6065
docs/Tag.md
6166
docs/TestInlineFreeformAdditionalPropertiesRequest.md
67+
docs/Tuna.md
6268
docs/User.md
6369
docs/UserApi.md
6470
git_push.sh
@@ -80,6 +86,7 @@ src/model/ArrayOfArrayOfNumberOnly.js
8086
src/model/ArrayOfNumberOnly.js
8187
src/model/ArrayTest.js
8288
src/model/BasquePig.js
89+
src/model/Bird.js
8390
src/model/Capitalization.js
8491
src/model/Cat.js
8592
src/model/Category.js
@@ -94,6 +101,8 @@ src/model/EnumClass.js
94101
src/model/EnumTest.js
95102
src/model/File.js
96103
src/model/FileSchemaTestClass.js
104+
src/model/Finch.js
105+
src/model/Fish.js
97106
src/model/Foo.js
98107
src/model/FooGetDefaultResponse.js
99108
src/model/FormatTest.js
@@ -116,12 +125,15 @@ src/model/OuterEnumDefaultValue.js
116125
src/model/OuterEnumInteger.js
117126
src/model/OuterEnumIntegerDefaultValue.js
118127
src/model/OuterObjectWithEnumProperty.js
128+
src/model/Parrot.js
119129
src/model/Pet.js
120130
src/model/Pig.js
121131
src/model/ReadOnlyFirst.js
122132
src/model/Return.js
133+
src/model/Salmon.js
123134
src/model/SpecialModelName.js
124135
src/model/StringOrBoolean.js
125136
src/model/Tag.js
126137
src/model/TestInlineFreeformAdditionalPropertiesRequest.js
138+
src/model/Tuna.js
127139
src/model/User.js

samples/client/petstore/javascript-apollo/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ Class | Method | HTTP request | Description
176176
- [OpenApiPetstore.ArrayOfNumberOnly](docs/ArrayOfNumberOnly.md)
177177
- [OpenApiPetstore.ArrayTest](docs/ArrayTest.md)
178178
- [OpenApiPetstore.BasquePig](docs/BasquePig.md)
179+
- [OpenApiPetstore.Bird](docs/Bird.md)
179180
- [OpenApiPetstore.Capitalization](docs/Capitalization.md)
180181
- [OpenApiPetstore.Cat](docs/Cat.md)
181182
- [OpenApiPetstore.Category](docs/Category.md)
@@ -190,6 +191,8 @@ Class | Method | HTTP request | Description
190191
- [OpenApiPetstore.EnumTest](docs/EnumTest.md)
191192
- [OpenApiPetstore.File](docs/File.md)
192193
- [OpenApiPetstore.FileSchemaTestClass](docs/FileSchemaTestClass.md)
194+
- [OpenApiPetstore.Finch](docs/Finch.md)
195+
- [OpenApiPetstore.Fish](docs/Fish.md)
193196
- [OpenApiPetstore.Foo](docs/Foo.md)
194197
- [OpenApiPetstore.FooGetDefaultResponse](docs/FooGetDefaultResponse.md)
195198
- [OpenApiPetstore.FormatTest](docs/FormatTest.md)
@@ -212,14 +215,17 @@ Class | Method | HTTP request | Description
212215
- [OpenApiPetstore.OuterEnumInteger](docs/OuterEnumInteger.md)
213216
- [OpenApiPetstore.OuterEnumIntegerDefaultValue](docs/OuterEnumIntegerDefaultValue.md)
214217
- [OpenApiPetstore.OuterObjectWithEnumProperty](docs/OuterObjectWithEnumProperty.md)
218+
- [OpenApiPetstore.Parrot](docs/Parrot.md)
215219
- [OpenApiPetstore.Pet](docs/Pet.md)
216220
- [OpenApiPetstore.Pig](docs/Pig.md)
217221
- [OpenApiPetstore.ReadOnlyFirst](docs/ReadOnlyFirst.md)
218222
- [OpenApiPetstore.Return](docs/Return.md)
223+
- [OpenApiPetstore.Salmon](docs/Salmon.md)
219224
- [OpenApiPetstore.SpecialModelName](docs/SpecialModelName.md)
220225
- [OpenApiPetstore.StringOrBoolean](docs/StringOrBoolean.md)
221226
- [OpenApiPetstore.Tag](docs/Tag.md)
222227
- [OpenApiPetstore.TestInlineFreeformAdditionalPropertiesRequest](docs/TestInlineFreeformAdditionalPropertiesRequest.md)
228+
- [OpenApiPetstore.Tuna](docs/Tuna.md)
223229
- [OpenApiPetstore.User](docs/User.md)
224230

225231

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# OpenApiPetstore.Bird
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**birdType** | **String** | |
8+
**speech** | **String** | | [optional]
9+
**beakSize** | **Number** | | [optional]
10+
11+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# OpenApiPetstore.Finch
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**birdType** | **String** | |
8+
**beakSize** | **Number** | | [optional]
9+
10+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# OpenApiPetstore.Fish
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**fishType** | **String** | |
8+
**length** | **Number** | | [optional]
9+
**weight** | **Number** | | [optional]
10+
11+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# OpenApiPetstore.Parrot
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**birdType** | **String** | |
8+
**speech** | **String** | | [optional]
9+
10+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# OpenApiPetstore.Salmon
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**fishType** | **String** | |
8+
**length** | **Number** | | [optional]
9+
10+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# OpenApiPetstore.Tuna
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**fishType** | **String** | |
8+
**weight** | **Number** | | [optional]
9+
10+

0 commit comments

Comments
 (0)