Skip to content

Commit 7fdd856

Browse files
Fix numeric singleton enum check and discriminator wire-format key
1 parent 389aa83 commit 7fdd856

17 files changed

Lines changed: 159 additions & 9 deletions

File tree

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@ export function instanceOf{{classname}}(value: object): value is {{classname}} {
3737
{{#-first}}
3838
{{#-last}}
3939
{{#hasSanitizedName}}
40-
if (value['{{name}}'] !== '{{.}}' && value['{{baseName}}'] !== '{{.}}') return false;
40+
{{#isString}}if (value['{{name}}'] !== '{{.}}' && value['{{baseName}}'] !== '{{.}}') return false;{{/isString}}
41+
{{^isString}}if (value['{{name}}'] !== {{.}} && value['{{baseName}}'] !== {{.}}) return false;{{/isString}}
4142
{{/hasSanitizedName}}
4243
{{^hasSanitizedName}}
43-
if (value['{{name}}'] !== '{{.}}') return false;
44+
{{#isString}}if (value['{{name}}'] !== '{{.}}') return false;{{/isString}}
45+
{{^isString}}if (value['{{name}}'] !== {{.}}) return false;{{/isString}}
4446
{{/hasSanitizedName}}
4547
{{/-last}}
4648
{{/-first}}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ export function {{classname}}ToJSONTyped(value?: {{classname}} | null, ignoreDis
151151
switch (value['{{discriminator.propertyName}}']) {
152152
{{#discriminator.mappedModels}}
153153
case '{{mappingName}}':
154-
return Object.assign({}, {{modelName}}ToJSON(value), { {{discriminator.propertyName}}: '{{mappingName}}' } as const);
154+
return Object.assign({}, {{modelName}}ToJSON(value), { '{{discriminator.propertyBaseName}}': '{{mappingName}}' } as const);
155155
{{/discriminator.mappedModels}}
156156
default:
157157
return value;

modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/fetch/TypeScriptFetchClientCodegenTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,24 @@ public void testInstanceOfChecksDiscriminatorValue() throws IOException {
485485
TestUtils.assertFileContains(dashedOptionOne, "value['discriminator-field'] !== 'dashedOptionOne'");
486486
TestUtils.assertFileContains(dashedOptionOne, "'someProperty' in value");
487487
TestUtils.assertFileContains(dashedOptionOne, "'some-property' in value");
488+
489+
// Numeric singleton enum: value check must NOT quote the literal
490+
Path numericModel = Paths.get(output + "/models/NumericSingletonEnumModel.ts");
491+
TestUtils.assertFileExists(numericModel);
492+
TestUtils.assertFileContains(numericModel, "value['kind'] !== 42");
493+
TestUtils.assertFileNotContains(numericModel, "value['kind'] !== '42'");
494+
495+
// ToJSONTyped of discriminated oneOf must emit the wire-format discriminator key
496+
// (propertyBaseName), not the camelCase TS property name
497+
Path dashedDiscriminatorResponse = Paths.get(output + "/models/TestDashedDiscriminatorResponse.ts");
498+
TestUtils.assertFileExists(dashedDiscriminatorResponse);
499+
TestUtils.assertFileContains(dashedDiscriminatorResponse, "{ 'discriminator-field': 'dashedOptionOne' }");
500+
TestUtils.assertFileContains(dashedDiscriminatorResponse, "{ 'discriminator-field': 'dashedOptionTwo' }");
501+
502+
Path snakeDiscriminatorResponse = Paths.get(output + "/models/TestSnakeCaseDiscriminatorResponse.ts");
503+
TestUtils.assertFileExists(snakeDiscriminatorResponse);
504+
TestUtils.assertFileContains(snakeDiscriminatorResponse, "{ 'discriminator_field': 'snakeOptionOne' }");
505+
TestUtils.assertFileContains(snakeDiscriminatorResponse, "{ 'discriminator_field': 'snakeOptionTwo' }");
488506
}
489507

490508
@Test(description = "Verify validationAttributes works with withoutRuntimeChecks=true")

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@ components:
114114
type: string
115115
required:
116116
- discriminatorField
117+
NumericSingletonEnumModel:
118+
type: object
119+
properties:
120+
kind:
121+
type: integer
122+
enum:
123+
- 42
124+
required:
125+
- kind
117126
TestSnakeCaseDiscriminatorResponse:
118127
discriminator:
119128
propertyName: discriminator_field

samples/client/petstore/typescript-fetch/builds/oneOf/.openapi-generator/FILES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ apis/index.ts
33
docs/DashedOptionOne.md
44
docs/DashedOptionTwo.md
55
docs/DefaultApi.md
6+
docs/NumericSingletonEnumModel.md
67
docs/OptionOne.md
78
docs/OptionTwo.md
89
docs/SnakeOptionOne.md
@@ -17,6 +18,7 @@ docs/TestSnakeCaseDiscriminatorResponse.md
1718
index.ts
1819
models/DashedOptionOne.ts
1920
models/DashedOptionTwo.ts
21+
models/NumericSingletonEnumModel.ts
2022
models/OptionOne.ts
2123
models/OptionTwo.ts
2224
models/SnakeOptionOne.ts
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
2+
# NumericSingletonEnumModel
3+
4+
5+
## Properties
6+
7+
Name | Type
8+
------------ | -------------
9+
`kind` | number
10+
11+
## Example
12+
13+
```typescript
14+
import type { NumericSingletonEnumModel } from ''
15+
16+
// TODO: Update the object below with actual values
17+
const example = {
18+
"kind": null,
19+
} satisfies NumericSingletonEnumModel
20+
21+
console.log(example)
22+
23+
// Convert the instance to a JSON string
24+
const exampleJSON: string = JSON.stringify(example)
25+
console.log(exampleJSON)
26+
27+
// Parse the JSON string back to an object
28+
const exampleParsed = JSON.parse(exampleJSON) as NumericSingletonEnumModel
29+
console.log(exampleParsed)
30+
```
31+
32+
[[Back to top]](#) [[Back to API list]](../README.md#api-endpoints) [[Back to Model list]](../README.md#models) [[Back to README]](../README.md)
33+
34+

samples/client/petstore/typescript-fetch/builds/oneOf/models/DashedOptionOne.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export type DashedOptionOneDiscriminatorFieldEnum = typeof DashedOptionOneDiscri
4949
export function instanceOfDashedOptionOne(value: object): value is DashedOptionOne {
5050
if ((!('discriminatorField' in value) && !('discriminator-field' in value)) || (value['discriminatorField'] === undefined && value['discriminator-field'] === undefined)) return false;
5151
if (value['discriminatorField'] !== 'dashedOptionOne' && value['discriminator-field'] !== 'dashedOptionOne') return false;
52+
5253
if ((!('someProperty' in value) && !('some-property' in value)) || (value['someProperty'] === undefined && value['some-property'] === undefined)) return false;
5354
return true;
5455
}

samples/client/petstore/typescript-fetch/builds/oneOf/models/DashedOptionTwo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export type DashedOptionTwoDiscriminatorFieldEnum = typeof DashedOptionTwoDiscri
4949
export function instanceOfDashedOptionTwo(value: object): value is DashedOptionTwo {
5050
if ((!('discriminatorField' in value) && !('discriminator-field' in value)) || (value['discriminatorField'] === undefined && value['discriminator-field'] === undefined)) return false;
5151
if (value['discriminatorField'] !== 'dashedOptionTwo' && value['discriminator-field'] !== 'dashedOptionTwo') return false;
52+
5253
if ((!('someProperty' in value) && !('some-property' in value)) || (value['someProperty'] === undefined && value['some-property'] === undefined)) return false;
5354
return true;
5455
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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 NumericSingletonEnumModel
20+
*/
21+
export interface NumericSingletonEnumModel {
22+
/**
23+
*
24+
* @type {NumericSingletonEnumModelKindEnum}
25+
* @memberof NumericSingletonEnumModel
26+
*/
27+
kind: NumericSingletonEnumModelKindEnum;
28+
}
29+
30+
31+
/**
32+
* @export
33+
*/
34+
export const NumericSingletonEnumModelKindEnum = {
35+
NUMBER_42: 42
36+
} as const;
37+
export type NumericSingletonEnumModelKindEnum = typeof NumericSingletonEnumModelKindEnum[keyof typeof NumericSingletonEnumModelKindEnum];
38+
39+
40+
/**
41+
* Check if a given object implements the NumericSingletonEnumModel interface.
42+
*/
43+
export function instanceOfNumericSingletonEnumModel(value: object): value is NumericSingletonEnumModel {
44+
if (!('kind' in value) || value['kind'] === undefined) return false;
45+
46+
if (value['kind'] !== 42) return false;
47+
return true;
48+
}
49+
50+
export function NumericSingletonEnumModelFromJSON(json: any): NumericSingletonEnumModel {
51+
return NumericSingletonEnumModelFromJSONTyped(json, false);
52+
}
53+
54+
export function NumericSingletonEnumModelFromJSONTyped(json: any, ignoreDiscriminator: boolean): NumericSingletonEnumModel {
55+
if (json == null) {
56+
return json;
57+
}
58+
return {
59+
60+
'kind': json['kind'],
61+
};
62+
}
63+
64+
export function NumericSingletonEnumModelToJSON(json: any): NumericSingletonEnumModel {
65+
return NumericSingletonEnumModelToJSONTyped(json, false);
66+
}
67+
68+
export function NumericSingletonEnumModelToJSONTyped(value?: NumericSingletonEnumModel | null, ignoreDiscriminator: boolean = false): any {
69+
if (value == null) {
70+
return value;
71+
}
72+
73+
return {
74+
75+
'kind': value['kind'],
76+
};
77+
}
78+

samples/client/petstore/typescript-fetch/builds/oneOf/models/OptionOne.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export type OptionOneDiscriminatorFieldEnum = typeof OptionOneDiscriminatorField
4343
export function instanceOfOptionOne(value: object): value is OptionOne {
4444
if (!('discriminatorField' in value) || value['discriminatorField'] === undefined) return false;
4545
if (value['discriminatorField'] !== 'optionOne') return false;
46+
4647
return true;
4748
}
4849

0 commit comments

Comments
 (0)