Skip to content

Commit f9e2ab5

Browse files
committed
feat: oneOf support for typescript openapi 3
BREAKING CHANGE: OneOfSchemaObject type was added to SchemaObject
1 parent 50dd408 commit f9e2ab5

File tree

2 files changed

+49
-13
lines changed

2 files changed

+49
-13
lines changed

src/language/typescript/3.0/serializers/schema-object.ts

+25-11
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
getSerializedPropertyType,
77
getSerializedRecursiveType,
88
getSerializedRefType,
9+
getSerializedUnionType,
910
intercalateSerializedTypes,
1011
SERIALIZED_BOOLEAN_TYPE,
1112
SERIALIZED_NUMERIC_TYPE,
@@ -22,9 +23,10 @@ import { constFalse } from 'fp-ts/lib/function';
2223
import { includes } from '../../../../utils/array';
2324
import { sequenceEither } from '@devexperts/utils/dist/adt/either.utils';
2425
import { fromString, Ref } from '../../../../utils/ref';
25-
import { AllOfSchemaObjectCodec, SchemaObject } from '../../../../schema/3.0/schema-object';
26+
import { AllOfSchemaObjectCodec, OneOfSchemaObjectCodec, SchemaObject } from '../../../../schema/3.0/schema-object';
2627
import { ReferenceObject, ReferenceObjectCodec } from '../../../../schema/3.0/reference-object';
2728
import { traverseNEAEither } from '../../../../utils/either';
29+
import { NonEmptyArray } from 'fp-ts/lib/NonEmptyArray';
2830

2931
type AdditionalProperties = boolean | ReferenceObject | SchemaObject;
3032
type AllowedAdditionalProperties = true | ReferenceObject | SchemaObject;
@@ -41,18 +43,17 @@ export const serializeSchemaObject = (
4143
const serializeSchemaObjectWithRecursion = (from: Ref, shouldTrackRecursion: boolean, name?: string) => (
4244
schemaObject: SchemaObject,
4345
): Either<Error, SerializedType> => {
46+
if (OneOfSchemaObjectCodec.is(schemaObject)) {
47+
return pipe(
48+
serializeChildren(from, schemaObject.oneOf),
49+
either.map(getSerializedUnionType),
50+
either.map(getSerializedRecursiveType(from, shouldTrackRecursion)),
51+
);
52+
}
53+
4454
if (AllOfSchemaObjectCodec.is(schemaObject)) {
4555
return pipe(
46-
traverseNEAEither(schemaObject.allOf, item => {
47-
if (ReferenceObjectCodec.is(item)) {
48-
return pipe(
49-
fromString(item.$ref),
50-
either.map(getSerializedRefType(from)),
51-
);
52-
} else {
53-
return serializeSchemaObjectWithRecursion(from, false)(item);
54-
}
55-
}),
56+
serializeChildren(from, schemaObject.allOf),
5657
either.map(getSerializedIntersectionType),
5758
either.map(getSerializedRecursiveType(from, shouldTrackRecursion)),
5859
);
@@ -166,3 +167,16 @@ const serializeSchemaObjectWithRecursion = (from: Ref, shouldTrackRecursion: boo
166167
}
167168
}
168169
};
170+
171+
const serializeChildren = (
172+
from: Ref,
173+
children: NonEmptyArray<ReferenceObject | SchemaObject>,
174+
): Either<Error, NonEmptyArray<SerializedType>> =>
175+
traverseNEAEither(children, item =>
176+
ReferenceObjectCodec.is(item)
177+
? pipe(
178+
fromString(item.$ref),
179+
either.map(getSerializedRefType(from)),
180+
)
181+
: serializeSchemaObjectWithRecursion(from, false)(item),
182+
);

src/schema/3.0/schema-object.ts

+24-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,30 @@ export const AllOfSchemaObjectCodec: Codec<AllOfSchemaObject> = recursion('AllOf
6969
}),
7070
);
7171

72-
export type SchemaObject = PrimitiveSchemaObject | ObjectSchemaObject | ArraySchemaObject | AllOfSchemaObject;
72+
export interface OneOfSchemaObject extends BaseSchemaObject {
73+
readonly oneOf: NonEmptyArray<ReferenceObject | SchemaObject>;
74+
}
75+
76+
export const OneOfSchemaObjectCodec: Codec<OneOfSchemaObject> = recursion('OneOfSchemaObject', () =>
77+
type({
78+
...BaseSchemaObjectProps,
79+
oneOf: nonEmptyArray(union([ReferenceObjectCodec, SchemaObjectCodec])),
80+
}),
81+
);
82+
83+
export type SchemaObject =
84+
| PrimitiveSchemaObject
85+
| ObjectSchemaObject
86+
| ArraySchemaObject
87+
| AllOfSchemaObject
88+
| OneOfSchemaObject;
7389

7490
export const SchemaObjectCodec: Codec<SchemaObject> = recursion('SchemaObject', () =>
75-
union([PrimitiveSchemaObjectCodec, ObjectSchemaObjectCodec, ArraySchemaObjectCodec, AllOfSchemaObjectCodec]),
91+
union([
92+
PrimitiveSchemaObjectCodec,
93+
ObjectSchemaObjectCodec,
94+
ArraySchemaObjectCodec,
95+
AllOfSchemaObjectCodec,
96+
OneOfSchemaObjectCodec,
97+
]),
7698
);

0 commit comments

Comments
 (0)