Merge commit '0fc80429ac73139ab3e15c91345d5ea3db59c40c' into releases

This commit is contained in:
RedocBot 2016-10-14 09:53:23 +00:00 committed by travis@localhost
commit 8b89bef664
9 changed files with 120 additions and 55 deletions

View File

@ -32,7 +32,7 @@ before_script:
after_script: after_script:
- kill %1 # kill e2e server - kill %1 # kill e2e server
before_deploy: before_deploy:
- npm run build-dist - npm run build:prod-module
deploy: deploy:
- provider: npm - provider: npm
skip_cleanup: true skip_cleanup: true

View File

@ -10,7 +10,9 @@ const BANNER =
Version: ${VERSION} Version: ${VERSION}
Repo: https://github.com/Rebilly/ReDoc`; Repo: https://github.com/Rebilly/ReDoc`;
module.exports = { const IS_MODULE = process.env.IS_MODULE != null;
const config = {
context: root(), context: root(),
devtool: 'source-map', devtool: 'source-map',
@ -35,13 +37,13 @@ module.exports = {
setImmediate: false setImmediate: false
}, },
entry: { entry: {
'redoc': ['./lib/polyfills.ts', './lib/vendor.ts', './lib/index.ts'] 'redoc': IS_MODULE ? ['./lib/vendor.ts', './lib/redoc.module.ts'] : ['./lib/polyfills.ts', './lib/vendor.ts', './lib/index.ts']
}, },
output: { output: {
path: root('dist'), path: root('dist'),
filename: '[name].min.js', filename: IS_MODULE ? '[name]-module.js' : '[name].min.js',
sourceMapFilename: '[name].min.map', sourceMapFilename: IS_MODULE ? '[name]-module.map' : '[name].min.map',
library: 'Redoc', library: 'Redoc',
libraryTarget: 'umd', libraryTarget: 'umd',
umdNamedDefine: true umdNamedDefine: true
@ -60,9 +62,14 @@ module.exports = {
test: /\.ts$/, test: /\.ts$/,
loader: 'awesome-typescript-loader', loader: 'awesome-typescript-loader',
exclude: /(node_modules)/ exclude: /(node_modules)/
}, {
test: /lib[\\\/].*\.css$/,
loaders: ['raw-loader'],
exclude: [/redoc-initial-styles\.css$/]
}, { }, {
test: /\.css$/, test: /\.css$/,
loaders: ['style', 'css?-import'] loaders: ['style', 'css?-import'],
exclude: [/lib[\\\/](?!.*redoc-initial-styles).*\.css$/]
}] }]
}, },
@ -90,3 +97,31 @@ module.exports = {
}) })
], ],
} }
if (IS_MODULE) {
config.externals = {
'jquery': 'jQuery',
'esprima': 'esprima', // optional dep of ys-yaml not needed for redoc
'@angular/platform-browser-dynamic': '@angular/platform-browser-dynamic',
'@angular/platform-browser': '@angular/platform-browser',
'@angular/core': '@angular/core',
'@angular/common': '@angular/common',
'@angular/forms': '@angular/forms',
'core-js': 'core-js',
'rxjs': 'rxjs',
'zone.js/dist/zone': 'zone.js/dist/zone'
};
config.module.rules.push({
test: /\.ts$/,
loader: 'angular2-template-loader',
exclude: [/\.(spec|e2e)\.ts$/]
});
config.module.rules.push({
test: /\.html$/,
loader: 'raw-loader'
});
}
module.exports = config;

View File

@ -1,4 +1,4 @@
<div class="redoc-wrap"> <div class="redoc-wrap" *ngIf="specLoaded">
<div class="menu-content" sticky-sidebar [scrollParent]="options.$scrollParent" [scrollYOffset]="options.scrollYOffset"> <div class="menu-content" sticky-sidebar [scrollParent]="options.$scrollParent" [scrollYOffset]="options.scrollYOffset">
<api-logo> </api-logo> <api-logo> </api-logo>
<side-menu> </side-menu> <side-menu> </side-menu>

View File

