# Conflicts:
#	dist/swagger-ui-bundle.js
#	dist/swagger-ui-bundle.js.map
#	dist/swagger-ui-standalone-preset.js
#	dist/swagger-ui.js
#	dist/swagger-ui.js.map
This commit is contained in:
Buu Nguyen
2017-03-24 10:59:11 -07:00
70 changed files with 348 additions and 551 deletions

37
.eslintrc Normal file
View File

@@ -0,0 +1,37 @@
{
"parser": "babel-eslint",
"env": {
"browser": true,
"node": true,
"es6": true
},
"parserOptions": {
"ecmaFeatures": {
"jsx": true
}
},
"extends": ["eslint:recommended", "plugin:react/recommended"],
"plugins": [
"react"
],
"rules": {
"semi": [2, "never"],
"strict": 0,
"quotes": 2,
"no-unused-vars": 2,
"no-multi-spaces": 1,
"camelcase": 1,
"no-use-before-define": [2,"nofunc"],
"no-underscore-dangle": 0,
"no-unused-expressions": 1,
"comma-dangle": 0,
"no-console": ["error", { allow: ["warn", "error"] }],
"react/jsx-no-bind": 1,
"react/display-name": 0
}
}

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@ node_modules
.deps_check .deps_check
.DS_Store .DS_Store
npm-debug.log npm-debug.log
.eslintcache

View File

