mirror of
				https://github.com/Redocly/redoc.git
				synced 2025-10-30 23:37:28 +03:00 
			
		
		
		
	Merge commit 'f3a92450ecd19aac7b980256bb61fc9a6a5e4054' into releases
This commit is contained in:
		
						commit
						6a21b4036f
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -26,6 +26,8 @@ lib/**/*.css | |||
| # files produced by ngc | ||||
| lib/**/*.ngfactory.ts | ||||
| lib/**/*.css.shim.ts | ||||
| lib/**/*.ngsummary.json | ||||
| lib/**/*.shim.ngstyle.ts | ||||
| 
 | ||||
| # other | ||||
| /dist | ||||
|  |  | |||
|  | @ -1,3 +1,10 @@ | |||
| # 1.6.2 (2016-12-11) | ||||
| ### Bug fixes | ||||
| * Use markdown in responses description ([#158](https://github.com/Rebilly/ReDoc/issues/158)) | ||||
| 
 | ||||
| ### Features/Improvements | ||||
| * [x-displayName](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-displayname) for tags - by [@bfirsh](https://github.com/bfirsh) ([PR #152](https://github.com/Rebilly/ReDoc/pull/152)) | ||||
| 
 | ||||
| # 1.6.1 (2016-12-02) | ||||
| ### Bug fixes | ||||
| * Fix only the first instance of schema was rendered ([#150](https://github.com/Rebilly/ReDoc/issues/150)) | ||||
|  |  | |||
|  | @ -112,6 +112,7 @@ ReDoc makes use of the following [vendor extensions](http://swagger.io/specifica | |||
| * [`x-traitTag`](docs/redoc-vendor-extensions.md#x-traitTag) - useful for handling out common things like Pagination, Rate-Limits, etc | ||||
| * [`x-code-samples`](docs/redoc-vendor-extensions.md#x-code-samples) - specify operation code samples | ||||
| * [`x-nullable`](docs/redoc-vendor-extensions.md#nullable) - mark schema param as a nullable | ||||
| * [`x-displayName`](docs/redoc-vendor-extensions.md#x-displayname) - specify human-friendly names for the menu categories | ||||
| 
 | ||||
| ### `<redoc>` tag attributes | ||||
| * `spec-url` - relative or absolute url to your spec file; | ||||
|  | @ -123,6 +124,7 @@ ReDoc makes use of the following [vendor extensions](http://swagger.io/specifica | |||
| * `suppress-warnings` - if set, warnings are not rendered at the top of documentation (they still are logged to the console). | ||||
| * `lazy-rendering` - if set, enables lazy rendering mode in ReDoc. This mode is useful for APIs with big number of operations (e.g. > 50). In this mode ReDoc shows initial screen ASAP and then renders the rest operations asynchronously while showing progress bar on the top. Check out the [demo](\\rebilly.github.io/ReDoc) for the example. | ||||
| * `hide-hostname` - if set, the protocol and hostname is not shown in the method definition. | ||||
| * `expand-responses` - specify which responses to expand by default by response codes. Values should be passed as comma-separated list without spaces e.g. `expand-responses="200,201"`. Special value `"all"` expands all responses by default. Be careful: this option can slow-down documentation rendering time. | ||||
| 
 | ||||
| ## Advanced usage | ||||
| Instead of adding `spec-url` attribute to the `<redoc>` element you can initialize ReDoc via globally exposed `Redoc` object: | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ const IS_PRODUCTION = process.env.NODE_ENV === "production"; | |||
| 
 | ||||
| module.exports = { | ||||
|   devtool: '#inline-source-map', | ||||
| 
 | ||||
|   performance: { hints: false }, | ||||
|   resolve: { | ||||
|     extensions: ['.ts', '.js', '.json', '.css'], | ||||
|     alias: { | ||||
|  |  | |||
|  | @ -14,6 +14,7 @@ const IS_MODULE = process.env.IS_MODULE != null; | |||
| const config = { | ||||
|   context: root(), | ||||
|   devtool: 'source-map', | ||||
|   performance: { hints: false }, | ||||
| 
 | ||||
|   resolve: { | ||||
|     extensions: ['.ts', '.js', '.json', '.css'], | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ import { ElementRef, | |||
|   Input, | ||||
|   Component, | ||||
|   OnInit, | ||||
|   OnDestroy, | ||||
|   HostBinding | ||||
| } from '@angular/core'; | ||||
| 
 | ||||
|  | @ -26,14 +27,16 @@ import { LazyTasksService } from '../../shared/components/LazyFor/lazy-for'; | |||
| export class Redoc extends BaseComponent implements OnInit { | ||||
|   static _preOptions: any; | ||||
| 
 | ||||
|   private element: any; | ||||
| 
 | ||||
|   error: any; | ||||
|   specLoaded: boolean; | ||||
|   options: any; | ||||
| 
 | ||||
|   loadingProgress: number; | ||||
| 
 | ||||
|   private element: HTMLElement; | ||||
|   private $parent: Element; | ||||
|   private $refElem: Element; | ||||
| 
 | ||||
|   @Input() specUrl: string; | ||||
|   @HostBinding('class.loading') specLoading: boolean = false; | ||||
|   @HostBinding('class.loading-remove') specLoadingRemove: boolean = false; | ||||
|  | @ -53,6 +56,9 @@ export class Redoc extends BaseComponent implements OnInit { | |||
|     optionsMgr.options = Redoc._preOptions || {}; | ||||
| 
 | ||||
|     this.element = elementRef.nativeElement; | ||||
|     this.$parent = this.element.parentElement; | ||||
|     this.$refElem = this.element.nextElementSibling; | ||||
| 
 | ||||
|     //parse options (top level component doesn't support inputs)
 | ||||
|     optionsMgr.parseOptions( this.element ); | ||||
|     let scrollParent = detectScollParent( this.element ); | ||||
|  | @ -121,4 +127,9 @@ export class Redoc extends BaseComponent implements OnInit { | |||
|     } | ||||
|     this.load(); | ||||
|   } | ||||
| 
 | ||||
|   ngOnDestroy() { | ||||
|     let $clone = this.element.cloneNode(); | ||||
|     this.$parent.insertBefore($clone, this.$refElem); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| <h2 class="responses-list-header" *ngIf="responses.length"> Responses </h2> | ||||
| <zippy *ngFor="let response of responses;trackBy:trackByCode" title="{{response.code}} {{response.description || marked}}" | ||||
|   [type]="response.type" [empty]="response.empty" (open)="lazySchema.load()"> | ||||
| <zippy *ngFor="let response of responses;trackBy:trackByCode" [title]="response.code + ' ' + response.description | marked" | ||||
|   [type]="response.type" [visible]="response.expanded" [empty]="response.empty" (open)="lazySchema.load()"> | ||||
|   <div *ngIf="response.headers" class="response-headers"> | ||||
|     <header> | ||||
|       Headers | ||||
|  | @ -20,6 +20,6 @@ | |||
|   <header *ngIf="response.schema"> | ||||
|     Response Schema | ||||
|   </header> | ||||
|   <json-schema-lazy #lazySchema pointer="{{response.schema ? response.pointer + '/schema' : null}}"> | ||||
|   <json-schema-lazy [auto]="response.expanded" #lazySchema pointer="{{response.schema ? response.pointer + '/schema' : null}}"> | ||||
|   </json-schema-lazy> | ||||
| </zippy> | ||||
|  |  | |||
|  | @ -49,6 +49,13 @@ export class ResponsesList extends BaseComponent implements OnInit { | |||
|       resp.empty = !resp.schema; | ||||
|       resp.code = respCode; | ||||
|       resp.type = statusCodeType(resp.code); | ||||
| 
 | ||||
|       if (this.options.expandResponses) { | ||||
|         if (this.options.expandResponses === 'all' || this.options.expandResponses.has(respCode.toString())) { | ||||
|           resp.expanded = true; | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       if (resp.headers && !(resp.headers instanceof Array)) { | ||||
|         resp.headers = Object.keys(resp.headers).map((k) => { | ||||
|           let respInfo = resp.headers[k]; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| import { Component, ElementRef, ChangeDetectorRef, OnInit } from '@angular/core'; | ||||
| import { Component, ElementRef, ChangeDetectorRef, OnInit, OnDestroy } from '@angular/core'; | ||||
| 
 | ||||
| //import { global } from '@angular/core/src/facade/lang';
 | ||||
| import { trigger, state, animate, transition, style } from '@angular/core'; | ||||
|  | @ -21,13 +21,14 @@ const global = window; | |||
|         style({ height: '0px' })), | ||||
|       state('expanded', | ||||
|         style({ height: '*' })), | ||||
|       transition('collapsed <=> expanded', [ | ||||
|         animate('200ms ease') | ||||
|       ]) | ||||
|       // https://github.com/Rebilly/ReDoc/issues/162
 | ||||
|       // transition('collapsed <=> expanded', [
 | ||||
|       //   animate('200ms ease')
 | ||||
|       // ])
 | ||||
|     ]) | ||||
|   ], | ||||
| }) | ||||
| export class SideMenu extends BaseComponent implements OnInit { | ||||
| export class SideMenu extends BaseComponent implements OnInit, OnDestroy { | ||||
|   activeCatCaption: string; | ||||
|   activeItemCaption: string; | ||||
|   categories: Array<MenuCategory>; | ||||
|  | @ -122,6 +123,11 @@ export class SideMenu extends BaseComponent implements OnInit { | |||
| 
 | ||||
|   destroy() { | ||||
|     this.scrollService.unbind(); | ||||
|     this.menuService.destroy(); | ||||
|   } | ||||
| 
 | ||||
|   ngOnDestroy() { | ||||
|     this.destroy(); | ||||
|   } | ||||
| 
 | ||||
|   ngOnInit() { | ||||
|  |  | |||
|  | @ -33,7 +33,6 @@ export function init(specUrl:string, options:any = {}) { | |||
|     moduleRef = appRef; | ||||
|     console.log('ReDoc initialized!'); | ||||
|   }).catch(err => { | ||||
|     //Redoc.displayError(err);
 | ||||
|     throw err; | ||||
|   }); | ||||
| }; | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| import { NgModule, ErrorHandler } from '@angular/core'; | ||||
| import { NgModule, ErrorHandler, APP_ID } from '@angular/core'; | ||||
| import { CommonModule } from '@angular/common'; | ||||
| 
 | ||||
| import { Redoc, SecurityDefinitions, Method, REDOC_DIRECTIVES } from './components/index'; | ||||
|  | @ -35,6 +35,7 @@ import { SpecManager } from './utils/spec-manager'; | |||
|     ComponentParser, | ||||
|     ContentProjector, | ||||
|     LazyTasksService, | ||||
|     { provide: APP_ID, useValue: 'redoc' }, | ||||
|     { provide: ErrorHandler, useClass: CustomErrorHandler }, | ||||
|     { provide: COMPONENT_PARSER_ALLOWED, useValue: { 'security-definitions': SecurityDefinitions} } | ||||
|   ], | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| 'use strict'; | ||||
| import { Injectable, EventEmitter } from '@angular/core'; | ||||
| import { Subscription } from 'rxjs/Subscription'; | ||||
| import { BehaviorSubject } from 'rxjs/BehaviorSubject'; | ||||
| import { ScrollService, INVIEW_POSITION } from './scroll.service'; | ||||
| import { Hash } from './hash.service'; | ||||
|  | @ -16,6 +17,7 @@ const CHANGE = { | |||
| 
 | ||||
| @Injectable() | ||||
| export class MenuService { | ||||
| 
 | ||||
|   changed: EventEmitter<any> = new EventEmitter(); | ||||
|   ready: BehaviorSubject<boolean> = new BehaviorSubject(false); | ||||
|   categories: Array<MenuCategory>; | ||||
|  | @ -23,6 +25,8 @@ export class MenuService { | |||
|   activeCatIdx: number = 0; | ||||
|   activeMethodIdx: number = -1; | ||||
| 
 | ||||
|   private _hashSubscription: Subscription; | ||||
| 
 | ||||
|   constructor( | ||||
|     private hash:Hash, | ||||
|     private tasks: LazyTasksService, | ||||
|  | @ -39,7 +43,7 @@ export class MenuService { | |||
| 
 | ||||
|     //this.changeActive(CHANGE.INITIAL);
 | ||||
| 
 | ||||
|     this.hash.value.subscribe((hash) => { | ||||
|     this._hashSubscription =  this.hash.value.subscribe((hash) => { | ||||
|       if (hash == undefined) return; | ||||
|       this.setActiveByHash(hash); | ||||
|       if (!this.tasks.empty) { | ||||
|  | @ -228,4 +232,8 @@ export class MenuService { | |||
|     } | ||||
|     this.activate(catIdx, methodIdx); | ||||
|   } | ||||
| 
 | ||||
|   destroy() { | ||||
|     this._hashSubscription.unsubscribe(); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -14,7 +14,8 @@ describe('Options Service', () => { | |||
|   } | ||||
| 
 | ||||
|   afterEach(() => { | ||||
|     document.body.removeChild(tmpDiv); | ||||
|     if (tmpDiv) document.body.removeChild(tmpDiv); | ||||
|     tmpDiv = false; | ||||
|   }); | ||||
| 
 | ||||
|   beforeEach(() => { | ||||
|  | @ -47,4 +48,18 @@ describe('Options Service', () => { | |||
|     optionsService.parseOptions(elem); | ||||
|     optionsService.options.scrollYOffset().should.be.equal(123); | ||||
|   }); | ||||
| 
 | ||||
|   it('should convert expandResponses options to Set', () => { | ||||
|     optionsService.options = { expandResponses: '200,300' }; | ||||
|     optionsService._normalizeOptions(); | ||||
|     optionsService.options.expandResponses.should.be.instanceof(Set); | ||||
|     Array.from(optionsService.options.expandResponses.values()).should.deepEqual(['200', '300']); | ||||
|   }); | ||||
| 
 | ||||
|   it('should preserve special value "all" as string', () => { | ||||
|     optionsService.options = { expandResponses: 'all' }; | ||||
|     optionsService._normalizeOptions(); | ||||
|     optionsService.options.expandResponses.should.be.of.type('string'); | ||||
|     optionsService.options.expandResponses.should.be.equal('all'); | ||||
|   }); | ||||
| }); | ||||
|  |  | |||
|  | @ -14,7 +14,8 @@ const OPTION_NAMES = new Set([ | |||
|   'specUrl', | ||||
|   'suppressWarnings', | ||||
|   'hideHostname', | ||||
|   'lazyRendering' | ||||
|   'lazyRendering', | ||||
|   'expandResponses' | ||||
| ]); | ||||
| 
 | ||||
| interface Options { | ||||
|  | @ -24,6 +25,7 @@ interface Options { | |||
|   suppressWarnings?: boolean; | ||||
|   hideHostname?: boolean; | ||||
|   lazyRendering?: boolean; | ||||
|   expandResponses?: Set<string> | 'all'; | ||||
|   $scrollParent?: HTMLElement | Window; | ||||
| } | ||||
| 
 | ||||
|  | @ -36,7 +38,7 @@ export class OptionsService { | |||
|     this._normalizeOptions(); | ||||
|   } | ||||
| 
 | ||||
|   get options():Options { | ||||
|   get options(): Options { | ||||
|     return this._options; | ||||
|   } | ||||
| 
 | ||||
|  | @ -89,5 +91,10 @@ export class OptionsService { | |||
|     if (isString(this._options.suppressWarnings)) this._options.suppressWarnings = true; | ||||
|     if (isString(this._options.hideHostname)) this._options.hideHostname = true; | ||||
|     if (isString(this._options.lazyRendering)) this._options.lazyRendering = true; | ||||
|     if (isString(this._options.expandResponses)) { | ||||
|       let str = this._options.expandResponses as string; | ||||
|       if (str === 'all') return; | ||||
|       this._options.expandResponses = new Set(str.split(',')); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
|         <polygon points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "/> | ||||
|       </svg> | ||||
|     </span> | ||||
|     {{title}} | ||||
|     <span class="zippy-title-content" [innerHtml]="title"> </span> | ||||
|   </div> | ||||
|   <div class="zippy-content"> | ||||
|     <ng-content></ng-content> | ||||
|  |  | |||
|  | @ -45,11 +45,15 @@ $zippy-redirect-bg-color: rgba($zippy-redirect-color, .08); | |||
|     color: $zippy-info-color; | ||||
|     background-color: $zippy-info-bg-color; | ||||
|   } | ||||
| 
 | ||||
|   /deep/ p { | ||||
|     font-weight: normal; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| .zippy-indicator svg { | ||||
|   height: 1.2em; | ||||
|   vertical-align: middle; | ||||
|   vertical-align: top; | ||||
|   transition: all 0.3s ease; | ||||
|   transform: rotateZ(-180deg); | ||||
| } | ||||
|  | @ -81,6 +85,8 @@ span.zippy-indicator { | |||
|   font-size: 1.2em; | ||||
|   text-align: center; | ||||
|   display: inline-block; | ||||
|   float: left; | ||||
|   margin-right: 5px; | ||||
| } | ||||
| 
 | ||||
| .zippy-content { | ||||
|  |  | |||
							
								
								
									
										44
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								package.json
									
									
									
									
									
								
							|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "name": "redoc", | ||||
|   "description": "Swagger-generated API Reference Documentation", | ||||
|   "version": "1.6.2", | ||||
|   "version": "1.6.3", | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/Rebilly/ReDoc" | ||||
|  | @ -45,22 +45,22 @@ | |||
|   "author": "Roman Hotsiy", | ||||
|   "license": "MIT", | ||||
|   "devDependencies": { | ||||
|     "@angular/common": "^2.2.4", | ||||
|     "@angular/compiler": "^2.2.4", | ||||
|     "@angular/compiler-cli": "^2.2.4", | ||||
|     "@angular/core": "^2.2.4", | ||||
|     "@angular/platform-browser": "^2.2.4", | ||||
|     "@angular/platform-browser-dynamic": "^2.2.4", | ||||
|     "@angular/platform-server": "^2.2.4", | ||||
|     "@angular/common": "^2.3.1", | ||||
|     "@angular/compiler": "^2.3.1", | ||||
|     "@angular/compiler-cli": "^2.3.1", | ||||
|     "@angular/core": "^2.3.1", | ||||
|     "@angular/platform-browser": "^2.3.1", | ||||
|     "@angular/platform-browser-dynamic": "^2.3.1", | ||||
|     "@angular/platform-server": "^2.3.1", | ||||
|     "@types/core-js": "^0.9.31", | ||||
|     "@types/jasmine": "^2.2.32", | ||||
|     "@types/requirejs": "^2.1.26", | ||||
|     "@types/should": "^8.1.28", | ||||
|     "angular2-template-loader": "^0.6.0", | ||||
|     "awesome-typescript-loader": "2.2.4", | ||||
|     "awesome-typescript-loader": "^2.2.4", | ||||
|     "branch-release": "^1.0.3", | ||||
|     "chalk": "^1.1.3", | ||||
|     "codelyzer": "^2.0.0-beta.1", | ||||
|     "codelyzer": "^2.0.0-beta.3", | ||||
|     "core-js": "^2.4.1", | ||||
|     "coveralls": "^2.11.9", | ||||
|     "css-loader": "^0.26.0", | ||||
|  | @ -85,7 +85,7 @@ | |||
|     "phantomjs-prebuilt": "^2.1.7", | ||||
|     "protractor": "^4.0.10", | ||||
|     "raw-loader": "^0.5.1", | ||||
|     "rxjs": "5.0.0-beta.12", | ||||
|     "rxjs": "^5.0.0-rc.4", | ||||
|     "sass-loader": "^4.0.2", | ||||
|     "shelljs": "^0.7.0", | ||||
|     "should": "^11.1.0", | ||||
|  | @ -95,10 +95,10 @@ | |||
|     "style-loader": "^0.13.1", | ||||
|     "ts-helpers": "^1.1.1", | ||||
|     "tslint": "^4.0.2", | ||||
|     "typescript": "^2.0.3", | ||||
|     "webpack": "^2.1.0-beta.27", | ||||
|     "typescript": "2.0.9", | ||||
|     "webpack": "^2.1.0-beta.28", | ||||
|     "webpack-dev-server": "^2.1.0-beta.12", | ||||
|     "zone.js": "^0.6.25" | ||||
|     "zone.js": "^0.7.2" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "dropkickjs": "^2.1.10", | ||||
|  | @ -113,14 +113,14 @@ | |||
|     "stream-http": "^2.3.1" | ||||
|   }, | ||||
|   "peerDependencies": { | ||||
|     "@angular/common": "^2.2.4", | ||||
|     "@angular/compiler": "^2.2.4", | ||||
|     "@angular/core": "^2.2.4", | ||||
|     "@angular/platform-browser": "^2.2.4", | ||||
|     "@angular/platform-browser-dynamic": "^2.2.4", | ||||
|     "@angular/platform-server": "^2.2.4", | ||||
|     "@angular/common": "^2.3.1", | ||||
|     "@angular/compiler": "^2.3.1", | ||||
|     "@angular/core": "^2.3.1", | ||||
|     "@angular/platform-browser": "^2.3.1", | ||||
|     "@angular/platform-browser-dynamic": "^2.3.1", | ||||
|     "@angular/platform-server": "^2.3.1", | ||||
|     "core-js": "^2.4.1", | ||||
|     "rxjs": "5.0.0-beta.12", | ||||
|     "zone.js": "^0.6.25" | ||||
|     "rxjs": "5.0.0-rc.4", | ||||
|     "zone.js": "^0.7.2" | ||||
|   } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user