Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f23be7d8f5 | ||
|
|
1be0a6df60 | ||
|
|
8a8aeeb119 | ||
|
|
abe17f92ef |
@@ -22,7 +22,7 @@ The OpenAPI Specification has undergone 5 revisions since initial creation in 20
|
|||||||
|
|
||||||
Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes
|
Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes
|
||||||
------------------ | ------------ | -------------------------- | -----
|
------------------ | ------------ | -------------------------- | -----
|
||||||
3.13.5 | 2018-04-20 | 2.0, 3.0 | [tag v3.13.5](https://github.com/swagger-api/swagger-ui/tree/v3.13.5)
|
3.13.4 | 2018-04-15 | 2.0, 3.0 | [tag v3.13.4](https://github.com/swagger-api/swagger-ui/tree/v3.13.4)
|
||||||
3.0.21 | 2017-07-26 | 2.0 | [tag v3.0.21](https://github.com/swagger-api/swagger-ui/tree/v3.0.21)
|
3.0.21 | 2017-07-26 | 2.0 | [tag v3.0.21](https://github.com/swagger-api/swagger-ui/tree/v3.0.21)
|
||||||
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.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.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)
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
openapi: "3.0.0"
|
|
||||||
info:
|
|
||||||
version: 1.0.0
|
|
||||||
title: Brentertainment OAuth2 Test Server
|
|
||||||
description: >
|
|
||||||
The server does not support CORS (yet?), so you need to take the strange step of disabling Same-Origin Policy in your browser.
|
|
||||||
[Here](https://www.thepolyglotdeveloper.com/2014/08/bypass-cors-errors-testing-apis-locally/) are some instructions.
|
|
||||||
license:
|
|
||||||
name: MIT
|
|
||||||
servers:
|
|
||||||
- url: http://brentertainment.com/oauth2/lockdin/
|
|
||||||
paths:
|
|
||||||
/resource:
|
|
||||||
get:
|
|
||||||
description: Protected resource
|
|
||||||
security:
|
|
||||||
- oauth2AuthorizationCode: ["resource"]
|
|
||||||
- oauth2Implicit: ["resource"]
|
|
||||||
- oauth2Password: ["resource"]
|
|
||||||
- oauth2ClientCredentials: ["resource"]
|
|
||||||
- oauth2Multiflow: ["resource"]
|
|
||||||
responses:
|
|
||||||
200:
|
|
||||||
description: the only response
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
type: array
|
|
||||||
items:
|
|
||||||
type: string
|
|
||||||
components:
|
|
||||||
securitySchemes:
|
|
||||||
oauth2AuthorizationCode:
|
|
||||||
type: oauth2
|
|
||||||
flows:
|
|
||||||
authorizationCode:
|
|
||||||
authorizationUrl: "http://brentertainment.com/oauth2/lockdin/authorize"
|
|
||||||
tokenUrl: "http://brentertainment.com/oauth2/lockdin/token"
|
|
||||||
scopes:
|
|
||||||
resource: our only scope
|
|
||||||
oauth2Implicit:
|
|
||||||
type: oauth2
|
|
||||||
flows:
|
|
||||||
implicit:
|
|
||||||
authorizationUrl: "http://brentertainment.com/oauth2/lockdin/authorize"
|
|
||||||
scopes:
|
|
||||||
resource: our only scope
|
|
||||||
oauth2Password:
|
|
||||||
type: oauth2
|
|
||||||
flows:
|
|
||||||
password:
|
|
||||||
tokenUrl: "http://brentertainment.com/oauth2/lockdin/token"
|
|
||||||
scopes:
|
|
||||||
resource: our only scope
|
|
||||||
oauth2ClientCredentials:
|
|
||||||
type: oauth2
|
|
||||||
flows:
|
|
||||||
clientCredentials:
|
|
||||||
tokenUrl: "http://brentertainment.com/oauth2/lockdin/token"
|
|
||||||
scopes:
|
|
||||||
resource: our only scope
|
|
||||||
oauth2Multiflow:
|
|
||||||
type: oauth2
|
|
||||||
flows:
|
|
||||||
clientCredentials:
|
|
||||||
tokenUrl: "http://brentertainment.com/oauth2/lockdin/token"
|
|
||||||
scopes:
|
|
||||||
resource: our only scope
|
|
||||||
password:
|
|
||||||
tokenUrl: "http://brentertainment.com/oauth2/lockdin/token"
|
|
||||||
scopes:
|
|
||||||
resource: our only scope
|
|
||||||
implicit:
|
|
||||||
authorizationUrl: "http://brentertainment.com/oauth2/lockdin/authorize"
|
|
||||||
scopes:
|
|
||||||
resource: our only scope
|
|
||||||
authorizationCode:
|
|
||||||
authorizationUrl: "http://brentertainment.com/oauth2/lockdin/authorize"
|
|
||||||
tokenUrl: "http://brentertainment.com/oauth2/lockdin/token"
|
|
||||||
scopes:
|
|
||||||
resource: our only scope
|
|
||||||
Vendored
+10
-10
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+2
-2
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -68,7 +68,7 @@ There is no dependency management built into the plugin system, so if you create
|
|||||||
|
|
||||||
### Interfaces
|
### Interfaces
|
||||||
|
|
||||||
#### Actions
|
##### Actions
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const MyActionPlugin = () => {
|
const MyActionPlugin = () => {
|
||||||
@@ -102,7 +102,7 @@ This action creator function will be exposed to container components as `example
|
|||||||
|
|
||||||
For more information about the concept of actions in Redux, see the [Redux Actions documentation](http://redux.js.org/docs/basics/Actions.html).
|
For more information about the concept of actions in Redux, see the [Redux Actions documentation](http://redux.js.org/docs/basics/Actions.html).
|
||||||
|
|
||||||
#### Reducers
|
##### Reducers
|
||||||
|
|
||||||
Reducers take a state (which is an [Immutable.js map](https://facebook.github.io/immutable-js/docs/#/Map)) and an action, and return a new state.
|
Reducers take a state (which is an [Immutable.js map](https://facebook.github.io/immutable-js/docs/#/Map)) and an action, and return a new state.
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ const MyReducerPlugin = function(system) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Selectors
|
##### Selectors
|
||||||
|
|
||||||
Selectors reach into their namespace's state to retrieve or derive data from the state.
|
Selectors reach into their namespace's state to retrieve or derive data from the state.
|
||||||
|
|
||||||
@@ -172,7 +172,7 @@ Once a selector has been defined, you can use it anywhere that you can get a sys
|
|||||||
system.exampleSelectors.myFavoriteColor() // gets `favColor` in state for you
|
system.exampleSelectors.myFavoriteColor() // gets `favColor` in state for you
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Components
|
##### Components
|
||||||
|
|
||||||
You can provide a map of components to be integrated into the system.
|
You can provide a map of components to be integrated into the system.
|
||||||
|
|
||||||
@@ -214,7 +214,7 @@ const NeverShowInfoPlugin = function(system) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Wrap-Actions
|
##### Wrap-Actions
|
||||||
|
|
||||||
Wrap Actions allow you to override the behavior of an action in the system.
|
Wrap Actions allow you to override the behavior of an action in the system.
|
||||||
|
|
||||||
@@ -262,7 +262,7 @@ const MyWrapActionPlugin = function(system) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Wrap-Selectors
|
##### Wrap-Selectors
|
||||||
|
|
||||||
Wrap Selectors allow you to override the behavior of a selector in the system.
|
Wrap Selectors allow you to override the behavior of a selector in the system.
|
||||||
|
|
||||||
@@ -307,7 +307,7 @@ const MyWrapSelectorsPlugin = function(system) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Wrap-Components
|
##### Wrap-Components
|
||||||
|
|
||||||
Wrap Components allow you to override a component registered within the system.
|
Wrap Components allow you to override a component registered within the system.
|
||||||
|
|
||||||
@@ -381,7 +381,7 @@ const MyWrapComponentPlugin = function(system) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `rootInjects`
|
##### `rootInjects`
|
||||||
|
|
||||||
The `rootInjects` interface allows you to inject values at the top level of the system.
|
The `rootInjects` interface allows you to inject values at the top level of the system.
|
||||||
|
|
||||||
@@ -398,7 +398,7 @@ const MyRootInjectsPlugin = function(system) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `afterLoad`
|
##### `afterLoad`
|
||||||
|
|
||||||
The `afterLoad` plugin method allows you to get a reference to the system after your plugin has been registered.
|
The `afterLoad` plugin method allows you to get a reference to the system after your plugin has been registered.
|
||||||
|
|
||||||
@@ -431,7 +431,7 @@ const MyMethodProvidingPlugin = function() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### fn
|
##### fn
|
||||||
|
|
||||||
The fn interface allows you to add helper functions to the system for use elsewhere.
|
The fn interface allows you to add helper functions to the system for use elsewhere.
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ Parameter Name | Description
|
|||||||
`maxDisplayedTags` | `Number`. If set, limits the number of tagged operations displayed to at most this many. The default is to show all operations.
|
`maxDisplayedTags` | `Number`. If set, limits the number of tagged operations displayed to at most this many. The default is to show all operations.
|
||||||
`operationsSorter` | `Function=(a => a)`. Apply a sort to the operation list of each API. It can be 'alpha' (sort by paths alphanumerically), 'method' (sort by HTTP method) or a function (see Array.prototype.sort() to know how sort function works). Default is the order returned by the server unchanged.
|
`operationsSorter` | `Function=(a => a)`. Apply a sort to the operation list of each API. It can be 'alpha' (sort by paths alphanumerically), 'method' (sort by HTTP method) or a function (see Array.prototype.sort() to know how sort function works). Default is the order returned by the server unchanged.
|
||||||
`showExtensions` | `Boolean=false`. Controls the display of vendor extension (`x-`) fields and values for Operations, Parameters, and Schema.
|
`showExtensions` | `Boolean=false`. Controls the display of vendor extension (`x-`) fields and values for Operations, Parameters, and Schema.
|
||||||
`showCommonExtensions` | `Boolean=false`. Controls the display of extensions (`pattern`, `maxLength`, `minLength`, `maximum`, `minimum`) fields and values for Parameters.
|
|
||||||
`tagsSorter` | `Function=(a => a)`. Apply a sort to the tag list of each API. It can be 'alpha' (sort by paths alphanumerically) or a function (see [Array.prototype.sort()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) to learn how to write a sort function). Two tag name strings are passed to the sorter for each pass. Default is the order determined by Swagger-UI.
|
`tagsSorter` | `Function=(a => a)`. Apply a sort to the tag list of each API. It can be 'alpha' (sort by paths alphanumerically) or a function (see [Array.prototype.sort()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) to learn how to write a sort function). Two tag name strings are passed to the sorter for each pass. Default is the order determined by Swagger-UI.
|
||||||
`onComplete` | `Function=NOOP`. Provides a mechanism to be notified when Swagger-UI has finished rendering a newly provided definition.
|
`onComplete` | `Function=NOOP`. Provides a mechanism to be notified when Swagger-UI has finished rendering a newly provided definition.
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "swagger-ui",
|
"name": "swagger-ui",
|
||||||
"version": "3.13.6",
|
"version": "3.13.4",
|
||||||
"main": "dist/swagger-ui.js",
|
"main": "dist/swagger-ui.js",
|
||||||
"repository": "git@github.com:swagger-api/swagger-ui.git",
|
"repository": "git@github.com:swagger-api/swagger-ui.git",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
"scroll-to-element": "^2.0.0",
|
"scroll-to-element": "^2.0.0",
|
||||||
"serialize-error": "2.0.0",
|
"serialize-error": "2.0.0",
|
||||||
"shallowequal": "0.2.2",
|
"shallowequal": "0.2.2",
|
||||||
"swagger-client": "^3.7.2",
|
"swagger-client": "^3.7.0",
|
||||||
"url-parse": "^1.1.8",
|
"url-parse": "^1.1.8",
|
||||||
"whatwg-fetch": "0.11.1",
|
"whatwg-fetch": "0.11.1",
|
||||||
"worker-loader": "^0.7.1",
|
"worker-loader": "^0.7.1",
|
||||||
|
|||||||
@@ -99,13 +99,10 @@ export default class Auths extends React.Component {
|
|||||||
{
|
{
|
||||||
definitions.filter( schema => schema.get("type") === "oauth2")
|
definitions.filter( schema => schema.get("type") === "oauth2")
|
||||||
.map( (schema, name) =>{
|
.map( (schema, name) =>{
|
||||||
const { flow } = schema
|
return (<div key={ name }>
|
||||||
const key = [name, flow].join("__").slice(0, -2)
|
|
||||||
return (<div key={ key }>
|
|
||||||
<Oauth2 authorized={ authorized }
|
<Oauth2 authorized={ authorized }
|
||||||
schema={ schema }
|
schema={ schema }
|
||||||
authId={ key }
|
name={ name } />
|
||||||
name={ key || schema.get("name") || name } />
|
|
||||||
</div>)
|
</div>)
|
||||||
}
|
}
|
||||||
).toArray()
|
).toArray()
|
||||||
|
|||||||
@@ -47,11 +47,11 @@ export default class Oauth2 extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
authorize =() => {
|
authorize =() => {
|
||||||
let { authActions, errActions, getConfigs, authSelectors, authId } = this.props
|
let { authActions, errActions, getConfigs, authSelectors } = this.props
|
||||||
let configs = getConfigs()
|
let configs = getConfigs()
|
||||||
let authConfigs = authSelectors.getConfigs()
|
let authConfigs = authSelectors.getConfigs()
|
||||||
|
|
||||||
errActions.clear({authId: authId ,type: "auth", source: "auth"})
|
errActions.clear({authId: name,type: "auth", source: "auth"})
|
||||||
oauth2Authorize({auth: this.state, authActions, errActions, configs, authConfigs })
|
oauth2Authorize({auth: this.state, authActions, errActions, configs, authConfigs })
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,15 +79,15 @@ export default class Oauth2 extends React.Component {
|
|||||||
|
|
||||||
logout =(e) => {
|
logout =(e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
let { authActions, errActions, authId } = this.props
|
let { authActions, errActions, name } = this.props
|
||||||
|
|
||||||
errActions.clear({authId: authId, type: "auth", source: "auth"})
|
errActions.clear({authId: name, type: "auth", source: "auth"})
|
||||||
authActions.logout([ authId ])
|
authActions.logout([ name ])
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let {
|
let {
|
||||||
schema, getComponent, authSelectors, errSelectors, name, authId, specSelectors
|
schema, getComponent, authSelectors, errSelectors, name, specSelectors
|
||||||
} = this.props
|
} = this.props
|
||||||
const Input = getComponent("Input")
|
const Input = getComponent("Input")
|
||||||
const Row = getComponent("Row")
|
const Row = getComponent("Row")
|
||||||
@@ -107,9 +107,9 @@ export default class Oauth2 extends React.Component {
|
|||||||
|
|
||||||
let flow = schema.get("flow")
|
let flow = schema.get("flow")
|
||||||
let scopes = schema.get("allowedScopes") || schema.get("scopes")
|
let scopes = schema.get("allowedScopes") || schema.get("scopes")
|
||||||
let authorizedAuth = authSelectors.authorized().get(authId)
|
let authorizedAuth = authSelectors.authorized().get(name)
|
||||||
let isAuthorized = !!authorizedAuth
|
let isAuthorized = !!authorizedAuth
|
||||||
let errors = errSelectors.allErrors().filter( err => err.get("authId") === authId)
|
let errors = errSelectors.allErrors().filter( err => err.get("authId") === name)
|
||||||
let isValid = !errors.filter( err => err.get("source") === "validation").size
|
let isValid = !errors.filter( err => err.get("source") === "validation").size
|
||||||
let description = schema.get("description")
|
let description = schema.get("description")
|
||||||
|
|
||||||
|
|||||||
@@ -36,11 +36,10 @@ export default class HighlightCode extends Component {
|
|||||||
|
|
||||||
const scrollOffset = visibleHeight + scrollTop
|
const scrollOffset = visibleHeight + scrollTop
|
||||||
|
|
||||||
const isElementScrollable = contentHeight > visibleHeight
|
|
||||||
const isScrollingPastTop = scrollTop === 0 && deltaY < 0
|
const isScrollingPastTop = scrollTop === 0 && deltaY < 0
|
||||||
const isScrollingPastBottom = scrollOffset >= contentHeight && deltaY > 0
|
const isScrollingPastBottom = scrollOffset >= contentHeight && deltaY > 0
|
||||||
|
|
||||||
if (isElementScrollable && (isScrollingPastTop || isScrollingPastBottom)) {
|
if (isScrollingPastTop || isScrollingPastBottom) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Map } from "immutable"
|
|||||||
import PropTypes from "prop-types"
|
import PropTypes from "prop-types"
|
||||||
import ImPropTypes from "react-immutable-proptypes"
|
import ImPropTypes from "react-immutable-proptypes"
|
||||||
import win from "core/window"
|
import win from "core/window"
|
||||||
import { getExtensions, getCommonExtensions } from "core/utils"
|
import { getExtensions } from "core/utils"
|
||||||
|
|
||||||
export default class ParameterRow extends Component {
|
export default class ParameterRow extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
@@ -82,7 +82,7 @@ export default class ParameterRow extends Component {
|
|||||||
|
|
||||||
let { isOAS3 } = specSelectors
|
let { isOAS3 } = specSelectors
|
||||||
|
|
||||||
const { showExtensions, showCommonExtensions } = getConfigs()
|
const { showExtensions } = getConfigs()
|
||||||
|
|
||||||
// const onChangeWrapper = (value) => onChange(param, value)
|
// const onChangeWrapper = (value) => onChange(param, value)
|
||||||
const JsonSchemaForm = getComponent("JsonSchemaForm")
|
const JsonSchemaForm = getComponent("JsonSchemaForm")
|
||||||
@@ -106,17 +106,15 @@ export default class ParameterRow extends Component {
|
|||||||
const ParameterExt = getComponent("ParameterExt")
|
const ParameterExt = getComponent("ParameterExt")
|
||||||
|
|
||||||
let paramWithMeta = specSelectors.parameterWithMeta(pathMethod, param.get("name"), param.get("in"))
|
let paramWithMeta = specSelectors.parameterWithMeta(pathMethod, param.get("name"), param.get("in"))
|
||||||
let format = param.get("format")
|
|
||||||
let schema = isOAS3 && isOAS3() ? param.get("schema") : param
|
let schema = isOAS3 && isOAS3() ? param.get("schema") : param
|
||||||
let type = schema.get("type")
|
let type = schema.get("type")
|
||||||
let isFormData = inType === "formData"
|
let isFormData = inType === "formData"
|
||||||
let isFormDataSupported = "FormData" in win
|
let isFormDataSupported = "FormData" in win
|
||||||
let required = param.get("required")
|
let required = param.get("required")
|
||||||
let itemType = schema.getIn(["items", "type"])
|
let itemType = schema.getIn(["items", "type"])
|
||||||
|
|
||||||
let value = paramWithMeta ? paramWithMeta.get("value") : ""
|
let value = paramWithMeta ? paramWithMeta.get("value") : ""
|
||||||
let commonExt = showCommonExtensions ? getCommonExtensions(param) : null
|
let extensions = getExtensions(param)
|
||||||
let extensions = showExtensions ? getExtensions(param) : null
|
|
||||||
|
|
||||||
let paramItems // undefined
|
let paramItems // undefined
|
||||||
let paramEnum // undefined
|
let paramEnum // undefined
|
||||||
@@ -155,16 +153,11 @@ export default class ParameterRow extends Component {
|
|||||||
{ param.get("name") }
|
{ param.get("name") }
|
||||||
{ !required ? null : <span style={{color: "red"}}> *</span> }
|
{ !required ? null : <span style={{color: "red"}}> *</span> }
|
||||||
</div>
|
</div>
|
||||||
<div className="parameter__type">
|
<div className="parameter__type">{ type } { itemType && `[${itemType}]` }</div>
|
||||||
{ type }
|
|
||||||
{ itemType && `[${itemType}]` }
|
|
||||||
{ format && <span className="prop-format">(${format})</span>}
|
|
||||||
</div>
|
|
||||||
<div className="parameter__deprecated">
|
<div className="parameter__deprecated">
|
||||||
{ isOAS3 && isOAS3() && param.get("deprecated") ? "deprecated": null }
|
{ isOAS3 && isOAS3() && param.get("deprecated") ? "deprecated": null }
|
||||||
</div>
|
</div>
|
||||||
<div className="parameter__in">({ param.get("in") })</div>
|
<div className="parameter__in">({ param.get("in") })</div>
|
||||||
{ !showCommonExtensions || !commonExt.size ? null : commonExt.map((v, key) => <ParameterExt key={`${key}-${v}`} xKey={key} xVal={v} /> )}
|
|
||||||
{ !showExtensions || !extensions.size ? null : extensions.map((v, key) => <ParameterExt key={`${key}-${v}`} xKey={key} xVal={v} /> )}
|
{ !showExtensions || !extensions.size ? null : extensions.map((v, key) => <ParameterExt key={`${key}-${v}`} xKey={key} xVal={v} /> )}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ function Markdown({ source, className = "" }) {
|
|||||||
|
|
||||||
Markdown.propTypes = {
|
Markdown.propTypes = {
|
||||||
source: PropTypes.string.isRequired,
|
source: PropTypes.string.isRequired,
|
||||||
className: PropTypes.string
|
className: PropTypes.string.isRequired
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Markdown
|
export default Markdown
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ module.exports = function SwaggerUI(opts) {
|
|||||||
defaultModelExpandDepth: 1,
|
defaultModelExpandDepth: 1,
|
||||||
defaultModelsExpandDepth: 1,
|
defaultModelsExpandDepth: 1,
|
||||||
showExtensions: false,
|
showExtensions: false,
|
||||||
showCommonExtensions: false,
|
|
||||||
supportedSubmitMethods: [
|
supportedSubmitMethods: [
|
||||||
"get",
|
"get",
|
||||||
"put",
|
"put",
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
import YAML from "js-yaml"
|
|
||||||
|
|
||||||
export const parseYamlConfig = (yaml, system) => {
|
|
||||||
try {
|
|
||||||
return YAML.safeLoad(yaml)
|
|
||||||
} catch(e) {
|
|
||||||
if (system) {
|
|
||||||
system.errActions.newThrownErr( new Error(e) )
|
|
||||||
}
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,46 @@
|
|||||||
|
import YAML from "js-yaml"
|
||||||
import yamlConfig from "root/swagger-config.yaml"
|
import yamlConfig from "root/swagger-config.yaml"
|
||||||
import { parseYamlConfig } from "./helpers"
|
|
||||||
import * as actions from "./actions"
|
import * as actions from "./actions"
|
||||||
import * as specActions from "./spec-actions"
|
|
||||||
import * as selectors from "./selectors"
|
import * as selectors from "./selectors"
|
||||||
import reducers from "./reducers"
|
import reducers from "./reducers"
|
||||||
|
|
||||||
|
const parseYamlConfig = (yaml, system) => {
|
||||||
|
try {
|
||||||
|
return YAML.safeLoad(yaml)
|
||||||
|
} catch(e) {
|
||||||
|
if (system) {
|
||||||
|
system.errActions.newThrownErr( new Error(e) )
|
||||||
|
}
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const specActions = {
|
||||||
|
downloadConfig: (url) => ({fn}) => {
|
||||||
|
let {fetch} = fn
|
||||||
|
return fetch(url)
|
||||||
|
},
|
||||||
|
|
||||||
|
getConfigByUrl: (configUrl, cb)=> ({ specActions }) => {
|
||||||
|
if (configUrl) {
|
||||||
|
return specActions.downloadConfig(configUrl).then(next, next)
|
||||||
|
}
|
||||||
|
|
||||||
|
function next(res) {
|
||||||
|
if (res instanceof Error || res.status >= 400) {
|
||||||
|
specActions.updateLoadingStatus("failedConfig")
|
||||||
|
specActions.updateLoadingStatus("failedConfig")
|
||||||
|
specActions.updateUrl("")
|
||||||
|
console.error(res.statusText + " " + configUrl)
|
||||||
|
cb(null)
|
||||||
|
} else {
|
||||||
|
cb(parseYamlConfig(res.text))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const specSelectors = {
|
const specSelectors = {
|
||||||
getLocalConfig: () => {
|
getLocalConfig: () => {
|
||||||
return parseYamlConfig(yamlConfig)
|
return parseYamlConfig(yamlConfig)
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
import { parseYamlConfig } from "./helpers"
|
|
||||||
|
|
||||||
export const downloadConfig = (url) => ({fn: { fetch }, getConfigs}) => {
|
|
||||||
const { requestInterceptor, responseInterceptor } = getConfigs()
|
|
||||||
let req = { url }
|
|
||||||
if(requestInterceptor) {
|
|
||||||
req = requestInterceptor(req)
|
|
||||||
}
|
|
||||||
return fetch(req)
|
|
||||||
.then(res => {
|
|
||||||
if(res) {
|
|
||||||
return responseInterceptor(res)
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export const getConfigByUrl = (configUrl, cb)=> ({ specActions }) => {
|
|
||||||
if (configUrl) {
|
|
||||||
return specActions.downloadConfig(configUrl).then(next, next)
|
|
||||||
}
|
|
||||||
|
|
||||||
function next(res) {
|
|
||||||
if (res instanceof Error || res.status >= 400) {
|
|
||||||
specActions.updateLoadingStatus("failedConfig")
|
|
||||||
specActions.updateLoadingStatus("failedConfig")
|
|
||||||
specActions.updateUrl("")
|
|
||||||
console.error(res.statusText + " " + configUrl)
|
|
||||||
cb(null)
|
|
||||||
} else {
|
|
||||||
cb(parseYamlConfig(res.text))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -33,7 +33,6 @@ export const definitionsToAuthorize = onlyOAS3(createSelector(
|
|||||||
definition.get("flows").entrySeq().forEach(([flowKey, flowVal]) => {
|
definition.get("flows").entrySeq().forEach(([flowKey, flowVal]) => {
|
||||||
let translatedDef = fromJS({
|
let translatedDef = fromJS({
|
||||||
flow: flowKey,
|
flow: flowKey,
|
||||||
name: defName,
|
|
||||||
authorizationUrl: flowVal.get("authorizationUrl"),
|
authorizationUrl: flowVal.get("authorizationUrl"),
|
||||||
tokenUrl: flowVal.get("tokenUrl"),
|
tokenUrl: flowVal.get("tokenUrl"),
|
||||||
scopes: flowVal.get("scopes"),
|
scopes: flowVal.get("scopes"),
|
||||||
@@ -41,7 +40,7 @@ export const definitionsToAuthorize = onlyOAS3(createSelector(
|
|||||||
})
|
})
|
||||||
|
|
||||||
list = list.push(new Map({
|
list = list.push(new Map({
|
||||||
[`${defName}__${flowKey}`]: translatedDef.filter((v) => {
|
[defName]: translatedDef.filter((v) => {
|
||||||
// filter out unset values, sometimes `authorizationUrl`
|
// filter out unset values, sometimes `authorizationUrl`
|
||||||
// and `tokenUrl` come out as `undefined` in the data
|
// and `tokenUrl` come out as `undefined` in the data
|
||||||
return v !== undefined
|
return v !== undefined
|
||||||
|
|||||||
@@ -16,14 +16,8 @@ const Callbacks = (props) => {
|
|||||||
return <div key={callbackName}>
|
return <div key={callbackName}>
|
||||||
<h2>{callbackName}</h2>
|
<h2>{callbackName}</h2>
|
||||||
{ callback.map((pathItem, pathItemName) => {
|
{ callback.map((pathItem, pathItemName) => {
|
||||||
if(pathItemName === "$$ref") {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
return <div key={pathItemName}>
|
return <div key={pathItemName}>
|
||||||
{ pathItem.map((operation, method) => {
|
{ pathItem.map((operation, method) => {
|
||||||
if(method === "$$ref") {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
let op = fromJS({
|
let op = fromJS({
|
||||||
operation
|
operation
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -118,11 +118,7 @@ export default {
|
|||||||
let operationPath = ["paths", ...path]
|
let operationPath = ["paths", ...path]
|
||||||
let metaPath = ["meta", "paths", ...path]
|
let metaPath = ["meta", "paths", ...path]
|
||||||
|
|
||||||
if(
|
if(!state.getIn(["json", ...operationPath]) && !state.getIn(["resolved", ...operationPath])) {
|
||||||
!state.getIn(["json", ...operationPath])
|
|
||||||
&& !state.getIn(["resolved", ...operationPath])
|
|
||||||
&& !state.getIn(["resolvedSubtrees", ...operationPath])
|
|
||||||
) {
|
|
||||||
// do nothing if the operation does not exist
|
// do nothing if the operation does not exist
|
||||||
return state
|
return state
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -712,7 +712,6 @@ export const createDeepLinkPath = (str) => typeof str == "string" || str instanc
|
|||||||
export const escapeDeepLinkPath = (str) => cssEscape( createDeepLinkPath(str) )
|
export const escapeDeepLinkPath = (str) => cssEscape( createDeepLinkPath(str) )
|
||||||
|
|
||||||
export const getExtensions = (defObj) => defObj.filter((v, k) => /^x-/.test(k))
|
export const getExtensions = (defObj) => defObj.filter((v, k) => /^x-/.test(k))
|
||||||
export const getCommonExtensions = (defObj) => defObj.filter((v, k) => /^pattern|maxLength|minLength|maximum|minimum/.test(k))
|
|
||||||
|
|
||||||
// Deeply strips a specific key from an object.
|
// Deeply strips a specific key from an object.
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1,84 +0,0 @@
|
|||||||
/* eslint-env mocha */
|
|
||||||
import expect, { createSpy } from "expect"
|
|
||||||
import { downloadConfig } from "corePlugins/configs/spec-actions"
|
|
||||||
|
|
||||||
describe("configs plugin - actions", () => {
|
|
||||||
|
|
||||||
describe("downloadConfig", () => {
|
|
||||||
it("should call the system fetch helper with a provided url", () => {
|
|
||||||
const fetchSpy = createSpy(async () => {}).andCallThrough()
|
|
||||||
const system = {
|
|
||||||
fn: {
|
|
||||||
fetch: fetchSpy
|
|
||||||
},
|
|
||||||
getConfigs() {
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = "http://swagger.io/one"
|
|
||||||
|
|
||||||
downloadConfig(url)(system)
|
|
||||||
|
|
||||||
expect(fetchSpy).toHaveBeenCalledWith({
|
|
||||||
url: url
|
|
||||||
})
|
|
||||||
})
|
|
||||||
it("should allow the globally configured requestInterceptor to modify the request", () => {
|
|
||||||
const fetchSpy = createSpy(async () => {}).andCallThrough()
|
|
||||||
const requestInterceptorSpy = createSpy((req) => {
|
|
||||||
req.url = "http://swagger.io/two"
|
|
||||||
return req
|
|
||||||
}).andCallThrough()
|
|
||||||
const system = {
|
|
||||||
fn: {
|
|
||||||
fetch: fetchSpy
|
|
||||||
},
|
|
||||||
getConfigs() {
|
|
||||||
return {
|
|
||||||
requestInterceptor: requestInterceptorSpy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = "http://swagger.io/one"
|
|
||||||
|
|
||||||
downloadConfig(url)(system)
|
|
||||||
|
|
||||||
expect(fetchSpy).toHaveBeenCalledWith({
|
|
||||||
url: "http://swagger.io/two"
|
|
||||||
})
|
|
||||||
})
|
|
||||||
it("should allow the globally configured responseInterceptor to modify the response", async () => {
|
|
||||||
const fetchSpy = createSpy(async (req) => {
|
|
||||||
return {
|
|
||||||
url: req.url,
|
|
||||||
ok: true
|
|
||||||
}
|
|
||||||
}).andCallThrough()
|
|
||||||
const responseInterceptorSpy = createSpy((res) => {
|
|
||||||
res.url = "http://swagger.io/two"
|
|
||||||
return res
|
|
||||||
}).andCallThrough()
|
|
||||||
const system = {
|
|
||||||
fn: {
|
|
||||||
fetch: fetchSpy
|
|
||||||
},
|
|
||||||
getConfigs() {
|
|
||||||
return {
|
|
||||||
responseInterceptor: responseInterceptorSpy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = "http://swagger.io/one"
|
|
||||||
|
|
||||||
const res = await downloadConfig(url)(system)
|
|
||||||
|
|
||||||
expect(res).toEqual({
|
|
||||||
url: "http://swagger.io/two",
|
|
||||||
ok: true
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
+1
-21
@@ -1,6 +1,6 @@
|
|||||||
/* eslint-env mocha */
|
/* eslint-env mocha */
|
||||||
import expect from "expect"
|
import expect from "expect"
|
||||||
import { Map, fromJS, OrderedMap } from "immutable"
|
import { fromJS, OrderedMap } from "immutable"
|
||||||
import {
|
import {
|
||||||
mapToList,
|
mapToList,
|
||||||
parseSearch,
|
parseSearch,
|
||||||
@@ -20,8 +20,6 @@ import {
|
|||||||
getAcceptControllingResponse,
|
getAcceptControllingResponse,
|
||||||
createDeepLinkPath,
|
createDeepLinkPath,
|
||||||
escapeDeepLinkPath,
|
escapeDeepLinkPath,
|
||||||
getExtensions,
|
|
||||||
getCommonExtensions,
|
|
||||||
sanitizeUrl,
|
sanitizeUrl,
|
||||||
extractFileNameFromContentDispositionHeader,
|
extractFileNameFromContentDispositionHeader,
|
||||||
deeplyStripKey
|
deeplyStripKey
|
||||||
@@ -945,24 +943,6 @@ describe("utils", function() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("getExtensions", function() {
|
|
||||||
const objTest = Map([[ "x-test", "a"], ["minimum", "b"]])
|
|
||||||
it("does not error on empty array", function() {
|
|
||||||
const result1 = getExtensions([])
|
|
||||||
expect(result1).toEqual([])
|
|
||||||
const result2 = getCommonExtensions([])
|
|
||||||
expect(result2).toEqual([])
|
|
||||||
})
|
|
||||||
it("gets only the x- keys", function() {
|
|
||||||
const result = getExtensions(objTest)
|
|
||||||
expect(result).toEqual(Map([[ "x-test", "a"]]))
|
|
||||||
})
|
|
||||||
it("gets the common keys", function() {
|
|
||||||
const result = getCommonExtensions(objTest, true)
|
|
||||||
expect(result).toEqual(Map([[ "minimum", "b"]]))
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe("deeplyStripKey", function() {
|
describe("deeplyStripKey", function() {
|
||||||
it("should filter out a specified key", function() {
|
it("should filter out a specified key", function() {
|
||||||
const input = {
|
const input = {
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
describe("bug #4445: callback-via-$ref rendering", function () {
|
|
||||||
let mainPage
|
|
||||||
beforeEach(function (client, done) {
|
|
||||||
mainPage = client
|
|
||||||
.url("localhost:3230")
|
|
||||||
.page.main()
|
|
||||||
|
|
||||||
client.waitForElementVisible(".download-url-input", 5000)
|
|
||||||
.pause(5000)
|
|
||||||
.clearValue(".download-url-input")
|
|
||||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/bugs/4445.yaml")
|
|
||||||
.click("button.download-url-button")
|
|
||||||
.pause(1000)
|
|
||||||
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
afterEach(function (client, done) {
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
it("expands an operation that has a visible callback", function (client) {
|
|
||||||
client.waitForElementVisible(".opblock-tag-section", 10000)
|
|
||||||
.click(".opblock")
|
|
||||||
.waitForElementVisible(".opblock-body", 5000)
|
|
||||||
.click(".opblock-section-header > .tab-header > div.tab-item:nth-of-type(2)")
|
|
||||||
.waitForElementVisible(".callbacks-container .opblock", 5000)
|
|
||||||
.click(".callbacks-container .opblock")
|
|
||||||
.waitForElementVisible(".callbacks-container .opblock-body", 5000)
|
|
||||||
.assert.containsText(".callbacks-container .opblock-description-wrapper:nth-of-type(2) p", "subscription payload")
|
|
||||||
|
|
||||||
client.end()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
describe("bug #4485: operation metadata storage when referenced via path item $ref", function () {
|
|
||||||
let mainPage
|
|
||||||
beforeEach(function (client, done) {
|
|
||||||
mainPage = client
|
|
||||||
.url("localhost:3230")
|
|
||||||
.page.main()
|
|
||||||
|
|
||||||
client.waitForElementVisible(".download-url-input", 5000)
|
|
||||||
.pause(2000)
|
|
||||||
.clearValue(".download-url-input")
|
|
||||||
.setValue(".download-url-input", "http://localhost:3230/test-specs/bugs/4485/main.yaml")
|
|
||||||
.click("button.download-url-button")
|
|
||||||
.pause(1000)
|
|
||||||
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
afterEach(function (client, done) {
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
it("sets a consumes value for a body parameter correctly", function (client) {
|
|
||||||
client.waitForElementVisible(".opblock-tag-section", 10000)
|
|
||||||
.click(".opblock")
|
|
||||||
.waitForElementVisible(".opblock-body", 5000)
|
|
||||||
.click("button.btn.try-out__btn")
|
|
||||||
.click("select.content-type [value=\"application/xml\"]")
|
|
||||||
.pause(500)
|
|
||||||
.assert.value("select.content-type", "application/xml")
|
|
||||||
|
|
||||||
client.end()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
openapi: 3.0.0
|
|
||||||
info:
|
|
||||||
title: Callback Example
|
|
||||||
version: 1.0.0
|
|
||||||
paths:
|
|
||||||
/streams:
|
|
||||||
post:
|
|
||||||
description: subscribes a client to receive out-of-band data
|
|
||||||
parameters:
|
|
||||||
- name: callbackUrl
|
|
||||||
in: query
|
|
||||||
required: true
|
|
||||||
description: |
|
|
||||||
the location where data will be sent. Must be network accessible
|
|
||||||
by the source server
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
format: uri
|
|
||||||
example: https://tonys-server.com
|
|
||||||
responses:
|
|
||||||
'201':
|
|
||||||
description: subscription successfully created
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
description: subscription information
|
|
||||||
required:
|
|
||||||
- subscriptionId
|
|
||||||
properties:
|
|
||||||
subscriptionId:
|
|
||||||
description: this unique identifier allows management of the subscription
|
|
||||||
type: string
|
|
||||||
example: 2531329f-fb09-4ef7-887e-84e648214436
|
|
||||||
callbacks:
|
|
||||||
# the name `onData` is a convenience locator
|
|
||||||
onData:
|
|
||||||
$ref: '#/components/callbacks/onData'
|
|
||||||
components:
|
|
||||||
callbacks:
|
|
||||||
onData:
|
|
||||||
# when data is sent, it will be sent to the `callbackUrl` provided
|
|
||||||
# when making the subscription PLUS the suffix `/data`
|
|
||||||
'{$request.query.callbackUrl}/data':
|
|
||||||
post:
|
|
||||||
requestBody:
|
|
||||||
description: subscription payload
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
schema:
|
|
||||||
properties:
|
|
||||||
timestamp:
|
|
||||||
type: string
|
|
||||||
format: date-time
|
|
||||||
userData:
|
|
||||||
type: string
|
|
||||||
responses:
|
|
||||||
'202':
|
|
||||||
description: |
|
|
||||||
Your server implementation should return this HTTP status code
|
|
||||||
if the data was received successfully
|
|
||||||
'204':
|
|
||||||
description: |
|
|
||||||
Your server should return this HTTP status code if no longer interested
|
|
||||||
in further updates
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
---
|
|
||||||
post:
|
|
||||||
description: Book
|
|
||||||
operationId: buy
|
|
||||||
summary: Buy a book
|
|
||||||
tags:
|
|
||||||
- Book
|
|
||||||
consumes:
|
|
||||||
- application/json
|
|
||||||
- application/xml
|
|
||||||
parameters:
|
|
||||||
- name: requestBody
|
|
||||||
in: body
|
|
||||||
description: Buy a Book
|
|
||||||
required: true
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
swagger: '2.0'
|
|
||||||
paths:
|
|
||||||
"/v1/book":
|
|
||||||
"$ref": "./book.yaml"
|
|
||||||
Reference in New Issue
Block a user