Skip to content

Commit dba4883

Browse files
committed
Add support for const enums
1 parent b10b92a commit dba4883

File tree

4 files changed

+47
-2
lines changed

4 files changed

+47
-2
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// https://json-schema.org/draft/2020-12/json-schema-core.html#name-non-json-instances
2+
3+
export interface JsonCustomVocabulary {
4+
const?: string | number;
5+
}

src/openApi/v3/interfaces/OpenApiSchema.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { Dictionary } from '../../../utils/types';
22
import type { WithEnumExtension } from './Extensions/WithEnumExtension';
3+
import type { JsonCustomVocabulary } from './JsonCustomVocabulary';
34
import type { OpenApiDiscriminator } from './OpenApiDiscriminator';
45
import type { OpenApiExternalDocs } from './OpenApiExternalDocs';
56
import type { OpenApiReference } from './OpenApiReference';
@@ -8,7 +9,7 @@ import type { OpenApiXml } from './OpenApiXml';
89
/**
910
* https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject
1011
*/
11-
export interface OpenApiSchema extends OpenApiReference, WithEnumExtension {
12+
export interface OpenApiSchema extends OpenApiReference, WithEnumExtension, JsonCustomVocabulary {
1213
title?: string;
1314
multipleOf?: number;
1415
maximum?: number;

src/openApi/v3/parser/getModel.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Enum } from '../../../client/interfaces/Enum';
12
import type { Model } from '../../../client/interfaces/Model';
23
import { getPattern } from '../../../utils/getPattern';
34
import type { OpenApi } from '../interfaces/OpenApi';
@@ -8,6 +9,7 @@ import { getModelComposition } from './getModelComposition';
89
import { getModelDefault } from './getModelDefault';
910
import { getModelProperties } from './getModelProperties';
1011
import { getType } from './getType';
12+
import { getOneOfEnum } from './getOneOfEnum';
1113

1214
export const getModel = (
1315
openApi: OpenApi,
@@ -122,7 +124,22 @@ export const getModel = (
122124
}
123125
}
124126

125-
if (definition.oneOf?.length) {
127+
if (
128+
definition.oneOf?.length &&
129+
(definition.type === 'integer' || definition.type === 'string') &&
130+
(typeof definition.oneOf?.at(0)?.const === 'number' || typeof definition.oneOf?.at(0)?.const === 'string')
131+
) {
132+
const enumerator: Enum[] = getOneOfEnum(definition.oneOf);
133+
if (enumerator.length) {
134+
model.export = 'enum';
135+
model.type = 'string';
136+
model.base = 'string';
137+
model.enum.push(...enumerator);
138+
model.default = getModelDefault(definition, model);
139+
140+
return model;
141+
}
142+
} else if (definition.oneOf?.length) {
126143
const composition = getModelComposition(openApi, definition, definition.oneOf, 'one-of', getModel);
127144
model.export = composition.type;
128145
model.imports.push(...composition.imports);

src/openApi/v3/parser/getOneOfEnum.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { Enum } from '../../../client/interfaces/Enum';
2+
import { OpenApiSchema } from '../interfaces/OpenApiSchema';
3+
4+
export const getOneOfEnum = (oneOf: OpenApiSchema[]): Enum[] =>
5+
oneOf.reduce((enums, item) => {
6+
if (typeof item.const === 'number') {
7+
enums.push({
8+
value: String(item.const),
9+
name: `${item.title}` || `'_${item.const}'`,
10+
type: 'number',
11+
description: item.description || item.title || null,
12+
});
13+
} else {
14+
enums.push({
15+
value: `'${item.const}'`,
16+
name: `${item.title}` || `'${item.const}'`,
17+
type: 'string',
18+
description: item.description || item.title || null,
19+
});
20+
}
21+
return enums;
22+
}, [] as Enum[]);

0 commit comments

Comments
 (0)