Merge pull request #2776 from shockey/ft/linting-and-testing

Linting and testing
This commit is contained in:
shockey
2017-03-23 16:45:12 -07:00
committed by GitHub
60 changed files with 248 additions and 510 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
.DS_Store
npm-debug.log
.eslintcache

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;AA+yIA;AA4qHA;AA0xHA;AA8pGA;AAs8EA;AA8hHA;AA0jIA;AAwRA;;;;;AA4sCA;AAmwJA;;;;;;;;;;;;;;AAgtEA;AAyoIA;AAiuJA;AA8kHA;AAykGA;AAskEA;AAy3DA;AA+vDA;AAisBA;AA+qGA;;;;;;AA+eA;AAm3FA;AAw+CA;AAwgDA;AA4yCA;AAgyEA;AA0iHA;;;;;AA2oDA;AA2qFA;AAm2CA;AAmvDA;AAwtCA;AAsiEA;AA29FA;;;;;;;;;AA20BA;AA2zIA;AAk4DA;AA6/EA","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

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;AAg3HA;AA6+FA;AAgqCA;AAi+BA;AAyvCA;AA04BA","sourceRoot":""}
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;AAuqGA;AAi2HA;AA67FA;AA2mCA;AAq+BA;AAsiCA;AAm5BA","sourceRoot":""}

View File

