Skip to content

Commit

Permalink
fix: correct types in enums (#1117)
Browse files Browse the repository at this point in the history
* Fixed usage of correct types in enums #1068

* Apply review suggestion

* Apply change also to OAS2 as per review suggestion
  • Loading branch information
FlorianRappl authored Nov 1, 2021
1 parent cc136d0 commit 596e163
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 8 deletions.
3 changes: 2 additions & 1 deletion packages/cli/src/swagger/specGenerator2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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 };
}
}
3 changes: 2 additions & 1 deletion packages/cli/src/swagger/specGenerator3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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}`);
Expand Down
16 changes: 16 additions & 0 deletions packages/cli/src/utils/swaggerUtils.ts
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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`);
Expand Down
10 changes: 5 additions & 5 deletions tests/unit/swagger/schemaDetails3.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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`);
Expand Down

0 comments on commit 596e163

Please sign in to comment.