1
0
mirror of https://github.com/oceanprotocol/docs.git synced 2024-11-26 19:49:26 +01:00

Merge pull request #219 from oceanprotocol/feature/swagger

Fetch Swagger specs remotely
This commit is contained in:
Troy McConaghy 2019-04-17 13:41:49 +02:00 committed by GitHub
commit 39d6d1ead4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 89 additions and 792 deletions

View File

@ -27,7 +27,7 @@
- [Repositories](#repositories) - [Repositories](#repositories)
- [Add Links to a Repository](#add-links-to-a-repository) - [Add Links to a Repository](#add-links-to-a-repository)
- [Release Versions](#release-versions) - [Release Versions](#release-versions)
- [API & Library References](#api--library-references) - [API References](#api-references)
- [Swagger specs](#swagger-specs) - [Swagger specs](#swagger-specs)
- [TypeDoc specs](#typedoc-specs) - [TypeDoc specs](#typedoc-specs)
- [Development](#development) - [Development](#development)
@ -49,7 +49,7 @@ The documentation is split in multiple sections whose content lives in this repo
- **Core concepts**: high-level explanation of concepts, assumptions, and components - **Core concepts**: high-level explanation of concepts, assumptions, and components
- **Setup**: getting started for various stakeholders and use cases - **Setup**: getting started for various stakeholders and use cases
- **Tutorials**: detailed tutorials - **Tutorials**: detailed tutorials
- **API & Library References**: docs for the Aquarius & Brizo REST APIs, and docs for various Squid libraries - **API References**: docs for the Aquarius & Brizo REST APIs, and docs for various Squid libraries
Those sections are defined in the [`/data/sections.yml`](data/sections.yml) file. Those sections are defined in the [`/data/sections.yml`](data/sections.yml) file.
@ -184,7 +184,7 @@ The GitHub link is automatically added for every repository and will always be d
The displayed version number is based on the tag name of the latest release for a given repository. That means only GitHub releases will trigger a version number update, creating a new Git tag alone is not sufficient. The displayed version number is based on the tag name of the latest release for a given repository. That means only GitHub releases will trigger a version number update, creating a new Git tag alone is not sufficient.
### API & Library References ### API References
You can add more Markdown documents under `/content/references/`, link to them from the [`/data/sidebars/references.yml`](./data/sidebars/references.yml), and they will appear just like in all the other sections. You can add more Markdown documents under `/content/references/`, link to them from the [`/data/sidebars/references.yml`](./data/sidebars/references.yml), and they will appear just like in all the other sections.
@ -194,14 +194,12 @@ The sidebar for those generated reference pages will automatically switch to inc
#### Swagger specs #### Swagger specs
Reference pages based on Swagger specs are sourced from a Swagger spec `json` file, at the moment they simply live as manual copies under `/data/`: Reference pages based on Swagger specs are sourced from remotely hosted Swagger specs:
- [`aquarius.json`](./data/aquarius.json) - [`https://nginx-aquarius.dev-ocean.com/spec`](https://nginx-aquarius.dev-ocean.com/spec)
- [`brizo.json`](./data/brizo.json) - [`https://nginx-brizo.dev-ocean.com/spec`](https://nginx-brizo.dev-ocean.com/spec)
There's no automation setup around updating those files so [until this is setup](https://github.com/oceanprotocol/docs/issues/74), they need to be manually updated with copy & paste, like they did in the middle ages. You can copy them from a running instance of Aquarius or Brizo which will expose those spec files, e.g. under `localhost:5000/spec` for Aquarius and `localhost:8030/spec` for Brizo. They are fetched and updated automatically upon every site build. For more information about stylistic issues, take a look at the section in the test page:
For more information about stylistic issues, take a look at the section in the test page:
- [Swagger spec references](https://docs.oceanprotocol.com/test#swagger-spec-references) - [Swagger spec references](https://docs.oceanprotocol.com/test#swagger-spec-references)

View File

@ -1,17 +1,20 @@
--- ---
title: API & Library References title: API References
description: All the references for Ocean Protocol components. description: All the API reference docs for Ocean Protocol components and libraries.
--- ---
**Heads Up! This reference section is in heavy development and updated as we integrate data from various code reference tools into this site.** This section has API reference docs (or links to external ones) for the following Ocean Protocol components and libraries:
The following components expose a consumable REST API which are documented on this site:
<repo name="aquarius"></repo> <repo name="aquarius"></repo>
<repo name="brizo"></repo> <repo name="brizo"></repo>
Those are sourced from their respective Swagger specs. On this site you can't execute the documented API calls yet. If you need this, you can run a component's local Swagger UI as outlined in the repository instructions on GitHub. Those are sourced from their respective Swagger specs. On this site you can't execute the documented API calls yet. If you need this, you can run a component's local Swagger UI as outlined in the repository instructions on GitHub.
Additionally, if you need API docs for a past version of Aquarius or Brizo, check out their specs on SwaggerHub:
- [SwaggerHub: Aquarius](https://app.swaggerhub.com/apis/Ocean-Protocol/aquarius)
- [SwaggerHub: Brizo](https://app.swaggerhub.com/apis/Ocean-Protocol/brizo)
References of all the functions and methods used in our libraries: References of all the functions and methods used in our libraries:
<repo name="squid-js"></repo> <repo name="squid-js"></repo>

View File

@ -1,532 +0,0 @@
{
"basePath":"/api/v1/aquarius",
"definitions":{
},
"host":"myfancyaquarius.com",
"info":{
"description":"Aquarius provides an off-chain database store for metadata about data assets. When running with our Docker images, it is exposed under `http://localhost:5000`.",
"title":"Aquarius",
"version":"0.1.4"
},
"paths":{
"/api/v1/aquarius/assets":{
"get":{
"description":"",
"responses":{
"200":{
"description":"successful action"
}
},
"summary":"Get all asset IDs.",
"tags":[
"ddo"
]
}
},
"/api/v1/aquarius/assets/ddo":{
"get":{
"description":"",
"responses":{
"200":{
"description":"successful action"
}
},
"summary":"Get DDO of all assets.",
"tags":[
"ddo"
]
},
"post":{
"consumes":[
"application/json"
],
"description":"",
"parameters":[
{
"description":"DDO of the asset.",
"in":"body",
"name":"body",
"required":true,
"schema":{
"properties":{
"@context":{
"description":null,
"example":"https://w3id.org/future-method/v1",
"type":"string"
},
"authentication":{
"description":"List of authentication mechanisms.",
"example":[
{
"type":"RsaSignatureAuthentication2018"
},
{
"publicKey":"did:op:123456789abcdefghi#keys-1"
}
],
"type":"array"
},
"id":{
"description":"ID of the asset.",
"example":"did:op:123456789abcdefghi",
"type":"string"
},
"publicKey":{
"description":"List of public keys.",
"example":[
{
"id":"did:op:123456789abcdefghi#keys-1"
},
{
"type":"Ed25519VerificationKey2018"
},
{
"owner":"did:op:123456789abcdefghi"
},
{
"publicKeyBase58":"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}
],
"type":"array"
},
"service":{
"description":"List of services.",
"example":[
{
"serviceEndpoint":"http://mybrizo.org/api/v1/brizo/services/consume?pubKey=${pubKey}&serviceId={serviceId}&url={url}",
"type":"Consume"
},
{
"serviceEndpoint":"http://mybrizo.org/api/v1/brizo/services/compute?pubKey=${pubKey}&serviceId={serviceId}&algo={algo}&container={container}",
"type":"Compute"
},
{
"metadata":{
"additionalInformation":{
"structuredMarkup":[
{
"mediaType":"application/ld+json",
"uri":"http://skos.um.es/unescothes/C01194/jsonld"
},
{
"mediaType":"text/turtle",
"uri":"http://skos.um.es/unescothes/C01194/turtle"
}
],
"updateFrecuency":"yearly"
},
"base":{
"author":"Met Office",
"compression":"zip",
"contentType":"text/csv",
"contentUrls":[
"https://testocnfiles.blob.core.windows.net/testfiles/testzkp.zip"
],
"copyrightHolder":"Met Office",
"dateCreated":"2012-10-10T17:00:000Z",
"description":"Weather information of UK including temperature and humidity",
"encoding":"UTF-8",
"inLanguage":"en",
"license":"CC-BY",
"links":[
{
"sample1":"http://data.ceda.ac.uk/badc/ukcp09/data/gridded-land-obs/gridded-land-obs-daily/"
},
{
"sample2":"http://data.ceda.ac.uk/badc/ukcp09/data/gridded-land-obs/gridded-land-obs-averages-25km/"
},
{
"fieldsDescription":"http://data.ceda.ac.uk/badc/ukcp09/"
}
],
"name":"UK Weather information 2011",
"price":10,
"size":"3.1gb",
"tags":"weather, uk, 2011, temperature, humidity",
"type":"dataset",
"workExample":"423432fsd,51.509865,-0.118092,2011-01-01T10:55:11+00:00,7.2,68"
},
"curation":{
"numVotes":123,
"rating":0.93,
"schema":"Binary Votting"
}
},
"serviceEndpoint":"http://myaquarius.org/api/v1/provider/assets/metadata/{did}",
"type":"Metadata"
}
],
"type":"array"
}
},
"required":[
"@context",
"id",
"publicKey",
"authentication",
"service"
],
"type":"object"
}
}
],
"responses":{
"201":{
"description":"Asset successfully registered."
},
"400":{
"description":"One of the required attributes is missing."
},
"404":{
"description":"Invalid asset data."
},
"500":{
"description":"Error"
}
},
"summary":"Register DDO of a new asset",
"tags":[
"ddo"
]
}
},
"/api/v1/aquarius/assets/ddo/query":{
"get":{
"description":"",
"parameters":[
{
"description":"ID of the asset.",
"in":"query",
"name":"text",
"required":true,
"type":"string"
},
{
"description":"Key or list of keys to sort the result",
"example":{
"value":1
},
"in":"query",
"name":"sort",
"type":"object"
},
{
"description":"Number of records per page",
"example":100,
"in":"query",
"name":"offset",
"type":"int"
},
{
"description":"Page showed",
"example":0,
"in":"query",
"name":"page",
"type":"int"
}
],
"responses":{
"200":{
"description":"successful action"
}
},
"summary":"Get a list of DDOs that match with the given text.",
"tags":[
"ddo"
]
},
"post":{
"consumes":[
"application/json"
],
"description":"",
"parameters":[
{
"description":"Asset metadata.",
"in":"body",
"name":"body",
"required":true,
"schema":{
"properties":{
"offset":{
"description":"Number of records per page",
"example":100,
"type":"int"
},
"page":{
"description":"Page showed",
"example":0,
"type":"int"
},
"query":{
"description":"Query to realize",
"example":{
"value":1
},
"type":"string"
},
"sort":{
"description":"Key or list of keys to sort the result",
"example":{
"value":1
},
"type":"object"
}
},
"type":"object"
}
}
],
"responses":{
"200":{
"description":"successful action"
}
},
"summary":"Get a list of DDOs that match with the executed query.",
"tags":[
"ddo"
]
}
},
"/api/v1/aquarius/assets/ddo/{did}":{
"put":{
"consumes":[
"application/json"
],
"description":"",
"parameters":[
{
"description":"DDO of the asset.",
"in":"body",
"name":"body",
"required":true,
"schema":{
"properties":{
"@context":{
"description":null,
"example":"https://w3id.org/future-method/v1",
"type":"string"
},
"authentication":{
"description":"List of authentication mechanisms.",
"example":[
{
"type":"RsaSignatureAuthentication2018"
},
{
"publicKey":"did:op:123456789abcdefghi#keys-1"
}
],
"type":"array"
},
"id":{
"description":"ID of the asset.",
"example":"did:op:123456789abcdefghi",
"type":"string"
},
"publicKey":{
"description":"List of public keys.",
"example":[
{
"id":"did:op:123456789abcdefghi#keys-1"
},
{
"type":"Ed25519VerificationKey2018"
},
{
"owner":"did:op:123456789abcdefghi"
},
{
"publicKeyBase58":"H3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
}
],
"type":"array"
},
"service":{
"description":"List of services.",
"example":[
{
"serviceEndpoint":"http://mybrizo.org/api/v1/brizo/services/consume?pubKey=${pubKey}&serviceId={serviceId}&url={url}",
"type":"Consume"
},
{
"serviceEndpoint":"http://mybrizo.org/api/v1/brizo/services/compute?pubKey=${pubKey}&serviceId={serviceId}&algo={algo}&container={container}",
"type":"Compute"
},
{
"metadata":{
"additionalInformation":{
"structuredMarkup":[
{
"mediaType":"application/ld+json",
"uri":"http://skos.um.es/unescothes/C01194/jsonld"
},
{
"mediaType":"text/turtle",
"uri":"http://skos.um.es/unescothes/C01194/turtle"
}
],
"updateFrecuency":"yearly"
},
"base":{
"author":"Met Office",
"compression":"zip",
"contentType":"text/csv",
"contentUrls":[
"https://testocnfiles.blob.core.windows.net/testfiles/testzkp.zip"
],
"copyrightHolder":"Met Office",
"dateCreated":"2012-10-10T17:00:000Z",
"description":"Weather information of UK including temperature and humidity",
"encoding":"UTF-8",
"inLanguage":"en",
"license":"CC-BY",
"links":[
{
"name":"Sample of Asset Data",
"type":"sample",
"url":"https://foo.com/sample.csv"
},
{
"AssetID":"4d517500da0acb0d65a716f61330969334630363ce4a6a9d39691026ac7908ea",
"name":"Data Format Definition",
"type":"format"
}
],
"name":"UK Weather information 2011",
"price":10,
"size":"3.1gb",
"tags":"weather, uk, 2011, temperature, humidity",
"type":"dataset",
"workExample":"423432fsd,51.509865,-0.118092,2011-01-01T10:55:11+00:00,7.2,68"
},
"curation":{
"numVotes":123,
"rating":0.93,
"schema":"Binary Voting"
}
},
"serviceEndpoint":"http://myaquarius.org/api/v1/aquarius/assets/metadata/{did}",
"type":"Metadata"
}
],
"type":"array"
}
},
"required":[
"@context",
"id",
"publicKey",
"authentication",
"service"
],
"type":"object"
}
}
],
"responses":{
"200":{
"description":"Asset successfully updated."
},
"201":{
"description":"Asset successfully registered."
},
"400":{
"description":"One of the required attributes is missing."
},
"404":{
"description":"Invalid asset data."
},
"500":{
"description":"Error"
}
},
"summary":"Update DDO of an existing asset",
"tags":[
"ddo"
]
}
},
"/api/v1/aquarius/assets/ddo/{id}":{
"delete":{
"description":"",
"parameters":[
{
"description":"ID of the asset.",
"in":"path",
"name":"id",
"required":true,
"type":"string"
}
],
"responses":{
"200":{
"description":"successfully deleted"
},
"404":{
"description":"This asset ID is not in OceanDB"
},
"500":{
"description":"Error"
}
},
"summary":"Retire metadata of an asset",
"tags":[
"ddo"
]
},
"get":{
"description":"",
"parameters":[
{
"description":"ID of the asset.",
"in":"path",
"name":"id",
"required":true,
"type":"string"
}
],
"responses":{
"200":{
"description":"successful operation"
},
"404":{
"description":"This asset ID is not in OceanDB"
}
},
"summary":"Get DDO of a particular asset.",
"tags":[
"ddo"
]
}
},
"/api/v1/aquarius/assets/metadata/{id}":{
"get":{
"description":"",
"parameters":[
{
"description":"ID of the asset.",
"in":"path",
"name":"id",
"required":true,
"type":"string"
}
],
"responses":{
"200":{
"description":"successful operation."
},
"404":{
"description":"This asset ID is not in OceanDB."
}
},
"summary":"Get metadata of a particular asset",
"tags":[
"metadata"
]
}
}
},
"swagger":"2.0"
}

View File

@ -1,200 +0,0 @@
{
"basePath":"/api/v1/brizo",
"definitions":{
},
"host":"myfancybrizo.com",
"info":{
"description":"Brizo is the technical component executed by Publishers allowing them to provide extended data services. When running with our Docker images, it is exposed under `http://localhost:8030`.",
"title":"Brizo",
"version":"0.1.2"
},
"paths":{
"/api/v1/brizo/services/access/initialize":{
"post":{
"consumes":[
"application/json"
],
"description":"",
"parameters":[
{
"description":"Service agreement initialization.",
"in":"body",
"name":"body",
"required":true,
"schema":{
"properties":{
"consumerAddress":{
"description":"Consumer address.",
"example":"0x00a329c0648769A73afAc7F9381E08FB43dBEA72",
"type":"string"
},
"did":{
"description":"Identifier of the asset registered in ocean.",
"example":"did:op:08a429b8529856d59867503f8056903a680935a76950bb9649785cc97869a43d",
"type":"string"
},
"serviceAgreementId":{
"description":"Identifier of the service agreement.",
"example":"bb23s87856d59867503f80a690357406857698570b964ac8dcc9d86da4ada010",
"type":"string"
},
"serviceDefinitionId":{
"description":"Identifier of the service definition.",
"example":"0",
"type":"string"
},
"signature":{
"description":"Signature",
"example":"cade376598342cdae231321a0097876aeda656a567a67c6767fd8710129a9dc1",
"type":"string"
}
},
"required":[
"did",
"serviceAgreementId",
"serviceDefinitionId",
"signature",
{
"consumerAddress":null
}
],
"type":"object"
}
}
],
"responses":{
"201":{
"description":"Service agreement successfully initialized."
},
"400":{
"description":"One of the required attributes is missing."
},
"404":{
"description":"Invalid signature."
},
"500":{
"description":"Error"
}
},
"summary":"Initialize the SLA between the publisher and the consumer.",
"tags":[
"services"
]
}
},
"/api/v1/brizo/services/compute":{
"post":{
"consumes":[
"application/json"
],
"description":"",
"parameters":[
{
"description":"Asset metadata.",
"in":"body",
"name":"body",
"required":true,
"schema":{
"properties":{
"algorithm_did":{
"description":"Identifier of the algorithm to execute",
"example":"0x0234242345",
"type":"string"
},
"asset_did":{
"description":"Identifier of the asset registered in Ocean",
"example":"0x0234242345",
"type":"string"
},
"consumer_wallet":{
"description":"Address of the wallet of the asset consumer. Ex. data-science...",
"example":"0x0234242345",
"type":"string"
},
"cpu":{
"description":"Number of CPUs to execute the algorithm.",
"example":1,
"type":"integer"
},
"docker_image":{
"description":"Docker image where the algorithm is going to be executed. Docker image must include all the libraries needed to run it.",
"example":"python:3.6-alpine",
"type":"string"
},
"memory":{
"description":"Ammout of memory in GB to run the algorithm",
"example":1.5,
"type":"number"
}
},
"required":[
"asset_did",
"algorithm_did",
"consumer_wallet"
],
"type":"object"
}
}
],
"responses":{
},
"summary":"Allows to execute an algorithm inside a Docker instance in the cloud. Requires the publisher of the assets to provide this service in the service agreement related with the requested `asset_did`.",
"tags":[
"services"
]
}
},
"/api/v1/brizo/services/consume":{
"get":{
"consumes":[
"application/json"
],
"description":"",
"parameters":[
{
"description":"The consumer address.",
"in":"query",
"name":"consumerAddress",
"required":true,
"type":"string"
},
{
"description":"The ID of the service agreement.",
"in":"query",
"name":"serviceAgreementId",
"required":true,
"type":"string"
},
{
"description":"This URL is only valid if Brizo acts as a proxy. Consumer can't download using the URL if it's not through Brizo.",
"in":"query",
"name":"url",
"required":true,
"type":"string"
}
],
"responses":{
"302":{
"description":"Redirect to valid asset url."
},
"400":{
"description":"One of the required attributes is missing."
},
"404":{
"description":"Invalid asset data."
},
"500":{
"description":"Error"
}
},
"summary":"Allows download of asset data file.",
"tags":[
"services"
]
}
}
},
"swagger":"2.0"
}

View File

@ -13,7 +13,7 @@
link: /tutorials/introduction/ link: /tutorials/introduction/
color: orange color: orange
- title: API & Library References - title: API References
description: Get the references for REST APIs and library methods for all relevant components. description: Get the references for REST APIs and library methods for all relevant components.
link: /references/introduction/ link: /references/introduction/
color: green color: green

View File

@ -37,26 +37,6 @@ exports.onCreateNode = ({ node, getNode, actions }) => {
} }
} }
// https://github.com/swagger-api/swagger-js
const getSpec = async () => {
const spec = await Swagger(
'http://petstore.swagger.io/v2/swagger.json'
).then(client => {
return client.spec // The resolved spec
// client.originalSpec // In case you need it
// client.errors // Any resolver errors
// Tags interface
// client.apis.pet.addPet({id: 1, name: "bobby"}).then(...)
// TryItOut Executor, with the `spec` already provided
// client.execute({operationId: 'addPet', parameters: {id: 1, name: "bobby") }).then(...)
})
return spec
}
exports.createPages = ({ graphql, actions }) => { exports.createPages = ({ graphql, actions }) => {
const { createPage, createRedirect } = actions const { createPage, createRedirect } = actions
@ -152,44 +132,79 @@ exports.createPages = ({ graphql, actions }) => {
// //
// Create pages from swagger json files // Create pages from swagger json files
// //
const swaggerSpecs = [ const swaggerComponents = ['aquarius', 'brizo']
'./data/aquarius.json',
'./data/brizo.json'
]
const apiSwaggerTemplate = path.resolve( const apiSwaggerTemplate = path.resolve(
'./src/templates/Swagger/index.jsx' './src/templates/Swagger/index.jsx'
) )
swaggerSpecs.forEach(spec => { // https://github.com/swagger-api/swagger-js
const api = require(spec) // eslint-disable-line const fetchSwaggerSpec = async name => {
const name = path try {
.basename(spec) const client = await Swagger(
.split('.json') `https://nginx-${name}.dev-ocean.com/spec`
.join('') )
const slug = `/references/${name}/` return client.spec // The resolved spec
createPage({ // client.originalSpec // In case you need it
path: slug, // client.errors // Any resolver errors
component: apiSwaggerTemplate,
context: { // Tags interface
slug, // client.apis.pet.addPet({id: 1, name: "bobby"}).then(...)
api
} // TryItOut Executor, with the `spec` already provided
}) // client.execute({operationId: 'addPet', parameters: {id: 1, name: "bobby") }).then(...)
} catch (error) {
console.log(error)
}
}
const getSlug = name => {
const slug = `/references/${name}/`
return slug
}
const specAquarius = await fetchSwaggerSpec(
swaggerComponents[0]
)
const slugAquarius = getSlug(swaggerComponents[0])
createPage({
path: slugAquarius,
component: apiSwaggerTemplate,
context: {
slug: slugAquarius,
name: swaggerComponents[0],
api: specAquarius
}
}) })
// Swagger Pet Store example, fetch from remote const specBrizo = await fetchSwaggerSpec(swaggerComponents[1])
const slugBrizo = getSlug(swaggerComponents[1])
createPage({
path: slugBrizo,
component: apiSwaggerTemplate,
context: {
slug: slugBrizo,
name: swaggerComponents[1],
api: specBrizo
}
})
// Swagger Pet Store example
const petStoreSlug = '/references/petstore/' const petStoreSlug = '/references/petstore/'
try { try {
const api = await getSpec() const client = await Swagger(
`http://petstore.swagger.io/v2/swagger.json`
)
createPage({ createPage({
path: petStoreSlug, path: petStoreSlug,
component: apiSwaggerTemplate, component: apiSwaggerTemplate,
context: { context: {
slug: petStoreSlug, slug: petStoreSlug,
api api: client.spec
} }
}) })
} catch (error) { } catch (error) {

View File

@ -50,9 +50,17 @@
} }
.version { .version {
color: $brand-grey-light;
font-size: $font-size-base; font-size: $font-size-base;
font-family: $font-family-monospace; font-family: $font-family-monospace;
color: $brand-grey-light;
a {
font-size: $font-size-mini;
font-family: $font-family-base;
font-weight: $font-weight-base;
display: inline-block;
margin-left: .5rem;
}
} }
.pathName { .pathName {

View File

@ -69,7 +69,7 @@ export default class ApiSwaggerTemplate extends Component {
render() { render() {
const { location, pageContext } = this.props const { location, pageContext } = this.props
const { api } = pageContext const { api, name } = pageContext
const { host, basePath, info, paths } = api const { host, basePath, info, paths } = api
const { title, description, version, license, contact } = info const { title, description, version, license, contact } = info
@ -106,7 +106,12 @@ export default class ApiSwaggerTemplate extends Component {
description={description} description={description}
prepend={ prepend={
<span className={stylesDoc.version}> <span className={stylesDoc.version}>
{version} <span>v{version}</span>
<a
href={`https://app.swaggerhub.com/apis/Ocean-Protocol/${name}`}
>
past versions
</a>
</span> </span>
} }
/> />