diff --git a/packages/openapi-generator/src/knownImports.ts b/packages/openapi-generator/src/knownImports.ts index 5734b0b6..fab630d0 100644 --- a/packages/openapi-generator/src/knownImports.ts +++ b/packages/openapi-generator/src/knownImports.ts @@ -338,8 +338,7 @@ export const KNOWN_IMPORTS: KnownImports = { E.right({ type: 'string', format: 'number', decodedType: 'bigint' }), BooleanFromNumber: () => E.right({ type: 'number', enum: [0, 1], decodedType: 'boolean' }), - BooleanFromString: () => - E.right({ type: 'string', enum: ['true', 'false'], decodedType: 'boolean' }), + BooleanFromString: () => E.right({ type: 'boolean' }), DateFromISOString: () => E.right({ type: 'string', format: 'date-time', title: 'ISO Date String' }), DateFromNumber: () => diff --git a/packages/openapi-generator/src/optimize.ts b/packages/openapi-generator/src/optimize.ts index 1b85ee9b..dc652c4c 100644 --- a/packages/openapi-generator/src/optimize.ts +++ b/packages/openapi-generator/src/optimize.ts @@ -40,6 +40,14 @@ function consolidateUnion(schema: Schema): Schema { const consolidatableTypes = ['boolean', 'number', 'string']; const innerSchemas = schema.schemas.map(optimize); + const booleanSchemas = innerSchemas.filter( + (s) => s.type === 'boolean' || s.decodedType === 'boolean', + ); + + if (booleanSchemas.length === innerSchemas.length && booleanSchemas.length > 0) { + return { type: 'boolean' }; + } + const isConsolidatableType = (s: Schema): boolean => { return ( (s.primitive && consolidatableTypes.includes(s.type)) || diff --git a/packages/openapi-generator/test/openapi/misc.test.ts b/packages/openapi-generator/test/openapi/misc.test.ts index a132da7e..dba14e38 100644 --- a/packages/openapi-generator/test/openapi/misc.test.ts +++ b/packages/openapi-generator/test/openapi/misc.test.ts @@ -292,4 +292,3 @@ testCase("route with record types", ROUTE_WITH_RECORD_TYPES, { } } }); - diff --git a/packages/openapi-generator/test/openapi/union.test.ts b/packages/openapi-generator/test/openapi/union.test.ts index ab03df25..ec715f3c 100644 --- a/packages/openapi-generator/test/openapi/union.test.ts +++ b/packages/openapi-generator/test/openapi/union.test.ts @@ -215,8 +215,8 @@ testCase("route with consolidatable union schemas", ROUTE_WITH_CONSOLIDATABLE_UN required: true, schema: { oneOf: [ - { type: 'string', format: 'number' }, - { type: 'string', enum: ['true', 'false'] } + { type: 'boolean' }, + { type: 'string', format: 'number' } ] } }, @@ -227,7 +227,7 @@ testCase("route with consolidatable union schemas", ROUTE_WITH_CONSOLIDATABLE_UN schema: { oneOf: [ { type: 'string' }, - { type: 'string', enum: ['true', 'false'] } + { type: 'boolean' } ] } }, @@ -235,7 +235,7 @@ testCase("route with consolidatable union schemas", ROUTE_WITH_CONSOLIDATABLE_UN name: 'firstNonUnion', in: 'query', required: true, - schema: { type: 'string', enum: ['true', 'false'] } + schema: { type: 'boolean' } }, { name: 'secondNonUnion',