diff --git a/packages/cli/src/metadataGeneration/parameterGenerator.ts b/packages/cli/src/metadataGeneration/parameterGenerator.ts index a06672693..8e45b3560 100644 --- a/packages/cli/src/metadataGeneration/parameterGenerator.ts +++ b/packages/cli/src/metadataGeneration/parameterGenerator.ts @@ -280,7 +280,7 @@ export class ParameterGenerator { private getFormFieldParameter(parameter: ts.ParameterDeclaration): Tsoa.Parameter { const parameterName = (parameter.name as ts.Identifier).text; - const type: Tsoa.Type = { dataType: 'string' }; + const type = this.getValidatedType(parameter); if (!this.supportPathDataType(type)) { throw new GenerateMetadataError(`Parameter '${parameterName}:${type.dataType}' can't be passed as form field parameter in '${this.method.toUpperCase()}'.`, parameter); diff --git a/tests/fixtures/controllers/parameterController.ts b/tests/fixtures/controllers/parameterController.ts index 64ff6517b..81776e630 100644 --- a/tests/fixtures/controllers/parameterController.ts +++ b/tests/fixtures/controllers/parameterController.ts @@ -1,5 +1,5 @@ import { Body, BodyProp, Get, Header, Path, Post, Query, Request, Route, Res, TsoaResponse, Deprecated, Queries, RequestProp, FormField } from '@tsoa/runtime'; -import { Gender, ParameterTestModel } from '../testModel'; +import { EnumNumberValue, FormTestModel, Gender, ParameterTestModel } from '../testModel'; @Route('ParameterTest') export class ParameterController { @@ -308,13 +308,17 @@ export class ParameterController { }); } - @Get('ParameterHeaderStringType') - public async headerStringType(@Header() header: string): Promise { - // + @Get('FormData') + public async formData(@FormField() data: string, @FormField() indexes: EnumNumberValue, @FormField() gender: Gender): Promise { + return Promise.resolve({ + data, + indexes, + gender, + }); } - @Get('FormDataStringType') - public async formData(@FormField() data: string): Promise { + @Get('ParameterHeaderStringType') + public async headerStringType(@Header() header: string): Promise { // } diff --git a/tests/fixtures/testModel.ts b/tests/fixtures/testModel.ts index 4cf58b56b..07989b19d 100644 --- a/tests/fixtures/testModel.ts +++ b/tests/fixtures/testModel.ts @@ -828,6 +828,12 @@ export class ParameterTestModel { public nicknames?: string[]; } +export class FormTestModel { + public data!: string; + public indexes!: EnumNumberValue; + public gender!: Gender; +} + export class ValidateCustomErrorModel {} export class ValidateModel { diff --git a/tests/unit/swagger/schemaDetails.spec.ts b/tests/unit/swagger/schemaDetails.spec.ts index 1be7e8e1b..c7ca98ed0 100644 --- a/tests/unit/swagger/schemaDetails.spec.ts +++ b/tests/unit/swagger/schemaDetails.spec.ts @@ -1004,11 +1004,21 @@ describe('Schema details generation', () => { const metadata = new MetadataGenerator('./fixtures/controllers/parameterController.ts').Generate(); const spec = new SpecGenerator2(metadata, getDefaultExtendedOptions()).GetSpec(); - const method = spec.paths['/ParameterTest/FormDataStringType'].get?.parameters ?? []; - - expect(method).to.have.lengthOf(1); - const queryParam = method[0]; - expect(queryParam.in).to.equal('formData'); + const method = spec.paths['/ParameterTest/FormData'].get?.parameters ?? []; + + expect(method).to.have.lengthOf(3); + const [data, indexes, gender] = method; + + expect(data.in).to.equal('formData'); + expect(data.type).to.equal('string'); + // Can process numeric enum + expect(indexes.in).to.equal('formData'); + expect(indexes.type).to.equal('number'); + expect(indexes.enum).to.deep.equal([0, 2, 5]); + // Can process string enum + expect(gender.in).to.equal('formData'); + expect(gender.type).to.equal('string'); + expect(gender.enum).to.deep.equal(['MALE', 'FEMALE']); }); });