@@ -26,7 +26,13 @@
"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-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": {
"brace": "0.7.0",
@@ -46,7 +52,7 @@
"react": "^15.4.0",
"react-addons-perf": "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-dom": "^15.4.0",
"react-height": "^2.0.0",
@@ -84,11 +90,19 @@
"css-loader": "0.22.0",
"deep-extend": "^0.4.1",
"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",
"file-loader": "0.8.4",
"html-webpack-plugin": "^2.28.0",
"imports-loader": "0.6.5",
"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-loader": "2.2.1",
"license-checker": "^8.0.4",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,4 @@
import React, { Component, PropTypes } from "react"
import { fromJS } from "immutable"
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)
render(){
let { getComponent, operation, specActions, path, method } = this.props
const ContentType = getComponent( "contentType" )
return (
<button className="btn execute opblock-control__btn" onClick={ this.onClick }>
Execute

View File

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

View File

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

View File

@@ -4,13 +4,15 @@ import React, { Component, PropTypes } from "react"
export default class Models extends Component {
static propTypes = {
getComponent: PropTypes.func,
specSelectors: PropTypes.object
specSelectors: PropTypes.object,
layoutSelectors: PropTypes.object,
layoutActions: PropTypes.object
}
render(){
let { specSelectors, getComponent, layoutSelectors, layoutActions } = this.props
let definitions = specSelectors.definitions()
let showModels = layoutSelectors.isShown('models', true)
let showModels = layoutSelectors.isShown("models", true)
const Model = getComponent("model")
const Collapse = getComponent("Collapse")
@@ -18,7 +20,7 @@ export default class Models extends Component {
if (!definitions.size) return null
return <section className={ showModels ? "models is-open" : "models"}>
<h4 onClick={() => layoutActions.show('models', !showModels)}>
<h4 onClick={() => layoutActions.show("models", !showModels)}>
<span>Models</span>
<svg width="20" height="20">
<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 {
static propTypes = {
getComponent: PropTypes.func.isRequired,
getConfigs: PropTypes.func.isRequired,
specSelectors: PropTypes.object.isRequired
}
constructor(props, context) {
super(props, context)
let { specSelectors, getConfigs } = props
@@ -31,7 +37,7 @@ export default class OnlineValidatorBadge extends React.Component {
return null
}
return (<span style={{ float: "right"}}>
return (<span style={{ float: "right"}}>
<a target="_blank" href={`${ this.state.validatorUrl }/debug?url=${ this.state.url }`}>
<img alt="Online validator badge" src={`${ this.state.validatorUrl }?url=${ this.state.url }`} />
</a>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -26,7 +26,7 @@ export function transformPathToArray(property, jsSpec) {
return a.concat(b)
}, [])
.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
if(get(obj, makeAccessArray(buffer, curr))) {

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,7 +4,7 @@ import { createSelector } from "reselect"
import { Map } from "immutable"
export default function downloadUrlPlugin (toolbox) {
let { fn, Im } = toolbox
let { fn } = toolbox
const actions = {
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 {
type: NEW_SPEC_ERR,
payload: err
}
}
export function newAuthErr(err, action) {
export function newAuthErr(err) {
return {
type: NEW_AUTH_ERR,
payload: err

View File

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

View File

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

View File

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

View File

@@ -51,7 +51,6 @@ export default {
[VALIDATE_PARAMS]: ( state, { payload: { pathMethod } } ) => {
let operation = state.getIn( [ "resolved", "paths", ...pathMethod ] )
let parameters = operation.get("parameters")
let isXml = /xml/i.test(operation.get("consumes_value"))
return state.updateIn( [ "resolved", "paths", ...pathMethod, "parameters" ], fromJS([]), parameters => {
@@ -64,9 +63,6 @@ export default {
})
},
[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 parameters.withMutations( parameters => {
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)
}
export const allowTryItOutFor = (state, path, method ) => {
export const allowTryItOutFor = () => {
// This is just a hook for now.
return true
}

View File

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

View File

@@ -3,10 +3,6 @@ import ReactDOM from "react-dom"
import { connect, Provider } from "react-redux"
import omit from "lodash/omit"
const NotFoundComponent = name => ()=> <span style={{color: "red"}}> "{name}" component not found </span>
const SystemWrapper = (getSystem, ComponentToWrap ) => class extends Component {
render() {
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",
"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 isStateless = component => !(component.prototype && component.prototype.isReactComponent)

View File

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

View File

@@ -135,12 +135,11 @@ export function getList(iterable, keys) {
// Adapted from http://stackoverflow.com/a/2893259/454004
// Note: directly ported from CoffeeScript
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
wsexp = /[ ]*(.*)[ ]+\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")
pad = 0
formatted = ""
lines = xml.split("\n")
indent = 0
@@ -164,7 +163,7 @@ export function formatXml (xml) {
"other->other": 0
}
fn = function(ln) {
var fromTo, j, key, padding, type, types, value
var fromTo, key, padding, type, types, value
types = {
single: Boolean(ln.match(/<.+\/>/)),
closing: Boolean(ln.match(/<\/.+>/)),
@@ -187,11 +186,13 @@ export function formatXml (xml) {
padding = ""
indent += transitions[fromTo]
padding = ((function() {
var m, ref1, results
/* eslint-disable no-unused-vars */
var m, ref1, results, j
results = []
for (j = m = 0, ref1 = indent; 0 <= ref1 ? m < ref1 : m > ref1; j = 0 <= ref1 ? ++m : --m) {
results.push(" ")
}
/* eslint-enable no-unused-vars */
return results
})()).join("")
if (fromTo === "opening->closing") {
@@ -215,19 +216,9 @@ export function formatXml (xml) {
export function highlight (el) {
const MAX_LENGTH = 5000
var
_window = window,
_document = document,
appendChild = "appendChild",
test = "test",
// style and color templates
textShadow = ";text-shadow:",
opacity = "opacity:.",
_0px_0px = " 0px 0px ",
_3px_0px_5 = "3px 0px 5",
brace = ")",
i,
microlighted
test = "test"
if (!el) return ""
if (el.textContent.length > MAX_LENGTH) { return el.textContent }
@@ -260,14 +251,7 @@ export function highlight (el) {
lastTokenType,
// flag determining if token is multi-character
multichar,
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
node
// running through characters and highlighting
while (prev2 = prev1,
@@ -468,6 +452,17 @@ export const propChecker = (props, nextProps, objectList=[], ignoreList=[]) => {
|| 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
export const validateParam = (param, isXml) => {
@@ -517,29 +512,16 @@ export const validateParam = (param, isXml) => {
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={}) => {
if (/xml/.test(contentType)) {
if (!schema.xml || !schema.xml.name) {
let name
schema.xml = schema.xml || {}
if (schema.$$ref) {
let match = schema.$$ref.match(/\S*\/(\S+)$/)
schema.xml.name = match[1]
} 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 {
return null
}
@@ -555,13 +537,13 @@ export const parseSeach = () => {
let search = window.location.search
if ( search != "" ) {
let params = search.substr(1).split("&");
let params = search.substr(1).split("&")
for (let i in params) {
i = params[i].split("=");
map[decodeURIComponent(i[0])] = decodeURIComponent(i[1]);
i = params[i].split("=")
map[decodeURIComponent(i[0])] = decodeURIComponent(i[1])
}
}
return map;
return map
}

View File

@@ -1,20 +1,28 @@
var win = {
location: {},
history: {},
open: () => {},
close: () => {}
}
try {
win = window
var props = ["File", "Blob", "FormData"]
for (var prop of props) {
if (prop in window) {
win[prop] = window[prop]
}
function makeWindow() {
var win = {
location: {},
history: {},
open: () => {},
close: () => {}
}
} catch( e ) {
console.error(e)
if(typeof window === "undefined") {
return win
}
try {
win = window
var props = ["File", "Blob", "FormData"]
for (var prop of props) {
if (prop in window) {
win[prop] = window[prop]
}
}
} catch( e ) {
console.error(e)
}
return win
}
export default win
module.exports = makeWindow()

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
import StandaloneLayout from './layout'
import '../style/main.scss'
import StandaloneLayout from "./layout"
import "../style/main.scss"
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 {
@@ -6,12 +6,14 @@ export default class StandaloneLayout extends React.Component {
errSelectors: PropTypes.object.isRequired,
errActions: PropTypes.object.isRequired,
specActions: PropTypes.object.isRequired,
specSelectors: PropTypes.object.isRequired,
layoutSelectors: PropTypes.object.isRequired,
layoutActions: PropTypes.object.isRequired
layoutActions: PropTypes.object.isRequired,
getComponent: PropTypes.func.isRequired
}
render() {
let { specSelectors, specActions, getComponent, errSelectors, errActions, spec, readOnly } = this.props
let { specSelectors, specActions, getComponent } = this.props
let info = specSelectors.info()
let url = specSelectors.url()
@@ -28,9 +30,7 @@ export default class StandaloneLayout extends React.Component {
let Container = getComponent("Container")
let Row = getComponent("Row")
let Col = getComponent("Col")
let Button = getComponent("Button")
let Errors = getComponent("errors", true)
const SplitPaneMode = getComponent("SplitPaneMode", true)
const Schemes = getComponent("schemes")
const Topbar = getComponent("Topbar", true)

View File

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

View File

@@ -21,7 +21,7 @@ describe("curlify", function() {
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() {
@@ -35,7 +35,7 @@ describe("curlify", function() {
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() {
@@ -46,7 +46,7 @@ describe("curlify", function() {
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() {
@@ -60,7 +60,7 @@ describe("curlify", function() {
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() {
@@ -71,13 +71,13 @@ describe("curlify", function() {
accept: "application/json"
},
body: {
description: '<b>Test</b>'
description: "<b>Test</b>"
}
}
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() {
@@ -88,13 +88,13 @@ describe("curlify", function() {
accept: "application/json"
},
body: {
description: '<b>Test</b>'
description: "<b>Test</b>"
}
}
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() {
@@ -102,14 +102,14 @@ describe("curlify", function() {
url: "http://swaggerhub.com/v1/one?name=john|smith",
method: "POST",
body: {
description: '@prefix nif:<http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .\n' +
'@prefix itsrdf: <http://www.w3.org/2005/11/its/rdf#> .'
description: "@prefix nif:<http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#> .\n" +
"@prefix itsrdf: <http://www.w3.org/2005/11/its/rdf#> ."
}
}
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() {
@@ -123,7 +123,7 @@ describe("curlify", function() {
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() {
@@ -136,7 +136,7 @@ describe("curlify", function() {
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() {
@@ -153,7 +153,7 @@ describe("curlify", function() {
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() {
@@ -163,12 +163,12 @@ describe("curlify", function() {
headers: {
accept: "application/json"
},
body: '{"id":"foo\'bar"}'
body: "{\"id\":\"foo'bar\"}"
}
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 */
import expect, { createSpy } from "expect"
import expect from "expect"
import { transformPathToArray } from "core/path-translator"
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 */
import expect, { createSpy } from "expect"
import { fromJS } from "immutable"
import { execute } from "corePlugins/auth/spec-wrap-actions"
describe("spec plugin - actions", function(){
@@ -18,7 +17,7 @@ describe("spec plugin - actions", function(){
// When
let executeFn = execute(oriExecute, system)
let executePromise = executeFn({})
executeFn({})
// Then
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 { transform } from "corePlugins/err/error-transformers/transformers/not-of-type"

View File

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

View File

@@ -25,7 +25,7 @@ describe("spec plugin - actions", function(){
// When
let executeFn = execute({ path: "/one", method: "get"})
let executePromise = executeFn(system)
executeFn(system)
// Then
expect(system.specActions.executeRequest.calls[0].arguments[0]).toEqual({
@@ -60,7 +60,7 @@ describe("spec plugin - actions", function(){
// When
let executeFn = execute({ hi: "hello" })
let executePromise = executeFn(system)
executeFn(system)
// Then
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(){
const response = {}
const system = {
fn: {
execute: createSpy().andReturn(Promise.resolve())

View File

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

View File

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

View File

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