diff --git a/CHANGELOG.md b/CHANGELOG.md index 60a80b9c..fdc18639 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,35 +1,76 @@ +# 1.5.2 (2016-11-28) +### Bug fixes +* Fix crashing on array without items ([#104](https://github.com/Rebilly/ReDoc/issues/104)) +* Fix `allOf` within array items ([#136](https://github.com/Rebilly/ReDoc/issues/136)) +* Fix reference resolution from external files ([#96](https://github.com/Rebilly/ReDoc/issues/96)) +* Fix object to become an array ([#146](https://github.com/Rebilly/ReDoc/issues/146)) + +### Features/Improvements +* Add support for Swagger `collectionFormat` +* Wrap API version in span with class ([#145](https://github.com/Rebilly/ReDoc/issues/145)) +* Update openapi-sampler to 0.3.3 + +# 1.5.1 (2016-10-31) +### Bug fixes +* Fix content scrolling on language switch ([#130](https://github.com/Rebilly/ReDoc/issues/130)) + +### Features/Improvements +* Support for Swagger `pattern` property ([#42](https://github.com/Rebilly/ReDoc/issues/42)) +* Add option to hide hostname in method definition (by @bfirsh) +* Add Docker development environment (by @bfirsh) + +# 1.5.0 (2016-10-31) +### Bug fixes +* Fix side menu items wrong sync with description headers + +### Features/Improvements +* Support for Security Definitions +* Update angular2 to the 2.1.2 + +### Deprecations +* Deprecate `x-traitTag` + +### Code refactoring +* Separate RedocModule from AppModule +* Get rid of angular facade/lang dependencies +* Error handler refactor + +# 1.4.1 (2016-10-18) +### Bug fixes +* Emit helpers for module build + # 1.4.0 (2016-10-14) ### Bug fixes * Fix destroy/reinit -* Fix minimum/maximum zero not rendered (#123) +* Fix minimum/maximum zero not rendered ([#123](https://github.com/Rebilly/ReDoc/issues/123)) ### Features/Improvements * Do spec load after bootstrap -* Build and publish angular2 module (#126) +* Build and publish angular2 module ([#126](https://github.com/Rebilly/ReDoc/issues/126)) # 1.3.3 (2016-09-28) ### Features/Improvements -* implemented x-extendedDiscriminator to workaround name clashes in big specs -* Add engines to package.json (#83) -* Fix npm start on windows (#119, #118) +* Implemented x-extendedDiscriminator to workaround name clashes in big specs +* Add engines to package.json ([#83](https://github.com/Rebilly/ReDoc/issues/83)) +* Fix npm start on windows ([#119](https://github.com/Rebilly/ReDoc/issues/119), [#118](https://github.com/Rebilly/ReDoc/issues/118)) * Update webpack to latest beta * Update angular to 2.0.1 * Update local dev steps -* Update openapi-sampler lib (#111) +* Update openapi-sampler lib ([#111](https://github.com/Rebilly/ReDoc/issues/111)) # 1.3.2 (2016-09-13) ### Bug fixes * Fix broken tabs styling for response samples -* fix v1.x.x deployment +* Fix v1.x.x deployment # 1.3.1 (2016-09-13) ### Bug fixes -* makes basePath optional (by @LeFnord) -* fixed little typo (by @adamd) +* Makes basePath optional (by @LeFnord) +* Fixed little typo (by @adamd) * Typo s/IGNORRED/IGNORED (by @MikeRalphson) * Fixed indentation (by @bennyn) -* Fix default hostname (#108) -* Fix default value for falsy values is not displayed (#109) +* Fix default hostname ([#108](https://github.com/Rebilly/ReDoc/issues/108)) +* Fix default value for falsy values is not displayed ([#109](https://github.com/Rebilly/ReDoc/issues/109)) * Fix schema collapse after change discriminator ### Features/Improvements @@ -39,24 +80,24 @@ # 1.3.0 (2016-08-31) ### Bug fixes -* Fix code samples are not shown for operations without body param (#93) -* Fixed side menu overlapped site footer (#75) +* Fix code samples are not shown for operations without body param ([#93](https://github.com/Rebilly/ReDoc/issues/93)) +* Fixed side menu overlapped site footer ([#75](https://github.com/Rebilly/ReDoc/issues/75)) * Fix broken order in discriminator dropdown ### Features/Improvements -* Support "x-nullable" property by @kedashoe (#92) +* Support "x-nullable" property by @kedashoe ([#92](https://github.com/Rebilly/ReDoc/issues/92)) # 1.2.0 (2016-08-30) ### Bug fixes -* Fix sticky sidebar top sticking (#75) -* Fix array inside objects if referenced directly (#84) -* Add banner to the bundle file (#89) +* Fix sticky sidebar top sticking ([#75](https://github.com/Rebilly/ReDoc/issues/75)) +* Fix array inside objects if referenced directly ([#84](https://github.com/Rebilly/ReDoc/issues/84)) +* Add banner to the bundle file ([#89](https://github.com/Rebilly/ReDoc/issues/89)) * Fix broken additionalProperties * Fix version render issue (extra "v" letter) ### Features/Improvements * Change the way discriminator is rendered -* Created CDN major release 1.x.x (#87) +* Created CDN major release 1.x.x ([#87](https://github.com/Rebilly/ReDoc/issues/87)) * Smaller bundle size (371KB gzipped) * Better start-up time due to [AoT](http://blog.mgechev.com/2016/08/14/ahead-of-time-compilation-angular-offline-precompilation/) @@ -67,12 +108,12 @@ # 1.1.2 (2016-08-21) ### Bug fixes -* Revert "Fix markdown newlines to be GFM" (#82) +* Revert "Fix markdown newlines to be GFM" ([#82](https://github.com/Rebilly/ReDoc/issues/82)) * Move license and contact info above description # 1.1.1 (2016-08-21) ### Bug fixes -* Fix markdown newlines to be GFM (#82) +* Fix markdown newlines to be GFM ([#82](https://github.com/Rebilly/ReDoc/issues/82)) * Fix markdown code blocks in api description # 1.1.0 (2016-08-12) @@ -83,8 +124,8 @@ ### Features/Improvements -* Add Tuple support (arrays with separate schema for each value) (#69) -* Add special representation for enum with one value (#70) +* Add Tuple support (arrays with separate schema for each value) ([#69](https://github.com/Rebilly/ReDoc/issues/69)) +* Add special representation for enum with one value ([#70](https://github.com/Rebilly/ReDoc/issues/70)) * Change `< * >` notation to `< anything >` diff --git a/README.md b/README.md index 57e419fb..79247b7b 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ ## [Live demo](http://rebilly.github.io/ReDoc/) +[](https://github.com/Rebilly/generator-openapi-repo#generator-openapi-repo--) + ## Features - Extremely easy deployment - It’s free and open-source project under MIT license @@ -114,6 +116,7 @@ ReDoc makes use of the following [vendor extensions](http://swagger.io/specifica * **selector**: selector of the element to be used for specifying the offset. The distance from the top of the page to the element's bottom will be used as offset; * **function**: A getter function. Must return a number representing the offset (in pixels); * `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. ## Advanced usage diff --git a/build/webpack.dev.js b/build/webpack.dev.js index 3235c5fe..3d483811 100644 --- a/build/webpack.dev.js +++ b/build/webpack.dev.js @@ -37,7 +37,9 @@ module.exports = { }, devServer: { - outputPath: root('dist'), + contentBase: root('demo'), + watchContentBase: true, + compress: true, watchOptions: { poll: true }, @@ -95,15 +97,15 @@ module.exports = { exclude: [/\.(spec|e2e)\.ts$/] }, { test: /lib[\\\/].*\.scss$/, - loaders: ['raw-loader', "sass"], + loaders: ['raw-loader', "sass-loader"], exclude: [/redoc-initial-styles\.scss$/] }, { test: /\.scss$/, - loaders: ['style', 'css?-import', "sass"], + loaders: ['style-loader', 'css-loader?-import', "sass-loader"], exclude: [/lib[\\\/](?!.*redoc-initial-styles).*\.scss$/] }, { test: /\.css$/, - loaders: ['style', 'css?-import'], + loaders: ['style-loader', 'css-loader?-import'], }, { test: /\.html$/, loader: 'raw-loader' diff --git a/build/webpack.prod.js b/build/webpack.prod.js index 5fc59973..54ef935c 100644 --- a/build/webpack.prod.js +++ b/build/webpack.prod.js @@ -70,7 +70,7 @@ const config = { exclude: [/redoc-initial-styles\.css$/] }, { test: /\.css$/, - loaders: ['style', 'css?-import'], + loaders: ['style-loader', 'css-loader?-import'], exclude: [/lib[\\\/](?!.*redoc-initial-styles).*\.css$/] }] }, diff --git a/build/webpack.test.js b/build/webpack.test.js index 519cc56a..12eedc31 100644 --- a/build/webpack.test.js +++ b/build/webpack.test.js @@ -61,7 +61,7 @@ module.exports = { exclude: [/redoc-initial-styles\.css$/] }, { test: /\.css$/, - loaders: ['style', 'css?-import'], + loaders: ['style-loader', 'css-loader?-import'], exclude: [/lib[\\\/](?!.*redoc-initial-styles).*\.css$/] }, { test: /\.html$/, diff --git a/demo/index-gh.html b/demo/index-gh.html index 6d3a7c50..17724a03 100644 --- a/demo/index-gh.html +++ b/demo/index-gh.html @@ -22,7 +22,7 @@ frameborder="0" scrolling="0" width="130px" height="30px"> - + diff --git a/demo/index.html b/demo/index.html index 8cb4b1d5..55ce64f3 100644 --- a/demo/index.html +++ b/demo/index.html @@ -22,7 +22,7 @@ frameborder="0" scrolling="0" width="130px" height="30px"> - + diff --git a/demo/main.js b/demo/main.js index 332b9aeb..1255acf6 100644 --- a/demo/main.js +++ b/demo/main.js @@ -7,7 +7,7 @@ var url = window.location.search.match(/url=([^&]+)/); if (url && url.length > 1) { url = decodeURIComponent(url[1]); - document.getElementsByTagName('redoc')[0].setAttribute('spec-url', url); + document.getElementsByTagName('redoc')[0].setAttribute('spec-url', '\\\\cors.apis.guru/' + url); } function updateQueryStringParameter(uri, key, value) { diff --git a/lib/components/ApiInfo/api-info.spec.ts b/lib/components/ApiInfo/api-info.spec.ts index 4d0e6612..c2c80bdc 100644 --- a/lib/components/ApiInfo/api-info.spec.ts +++ b/lib/components/ApiInfo/api-info.spec.ts @@ -18,23 +18,28 @@ describe('Redoc components', () => { let component; let fixture; let opts; + let specMgr; beforeEach(() => { TestBed.configureTestingModule({ declarations: [ TestAppComponent ] }); }); - beforeEach(async(inject([SpecManager, OptionsService], (specMgr, _opts) => { + beforeEach(async(inject([SpecManager, OptionsService], (_specMgr, _opts) => { opts = _opts; opts.options = { scrollYOffset: () => 0, $scrollParent: window }; - return specMgr.load('/tests/schemas/api-info-test.json'); + specMgr = _specMgr; }))); - beforeEach(() => { + beforeEach(done => { + specMgr.load('/tests/schemas/api-info-test.json').then(done, done.fail); + }); + + beforeEach(async(() => { fixture = TestBed.createComponent(TestAppComponent); component = getChildDebugElement(fixture.debugElement, 'api-info').componentInstance; fixture.detectChanges(); - }); + })); it('should init component data', () => { diff --git a/lib/components/ApiLogo/api-logo.spec.ts b/lib/components/ApiLogo/api-logo.spec.ts index 5ef98c1f..f9ba3cd2 100644 --- a/lib/components/ApiLogo/api-logo.spec.ts +++ b/lib/components/ApiLogo/api-logo.spec.ts @@ -24,10 +24,15 @@ describe('Redoc components', () => { beforeEach(() => { TestBed.configureTestingModule({ declarations: [ TestAppComponent ] }); }); + beforeEach(async(inject([SpecManager], ( _specMgr) => { specMgr = _specMgr; - return specMgr.load(schemaUrl); }))); + + beforeEach(done => { + specMgr.load(schemaUrl).then(done, done.fail); + }); + beforeEach(() => { fixture = TestBed.createComponent(TestAppComponent); component = getChildDebugElement(fixture.debugElement, 'api-logo').componentInstance; @@ -36,6 +41,7 @@ describe('Redoc components', () => { it('should init component data', () => { + if (specMgr.a) return; expect(component).not.toBeNull(); expect(component.logo).not.toBeNull(); }); @@ -61,7 +67,6 @@ describe('Redoc components', () => { /** Test component that contains an ApiInfo. */ @Component({ selector: 'test-app', - providers: [SpecManager], template: `` }) diff --git a/lib/components/JsonSchema/_json-schema-common.scss b/lib/components/JsonSchema/_json-schema-common.scss index dcdf57bb..8cefa4df 100644 --- a/lib/components/JsonSchema/_json-schema-common.scss +++ b/lib/components/JsonSchema/_json-schema-common.scss @@ -27,6 +27,10 @@ $sub-schema-offset: ($bullet-size / 2) + $bullet-margin; width: 75%; box-sizing: border-box; + + > div { + line-height: 1; + } } .param-range { @@ -41,7 +45,7 @@ $sub-schema-offset: ($bullet-size / 2) + $bullet-margin; } .param-description { - font-size: 13px; + //font-size: 14px; } .param-required { @@ -220,7 +224,6 @@ $sub-schema-offset: ($bullet-size / 2) + $bullet-margin; margin: 0 3px; font-size: 1.2em; font-weight: bold; - vertical-align: bottom; } } diff --git a/lib/components/JsonSchema/json-schema-lazy.ts b/lib/components/JsonSchema/json-schema-lazy.ts index 4cfe9143..2427b701 100644 --- a/lib/components/JsonSchema/json-schema-lazy.ts +++ b/lib/components/JsonSchema/json-schema-lazy.ts @@ -12,7 +12,8 @@ var cache = {}; @Component({ selector: 'json-schema-lazy', entryComponents: [ JsonSchema ], - template: '' + template: '', + styles: [':host { display:none }'] }) export class JsonSchemaLazy implements OnDestroy, AfterViewInit { @Input() pointer: string; @@ -66,7 +67,7 @@ export class JsonSchemaLazy implements OnDestroy, AfterViewInit { this._loadAfterSelf(); return; } - insertAfter($element.cloneNode(true), this.elementRef.nativeElement); + //insertAfter($element.cloneNode(true), this.elementRef.nativeElement); this.loaded = true; } else { cache[this.pointer] = this._loadAfterSelf(); diff --git a/lib/components/JsonSchema/json-schema.spec.ts b/lib/components/JsonSchema/json-schema.spec.ts index 53b77cad..5c985048 100644 --- a/lib/components/JsonSchema/json-schema.spec.ts +++ b/lib/components/JsonSchema/json-schema.spec.ts @@ -62,7 +62,6 @@ describe('Redoc components', () => { /** Test component that contains a Method. */ @Component({ selector: 'test-app', - providers: [SpecManager], template: `` }) diff --git a/lib/components/LoadingBar/loading-bar.ts b/lib/components/LoadingBar/loading-bar.ts new file mode 100644 index 00000000..8666deb7 --- /dev/null +++ b/lib/components/LoadingBar/loading-bar.ts @@ -0,0 +1,49 @@ +'use strict'; +import { Input, HostBinding, Component, OnInit, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef } from '@angular/core'; +import JsonPointer from '../../utils/JsonPointer'; +import { BaseComponent, SpecManager } from '../base'; +import { SchemaHelper } from '../../services/schema-helper.service'; +import { OptionsService, AppStateService } from '../../services/'; + +@Component({ + selector: 'loading-bar', + template: ` + + `, + styles: [` + :host { + position: fixed; + top: 0; + left: 0; + right: 0; + display: block; + + height: 5px; + z-index: 100; + } + + span { + display: block; + position: absolute; + left: 0; + top: 0; + bottom: 0; + right: attr(progress percentage); + background-color: #5f7fc3; + transition: right 0.2s linear; + } + `], + //changeDetection: ChangeDetectionStrategy.OnPush +}) +export class LoadingBar { + @Input() progress:number = 0; + @HostBinding('style.display') display = 'block'; + + ngOnChanges(ch) { + if (ch.progress.currentValue === 100) { + setTimeout(() => { + this.display = 'none'; + }, 500); + } + } +} diff --git a/lib/components/Method/method.html b/lib/components/Method/method.html index 861ff11a..d9b1afe6 100644 --- a/lib/components/Method/method.html +++ b/lib/components/Method/method.html @@ -1,18 +1,18 @@ -
-
-

