From 48edeb7f3a554216c3603f6da5453b411c20cf03 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Sat, 11 Mar 2017 21:41:03 +0200 Subject: [PATCH] Hashmap support --- src/metadataGeneration/metadataGenerator.ts | 1 + src/metadataGeneration/resolveType.ts | 33 +++- src/routeGeneration/routeGenerator.ts | 36 +++- src/routeGeneration/templateHelpers.ts | 28 ++- src/swagger/specGenerator.ts | 16 ++ src/swagger/swagger.ts | 2 +- tests/fixtures/express/routes.ts | 160 ++++++++++------ tests/fixtures/hapi/routes.ts | 180 +++++++++++------- tests/fixtures/inversify/routes.ts | 94 +++++---- tests/fixtures/koa/routes.ts | 160 ++++++++++------ tests/fixtures/testModel.ts | 17 +- tests/integration/express-server.spec.ts | 7 + tests/integration/hapi-server.spec.ts | 7 + tests/integration/inversify-server.spec.ts | 7 + .../definitionsGeneration/definitions.spec.ts | 2 +- 15 files changed, 523 insertions(+), 227 deletions(-) diff --git a/src/metadataGeneration/metadataGenerator.ts b/src/metadataGeneration/metadataGenerator.ts index a7f238d92..bec3609cd 100644 --- a/src/metadataGeneration/metadataGenerator.ts +++ b/src/metadataGeneration/metadataGenerator.ts @@ -110,6 +110,7 @@ export interface EnumerateType extends Type { export interface ReferenceType extends Type { description: string; properties: Property[]; + additionalProperties?: Property[]; } export interface ArrayType extends Type { diff --git a/src/metadataGeneration/resolveType.ts b/src/metadataGeneration/resolveType.ts index a6546ba7c..11dce8c11 100644 --- a/src/metadataGeneration/resolveType.ts +++ b/src/metadataGeneration/resolveType.ts @@ -183,12 +183,16 @@ function getReferenceType(type: ts.EntityName, genericTypes?: ts.TypeNode[]): Re const modelTypeDeclaration = getModelTypeDeclaration(type); const properties = getModelTypeProperties(modelTypeDeclaration, genericTypes); + const additionalProperties = getModelTypeAdditionalProperties(modelTypeDeclaration); const referenceType: ReferenceType = { description: getModelDescription(modelTypeDeclaration), properties: properties, typeName: typeNameWithGenerics, }; + if (additionalProperties && additionalProperties.length) { + referenceType.additionalProperties = additionalProperties; + } const extendedProperties = getInheritedProperties(modelTypeDeclaration); referenceType.properties = referenceType.properties.concat(extendedProperties); @@ -340,9 +344,9 @@ function getModelTypeProperties(node: UsableDeclaration, genericTypes?: ts.TypeN const interfaceDeclaration = node as ts.InterfaceDeclaration; return interfaceDeclaration.members .filter(member => member.kind === ts.SyntaxKind.PropertySignature) - .map((property: any) => { + .map((member: any) => { - const propertyDeclaration = property as ts.PropertyDeclaration; + const propertyDeclaration = member as ts.PropertyDeclaration; const identifier = propertyDeclaration.name as ts.Identifier; if (!propertyDeclaration.type) { throw new Error('No valid type found for property declaration.'); } @@ -379,7 +383,7 @@ function getModelTypeProperties(node: UsableDeclaration, genericTypes?: ts.TypeN return { description: getNodeDescription(propertyDeclaration), name: identifier.text, - required: !property.questionToken, + required: !propertyDeclaration.questionToken, type: ResolveType(aType) }; }); @@ -424,6 +428,29 @@ function getModelTypeProperties(node: UsableDeclaration, genericTypes?: ts.TypeN }); } +function getModelTypeAdditionalProperties(node: UsableDeclaration) { + if (node.kind === ts.SyntaxKind.InterfaceDeclaration) { + const interfaceDeclaration = node as ts.InterfaceDeclaration; + return interfaceDeclaration.members + .filter(member => member.kind === ts.SyntaxKind.IndexSignature) + .map((member: any) => { + const indexSignatureDeclaration = member as ts.IndexSignatureDeclaration; + + const indexType = ResolveType(indexSignatureDeclaration.parameters[0].type); + if (indexType.typeName !== 'string') { throw new Error('Only string indexers are supported'); } + + return { + description: '', + name: '', + required: true, + type: ResolveType(indexSignatureDeclaration.type) + }; + }); + } + + return undefined; +} + function hasPublicModifier(node: ts.Node) { return !node.modifiers || node.modifiers.every(modifier => { return modifier.kind !== ts.SyntaxKind.ProtectedKeyword && modifier.kind !== ts.SyntaxKind.PrivateKeyword; diff --git a/src/routeGeneration/routeGenerator.ts b/src/routeGeneration/routeGenerator.ts index 946bbb94f..a6c1bf064 100644 --- a/src/routeGeneration/routeGenerator.ts +++ b/src/routeGeneration/routeGenerator.ts @@ -75,9 +75,20 @@ export class RouteGenerator { const models: any = { {{#each models}} "{{name}}": { - {{#each properties}} - "{{@key}}": {{{json this}}}, - {{/each}} + {{#if properties}} + properties: { + {{#each properties}} + "{{@key}}": {{{json this}}}, + {{/each}} + }, + {{/if}} + {{#if additionalProperties}} + additionalProperties: [ + {{#each additionalProperties}} + {typeName: '{{typeName}}'}, + {{/each}} + ], + {{/if}} }, {{/each}} }; @@ -127,10 +138,14 @@ export class RouteGenerator { properties[property.name] = this.getPropertySchema(property); }); - return { + const templateModel: TemplateModel = { name: key, properties }; + if (referenceType.additionalProperties && referenceType.additionalProperties.length) { + templateModel.additionalProperties = referenceType.additionalProperties.map(property => this.getTemplateAdditionalProperty(property)); + } + return templateModel; }); } @@ -165,6 +180,14 @@ export class RouteGenerator { return templateProperty; } + private getTemplateAdditionalProperty(source: Property): TemplateAdditionalProperty { + const templateAdditionalProperty: TemplateAdditionalProperty = { + typeName: source.type.typeName + }; + + return templateAdditionalProperty; + } + private getParameterSchema(parameter: Parameter): ParameterSchema { const parameterSchema: ParameterSchema = { in: parameter.in, @@ -197,6 +220,7 @@ export class RouteGenerator { interface TemplateModel { name: string; properties: { [name: string]: PropertySchema }; + additionalProperties?: TemplateAdditionalProperty[]; } interface PropertySchema { @@ -207,6 +231,10 @@ interface PropertySchema { enumMembers?: string[]; } +interface TemplateAdditionalProperty { + typeName: string; +} + export interface ArraySchema { typeName: string; enumMembers?: string[]; diff --git a/src/routeGeneration/templateHelpers.ts b/src/routeGeneration/templateHelpers.ts index 573210be3..c8ce3db38 100644 --- a/src/routeGeneration/templateHelpers.ts +++ b/src/routeGeneration/templateHelpers.ts @@ -103,10 +103,30 @@ function validateModel(modelValue: any, typeName: string): any { const modelDefinition = models[typeName]; if (modelDefinition) { - Object.keys(modelDefinition).forEach((key: string) => { - const property = modelDefinition[key]; - modelValue[key] = ValidateParam(property, modelValue[key], models, key); - }); + if (modelDefinition.properties) { + Object.keys(modelDefinition.properties).forEach((key: string) => { + const property = modelDefinition.properties[key]; + modelValue[key] = ValidateParam(property, modelValue[key], models, key); + }); + } + if (modelDefinition.additionalProperties) { + Object.keys(modelValue).forEach((key: string) => { + let validatedValue = null; + for (const additionalProperty of modelDefinition.additionalProperties) { + try { + validatedValue = ValidateParam(additionalProperty, modelValue[key], models, key); + break; + } catch (err) { + continue; + } + } + if (validatedValue) { + modelValue[key] = validatedValue; + } else { + throw new Error(`No matching model found in additionalProperties to validate ${key}`); + } + }); + } } return modelValue; diff --git a/src/swagger/specGenerator.ts b/src/swagger/specGenerator.ts index 519b042f1..c28182973 100644 --- a/src/swagger/specGenerator.ts +++ b/src/swagger/specGenerator.ts @@ -65,6 +65,9 @@ export class SpecGenerator { required: referenceType.properties.filter(p => p.required).map(p => p.name), type: 'object' }; + if (referenceType.additionalProperties) { + definitions[referenceType.typeName].additionalProperties = this.buildAdditionalProperties(referenceType.additionalProperties); + } }); return definitions; @@ -176,6 +179,19 @@ export class SpecGenerator { return swaggerProperties; } + private buildAdditionalProperties(properties: Property[]) { + const swaggerAdditionalProperties: { [ref: string]: string } = {}; + + properties.forEach(property => { + const swaggerType = this.getSwaggerType(property.type); + if (swaggerType.$ref) { + swaggerAdditionalProperties['$ref'] = swaggerType.$ref; + } + }); + + return swaggerAdditionalProperties; + } + private buildOperation(controllerName: string, method: Method) { const responses: any = {}; diff --git a/src/swagger/swagger.ts b/src/swagger/swagger.ts index 43d676906..f88106996 100644 --- a/src/swagger/swagger.ts +++ b/src/swagger/swagger.ts @@ -136,7 +136,7 @@ export namespace Swagger { export interface Schema extends BaseSchema { $ref?: string; allOf?: [Schema]; - additionalProperties?: boolean; + additionalProperties?: boolean | { [ref: string]: string }; properties?: { [propertyName: string]: Schema }; discriminator?: string; readOnly?: boolean; diff --git a/tests/fixtures/express/routes.ts b/tests/fixtures/express/routes.ts index d24ed0045..36e99c722 100644 --- a/tests/fixtures/express/routes.ts +++ b/tests/fixtures/express/routes.ts @@ -12,95 +12,145 @@ import { SecurityTestController } from './../controllers/securityController'; const models: any = { "TestModel": { - "numberValue": { "required": true, "typeName": "double" }, - "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, - "stringValue": { "required": true, "typeName": "string" }, - "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, - "boolValue": { "required": true, "typeName": "boolean" }, - "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, - "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, - "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, - "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, - "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, - "modelValue": { "required": true, "typeName": "TestSubModel" }, - "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, - "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, - "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, - "dateValue": { "required": false, "typeName": "datetime" }, - "optionalString": { "required": false, "typeName": "string" }, - "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, - "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, - "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, - "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, - "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "numberValue": { "required": true, "typeName": "double" }, + "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, + "stringValue": { "required": true, "typeName": "string" }, + "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + "boolValue": { "required": true, "typeName": "boolean" }, + "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, + "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, + "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, + "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, + "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, + "modelValue": { "required": true, "typeName": "TestSubModel" }, + "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, + "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, + "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, + "dateValue": { "required": false, "typeName": "datetime" }, + "optionalString": { "required": false, "typeName": "string" }, + "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, + "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, + "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, + "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, + "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModel": { - "email": { "required": true, "typeName": "string" }, - "circular": { "required": false, "typeName": "TestModel" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModel2": { - "testSubModel2": { "required": true, "typeName": "boolean" }, - "email": { "required": true, "typeName": "string" }, - "circular": { "required": false, "typeName": "TestModel" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "testSubModel2": { "required": true, "typeName": "boolean" }, + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModelContainer": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModel2' }, + ], + }, + "TestSubModelNamespace.TestSubModelNS": { + properties: { + "testSubModelNS": { "required": true, "typeName": "boolean" }, + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModelContainerNamespace.TestSubModelContainer": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModelNamespace.TestSubModelNS' }, + ], }, "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModelNamespace.TestSubModelNS' }, + ], }, "TestSubModelContainerNamespace_TestSubModelContainer": { + properties: { + }, }, "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2": { + properties: { + }, }, "TestClassModel": { - "publicStringProperty": { "required": true, "typeName": "string" }, - "optionalPublicStringProperty": { "required": false, "typeName": "string" }, - "stringProperty": { "required": true, "typeName": "string" }, - "publicConstructorVar": { "required": true, "typeName": "string" }, - "optionalPublicConstructorVar": { "required": false, "typeName": "string" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "publicStringProperty": { "required": true, "typeName": "string" }, + "optionalPublicStringProperty": { "required": false, "typeName": "string" }, + "stringProperty": { "required": true, "typeName": "string" }, + "publicConstructorVar": { "required": true, "typeName": "string" }, + "optionalPublicConstructorVar": { "required": false, "typeName": "string" }, + "id": { "required": true, "typeName": "double" }, + }, }, "GenericRequestTestModel": { - "name": { "required": true, "typeName": "string" }, - "value": { "required": true, "typeName": "TestModel" }, + properties: { + "name": { "required": true, "typeName": "string" }, + "value": { "required": true, "typeName": "TestModel" }, + }, }, "Result": { - "value": { "required": true, "typeName": "object" }, + properties: { + "value": { "required": true, "typeName": "object" }, + }, }, "GenericModelTestModel": { - "result": { "required": true, "typeName": "TestModel" }, + properties: { + "result": { "required": true, "typeName": "TestModel" }, + }, }, "GenericModelTestModel[]": { - "result": { "required": true, "typeName": "array", "array": { "typeName": "TestModel" } }, + properties: { + "result": { "required": true, "typeName": "array", "array": { "typeName": "TestModel" } }, + }, }, "GenericModelstring": { - "result": { "required": true, "typeName": "string" }, + properties: { + "result": { "required": true, "typeName": "string" }, + }, }, "GenericModelstring[]": { - "result": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + properties: { + "result": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + }, }, "ErrorResponseModel": { - "status": { "required": true, "typeName": "double" }, - "message": { "required": true, "typeName": "string" }, + properties: { + "status": { "required": true, "typeName": "double" }, + "message": { "required": true, "typeName": "string" }, + }, }, "ParameterTestModel": { - "firstname": { "required": true, "typeName": "string" }, - "lastname": { "required": true, "typeName": "string" }, - "age": { "required": true, "typeName": "integer" }, - "weight": { "required": true, "typeName": "float" }, - "human": { "required": true, "typeName": "boolean" }, - "gender": { "required": true, "typeName": "enum", "enumMembers": ["MALE", "FEMALE"] }, + properties: { + "firstname": { "required": true, "typeName": "string" }, + "lastname": { "required": true, "typeName": "string" }, + "age": { "required": true, "typeName": "integer" }, + "weight": { "required": true, "typeName": "float" }, + "human": { "required": true, "typeName": "boolean" }, + "gender": { "required": true, "typeName": "enum", "enumMembers": ["MALE", "FEMALE"] }, + }, }, "UserResponseModel": { - "id": { "required": true, "typeName": "double" }, - "name": { "required": true, "typeName": "string" }, + properties: { + "id": { "required": true, "typeName": "double" }, + "name": { "required": true, "typeName": "string" }, + }, }, }; diff --git a/tests/fixtures/hapi/routes.ts b/tests/fixtures/hapi/routes.ts index bab55e55a..0d289e563 100644 --- a/tests/fixtures/hapi/routes.ts +++ b/tests/fixtures/hapi/routes.ts @@ -12,95 +12,145 @@ import { SecurityTestController } from './../controllers/securityController'; const models: any = { "TestModel": { - "numberValue": { "required": true, "typeName": "double" }, - "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, - "stringValue": { "required": true, "typeName": "string" }, - "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, - "boolValue": { "required": true, "typeName": "boolean" }, - "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, - "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, - "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, - "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, - "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, - "modelValue": { "required": true, "typeName": "TestSubModel" }, - "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, - "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, - "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, - "dateValue": { "required": false, "typeName": "datetime" }, - "optionalString": { "required": false, "typeName": "string" }, - "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, - "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, - "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, - "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, - "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "numberValue": { "required": true, "typeName": "double" }, + "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, + "stringValue": { "required": true, "typeName": "string" }, + "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + "boolValue": { "required": true, "typeName": "boolean" }, + "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, + "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, + "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, + "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, + "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, + "modelValue": { "required": true, "typeName": "TestSubModel" }, + "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, + "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, + "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, + "dateValue": { "required": false, "typeName": "datetime" }, + "optionalString": { "required": false, "typeName": "string" }, + "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, + "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, + "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, + "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, + "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModel": { - "email": { "required": true, "typeName": "string" }, - "circular": { "required": false, "typeName": "TestModel" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModel2": { - "testSubModel2": { "required": true, "typeName": "boolean" }, - "email": { "required": true, "typeName": "string" }, - "circular": { "required": false, "typeName": "TestModel" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "testSubModel2": { "required": true, "typeName": "boolean" }, + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModelContainer": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModel2' }, + ], + }, + "TestSubModelNamespace.TestSubModelNS": { + properties: { + "testSubModelNS": { "required": true, "typeName": "boolean" }, + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModelContainerNamespace.TestSubModelContainer": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModelNamespace.TestSubModelNS' }, + ], }, "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModelNamespace.TestSubModelNS' }, + ], }, "TestSubModelContainerNamespace_TestSubModelContainer": { + properties: { + }, }, "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2": { + properties: { + }, }, "TestClassModel": { - "publicStringProperty": { "required": true, "typeName": "string" }, - "optionalPublicStringProperty": { "required": false, "typeName": "string" }, - "stringProperty": { "required": true, "typeName": "string" }, - "publicConstructorVar": { "required": true, "typeName": "string" }, - "optionalPublicConstructorVar": { "required": false, "typeName": "string" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "publicStringProperty": { "required": true, "typeName": "string" }, + "optionalPublicStringProperty": { "required": false, "typeName": "string" }, + "stringProperty": { "required": true, "typeName": "string" }, + "publicConstructorVar": { "required": true, "typeName": "string" }, + "optionalPublicConstructorVar": { "required": false, "typeName": "string" }, + "id": { "required": true, "typeName": "double" }, + }, }, "GenericRequestTestModel": { - "name": { "required": true, "typeName": "string" }, - "value": { "required": true, "typeName": "TestModel" }, + properties: { + "name": { "required": true, "typeName": "string" }, + "value": { "required": true, "typeName": "TestModel" }, + }, }, "Result": { - "value": { "required": true, "typeName": "object" }, + properties: { + "value": { "required": true, "typeName": "object" }, + }, }, "GenericModelTestModel": { - "result": { "required": true, "typeName": "TestModel" }, + properties: { + "result": { "required": true, "typeName": "TestModel" }, + }, }, "GenericModelTestModel[]": { - "result": { "required": true, "typeName": "array", "array": { "typeName": "TestModel" } }, + properties: { + "result": { "required": true, "typeName": "array", "array": { "typeName": "TestModel" } }, + }, }, "GenericModelstring": { - "result": { "required": true, "typeName": "string" }, + properties: { + "result": { "required": true, "typeName": "string" }, + }, }, "GenericModelstring[]": { - "result": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + properties: { + "result": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + }, }, "ErrorResponseModel": { - "status": { "required": true, "typeName": "double" }, - "message": { "required": true, "typeName": "string" }, + properties: { + "status": { "required": true, "typeName": "double" }, + "message": { "required": true, "typeName": "string" }, + }, }, "ParameterTestModel": { - "firstname": { "required": true, "typeName": "string" }, - "lastname": { "required": true, "typeName": "string" }, - "age": { "required": true, "typeName": "integer" }, - "weight": { "required": true, "typeName": "float" }, - "human": { "required": true, "typeName": "boolean" }, - "gender": { "required": true, "typeName": "enum", "enumMembers": ["MALE", "FEMALE"] }, + properties: { + "firstname": { "required": true, "typeName": "string" }, + "lastname": { "required": true, "typeName": "string" }, + "age": { "required": true, "typeName": "integer" }, + "weight": { "required": true, "typeName": "float" }, + "human": { "required": true, "typeName": "boolean" }, + "gender": { "required": true, "typeName": "enum", "enumMembers": ["MALE", "FEMALE"] }, + }, }, "UserResponseModel": { - "id": { "required": true, "typeName": "double" }, - "name": { "required": true, "typeName": "string" }, + properties: { + "id": { "required": true, "typeName": "double" }, + "name": { "required": true, "typeName": "string" }, + }, }, }; @@ -1288,8 +1338,8 @@ export function RegisterRoutes(server: hapi.Server) { pre: [ { method: authenticateMiddleware('api_key' - ) -} + ) + } ], handler: (request: any, reply) => { const args = { @@ -1321,8 +1371,8 @@ export function RegisterRoutes(server: hapi.Server) { { method: authenticateMiddleware('tsoa_auth' , ["write:pets", "read:pets"] - ) - } + ) +} ], handler: (request: any, reply) => { const args = { @@ -1587,8 +1637,8 @@ export function RegisterRoutes(server: hapi.Server) { pre: [ { method: authenticateMiddleware('api_key' - ) - } + ) +} ], handler: (request: any, reply) => { const args = { @@ -1620,8 +1670,8 @@ export function RegisterRoutes(server: hapi.Server) { pre: [ { method: authenticateMiddleware('api_key' - ) -} + ) + } ], handler: (request: any, reply) => { const args = { @@ -1654,8 +1704,8 @@ export function RegisterRoutes(server: hapi.Server) { { method: authenticateMiddleware('tsoa_auth' , ["write:pets", "read:pets"] - ) -} + ) + } ], handler: (request: any, reply) => { const args = { diff --git a/tests/fixtures/inversify/routes.ts b/tests/fixtures/inversify/routes.ts index 4f6b88f43..21edada73 100644 --- a/tests/fixtures/inversify/routes.ts +++ b/tests/fixtures/inversify/routes.ts @@ -6,52 +6,82 @@ import { ManagedController } from './managedController'; const models: any = { "TestModel": { - "numberValue": { "required": true, "typeName": "double" }, - "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, - "stringValue": { "required": true, "typeName": "string" }, - "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, - "boolValue": { "required": true, "typeName": "boolean" }, - "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, - "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, - "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, - "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, - "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, - "modelValue": { "required": true, "typeName": "TestSubModel" }, - "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, - "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, - "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, - "dateValue": { "required": false, "typeName": "datetime" }, - "optionalString": { "required": false, "typeName": "string" }, - "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, - "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, - "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, - "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, - "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "numberValue": { "required": true, "typeName": "double" }, + "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, + "stringValue": { "required": true, "typeName": "string" }, + "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + "boolValue": { "required": true, "typeName": "boolean" }, + "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, + "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, + "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, + "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, + "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, + "modelValue": { "required": true, "typeName": "TestSubModel" }, + "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, + "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, + "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, + "dateValue": { "required": false, "typeName": "datetime" }, + "optionalString": { "required": false, "typeName": "string" }, + "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, + "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, + "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, + "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, + "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModel": { - "email": { "required": true, "typeName": "string" }, - "circular": { "required": false, "typeName": "TestModel" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModel2": { - "testSubModel2": { "required": true, "typeName": "boolean" }, - "email": { "required": true, "typeName": "string" }, - "circular": { "required": false, "typeName": "TestModel" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "testSubModel2": { "required": true, "typeName": "boolean" }, + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModelContainer": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModel2' }, + ], + }, + "TestSubModelNamespace.TestSubModelNS": { + properties: { + "testSubModelNS": { "required": true, "typeName": "boolean" }, + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModelContainerNamespace.TestSubModelContainer": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModelNamespace.TestSubModelNS' }, + ], }, "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModelNamespace.TestSubModelNS' }, + ], }, "TestSubModelContainerNamespace_TestSubModelContainer": { + properties: { + }, }, "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2": { + properties: { + }, }, }; diff --git a/tests/fixtures/koa/routes.ts b/tests/fixtures/koa/routes.ts index 8089fa393..17b2a6f14 100644 --- a/tests/fixtures/koa/routes.ts +++ b/tests/fixtures/koa/routes.ts @@ -12,95 +12,145 @@ import { SecurityTestController } from './../controllers/securityController'; const models: any = { "TestModel": { - "numberValue": { "required": true, "typeName": "double" }, - "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, - "stringValue": { "required": true, "typeName": "string" }, - "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, - "boolValue": { "required": true, "typeName": "boolean" }, - "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, - "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, - "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, - "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, - "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, - "modelValue": { "required": true, "typeName": "TestSubModel" }, - "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, - "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, - "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, - "dateValue": { "required": false, "typeName": "datetime" }, - "optionalString": { "required": false, "typeName": "string" }, - "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, - "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, - "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, - "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, - "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "numberValue": { "required": true, "typeName": "double" }, + "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, + "stringValue": { "required": true, "typeName": "string" }, + "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + "boolValue": { "required": true, "typeName": "boolean" }, + "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, + "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, + "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, + "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, + "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, + "modelValue": { "required": true, "typeName": "TestSubModel" }, + "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, + "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, + "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, + "dateValue": { "required": false, "typeName": "datetime" }, + "optionalString": { "required": false, "typeName": "string" }, + "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, + "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, + "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, + "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, + "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModel": { - "email": { "required": true, "typeName": "string" }, - "circular": { "required": false, "typeName": "TestModel" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModel2": { - "testSubModel2": { "required": true, "typeName": "boolean" }, - "email": { "required": true, "typeName": "string" }, - "circular": { "required": false, "typeName": "TestModel" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "testSubModel2": { "required": true, "typeName": "boolean" }, + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModelContainer": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModel2' }, + ], + }, + "TestSubModelNamespace.TestSubModelNS": { + properties: { + "testSubModelNS": { "required": true, "typeName": "boolean" }, + "email": { "required": true, "typeName": "string" }, + "circular": { "required": false, "typeName": "TestModel" }, + "id": { "required": true, "typeName": "double" }, + }, }, "TestSubModelContainerNamespace.TestSubModelContainer": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModelNamespace.TestSubModelNS' }, + ], }, "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2": { - "simpleValue": { "required": true, "typeName": "TestSubModel2" }, + properties: { + }, + additionalProperties: [ + { typeName: 'TestSubModelNamespace.TestSubModelNS' }, + ], }, "TestSubModelContainerNamespace_TestSubModelContainer": { + properties: { + }, }, "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2": { + properties: { + }, }, "TestClassModel": { - "publicStringProperty": { "required": true, "typeName": "string" }, - "optionalPublicStringProperty": { "required": false, "typeName": "string" }, - "stringProperty": { "required": true, "typeName": "string" }, - "publicConstructorVar": { "required": true, "typeName": "string" }, - "optionalPublicConstructorVar": { "required": false, "typeName": "string" }, - "id": { "required": true, "typeName": "double" }, + properties: { + "publicStringProperty": { "required": true, "typeName": "string" }, + "optionalPublicStringProperty": { "required": false, "typeName": "string" }, + "stringProperty": { "required": true, "typeName": "string" }, + "publicConstructorVar": { "required": true, "typeName": "string" }, + "optionalPublicConstructorVar": { "required": false, "typeName": "string" }, + "id": { "required": true, "typeName": "double" }, + }, }, "GenericRequestTestModel": { - "name": { "required": true, "typeName": "string" }, - "value": { "required": true, "typeName": "TestModel" }, + properties: { + "name": { "required": true, "typeName": "string" }, + "value": { "required": true, "typeName": "TestModel" }, + }, }, "Result": { - "value": { "required": true, "typeName": "object" }, + properties: { + "value": { "required": true, "typeName": "object" }, + }, }, "GenericModelTestModel": { - "result": { "required": true, "typeName": "TestModel" }, + properties: { + "result": { "required": true, "typeName": "TestModel" }, + }, }, "GenericModelTestModel[]": { - "result": { "required": true, "typeName": "array", "array": { "typeName": "TestModel" } }, + properties: { + "result": { "required": true, "typeName": "array", "array": { "typeName": "TestModel" } }, + }, }, "GenericModelstring": { - "result": { "required": true, "typeName": "string" }, + properties: { + "result": { "required": true, "typeName": "string" }, + }, }, "GenericModelstring[]": { - "result": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + properties: { + "result": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, + }, }, "ErrorResponseModel": { - "status": { "required": true, "typeName": "double" }, - "message": { "required": true, "typeName": "string" }, + properties: { + "status": { "required": true, "typeName": "double" }, + "message": { "required": true, "typeName": "string" }, + }, }, "ParameterTestModel": { - "firstname": { "required": true, "typeName": "string" }, - "lastname": { "required": true, "typeName": "string" }, - "age": { "required": true, "typeName": "integer" }, - "weight": { "required": true, "typeName": "float" }, - "human": { "required": true, "typeName": "boolean" }, - "gender": { "required": true, "typeName": "enum", "enumMembers": ["MALE", "FEMALE"] }, + properties: { + "firstname": { "required": true, "typeName": "string" }, + "lastname": { "required": true, "typeName": "string" }, + "age": { "required": true, "typeName": "integer" }, + "weight": { "required": true, "typeName": "float" }, + "human": { "required": true, "typeName": "boolean" }, + "gender": { "required": true, "typeName": "enum", "enumMembers": ["MALE", "FEMALE"] }, + }, }, "UserResponseModel": { - "id": { "required": true, "typeName": "double" }, - "name": { "required": true, "typeName": "string" }, + properties: { + "id": { "required": true, "typeName": "double" }, + "name": { "required": true, "typeName": "string" }, + }, }, }; diff --git a/tests/fixtures/testModel.ts b/tests/fixtures/testModel.ts index a3f486601..d7c1a7a06 100644 --- a/tests/fixtures/testModel.ts +++ b/tests/fixtures/testModel.ts @@ -22,7 +22,7 @@ export interface TestModel extends Model { strLiteralArr: StrLiteral[]; dateValue?: Date; optionalString?: string; - // modelsObjectDirect?: {[key: string]: TestSubModel;}; + // modelsObjectDirect?: {[key: string]: TestSubModel2;}; modelsObjectIndirect?: TestSubModelContainer; modelsObjectIndirectNS?: TestSubModelContainerNamespace.TestSubModelContainer; modelsObjectIndirectNS2?: TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2; @@ -43,20 +43,17 @@ export enum EnumStringValue { export type StrLiteral = 'Foo' | 'Bar'; export interface TestSubModelContainer { - // [key: string]: TestSubModel2; - simpleValue: TestSubModel2; + [key: string]: TestSubModel2; } export namespace TestSubModelContainerNamespace { export interface TestSubModelContainer { - // [key: string]: TestSubModel2; - simpleValue: TestSubModel2; + [key: string]: TestSubModelNamespace.TestSubModelNS; } export namespace InnerNamespace { export interface TestSubModelContainer2 { - // [key: string]: TestSubModel2; - simpleValue: TestSubModel2; + [key: string]: TestSubModelNamespace.TestSubModelNS; } } } @@ -72,6 +69,12 @@ export interface TestSubModel2 extends TestSubModel { testSubModel2: boolean; } +export namespace TestSubModelNamespace { + export interface TestSubModelNS extends TestSubModel { + testSubModelNS: boolean; + } +} + export interface BooleanResponseModel { success: boolean; } diff --git a/tests/integration/express-server.spec.ts b/tests/integration/express-server.spec.ts index 5fb43ced8..5d9fbbea2 100644 --- a/tests/integration/express-server.spec.ts +++ b/tests/integration/express-server.spec.ts @@ -369,6 +369,13 @@ describe('Express Server', () => { id: 1, modelValue: { email: 'test@test.com', id: 2 }, modelsArray: [{ email: 'test@test.com', id: 1 }], + modelsObjectIndirect: { + key: { + email: 'test@test.com', + id: 1, + testSubModel2: false + } + }, numberArray: [1, 2], numberValue: 5, optionalString: 'test1234', diff --git a/tests/integration/hapi-server.spec.ts b/tests/integration/hapi-server.spec.ts index 8ff4f5e77..fd2cf6625 100644 --- a/tests/integration/hapi-server.spec.ts +++ b/tests/integration/hapi-server.spec.ts @@ -357,6 +357,13 @@ describe('Hapi Server', () => { id: 1, modelValue: { email: 'test@test.com', id: 2 }, modelsArray: [{ email: 'test@test.com', id: 1 }], + modelsObjectIndirect: { + key: { + email: 'test@test.com', + id: 1, + testSubModel2: false + } + }, numberArray: [1, 2], numberValue: 5, optionalString: 'test1234', diff --git a/tests/integration/inversify-server.spec.ts b/tests/integration/inversify-server.spec.ts index a0f79d022..f0f42cae4 100644 --- a/tests/integration/inversify-server.spec.ts +++ b/tests/integration/inversify-server.spec.ts @@ -32,6 +32,13 @@ describe('Inversify Express Server', () => { id: 100, }, modelsArray: new Array(), + modelsObjectIndirect: { + key: { + email: 'test@test.com', + id: 1, + testSubModel2: false + } + }, numberArray: [1, 2, 3], numberValue: 1, optionalString: 'optional string', diff --git a/tests/unit/swagger/definitionsGeneration/definitions.spec.ts b/tests/unit/swagger/definitionsGeneration/definitions.spec.ts index 566c53ea3..21f54492d 100644 --- a/tests/unit/swagger/definitionsGeneration/definitions.spec.ts +++ b/tests/unit/swagger/definitionsGeneration/definitions.spec.ts @@ -26,7 +26,7 @@ describe('Definition generation', () => { describe('Interface-based generation', () => { it('should generate a definition for referenced models', () => { - const expectedModels = ['TestModel', 'TestSubModel', 'Result', 'TestSubModelContainer', 'TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2', 'TestSubModel2']; + const expectedModels = ['TestModel', 'TestSubModel', 'Result', 'TestSubModelContainer', 'TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2', 'TestSubModel2', 'TestSubModelNamespace.TestSubModelNS']; expectedModels.forEach(modelName => { getValidatedDefinition(modelName); });