express-openapi-validator icon indicating copy to clipboard operation
express-openapi-validator copied to clipboard

Spec generated by tsoa giving error

Open AmitThakkar opened this issue 3 years ago • 1 comments

Describe the bug We are using tsoa for generating OpenAPI specs(https://tsoa-community.github.io/docs/generating.html#using-cli) and it is working fine. But when I try to use express-openapi-validator I get below error:

ERROR in apps/api/src/main.ts:40:5
TS2322: Type '{ components: { examples: {}; headers: {}; parameters: {}; requestBodies: {}; responses: {}; schemas: { UserDto: { properties: { id: { type: string; format: string; }; name: { type: string; }; email: { ...; }; address: { ...; }; isActive: { ...; }; createdAt: { ...; }; }; required: string[]...' is not assignable to type 'string | Document'.
  Type '{ components: { examples: {}; headers: {}; parameters: {}; requestBodies: {}; responses: {}; schemas: { UserDto: { properties: { id: { type: string; format: string; }; name: { type: string; }; email: { ...; }; address: { ...; }; isActive: { ...; }; createdAt: { ...; }; }; required: string[]...' is not assignable to type 'Document'.
    Types of property 'paths' are incompatible.
      Type '{ "/users": { post: { operationId: string; responses: { "200": { description: string; content: { "application/json": { schema: { $ref: string; }; }; }; }; }; security: never[]; parameters: never[]; requestBody: { required: boolean; content: { ...; }; }; }; get: { ...; }; }; "/users/{id}": { ...; }; "/users/...' is not assignable to type 'PathsObject'.
        Property '"/users"' is incompatible with index signature.
          Type '{ post: { operationId: string; responses: { "200": { description: string; content: { "application/json": { schema: { $ref: string; }; }; }; }; }; security: never[]; parameters: never[]; requestBody: { required: boolean; content: { ...; }; }; }; get: { ...; }; }' is not assignable to type 'PathItemObject'.
            The types of 'get.responses' are incompatible between these types.
              Type '{ "200": { description: string; content: { "application/json": { schema: { items: { $ref: string; }; type: string; }; }; }; }; }' is not assignable to type 'ResponsesObject'.
                Property '"200"' is incompatible with index signature.
                  Type '{ description: string; content: { "application/json": { schema: { items: { $ref: string; }; type: string; }; }; }; }' is not assignable to type 'ReferenceObject | ResponseObject'.
                    Type '{ description: string; content: { "application/json": { schema: { items: { $ref: string; }; type: string; }; }; }; }' is not assignable to type 'ResponseObject'.
                      Types of property 'content' are incompatible.
                        Type '{ "application/json": { schema: { items: { $ref: string; }; type: string; }; }; }' is not assignable to type '{ [media: string]: MediaTypeObject; }'.
                          Property '"application/json"' is incompatible with index signature.
                            Type '{ schema: { items: { $ref: string; }; type: string; }; }' is not assignable to type 'MediaTypeObject'.
                              Types of property 'schema' are incompatible.
                                Type '{ items: { $ref: string; }; type: string; }' is not assignable to type 'ReferenceObject | SchemaObject | undefined'.
                                  Type '{ items: { $ref: string; }; type: string; }' is not assignable to type 'ArraySchemaObject'.
                                    Types of property 'type' are incompatible.
                                      Type 'string' is not assignable to type '"array"'.
    38 | app.use(
    39 |   OpenApiValidator.middleware({
  > 40 |     apiSpec: swaggerJson,
       |     ^^^^^^^
    41 |     validateResponses: true,
    42 |   })
    43 | );

I checked swagger.json(generated by tsoa) that also seems fine:

...
                            "get": {
				"operationId": "FindAll",
				"responses": {
					"200": {
						"description": "Ok",
						"content": {
							"application/json": {
								"schema": {
									"items": {
										"$ref": "#/components/schemas/UserDto"
									},
									"type": "array". <===  This line giving me error
								}
							}
						}
					}
				},
				"security": [],
				"parameters": []
			}
...

AmitThakkar avatar Dec 09 '21 09:12 AmitThakkar

try casting the value as any as a workaround the issue. let me know if it works properly. assuming so, we'll have to look at the typescript types

apiSpec: <any> swaggerJson,

cdimascio avatar Dec 14 '21 02:12 cdimascio