Skip to content

Commit abf4cec

Browse files
authored
feat: support enum boolean union types (#76)
1 parent fcbdb44 commit abf4cec

File tree

8 files changed

+50
-4
lines changed

8 files changed

+50
-4
lines changed

src/internal/OpenApiTools/Guard.ts

+4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ export const isPrimitiveSchema = (schema: OpenApi.Schema): schema is Types.Primi
3838
return true;
3939
};
4040

41+
export const isBooleanArray = (list: any[]): list is boolean[] => {
42+
return !list.some(item => typeof item !== "boolean");
43+
};
44+
4145
export const isNumberArray = (list: any[]): list is number[] => {
4246
return !list.some(item => typeof item !== "number");
4347
};

src/internal/OpenApiTools/components/Schema.ts

+5
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ export const generateTypeAlias = (
149149
type: schema.type,
150150
enum: schema.enum,
151151
});
152+
} else if (schema.type === "boolean") {
153+
type = factory.TypeNode.create({
154+
type: schema.type,
155+
enum: Guard.isBooleanArray(schema.enum) ? schema.enum : undefined,
156+
});
152157
} else {
153158
type = factory.TypeNode.create({
154159
type: schema.type,

src/internal/OpenApiTools/toTypeNode.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -186,9 +186,18 @@ export const convert: Convert = (
186186
}
187187
switch (schema.type) {
188188
case "boolean": {
189-
const typeNode = factory.TypeNode.create({
190-
type: "boolean",
191-
});
189+
const items = schema.enum;
190+
let typeNode: ts.TypeNode;
191+
if (items && Guard.isBooleanArray(items)) {
192+
typeNode = factory.TypeNode.create({
193+
type: schema.type,
194+
enum: items,
195+
});
196+
} else {
197+
typeNode = factory.TypeNode.create({
198+
type: schema.type,
199+
});
200+
}
192201
return nullable(factory, typeNode, !!schema.nullable);
193202
}
194203
case "null": {

src/internal/TsGenerator/factory/TypeNode.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface NumberParams {
2121

2222
export interface BooleanParams {
2323
type: "boolean";
24+
enum?: boolean[];
2425
}
2526

2627
export interface ObjectParams {
@@ -91,8 +92,14 @@ export const create = (context: Pick<ts.TransformationContext, "factory">): Fact
9192
});
9293
}
9394
return factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword);
94-
case "boolean":
95+
case "boolean": {
96+
if (params.enum) {
97+
return unionTypeNode({
98+
typeNodes: params.enum.map(value => literalTypeNode({ value })),
99+
});
100+
}
95101
return factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword);
102+
}
96103
case "object":
97104
return factory.createTypeLiteralNode(params.value);
98105
case "undefined":

test/__tests__/__snapshots__/spit-code-test.ts.snap

+3
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,9 @@ export namespace Schemas {
262262
export type NumberDouble = number;
263263
/** Boolean Literal */
264264
export type BooleanType = boolean;
265+
export type BooleanEnumType = true;
266+
export type BooleanEnumType2 = false;
267+
export type BooleanEnumType3 = true | false;
265268
export type ArrayStringType = string[];
266269
export type ArrayNumberType = number[];
267270
export type ArrayBooleanType = boolean[];

test/__tests__/__snapshots__/typedef-only-test.ts.snap

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ export namespace Schemas {
2929
export type NumberDouble = number;
3030
/** Boolean Literal */
3131
export type BooleanType = boolean;
32+
export type BooleanEnumType = true;
33+
export type BooleanEnumType2 = false;
34+
export type BooleanEnumType3 = true | false;
3235
export type ArrayStringType = string[];
3336
export type ArrayNumberType = number[];
3437
export type ArrayBooleanType = boolean[];

test/__tests__/__snapshots__/typedef-with-template-test.ts.snap

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ export namespace Schemas {
2929
export type NumberDouble = number;
3030
/** Boolean Literal */
3131
export type BooleanType = boolean;
32+
export type BooleanEnumType = true;
33+
export type BooleanEnumType2 = false;
34+
export type BooleanEnumType3 = true | false;
3235
export type ArrayStringType = string[];
3336
export type ArrayNumberType = number[];
3437
export type ArrayBooleanType = boolean[];
@@ -569,6 +572,9 @@ export namespace Schemas {
569572
export type NumberDouble = number;
570573
/** Boolean Literal */
571574
export type BooleanType = boolean;
575+
export type BooleanEnumType = true;
576+
export type BooleanEnumType2 = false;
577+
export type BooleanEnumType3 = true | false;
572578
export type ArrayStringType = string[];
573579
export type ArrayNumberType = number[];
574580
export type ArrayBooleanType = boolean[];

test/api.test.domain/index.yml

+9
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ components:
6868
BooleanType:
6969
type: boolean
7070
description: Boolean Literal
71+
BooleanEnumType:
72+
type: boolean
73+
enum: [true]
74+
BooleanEnumType2:
75+
type: boolean
76+
enum: [false]
77+
BooleanEnumType3:
78+
type: boolean
79+
enum: [true, false]
7180
ArrayStringType:
7281
type: array
7382
items:

0 commit comments

Comments
 (0)