diff --git a/src/templates/ApiSwagger.jsx b/src/templates/ApiSwagger.jsx index 4a988a18..95c66ff0 100644 --- a/src/templates/ApiSwagger.jsx +++ b/src/templates/ApiSwagger.jsx @@ -38,35 +38,167 @@ const toc = api => { return `` } -const Method = ({ keyName, value }) => ( -
-

- {keyName} -

+const SwaggerMeta = ({ contact, license }) => ( + +) -

{value.summary}

+SwaggerMeta.propTypes = { + contact: PropTypes.object, + license: PropTypes.object +} - {value.description &&

{value.description}

} +const ParameterExample = ({ properties }) => ( +
+        
+            {'{'}
+            {properties &&
+                Object.keys(properties).map(key => (
+                    
+ {` "${key}"`} + {`: `} + {properties[key].type === 'string' && ( + {`"${ + properties[key].example + }"`} + )} + {(properties[key].type === 'integer' || + properties[key].type === 'number') && ( + + {`${properties[key].example}`} + + )} + {(properties[key].type === 'array' || + properties[key].type === 'object') && + JSON.stringify(properties[key].example, null, 2)} + , +
+ ))} + {'}'} +
+
+) - {value.consumes && - value.consumes.map((item, i) => ( -
- {item} +ParameterExample.propTypes = { + properties: PropTypes.object +} + +const Parameters = ({ parameters }) => ( + <> +

Parameters

+ + {parameters.map(parameter => { + const { name, type, required, description, schema } = parameter + + return ( +
+
+ {name} + {required && ( + + * + + )} + {type} +
+ +

{description}

+ + {schema && ( + + )}
- ))} + ) + })} + +) +const Responses = ({ responses }) => ( + <>

Responses

- {Object.entries(value.responses).map(([key, value]) => ( -
- {key} {value.description} + {Object.keys(responses).map(key => ( +
+ {key} {responses[key].description}
))} + +) + +const Method = ({ keyName, value }) => { + const { summary, description, parameters, responses } = value + + return ( +
+

+ {keyName} +

+ +

{summary}

+ + {description &&

{description}

} + + {/* + {consumes && + consumes.map((item, i) => ( +
+ {item} +
+ ))} + */} + + {parameters && parameters.length && ( + + )} + {responses && Object.keys(responses).length !== 0 && ( + + )} +
+ ) +} + +Method.propTypes = { + keyName: PropTypes.string, + value: PropTypes.object +} + +const Paths = ({ paths }) => + Object.entries(paths).map(([key, value]) => ( +
+

+ {cleanKey(key)} +

+ + {Object.entries(value).map(([key, value]) => ( + + ))} +
+ )) + +const BasePath = ({ host, basePath }) => ( +
+ + {host} + {basePath} +
) -Method.propTypes = { - keyName: PropTypes.string.isRequired, - value: PropTypes.object.isRequired +BasePath.propTypes = { + host: PropTypes.string, + basePath: PropTypes.string } export default class ApiSwaggerTemplate extends Component { @@ -80,7 +212,7 @@ export default class ApiSwaggerTemplate extends Component { const { location, data, pageContext } = this.props const sections = data.allSectionsYaml.edges const { api } = pageContext - const { host, basePath, info } = api + const { host, basePath, info, paths } = api const { title, description, version, license, contact } = info // output section title as defined in sections.yml @@ -132,59 +264,17 @@ export default class ApiSwaggerTemplate extends Component { /> {(contact || license) && ( - + )} {(host || basePath) && ( -
- - {host} - {basePath} - -
+ )} - {Object.entries(api.paths).map( - ([key, value]) => ( -
-

- {cleanKey(key)} -

- - {Object.entries(value).map( - ([key, value]) => ( - - ) - )} -
- ) - )} + diff --git a/src/templates/ApiSwagger.module.scss b/src/templates/ApiSwagger.module.scss index a3075818..3706708d 100644 --- a/src/templates/ApiSwagger.module.scss +++ b/src/templates/ApiSwagger.module.scss @@ -96,5 +96,39 @@ } .subHeading { - font-size: $font-size-base; + font-size: $font-size-h5; +} + +.parameters { + h5 { + font-size: $font-size-small; + margin-bottom: $spacer / 4; + font-family: $font-family-monospace; + } + + pre { + code { + padding: $spacer / $line-height; + } + } +} + +.parameterRequired { + font-size: $font-size-mini; + vertical-align: top; + color: $brand-purple; +} + +.parameterType { + font-weight: $font-weight-base; + margin-left: $spacer / 4; + color: $brand-grey-light; +} + +.response { + margin-bottom: $spacer / 4; + + code { + margin-right: $spacer / 4; + } }