@ -1,6 +1,7 @@
'use strict'; 'use strict';
import { ElementRef, ComponentRef, AfterViewInit, Component, ChangeDetectionStrategy} from '@angular/core'; import { ElementRef, ComponentRef, ChangeDetectorRef, Input,
Component, OnInit, ChangeDetectionStrategy} from '@angular/core';
import { BrowserDomAdapter as DOM } from '../../utils/browser-adapter'; import { BrowserDomAdapter as DOM } from '../../utils/browser-adapter';
import { BaseComponent } from '../base'; import { BaseComponent } from '../base';
@ -16,31 +17,32 @@ import { OptionsService, RedocEventsService } from '../../services/index';
styleUrls: ['./redoc.css'], styleUrls: ['./redoc.css'],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class Redoc extends BaseComponent implements AfterViewInit { export class Redoc extends BaseComponent implements OnInit {
static appRef: ComponentRef<any>; static appRef: ComponentRef<any>;
static _preOptions: any; static _preOptions: any;
specLoaded: boolean;
public options: any; public options: any;
private element: any; private element: any;
static showLoadingAnimation() { @Input() specUrl: string;
let elem = DOM.query('redoc');
DOM.addClass(elem, 'loading'); // TODO: refactor in separate component/service
showLoadingAnimation() {
DOM.addClass(this.element, 'loading');
} }
static hideLoadingAnimation() { hideLoadingAnimation() {
let redocEl = DOM.query('redoc'); DOM.addClass(this.element, 'loading-remove');
if (!redocEl) return;
DOM.addClass(redocEl, 'loading-remove');
setTimeout(() => { setTimeout(() => {
DOM.removeClass(redocEl, 'loading-remove'); DOM.removeClass(this.element, 'loading-remove');
DOM.removeClass(redocEl, 'loading'); DOM.removeClass(this.element, 'loading');
}, 400); }, 400);
} }
static displayError(err) { static displayError(err, elem?) {
let redocEl = DOM.query('redoc'); let redocEl = elem || DOM.query('redoc');
if (!redocEl) return; if (!redocEl) return;
let heading = 'Oops... ReDoc failed to render this spec'; let heading = 'Oops... ReDoc failed to render this spec';
let details = err.message; let details = err.message;
@ -51,10 +53,10 @@ export class Redoc extends BaseComponent implements AfterViewInit {
} }
constructor(specMgr: SpecManager, optionsMgr:OptionsService, elementRef:ElementRef, constructor(specMgr: SpecManager, optionsMgr:OptionsService, elementRef:ElementRef,
public events:RedocEventsService) { public events:RedocEventsService, private changeDetector: ChangeDetectorRef) {
super(specMgr); super(specMgr);
// merge options passed before init // merge options passed before init
optionsMgr.options = Redoc._preOptions; optionsMgr.options = Redoc._preOptions || {};
this.element = elementRef.nativeElement; this.element = elementRef.nativeElement;
//parse options (top level component doesn't support inputs) //parse options (top level component doesn't support inputs)
optionsMgr.parseOptions( this.element ); optionsMgr.parseOptions( this.element );
@ -62,12 +64,27 @@ export class Redoc extends BaseComponent implements AfterViewInit {
if (scrollParent === DOM.defaultDoc().body) scrollParent = window; if (scrollParent === DOM.defaultDoc().body) scrollParent = window;
optionsMgr.options.$scrollParent = scrollParent; optionsMgr.options.$scrollParent = scrollParent;
this.options = optionsMgr.options; this.options = optionsMgr.options;
this.events = events;
} }
ngAfterViewInit() { load() {
setTimeout( () => { this.showLoadingAnimation();
SpecManager.instance().load(this.options.specUrl).then(() => {
this.specLoaded = true;
this.changeDetector.markForCheck();
//this.changeDetector.detectChanges();
this.events.bootstrapped.next({}); this.events.bootstrapped.next({});
}); this.hideLoadingAnimation();
}).catch((err) => {
this.hideLoadingAnimation();
Redoc.displayError(err, this.element);
throw err;
})
}
ngOnInit() {
if (this.specUrl) {
this.options.specUrl = this.specUrl;
}
this.load();
} }
} }

View File

@ -29,18 +29,11 @@ export function init(specUrl:string, options:any = {}) {
Redoc._preOptions = options; Redoc._preOptions = options;
options.specUrl = options.specUrl || specUrl; options.specUrl = options.specUrl || specUrl;
return bootstrapRedoc()
Redoc.showLoadingAnimation();
return SpecManager.instance().load(specUrl)
.then(() => {
return bootstrapRedoc();
})
.then(appRef => { .then(appRef => {
Redoc.hideLoadingAnimation();
moduleRef = appRef; moduleRef = appRef;
console.log('ReDoc initialized!'); console.log('ReDoc initialized!');
}).catch(err => { }).catch(err => {
Redoc.hideLoadingAnimation();
Redoc.displayError(err); Redoc.displayError(err);
throw err; throw err;
}); });
@ -48,6 +41,7 @@ export function init(specUrl:string, options:any = {}) {
export function destroy() { export function destroy() {
moduleRef.destroy(); moduleRef.destroy();
moduleRef = null;
}; };

View File

@ -21,7 +21,10 @@ import { SpecManager } from './utils/SpecManager';
MenuService, MenuService,
WarningsService, WarningsService,
OptionsService OptionsService
] ],
exports: [Redoc]
}) })
export class RedocModule { export class RedocModule {
} }
export { Redoc, SpecManager };

