mirror of
				https://github.com/Redocly/redoc.git
				synced 2025-10-31 15:57:30 +03:00 
			
		
		
		
	Add expandSchemas to expand all properties for all Schemas
This commit is contained in:
		
							parent
							
								
									b4f3f02f8d
								
							
						
					
					
						commit
						08562e7756
					
				
							
								
								
									
										8
									
								
								e2e/expandSchemas.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								e2e/expandSchemas.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| <html> | ||||
| 
 | ||||
| <body> | ||||
|   <redoc spec-url="../demo/openapi.yaml" expand-schemas="true"></redoc> | ||||
|   <script src="../bundles/redoc.standalone.js"></script> | ||||
| </body> | ||||
| 
 | ||||
| </html> | ||||
							
								
								
									
										17
									
								
								e2e/integration/expandSchemas.e2e.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								e2e/integration/expandSchemas.e2e.ts
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | |||
| describe('Schemas', () => { | ||||
|   it('expandSchemas != true', () => { | ||||
|     cy.visit('e2e/standalone.html'); | ||||
| 
 | ||||
|     cy.get('.api-content') | ||||
|       .find('.expanded') | ||||
|       .should('have.length', 0); | ||||
|   }); | ||||
| 
 | ||||
|   it('expandSchemas == true', () => { | ||||
|     cy.visit('e2e/expandSchemas.html'); | ||||
| 
 | ||||
|     cy.get('.api-content') | ||||
|       .find('.expanded') | ||||
|       .should('have.length', 146); | ||||
|   }); | ||||
| }); | ||||
|  | @ -41,6 +41,7 @@ export interface RedocRawOptions { | |||
|   expandDefaultServerVariables?: boolean; | ||||
|   maxDisplayedEnumValues?: number; | ||||
|   ignoreNamedSchemas?: string[] | string; | ||||
|   expandSchemas?: boolean; | ||||
| } | ||||
| 
 | ||||
| function argValueToBoolean(val?: string | boolean, defaultValue?: boolean): boolean { | ||||
|  | @ -86,6 +87,10 @@ export class RedocNormalizedOptions { | |||
|     return !!value; | ||||
|   } | ||||
| 
 | ||||
|   static normalizeExpandSchemas(value: RedocRawOptions['expandSchemas']): boolean { | ||||
|     return !!value; | ||||
|   } | ||||
| 
 | ||||
|   static normalizeScrollYOffset(value: RedocRawOptions['scrollYOffset']): () => number { | ||||
|     // just number is not valid selector and leads to crash so checking if isNumeric here
 | ||||
|     if (typeof value === 'string' && !isNumeric(value)) { | ||||
|  | @ -194,6 +199,7 @@ export class RedocNormalizedOptions { | |||
|   maxDisplayedEnumValues?: number; | ||||
| 
 | ||||
|   ignoreNamedSchemas: Set<string>; | ||||
|   expandSchemas: boolean; | ||||
| 
 | ||||
|   constructor(raw: RedocRawOptions, defaults: RedocRawOptions = {}) { | ||||
|     raw = { ...defaults, ...raw }; | ||||
|  | @ -252,5 +258,6 @@ export class RedocNormalizedOptions { | |||
|     this.maxDisplayedEnumValues = argValueToNumber(raw.maxDisplayedEnumValues); | ||||
|     const ignoreNamedSchemas = Array.isArray(raw.ignoreNamedSchemas) ? raw.ignoreNamedSchemas : raw.ignoreNamedSchemas?.split(',').map(s => s.trim()); | ||||
|     this.ignoreNamedSchemas = new Set(ignoreNamedSchemas); | ||||
|     this.expandSchemas = RedocNormalizedOptions.normalizeExpandSchemas(raw.expandSchemas); | ||||
|   } | ||||
| } | ||||
|  |  | |||
							
								
								
									
										20
									
								
								src/services/__tests__/fixtures/expandSchemas.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/services/__tests__/fixtures/expandSchemas.json
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| { | ||||
|   "openapi": "3.0.0", | ||||
|   "info": { | ||||
|     "version": "1.0", | ||||
|     "title": "Foo" | ||||
|   }, | ||||
|   "components": { | ||||
|     "schemas": { | ||||
|       "Foo": { | ||||
|         "type": "object", | ||||
|         "properties": { | ||||
|           "foo": { | ||||
|             "type": "string" | ||||
|           } | ||||
|         }, | ||||
|         "additionalProperties": true | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | @ -40,5 +40,25 @@ describe('Models', () => { | |||
|       expect(schema.oneOf).toHaveLength(2); | ||||
|       expect(schema.displayType).toBe('(Array of strings or numbers) or string'); | ||||
|     }); | ||||
| 
 | ||||
|     test('expandSchemas != true', () => { | ||||
|       const spec = require('../fixtures/expandSchemas.json'); | ||||
|       parser = new OpenAPIParser(spec, undefined, opts); | ||||
|       const schema = new SchemaModel(parser, spec.components.schemas.Foo, '', opts); | ||||
|       expect(schema.fields).toHaveLength(2); | ||||
|       expect(schema.fields![0].expanded).toEqual(false); | ||||
|       expect(schema.fields![1].expanded).toEqual(false); | ||||
|     }); | ||||
| 
 | ||||
|     test('expandSchemas == true', () => { | ||||
|       const opts = new RedocNormalizedOptions({ expandSchemas: true}); | ||||
| 
 | ||||
|       const spec = require('../fixtures/expandSchemas.json'); | ||||
|       parser = new OpenAPIParser(spec, undefined, opts); | ||||
|       const schema = new SchemaModel(parser, spec.components.schemas.Foo, '', opts); | ||||
|       expect(schema.fields).toHaveLength(2); | ||||
|       expect(schema.fields![0].expanded).toEqual(true); | ||||
|       expect(schema.fields![1].expanded).toEqual(true); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|  |  | |||
|  | @ -348,7 +348,7 @@ function buildFields( | |||
|     const required = | ||||
|       schema.required === undefined ? false : schema.required.indexOf(fieldName) > -1; | ||||
| 
 | ||||
|     return new FieldModel( | ||||
|     const fieldModel = new FieldModel( | ||||
|       parser, | ||||
|       { | ||||
|         name: fieldName, | ||||
|  | @ -361,6 +361,8 @@ function buildFields( | |||
|       $ref + '/properties/' + fieldName, | ||||
|       options, | ||||
|     ); | ||||
|     fieldModel.expanded = options.expandSchemas; | ||||
|     return fieldModel; | ||||
|   }); | ||||
| 
 | ||||
|   if (options.sortPropsAlphabetically) { | ||||
|  | @ -372,8 +374,7 @@ function buildFields( | |||
|   } | ||||
| 
 | ||||
|   if (typeof additionalProps === 'object' || additionalProps === true) { | ||||
|     fields.push( | ||||
|       new FieldModel( | ||||
|     const fieldModel = new FieldModel( | ||||
|       parser, | ||||
|       { | ||||
|         name: (typeof additionalProps === 'object' | ||||
|  | @ -386,8 +387,9 @@ function buildFields( | |||
|       }, | ||||
|       $ref + '/additionalProperties', | ||||
|       options, | ||||
|       ), | ||||
|     ); | ||||
|     fieldModel.expanded = options.expandSchemas; | ||||
|     fields.push(fieldModel); | ||||
|   } | ||||
| 
 | ||||
|   return fields; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user