Merge commit 'd1b9cb1a63481689e1f0a0e7a3d8a0ffa0da9ba2' into releases

This commit is contained in:
RedocBot 2017-02-25 23:34:20 +00:00 committed by travis@localhost
commit 3df53d3cad
29 changed files with 743 additions and 156 deletions

View File

@ -1,3 +1,21 @@
<a name="1.8.1"></a>
## 1.8.1 (2017-02-23)
### Bug Fixes
* Fix toggle icon width on IE, closes [#198](https://github.com/Rebilly/ReDoc/issues/198)
* Add safe guards array without items, closes [#199](https://github.com/Rebilly/ReDoc/issues/199)
* Fix extra slash if basePath is not present ([a5c03ab](https://github.com/Rebilly/ReDoc/commit/a5c03ab)), closes [#201](https://github.com/Rebilly/ReDoc/issues/201)
* response samples - render description as markdown ([4acfc11](https://github.com/Rebilly/ReDoc/commit/4acfc11)), closes [#190](https://github.com/Rebilly/ReDoc/issues/190)
* take snapshot of schema to not overwrite inlined references ([77bc3c4](https://github.com/Rebilly/ReDoc/commit/77bc3c4)), closes [#203](https://github.com/Rebilly/ReDoc/issues/203)
* use items description if not present on top level ([23e7847](https://github.com/Rebilly/ReDoc/commit/23e7847))
### Features
* autoscroll menu ([b43a87d](https://github.com/Rebilly/ReDoc/commit/b43a87d))
# 1.8.0 (2017-02-03)
### Features/Improvements
* In-page search :tada: []#51](https://github.com/Rebilly/ReDoc/issues/51)

View File

@ -125,6 +125,7 @@ ReDoc makes use of the following [vendor extensions](http://swagger.io/specifica
* [`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
* [`x-tagGroups`](docs/redoc-vendor-extensions.md#x-tagGroups) - group tags by categories in the side menu
* [`x-servers`](docs/redoc-vendor-extensions.md#x-servers) - ability to specify different servers for API (backported from OpenAPI 3.0)
### `<redoc>` tag attributes
* `spec-url` - relative or absolute url to your spec file;
@ -135,7 +136,6 @@ ReDoc makes use of the following [vendor extensions](http://swagger.io/specifica
* **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.
* `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

0
build/empty.js Normal file
View File

View File

@ -82,7 +82,7 @@ module.exports = function (options) {
},
{
test: /lib[\\\/].*\.scss$/,
loaders: ['raw-loader', "sass-loader"],
loaders: ['raw-loader', 'sass-loader'],
exclude: [/redoc-initial-styles\.scss$/]
},
{
@ -110,7 +110,9 @@ module.exports = function (options) {
'AOT': options.AOT
}),
new StringReplacePlugin()
new StringReplacePlugin(),
new webpack.NormalModuleReplacementPlugin(/node_modules\/rxjs\/operator\/.*/, root('build/empty.js')),
new webpack.NormalModuleReplacementPlugin(/node_modules\/rxjs\/testing\//, root('build/empty.js'))
],
node: {
global: true,

View File

@ -79,6 +79,11 @@ securityDefinitions:
type: apiKey
name: api_key
in: header
x-servers:
- url: //petstore.swagger.io/v2
description: Default server
- url: //petstore.swagger.io/sandbox
description: Sandbox server
paths:
/pet:
post:

View File

@ -3,6 +3,9 @@ ReDoc makes use of the following [vendor extensions](http://swagger.io/specifica
### Swagger Object vendor extensions
Extend OpenAPI root [Swagger Object](http://swagger.io/specification/#swaggerObject)
#### x-servers
Backported from OpenAPI 3.0 [`servers`](https://github.com/OAI/OpenAPI-Specification/blob/OpenAPI.next/versions/3.0.md#server-object). Currently doesn't support templates.
#### x-tagGroups
| Field Name | Type | Description |

View File

@ -24,7 +24,7 @@ export class ApiInfo extends BaseComponent implements OnInit {
init() {
this.info = this.componentSchema.info;
this.specUrl = this.optionsService.options.specUrl;
if (!isNaN(parseInt(this.info.version.substring(0, 1)))) {
if (!isNaN(parseInt(this.info.version.toString().substring(0, 1)))) {
this.info.version = 'v' + this.info.version;
}
}

View File

@ -0,0 +1,17 @@
<div class="method-endpoint" (click)="handleClick()">
<h5 class="http-verb" [ngClass]="verb">{{verb}}</h5>
<span><!--
--><span class="method-api-url-path">{{path}}</span><!--
--></span>
</div>
<svg class="expand-icon" xmlns="http://www.w3.org/2000/svg" version="1.1" x="0" y="0" viewBox="0 0 24 24" xml:space="preserve">
<polygon fill="white" points="17.3 8.3 12 13.6 6.7 8.3 5.3 9.7 12 16.4 18.7 9.7 "/>
</svg>
<div class="servers-overlay" [@overlayExpand]="expanded ? 'expanded' : 'collapsed'">
<div *ngFor="let server of servers" class="server-item">
<div class="description" [innerHtml]="server.description | marked"></div>
<div select-on-click class="url">
<span class="method-api-url"> {{server.url}}</span>{{path}}
</div>
</div>
</div>

View File

@ -0,0 +1,104 @@
@import '../../shared/styles/variables';
:host {
display: block;
position: relative;
cursor: pointer;
}
.method-endpoint {
padding: 10px 30px 10px 20px;
border-radius: $border-radius*2;
background-color: darken($black, 2%);
display: block;
font-weight: $light;
white-space: nowrap;
overflow-x: hidden;
text-overflow: ellipsis;
border: 1px solid transparent;
}
.method-endpoint > .method-params-subheader {
padding-top: 1px;
padding-bottom: 0;
margin: 0;
font-size: 12/14em;
color: $black;
vertical-align: middle;
display: inline-block;
border-radius: $border-radius;
}
.method-api-url {
color: rgba($black, .8);
&-path {
font-family: $headers-font, $headers-font-family;
position: relative;
top: 1px;
color: #ffffff;
margin-left: 10px;
}
}
.http-verb {
color: $black;
background: #ffffff;
padding: 3px 10px;
text-transform: uppercase;
display: inline-block;
margin: 0;
}
.servers-overlay {
position: absolute;
width: 100%;
z-index: 100;
background: $side-bar-bg-color;
color: $black;
box-sizing: border-box;
box-shadow: 4px 4px 6px rgba(0, 0, 0, 0.33);
overflow: hidden;
border-bottom-left-radius: $border-radius*2;
border-bottom-right-radius: $border-radius*2;
}
.server-item {
padding: 10px;
//margin-bottom: 10px;
& > .url {
padding: 5px;
border: 1px solid $border-color;
background: $background-color;
word-break: break-all;
}
&:last-child {
margin-bottom: 0;
}
}
.expand-icon {
height: 20px;
width: 20px;
display: inline-block;
float: right;
background: darken($black, 2%);
transform: rotateZ(0);
transition: all 0.2s ease;
top: 15px;
right: 5px;
position: absolute;
}
:host.expanded {
> .method-endpoint {
border-color: $side-bar-bg-color;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.expand-icon {
transform: rotateZ(180deg);
}
}

View File

@ -0,0 +1,79 @@
'use strict';
import { Component } from '@angular/core';
import {
inject,
async,
TestBed
} from '@angular/core/testing';
import { getChildDebugElement } from '../../../tests/helpers';
import { EndpointLink } from './endpoint-link';
import { SpecManager } from '../../utils/spec-manager';
describe('Redoc components', () => {
beforeEach(() => {
TestBed.configureTestingModule({ declarations: [ TestAppComponent ] });
});
describe('EndpointLink Component', () => {
let builder;
let component: EndpointLink;
let specMgr: SpecManager;
beforeEach(async(inject([SpecManager], (_specMgr) => {
specMgr = _specMgr;
})));
beforeEach(() => {
specMgr.apiUrl = 'http://test.com/v1';
specMgr._schema = {
info: {},
host: 'petstore.swagger.io',
baseName: '/v2',
schemes: ['https', 'http'],
'x-servers': [
{
url: '//test.com/v2'
},
{
url: 'ws://test.com/v3',
description: 'test'
}
]
};
specMgr.init();
component = new EndpointLink(specMgr);
});
it('should replace // with appropriate protocol', () => {
component.ngOnInit();
component.servers[0].url.should.be.equal('https://test.com/v2');
});
it('should preserve other protocols', () => {
component.ngOnInit();
component.servers[1].url.should.be.equal('ws://test.com/v3');
});
it('should fallback to host + basePath + schemas if no x-servers', () => {
specMgr._schema['x-servers'] = null;
specMgr.init();
component.ngOnInit();
component.servers.should.be.lengthOf(1);
component.servers[0].url.should.be.equal('https://petstore.swagger.io');
});
});
});
/** Test component that contains a Method. */
@Component({
selector: 'test-app',
template:
`<method pointer='#/paths/~1user~1{username}/put'></method>`
})
class TestAppComponent {
}

View File

@ -0,0 +1,69 @@
'use strict';
import { Component, ChangeDetectionStrategy, Input, OnInit, HostListener, HostBinding} from '@angular/core';
import { BaseComponent, SpecManager } from '../base';
import { trigger, state, animate, transition, style } from '@angular/core';
export interface ServerInfo {
description: string;
url: string;
}
@Component({
selector: 'endpoint-link',
styleUrls: ['./endpoint-link.css'],
templateUrl: './endpoint-link.html',
changeDetection: ChangeDetectionStrategy.OnPush,
animations: [
trigger('overlayExpand', [
state('collapsed, void',
style({ height: '0px' })),
state('expanded',
style({ height: '*' })),
transition('collapsed <=> expanded', [
animate('200ms ease')
])
])
]
})
export class EndpointLink implements OnInit {
@Input() path:string;
@Input() verb:string;
apiUrl: string;
servers: ServerInfo[];
@HostBinding('class.expanded') expanded: boolean = false;
// @HostListener('click')
handleClick() {
this.expanded = !this.expanded;
}
constructor(public specMgr:SpecManager) {
this.expanded = false;
}
init() {
let servers:ServerInfo[] = this.specMgr.schema['x-servers'];
if (servers) {
this.servers = servers.map(({url, description}) => ({
description,
url: url.startsWith('//') ? `${this.specMgr.apiProtocol}:${url}` : url
}));
} else {
this.servers = [
{
description: 'Server URL',
url: this.getBaseUrl()
}
];
}
}
getBaseUrl():string {
return this.specMgr.apiUrl;
}
ngOnInit() {
this.init();
}
}

View File

@ -16,12 +16,7 @@
<div class="method-samples">
<h4 class="method-params-subheader">Definition</h4>
<div class="method-endpoint">
<h5 class="http-method" [ngClass]="method.httpMethod">{{method.httpMethod}}</h5>
<span select-on-click><!--
--><span class="method-api-url">{{method.apiUrl}}</span><span class="method-api-url-path">{{method.path}}</span><!--
--></span>
</div>
<endpoint-link [verb]="method.verb" [path]="method.path"> </endpoint-link>
<div>
<request-samples [pointer]="pointer" [schemaPointer]="method.bodyParam?._pointer">

View File

@ -18,45 +18,6 @@
margin-bottom: calc(1em - 6px);
}
.method-endpoint {
//margin: 0 0 2px 0;
padding: 10px 20px;
border-radius: $border-radius*2;
background-color: darken($black, 2%);
display: block;
font-weight: $light;
white-space: nowrap;
overflow-x: auto;
}
.method-endpoint > .method-params-subheader {
padding-top: 1px;
padding-bottom: 0;
margin: 0;
font-size: 12/14em;
color: $black;
vertical-align: middle;
display: inline-block;
border-radius: $border-radius;
}
.method-api-url {
color: rgba(#ffffff, .6);
margin-left: 10px;
margin-top: 2px;
position: relative;
top: 1px;
font-family: $headers-font, $headers-font-family;
font-size: 0.929em;
&-path {
font-family: $headers-font, $headers-font-family;
position: relative;
top: 1px;
color: #ffffff;
}
}
.method-tags {
margin-top: 20px;
@ -121,15 +82,6 @@
margin: 0;
}
.http-method {
color: $black;
background: #ffffff;
padding: 3px 10px;
text-transform: uppercase;
display: inline-block;
margin: 0;
}
[select-on-click] {
cursor: pointer;
}

View File

@ -19,7 +19,7 @@ describe('Redoc components', () => {
});
describe('Method Component', () => {
let builder;
let component;
let component: Method;
let specMgr;
beforeEach(async(inject([SpecManager, LazyTasksService], (_specMgr, lazyTasks) => {
@ -43,8 +43,7 @@ describe('Redoc components', () => {
});
it('should init basic component data', () => {
component.method.apiUrl.should.be.equal('http://petstore.swagger.io/v2');
component.method.httpMethod.should.be.equal('put');
component.method.verb.should.be.equal('put');
component.method.path.should.be.equal('/user/{username}');
});

View File

@ -7,8 +7,7 @@ import { OptionsService } from '../../services/';
interface MethodInfo {
apiUrl: string;
httpMethod: string;
verb: string;
path: string;
info: {
tags: string[];
@ -45,7 +44,7 @@ export class Method extends BaseComponent implements OnInit {
this.operationId = this.componentSchema.operationId;
this.method = {
httpMethod: JsonPointer.baseName(this.pointer),
verb: JsonPointer.baseName(this.pointer),
path: JsonPointer.baseName(this.pointer, 2),
info: {
description: this.componentSchema.description,
@ -53,7 +52,6 @@ export class Method extends BaseComponent implements OnInit {
},
bodyParam: this.findBodyParam(),
summary: SchemaHelper.methodSummary(this.componentSchema),
apiUrl: this.getBaseUrl(),
anchor: this.buildAnchor(),
externalDocs: this.componentSchema.externalDocs
};
@ -67,14 +65,6 @@ export class Method extends BaseComponent implements OnInit {
}
}
getBaseUrl():string {
if (this.optionsService.options.hideHostname) {
return this.specMgr.basePath;
} else {
return this.specMgr.apiUrl;
}
}
filterMainTags(tags) {
var tagsMap = this.specMgr.getTagsMap();
if (!tags) return [];

View File

@ -53,5 +53,12 @@ describe('Redoc components', () => {
let resp2 = component.responses[1];
resp1.code.should.not.be.equal(resp2.code);
});
it('should set type of default as error if other 200-399 response is defined', () => {
component.pointer = '#/paths/~1test2/get/responses';
fixture.detectChanges();
let resp1 = component.responses[1];
resp1.type.should.be.equal('error');
});
});
});

View File

@ -44,10 +44,16 @@ export class ResponsesList extends BaseSearchableComponent implements OnInit {
let responses = this.componentSchema;
if (!responses) return;
responses = Object.keys(responses).filter(respCode => {
let hasSuccessResponses = false;
let respCodes = Object.keys(responses).filter(respCode => {
if ((parseInt(respCode) >= 100) && (parseInt(respCode) <=399)) {
hasSuccessResponses = true;
}
// only response-codes and "default"
return ( isNumeric(respCode) || (respCode === 'default'));
}).map(respCode => {
});
responses = respCodes.map(respCode => {
let resp = responses[respCode];
resp.pointer = JsonPointer.join(this.pointer, respCode);
if (resp.$ref) {
@ -58,7 +64,7 @@ export class ResponsesList extends BaseSearchableComponent implements OnInit {
resp.empty = !resp.schema;
resp.code = respCode;
resp.type = statusCodeType(resp.code);
resp.type = statusCodeType(resp.code, hasSuccessResponses);
resp.expanded = false;
if (this.options.expandResponses) {

View File

@ -37,7 +37,11 @@ export class ResponsesSamples extends BaseComponent implements OnInit {
let responses = this.componentSchema;
if (!responses) return;
let hasSuccessResponses = false;
responses = Object.keys(responses).filter(respCode => {
if ((parseInt(respCode) >= 100) && (parseInt(respCode) <=399)) {
hasSuccessResponses = true;
}
// only response-codes and "default"
return ( isNumeric(respCode) || (respCode === 'default'));
}).map(respCode => {
@ -50,7 +54,7 @@ export class ResponsesSamples extends BaseComponent implements OnInit {
}
resp.code = respCode;
resp.type = statusCodeType(resp.code);
resp.type = statusCodeType(resp.code, hasSuccessResponses);
return resp;
})
.filter(response => hasExample(response));

View File

@ -17,15 +17,16 @@ import { SecurityDefinitions } from './SecurityDefinitions/security-definitions'
import { LoadingBar } from './LoadingBar/loading-bar';
import { RedocSearch } from './Search/redoc-search';
import { ExternalDocs } from './ExternalDocs/external-docs';
import { EndpointLink } from './EndpointLink/endpoint-link';
import { Redoc } from './Redoc/redoc';
export const REDOC_DIRECTIVES = [
ApiInfo, ApiLogo, JsonSchema, JsonSchemaLazy, ParamsList, RequestSamples, ResponsesList,
ResponsesSamples, SchemaSample, SideMenu, MethodsList, Method, Warnings, Redoc, SecurityDefinitions,
LoadingBar, SideMenuItems, RedocSearch, ExternalDocs
LoadingBar, SideMenuItems, RedocSearch, ExternalDocs, EndpointLink
];
export { ApiInfo, ApiLogo, JsonSchema, JsonSchemaLazy, ParamsList, RequestSamples, ResponsesList,
ResponsesSamples, SchemaSample, SideMenu, MethodsList, Method, Warnings, Redoc, SecurityDefinitions,
LoadingBar, SideMenuItems, RedocSearch, ExternalDocs }
LoadingBar, SideMenuItems, RedocSearch, ExternalDocs, EndpointLink }

View File

@ -13,7 +13,6 @@ const OPTION_NAMES = new Set([
'disableLazySchemas',
'specUrl',
'suppressWarnings',
'hideHostname',
'lazyRendering',
'expandResponses'
]);
@ -23,7 +22,6 @@ interface Options {
disableLazySchemas?: boolean;
specUrl?: string;
suppressWarnings?: boolean;
hideHostname?: boolean;
lazyRendering?: boolean;
expandResponses?: Set<string> | 'all';
$scrollParent?: HTMLElement | Window;
@ -89,7 +87,6 @@ export class OptionsService {
if (isString(this._options.disableLazySchemas)) this._options.disableLazySchemas = true;
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;

View File

@ -16,6 +16,60 @@ describe('Spec Helper', () => {
expect(console.warn).toHaveBeenCalled();
(<jasmine.Spy>console.warn).and.callThrough();
});
describe('string', () => {
it('should calculate range for string with maxLength', () => {
let schema:any = {
type: 'string',
maxLength: 3
};
SchemaHelper.runInjectors(schema, schema, '#/');
schema._range.should.be.equal('<= 3 characters');
});
it('should calculate range for string with minLength', () => {
let schema:any = {
type: 'string',
minLength: 3,
};
SchemaHelper.runInjectors(schema, schema, '#/');
schema._range.should.be.equal('>= 3 characters');
});
it('should calculate range for string with both max and minLength', () => {
let schema:any = {
type: 'string',
minLength: 3,
maxLength: 5
};
SchemaHelper.runInjectors(schema, schema, '#/');
schema._range.should.be.equal('[ 3 .. 5 ] characters');
});
it('should calculate range for string with equal max and minLength', () => {
let schema:any = {
type: 'string',
minLength: 5,
maxLength: 5
};
SchemaHelper.runInjectors(schema, schema, '#/');
schema._range.should.be.equal('5 characters');
});
it('should show range as non-empty for minLength == 1', () => {
let schema:any = {
type: 'string',
minLength: 1
};
SchemaHelper.runInjectors(schema, schema, '#/');
schema._range.should.be.equal('non-empty');
});
});
});
describe('preprocessProperties', () => {

View File

@ -150,16 +150,22 @@ const injectors = {
inject: (injectTo, propertySchema = injectTo) => {
var range;
if (propertySchema.minLength != undefined && propertySchema.maxLength != undefined) {
range = `[ ${propertySchema.minLength} .. ${propertySchema.maxLength} ]`;
if (propertySchema.minLength === propertySchema.maxLength) {
range = `${propertySchema.minLength} characters`;
} else {
range = `[ ${propertySchema.minLength} .. ${propertySchema.maxLength} ] characters`;
}
} else if (propertySchema.maxLength != undefined) {
range = '<= ' + propertySchema.maxLength;
range = `<= ${propertySchema.maxLength} characters`;
} else if (propertySchema.minLength != undefined) {
range = '>= ' + propertySchema.minLength;
if (propertySchema.minLength === 1) {
range = 'non-empty';
} else {
range = `>= ${propertySchema.minLength} characters`;
}
}
if (range) {
injectTo._range = range + ' characters';
}
injectTo._range = range;
}
},
file: {

View File

@ -7,6 +7,7 @@ $green: #00aa13;
$yellow: #f1c400;
$red: #e53935;
$background-color: #fff;
$border-color: #ccc;
$em-size: 14px;

View File

@ -32,7 +32,11 @@ export function groupBy<T>(array: T[], key:string):StringMap<T[]> {
}, {});
}
export function statusCodeType(statusCode) {
export function statusCodeType(statusCode, defaultAsError = false) {
if (statusCode === 'default') {
return defaultAsError ? 'error' : 'success';
}
if (statusCode < 100 || statusCode > 599) {
throw new Error('invalid HTTP code');
}

View File

@ -24,10 +24,12 @@ export interface DescendantInfo {
export class SpecManager {
public _schema: any = {};
public apiUrl: string;
public apiProtocol: string;
public swagger: string;
public basePath: string;
public spec = new BehaviorSubject<any|null>(null);
private _url: string;
public _specUrl: string;
private parser: any;
load(urlOrObject: string|Object) {
@ -36,7 +38,7 @@ export class SpecManager {
this.parser.bundle(urlOrObject, {http: {withCredentials: false}})
.then(schema => {
if (typeof urlOrObject === 'string') {
this._url = urlOrObject;
this._specUrl = urlOrObject;
}
this._schema = snapshot(schema);
try {
@ -54,7 +56,7 @@ export class SpecManager {
/* calculate common used values */
init() {
let urlParts = this._url ? urlParse(urlResolve(window.location.href, this._url)) : {};
let urlParts = this._specUrl ? urlParse(urlResolve(window.location.href, this._specUrl)) : {};
let schemes = this._schema.schemes;
let protocol;
if (!schemes || !schemes.length) {
@ -70,6 +72,7 @@ export class SpecManager {
let host = this._schema.host || urlParts.host;
this.basePath = this._schema.basePath || '';
this.apiUrl = protocol + '://' + host + this.basePath;
this.apiProtocol = protocol;
if (this.apiUrl.endsWith('/')) {
this.apiUrl = this.apiUrl.substr(0, this.apiUrl.length - 1);
}
@ -79,6 +82,9 @@ export class SpecManager {
preprocess() {
let mdRender = new MdRenderer();
if (!this._schema.info) {
throw Error('Specification Error: Required field "info" is not specified at the top level of the specification');
}
if (!this._schema.info.description) this._schema.info.description = '';
if (this._schema.securityDefinitions) {
let SecurityDefinitions = require('../components/').SecurityDefinitions;
@ -168,7 +174,7 @@ export class SpecManager {
return tagsMap;
}
findDerivedDefinitions(defPointer: string, schema): DescendantInfo[] {
findDerivedDefinitions(defPointer: string, schema?: any): DescendantInfo[] {
let definition = schema || this.byPointer(defPointer);
if (!definition) throw new Error(`Can't load schema at ${defPointer}`);
if (!definition.discriminator && !definition['x-extendedDiscriminator']) return [];

View File

@ -1,7 +1,7 @@
{
"name": "redoc",
"description": "Swagger-generated API Reference Documentation",
"version": "1.8.1",
"version": "1.9.0",
"repository": {
"type": "git",
"url": "git://github.com/Rebilly/ReDoc"
@ -32,7 +32,8 @@
"e2e-copy": "cp dist/redoc.min.js tests/e2e/",
"webdriver": "webdriver-manager update",
"serve:prod": "NODE_ENV=production npm start",
"protractor": "protractor"
"protractor": "protractor",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 1"
},
"keywords": [
"OpenAPI",
@ -65,6 +66,7 @@
"branch-release": "^1.0.3",
"chalk": "^1.1.3",
"codelyzer": "^2.0.1",
"conventional-changelog-cli": "^1.2.0",
"core-js": "^2.4.1",
"coveralls": "^2.11.16",
"css-loader": "^0.26.0",
@ -119,6 +121,5 @@
"webpack-dev-server": "^2.4.1",
"webpack-merge": "^3.0.0",
"zone.js": "^0.7.7"
},
"dependencies": {}
}
}

View File

@ -31,8 +31,26 @@
}
}
}
},
"/test2": {
"get": {
"responses": {
"200": {
"description": "successful operation",
"schema": {
"$ref": "#/definitions/def1"
}
},
"default": {
"description": "successful operation",
"schema": {
"$ref": "#/definitions/def1"
}
}
}
}
},
},
"definitions": {
"def1": {
"type": "string"

View File

@ -3,7 +3,7 @@
import { SpecManager } from '../../lib/utils/spec-manager';
describe('Utils', () => {
describe('Schema manager', () => {
let specMgr;
let specMgr: SpecManager;
beforeEach(() => {
specMgr = new SpecManager();
@ -51,21 +51,21 @@ describe('Utils', () => {
it('should substitute api scheme when spec schemes are undefined', () => {
specMgr._schema.schemes = undefined;
specMgr._url = 'https://petstore.swagger.io/v2';
specMgr._specUrl = 'https://petstore.swagger.io/v2';
specMgr.init();
specMgr.apiUrl.should.be.equal('https://petstore.swagger.io/v2');
});
it('should substitute api host when spec host is undefined', () => {
specMgr._schema.host = undefined;
specMgr._url = 'http://petstore.swagger.io/v2';
specMgr._specUrl = 'http://petstore.swagger.io/v2';
specMgr.init();
specMgr.apiUrl.should.be.equal('http://petstore.swagger.io/v2');
});
it('should use empty basePath when basePath is not present', () => {
specMgr._schema.basePath = undefined;
specMgr._url = 'https://petstore.swagger.io';
specMgr._specUrl = 'https://petstore.swagger.io';
specMgr.init();
specMgr.basePath.should.be.equal('');
});

357
yarn.lock
View File

@ -98,6 +98,13 @@
"@types/tapable" "*"
"@types/uglify-js" "*"
JSONStream@^1.0.4:
version "1.3.1"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a"
dependencies:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
abbrev@1, abbrev@1.0.x:
version "1.0.9"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
@ -119,6 +126,10 @@ acorn@^4.0.3, acorn@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a"
add-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
adm-zip@0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.4.tgz#a61ed5ae6905c3aea58b3a657d25033091052736"
@ -250,6 +261,10 @@ array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
array-ify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
array-slice@^0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
@ -322,13 +337,7 @@ async@^0.9.0, async@~0.9.0:
version "0.9.2"
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
async@^2.1.2:
version "2.1.4"
resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4"
dependencies:
lodash "^4.14.0"
async@^2.1.5:
async@^2.1.2, async@^2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc"
dependencies:
@ -900,6 +909,13 @@ commander@^2.7.1, commander@^2.9.0:
dependencies:
graceful-readlink ">= 1.0.0"
compare-func@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648"
dependencies:
array-ify "^1.0.0"
dot-prop "^3.0.0"
component-bind@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
@ -994,6 +1010,140 @@ content-type@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
conventional-changelog-angular@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.3.0.tgz#3f64185978aa13ab0954c9e46a78969fd59c6801"
dependencies:
compare-func "^1.3.1"
github-url-from-git "^1.4.0"
q "^1.4.1"
conventional-changelog-atom@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.1.0.tgz#67a47c66a42b2f8909ef1587c9989ae1de730b92"
dependencies:
q "^1.4.1"
conventional-changelog-cli@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.2.0.tgz#c4929dcdb5d5ba9aa1840418e6b4674691193f5d"
dependencies:
add-stream "^1.0.0"
conventional-changelog "^1.1.0"
lodash "^4.1.0"
meow "^3.7.0"
tempfile "^1.1.1"
conventional-changelog-codemirror@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.1.0.tgz#7577a591dbf9b538e7a150a7ee62f65a2872b334"
dependencies:
q "^1.4.1"
conventional-changelog-core@^1.3.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.5.0.tgz#72b17509535a23d7c6cb70ad4384f74247748013"
dependencies:
conventional-changelog-writer "^1.1.0"
conventional-commits-parser "^1.0.0"
dateformat "^1.0.12"
get-pkg-repo "^1.0.0"
git-raw-commits "^1.1.0"
git-remote-origin-url "^2.0.0"
git-semver-tags "^1.1.0"
lodash "^4.0.0"
normalize-package-data "^2.3.5"
q "^1.4.1"
read-pkg "^1.1.0"
read-pkg-up "^1.0.1"
through2 "^2.0.0"
conventional-changelog-ember@^0.2.0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.2.tgz#bad70a891386bc3046484a8f4f1e5aa2dc0ad208"
dependencies:
q "^1.4.1"
conventional-changelog-eslint@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-0.1.0.tgz#a52411e999e0501ce500b856b0a643d0330907e2"
dependencies:
q "^1.4.1"
conventional-changelog-express@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.1.0.tgz#55c6c841c811962036c037bdbd964a54ae310fce"
dependencies:
q "^1.4.1"
conventional-changelog-jquery@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510"
dependencies:
q "^1.4.1"
conventional-changelog-jscs@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c"
dependencies:
q "^1.4.1"
conventional-changelog-jshint@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.1.0.tgz#00cab8e9a3317487abd94c4d84671342918d2a07"
dependencies:
compare-func "^1.3.1"
q "^1.4.1"
conventional-changelog-writer@^1.1.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-1.4.1.tgz#3f4cb4d003ebb56989d30d345893b52a43639c8e"
dependencies:
compare-func "^1.3.1"
conventional-commits-filter "^1.0.0"
dateformat "^1.0.11"
handlebars "^4.0.2"
json-stringify-safe "^5.0.1"
lodash "^4.0.0"
meow "^3.3.0"
semver "^5.0.1"
split "^1.0.0"
through2 "^2.0.0"
conventional-changelog@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.0.tgz#8ae3fb59feb74bbee0a25833ee1f83dad4a07874"
dependencies:
conventional-changelog-angular "^1.0.0"
conventional-changelog-atom "^0.1.0"
conventional-changelog-codemirror "^0.1.0"
conventional-changelog-core "^1.3.0"
conventional-changelog-ember "^0.2.0"
conventional-changelog-eslint "^0.1.0"
conventional-changelog-express "^0.1.0"
conventional-changelog-jquery "^0.1.0"
conventional-changelog-jscs "^0.1.0"
conventional-changelog-jshint "^0.1.0"
conventional-commits-filter@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.0.0.tgz#6fc2a659372bc3f2339cf9ffff7e1b0344b93039"
dependencies:
is-subset "^0.1.1"
modify-values "^1.0.0"
conventional-commits-parser@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz#e327b53194e1a7ad5dc63479ee9099a52b024865"
dependencies:
JSONStream "^1.0.4"
is-text-path "^1.0.0"
lodash "^4.2.1"
meow "^3.3.0"
split2 "^2.0.0"
through2 "^2.0.0"
trim-off-newlines "^1.0.0"
convert-source-map@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67"
@ -1198,6 +1348,12 @@ custom-event@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
dargs@^4.0.1:
version "4.1.0"
resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17"
dependencies:
number-is-nan "^1.0.0"
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@ -1208,7 +1364,7 @@ date-now@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
dateformat@^1.0.11, dateformat@^1.0.6:
dateformat@^1.0.11, dateformat@^1.0.12, dateformat@^1.0.6:
version "1.0.12"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9"
dependencies:
@ -1219,9 +1375,9 @@ debug@0.7.4:
version "0.7.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
debug@2, debug@^2.2.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
debug@2, debug@2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
dependencies:
ms "0.7.2"
@ -1237,9 +1393,9 @@ debug@2.3.3:
dependencies:
ms "0.7.2"
debug@2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
debug@^2.2.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
dependencies:
ms "0.7.2"
@ -1440,16 +1596,7 @@ engine.io@1.8.3:
engine.io-parser "1.3.2"
ws "1.1.2"
enhanced-resolve@^3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.0.3.tgz#df14c06b5fc5eecade1094c9c5a12b4b3edc0b62"
dependencies:
graceful-fs "^4.1.2"
memory-fs "^0.4.0"
object-assign "^4.0.1"
tapable "^0.2.5"
enhanced-resolve@^3.1.0:
enhanced-resolve@^3.0.0, enhanced-resolve@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec"
dependencies:
@ -1838,6 +1985,16 @@ get-caller-file@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
get-pkg-repo@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.3.0.tgz#43c6b4c048b75dd604fc5388edecde557f6335df"
dependencies:
hosted-git-info "^2.1.4"
meow "^3.3.0"
normalize-package-data "^2.3.0"
parse-github-repo-url "^1.3.0"
through2 "^2.0.0"
get-stdin@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
@ -1848,6 +2005,30 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
git-raw-commits@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.1.2.tgz#a12d8492aeba2881802d700825ed81c9f39e6f2f"
dependencies:
dargs "^4.0.1"
lodash.template "^4.0.2"
meow "^3.3.0"
split2 "^2.0.0"
through2 "^2.0.0"
git-remote-origin-url@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f"
dependencies:
gitconfiglocal "^1.0.0"
pify "^2.3.0"
git-semver-tags@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.1.2.tgz#aecf9b1b2447a6b548d48647f53edba0acad879f"
dependencies:
meow "^3.3.0"
semver "^5.0.1"
git-up@^2.0.0:
version "2.0.6"
resolved "https://registry.yarnpkg.com/git-up/-/git-up-2.0.6.tgz#38d6dddc5db720de83ef09ef3865e748f5887e12"
@ -1861,6 +2042,16 @@ git-url-parse@^6.0.3:
dependencies:
git-up "^2.0.0"
gitconfiglocal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b"
dependencies:
ini "^1.3.2"
github-url-from-git@^1.4.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0"
glob-base@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
@ -1991,7 +2182,7 @@ handle-thing@^1.2.4:
version "1.2.5"
resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
handlebars@^4.0.1:
handlebars@^4.0.1, handlebars@^4.0.2:
version "4.0.6"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7"
dependencies:
@ -2211,7 +2402,7 @@ inherits@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
ini@^1.3.4, ini@~1.3.0:
ini@^1.3.2, ini@^1.3.4, ini@~1.3.0:
version "1.3.4"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
@ -2386,12 +2577,22 @@ is-stream@^1.0.0, is-stream@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
is-subset@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
is-svg@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
dependencies:
html-comment-regex "^1.1.0"
is-text-path@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
dependencies:
text-extensions "^1.0.0"
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@ -2567,7 +2768,7 @@ json-stable-stringify@^1.0.1:
dependencies:
jsonify "~0.0.0"
json-stringify-safe@~5.0.1:
json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
@ -2589,6 +2790,10 @@ jsonify@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
jsonparse@^1.2.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8"
jsonpointer@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
@ -2824,7 +3029,7 @@ lodash._reevaluate@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed"
lodash._reinterpolate@^3.0.0:
lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@ -2904,6 +3109,13 @@ lodash.template@^3.0.0:
lodash.restparam "^3.0.0"
lodash.templatesettings "^3.0.0"
lodash.template@^4.0.2:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
dependencies:
lodash._reinterpolate "~3.0.0"
lodash.templatesettings "^4.0.0"
lodash.templatesettings@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5"
@ -2911,6 +3123,12 @@ lodash.templatesettings@^3.0.0:
lodash._reinterpolate "^3.0.0"
lodash.escape "^3.0.0"
lodash.templatesettings@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
dependencies:
lodash._reinterpolate "~3.0.0"
lodash.uniq@^4.3.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@ -2919,7 +3137,7 @@ lodash@^3.8.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.5.0:
lodash@^4.0.0, lodash@^4.0.1, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.5.0:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
@ -3081,7 +3299,7 @@ minimalistic-assert@^1.0.0:
dependencies:
brace-expansion "^1.0.0"
minimist@0.0.8:
minimist@0.0.8, minimist@~0.0.1:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
@ -3089,10 +3307,6 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
minimist@~0.0.1:
version "0.0.10"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
mixin-object@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
@ -3112,6 +3326,10 @@ mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd
dependencies:
minimist "0.0.8"
modify-values@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2"
ms@0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
@ -3235,7 +3453,7 @@ node-status-codes@^1.0.0:
dependencies:
abbrev "1"
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5:
version "2.3.5"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df"
dependencies:
@ -3430,6 +3648,10 @@ parse-asn1@^5.0.0:
evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3"
parse-github-repo-url@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.0.tgz#286c53e2c9962e0641649ee3ac9508fca4dd959c"
parse-glob@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
@ -3979,7 +4201,7 @@ read-pkg-up@^1.0.1:
find-up "^1.0.0"
read-pkg "^1.0.0"
read-pkg@^1.0.0:
read-pkg@^1.0.0, read-pkg@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
dependencies:
@ -3987,7 +4209,7 @@ read-pkg@^1.0.0:
normalize-package-data "^2.3.2"
path-type "^1.0.0"
readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0:
readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.1.5:
version "2.2.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e"
dependencies:
@ -4221,15 +4443,15 @@ right-align@^0.1.1:
dependencies:
align-text "^0.1.1"
rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@~2.5.1, rimraf@~2.5.4:
version "2.5.4"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.0.tgz#89b8a0fe432b9ff9ec9a925a00b6cdb3a91bbada"
dependencies:
glob "^7.0.5"
rimraf@^2.2.8, rimraf@^2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.0.tgz#89b8a0fe432b9ff9ec9a925a00b6cdb3a91bbada"
rimraf@~2.5.1, rimraf@~2.5.4:
version "2.5.4"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
dependencies:
glob "^7.0.5"
@ -4326,7 +4548,7 @@ semver-dsl@^1.0.1:
dependencies:
semver "^5.3.0"
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0:
"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@ -4627,6 +4849,18 @@ spdy@^3.4.1:
select-hose "^2.0.0"
spdy-transport "^2.0.15"
split2@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0"
dependencies:
through2 "^2.0.2"
split@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae"
dependencies:
through "2"
sprintf-js@^1.0.3, sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
@ -4797,6 +5031,17 @@ tar@^2.0.0, tar@~2.2.1:
fstream "^1.0.2"
inherits "2"
tempfile@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2"
dependencies:
os-tmpdir "^1.0.0"
uuid "^2.0.1"
text-extensions@^1.0.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.4.0.tgz#c385d2e80879fe6ef97893e1709d88d9453726e9"
throttleit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
@ -4808,7 +5053,14 @@ through2@2.0.1, through2@^2.0.0:
readable-stream "~2.0.0"
xtend "~4.0.0"
through@X.X.X:
through2@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
dependencies:
readable-stream "^2.1.5"
xtend "~4.0.1"
through@2, "through@>=2.2.7 <3", through@X.X.X:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@ -4868,6 +5120,10 @@ trim-newlines@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
trim-off-newlines@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
ts-helpers@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/ts-helpers/-/ts-helpers-1.1.2.tgz#fc69be9f1f3baed01fb1a0ef8d4cfe748814d835"
@ -5321,20 +5577,13 @@ write-file-atomic@^1.1.2:
imurmurhash "^0.1.4"
slide "^1.1.5"
ws@1.1.2:
ws@1.1.2, ws@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f"
dependencies:
options ">=0.0.5"
ultron "1.0.x"
ws@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018"
dependencies:
options ">=0.0.5"
ultron "1.0.x"
wtf-8@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
@ -5369,7 +5618,7 @@ xmlhttprequest-ssl@1.5.3:
version "1.5.3"
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
xtend@^4.0.0, xtend@~4.0.0:
xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"