- {{method.summary}} -

- -

+

+
+

+ {{method.summary}} +

+ +

-
-
+
+

Definition

@@ -30,5 +30,5 @@
+
-
diff --git a/lib/components/Method/method.scss b/lib/components/Method/method.scss index 8d644a94..0306b61e 100644 --- a/lib/components/Method/method.scss +++ b/lib/components/Method/method.scss @@ -6,18 +6,20 @@ display: block; border-bottom: 1px solid rgba(127, 127, 127, 0.25); margin-top: 1em; + transform: translateZ(0); + z-index: 2; } -:host:last-of-type { - border-bottom: 0; -} +// :host:last-of-type { +// border-bottom: 0; +// } .method-header { - margin-bottom: .9em; + margin-bottom: calc(1em - 6px); } .method-endpoint { - margin: 0 0 2em 0; + //margin: 0 0 2px 0; padding: 10px 20px; border-radius: $border-radius*2; background-color: darken($black, 2%); @@ -31,8 +33,8 @@ padding-top: 1px; padding-bottom: 0; margin: 0; - font-size: .8em; - color: $black; + font-size: 12/14em; + color: $black; vertical-align: middle; display: inline-block; border-radius: $border-radius; diff --git a/lib/components/Method/method.spec.ts b/lib/components/Method/method.spec.ts index c35508a0..d754067c 100644 --- a/lib/components/Method/method.spec.ts +++ b/lib/components/Method/method.spec.ts @@ -11,6 +11,7 @@ import { getChildDebugElement } from '../../../tests/helpers'; import { Method } from './method'; import { SpecManager } from '../../utils/spec-manager';; +import { LazyTasksService } from '../../shared/components/LazyFor/lazy-for';; describe('Redoc components', () => { beforeEach(() => { @@ -19,12 +20,17 @@ describe('Redoc components', () => { describe('Method Component', () => { let builder; let component; + let specMgr; - beforeEach(async(inject([SpecManager], ( specMgr) => { - - return specMgr.load('/tests/schemas/extended-petstore.yml'); + beforeEach(async(inject([SpecManager, LazyTasksService], (_specMgr, lazyTasks) => { + lazyTasks.sync = true; + specMgr = _specMgr; }))); + beforeEach(done => { + specMgr.load('/tests/schemas/extended-petstore.yml').then(done, done.fail); + }); + beforeEach(() => { let fixture = TestBed.createComponent(TestAppComponent); component = getChildDebugElement(fixture.debugElement, 'method').componentInstance; @@ -53,7 +59,6 @@ describe('Redoc components', () => { /** Test component that contains a Method. */ @Component({ selector: 'test-app', - providers: [SpecManager], template: `` }) diff --git a/lib/components/Method/method.ts b/lib/components/Method/method.ts index 80f23ce0..b846684f 100644 --- a/lib/components/Method/method.ts +++ b/lib/components/Method/method.ts @@ -1,9 +1,9 @@ 'use strict'; -import { Input, Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; +import { Input, Component, OnInit, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef } from '@angular/core'; import JsonPointer from '../../utils/JsonPointer'; import { BaseComponent, SpecManager } from '../base'; import { SchemaHelper } from '../../services/schema-helper.service'; -import { OptionsService } from '../../services/options.service'; +import { OptionsService, AppStateService } from '../../services/'; @Component({ selector: 'method', @@ -14,10 +14,14 @@ import { OptionsService } from '../../services/options.service'; export class Method extends BaseComponent implements OnInit { @Input() pointer:string; @Input() tag:string; + @Input() posInfo: any; + + hidden = true; method:any; - constructor(specMgr:SpecManager, private optionsService: OptionsService) { + constructor(specMgr:SpecManager, private optionsService: OptionsService, private chDetector: ChangeDetectorRef, + private appState: AppStateService, private el: ElementRef) { super(specMgr); } @@ -53,6 +57,14 @@ export class Method extends BaseComponent implements OnInit { return bodyParam; } + show(res) { + if (res) { + this.el.nativeElement.firstElementChild.removeAttribute('hidden'); + } else { + this.el.nativeElement.firstElementChild.setAttribute('hidden', 'hidden'); + } + } + ngOnInit() { this.preinit(); } diff --git a/lib/components/MethodsList/methods-list.html b/lib/components/MethodsList/methods-list.html index 11f4f859..225a1930 100644 --- a/lib/components/MethodsList/methods-list.html +++ b/lib/components/MethodsList/methods-list.html @@ -1,10 +1,10 @@
-
+

