提交 7e7444bc 编写于 作者: R Ron 提交者: GitHub

Merge branch 'master' into good-first-contribution-1

...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
"stage-0" "stage-0"
], ],
"plugins": [ "plugins": [
"transform-runtime",
[ [
"module-alias", "module-alias",
[ [
......
...@@ -4,3 +4,4 @@ node_modules ...@@ -4,3 +4,4 @@ node_modules
.DS_Store .DS_Store
npm-debug.log* npm-debug.log*
.eslintcache .eslintcache
package-lock.json
...@@ -22,7 +22,7 @@ The OpenAPI Specification has undergone 4 revisions since initial creation in 20 ...@@ -22,7 +22,7 @@ The OpenAPI Specification has undergone 4 revisions since initial creation in 20
Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes | Status Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes | Status
------------------ | ------------ | -------------------------- | ----- | ------ ------------------ | ------------ | -------------------------- | ----- | ------
3.0.13 | 2017-06-02 | 2.0 | [tag v3.0.13](https://github.com/swagger-api/swagger-ui/tree/v3.0.13) | 3.0.16 | 2017-06-17 | 2.0 | [tag v3.0.16](https://github.com/swagger-api/swagger-ui/tree/v3.0.16) |
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) |
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) | 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) |
...@@ -42,6 +42,12 @@ docker run -p 80:8080 swaggerapi/swagger-ui ...@@ -42,6 +42,12 @@ docker run -p 80:8080 swaggerapi/swagger-ui
Will start nginx with swagger-ui on port 80. Will start nginx with swagger-ui on port 80.
Or you can provide your own swagger.json on your host
```
docker run -p 80:8080 -e "SWAGGER_JSON=/foo/swagger.json" -v /bar:/foo swaggerapi/swagger-ui
```
##### Prerequisites ##### Prerequisites
- Node 6.x - Node 6.x
- NPM 3.x - NPM 3.x
......
此差异已折叠。
{"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;AAu/FA;AA6+FA;;;;;;;;;;;;;;;;;;;;;;;;;;AAweA;AAkoJA;AAwiCA;AAo9GA;AAw5HA;AAkvGA;AA47EA;AAmqDA;AAk/CA;AA+jDA;AAk/CA;;;;;AAs2CA;AAmwJA;;;;;;;;;;;;;;AA8sEA;AAyoIA;AAiuJA;AA8kHA;AAonGA;AAukEA;AA02DA;AA65EA;AAy/FA;;;;;;AAo5FA;AAk7FA;;;;;AAy/CA;AA2qFA;AAs2CA;AA+kCA;AAg8CA;AAyxDA;AA27CA;AA28FA;;;;;;;;;AAu4BA;AA2zIA;AAu7FA;AA8rFA;AA20EA;;;;;;AA4kCA;AA8iHA;AAipGA","sourceRoot":""} {"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAmqDA;AAorJA;AAiiCA;AAo1GA;AA4qHA;AAw8FA;AAujFA;AA0sDA;AAm/CA;AA+jDA;AAk/CA;;;;;AA60EA;AA8zJA;;;;;;;;;;;;;;AAyoFA;AA+lIA;AA4oJA;AAqvHA;AAknGA;AA4iEA;AA43DA;AAkqDA;AAidA;;;;;;AAkxGA;AA+1HA;AA0+DA;;;;;AAwiBA;AAgsFA;AA6kDA;AAq3CA;AA4wFA;AAk3CA;AA2iFA;;;;;;;;;AAwqEA;AA2zIA;AAu7FA;AAmrFA;AAi7EA;;;;;;AAiRA;AAuqHA;AAg8GA","sourceRoot":""}
\ No newline at end of file \ No newline at end of file
{"version":3,"file":"swagger-ui-standalone-preset.js","sources":["webpack:///swagger-ui-standalone-preset.js"],"mappings":"AAAA;;;;;AA+PA;AAyiGA;AAwxFA;;;;;;AA0bA;AAkvFA;AAu+CA;AAo+CA;AAgrCA;AAgyEA","sourceRoot":""} {"version":3,"file":"swagger-ui-standalone-preset.js","sources":["webpack:///swagger-ui-standalone-preset.js"],"mappings":"AAAA;AA+uFA;;;;;AAyOA;AAo7GA;AAw0FA;;;;;;AAmZA;AA+uFA;AAy+CA;AAo+CA;AAirCA;AAuyEA","sourceRoot":""}
\ No newline at end of file \ No newline at end of file
此差异已折叠。
此差异已折叠。
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;;;;;;AA4yCA;AAoyHA;AAmyHA;AAukGA;AA+9BA;AA2jCA;AA0iCA;AAy4BA","sourceRoot":""} {"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;AAylFA;;;;;;AAw4CA;AA2pHA;AA48HA;AAkoGA;AA0zDA;AAmzCA;AA+xCA","sourceRoot":""}
\ No newline at end of file \ No newline at end of file
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
set -e set -e
INDEX_FILE=/usr/share/nginx/html/index.html NGINX_ROOT=/usr/share/nginx/html
INDEX_FILE=$NGINX_ROOT/index.html
replace_in_index () { replace_in_index () {
if [ "$1" != "**None**" ]; then if [ "$1" != "**None**" ]; then
...@@ -30,8 +31,10 @@ if [ "$OAUTH_ADDITIONAL_PARAMS" != "**None**" ]; then ...@@ -30,8 +31,10 @@ if [ "$OAUTH_ADDITIONAL_PARAMS" != "**None**" ]; then
fi fi
if [[ -f $SWAGGER_JSON ]]; then if [[ -f $SWAGGER_JSON ]]; then
sed -i "s|http://petstore.swagger.io/v2/swagger.json|swagger.json|g" $INDEX_FILE cp $SWAGGER_JSON $NGINX_ROOT
sed -i "s|http://example.com/api|swagger.json|g" $INDEX_FILE REL_PATH="/$(basename $SWAGGER_JSON)"
sed -i "s|http://petstore.swagger.io/v2/swagger.json|$REL_PATH|g" $INDEX_FILE
sed -i "s|http://example.com/api|$REL_PATH|g" $INDEX_FILE
else else
sed -i "s|http://petstore.swagger.io/v2/swagger.json|$API_URL|g" $INDEX_FILE sed -i "s|http://petstore.swagger.io/v2/swagger.json|$API_URL|g" $INDEX_FILE
sed -i "s|http://example.com/api|$API_URL|g" $INDEX_FILE sed -i "s|http://example.com/api|$API_URL|g" $INDEX_FILE
......
...@@ -147,7 +147,7 @@ module.exports = function(options) { ...@@ -147,7 +147,7 @@ module.exports = function(options) {
extensions: ["", ".web.js", ".js", ".jsx", ".json", ".less"], extensions: ["", ".web.js", ".js", ".jsx", ".json", ".less"],
packageAlias: 'browser', packageAlias: 'browser',
alias: { alias: {
base: "getbase/src/less/base" base: "getbase/src/less/base",
} }
}, },
......
此差异已折叠。
{ {
"name": "swagger-ui", "name": "swagger-ui",
"version": "3.0.13", "version": "3.0.16",
"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": [
...@@ -32,10 +32,9 @@ ...@@ -32,10 +32,9 @@
"test": "npm run lint-errors && npm run just-test-in-node", "test": "npm run lint-errors && npm run just-test-in-node",
"test-in-node": "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": "karma start --config karma.conf.js",
"just-test-in-node": "mocha --recursive --compilers js:babel-core/register test/core test/components test/bugs" "just-test-in-node": "mocha --recursive --compilers js:babel-core/register test/core test/components test/bugs test/swagger-ui-dist-package"
}, },
"dependencies": { "dependencies": {
"babel-polyfill": "^6.23.0",
"base64-js": "^1.2.0", "base64-js": "^1.2.0",
"brace": "0.7.0", "brace": "0.7.0",
"deep-extend": "0.4.1", "deep-extend": "0.4.1",
...@@ -70,7 +69,7 @@ ...@@ -70,7 +69,7 @@
"sanitize-html": "^1.14.1", "sanitize-html": "^1.14.1",
"serialize-error": "2.0.0", "serialize-error": "2.0.0",
"shallowequal": "0.2.2", "shallowequal": "0.2.2",
"swagger-client": "~3.0.13", "swagger-client": "~3.0.15",
"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",
...@@ -83,6 +82,7 @@ ...@@ -83,6 +82,7 @@
"babel-eslint": "^7.1.1", "babel-eslint": "^7.1.1",
"babel-loader": "^6.3.2", "babel-loader": "^6.3.2",
"babel-plugin-module-alias": "^1.6.0", "babel-plugin-module-alias": "^1.6.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-es2015": "^6.22.0", "babel-preset-es2015": "^6.22.0",
"babel-preset-es2015-ie": "^6.6.2", "babel-preset-es2015-ie": "^6.6.2",
"babel-preset-react": "^6.23.0", "babel-preset-react": "^6.23.0",
...@@ -132,7 +132,7 @@ ...@@ -132,7 +132,7 @@
"browserslist": [ "browserslist": [
"> 1%", "> 1%",
"last 2 versions", "last 2 versions",
"IE 10" "IE 11"
], ],
"optionalDependencies": { "optionalDependencies": {
"webpack-dev-server": "1.14.0" "webpack-dev-server": "1.14.0"
......
...@@ -19,7 +19,7 @@ export default class Curl extends React.Component { ...@@ -19,7 +19,7 @@ export default class Curl extends React.Component {
<div> <div>
<h4>Curl</h4> <h4>Curl</h4>
<div className="copy-paste"> <div className="copy-paste">
<textarea onFocus={this.handleFocus} className="curl" style={{ whiteSpace: "normal" }} value={curl}></textarea> <textarea onFocus={this.handleFocus} readOnly="true" className="curl" style={{ whiteSpace: "normal" }} value={curl}></textarea>
</div> </div>
</div> </div>
) )
......
...@@ -22,13 +22,14 @@ export default class LiveResponse extends React.Component { ...@@ -22,13 +22,14 @@ export default class LiveResponse extends React.Component {
render() { render() {
const { request, response, getComponent } = this.props const { request, response, getComponent } = this.props
const body = response.get("text")
const status = response.get("status") const status = response.get("status")
const url = response.get("url") const url = response.get("url")
const headers = response.get("headers").toJS() const headers = response.get("headers").toJS()
const notDocumented = response.get("notDocumented") const notDocumented = response.get("notDocumented")
const isError = response.get("error") const isError = response.get("error")
const body = isError ? response.get("response").get("text") : response.get("text")
const headersKeys = Object.keys(headers) const headersKeys = Object.keys(headers)
const contentType = headers["content-type"] const contentType = headers["content-type"]
...@@ -37,6 +38,7 @@ export default class LiveResponse extends React.Component { ...@@ -37,6 +38,7 @@ export default class LiveResponse extends React.Component {
const returnObject = headersKeys.map(key => { const returnObject = headersKeys.map(key => {
return <span className="headerline" key={key}> {key}: {headers[key]} </span> return <span className="headerline" key={key}> {key}: {headers[key]} </span>
}) })
const hasHeaders = returnObject.length !== 0
return ( return (
<div> <div>
...@@ -54,28 +56,29 @@ export default class LiveResponse extends React.Component { ...@@ -54,28 +56,29 @@ export default class LiveResponse extends React.Component {
<td className="col response-col_status"> <td className="col response-col_status">
{ status } { status }
{ {
!notDocumented ? null : notDocumented ? <div className="response-undocumented">
<div className="response-undocumented"> <i> Undocumented </i>
<i> Undocumented </i> </div>
</div> : null
} }
</td> </td>
<td className="col response-col_description"> <td className="col response-col_description">
{ {
!isError ? null : <span> isError ? <span>
{`${response.get("name")}: ${response.get("message")}`} {`${response.get("name")}: ${response.get("message")}`}
</span> </span>
: null
} }
{ {
!body || isError ? null body ? <ResponseBody content={ body }
: <ResponseBody content={ body } contentType={ contentType }
contentType={ contentType } url={ url }
url={ url } headers={ headers }
headers={ headers } getComponent={ getComponent }/>
getComponent={ getComponent }/> : null
} }
{ {
!headers ? null : <Headers headers={ returnObject }/> hasHeaders ? <Headers headers={ returnObject }/> : null
} }
</td> </td>
</tr> </tr>
......
...@@ -40,6 +40,7 @@ class ObjectModel extends Component { ...@@ -40,6 +40,7 @@ class ObjectModel extends Component {
let additionalProperties = schema.get("additionalProperties") let additionalProperties = schema.get("additionalProperties")
let title = schema.get("title") || name let title = schema.get("title") || name
let required = schema.get("required") let required = schema.get("required")
const Markdown = getComponent("Markdown")
const JumpToPathSection = ({ name }) => <span className="model-jump-to-path"><JumpToPath path={`definitions.${name}`} /></span> const JumpToPathSection = ({ name }) => <span className="model-jump-to-path"><JumpToPath path={`definitions.${name}`} /></span>
let collapsedContent = (<span> let collapsedContent = (<span>
<span>{ braceOpen }</span>...<span>{ braceClose }</span> <span>{ braceOpen }</span>...<span>{ braceClose }</span>
...@@ -66,7 +67,9 @@ class ObjectModel extends Component { ...@@ -66,7 +67,9 @@ class ObjectModel extends Component {
{ {
!description ? null : <tr style={{ color: "#999", fontStyle: "italic" }}> !description ? null : <tr style={{ color: "#999", fontStyle: "italic" }}>
<td>description:</td> <td>description:</td>
<td>{ description }</td> <td>
<Markdown source={ description } />
</td>
</tr> </tr>
} }
{ {
...@@ -114,11 +117,12 @@ class ObjectModel extends Component { ...@@ -114,11 +117,12 @@ class ObjectModel extends Component {
class Primitive extends Component { class Primitive extends Component {
static propTypes = { static propTypes = {
schema: PropTypes.object.isRequired, schema: PropTypes.object.isRequired,
getComponent: PropTypes.func.isRequired,
required: PropTypes.bool required: PropTypes.bool
} }
render(){ render(){
let { schema, required } = this.props let { schema, getComponent, required } = this.props
if(!schema || !schema.get) { if(!schema || !schema.get) {
// don't render if schema isn't correctly formed // don't render if schema isn't correctly formed
...@@ -129,17 +133,23 @@ class Primitive extends Component { ...@@ -129,17 +133,23 @@ class Primitive extends Component {
let format = schema.get("format") let format = schema.get("format")
let xml = schema.get("xml") let xml = schema.get("xml")
let enumArray = schema.get("enum") let enumArray = schema.get("enum")
let properties = schema.filter( ( v, key) => ["enum", "type", "format", "$$ref"].indexOf(key) === -1 ) let description = schema.get("description")
let properties = schema.filter( ( v, key) => ["enum", "type", "format", "description", "$$ref"].indexOf(key) === -1 )
let style = required ? { fontWeight: "bold" } : {} let style = required ? { fontWeight: "bold" } : {}
const Markdown = getComponent("Markdown")
return <span className="prop"> return <span className="prop">
<span className="prop-type" style={ style }>{ type }</span> { required && <span style={{ color: "red" }}>*</span>} <span className="prop-type" style={ style }>{ type }</span> { required && <span style={{ color: "red" }}>*</span>}
{ format && <span className="prop-format">(${format})</span>} { format && <span className="prop-format">(${format})</span>}
{ {
properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={ propStyle }> properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={ propStyle }>
<br />{ key !== "description" && key + ": " }{ String(v) }</span>) <br />{ key }: { String(v) }</span>)
: null : null
} }
{
!description ? null :
<Markdown source={ description } />
}
{ {
xml && xml.size ? (<span><br /><span style={ propStyle }>xml:</span> xml && xml.size ? (<span><br /><span style={ propStyle }>xml:</span>
{ {
...@@ -217,7 +227,7 @@ class Model extends Component { ...@@ -217,7 +227,7 @@ class Model extends Component {
} }
render () { render () {
let { schema, required, name, isRef } = this.props let { schema, getComponent, required, name, isRef } = this.props
let $$ref = schema && schema.get("$$ref") let $$ref = schema && schema.get("$$ref")
let modelName = $$ref && this.getModelName( $$ref ) let modelName = $$ref && this.getModelName( $$ref )
let modelSchema, type let modelSchema, type
...@@ -236,7 +246,7 @@ class Model extends Component { ...@@ -236,7 +246,7 @@ class Model extends Component {
switch(type) { switch(type) {
case "object": case "object":
return <ObjectModel className="object" { ...this.props } schema={ modelSchema } return <ObjectModel className="object" { ...this.props } schema={ modelSchema }
name={ modelName || name } name={ name || modelName }
isRef={ isRef!== undefined ? isRef : !!$$ref }/> isRef={ isRef!== undefined ? isRef : !!$$ref }/>
case "array": case "array":
return <ArrayModel className="array" { ...this.props } schema={ modelSchema } required={ required } /> return <ArrayModel className="array" { ...this.props } schema={ modelSchema } required={ required } />
...@@ -245,7 +255,7 @@ class Model extends Component { ...@@ -245,7 +255,7 @@ class Model extends Component {
case "integer": case "integer":
case "boolean": case "boolean":
default: default:
return <Primitive schema={ modelSchema } required={ required }/> return <Primitive getComponent={ getComponent } schema={ modelSchema } required={ required }/>
} }
} }
} }
......
...@@ -8,7 +8,7 @@ const getExampleComponent = ( sampleResponse, examples, HighlightCode ) => { ...@@ -8,7 +8,7 @@ const getExampleComponent = ( sampleResponse, examples, HighlightCode ) => {
let exampleValue let exampleValue
try { try {
exampleValue = example && example.toJS ? example.toJS() : example exampleValue = example && example.toJS ? example.toJS() : example
exampleValue = JSON.stringify(exampleValue) exampleValue = JSON.stringify(exampleValue, null, 2)
} }
catch(e) { catch(e) {
exampleValue = String(example) exampleValue = String(example)
......
import win from "./window"
export default function curl( request ){ export default function curl( request ){
let curlified = [] let curlified = []
let type = "" let type = ""
...@@ -18,11 +20,13 @@ export default function curl( request ){ ...@@ -18,11 +20,13 @@ export default function curl( request ){
if ( request.get("body") ){ if ( request.get("body") ){
if(type === "multipart/form-data" && request.get("method") === "POST") { if(type === "multipart/form-data" && request.get("method") === "POST") {
let formDataBody = request.get("body").split("&") for( let [ k,v ] of request.get("body").values()) {
for(var data in formDataBody) {
curlified.push( "-F" ) curlified.push( "-F" )
curlified.push(formDataBody[data]) if (v instanceof win.File) {
curlified.push( `"${k}=@${v.name};type=${v.type}"` )
} else {
curlified.push( `"${k}=${v}"` )
}
} }
} else { } else {
curlified.push( "-d" ) curlified.push( "-d" )
......
...@@ -117,6 +117,7 @@ module.exports = function SwaggerUI(opts) { ...@@ -117,6 +117,7 @@ module.exports = function SwaggerUI(opts) {
return downloadSpec() return downloadSpec()
} }
return system
} }
// Add presets // Add presets
......
import { fromJS } from "immutable" import { fromJS } from "immutable"
import { fromJSOrdered, validateParam } from "core/utils" import { fromJSOrdered, validateParam } from "core/utils"
import win from "../../window" import win from "../../window"
import findIndex from "lodash/findIndex"
import { import {
UPDATE_SPEC, UPDATE_SPEC,
...@@ -41,7 +42,7 @@ export default { ...@@ -41,7 +42,7 @@ export default {
[UPDATE_PARAM]: ( state, {payload} ) => { [UPDATE_PARAM]: ( state, {payload} ) => {
let { path, paramName, value, isXml } = payload let { path, paramName, value, isXml } = payload
return state.updateIn( [ "resolved", "paths", ...path, "parameters" ], fromJS([]), parameters => { return state.updateIn( [ "resolved", "paths", ...path, "parameters" ], fromJS([]), parameters => {
let index = parameters.findIndex( p => p.get( "name" ) === paramName ) const index = findIndex(parameters, p => p.get( "name" ) === paramName )
if (!(value instanceof win.File)) { if (!(value instanceof win.File)) {
value = fromJSOrdered( value ) value = fromJSOrdered( value )
} }
......
import Im from "immutable" import Im from "immutable"
import shallowEqual from "shallowequal"
import camelCase from "lodash/camelCase" import camelCase from "lodash/camelCase"
import upperFirst from "lodash/upperFirst" import upperFirst from "lodash/upperFirst"
...@@ -7,6 +6,7 @@ import _memoize from "lodash/memoize" ...@@ -7,6 +6,7 @@ import _memoize from "lodash/memoize"
import some from "lodash/some" import some from "lodash/some"
import eq from "lodash/eq" import eq from "lodash/eq"
import { memoizedSampleFromSchema, memoizedCreateXMLExample } from "core/plugins/samples/fn" import { memoizedSampleFromSchema, memoizedCreateXMLExample } from "core/plugins/samples/fn"
import win from "./window"
const DEFAULT_REPONSE_KEY = "default" const DEFAULT_REPONSE_KEY = "default"
...@@ -34,6 +34,9 @@ export function fromJSOrdered (js) { ...@@ -34,6 +34,9 @@ export function fromJSOrdered (js) {
if(isImmutable(js)) if(isImmutable(js))
return js // Can't do much here return js // Can't do much here
if (js instanceof win.File)
return js
return !isObject(js) ? js : return !isObject(js) ? js :
Array.isArray(js) ? Array.isArray(js) ?
Im.Seq(js).map(fromJSOrdered).toList() : Im.Seq(js).map(fromJSOrdered).toList() :
...@@ -414,11 +417,6 @@ export function pascalCaseFilename(filename) { ...@@ -414,11 +417,6 @@ export function pascalCaseFilename(filename) {
return pascalCase(filename.replace(/\.[^./]*$/, "")) return pascalCase(filename.replace(/\.[^./]*$/, ""))
} }
// Only compare a set of props
export function shallowEqualKeys(a,b, keys) {
return !!keys.find(key => !shallowEqual(a[key], b[key]))
}
// Check if ... // Check if ...
// - new props // - new props
// - If immutable, use .is() // - If immutable, use .is()
......
...@@ -3,7 +3,8 @@ function makeWindow() { ...@@ -3,7 +3,8 @@ function makeWindow() {
location: {}, location: {},
history: {}, history: {},
open: () => {}, open: () => {},
close: () => {} close: () => {},
File: function() {}
} }
if(typeof window === "undefined") { if(typeof window === "undefined") {
......
// Promise global, Used ( at least ) by 'whatwg-fetch'. And required by IE 11
require("core-js/fn/promise")
This module, `swagger-ui-dist`, exposes Swagger-UI's entire dist folder as a dependency-free npm module. Use `swagger-ui` instead, if you'd like to have npm install dependencies for you. # Swagger UI Dist
[![NPM version](https://badge.fury.io/js/swagger-ui-dist.svg)](http://badge.fury.io/js/swagger-ui-dist)
# API
This module, `swagger-ui-dist`, exposes Swagger-UI's entire dist folder as a dependency-free npm module.
Use `swagger-ui` instead, if you'd like to have npm install dependencies for you.
`SwaggerUIBundle` and `SwaggerUIStandalonePreset` can be imported: `SwaggerUIBundle` and `SwaggerUIStandalonePreset` can be imported:
```javascript ```javascript
import { SwaggerUIBundle, SwaggerUIStandalonePreset } from 'swagger-ui-dist' import { SwaggerUIBundle, SwaggerUIStandalonePreset } from "swagger-ui-dist"
```
To get an absolute path to this directory for static file serving, use the exported `getAbsoluteFSPath` method:
```javascript
const swaggerUiAssetPath = require("swagger-ui-dist").getAbsoluteFSPath()
// then instantiate server that serves files from the swaggerUiAssetPath
``` ```
For anything else, check the [Swagger-UI](https://github.com/swagger-api/swagger-ui) repository. For anything else, check the [Swagger-UI](https://github.com/swagger-api/swagger-ui) repository.
/*
* getAbsoluteFSPath
* @return {string} When run in NodeJS env, returns the absolute path to the current directory
* When run outside of NodeJS, will return an error message
*/
const getAbsoluteFSPath = function () {
// detect whether we are running in a browser or nodejs
if (typeof module !== "undefined" && module.exports) {
return require("path").resolve(__dirname)
}
throw new Error('getAbsoluteFSPath can only be called within a Nodejs environment');
}
module.exports = getAbsoluteFSPath
module.exports.SwaggerUIBundle = require('./swagger-ui-bundle.js') module.exports.SwaggerUIBundle = require("./swagger-ui-bundle.js")
module.exports.SwaggerUIStandalonePreset = require('./swagger-ui-standalone-preset.js') module.exports.SwaggerUIStandalonePreset = require("./swagger-ui-standalone-preset.js")
module.exports.absolutePath = require("./absolute-path.js")
import expect from "expect" import expect from "expect"
import Im from "immutable" import Im from "immutable"
import curl from "core/curlify" import curl from "core/curlify"
import win from "core/window"
describe("curlify", function() { describe("curlify", function() {
...@@ -131,12 +132,35 @@ describe("curlify", function() { ...@@ -131,12 +132,35 @@ describe("curlify", function() {
url: "http://example.com", url: "http://example.com",
method: "POST", method: "POST",
headers: { "content-type": "multipart/form-data" }, headers: { "content-type": "multipart/form-data" },
body: "id=123&name=Sahar" body: [
["id", "123"],
["name", "Sahar"]
]
} }
let curlified = curl(Im.fromJS(req)) let curlified = curl(Im.fromJS(req))
expect(curlified).toEqual("curl -X POST \"http://example.com\" -H \"content-type: multipart/form-data\" -F id=123 -F name=Sahar") expect(curlified).toEqual("curl -X POST \"http://example.com\" -H \"content-type: multipart/form-data\" -F \"id=123\" -F \"name=Sahar\"")
})
it("should print a curl with formData and file", function() {
var file = new win.File()
file.name = "file.txt"
file.type = "text/plain"
var req = {
url: "http://example.com",
method: "POST",
headers: { "content-type": "multipart/form-data" },
body: [
["id", "123"],
["file", file]
]
}
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 \"file=@file.txt;type=text/plain\"")
}) })
it("prints a curl post statement from an object", function() { it("prints a curl post statement from an object", function() {
......
/* eslint-env mocha */
import expect from "expect"
import path from "path"
import getAbsoluteFSPath from "../../swagger-ui-dist-package/absolute-path"
describe("swagger-ui-dist", function(){
describe("getAbsoluteFSPath", function(){
it("returns absolute path", function(){
const expectedPath = path.resolve(__dirname, "../../swagger-ui-dist-package")
expect(getAbsoluteFSPath()).toEqual(expectedPath)
})
})
})
...@@ -13,7 +13,7 @@ module.exports = require('./make-webpack-config.js')({ ...@@ -13,7 +13,7 @@ module.exports = require('./make-webpack-config.js')({
entry: { entry: {
'swagger-ui-bundle': [ 'swagger-ui-bundle': [
'babel-polyfill', './src/polyfills',
'./src/core/index.js' './src/core/index.js'
] ]
}, },
......
...@@ -13,6 +13,7 @@ module.exports = require('./make-webpack-config.js')({ ...@@ -13,6 +13,7 @@ module.exports = require('./make-webpack-config.js')({
entry: { entry: {
'swagger-ui-standalone-preset': [ 'swagger-ui-standalone-preset': [
'./src/polyfills',
'./src/standalone/index.js' './src/standalone/index.js'
] ]
}, },
......
var path = require('path') const path = require("path")
var fs = require('fs') const fs = require("fs")
var node_modules = fs.readdirSync('node_modules').filter(function(x) { return x !== '.bin' }) const nodeModules = fs.readdirSync("node_modules").filter(function(x) { return x !== ".bin" })
module.exports = require("./make-webpack-config.js")({
module.exports = require('./make-webpack-config.js')({
_special: { _special: {
separateStylesheets: true, separateStylesheets: true,
minimize: true, minimize: true,
...@@ -15,9 +14,9 @@ module.exports = require('./make-webpack-config.js')({ ...@@ -15,9 +14,9 @@ module.exports = require('./make-webpack-config.js')({
entry: { entry: {
"swagger-ui": [ "swagger-ui": [
'babel-polyfill', "./src/style/main.scss",
'./src/style/main.scss', "./src/polyfills",
'./src/core/index.js' "./src/core/index.js"
] ]
}, },
...@@ -25,11 +24,11 @@ module.exports = require('./make-webpack-config.js')({ ...@@ -25,11 +24,11 @@ module.exports = require('./make-webpack-config.js')({
// webpack injects some stuff into the resulting file, // webpack injects some stuff into the resulting file,
// these libs need to be pulled in to keep that working. // these libs need to be pulled in to keep that working.
var exceptionsForWebpack = ["ieee754", "base64-js"] var exceptionsForWebpack = ["ieee754", "base64-js"]
if(node_modules.indexOf(request) !== -1 || exceptionsForWebpack.indexOf(request) !== -1) { if(nodeModules.indexOf(request) !== -1 || exceptionsForWebpack.indexOf(request) !== -1) {
cb(null, 'commonjs ' + request) cb(null, "commonjs " + request)
return; return
} }
cb(); cb()
}, },
output: { output: {
......
...@@ -10,12 +10,12 @@ module.exports = require("./make-webpack-config")({ ...@@ -10,12 +10,12 @@ module.exports = require("./make-webpack-config")({
devtool: "eval", devtool: "eval",
entry: { entry: {
'swagger-ui-bundle': [ 'swagger-ui-bundle': [
'webpack/hot/dev-server', './src/polyfills',
'babel-polyfill', './src/core/index.js'
'./src/core/index.js',
], ],
'swagger-ui-standalone-preset': [ 'swagger-ui-standalone-preset': [
'webpack/hot/dev-server', 'webpack/hot/dev-server',
'./src/polyfills',
'./src/standalone/index.js', './src/standalone/index.js',
] ]
}, },
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册