Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bfe5963978 | ||
|
|
e0e6ccc6d3 | ||
|
|
965cfd349c | ||
|
|
c46566a904 | ||
|
|
ed9e94f506 | ||
|
|
ade4dd4e68 | ||
|
|
a8f9f5c791 | ||
|
|
02d55a096b | ||
|
|
d2e20a72f0 | ||
|
|
af0088ccca | ||
|
|
879fc4ce04 | ||
|
|
38737da9e9 | ||
|
|
161dc57cd5 | ||
|
|
1df4df67c1 | ||
|
|
432cd7f965 | ||
|
|
b34e363ae1 | ||
|
|
229bd1df9a | ||
|
|
ec46a22df5 | ||
|
|
0b668ccf2a | ||
|
|
c38bf2a0b1 | ||
|
|
ded299d891 | ||
|
|
374b3613d0 | ||
|
|
eff72c21df | ||
|
|
995ca2bf3d | ||
|
|
a09412d712 | ||
|
|
7d215a9ef7 | ||
|
|
29ecbea269 | ||
|
|
431b67362c | ||
|
|
bd0fbc60dd | ||
|
|
b8e1f1ceeb | ||
|
|
a13dc1ede1 | ||
|
|
822dda8fc8 | ||
|
|
85d7ec52e7 | ||
|
|
7827e0ab82 | ||
|
|
284572855b | ||
|
|
e23dada9fe | ||
|
|
8fea5f545e | ||
|
|
be887043ed | ||
|
|
6a668cbf7d | ||
|
|
40ccf6aa98 | ||
|
|
8b95575449 | ||
|
|
fd8869d845 | ||
|
|
4a81a12f93 | ||
|
|
997a31c0b5 | ||
|
|
3eeb73ac48 | ||
|
|
633fa101b9 | ||
|
|
2fd371bb36 | ||
|
|
f1be25b258 | ||
|
|
f6535911e6 | ||
|
|
ec9c554e25 | ||
|
|
8dd23053b2 | ||
|
|
fa3afc099f | ||
|
|
e1fcbfbf09 | ||
|
|
518551a5dd | ||
|
|
19558e7098 | ||
|
|
204ea46213 | ||
|
|
27a84014f4 | ||
|
|
c801cd82f3 | ||
|
|
f1f239b07b | ||
|
|
df9e93fc2b | ||
|
|
95c6393181 | ||
|
|
78c67f9eb1 | ||
|
|
f195d01184 | ||
|
|
664e44d3d9 | ||
|
|
a1cfbfb7bb | ||
|
|
1c9f79c98e | ||
|
|
eaf183d548 | ||
|
|
26b255584c | ||
|
|
4ebe2273da | ||
|
|
bfa7214cdf | ||
|
|
3be5d2cb93 | ||
|
|
bdf564ee3a | ||
|
|
a6a3affff9 | ||
|
|
f6f0382102 | ||
|
|
d4c632253e | ||
|
|
2248e02a4d | ||
|
|
cdb4380dde | ||
|
|
384eeffcaf | ||
|
|
fc50fa7683 | ||
|
|
69a0efa0df | ||
|
|
b6a3310ffc | ||
|
|
75824afe18 | ||
|
|
2aa4aa0dd6 | ||
|
|
a5a65589ce | ||
|
|
1ed71a6081 |
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -3,3 +3,4 @@ node_modules
|
||||
.deps_check
|
||||
.DS_Store
|
||||
npm-debug.log
|
||||
.eslintcache
|
||||
|
||||
+14
@@ -1,11 +1,15 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- '6.9'
|
||||
services:
|
||||
- docker
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- /^v\d+\.\d+(\.\d+)?(-\S*)?$/
|
||||
before_deploy: "npm run build-core"
|
||||
env:
|
||||
- DOCKER_IMAGE_NAME=swaggerapi/swagger-ui
|
||||
deploy:
|
||||
provider: npm
|
||||
email: apiteam@swagger.io
|
||||
@@ -16,3 +20,13 @@ deploy:
|
||||
tags: true
|
||||
repo: swagger-api/swagger-ui
|
||||
node: '6.9'
|
||||
after_success:
|
||||
- if [ $DOCKER_HUB_USERNAME ]; then
|
||||
docker login --email=$DOCKER_HUB_EMAIL --username=$DOCKER_HUB_USERNAME --password=$DOCKER_HUB_PASSWORD;
|
||||
docker build -t $DOCKER_IMAGE_NAME .;
|
||||
if [ "$TRAVIS_TAG" != "master" && -z "$TRAVIS_TAG"]; then
|
||||
docker tag $DOCKER_IMAGE_NAME $DOCKER_IMAGE_NAME:$TRAVIS_TAG;
|
||||
fi;
|
||||
|
||||
docker push $DOCKER_IMAGE_NAME;
|
||||
fi;
|
||||
|
||||
+2
-5
@@ -8,11 +8,8 @@ RUN mkdir -p /run/nginx
|
||||
COPY nginx.conf /etc/nginx/
|
||||
|
||||
# copy swagger files to the `/js` folder
|
||||
ADD ./dist/ /usr/share/nginx/html/js
|
||||
ADD ./public/* /usr/share/nginx/html
|
||||
|
||||
# change the folder structure
|
||||
RUN sed -i 's/\.\.\/dist/js/g' /usr/share/nginx/html/index.html
|
||||
ADD ./public/* /usr/share/nginx/html/
|
||||
ADD ./dist/* /usr/share/nginx/html/
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
|
||||
## New!
|
||||
|
||||
This is the new version of swagger-ui, 3.x.
|
||||
**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).
|
||||
|
||||
@@ -13,7 +15,7 @@ The OpenAPI Specification has undergone 4 revisions since initial creation in 20
|
||||
|
||||
Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes | Status
|
||||
------------------ | ------------ | -------------------------- | ----- | ------
|
||||
3.0.2 | 2017-03-19 | 2.0 | [tag v3.0.2](https://github.com/swagger-api/swagger-ui/tree/v3.0.2) |
|
||||
3.0.4 | 2017-03-19 | 2.0 | [tag v3.0.4](https://github.com/swagger-api/swagger-ui/tree/v3.0.4) |
|
||||
2.2.10 | 2017-01-04 | 1.1, 1.2, 2.0 | [tag v2.2.10](https://github.com/swagger-api/swagger-ui/tree/v2.2.10) |
|
||||
2.1.5 | 2016-07-20 | 1.1, 1.2, 2.0 | [tag v2.1.5](https://github.com/swagger-api/swagger-ui/tree/v2.1.5) |
|
||||
2.0.24 | 2014-09-12 | 1.1, 1.2 | [tag v2.0.24](https://github.com/swagger-api/swagger-ui/tree/v2.0.24) |
|
||||
@@ -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`.
|
||||
|
||||
|
||||
##### Browser support
|
||||
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 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.
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
<!-- HTML for dev server -->
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Swagger UI</title>
|
||||
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet">
|
||||
<link rel="stylesheet" type="text/css" href="../dist/swagger-ui.css" >
|
||||
<link rel="icon" type="image/png" href="favicon-32x32.png" sizes="32x32" />
|
||||
<link rel="icon" type="image/png" href="favicon-16x16.png" sizes="16x16" />
|
||||
<link rel="stylesheet" type="text/css" href="./swagger-ui.css" >
|
||||
<link rel="icon" type="image/png" href="../public/favicon-32x32.png" sizes="32x32" />
|
||||
<link rel="icon" type="image/png" href="../public/favicon-16x16.png" sizes="16x16" />
|
||||
<style>
|
||||
html
|
||||
{
|
||||
@@ -66,18 +67,19 @@
|
||||
|
||||
<div id="swagger-ui"></div>
|
||||
|
||||
<script src="../dist/swagger-ui-bundle.js"> </script>
|
||||
<script src="../dist/swagger-ui-standalone-preset.js"> </script>
|
||||
<script src="./swagger-ui-bundle.js"> </script>
|
||||
<script src="./swagger-ui-standalone-preset.js"> </script>
|
||||
<script>
|
||||
window.onload = function() {
|
||||
window["SwaggerUIBundle"] = window["swagger-ui-bundle"]
|
||||
window["SwaggerUIStandalonePreset"] = window["swagger-ui-standalone-preset"]
|
||||
// Build a system
|
||||
const ui = SwaggerUIBundle({
|
||||
url: "http://petstore.swagger.io/v2/swagger.json",
|
||||
dom_id: '#swagger-ui',
|
||||
presets: [
|
||||
SwaggerUIBundle.presets.apis,
|
||||
// yay ES6 modules ↘
|
||||
Array.isArray(SwaggerUIStandalonePreset) ? SwaggerUIStandalonePreset : SwaggerUIStandalonePreset.default
|
||||
SwaggerUIStandalonePreset
|
||||
],
|
||||
plugins: [
|
||||
SwaggerUIBundle.plugins.DownloadUrl
|
||||
Vendored
+7
-6
@@ -1,10 +1,13 @@
|
||||
<!-- HTML for static distribution bundle build -->
|
||||
<!DOCTYPE html>
|
||||
<!-- this is for the dev server -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Swagger UI</title>
|
||||
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet">
|
||||
<link rel="stylesheet" type="text/css" href="./swagger-ui.css" >
|
||||
<link rel="icon" type="image/png" href="../public/favicon-32x32.png" sizes="32x32" />
|
||||
<link rel="icon" type="image/png" href="../public/favicon-16x16.png" sizes="16x16" />
|
||||
<style>
|
||||
html
|
||||
{
|
||||
@@ -64,9 +67,8 @@
|
||||
|
||||
<div id="swagger-ui"></div>
|
||||
|
||||
<!-- don't be alarmed, these don't match what's in dist, because webpack-dev-server serves them in memory. -->
|
||||
<script src="/dist/SwaggerUIBundle.js"> </script>
|
||||
<script src="/dist/SwaggerUIStandalonePreset.js"> </script>
|
||||
<script src="./swagger-ui-bundle.js"> </script>
|
||||
<script src="./swagger-ui-standalone-preset.js"> </script>
|
||||
<script>
|
||||
window.onload = function() {
|
||||
// Build a system
|
||||
@@ -75,8 +77,7 @@ window.onload = function() {
|
||||
dom_id: '#swagger-ui',
|
||||
presets: [
|
||||
SwaggerUIBundle.presets.apis,
|
||||
// yay ES6 modules ↘
|
||||
Array.isArray(SwaggerUIStandalonePreset) ? SwaggerUIStandalonePreset : SwaggerUIStandalonePreset.default
|
||||
SwaggerUIStandalonePreset
|
||||
],
|
||||
plugins: [
|
||||
SwaggerUIBundle.plugins.DownloadUrl
|
||||
|
||||
Vendored
+40
-40
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -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;AAovDA;AA0tBA;AA+pGA;;;;;;AAseA;AAimGA;AA44EA;;;;;AAoGA;AA2qFA;AAm2CA;AAmvDA;AAwtCA;AAuiEA;AA29FA;;;;;;;;;AA00BA;AA2zIA;AAm4DA","sourceRoot":""}
|
||||
{"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;AAu/FA;AA6+FA;;;;;;;;;;;;;;;;;;;;;;;;;;AAsdA;;;;;;AAoIA;AAk7FA;AAmtCA;;;;;AA0uIA;AAq7IA;AAo7FA;AA0wGA;AAglFA;AA0jFA;AAq9CA;AA6jDA;AAgrCA;AAgtEA;AAgkIA;;;;;;;;;;;;;;AAw4GA;AAyoIA;AAiuJA;AA8kHA;AAonGA;AAukEA;AA02DA;AAyxDA;AAm+BA;;;;;;AAmsEA;AA2zFA;;;;;AA+1CA;AA2qFA;AAo2CA;AAokCA;AAkhDA;AAwvEA;AAs+FA;;;;;;;;;AA+xBA;AA2zIA;AAg4DA;AA0vDA","sourceRoot":""}
|
||||
Vendored
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -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":""}
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+8
-8
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -1 +1 @@
|
||||
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;AAqnGA;AAi2HA;AA6+FA;AAgqCA;AAi+BA;AAyvCA;AA84BA","sourceRoot":""}
|
||||
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;AAsoGA;AAy4HA;AA+7FA;AA2mCA;AAw/BA;AA2hCA;AAs5BA","sourceRoot":""}
|
||||
+21
-9
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "swagger-ui",
|
||||
"version": "3.0.2",
|
||||
"version": "3.0.4",
|
||||
"main": "dist/swagger-ui.js",
|
||||
"repository": "git@github.com:swagger-api/swagger-ui.git",
|
||||
"contributors": [
|
||||
@@ -22,22 +22,27 @@
|
||||
"dev": "npm-run-all --parallel hot-server watch open-localhost",
|
||||
"watch": "webpack --config webpack-watch.config.js --watch --progress",
|
||||
"open-localhost": "node -e 'require(\"open\")(\"http://localhost:3200\")'",
|
||||
"hot-server": "webpack-dev-server --host 0.0.0.0 --config webpack-hot-dev-server.config.js --inline --hot --progress --content-base dist/",
|
||||
"hot-server": "webpack-dev-server --host 0.0.0.0 --config webpack-hot-dev-server.config.js --inline --hot --progress --content-base dev-helpers/",
|
||||
"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": {
|
||||
"babel-polyfill": "^6.23.0",
|
||||
"brace": "0.7.0",
|
||||
"btoa": "^1.1.2",
|
||||
"debounce": "1.0.0",
|
||||
"deep-extend": "0.4.1",
|
||||
"expect": "1.20.2",
|
||||
"getbase": "^2.8.2",
|
||||
"immutable": "^3.x.x",
|
||||
"js-yaml": "^3.5.5",
|
||||
"jsonschema": "^1.1.0",
|
||||
"less": "2.7.1",
|
||||
"lodash": "4.17.2",
|
||||
"matcher": "^0.1.2",
|
||||
@@ -46,7 +51,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",
|
||||
@@ -63,12 +68,11 @@
|
||||
"reselect": "2.5.3",
|
||||
"serialize-error": "2.0.0",
|
||||
"shallowequal": "0.2.2",
|
||||
"swagger-client": "^3.0.2",
|
||||
"swagger-client": "^3.0.4",
|
||||
"whatwg-fetch": "0.11.1",
|
||||
"worker-loader": "^0.7.1",
|
||||
"xml": "1.0.1",
|
||||
"yaml-js": "^0.1.3",
|
||||
"yaml-worker": "^2.1.0"
|
||||
"yaml-js": "^0.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "6.6.1",
|
||||
@@ -84,11 +88,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",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -10,13 +10,13 @@ export default class Oauth2 extends React.Component {
|
||||
static propTypes = {
|
||||
name: PropTypes.string,
|
||||
authorized: PropTypes.object,
|
||||
configs: PropTypes.object,
|
||||
getComponent: PropTypes.func.isRequired,
|
||||
schema: PropTypes.object.isRequired,
|
||||
authSelectors: PropTypes.object.isRequired,
|
||||
authActions: PropTypes.object.isRequired,
|
||||
errSelectors: PropTypes.object.isRequired,
|
||||
errActions: PropTypes.object.isRequired
|
||||
errActions: PropTypes.object.isRequired,
|
||||
getConfigs: PropTypes.any
|
||||
}
|
||||
|
||||
constructor(props, context) {
|
||||
@@ -172,7 +172,7 @@ export default class Oauth2 extends React.Component {
|
||||
}
|
||||
|
||||
{
|
||||
!isAuthorized && flow !== PASSWORD && scopes && scopes.size ? <div className="scopes">
|
||||
!isAuthorized && scopes && scopes.size ? <div className="scopes">
|
||||
<h2>Scopes:</h2>
|
||||
{ scopes.map((description, name) => {
|
||||
return (
|
||||
|
||||
@@ -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 = ()=>{}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -58,7 +58,7 @@ class License extends React.Component {
|
||||
return (
|
||||
<div>
|
||||
{
|
||||
url ? <a href={ url }>{ name }</a>
|
||||
url ? <a target="_blank" href={ url }>{ name }</a>
|
||||
: <span>{ name }</span>
|
||||
}
|
||||
</div>
|
||||
@@ -95,7 +95,7 @@ export default class Info extends React.Component {
|
||||
{ version && <small><pre className="version"> { version } </pre></small> }
|
||||
</h2>
|
||||
{ host || basePath ? <Path host={ host } basePath={ basePath } /> : null }
|
||||
{ url && <a href={ url }><span className="url"> { url } </span></a> }
|
||||
{ url && <a target="_blank" href={ url }><span className="url"> { url } </span></a> }
|
||||
</hgroup>
|
||||
|
||||
<div className="description">
|
||||
@@ -104,7 +104,7 @@ export default class Info extends React.Component {
|
||||
|
||||
{
|
||||
termsOfService && <div>
|
||||
<a href={ termsOfService }>Terms of service</a>
|
||||
<a target="_blank" href={ termsOfService }>Terms of service</a>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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" }
|
||||
@@ -170,7 +168,10 @@ class ArrayModel extends Component {
|
||||
let { required, schema, depth, expandDepth } = this.props
|
||||
let items = schema.get("items")
|
||||
|
||||
return <span>
|
||||
return <span className="model">
|
||||
<span className="model-title">
|
||||
<span className="model-title__text">{ schema.get("title") }</span>
|
||||
</span>
|
||||
<Collapse collapsed={ depth > expandDepth } collapsedContent="[...]">
|
||||
[
|
||||
<span><Model { ...this.props } schema={ items } required={ false }/></span>
|
||||
@@ -251,9 +252,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>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
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
|
||||
let { validatorUrl } = getConfigs()
|
||||
this.state = {
|
||||
url: specSelectors.url(),
|
||||
validatorUrl: validatorUrl || "https://online.swagger.io/validator"
|
||||
validatorUrl: validatorUrl === undefined ? "https://online.swagger.io/validator" : validatorUrl
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +23,7 @@ export default class OnlineValidatorBadge extends React.Component {
|
||||
|
||||
this.setState({
|
||||
url: specSelectors.url(),
|
||||
validatorUrl: validatorUrl || "https://online.swagger.io/validator"
|
||||
validatorUrl: validatorUrl === undefined ? "https://online.swagger.io/validator" : validatorUrl
|
||||
})
|
||||
}
|
||||
|
||||
@@ -27,14 +33,72 @@ export default class OnlineValidatorBadge extends React.Component {
|
||||
|
||||
if ( typeof spec === "object" && Object.keys(spec).length) return null
|
||||
|
||||
if (!this.state.url) {
|
||||
if (!this.state.url || !this.state.validatorUrl || this.state.url.indexOf("localhost") >= 0
|
||||
|| this.state.url.indexOf("127.0.0.1") >= 0) {
|
||||
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 }`} />
|
||||
<ValidatorImage src={`${ this.state.validatorUrl }?url=${ this.state.url }`} alt="Online validator badge"/>
|
||||
</a>
|
||||
</span>)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class ValidatorImage extends React.Component {
|
||||
static propTypes = {
|
||||
src: PropTypes.string,
|
||||
alt: PropTypes.string
|
||||
}
|
||||
|
||||
constructor(props) {
|
||||
super(props)
|
||||
this.state = {
|
||||
loaded: false,
|
||||
error: false
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
const img = new Image()
|
||||
img.onload = () => {
|
||||
this.setState({
|
||||
loaded: true
|
||||
})
|
||||
}
|
||||
img.onerror = () => {
|
||||
this.setState({
|
||||
error: true
|
||||
})
|
||||
}
|
||||
img.src = this.props.src
|
||||
}
|
||||
|
||||
componentWillReceiveProps(nextProps) {
|
||||
if (nextProps.src !== this.props.src) {
|
||||
const img = new Image()
|
||||
img.onload = () => {
|
||||
this.setState({
|
||||
loaded: true
|
||||
})
|
||||
}
|
||||
img.onerror = () => {
|
||||
this.setState({
|
||||
error: true
|
||||
})
|
||||
}
|
||||
img.src = nextProps.src
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
if (this.state.error) {
|
||||
return <img alt={"Error"} />
|
||||
} else if (!this.state.loaded) {
|
||||
return <img alt= {"Loading..."} />
|
||||
}
|
||||
return <img src={this.props.src} alt={this.props.alt} />
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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 ) => {
|
||||
|
||||
@@ -17,8 +17,6 @@ export default class Schemes extends React.Component {
|
||||
}
|
||||
|
||||
onChange =( e ) => {
|
||||
let { path, method, specActions } = this.props
|
||||
|
||||
this.setScheme( e.target.value )
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
+4
-4
@@ -14,8 +14,8 @@ module.exports = function SwaggerUI(opts) {
|
||||
spec: {},
|
||||
url: "",
|
||||
layout: "Layout",
|
||||
validatorUrl: "https://online.swagger.io/validator",
|
||||
configs: {
|
||||
validatorUrl: "https://online.swagger.io/validator"
|
||||
},
|
||||
|
||||
// Initial set of plugins ( TODO rename this, or refactor - we don't need presets _and_ plugins. Its just there for performance.
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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))) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,8 @@ export const PRE_AUTHORIZE_OAUTH2 = "pre_authorize_oauth2"
|
||||
export const AUTHORIZE_OAUTH2 = "authorize_oauth2"
|
||||
export const VALIDATE = "validate"
|
||||
|
||||
const scopeSeparator = " "
|
||||
|
||||
export function showDefinitions(payload) {
|
||||
return {
|
||||
type: SHOW_AUTH_POPUP,
|
||||
@@ -77,7 +79,8 @@ export const authorizePassword = ( auth ) => ( { fn, authActions, errActions } )
|
||||
query: {
|
||||
grant_type: "password",
|
||||
username,
|
||||
password
|
||||
password,
|
||||
scopes: encodeURIComponent(auth.scopes.join(scopeSeparator))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 })
|
||||
}
|
||||
|
||||
|
||||
@@ -4,14 +4,16 @@ 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 }) => {
|
||||
let { fetch } = fn
|
||||
url = url || specSelectors.url()
|
||||
specActions.updateLoadingStatus("loading")
|
||||
fetch(url, {
|
||||
fetch({
|
||||
url,
|
||||
loadSpec: true,
|
||||
headers: {
|
||||
"Accept": "application/json"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import concat from "lodash/concat"
|
||||
import reduce from "lodash/reduce"
|
||||
let request = require.context("./transformers/", true, /\.js$/)
|
||||
let errorTransformers = []
|
||||
|
||||
@@ -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 😃
|
||||
|
||||
@@ -127,8 +127,12 @@ export const sampleXmlFromSchema = (schema, config={}) => {
|
||||
|
||||
if (xml.wrapped) {
|
||||
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)=>{
|
||||
items.default = v
|
||||
res[displayName].push(sampleXmlFromSchema(items, config))
|
||||
@@ -145,14 +149,20 @@ export const sampleXmlFromSchema = (schema, config={}) => {
|
||||
|
||||
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)=>{
|
||||
items.default = v
|
||||
_res.push(sampleXmlFromSchema(items, config))
|
||||
})
|
||||
return _res
|
||||
|
||||
}
|
||||
|
||||
return sampleXmlFromSchema(items, config)
|
||||
}
|
||||
}
|
||||
@@ -176,7 +186,13 @@ export const sampleXmlFromSchema = (schema, config={}) => {
|
||||
} else {
|
||||
props[propName].xml.name = props[propName].xml.name || 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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,9 +184,9 @@ 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, specSelectors}) => {
|
||||
let { pathName, method } = req
|
||||
let parsedRequest = Object.assign({}, req)
|
||||
let parsedRequest = Object.assign({ contextUrl: specSelectors.url() }, req)
|
||||
if ( pathName && method ) {
|
||||
parsedRequest.operationId = method.toLowerCase() + "-" + pathName
|
||||
}
|
||||
|
||||
@@ -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++ ) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import BasePreset from "./base"
|
||||
|
||||
import allowTryItOutIfHost from "core/plugins/allow-try-it-out-if-host"
|
||||
// Just the base, for now.
|
||||
|
||||
export default function PresetApis() {
|
||||
|
||||
return [
|
||||
BasePreset,
|
||||
allowTryItOutIfHost,
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
+24
-42
@@ -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
|
||||
}
|
||||
|
||||
+25
-17
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
@@ -70,4 +70,4 @@ export function filterConfigs (configs) {
|
||||
}
|
||||
|
||||
return filteredConfigs
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import Topbar from './topbar.jsx'
|
||||
import Topbar from "./topbar.jsx"
|
||||
|
||||
export default function () {
|
||||
return {
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -14,4 +14,4 @@ let preset = [
|
||||
}
|
||||
]
|
||||
|
||||
export default preset
|
||||
module.exports = preset
|
||||
|
||||
@@ -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)
|
||||
@@ -66,16 +66,29 @@ export default class StandaloneLayout extends React.Component {
|
||||
) : null }
|
||||
</Col>
|
||||
</Row>
|
||||
{ schemes && schemes.size && securityDefinitions ? (
|
||||
<div className="scheme-container">
|
||||
<Col className="schemes wrapper" mobile={12}>
|
||||
{ schemes && schemes.size ? (
|
||||
<Schemes schemes={ schemes } specActions={ specActions } />
|
||||
<Schemes schemes={ schemes } specActions={ specActions } />
|
||||
) : null }
|
||||
{ securityDefinitions ? (
|
||||
<AuthorizeBtn />
|
||||
) : null }
|
||||
</Col>
|
||||
</div>
|
||||
) : null }
|
||||
|
||||
{ (!schemes || !schemes.size) && securityDefinitions ? (
|
||||
<div className="scheme-container">
|
||||
<Col className="schemes wrapper" mobile={12}>
|
||||
{ securityDefinitions ? (
|
||||
<AuthorizeBtn />
|
||||
) : null }
|
||||
</Col>
|
||||
</div>
|
||||
) : null }
|
||||
|
||||
<Row>
|
||||
<Col mobile={12} desktop={12} >
|
||||
<Operations/>
|
||||
|
||||
@@ -136,8 +136,8 @@
|
||||
|
||||
svg
|
||||
{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -482,6 +482,8 @@ body
|
||||
margin: 0;
|
||||
padding: 10px;
|
||||
|
||||
white-space: pre-wrap;
|
||||
|
||||
border-radius: 4px;
|
||||
background: #41444e;
|
||||
|
||||
|
||||
@@ -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: ()=>{}},
|
||||
|
||||
+16
-16
@@ -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\\\"}\"")
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
@@ -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(){
|
||||
|
||||
@@ -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()
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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", () => {
|
||||
|
||||
@@ -396,7 +396,7 @@ describe("createXMLExample", 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 = {
|
||||
items: {
|
||||
"enum": ["one", "two"],
|
||||
@@ -405,6 +405,7 @@ describe("createXMLExample", function () {
|
||||
name: "animal"
|
||||
}
|
||||
},
|
||||
"default": ["1", "2"],
|
||||
xml: {
|
||||
wrapped: true,
|
||||
name: "animals"
|
||||
@@ -413,8 +414,53 @@ describe("createXMLExample", function () {
|
||||
|
||||
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 () {
|
||||
it("returns object with 2 properties", function () {
|
||||
var expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<aliens>\n\t<alien>string</alien>\n\t<dog>0</dog>\n</aliens>"
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
+2
-1
@@ -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" }
|
||||
}
|
||||
@@ -256,7 +257,7 @@ describe("bound system", function(){
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
})
|
||||
|
||||
describe("selectors", function(){
|
||||
|
||||
+1
-1
@@ -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"
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ module.exports = require('./make-webpack-config.js')({
|
||||
|
||||
entry: {
|
||||
'swagger-ui-bundle': [
|
||||
'babel-polyfill',
|
||||
'./src/core/index.js'
|
||||
]
|
||||
},
|
||||
|
||||
@@ -15,6 +15,7 @@ module.exports = require('./make-webpack-config.js')({
|
||||
|
||||
entry: {
|
||||
"swagger-ui": [
|
||||
'babel-polyfill',
|
||||
'./src/style/main.scss',
|
||||
'./src/core/index.js'
|
||||
]
|
||||
|
||||
@@ -9,10 +9,11 @@ module.exports = require("./make-webpack-config")({
|
||||
},
|
||||
devtool: "eval",
|
||||
entry: {
|
||||
'SwaggerUIBundle': [
|
||||
'swagger-ui-bundle': [
|
||||
'babel-polyfill',
|
||||
'./src/core/index.js'
|
||||
],
|
||||
'SwaggerUIStandalonePreset': [
|
||||
'swagger-ui-standalone-preset': [
|
||||
'./src/standalone/index.js'
|
||||
]
|
||||
},
|
||||
@@ -26,8 +27,8 @@ module.exports = require("./make-webpack-config")({
|
||||
},
|
||||
devServer: {
|
||||
port: 3200,
|
||||
path: path.join(__dirname, 'dist'),
|
||||
publicPath: "/dist",
|
||||
path: path.join(__dirname, 'dev-helpers'),
|
||||
publicPath: "/",
|
||||
noInfo: true,
|
||||
colors: true,
|
||||
hot: true,
|
||||
|
||||
Reference in New Issue
Block a user