{{tag.name}}

-
diff --git a/lib/components/MethodsList/methods-list.scss b/lib/components/MethodsList/methods-list.scss index 0cfbfa50..fe57d8c2 100644 --- a/lib/components/MethodsList/methods-list.scss +++ b/lib/components/MethodsList/methods-list.scss @@ -4,6 +4,11 @@ display: block; overflow: hidden; } + +:host [hidden] { + display: none; +} + .tag-info { padding: $section-spacing; box-sizing: border-box; diff --git a/lib/components/MethodsList/methods-list.spec.ts b/lib/components/MethodsList/methods-list.spec.ts index ca59e157..330cb754 100644 --- a/lib/components/MethodsList/methods-list.spec.ts +++ b/lib/components/MethodsList/methods-list.spec.ts @@ -13,7 +13,7 @@ import { getChildDebugElement } from '../../../tests/helpers'; import { MethodsList } from './methods-list'; import { SpecManager } from '../../utils/spec-manager'; -describe('Redoc components', () => { +describe('Redoc components', () => { beforeEach(() => { TestBed.configureTestingModule({ declarations: [ TestAppComponent ] }); }); @@ -21,11 +21,16 @@ describe('Redoc components', () => { let builder; let component; let fixture; + let specMgr; - beforeEach(async(inject([SpecManager], ( specMgr) => { - - return specMgr.load('/tests/schemas/methods-list-component.json'); + beforeEach(async(inject([SpecManager], (_specMgr) => { + specMgr = _specMgr; }))); + + beforeEach(done => { + specMgr.load('/tests/schemas/methods-list-component.json').then(done, done.fail); + }); + beforeEach(() => { fixture = TestBed.createComponent(TestAppComponent); component = getChildDebugElement(fixture.debugElement, 'methods-list').componentInstance; diff --git a/lib/components/ParamsList/params-list.html b/lib/components/ParamsList/params-list.html index 3659042a..a131fd23 100644 --- a/lib/components/ParamsList/params-list.html +++ b/lib/components/ParamsList/params-list.html @@ -4,7 +4,6 @@ {{paramType.place}} Parameters ? -
diff --git a/lib/components/ParamsList/params-list.scss b/lib/components/ParamsList/params-list.scss index 239c8c83..12b7f981 100644 --- a/lib/components/ParamsList/params-list.scss +++ b/lib/components/ParamsList/params-list.scss @@ -2,10 +2,14 @@ $hint-color: #999999; +:host { + display: block; +} + .param-list-header { border-bottom: 1px solid rgba($text-color, .3); - padding: 0.2em 0; - margin: 3.5em 0 .8em 0; +// padding: 0.2em 0; + margin: 3em 0 1em 0; color: rgba($text-color, .5); font-weight: normal; text-transform: uppercase; @@ -14,7 +18,7 @@ $hint-color: #999999; @import '../JsonSchema/json-schema-common'; header.paramType { - margin: 10px 0; + margin: 25px 0 5px 0; text-transform: capitalize; } diff --git a/lib/components/Redoc/redoc.html b/lib/components/Redoc/redoc.html index 89bacc5c..a688d51a 100644 --- a/lib/components/Redoc/redoc.html +++ b/lib/components/Redoc/redoc.html @@ -2,7 +2,11 @@

Oops... ReDoc failed to render this spec

{{error.message}}
+
+
+
+
diff --git a/lib/components/SchemaSample/schema-sample.scss b/lib/components/SchemaSample/schema-sample.scss index 714eac34..45fdf161 100644 --- a/lib/components/SchemaSample/schema-sample.scss +++ b/lib/components/SchemaSample/schema-sample.scss @@ -13,46 +13,26 @@ pre { } .action-buttons { - display: block; opacity: 0; transition: opacity 0.3s ease; transform: translateY(100%); - z-index: 1; + z-index: 3; position: relative; - - > span { - float: right; - - &:last-child > a:before { - display: none; - } - } + height: 2em; + line-height: 2em; + padding-right: 10px; + text-align: right; + margin-top: -1em; > span > a { padding: 2px 10px; color: #ffffff; cursor: pointer; - &:before { - content: '|'; - display: inline-block; - transform: translateX(-10px); - } - - &:first-child { - margin-right: 0; - } - &:hover { - background-color: $black; + background-color: lighten($black, 15%); } } - - &:after { - display: block; - content: ''; - clear: both; - } } .snippet:hover .action-buttons { @@ -135,6 +115,7 @@ pre { li { position: relative; + display: block; } .hoverable { diff --git a/lib/components/SchemaSample/schema-sample.ts b/lib/components/SchemaSample/schema-sample.ts index 70de0887..40cedfff 100644 --- a/lib/components/SchemaSample/schema-sample.ts +++ b/lib/components/SchemaSample/schema-sample.ts @@ -98,7 +98,7 @@ export class SchemaSample extends BaseComponent implements OnInit { if (this.skipReadOnly && this.componentSchema['x-redoc-ro-sample']) { this.sample = this.componentSchema['x-redoc-ro-sample']; return true; - } else if (this.componentSchema['x-redoc-rw-sample']) { + } else if (!this.skipReadOnly && this.componentSchema['x-redoc-rw-sample']) { this.sample = this.componentSchema['x-redoc-rw-sample']; return true; } diff --git a/lib/components/SideMenu/side-menu.html b/lib/components/SideMenu/side-menu.html index 72f569c8..9124c6f4 100644 --- a/lib/components/SideMenu/side-menu.html +++ b/lib/components/SideMenu/side-menu.html @@ -10,10 +10,10 @@ `, styles: [` + :host { + display: block; + } .tab-wrap { display: none; } diff --git a/lib/shared/components/Zippy/zippy.scss b/lib/shared/components/Zippy/zippy.scss index a93ab00b..a72b7ef9 100644 --- a/lib/shared/components/Zippy/zippy.scss +++ b/lib/shared/components/Zippy/zippy.scss @@ -12,8 +12,8 @@ $zippy-redirect-bg-color: rgba($zippy-redirect-color, .08); :host { // performance optimization - transform: translate3d(0, 0, 0); - backface-visibility: hidden; + // transform: translate3d(0, 0, 0); + // backface-visibility: hidden; overflow: hidden; display: block; } diff --git a/lib/shared/components/index.ts b/lib/shared/components/index.ts index b273f1a5..fe8a1392 100644 --- a/lib/shared/components/index.ts +++ b/lib/shared/components/index.ts @@ -6,9 +6,11 @@ import { Zippy } from './Zippy/zippy'; import { CopyButton } from './CopyButton/copy-button.directive'; import { SelectOnClick } from './SelectOnClick/select-on-click.directive'; import { DynamicNg2Viewer, DynamicNg2Wrapper } from './DynamicNg2Viewer/dynamic-ng2-viewer.component'; +import { LazyFor, LazyTasksService, LazyTasksServiceSync } from './LazyFor/lazy-for'; export const REDOC_COMMON_DIRECTIVES = [ - DropDown, StickySidebar, Tabs, Tab, Zippy, CopyButton, SelectOnClick, DynamicNg2Viewer, DynamicNg2Wrapper + DropDown, StickySidebar, Tabs, Tab, Zippy, CopyButton, SelectOnClick, DynamicNg2Viewer, DynamicNg2Wrapper, LazyFor ]; -export { DropDown, StickySidebar, Tabs, Tab, Zippy, CopyButton, SelectOnClick, DynamicNg2Viewer, DynamicNg2Wrapper } +export { DropDown, StickySidebar, Tabs, Tab, Zippy, CopyButton, SelectOnClick, DynamicNg2Viewer, DynamicNg2Wrapper, LazyFor } +export { LazyTasksService, LazyTasksServiceSync } diff --git a/lib/shared/styles/_variables.scss b/lib/shared/styles/_variables.scss index 95ff58d8..e31b8a65 100644 --- a/lib/shared/styles/_variables.scss +++ b/lib/shared/styles/_variables.scss @@ -22,7 +22,7 @@ $base-font: Roboto; $base-font-family: sans-serif; $base-font-weight: $light; $base-font-size: 1em; -$base-line-height: 1.55em; +$base-line-height: 1.5em; $text-color: $black; // Heading Font diff --git a/lib/utils/helpers.ts b/lib/utils/helpers.ts index 46f1ed66..4366388e 100644 --- a/lib/utils/helpers.ts +++ b/lib/utils/helpers.ts @@ -74,3 +74,7 @@ export function throttle(fn, threshhold, scope) { } }; } + +export const isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 + || (function (p) { return p.toString() === '[object SafariRemoteNotification]'; })(!window['safari'] + || safari.pushNotification); diff --git a/lib/utils/spec-manager.ts b/lib/utils/spec-manager.ts index 5a464de7..7a9e3c94 100644 --- a/lib/utils/spec-manager.ts +++ b/lib/utils/spec-manager.ts @@ -13,24 +13,10 @@ export class SpecManager { public basePath: string; public spec = new BehaviorSubject(null); - private _instance: any; private _url: string; private parser: any; - static instance() { - return new SpecManager(); - } - - constructor() { - if (SpecManager.prototype._instance) { - return SpecManager.prototype._instance; - } - - SpecManager.prototype._instance = this; - } - load(urlOrObject: string|Object) { - this.schema = null; let promise = new Promise((resolve, reject) => { this.parser = new JsonSchemaRefParser(); this.parser.bundle(urlOrObject, {http: {withCredentials: false}}) diff --git a/manual-types/index.d.ts b/manual-types/index.d.ts index faecbd1c..8d37c8e6 100644 --- a/manual-types/index.d.ts +++ b/manual-types/index.d.ts @@ -19,4 +19,11 @@ declare var AOT: any; interface ErrorStackTraceLimit { stackTraceLimit: number; } +interface History { + scrollRestoration: "auto"|"manual"; +} +interface Window { + HTMLElement: any +} +declare var safari: any; interface ErrorConstructor extends ErrorStackTraceLimit {} diff --git a/package.json b/package.json index ea685788..acae3b91 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "redoc", "description": "Swagger-generated API Reference Documentation", - "version": "1.5.2", + "version": "1.6.0", "repository": { "type": "git", "url": "git://github.com/Rebilly/ReDoc" @@ -96,8 +96,8 @@ "ts-helpers": "^1.1.1", "tslint": "^3.15.1", "typescript": "^2.0.3", - "webpack": "^2.1.0-beta.25", - "webpack-dev-server": "^2.1.0-beta.10", + "webpack": "^2.1.0-beta.27", + "webpack-dev-server": "^2.1.0-beta.12", "zone.js": "^0.6.25" }, "dependencies": { diff --git a/tests/spec-bundle.js b/tests/spec-bundle.js index e82fbfb0..4b5637d4 100644 --- a/tests/spec-bundle.js +++ b/tests/spec-bundle.js @@ -48,6 +48,7 @@ beforeEach(function() { services.OptionsService, services.ComponentParser, services.ContentProjector, + { provide: sharedComponents.LazyTasksService, useClass: sharedComponents.LazyTasksServiceSync }, { provide: ErrorHandler, useClass: services.CustomErrorHandler }, { provide: services.COMPONENT_PARSER_ALLOWED, useValue: { 'security-definitions': components.SecurityDefinitions }} ], @@ -60,6 +61,14 @@ beforeEach(function() { }); }); +// afterEach(function() { +// TestBed.resetTestingModule(); +// }); + +// afterEach(function() { +// TestBed.resetTestEnvironment(); +// }) + var testContext = require.context('..', true, /\.spec\.ts/); diff --git a/tests/unit/SpecManager.spec.ts b/tests/unit/SpecManager.spec.ts index c5bc8f63..0ac1a03f 100644 --- a/tests/unit/SpecManager.spec.ts +++ b/tests/unit/SpecManager.spec.ts @@ -9,11 +9,6 @@ describe('Utils', () => { specMgr = new SpecManager(); }); - it('Should be a singleton', ()=> { - (new SpecManager()).should.be.equal(specMgr); - SpecManager.instance().should.be.equal(specMgr); - }); - it('load should return a promise', ()=> { specMgr.load('/tests/schemas/extended-petstore.yml').should.be.instanceof(Promise); }); @@ -35,15 +30,10 @@ describe('Utils', () => { }); describe('Schema manager basic functionality', ()=> { - beforeAll(function (done) { - specMgr.load('/tests/schemas/extended-petstore.yml').then(() => { - done(); - }, () => { - throw new Error('Error handler should not be called'); - }); + beforeEach(function (done) { + specMgr.load('/tests/schemas/extended-petstore.yml').then(done, done.fail); }); - it('should contain non-empty schema', ()=> { specMgr.schema.should.be.an.Object(); specMgr.schema.should.be.not.empty(); @@ -68,9 +58,9 @@ describe('Utils', () => { it('should substitute api host when spec host is undefined', () => { specMgr._schema.host = undefined; - specMgr._url = 'https://petstore.swagger.io/v2'; + specMgr._url = 'http://petstore.swagger.io/v2'; specMgr.init(); - specMgr.apiUrl.should.be.equal('https://petstore.swagger.io/v2'); + specMgr.apiUrl.should.be.equal('http://petstore.swagger.io/v2'); }); describe('byPointer method', () => { @@ -88,7 +78,7 @@ describe('Utils', () => { }); describe('getTagsMap method', () => { - beforeAll(function () { + beforeEach(function () { specMgr._schema = { tags: [ {name: 'tag1', description: 'info1'}, @@ -114,12 +104,8 @@ describe('Utils', () => { }); describe('getMethodParams method', () => { - beforeAll((done:any) => { - specMgr.load('/tests/schemas/schema-mgr-methodparams.json').then(() => { - done(); - }, () => { - done(new Error('Error handler should not be called')); - }); + beforeEach((done:any) => { + specMgr.load('/tests/schemas/schema-mgr-methodparams.json').then(done, done.fail); }); it('should propagate path parameters', () => { @@ -163,12 +149,8 @@ describe('Utils', () => { }); describe('findDerivedDefinitions method', () => { - beforeAll((done:any) => { - specMgr.load('/tests/schemas/extended-petstore.yml').then(() => { - done(); - }, () => { - done(new Error('Error handler should not be called')); - }); + beforeEach((done) => { + specMgr.load('/tests/schemas/extended-petstore.yml').then(done, done.fail); }); it('should find derived definitions for Pet', () => {