2018-08-29 01:57:18 +02:00
"use strict" ;
2018-10-01 22:47:10 +02:00
2018-11-30 21:46:22 +01:00
// I M P O R T S
2018-10-01 22:47:10 +02:00
2018-08-29 18:58:55 +02:00
import asyncHtml from "choo-async/html" ;
2018-08-29 01:57:18 +02:00
import dedent from "dedent" ;
2019-01-08 18:25:34 +01:00
import got from "got" ;
2018-10-01 22:47:10 +02:00
2018-10-10 19:56:35 +02:00
// U T I L S
2018-08-29 01:57:18 +02:00
2019-01-30 00:29:14 +01:00
import headerBlockchain from "@component/api/header-blockchain" ;
import headerSdk from "@component/api/header-sdk" ;
import redirects from "@data/redirects.json" ;
2018-11-30 21:46:22 +01:00
2018-12-31 15:30:32 +01:00
const blockchainApi = "https://cdn.jsdelivr.net/gh/lbryio/lbrycrd@master/contrib/devtools/generated/api_v1.json" ;
2019-01-08 18:25:34 +01:00
const cache = new Map ( ) ;
2019-01-30 23:15:10 +01:00
const sdkApi = process . env . NODE _ENV === "development" ?
"https://cdn.jsdelivr.net/gh/lbryio/lbry@generate_examples/docs/api.json" : // TODO: Remove when `generate_examples` is merged into master
"https://cdn.jsdelivr.net/gh/lbryio/lbry@master/docs/api.json" ;
2018-10-01 22:47:10 +02:00
// E X P O R T
2018-08-29 01:57:18 +02:00
2018-11-30 21:46:22 +01:00
export default async ( state ) => {
// How to set custom metadata for this page
// state.lbry = {
// description: "This is the API page for LBRY.tech",
// "og:image": "/assets/media/images/carlsagan2.jpg",
// "og:image:height": 300,
// "og:image:width": 400
// };
try {
const apiResponse = await parseApiFile ( state . params . wildcard ) ;
return asyncHtml `
< div class = "__slate" >
2019-01-30 23:15:10 +01:00
< aside class = "api-toc" >
< div class = "api-toc__search" >
< input class = "api-toc__search-field" id = "input-search" placeholder = "Search" type = "search" / >
< div class = "api-toc__search-clear" id = "clear-search" title = "Clear search query" > & times ; < / d i v >
< ul class = "api-toc__search-results" > < / u l >
2018-11-30 21:46:22 +01:00
< / d i v >
2019-01-30 23:15:10 +01:00
< ul class = "api-toc__items" id = "toc" role = "navigation" > $ { createApiSidebar ( apiResponse ) } < / u l >
2018-11-30 21:46:22 +01:00
< / a s i d e >
2019-01-30 23:15:10 +01:00
< section class = "api-content" >
< div class = "api-documentation" id = "toc-content" >
< div > & nbsp ; < / d i v >
< nav class = "api-content__items" >
< button class = "api-content__item" id = "toggle-curl" type = "button" > curl < / b u t t o n >
< button class = "api-content__item" id = "toggle-lbrynet" type = "button" > lbrynet < / b u t t o n >
< button class = "api-content__item" id = "toggle-python" type = "button" > python < / b u t t o n >
< / n a v >
$ { createApiHeader ( state . params . wildcard ) }
2018-11-30 21:46:22 +01:00
$ { createApiContent ( apiResponse ) }
< / d i v >
< / s e c t i o n >
< / d i v >
< script src = "/assets/scripts/plugins/jets.js" > < / s c r i p t >
< script src = "/assets/scripts/api.js" > < / s c r i p t >
2019-01-30 23:15:10 +01:00
< script >
document . getElementById ( "toggle-curl" ) . click ( ) ;
< / s c r i p t >
2018-11-30 21:46:22 +01:00
` ;
}
2019-01-08 18:25:34 +01:00
catch ( error ) {
2018-10-06 22:53:01 +02:00
const redirectUrl = redirects [ state . href ] ;
2018-08-29 01:57:18 +02:00
2018-10-06 22:53:01 +02:00
return asyncHtml `
2018-10-06 22:59:46 +02:00
< article class = "page" itemtype = "http://schema.org/BlogPosting" >
< header class = "page__header" >
< div class = "page__header-wrap" >
< div class = "inner-wrap" >
< h1 class = "page__header__title" itemprop = "name headline" > 404 < / h 1 >
< / d i v >
2018-10-01 22:47:10 +02:00
< / d i v >
2018-10-06 22:59:46 +02:00
< / h e a d e r >
2018-08-29 01:57:18 +02:00
2018-10-06 22:59:46 +02:00
< section class = "page__content page__markup" itemprop = "articleBody" >
< div class = "inner-wrap" >
< p > Redirecting you to < strong > $ { redirectUrl } < / s t r o n g > < / p >
< / d i v >
< / s e c t i o n >
< / a r t i c l e >
< script >
setTimeout ( ( ) => {
window . location . href = "${redirectUrl}" ;
} , 2000 ) ;
< / s c r i p t >
` ;
2018-11-30 21:46:22 +01:00
}
} ;
2018-09-30 19:34:29 +02:00
2018-08-29 01:57:18 +02:00
2018-10-01 22:47:10 +02:00
// H E L P E R S
2018-10-01 06:40:24 +02:00
2018-08-29 01:57:18 +02:00
function createApiContent ( apiDetails ) {
const apiContent = [ ] ;
for ( const apiDetail of apiDetails ) {
let apiDetailsReturns = "" ;
2018-10-06 22:53:01 +02:00
2018-11-30 21:46:22 +01:00
if ( apiDetail . returns )
apiDetailsReturns = JSON . parse ( JSON . stringify ( apiDetail . returns ) ) ;
2018-08-29 01:57:18 +02:00
apiContent . push ( `
2019-01-30 23:15:10 +01:00
< div class = "api-content__body" >
2018-08-29 01:57:18 +02:00
< h2 id = "${apiDetail.name}" > $ { apiDetail . name } < / h 2 >
< p > $ { apiDetail . description } < / p >
2019-01-30 23:15:10 +01:00
$ { apiDetail . arguments . length ? ` <h3>Arguments</h3><ul class="api-content__body-arguments"> ${ renderArguments ( apiDetail . arguments ) . join ( "" ) } </ul> ` : "" }
2018-08-29 01:57:18 +02:00
2019-01-30 23:15:10 +01:00
$ { ! apiDetail . examples || ! apiDetail . examples . length ? ( ` <h3>Returns</h3><pre><code> ${ dedent ( apiDetailsReturns ) } </code></pre> ` ) : "" }
2018-08-29 01:57:18 +02:00
< / d i v >
2019-01-30 23:15:10 +01:00
< div class = "api-content__example" >
$ { apiDetail . examples && apiDetail . examples . length ? renderExamples ( apiDetail . examples ) . join ( "" ) : ` <pre><code>// example(s) for ${ apiDetail . name } to come later</code></pre> ` }
2018-08-29 01:57:18 +02:00
< / d i v >
` );
}
return apiContent ;
}
2018-10-01 22:47:10 +02:00
function createApiHeader ( slug ) {
switch ( slug ) {
case "blockchain" :
return headerBlockchain ( ) ;
case "sdk" :
return headerSdk ( ) ;
default :
break ;
}
}
2018-08-29 01:57:18 +02:00
function createApiSidebar ( apiDetails ) {
const apiSidebar = [ ] ;
for ( const apiDetail of apiDetails ) {
apiSidebar . push ( `
2019-01-30 23:15:10 +01:00
< li class = "api-toc__item" >
2018-08-29 01:57:18 +02:00
< a href = "#${apiDetail.name}" title = "Go to ${apiDetail.name} section" >
$ { apiDetail . name }
< / a >
< / l i >
` );
}
return apiSidebar ;
}
2019-01-08 18:25:34 +01:00
async function parseApiFile ( urlSlug ) {
2018-08-29 01:57:18 +02:00
let apiFileLink ;
2018-10-01 22:47:10 +02:00
switch ( true ) {
case ( urlSlug === "blockchain" ) :
2018-12-12 19:32:05 +01:00
apiFileLink = blockchainApi ;
2018-10-01 22:47:10 +02:00
break ;
2018-08-29 01:57:18 +02:00
2018-10-01 22:47:10 +02:00
case ( urlSlug === "sdk" ) :
2018-12-12 19:32:05 +01:00
apiFileLink = sdkApi ;
2018-10-01 22:47:10 +02:00
break ;
default :
break ;
}
2018-08-29 01:57:18 +02:00
2019-01-08 18:25:34 +01:00
if ( ! apiFileLink )
return Promise . reject ( new Error ( "Failed to fetch API docs" ) ) ;
const response = await got ( apiFileLink , { cache : cache , json : true } ) ;
try {
return response . body ;
} catch ( error ) {
return "Issue loading API documentation" ;
}
2018-08-29 01:57:18 +02:00
}
function renderArguments ( args ) {
const argumentContent = [ ] ;
for ( const arg of args ) {
argumentContent . push ( `
2019-01-30 23:15:10 +01:00
< li class = "api-content__body-argument" >
2018-08-29 01:57:18 +02:00
< div class = "left" >
< strong > $ { arg . name } < /strong><br/ >
$ { arg . is _required === true ? "" : "<span>optional</span>" } < span > $ { arg . type } < / s p a n >
< / d i v >
< div class = "right" > $ { typeof arg . description === "string" ? arg . description . replace ( /</g , "<" ) . replace ( />/g , ">" ) : "" } < / d i v >
< / l i >
` );
}
return argumentContent ;
}
2019-01-30 23:15:10 +01:00
function renderExamples ( args ) {
const exampleContent = [ ] ;
for ( const arg of args ) {
exampleContent . push ( `
< h3 > $ { arg . title } < /h3><br/ >
< pre data - api - example - type = "curl" > < code > $ { arg . curl } < / c o d e > < / p r e >
< pre data - api - example - type = "lbrynet" > < code > $ { arg . lbrynet } < / c o d e > < / p r e >
< pre data - api - example - type = "python" > < code > $ { arg . python } < / c o d e > < / p r e >
< h3 > Output < /h3><br/ >
< pre > < code > $ { arg . output } < / c o d e > < / p r e >
` );
}
return exampleContent ;
}