View File

@ -137,16 +137,16 @@ const injectors = {
check: (propertySchema) => (propertySchema.type === 'integer' || propertySchema.type === 'number'), check: (propertySchema) => (propertySchema.type === 'integer' || propertySchema.type === 'number'),
inject: (injectTo, propertySchema = injectTo) => { inject: (injectTo, propertySchema = injectTo) => {
var range = ''; var range = '';
if (propertySchema.minimum && propertySchema.maximum) { if (propertySchema.minimum != undefined && propertySchema.maximum != undefined) {
range += propertySchema.exclusiveMinimum ? '( ' : '[ '; range += propertySchema.exclusiveMinimum ? '( ' : '[ ';
range += propertySchema.minimum; range += propertySchema.minimum;
range += ' .. '; range += ' .. ';
range += propertySchema.maximum; range += propertySchema.maximum;
range += propertySchema.exclusiveMaximum ? ' )' : ' ]'; range += propertySchema.exclusiveMaximum ? ' )' : ' ]';
} else if (propertySchema.maximum) { } else if (propertySchema.maximum != undefined) {
range += propertySchema.exclusiveMaximum? '< ' : '<= '; range += propertySchema.exclusiveMaximum? '< ' : '<= ';
range += propertySchema.maximum; range += propertySchema.maximum;
} else if (propertySchema.minimum) { } else if (propertySchema.minimum != undefined) {
range += propertySchema.exclusiveMinimum ? '> ' : '>= '; range += propertySchema.exclusiveMinimum ? '> ' : '>= ';
range += propertySchema.minimum; range += propertySchema.minimum;
} }
@ -160,11 +160,11 @@ const injectors = {
check: propertySchema => (propertySchema.type === 'string'), check: propertySchema => (propertySchema.type === 'string'),
inject: (injectTo, propertySchema = injectTo) => { inject: (injectTo, propertySchema = injectTo) => {
var range; var range;
if (propertySchema.minLength && propertySchema.maxLength) { if (propertySchema.minLength != undefined && propertySchema.maxLength != undefined) {
range = `[ ${propertySchema.minLength} .. ${propertySchema.maxLength} ]`; range = `[ ${propertySchema.minLength} .. ${propertySchema.maxLength} ]`;
} else if (propertySchema.maxLength) { } else if (propertySchema.maxLength != undefined) {
range = '<= ' + propertySchema.maxLength; range = '<= ' + propertySchema.maxLength;
} else if (propertySchema.minLength) { } else if (propertySchema.minLength != undefined) {
range = '>= ' + propertySchema.minLength; range = '>= ' + propertySchema.minLength;
} }

View File

@ -30,10 +30,14 @@ export class SpecManager {
JsonSchemaRefParser.bundle(url, {http: {withCredentials: false}}) JsonSchemaRefParser.bundle(url, {http: {withCredentials: false}})
.then(schema => { .then(schema => {
try {
this._url = url; this._url = url;
this._schema = schema; this._schema = schema;
this.init(); this.init();
return resolve(this._schema); resolve(this._schema);
} catch(err) {
reject(err);
}
}, err => reject(err)); }, err => reject(err));
}); });

View File

@ -1,7 +1,7 @@
{ {
"name": "redoc", "name": "redoc",
"description": "Swagger-generated API Reference Documentation", "description": "Swagger-generated API Reference Documentation",
"version": "1.3.3", "version": "1.4.0",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/Rebilly/ReDoc" "url": "git://github.com/Rebilly/ReDoc"
@ -22,6 +22,7 @@
"webpack:prod": "webpack --config build/webpack.prod.js --profile --bail", "webpack:prod": "webpack --config build/webpack.prod.js --profile --bail",
"build:sass": "node-sass -q -o lib lib", "build:sass": "node-sass -q -o lib lib",
"build:prod": "npm run build:sass && npm run ngc && npm run webpack:prod", "build:prod": "npm run build:sass && npm run ngc && npm run webpack:prod",
"build:prod-module": "npm run build:sass && npm run ngc && npm run webpack:prod && IS_MODULE=true npm run webpack:prod",
"build-dist": "npm run build:prod", "build-dist": "npm run build:prod",
"stats": "webpack --config build/webpack.prod.js --json > stats.json", "stats": "webpack --config build/webpack.prod.js --json > stats.json",
"start": "webpack-dev-server --config build/webpack.dev.js --content-base demo", "start": "webpack-dev-server --config build/webpack.dev.js --content-base demo",
@ -44,7 +45,13 @@
"author": "Roman Hotsiy", "author": "Roman Hotsiy",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@angular/compiler-cli": "^0.6.3", "@angular/common": "^2.1.0",
"@angular/compiler": "^2.1.0",
"@angular/compiler-cli": "^2.1.0",
"@angular/core": "^2.1.0",
"@angular/platform-browser": "^2.1.0",
"@angular/platform-browser-dynamic": "^2.1.0",
"@angular/platform-server": "^2.1.0",
"@types/core-js": "^0.9.31", "@types/core-js": "^0.9.31",
"@types/jasmine": "^2.2.32", "@types/jasmine": "^2.2.32",
"@types/requirejs": "^2.1.26", "@types/requirejs": "^2.1.26",
@ -53,8 +60,9 @@
"awesome-typescript-loader": "^2.2.1", "awesome-typescript-loader": "^2.2.1",
"branch-release": "^1.0.3", "branch-release": "^1.0.3",
"chalk": "^1.1.3", "chalk": "^1.1.3",
"codelyzer": "^1.0.0-beta.0", "codelyzer": "^1.0.0-beta.2",
"copy-webpack-plugin": "^3.0.1", "copy-webpack-plugin": "^3.0.1",
"core-js": "^2.4.1",
"coveralls": "^2.11.9", "coveralls": "^2.11.9",
"css-loader": "^0.24.0", "css-loader": "^0.24.0",
"deploy-to-gh-pages": "^1.1.2", "deploy-to-gh-pages": "^1.1.2",
@ -78,6 +86,7 @@
"phantomjs-prebuilt": "^2.1.7", "phantomjs-prebuilt": "^2.1.7",
"protractor": "^4.0.4", "protractor": "^4.0.4",
"raw-loader": "^0.5.1", "raw-loader": "^0.5.1",
"rxjs": "^5.0.0-beta.12",
"shelljs": "^0.7.0", "shelljs": "^0.7.0",
"should": "^11.1.0", "should": "^11.1.0",
"sinon": "^1.17.2", "sinon": "^1.17.2",
@ -88,16 +97,10 @@
"tslint-stylish": "^2.1.0-beta", "tslint-stylish": "^2.1.0-beta",
"typescript": "^2.0.3", "typescript": "^2.0.3",
"webpack": "^2.1.0-beta.25", "webpack": "^2.1.0-beta.25",
"webpack-dev-server": "^2.1.0-beta.6" "webpack-dev-server": "^2.1.0-beta.6",
"zone.js": "^0.6.25"
}, },
"dependencies": { "dependencies": {
"@angular/common": "^2.0.1",
"@angular/compiler": "^2.0.1",
"@angular/core": "^2.0.1",
"@angular/platform-browser": "^2.0.1",
"@angular/platform-browser-dynamic": "^2.0.1",
"@angular/platform-server": "^2.0.1",
"core-js": "^2.4.1",
"dropkickjs": "^2.1.10", "dropkickjs": "^2.1.10",
"hint.css": "^2.3.2", "hint.css": "^2.3.2",
"json-pointer": "^0.5.0", "json-pointer": "^0.5.0",
@ -105,10 +108,19 @@
"openapi-sampler": "^0.3.1", "openapi-sampler": "^0.3.1",
"prismjs": "^1.5.1", "prismjs": "^1.5.1",
"remarkable": "^1.6.2", "remarkable": "^1.6.2",
"rxjs": "^5.0.0-beta.12",
"scrollparent": "^1.0.0", "scrollparent": "^1.0.0",
"slugify": "^1.0.2", "slugify": "^1.0.2",
"stream-http": "^2.3.1", "stream-http": "^2.3.1"
},
"peerDependencies": {
"@angular/common": "^2.1.0",
"@angular/compiler": "^2.1.0",
"@angular/core": "^2.1.0",
"@angular/platform-browser": "^2.1.0",
"@angular/platform-browser-dynamic": "^2.1.0",
"@angular/platform-server": "^2.1.0",
"core-js": "^2.4.1",
"rxjs": "5.0.0-beta.12",
"zone.js": "^0.6.25" "zone.js": "^0.6.25"
} }
} }