mirror of
				https://github.com/Redocly/redoc.git
				synced 2025-10-31 15:57:30 +03:00 
			
		
		
		
	fix: OpenAPI 3.1: Missing description when $ref used #1727
This commit is contained in:
		
							parent
							
								
									bccd21394e
								
							
						
					
					
						commit
						35f77878de
					
				|  | @ -174,6 +174,18 @@ export class OpenAPIParser { | ||||||
|     return obj; |     return obj; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   shallowDeref<T extends unknown>(obj: OpenAPIRef | T): T { | ||||||
|  |     if (this.isRef(obj)) { | ||||||
|  |       const schemaName = getDefinitionName(obj.$ref); | ||||||
|  |       if (schemaName && this.options.ignoreNamedSchemas.has(schemaName)) { | ||||||
|  |         return { type: 'object', title: schemaName } as T; | ||||||
|  |       } | ||||||
|  |       const resolved = this.byRef<T>(obj.$ref); | ||||||
|  |       return this.allowMergeRefs ? this.mergeRefs(obj, resolved, false) : (resolved as T); | ||||||
|  |     } | ||||||
|  |     return obj; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   mergeRefs(ref, resolved, mergeAsAllOf: boolean) { |   mergeRefs(ref, resolved, mergeAsAllOf: boolean) { | ||||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 |     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||||
|     const { $ref, ...rest } = ref; |     const { $ref, ...rest } = ref; | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| import { OpenAPIParser } from '../OpenAPIParser'; | import { OpenAPIParser } from '../OpenAPIParser'; | ||||||
| import { RedocNormalizedOptions } from '../RedocNormalizedOptions'; | import { RedocNormalizedOptions } from '../RedocNormalizedOptions'; | ||||||
|  | import { OpenAPIParameter, Referenced } from '../../types'; | ||||||
| 
 | 
 | ||||||
| const opts = new RedocNormalizedOptions({}); | const opts = new RedocNormalizedOptions({}); | ||||||
| 
 | 
 | ||||||
|  | @ -13,5 +14,18 @@ describe('Models', () => { | ||||||
|       parser = new OpenAPIParser(spec, undefined, opts); |       parser = new OpenAPIParser(spec, undefined, opts); | ||||||
|       expect(parser.mergeAllOf(spec.components.schemas.test)).toMatchSnapshot(); |       expect(parser.mergeAllOf(spec.components.schemas.test)).toMatchSnapshot(); | ||||||
|     }); |     }); | ||||||
|  | 
 | ||||||
|  |     test('should override description from $ref of the referenced component, when sibling description exists ', () => { | ||||||
|  |       // eslint-disable-next-line @typescript-eslint/no-var-requires
 | ||||||
|  |       const spec = require('./fixtures/siblingRefDescription.json'); | ||||||
|  |       parser = new OpenAPIParser(spec, undefined, opts); | ||||||
|  |       const schemaOrRef: Referenced<OpenAPIParameter> = { | ||||||
|  |         $ref: '#/components/schemas/Test', | ||||||
|  |         description: 'Overriden description', | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       expect(parser.shallowDeref(schemaOrRef)).toMatchSnapshot(); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | @ -86,3 +86,10 @@ Object { | ||||||
|   ], |   ], | ||||||
| } | } | ||||||
| `; | `; | ||||||
|  | 
 | ||||||
|  | exports[`Models Schema should override description from $ref of the referenced component, when sibling description exists  1`] = ` | ||||||
|  | Object { | ||||||
|  |   "description": "Overriden description", | ||||||
|  |   "type": "object", | ||||||
|  | } | ||||||
|  | `; | ||||||
|  |  | ||||||
							
								
								
									
										39
									
								
								src/services/__tests__/fixtures/siblingRefDescription.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/services/__tests__/fixtures/siblingRefDescription.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | ||||||
|  | { | ||||||
|  |   "openapi": "3.1.0", | ||||||
|  |   "info": { | ||||||
|  |     "title": "AA", | ||||||
|  |     "version": "1.0" | ||||||
|  |   }, | ||||||
|  |   "paths": { | ||||||
|  |     "/test": { | ||||||
|  |       "get": { | ||||||
|  |         "operationId": "test", | ||||||
|  |         "responses": { | ||||||
|  |           "200": { | ||||||
|  |             "content": { | ||||||
|  |               "application/json": { | ||||||
|  |                 "schema": { | ||||||
|  |                   "type": "object", | ||||||
|  |                   "properties": { | ||||||
|  |                     "testAttr": { | ||||||
|  |                       "description": "Overriden description", | ||||||
|  |                       "$ref": "#/components/schemas/Test" | ||||||
|  |                     } | ||||||
|  |                   } | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "components": { | ||||||
|  |     "schemas": { | ||||||
|  |       "Test": { | ||||||
|  |         "type": "object", | ||||||
|  |         "description": "Refed description" | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | @ -78,7 +78,7 @@ export class SchemaModel { | ||||||
|     makeObservable(this); |     makeObservable(this); | ||||||
| 
 | 
 | ||||||
|     this.pointer = schemaOrRef.$ref || pointer || ''; |     this.pointer = schemaOrRef.$ref || pointer || ''; | ||||||
|     this.rawSchema = parser.deref(schemaOrRef, false, true); |     this.rawSchema = parser.shallowDeref(schemaOrRef); | ||||||
|     this.schema = parser.mergeAllOf(this.rawSchema, this.pointer, isChild); |     this.schema = parser.mergeAllOf(this.rawSchema, this.pointer, isChild); | ||||||
| 
 | 
 | ||||||
|     this.init(parser, isChild); |     this.init(parser, isChild); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user