diff --git a/packages/cli/src/swagger/specGenerator2.ts b/packages/cli/src/swagger/specGenerator2.ts index ae2c39b21..c9218fdc7 100644 --- a/packages/cli/src/swagger/specGenerator2.ts +++ b/packages/cli/src/swagger/specGenerator2.ts @@ -2,6 +2,7 @@ import { ExtendedSpecConfig } from '../cli'; import { Tsoa, assertNever, Swagger } from '@tsoa/runtime'; import { isVoidType } from '../utils/isVoidType'; import { convertColonPathParams, normalisePath } from './../utils/pathUtils'; +import { getValue } from './../utils/swaggerUtils'; import { SpecGenerator } from './specGenerator'; import { UnspecifiedObject } from '../utils/unspecifiedObject'; @@ -462,6 +463,6 @@ export class SpecGenerator2 extends SpecGenerator { const types = this.determineTypesUsedInEnum(enumType.enums); const type = types.size === 1 ? types.values().next().value : 'string'; const nullable = enumType.enums.includes(null) ? true : false; - return { type, enum: enumType.enums.map(member => (member === null ? null : String(member))), ['x-nullable']: nullable }; + return { type, enum: enumType.enums.map(member => getValue(type, member)), ['x-nullable']: nullable }; } } diff --git a/packages/cli/src/swagger/specGenerator3.ts b/packages/cli/src/swagger/specGenerator3.ts index 581b77719..d8073a45d 100644 --- a/packages/cli/src/swagger/specGenerator3.ts +++ b/packages/cli/src/swagger/specGenerator3.ts @@ -2,6 +2,7 @@ import { ExtendedSpecConfig } from '../cli'; import { Tsoa, assertNever, Swagger } from '@tsoa/runtime'; import { isVoidType } from '../utils/isVoidType'; import { convertColonPathParams, normalisePath } from './../utils/pathUtils'; +import { getValue } from './../utils/swaggerUtils'; import { SpecGenerator } from './specGenerator'; import { UnspecifiedObject } from '../utils/unspecifiedObject'; @@ -639,7 +640,7 @@ export class SpecGenerator3 extends SpecGenerator { if (types.size === 1) { const type = types.values().next().value; const nullable = enumType.enums.includes(null) ? true : false; - return { type, enum: enumType.enums.map(member => (member === null ? null : String(member))), nullable }; + return { type, enum: enumType.enums.map(member => getValue(type, member)), nullable }; } else { const valuesDelimited = Array.from(types).join(','); throw new Error(`Enums can only have string or number values, but enum had ${valuesDelimited}`); diff --git a/packages/cli/src/utils/swaggerUtils.ts b/packages/cli/src/utils/swaggerUtils.ts new file mode 100644 index 000000000..c1ebb64f0 --- /dev/null +++ b/packages/cli/src/utils/swaggerUtils.ts @@ -0,0 +1,16 @@ +export function getValue(type: 'string' | 'number' | 'integer' | 'boolean', member: any) { + if (member === null) { + return null; + } + + switch (type) { + case 'integer': + case 'number': + return Number(member); + case 'boolean': + return member; + case 'string': + default: + return String(member); + } +} diff --git a/tests/unit/swagger/definitionsGeneration/definitions.spec.ts b/tests/unit/swagger/definitionsGeneration/definitions.spec.ts index ab3ec61d3..5210b8164 100644 --- a/tests/unit/swagger/definitionsGeneration/definitions.spec.ts +++ b/tests/unit/swagger/definitionsGeneration/definitions.spec.ts @@ -442,7 +442,7 @@ describe('Definition generation', () => { throw new Error(`There was no 'enum' property on ${propertyName}.`); } expect(propertySchema.enum).to.have.length(1, `for property ${propertyName}.enum`); - expect(propertySchema.enum).to.include('3.1415', `for property ${propertyName}.enum`); + expect(propertySchema.enum).to.include(3.1415, `for property ${propertyName}.enum`); }, dateValue: (propertyName, propertySchema) => { expect(propertySchema.type).to.eq('string', `for property ${propertyName}.type`); diff --git a/tests/unit/swagger/schemaDetails3.spec.ts b/tests/unit/swagger/schemaDetails3.spec.ts index c8cbdd16e..ae57319cb 100644 --- a/tests/unit/swagger/schemaDetails3.spec.ts +++ b/tests/unit/swagger/schemaDetails3.spec.ts @@ -1114,8 +1114,8 @@ describe('Definition generation for OpenAPI 3.0.0', () => { expect(propertySchema).to.deep.eq({ anyOf: [ { type: 'string', enum: ['String'] }, - { type: 'number', enum: ['1', '20'] }, - { type: 'boolean', enum: ['true', 'false'] }, + { type: 'number', enum: [1, 20] }, + { type: 'boolean', enum: [true, false] }, ], default: undefined, description: undefined, @@ -1127,8 +1127,8 @@ describe('Definition generation for OpenAPI 3.0.0', () => { expect(propertySchema).to.deep.eq({ anyOf: [ { type: 'string', enum: ['String'] }, - { type: 'number', enum: ['1', '20'] }, - { type: 'boolean', enum: ['true', 'false'] }, + { type: 'number', enum: [1, 20] }, + { type: 'boolean', enum: [true, false] }, ], default: undefined, description: undefined, @@ -1144,7 +1144,7 @@ describe('Definition generation for OpenAPI 3.0.0', () => { throw new Error(`There was no 'enum' property on ${propertyName}.`); } expect(propertySchema.enum).to.have.length(1, `for property ${propertyName}.enum`); - expect(propertySchema.enum).to.include('3.1415', `for property ${propertyName}.enum`); + expect(propertySchema.enum).to.include(3.1415, `for property ${propertyName}.enum`); }, dateValue: (propertyName, propertySchema) => { expect(propertySchema.type).to.eq('string', `for property ${propertyName}.type`);