@@ -6,6 +6,8 @@
**This is the new version of swagger-ui, 3.x. Want to learn more? Check out our [FAQ](http://swagger.io/new-ui-faq/).** **This is the new version of swagger-ui, 3.x. Want to learn more? Check out our [FAQ](http://swagger.io/new-ui-faq/).**
As a brand new version, written from the ground up, there are some known issues and unimplemented features. Check out the [Known Issues](#known-issues) section for more details.
For the older version of swagger-ui, refer to the [*2.x branch*](https://github.com/swagger-api/swagger-ui/tree/2.x). For the older version of swagger-ui, refer to the [*2.x branch*](https://github.com/swagger-api/swagger-ui/tree/2.x).
## Compatibility ## Compatibility
@@ -41,10 +43,21 @@ If you just want to see your specs, open `public/index.html` in your browser dir
If you'd like to make modifications to the codebase, run the dev server with: `npm run dev`. If you'd like to make modifications to the codebase, run the dev server with: `npm run dev`.
##### Browser support ##### Browser support
Swagger UI works in the latest versions of Chrome, Safari, Firefox, Edge and IE11. Swagger UI works in the latest versions of Chrome, Safari, Firefox, Edge and IE11.
### Known Issues
To help with the migration, here are the currently known issues with 3.X. This list will update regularly, and will not include features that were not implemented in previous versions.
- Currently, the only configuration options available are the `url` and `spec`.
- The JSON Form Editor is not implemented.
- Shebang URL support for operations is missing.
- Support for `collectionFormat` is partial.
- l10n (translations) is not implemented.
- Relative path support for external files is not implemented.
## CORS Support ## CORS Support
CORS is a technique to prevent websites from doing bad things with your personal data. Most browsers + JavaScript toolkits not only support CORS but enforce it, which has implications for your API server which supports Swagger. CORS is a technique to prevent websites from doing bad things with your personal data. Most browsers + JavaScript toolkits not only support CORS but enforce it, which has implications for your API server which supports Swagger.

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAoOA;;;;;;AAoIA;AAm7FA;AAwtCA;AAg0IA;;;;;AAkxBA;AA+7IA;AAi2GA;AA43FA;AA6oFA;AAipFA;AA+9CA;AA0gDA;AA0rCA;AA80EA;AAs4HA;;;;;;;;;;;;;;AA8kHA;AAyoIA;AAkuJA;AAilHA;AA4kGA;AAwkEA;AAs3DA;AAs2EA;AA0gGA;AAurGA;;;;;;AA4fA;AAimGA;AA44EA;;;;;AAoGA;AA2qFA;AAq2CA;AAmvDA;AAwtCA;AAuiEA;AA29FA;;;;;;;;;AA00BA;AA2zIA;AAk4DA","sourceRoot":""} {"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAoOA;;;;;;AAoIA;AAs7FA;AAotCA;;;;;AAquIA;AA47IA;AA+1GA;AAu4FA;AA+hFA;AA2rFA;AAg9CA;AA2hDA;AA4rCA;AA4kFA;AA4sHA;;;;;;;;;;;;;;AAs9GA;AAyoIA;AAkuJA;AAilHA;AAinGA;AAwkEA;AAi3DA;AA0wDA;AAsrBA;AAksGA;;;;;;AA4fA;AAimGA;AAy4EA;;;;;AAkGA;AA2qFA;AAk2CA;AAihCA;AAqmDA;AAwuEA;AAujGA;;;;;;;;;AAqoBA;AAyzIA;AAw4DA","sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"version":3,"file":"swagger-ui-standalone-preset.js","sources":["webpack:///swagger-ui-standalone-preset.js"],"mappings":"AAAA;;;;;AAwSA;AAyiGA","sourceRoot":""} {"version":3,"file":"swagger-ui-standalone-preset.js","sources":["webpack:///swagger-ui-standalone-preset.js"],"mappings":"AAAA;;;;;AAqTA;AAyiGA","sourceRoot":""}

16
dist/swagger-ui.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;AAqnGA;AAi2HA;AA6+FA;AAkqCA;AAi+BA;AAyvCA;AA04BA","sourceRoot":""} {"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;AAsoGA;AAy4HA;AA67FA;AA2mCA;AAq+BA;AAsiCA;AAm5BA","sourceRoot":""}

View File

@@ -26,9 +26,16 @@
"deps-license": "license-checker --production --csv --out $npm_package_config_deps_check_dir/licenses.csv && license-checker --development --csv --out $npm_package_config_deps_check_dir/licenses-dev.csv", "deps-license": "license-checker --production --csv --out $npm_package_config_deps_check_dir/licenses.csv && license-checker --development --csv --out $npm_package_config_deps_check_dir/licenses-dev.csv",
"deps-size": "webpack -p --config webpack.check.js --json | webpack-bundle-size-analyzer >| $npm_package_config_deps_check_dir/sizes.txt", "deps-size": "webpack -p --config webpack.check.js --json | webpack-bundle-size-analyzer >| $npm_package_config_deps_check_dir/sizes.txt",
"deps-check": "npm run deps-license && npm run deps-size", "deps-check": "npm run deps-license && npm run deps-size",
"just-test-in-node": "mocha --recursive --compilers js:babel-core/register test/core" "lint": "eslint --cache --ext '.js,.jsx' src test",
"lint-errors": "eslint --cache --quiet --ext '.js,.jsx' src test",
"lint-fix": "eslint --cache --ext '.js,.jsx' src test --fix",
"test": "npm run lint-errors && npm run just-test-in-node",
"test-in-node": "npm run lint-errors && npm run just-test-in-node",
"just-test": "karma start --config karma.conf.js",
"just-test-in-node": "mocha --recursive --compilers js:babel-core/register test/core test/components"
}, },
"dependencies": { "dependencies": {
"babel-polyfill": "^6.23.0",
"brace": "0.7.0", "brace": "0.7.0",
"btoa": "^1.1.2", "btoa": "^1.1.2",
"debounce": "1.0.0", "debounce": "1.0.0",
@@ -46,7 +53,7 @@
"react": "^15.4.0", "react": "^15.4.0",
"react-addons-perf": "0.14.8", "react-addons-perf": "0.14.8",
"react-addons-shallow-compare": "0.14.8", "react-addons-shallow-compare": "0.14.8",
"react-addons-test-utils": "0.14.8", "react-addons-test-utils": "^15.4.0",
"react-collapse": "2.3.1", "react-collapse": "2.3.1",
"react-dom": "^15.4.0", "react-dom": "^15.4.0",
"react-height": "^2.0.0", "react-height": "^2.0.0",
@@ -84,11 +91,19 @@
"css-loader": "0.22.0", "css-loader": "0.22.0",
"deep-extend": "^0.4.1", "deep-extend": "^0.4.1",
"deepmerge": "^1.3.2", "deepmerge": "^1.3.2",
"enzyme": "^2.7.1",
"eslint": "^2.13.1",
"eslint-plugin-react": "^6.10.3",
"extract-text-webpack-plugin": "0.8.2", "extract-text-webpack-plugin": "0.8.2",
"file-loader": "0.8.4", "file-loader": "0.8.4",
"html-webpack-plugin": "^2.28.0", "html-webpack-plugin": "^2.28.0",
"imports-loader": "0.6.5", "imports-loader": "0.6.5",
"json-loader": "0.5.3", "json-loader": "0.5.3",
"karma": "^0.13.22",
"karma-chrome-launcher": "^0.2.3",
"karma-mocha": "^0.2.2",
"karma-sourcemap-loader": "^0.3.7",
"karma-webpack": "1.8.0",
"less": "2.5.3", "less": "2.5.3",
"less-loader": "2.2.1", "less-loader": "2.2.1",
"license-checker": "^8.0.4", "license-checker": "^8.0.4",

View File

@@ -6,7 +6,7 @@ export default class AuthorizeBtn extends React.Component {
} }
onClick =() => { onClick =() => {
let { authActions, authSelectors, errActions} = this.props let { authActions, authSelectors } = this.props
let definitions = authSelectors.definitionsToAuthorize() let definitions = authSelectors.definitionsToAuthorize()
authActions.showDefinitions(definitions) authActions.showDefinitions(definitions)

View File

@@ -42,14 +42,12 @@ export default class Auths extends React.Component {
} }
render() { render() {
let { definitions, getComponent, authSelectors, errSelectors, specSelectors } = this.props let { definitions, getComponent, authSelectors, errSelectors } = this.props
const ApiKeyAuth = getComponent("apiKeyAuth") const ApiKeyAuth = getComponent("apiKeyAuth")
const BasicAuth = getComponent("basicAuth") const BasicAuth = getComponent("basicAuth")
const Oauth2 = getComponent("oauth2", true) const Oauth2 = getComponent("oauth2", true)
const Button = getComponent("Button") const Button = getComponent("Button")
const JumpToPath = getComponent("JumpToPath", true)
let specStr = specSelectors.specStr()
let authorized = authSelectors.authorized() let authorized = authSelectors.authorized()
let authorizedAuth = definitions.filter( (definition, key) => { let authorizedAuth = definitions.filter( (definition, key) => {

View File

@@ -16,7 +16,8 @@ export default class Oauth2 extends React.Component {
authSelectors: PropTypes.object.isRequired, authSelectors: PropTypes.object.isRequired,
authActions: PropTypes.object.isRequired, authActions: PropTypes.object.isRequired,
errSelectors: PropTypes.object.isRequired, errSelectors: PropTypes.object.isRequired,
errActions: PropTypes.object.isRequired errActions: PropTypes.object.isRequired,
getConfigs: PropTypes.function
} }
constructor(props, context) { constructor(props, context) {

View File

@@ -1,6 +1,6 @@
import React, { PropTypes } from "react" import React, { PropTypes } from "react"
import ImPropTypes from "react-immutable-proptypes" import ImPropTypes from "react-immutable-proptypes"
import { fromJS } from 'immutable' import { fromJS } from "immutable"
const noop = ()=>{} const noop = ()=>{}

View File

@@ -1,7 +1,6 @@
import React, { PropTypes } from "react" import React, { PropTypes } from "react"
import Im, { List } from "immutable" import { List } from "immutable"
import Collapse from "react-collapse" import Collapse from "react-collapse"
import sortBy from "lodash/sortBy"
export default class Errors extends React.Component { export default class Errors extends React.Component {

View File

@@ -1,5 +1,4 @@
import React, { Component, PropTypes } from "react" import React, { Component, PropTypes } from "react"
import { fromJS } from "immutable"
export default class Execute extends Component { export default class Execute extends Component {
@@ -29,9 +28,6 @@ export default class Execute extends Component {
onChangeProducesWrapper = ( val ) => this.props.specActions.changeProducesValue([this.props.path, this.props.method], val) onChangeProducesWrapper = ( val ) => this.props.specActions.changeProducesValue([this.props.path, this.props.method], val)
render(){ render(){
let { getComponent, operation, specActions, path, method } = this.props
const ContentType = getComponent( "contentType" )
return ( return (
<button className="btn execute opblock-control__btn" onClick={ this.onClick }> <button className="btn execute opblock-control__btn" onClick={ this.onClick }>
Execute Execute

View File

@@ -2,8 +2,6 @@ import React, { PropTypes } from "react"
import OriCollapse from "react-collapse" import OriCollapse from "react-collapse"
import _Markdown from "react-remarkable" import _Markdown from "react-remarkable"
const noop = () => {}
function xclass(...args) { function xclass(...args) {
return args.filter(a => !!a).join(" ").trim() return args.filter(a => !!a).join(" ").trim()
} }
@@ -44,12 +42,14 @@ export class Col extends React.Component {
const { const {
hide, hide,
keepContents, keepContents,
/* we don't want these in the `rest` object that passes to the final component,
mobile, /* we don't want these in the final component, since React now complains. So we extract them */ since React now complains. So we extract them */
/* eslint-disable no-unused-vars */
mobile,
tablet, tablet,
desktop, desktop,
large, large,
/* eslint-enable no-unused-vars */
...rest ...rest
} = this.props } = this.props

View File

@@ -1,6 +1,5 @@
import React, { Component, PropTypes } from "react" import React, { Component, PropTypes } from "react"
import ImPropTypes from "react-immutable-proptypes" import ImPropTypes from "react-immutable-proptypes"
import isObject from "lodash/isObject"
import { List } from "immutable" import { List } from "immutable"
const braceOpen = "{" const braceOpen = "{"
const braceClose = "}" const braceClose = "}"
@@ -128,7 +127,6 @@ class Primitive extends Component {
let format = schema.get("format") let format = schema.get("format")
let xml = schema.get("xml") let xml = schema.get("xml")
let enumArray = schema.get("enum") let enumArray = schema.get("enum")
let description = schema.get("description")
let properties = schema.filter( ( v, key) => ["enum", "type", "format", "$$ref"].indexOf(key) === -1 ) let properties = schema.filter( ( v, key) => ["enum", "type", "format", "$$ref"].indexOf(key) === -1 )
let style = required ? { fontWeight: "bold" } : {} let style = required ? { fontWeight: "bold" } : {}
let propStyle = { color: "#999", fontStyle: "italic" } let propStyle = { color: "#999", fontStyle: "italic" }
@@ -251,9 +249,6 @@ export default class ModelComponent extends Component {
} }
render(){ render(){
let { name, schema } = this.props
let title = schema.get("title") || name
return <div className="model-box"> return <div className="model-box">
<Model { ...this.props } depth={ 1 } expandDepth={ this.props.expandDepth || 0 }/> <Model { ...this.props } depth={ 1 } expandDepth={ this.props.expandDepth || 0 }/>
</div> </div>

View File

@@ -4,13 +4,15 @@ import React, { Component, PropTypes } from "react"
export default class Models extends Component { export default class Models extends Component {
static propTypes = { static propTypes = {
getComponent: PropTypes.func, getComponent: PropTypes.func,
specSelectors: PropTypes.object specSelectors: PropTypes.object,
layoutSelectors: PropTypes.object,
layoutActions: PropTypes.object
} }
render(){ render(){
let { specSelectors, getComponent, layoutSelectors, layoutActions } = this.props let { specSelectors, getComponent, layoutSelectors, layoutActions } = this.props
let definitions = specSelectors.definitions() let definitions = specSelectors.definitions()
let showModels = layoutSelectors.isShown('models', true) let showModels = layoutSelectors.isShown("models", true)
const Model = getComponent("model") const Model = getComponent("model")
const Collapse = getComponent("Collapse") const Collapse = getComponent("Collapse")
@@ -18,7 +20,7 @@ export default class Models extends Component {
if (!definitions.size) return null if (!definitions.size) return null
return <section className={ showModels ? "models is-open" : "models"}> return <section className={ showModels ? "models is-open" : "models"}>
<h4 onClick={() => layoutActions.show('models', !showModels)}> <h4 onClick={() => layoutActions.show("models", !showModels)}>
<span>Models</span> <span>Models</span>
<svg width="20" height="20"> <svg width="20" height="20">
<use xlinkHref="#large-arrow" /> <use xlinkHref="#large-arrow" />

View File

@@ -1,6 +1,12 @@
import React from "react" import React, { PropTypes } from "react"
export default class OnlineValidatorBadge extends React.Component { export default class OnlineValidatorBadge extends React.Component {
static propTypes = {
getComponent: PropTypes.func.isRequired,
getConfigs: PropTypes.func.isRequired,
specSelectors: PropTypes.object.isRequired
}
constructor(props, context) { constructor(props, context) {
super(props, context) super(props, context)
let { specSelectors, getConfigs } = props let { specSelectors, getConfigs } = props

View File

@@ -1,5 +1,4 @@
import React, { PropTypes } from "react" import React, { PropTypes } from "react"
import { Map, fromJS } from "immutable"
import shallowCompare from "react-addons-shallow-compare" import shallowCompare from "react-addons-shallow-compare"
import { getList } from "core/utils" import { getList } from "core/utils"
import * as CustomPropTypes from "core/proptypes" import * as CustomPropTypes from "core/proptypes"
@@ -112,9 +111,7 @@ export default class Operation extends React.Component {
specActions, specActions,
specSelectors, specSelectors,
authActions, authActions,
authSelectors, authSelectors
layoutSelectors,
layoutActions,
} = this.props } = this.props
let summary = operation.get("summary") let summary = operation.get("summary")

View File

@@ -1,5 +1,4 @@
import React, { PropTypes } from "react" import React, { PropTypes } from "react"
import {presets} from "react-motion"
export default class Operations extends React.Component { export default class Operations extends React.Component {
@@ -33,7 +32,6 @@ export default class Operations extends React.Component {
const Operation = getComponent("operation") const Operation = getComponent("operation")
const Collapse = getComponent("Collapse") const Collapse = getComponent("Collapse")
const Schemes = getComponent("schemes")
let showSummary = layoutSelectors.showSummary() let showSummary = layoutSelectors.showSummary()

View File

@@ -30,7 +30,6 @@ export default class Overview extends React.Component {
{ {
taggedOps.map( (tagObj, tag) => { taggedOps.map( (tagObj, tag) => {
let operations = tagObj.get("operations") let operations = tagObj.get("operations")
let tagDetails = tagObj.get("tagDetails")
let showTagId = ["overview-tags", tag] let showTagId = ["overview-tags", tag]
let showTag = layoutSelectors.isShown(showTagId, true) let showTag = layoutSelectors.isShown(showTagId, true)
@@ -45,7 +44,7 @@ export default class Overview extends React.Component {
<Collapse isOpened={showTag} animated> <Collapse isOpened={showTag} animated>
{ {
operations.map( op => { operations.map( op => {
let { path, method, operation, id } = op.toObject() // toObject is shallow let { path, method, id } = op.toObject() // toObject is shallow
let showOpIdPrefix = "operations" let showOpIdPrefix = "operations"
let showOpId = id let showOpId = id
let shown = layoutSelectors.isShown([showOpIdPrefix, showOpId]) let shown = layoutSelectors.isShown([showOpIdPrefix, showOpId])

View File

@@ -1,6 +1,6 @@
import React, { Component, PropTypes } from "react" import React, { Component, PropTypes } from "react"
import shallowCompare from "react-addons-shallow-compare" import shallowCompare from "react-addons-shallow-compare"
import { Set, fromJS, List } from "immutable" import { fromJS, List } from "immutable"
import { getSampleSchema } from "core/utils" import { getSampleSchema } from "core/utils"
const NOOP = Function.prototype const NOOP = Function.prototype
@@ -50,7 +50,7 @@ export default class ParamBody extends Component {
} }
updateValues = (props) => { updateValues = (props) => {
let { specSelectors, pathMethod, param, isExecute, consumesValue="", onChangeConsumes } = props let { specSelectors, pathMethod, param, isExecute, consumesValue="" } = props
let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name")) : {} let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name")) : {}
let isXml = /xml/i.test(consumesValue) let isXml = /xml/i.test(consumesValue)
let paramValue = isXml ? parameter.get("value_xml") : parameter.get("value") let paramValue = isXml ? parameter.get("value_xml") : parameter.get("value")

View File

@@ -1,6 +1,6 @@
import React, { Component, PropTypes } from "react" import React, { Component, PropTypes } from "react"
import ImPropTypes from "react-immutable-proptypes" import ImPropTypes from "react-immutable-proptypes"
import Im, { fromJS } from "immutable" import Im from "immutable"
// More readable, just iterate over maps, only // More readable, just iterate over maps, only
const eachMap = (iterable, fn) => iterable.valueSeq().filter(Im.Map.isMap).map(fn) const eachMap = (iterable, fn) => iterable.valueSeq().filter(Im.Map.isMap).map(fn)
@@ -87,7 +87,7 @@ export default class Parameters extends Component {
</thead> </thead>
<tbody> <tbody>
{ {
eachMap(parameters, (parameter, k) => ( eachMap(parameters, (parameter) => (
<ParameterRow fn={ fn } <ParameterRow fn={ fn }
getComponent={ getComponent } getComponent={ getComponent }
param={ parameter } param={ parameter }

View File

@@ -1,5 +1,5 @@
import React, { PropTypes } from "react" import React, { PropTypes } from "react"
import { fromJS } from 'immutable' import { fromJS } from "immutable"
import { getSampleSchema } from "core/utils" import { getSampleSchema } from "core/utils"
const getExampleComponent = ( sampleResponse, examples, HighlightCode ) => { const getExampleComponent = ( sampleResponse, examples, HighlightCode ) => {

View File

@@ -17,8 +17,6 @@ export default class Schemes extends React.Component {
} }
onChange =( e ) => { onChange =( e ) => {
let { path, method, specActions } = this.props
this.setScheme( e.target.value ) this.setScheme( e.target.value )
} }

View File

@@ -4,11 +4,13 @@ export default class TryItOutButton extends React.Component {
static propTypes = { static propTypes = {
onTryoutClick: PropTypes.func, onTryoutClick: PropTypes.func,
onCancelClick: PropTypes.func,
enabled: PropTypes.bool, // Try it out is enabled, ie: the user has access to the form enabled: PropTypes.bool, // Try it out is enabled, ie: the user has access to the form
}; };
static defaultProps = { static defaultProps = {
onTryoutClick: Function.prototype, onTryoutClick: Function.prototype,
onCancelClick: Function.prototype,
enabled: false, enabled: false,
}; };

View File

@@ -68,7 +68,7 @@ module.exports = function SwaggerUI(opts) {
var system = store.getSystem() var system = store.getSystem()
let queryConfig = parseSeach() let queryConfig = parseSeach()
const downloadSpec = (configs) => { const downloadSpec = () => {
if(typeof constructorConfig !== "object") { if(typeof constructorConfig !== "object") {
return system return system
} }
@@ -79,7 +79,7 @@ module.exports = function SwaggerUI(opts) {
if(!queryConfig.url && typeof mergedConfig.spec === "object" && Object.keys(mergedConfig.spec).length) { if(!queryConfig.url && typeof mergedConfig.spec === "object" && Object.keys(mergedConfig.spec).length) {
system.specActions.updateUrl("") system.specActions.updateUrl("")
system.specActions.updateLoadingStatus("success"); system.specActions.updateLoadingStatus("success")
system.specActions.updateSpec(JSON.stringify(mergedConfig.spec)) system.specActions.updateSpec(JSON.stringify(mergedConfig.spec))
} else if(system.specActions.download && mergedConfig.url) { } else if(system.specActions.download && mergedConfig.url) {
system.specActions.updateUrl(mergedConfig.url) system.specActions.updateUrl(mergedConfig.url)
@@ -96,7 +96,7 @@ module.exports = function SwaggerUI(opts) {
} }
if (!system.specActions.getConfigByUrl || (system.specActions.getConfigByUrl && !system.specActions.getConfigByUrl(downloadSpec))) { if (!system.specActions.getConfigByUrl || (system.specActions.getConfigByUrl && !system.specActions.getConfigByUrl(downloadSpec))) {
return downloadSpec(constructorConfig) return downloadSpec()
} }
} }

View File

@@ -1,8 +1,6 @@
import React, { PropTypes, Component } from "react" import React, { PropTypes, Component } from "react"
import { arrayify } from "core/utils"
import shallowCompare from "react-addons-shallow-compare" import shallowCompare from "react-addons-shallow-compare"
import { List, fromJS } from "immutable" import { List, fromJS } from "immutable"
import assign from "object-assign"
//import "less/json-schema-form" //import "less/json-schema-form"
const noop = ()=> {} const noop = ()=> {}
@@ -53,7 +51,7 @@ export class JsonSchema_string extends Component {
} }
onEnumChange = (val) => this.props.onChange(val) onEnumChange = (val) => this.props.onChange(val)
render() { render() {
let { getComponent, value, schema, fn, required, description } = this.props let { getComponent, value, schema, required, description } = this.props
let enumValue = schema["enum"] let enumValue = schema["enum"]
let errors = schema.errors || [] let errors = schema.errors || []
@@ -119,13 +117,13 @@ export class JsonSchema_array extends Component {
} }
onEnumChange = (value) => { onEnumChange = (value) => {
this.setState(state => ({ this.setState(() => ({
value: value value: value
}), this.onChange) }), this.onChange)
} }
render() { render() {
let { getComponent, onChange, required, schema, fn } = this.props let { getComponent, required, schema, fn } = this.props
let itemSchema = fn.inferSchema(schema.items) let itemSchema = fn.inferSchema(schema.items)

View File

@@ -26,7 +26,7 @@ export function transformPathToArray(property, jsSpec) {
return a.concat(b) return a.concat(b)
}, []) }, [])
.concat([""]) // add an empty item into the array, so we don't get stuck with something in our buffer below .concat([""]) // add an empty item into the array, so we don't get stuck with something in our buffer below
.reduce((buffer, curr, i, arr) => { .reduce((buffer, curr) => {
let obj = pathArr.length ? get(jsSpec, pathArr) : jsSpec let obj = pathArr.length ? get(jsSpec, pathArr) : jsSpec
if(get(obj, makeAccessArray(buffer, curr))) { if(get(obj, makeAccessArray(buffer, curr))) {

View File

@@ -1,36 +0,0 @@
import React, { PropTypes } from "react"
export default function (system) {
return {
components: {
NoHostWarning,
},
statePlugins: {
spec: {
selectors: {
allowTryItOutFor,
}
}
}
}
}
// This is a quick style. How do we improve this?
const style = {
backgroundColor: "#e7f0f7",
padding: "1rem",
borderRadius: "3px",
}
function NoHostWarning() {
return (
<div style={style}>Note: The interactive forms are disabled, as no `host` property was found in the specification. Please see: <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#swagger-object" target="_blank">OAI 2.0/#swagger-object</a></div>
)
}
// Only allow if, there is a host field
function allowTryItOutFor(state) {
return ({specSelectors}) => {
return specSelectors.hasHost(state)
}
}

View File

@@ -277,8 +277,6 @@ export let getLineNumberForPathAsync = promisifySyncFn(getLineNumberForPath)
function promisifySyncFn(fn) { function promisifySyncFn(fn) {
return function(...args) { return function(...args) {
return new Promise(function(resolve, reject) { return new Promise((resolve) => resolve(fn(...args)))
resolve(fn(...args))
})
} }
} }

View File

@@ -4,7 +4,6 @@ import btoa from "btoa"
import { import {
SHOW_AUTH_POPUP, SHOW_AUTH_POPUP,
AUTHORIZE, AUTHORIZE,
PRE_AUTHORIZE_OAUTH2,
AUTHORIZE_OAUTH2, AUTHORIZE_OAUTH2,
LOGOUT LOGOUT
} from "./actions" } from "./actions"
@@ -21,7 +20,6 @@ export default {
// refactor withMutations // refactor withMutations
securities.entrySeq().forEach( ([ key, security ]) => { securities.entrySeq().forEach( ([ key, security ]) => {
let type = security.getIn(["schema", "type"]) let type = security.getIn(["schema", "type"])
let name = security.get("name")
if ( type === "apiKey" ) { if ( type === "apiKey" ) {
map = map.set(key, security) map = map.set(key, security)

View File

@@ -10,7 +10,7 @@ export const shownDefinitions = createSelector(
export const definitionsToAuthorize = createSelector( export const definitionsToAuthorize = createSelector(
state, state,
auth =>( { specSelectors } ) => { () =>( { specSelectors } ) => {
let definitions = specSelectors.securityDefinitions() let definitions = specSelectors.securityDefinitions()
let list = List() let list = List()
@@ -66,7 +66,6 @@ export const authorized = createSelector(
export const isAuthorized = ( state, securities ) =>( { authSelectors } ) => { export const isAuthorized = ( state, securities ) =>( { authSelectors } ) => {
let authorized = authSelectors.authorized() let authorized = authSelectors.authorized()
let isAuth = false
return !!securities.toJS().filter( ( security ) => { return !!securities.toJS().filter( ( security ) => {
let isAuthorized = true let isAuthorized = true

View File

@@ -1,5 +1,3 @@
import { Map } from "immutable"
// Add security to the final `execute` call ( via `extras` ) // Add security to the final `execute` call ( via `extras` )
export const execute = ( oriAction, { authSelectors, specSelectors }) => ({ path, method, operation, extras }) => { export const execute = ( oriAction, { authSelectors, specSelectors }) => ({ path, method, operation, extras }) => {
let securities = { let securities = {
@@ -10,4 +8,3 @@ export const execute = ( oriAction, { authSelectors, specSelectors }) => ({ path
return oriAction({ path, method, operation, securities, ...extras }) return oriAction({ path, method, operation, securities, ...extras })
} }

View File

@@ -4,7 +4,7 @@ import { createSelector } from "reselect"
import { Map } from "immutable" import { Map } from "immutable"
export default function downloadUrlPlugin (toolbox) { export default function downloadUrlPlugin (toolbox) {
let { fn, Im } = toolbox let { fn } = toolbox
const actions = { const actions = {
download: (url)=> ({ errActions, specSelectors, specActions }) => { download: (url)=> ({ errActions, specSelectors, specActions }) => {

View File

@@ -20,14 +20,14 @@ export function newThrownErrBatch(errors) {
} }
} }
export function newSpecErr(err, action) { export function newSpecErr(err) {
return { return {
type: NEW_SPEC_ERR, type: NEW_SPEC_ERR,
payload: err payload: err
} }
} }
export function newAuthErr(err, action) { export function newAuthErr(err) {
return { return {
type: NEW_AUTH_ERR, type: NEW_AUTH_ERR,
payload: err payload: err

View File

@@ -1,4 +1,3 @@
import concat from "lodash/concat"
import reduce from "lodash/reduce" import reduce from "lodash/reduce"
let request = require.context("./transformers/", true, /\.js$/) let request = require.context("./transformers/", true, /\.js$/)
let errorTransformers = [] let errorTransformers = []

View File

@@ -1,6 +1,5 @@
import get from "lodash/get" import get from "lodash/get"
import last from "lodash/get" import { fromJS } from "immutable"
import { fromJS, List } from "immutable"
export function transform(errors, { jsSpec }) { export function transform(errors, { jsSpec }) {
// LOOK HERE THIS TRANSFORMER IS CURRENTLY DISABLED 😃 // LOOK HERE THIS TRANSFORMER IS CURRENTLY DISABLED 😃

View File

@@ -127,8 +127,12 @@ export const sampleXmlFromSchema = (schema, config={}) => {
if (xml.wrapped) { if (xml.wrapped) {
res[displayName] = [] res[displayName] = []
if (Array.isArray(defaultValue)) { if (Array.isArray(example)) {
example.forEach((v)=>{
items.example = v
res[displayName].push(sampleXmlFromSchema(items, config))
})
} else if (Array.isArray(defaultValue)) {
defaultValue.forEach((v)=>{ defaultValue.forEach((v)=>{
items.default = v items.default = v
res[displayName].push(sampleXmlFromSchema(items, config)) res[displayName].push(sampleXmlFromSchema(items, config))
@@ -145,14 +149,20 @@ export const sampleXmlFromSchema = (schema, config={}) => {
let _res = [] let _res = []
if (Array.isArray(defaultValue)) { if (Array.isArray(example)) {
example.forEach((v)=>{
items.example = v
_res.push(sampleXmlFromSchema(items, config))
})
return _res
} else if (Array.isArray(defaultValue)) {
defaultValue.forEach((v)=>{ defaultValue.forEach((v)=>{
items.default = v items.default = v
_res.push(sampleXmlFromSchema(items, config)) _res.push(sampleXmlFromSchema(items, config))
}) })
return _res return _res
} }
return sampleXmlFromSchema(items, config) return sampleXmlFromSchema(items, config)
} }
} }
@@ -176,7 +186,13 @@ export const sampleXmlFromSchema = (schema, config={}) => {
} else { } else {
props[propName].xml.name = props[propName].xml.name || propName props[propName].xml.name = props[propName].xml.name || propName
props[propName].example = props[propName].example !== undefined ? props[propName].example : example[propName] props[propName].example = props[propName].example !== undefined ? props[propName].example : example[propName]
res[displayName].push(sampleXmlFromSchema(props[propName])) let t = sampleXmlFromSchema(props[propName])
if (Array.isArray(t)) {
res[displayName] = res[displayName].concat(t)
} else {
res[displayName].push(t)
}
} }
} }
} }

View File

@@ -184,7 +184,7 @@ export const logRequest = (req) => {
// Actually fire the request via fn.execute // Actually fire the request via fn.execute
// (For debugging) and ease of testing // (For debugging) and ease of testing
export const executeRequest = (req) => ({fn, specActions, errActions}) => { export const executeRequest = (req) => ({fn, specActions}) => {
let { pathName, method } = req let { pathName, method } = req
let parsedRequest = Object.assign({}, req) let parsedRequest = Object.assign({}, req)
if ( pathName && method ) { if ( pathName && method ) {

View File

@@ -51,7 +51,6 @@ export default {
[VALIDATE_PARAMS]: ( state, { payload: { pathMethod } } ) => { [VALIDATE_PARAMS]: ( state, { payload: { pathMethod } } ) => {
let operation = state.getIn( [ "resolved", "paths", ...pathMethod ] ) let operation = state.getIn( [ "resolved", "paths", ...pathMethod ] )
let parameters = operation.get("parameters")
let isXml = /xml/i.test(operation.get("consumes_value")) let isXml = /xml/i.test(operation.get("consumes_value"))
return state.updateIn( [ "resolved", "paths", ...pathMethod, "parameters" ], fromJS([]), parameters => { return state.updateIn( [ "resolved", "paths", ...pathMethod, "parameters" ], fromJS([]), parameters => {
@@ -64,9 +63,6 @@ export default {
}) })
}, },
[ClEAR_VALIDATE_PARAMS]: ( state, { payload: { pathMethod } } ) => { [ClEAR_VALIDATE_PARAMS]: ( state, { payload: { pathMethod } } ) => {
let operation = state.getIn( [ "resolved", "paths", ...pathMethod ] )
let parameters = operation.get("parameters")
return state.updateIn( [ "resolved", "paths", ...pathMethod, "parameters" ], fromJS([]), parameters => { return state.updateIn( [ "resolved", "paths", ...pathMethod, "parameters" ], fromJS([]), parameters => {
return parameters.withMutations( parameters => { return parameters.withMutations( parameters => {
for ( let i = 0, len = parameters.count(); i < len; i++ ) { for ( let i = 0, len = parameters.count(); i < len; i++ ) {

View File

@@ -224,7 +224,7 @@ export const requestFor = (state, path, method) => {
return requests(state).getIn([path, method], null) return requests(state).getIn([path, method], null)
} }
export const allowTryItOutFor = (state, path, method ) => { export const allowTryItOutFor = () => {
// This is just a hook for now. // This is just a hook for now.
return true return true
} }

View File

@@ -57,14 +57,14 @@ export default class SplitPaneMode extends React.Component {
const mode = layoutSelectors.whatMode(MODE_KEY) const mode = layoutSelectors.whatMode(MODE_KEY)
const left = mode === MODE_RIGHT ? <noscript/> : children[0] const left = mode === MODE_RIGHT ? <noscript/> : children[0]
const right = mode === MODE_LEFT ? <noscript/> : children[1] const right = mode === MODE_LEFT ? <noscript/> : children[1]
const size = this.sizeFromMode(mode, '50%') const size = this.sizeFromMode(mode, "50%")
return ( return (
<SplitPane <SplitPane
disabledClass={''} disabledClass={""}
ref={'splitPane'} ref={"splitPane"}
split='vertical' split='vertical'
defaultSize={'50%'} defaultSize={"50%"}
primary="second" primary="second"
minSize={0} minSize={0}
size={size} size={size}

View File

@@ -3,10 +3,6 @@ import ReactDOM from "react-dom"
import { connect, Provider } from "react-redux" import { connect, Provider } from "react-redux"
import omit from "lodash/omit" import omit from "lodash/omit"
const NotFoundComponent = name => ()=> <span style={{color: "red"}}> "{name}" component not found </span>
const SystemWrapper = (getSystem, ComponentToWrap ) => class extends Component { const SystemWrapper = (getSystem, ComponentToWrap ) => class extends Component {
render() { render() {
return <ComponentToWrap {...getSystem() } {...this.props} {...this.context} /> return <ComponentToWrap {...getSystem() } {...this.props} {...this.context} />
@@ -75,10 +71,10 @@ const createClass = component => React.createClass({
} }
}) })
const Fallback = ({ error, name }) => <div style={{ // eslint-disable-line react/prop-types const Fallback = ({ name }) => <div style={{ // eslint-disable-line react/prop-types
padding: "1em", padding: "1em",
"color": "#aaa" "color": "#aaa"
}}>😱 <i>Could not render { name ? name : "this component" }, see console.</i></div> }}>😱 <i>Could not render { name || name === "t" ? name : "this component" }, see the console.</i></div>
const wrapRender = (component) => { const wrapRender = (component) => {
const isStateless = component => !(component.prototype && component.prototype.isReactComponent) const isStateless = component => !(component.prototype && component.prototype.isReactComponent)

View File

@@ -1,11 +1,10 @@
import BasePreset from "./base" import BasePreset from "./base"
import allowTryItOutIfHost from "core/plugins/allow-try-it-out-if-host" // Just the base, for now.
export default function PresetApis() { export default function PresetApis() {
return [ return [
BasePreset, BasePreset,
allowTryItOutIfHost,
] ]
} }

View File

@@ -1,7 +1,6 @@
import { createStore, applyMiddleware, bindActionCreators, compose } from "redux" import { createStore, applyMiddleware, bindActionCreators, compose } from "redux"
import Im, { fromJS, Map } from "immutable" import Im, { fromJS, Map } from "immutable"
import deepExtend from "deep-extend" import deepExtend from "deep-extend"
import createLogger from "redux-logger"
import { combineReducers } from "redux-immutable" import { combineReducers } from "redux-immutable"
import assign from "object-assign" import assign from "object-assign"
import serializeError from "serialize-error" import serializeError from "serialize-error"

View File

@@ -135,12 +135,11 @@ export function getList(iterable, keys) {
// Adapted from http://stackoverflow.com/a/2893259/454004 // Adapted from http://stackoverflow.com/a/2893259/454004
// Note: directly ported from CoffeeScript // Note: directly ported from CoffeeScript
export function formatXml (xml) { export function formatXml (xml) {
var contexp, fn, formatted, indent, l, lastType, len, lines, ln, pad, reg, transitions, wsexp var contexp, fn, formatted, indent, l, lastType, len, lines, ln, reg, transitions, wsexp
reg = /(>)(<)(\/*)/g reg = /(>)(<)(\/*)/g
wsexp = /[ ]*(.*)[ ]+\n/g wsexp = /[ ]*(.*)[ ]+\n/g
contexp = /(<.+>)(.+\n)/g contexp = /(<.+>)(.+\n)/g
xml = xml.replace(/\r\n/g, "\n").replace(reg, "$1\n$2$3").replace(wsexp, "$1\n").replace(contexp, "$1\n$2") xml = xml.replace(/\r\n/g, "\n").replace(reg, "$1\n$2$3").replace(wsexp, "$1\n").replace(contexp, "$1\n$2")
pad = 0
formatted = "" formatted = ""
lines = xml.split("\n") lines = xml.split("\n")
indent = 0 indent = 0
@@ -164,7 +163,7 @@ export function formatXml (xml) {
"other->other": 0 "other->other": 0
} }
fn = function(ln) { fn = function(ln) {
var fromTo, j, key, padding, type, types, value var fromTo, key, padding, type, types, value
types = { types = {
single: Boolean(ln.match(/<.+\/>/)), single: Boolean(ln.match(/<.+\/>/)),
closing: Boolean(ln.match(/<\/.+>/)), closing: Boolean(ln.match(/<\/.+>/)),
@@ -187,11 +186,13 @@ export function formatXml (xml) {
padding = "" padding = ""
indent += transitions[fromTo] indent += transitions[fromTo]
padding = ((function() { padding = ((function() {
var m, ref1, results /* eslint-disable no-unused-vars */
var m, ref1, results, j
results = [] results = []
for (j = m = 0, ref1 = indent; 0 <= ref1 ? m < ref1 : m > ref1; j = 0 <= ref1 ? ++m : --m) { for (j = m = 0, ref1 = indent; 0 <= ref1 ? m < ref1 : m > ref1; j = 0 <= ref1 ? ++m : --m) {
results.push(" ") results.push(" ")
} }
/* eslint-enable no-unused-vars */
return results return results
})()).join("") })()).join("")
if (fromTo === "opening->closing") { if (fromTo === "opening->closing") {
@@ -215,19 +216,9 @@ export function formatXml (xml) {
export function highlight (el) { export function highlight (el) {
const MAX_LENGTH = 5000 const MAX_LENGTH = 5000
var var
_window = window,
_document = document, _document = document,
appendChild = "appendChild", appendChild = "appendChild",
test = "test", test = "test"
// style and color templates
textShadow = ";text-shadow:",
opacity = "opacity:.",
_0px_0px = " 0px 0px ",
_3px_0px_5 = "3px 0px 5",
brace = ")",
i,
microlighted
if (!el) return "" if (!el) return ""
if (el.textContent.length > MAX_LENGTH) { return el.textContent } if (el.textContent.length > MAX_LENGTH) { return el.textContent }
@@ -260,14 +251,7 @@ export function highlight (el) {
lastTokenType, lastTokenType,
// flag determining if token is multi-character // flag determining if token is multi-character
multichar, multichar,
node, node
// calculating the colors for the style templates
colorArr = /(\d*\, \d*\, \d*)(, ([.\d]*))?/g.exec(
_window.getComputedStyle(el).color
),
pxColor = "px rgba("+colorArr[1]+",",
alpha = colorArr[3]||1
// running through characters and highlighting // running through characters and highlighting
while (prev2 = prev1, while (prev2 = prev1,
@@ -468,6 +452,17 @@ export const propChecker = (props, nextProps, objectList=[], ignoreList=[]) => {
|| objectList.some( objectPropName => !eq(props[objectPropName], nextProps[objectPropName]))) || objectList.some( objectPropName => !eq(props[objectPropName], nextProps[objectPropName])))
} }
const validateNumber = ( val ) => {
if ( !/^\d+(.?\d+)?$/.test(val)) {
return "Value must be a number"
}
}
const validateInteger = ( val ) => {
if ( !/^\d+$/.test(val)) {
return "Value must be integer"
}
}
// validation of parameters before execute // validation of parameters before execute
export const validateParam = (param, isXml) => { export const validateParam = (param, isXml) => {
@@ -517,29 +512,16 @@ export const validateParam = (param, isXml) => {
return errors return errors
} }
const validateNumber = ( val ) => {
if ( !/^\d+(.?\d+)?$/.test(val)) {
return "Value must be a number"
}
}
const validateInteger = ( val ) => {
if ( !/^\d+$/.test(val)) {
return "Value must be integer"
}
}
export const getSampleSchema = (schema, contentType="", config={}) => { export const getSampleSchema = (schema, contentType="", config={}) => {
if (/xml/.test(contentType)) { if (/xml/.test(contentType)) {
if (!schema.xml || !schema.xml.name) { if (!schema.xml || !schema.xml.name) {
let name
schema.xml = schema.xml || {} schema.xml = schema.xml || {}
if (schema.$$ref) { if (schema.$$ref) {
let match = schema.$$ref.match(/\S*\/(\S+)$/) let match = schema.$$ref.match(/\S*\/(\S+)$/)
schema.xml.name = match[1] schema.xml.name = match[1]
} else if (schema.type || schema.items || schema.properties || schema.additionalProperties) { } else if (schema.type || schema.items || schema.properties || schema.additionalProperties) {
return '<?xml version="1.0" encoding="UTF-8"?>\n<!-- XML example cannot be generated -->' return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- XML example cannot be generated -->"
} else { } else {
return null return null
} }
@@ -555,13 +537,13 @@ export const parseSeach = () => {
let search = window.location.search let search = window.location.search
if ( search != "" ) { if ( search != "" ) {
let params = search.substr(1).split("&"); let params = search.substr(1).split("&")
for (let i in params) { for (let i in params) {
i = params[i].split("="); i = params[i].split("=")
map[decodeURIComponent(i[0])] = decodeURIComponent(i[1]); map[decodeURIComponent(i[0])] = decodeURIComponent(i[1])
} }
} }
return map; return map
} }

View File

@@ -1,3 +1,4 @@
function makeWindow() {
var win = { var win = {
location: {}, location: {},
history: {}, history: {},
@@ -5,6 +6,10 @@ var win = {
close: () => {} close: () => {}
} }
if(typeof window === "undefined") {
return win
}
try { try {
win = window win = window
var props = ["File", "Blob", "FormData"] var props = ["File", "Blob", "FormData"]
@@ -17,4 +22,7 @@ try {
console.error(e) console.error(e)
} }
export default win return win
}
module.exports = makeWindow()

View File

@@ -37,7 +37,7 @@ export default function configPlugin (toolbox) {
function next(res) { function next(res) {
if (res instanceof Error || res.status >= 400) { if (res instanceof Error || res.status >= 400) {
specActions.updateLoadingStatus("failedConfig") specActions.updateLoadingStatus("failedConfig")
console.log(res.statusText + " " + configUrl) console.error(res.statusText + " " + configUrl)
} else { } else {
callback(parseYamlConfig(res.text)) callback(parseYamlConfig(res.text))
} }

View File

@@ -1,4 +1,4 @@
import Topbar from './topbar.jsx' import Topbar from "./topbar.jsx"
export default function () { export default function () {
return { return {

View File

@@ -1,5 +1,5 @@
import StandaloneLayout from './layout' import StandaloneLayout from "./layout"
import '../style/main.scss' import "../style/main.scss"
import TopbarPlugin from "plugins/topbar" import TopbarPlugin from "plugins/topbar"

View File

@@ -1,4 +1,4 @@
import React, { PropTypes } from 'react' import React, { PropTypes } from "react"
export default class StandaloneLayout extends React.Component { export default class StandaloneLayout extends React.Component {
@@ -6,12 +6,14 @@ export default class StandaloneLayout extends React.Component {
errSelectors: PropTypes.object.isRequired, errSelectors: PropTypes.object.isRequired,
errActions: PropTypes.object.isRequired, errActions: PropTypes.object.isRequired,
specActions: PropTypes.object.isRequired, specActions: PropTypes.object.isRequired,
specSelectors: PropTypes.object.isRequired,
layoutSelectors: PropTypes.object.isRequired, layoutSelectors: PropTypes.object.isRequired,
layoutActions: PropTypes.object.isRequired layoutActions: PropTypes.object.isRequired,
getComponent: PropTypes.func.isRequired
} }
render() { render() {
let { specSelectors, specActions, getComponent, errSelectors, errActions, spec, readOnly } = this.props let { specSelectors, specActions, getComponent } = this.props
let info = specSelectors.info() let info = specSelectors.info()
let url = specSelectors.url() let url = specSelectors.url()
@@ -28,9 +30,7 @@ export default class StandaloneLayout extends React.Component {
let Container = getComponent("Container") let Container = getComponent("Container")
let Row = getComponent("Row") let Row = getComponent("Row")
let Col = getComponent("Col") let Col = getComponent("Col")
let Button = getComponent("Button")
let Errors = getComponent("errors", true) let Errors = getComponent("errors", true)
const SplitPaneMode = getComponent("SplitPaneMode", true)
const Schemes = getComponent("schemes") const Schemes = getComponent("schemes")
const Topbar = getComponent("Topbar", true) const Topbar = getComponent("Topbar", true)
@@ -66,6 +66,7 @@ export default class StandaloneLayout extends React.Component {
) : null } ) : null }
</Col> </Col>
</Row> </Row>
{ schemes && schemes.size && securityDefinitions ? (
<div className="scheme-container"> <div className="scheme-container">
<Col className="schemes wrapper" mobile={12}> <Col className="schemes wrapper" mobile={12}>
{ schemes && schemes.size ? ( { schemes && schemes.size ? (
@@ -76,6 +77,18 @@ export default class StandaloneLayout extends React.Component {
) : null } ) : null }
</Col> </Col>
</div> </div>
) : null }
{ !schemes && securityDefinitions ? (
<div className="scheme-container">
<Col className="schemes wrapper" mobile={12}>
{ securityDefinitions ? (
<AuthorizeBtn />
) : null }
</Col>
</div>
) : null }
<Row> <Row>
<Col mobile={12} desktop={12} > <Col mobile={12} desktop={12} >
<Operations/> <Operations/>

View File

@@ -3,10 +3,9 @@ import React from "react"
import expect, { createSpy } from "expect" import expect, { createSpy } from "expect"
import { shallow } from "enzyme" import { shallow } from "enzyme"
import Operation from "components/operation" import Operation from "components/operation"
import Collapse from "react-collapse"
describe("<Operation/>", function(){ describe("<Operation/>", function(){
it("blanket tests", function(){ it.skip("blanket tests", function(){
let props = { let props = {
operation: {get: ()=>{}}, operation: {get: ()=>{}},

View File

@@ -21,7 +21,7 @@ describe("curlify", function() {
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X POST http://example.com -H "Accept: application/json" -H "content-type: application/json" -d {"id":0,"name":"doggie","status":"available"}') expect(curlified).toEqual("curl -X POST http://example.com -H \"Accept: application/json\" -H \"content-type: application/json\" -d {\"id\":0,\"name\":\"doggie\",\"status\":\"available\"}")
}) })
it("does not change the case of header in curl", function() { it("does not change the case of header in curl", function() {
@@ -35,7 +35,7 @@ describe("curlify", function() {
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X POST http://example.com -H "conTenT Type: application/Moar"') expect(curlified).toEqual("curl -X POST http://example.com -H \"conTenT Type: application/Moar\"")
}) })
it("prints a curl statement with an array of query params", function() { it("prints a curl statement with an array of query params", function() {
@@ -46,7 +46,7 @@ describe("curlify", function() {
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X GET http://swaggerhub.com/v1/one?name=john|smith') expect(curlified).toEqual("curl -X GET http://swaggerhub.com/v1/one?name=john|smith")
}) })
it("prints a curl statement with an array of query params and auth", function() { it("prints a curl statement with an array of query params and auth", function() {
@@ -60,7 +60,7 @@ describe("curlify", function() {
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X GET http://swaggerhub.com/v1/one?name=john|smith -H "authorization: Basic Zm9vOmJhcg=="') expect(curlified).toEqual("curl -X GET http://swaggerhub.com/v1/one?name=john|smith -H \"authorization: Basic Zm9vOmJhcg==\"")
}) })
it("prints a curl statement with html", function() { it("prints a curl statement with html", function() {
@@ -71,13 +71,13 @@ describe("curlify", function() {
accept: "application/json" accept: "application/json"
}, },
body: { body: {
description: '<b>Test</b>' description: "<b>Test</b>"
} }
} }
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X GET http://swaggerhub.com/v1/one?name=john|smith -H "accept: application/json" -d {"description":"<b>Test</b>"}') expect(curlified).toEqual("curl -X GET http://swaggerhub.com/v1/one?name=john|smith -H \"accept: application/json\" -d {\"description\":\"<b>Test</b>\"}")
}) })
it("handles post body with html", function() { it("handles post body with html", function() {
@@ -88,13 +88,13 @@ describe("curlify", function() {
accept: "application/json" accept: "application/json"
}, },
body: { body: {
description: '<b>Test</b>' description: "<b>Test</b>"
} }
} }
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X POST http://swaggerhub.com/v1/one?name=john|smith -H "accept: application/json" -d {"description":"<b>Test</b>"}') expect(curlified).toEqual("curl -X POST http://swaggerhub.com/v1/one?name=john|smith -H \"accept: application/json\" -d {\"description\":\"<b>Test</b>\"}")
}) })
it("handles post body with special chars", function() { it("handles post body with special chars", function() {
@@ -102,14 +102,14 @@ describe("curlify", function() {
url: "http://swaggerhub.com/v1/one?name=john|smith", url: "http://swaggerhub.com/v1/one?name=john|smith",
method: "POST", method: "POST",
body: { body: {
description: '@prefix nif:<http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .\n' + description: "@prefix nif:<http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .\n" +
'@prefix itsrdf: <http://www.w3.org/2005/11/its/rdf#> .' "@prefix itsrdf: <http://www.w3.org/2005/11/its/rdf#> ."
} }
} }
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X POST http://swaggerhub.com/v1/one?name=john|smith -d {"description":"@prefix nif:<http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .@prefix itsrdf: <http://www.w3.org/2005/11/its/rdf#> ."}') expect(curlified).toEqual("curl -X POST http://swaggerhub.com/v1/one?name=john|smith -d {\"description\":\"@prefix nif:<http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .@prefix itsrdf: <http://www.w3.org/2005/11/its/rdf#> .\"}")
}) })
it("handles delete form with parameters", function() { it("handles delete form with parameters", function() {
@@ -123,7 +123,7 @@ describe("curlify", function() {
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X DELETE http://example.com -H "accept: application/x-www-form-urlencoded"') expect(curlified).toEqual("curl -X DELETE http://example.com -H \"accept: application/x-www-form-urlencoded\"")
}) })
it("should print a curl with formData", function() { it("should print a curl with formData", function() {
@@ -136,7 +136,7 @@ describe("curlify", function() {
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X POST http://example.com -H "content-type: multipart/form-data" -F id=123 -F name=Sahar') expect(curlified).toEqual("curl -X POST http://example.com -H \"content-type: multipart/form-data\" -F id=123 -F name=Sahar")
}) })
it("prints a curl post statement from an object", function() { it("prints a curl post statement from an object", function() {
@@ -153,7 +153,7 @@ describe("curlify", function() {
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X POST http://example.com -H "accept: application/json" -d {"id":10101}') expect(curlified).toEqual("curl -X POST http://example.com -H \"accept: application/json\" -d {\"id\":10101}")
}) })
it("prints a curl post statement from a string containing a single quote", function() { it("prints a curl post statement from a string containing a single quote", function() {
@@ -163,12 +163,12 @@ describe("curlify", function() {
headers: { headers: {
accept: "application/json" accept: "application/json"
}, },
body: '{"id":"foo\'bar"}' body: "{\"id\":\"foo'bar\"}"
} }
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual('curl -X POST http://example.com -H "accept: application/json" -d "{\\"id\\":\\"foo\'bar\\"}"') expect(curlified).toEqual("curl -X POST http://example.com -H \"accept: application/json\" -d \"{\\\"id\\\":\\\"foo'bar\\\"}\"")
}) })
}) })

View File

@@ -1,5 +1,5 @@
/* eslint-env mocha */ /* eslint-env mocha */
import expect, { createSpy } from "expect" import expect from "expect"
import { transformPathToArray } from "core/path-translator" import { transformPathToArray } from "core/path-translator"
describe("validation plugin - path translator", function(){ describe("validation plugin - path translator", function(){

View File

@@ -1,268 +0,0 @@
/* eslint-env mocha */
import expect from "expect"
import { pathForPosition, positionRangeForPath } from "corePlugins/ast/ast"
describe.skip("ASTManager", function() {
describe("#pathForPosition", function() {
describe("out of range", function() {
it("returns empty array for out of range row", function(done) {
var position = {line: 3, column: 0}
var assertPath = function(path) {
expect(path).toEqual([])
done()
}
pathForPosition("swagger: 2.0", position)
.then(assertPath)
})
it("returns empty array for out of range column", function(done) {
var position = {line: 0, column: 100}
var assertPath = function(path) {
expect(path).toEqual([])
done()
}
pathForPosition("swagger: 2.0", position)
.then(assertPath)
})
})
describe("when document is a simple hash `swagger: 2.0`", function() {
it("should return empty array when pointer is at middle of the hash key", function(done) {
var position = {line: 0, column: 3}
pathForPosition("swagger: 2.0", position).then(function(path) {
expect(path).toEqual([])
done()
})
})
it("should return ['swagger'] when pointer is at the value", function(done) {
var position = {line: 0, column: 10}
pathForPosition("swagger: 2.0", position).then(function(path) {
expect(path).toEqual(["swagger"])
done()
})
})
})
describe("when document is an array: ['abc', 'cde']", function() {
var yaml = [
/*
0
01234567 */
/* 0 */ "- abc",
/* 1 */ "- def"
].join("\n")
it("should return empty array when pointer is at array dash", function(done) {
var position = {line: 0, column: 0}
pathForPosition(yaml, position).then(function(path) {
expect(path).toEqual([])
done()
})
})
it("should return ['0'] when pointer is at abc", function(done) {
var position = {line: 0, column: 3}
pathForPosition(yaml, position).then(function(path) {
expect(path).toEqual(["0"])
done()
})
})
it("should return ['1'] when pointer is at abc", function(done) {
var position = {line: 1, column: 3}
pathForPosition(yaml, position).then(function(path) {
expect(path).toEqual(["1"])
done()
})
})
})
describe("when document is an array of arrays", function() {
var yaml = [
/*
0 10
0123456789012345 */
/* 0 */ "-",
/* 1 */ " - abc",
/* 2 */ " - def",
/* 3 */ "-",
/* 4 */ " - ABC",
/* 5 */ " - DEF"
].join("\n")
it("should return ['0', '0'] when pointer is at 'abc'", function(done) {
var position = {line: 1, column: 5}
pathForPosition(yaml, position).then(function(path) {
expect(path).toEqual(["0", "0"])
done()
})
})
})
describe("when document is an array of hashs", function() {
var yaml = [
/*
0 10
0123456789012345 */
/* 0 */ "- key: value",
/* 1 */ " num: 1",
/* 2 */ "- name: Tesla",
/* 3 */ " year: 2016"
].join("\n")
it("should return ['0'] when pointer is at 'key'", function(done) {
var position = {line: 0, column: 3}
pathForPosition(yaml, position).then(function(path) {
expect(path).toEqual(["0"])
done()
})
})
it("should return ['0', 'key'] when pointer is at 'value'", function(done) {
var position = {line: 0, column: 9}
pathForPosition(yaml, position).then(function(path) {
expect(path).toEqual(["0", "key"])
done()
})
})
it("should return ['1', 'year'] when pointer is at '2016'", function(done) {
var position = {line: 3, column: 10}
pathForPosition(yaml, position).then(function(path) {
expect(path).toEqual(["1", "year"])
done()
})
})
})
describe("full document", function() {
var yaml = [
/*
0 10 20 30
012345678901234567890123456789012345678 */
/* 0 */ "swagger: '2.0'",
/* 1 */ "info:",
/* 2 */ " title: Test document",
/* 3 */ " version: 0.0.1",
/* 4 */ " contact:",
/* 5 */ " name: Sahar",
/* 6 */ " url: github.com",
/* 7 */ " email: me@example.com",
/* 8 */ " "
].join("\n")
it("should return ['info', 'contact', 'email'] when pointer is at me@", function(done) {
var position = {line: 7, column: 13}
pathForPosition(yaml, position).then(function(path) {
expect(path).toEqual(["info", "contact", "email"])
done()
})
})
})
})
describe("#positionRangeForPath", function() {
it("return {{-1, -1}, {-1, -1}} for invalid paths", function(done) {
var yaml = [
"key: value",
"anotherKey: value"
].join("\n")
positionRangeForPath(yaml, ["invalid"])
.then(function(position) {
expect(position.start).toEqual({line: -1, column: -1})
expect(position.end).toEqual({line: -1, column: -1})
done()
})
})
describe("when document is a simple hash `swagger: 2.0`", function() {
var yaml = "swagger: 2.0"
it("return {0, 0} for start of empty array path (root)", function(done) {
positionRangeForPath(yaml, []).then(function(position) {
expect(position.start).toEqual({line: 0, column: 0})
done()
})
})
it("return {0, 12} for end of empty array path (root)", function(done) {
positionRangeForPath(yaml, []).then(function(position) {
expect(position.end).toEqual({line: 0, column: 12})
done()
})
})
it("return {0, 9} for start of ['swagger']", function(done) {
positionRangeForPath(yaml, ["swagger"]).then(function(position) {
expect(position.start).toEqual({line: 0, column: 9})
done()
})
})
it("return {0, 12} for end of ['swagger']", function(done) {
positionRangeForPath(yaml, ["swagger"]).then(function(position) {
expect(position.end).toEqual({line: 0, column: 12})
done()
})
})
})
describe("when document is an array of primitives", function() {
var yaml = [
"key:",
" - value1",
" - value2"
].join("\n")
it("returns {1, 4} for ['key', '0']", function(done) {
positionRangeForPath(yaml, ["key", "0"]).then(function(position) {
expect(position.start).toEqual({line: 1, column: 4})
done()
})
})
})
describe("full document", function() {
var yaml = [
/*
0 10 20 30
012345678901234567890123456789012345678 */
/* 0 */ "swagger: '2.0'",
/* 1 */ "info:",
/* 2 */ " title: Test document",
/* 3 */ " version: 0.0.1",
/* 4 */ " contact:",
/* 5 */ " name: Sahar",
/* 6 */ " url: github.com",
/* 7 */ " email: me@example.com",
/* 8 */ " "
].join("\n")
it("returns {2, 2} for start of ['info']", function(done) {
positionRangeForPath(yaml, ["info"]).then(function(position) {
expect(position.start).toEqual({line: 2, column: 2})
done()
})
})
it("returns {5, 10} for start of ['info', 'contact', 'name']", function(done) {
positionRangeForPath(yaml, ["info", "contact", "name"]).then(function(position) {
expect(position.start).toEqual({line: 5, column: 10})
done()
})
})
it("returns {5, 15} for end of ['info', 'contact', 'name']", function(done) {
positionRangeForPath(yaml, ["info", "contact", "name"]).then(function(position) {
expect(position.end).toEqual({line: 5, column: 15})
done()
})
})
})
})
})

View File

@@ -1,6 +1,5 @@
/* eslint-env mocha */ /* eslint-env mocha */
import expect, { createSpy } from "expect" import expect, { createSpy } from "expect"
import { fromJS } from "immutable"
import { execute } from "corePlugins/auth/spec-wrap-actions" import { execute } from "corePlugins/auth/spec-wrap-actions"
describe("spec plugin - actions", function(){ describe("spec plugin - actions", function(){
@@ -18,7 +17,7 @@ describe("spec plugin - actions", function(){
// When // When
let executeFn = execute(oriExecute, system) let executeFn = execute(oriExecute, system)
let executePromise = executeFn({}) executeFn({})
// Then // Then
expect(oriExecute.calls.length).toEqual(1) expect(oriExecute.calls.length).toEqual(1)

View File

@@ -1,4 +1,4 @@
import expect, { createSpy } from "expect" import expect from "expect"
import { Map, List } from "immutable" import { Map, List } from "immutable"
import { transform } from "corePlugins/err/error-transformers/transformers/not-of-type" import { transform } from "corePlugins/err/error-transformers/transformers/not-of-type"

View File

@@ -1,5 +1,5 @@
import expect, { createSpy } from "expect" import expect from "expect"
import { Map, List, fromJS } from "immutable" import { fromJS } from "immutable"
import { transform } from "corePlugins/err/error-transformers/transformers/parameter-oneof" import { transform } from "corePlugins/err/error-transformers/transformers/parameter-oneof"
describe.skip("err plugin - tranformers - parameter oneof", () => { describe.skip("err plugin - tranformers - parameter oneof", () => {

View File

@@ -396,7 +396,7 @@ describe("createXMLExample", function () {
}) })
it("returns array with default values with wrapped=true", function () { it("returns array with default values with wrapped=true", function () {
var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals>\n\t<animal>one</animal>\n</animals>" var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals>\n\t<animal>1</animal>\n\t<animal>2</animal>\n</animals>"
var definition = { var definition = {
items: { items: {
"enum": ["one", "two"], "enum": ["one", "two"],
@@ -405,6 +405,7 @@ describe("createXMLExample", function () {
name: "animal" name: "animal"
} }
}, },
"default": ["1", "2"],
xml: { xml: {
wrapped: true, wrapped: true,
name: "animals" name: "animals"
@@ -413,6 +414,51 @@ describe("createXMLExample", function () {
expect(sut(definition)).toEqual(expected) expect(sut(definition)).toEqual(expected)
}) })
it("returns array with example values with ", function () {
var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals>\n\t<animal>1</animal>\n\t<animal>2</animal>\n</animals>"
var definition = {
type: "object",
properties: {
"animal": {
"type": "array",
"items": {
"type": "string"
},
"example": [
"1",
"2"
]
}
},
xml: {
name: "animals"
}
}
expect(sut(definition)).toEqual(expected)
})
it("returns array with example values with wrapped=true", function () {
var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<animals>\n\t<animal>1</animal>\n\t<animal>2</animal>\n</animals>"
var definition = {
type: "array",
items: {
type: "string",
xml: {
name: "animal"
}
},
"example": [ "1", "2" ],
xml: {
wrapped: true,
name: "animals"
}
}
expect(sut(definition)).toEqual(expected)
})
}) })
describe("object", function () { describe("object", function () {

View File

@@ -25,7 +25,7 @@ describe("spec plugin - actions", function(){
// When // When
let executeFn = execute({ path: "/one", method: "get"}) let executeFn = execute({ path: "/one", method: "get"})
let executePromise = executeFn(system) executeFn(system)
// Then // Then
expect(system.specActions.executeRequest.calls[0].arguments[0]).toEqual({ expect(system.specActions.executeRequest.calls[0].arguments[0]).toEqual({
@@ -60,7 +60,7 @@ describe("spec plugin - actions", function(){
// When // When
let executeFn = execute({ hi: "hello" }) let executeFn = execute({ hi: "hello" })
let executePromise = executeFn(system) executeFn(system)
// Then // Then
expect(system.specActions.executeRequest.calls[0].arguments[0]).toInclude({hi: "hello"}) expect(system.specActions.executeRequest.calls[0].arguments[0]).toInclude({hi: "hello"})
@@ -72,7 +72,6 @@ describe("spec plugin - actions", function(){
xit("should call fn.execute with arg ", function(){ xit("should call fn.execute with arg ", function(){
const response = {}
const system = { const system = {
fn: { fn: {
execute: createSpy().andReturn(Promise.resolve()) execute: createSpy().andReturn(Promise.resolve())

View File

@@ -1,5 +1,5 @@
/* eslint-env mocha */ /* eslint-env mocha */
import expect, { createSpy } from "expect" import expect from "expect"
import { fromJS } from "immutable" import { fromJS } from "immutable"
import { parameterValues, contentTypeValues } from "corePlugins/spec/selectors" import { parameterValues, contentTypeValues } from "corePlugins/spec/selectors"

View File

@@ -240,6 +240,7 @@ describe("bound system", function(){
statePlugins: { statePlugins: {
kyle: { kyle: {
wrapActions: { wrapActions: {
// eslint-disable-next-line no-unused-vars
simple: (ori) => (arg) => (sys) => { simple: (ori) => (arg) => (sys) => {
return { type: "called" } return { type: "called" }
} }

View File

@@ -1,5 +1,5 @@
/* eslint-env mocha */ /* eslint-env mocha */
import expect, { createSpy } from "expect" import expect from "expect"
import { fromJS } from "immutable" import { fromJS } from "immutable"
import { mapToList } from "core/utils" import { mapToList } from "core/utils"

View File

@@ -13,6 +13,7 @@ module.exports = require('./make-webpack-config.js')({
entry: { entry: {
'swagger-ui-bundle': [ 'swagger-ui-bundle': [
'babel-polyfill',
'./src/core/index.js' './src/core/index.js'
] ]
}, },

View File

@@ -13,6 +13,7 @@ module.exports = require('./make-webpack-config.js')({
entry: { entry: {
'swagger-ui-standalone-preset': [ 'swagger-ui-standalone-preset': [
'babel-polyfill',
'./src/standalone/index.js' './src/standalone/index.js'
] ]
}, },

View File

@@ -15,6 +15,7 @@ module.exports = require('./make-webpack-config.js')({
entry: { entry: {
"swagger-ui": [ "swagger-ui": [
'babel-polyfill',
'./src/style/main.scss', './src/style/main.scss',
'./src/core/index.js' './src/core/index.js'
] ]

View File

@@ -10,6 +10,7 @@ module.exports = require("./make-webpack-config")({
devtool: "eval", devtool: "eval",
entry: { entry: {
'SwaggerUIBundle': [ 'SwaggerUIBundle': [
'babel-polyfill',
'./src/core/index.js' './src/core/index.js'
], ],
'SwaggerUIStandalonePreset': [ 'SwaggerUIStandalonePreset': [