"use strict"; // I M P O R T S import asyncHtml from "choo-async/html"; // U T I L S import headerBlockchain from "../components/api/header-blockchain"; import headerSdk from "../components/api/header-sdk"; import redirects from "../data/redirects.json"; const cache = new Map(); const filePathBlockchain = "/contrib/devtools/generated/api_v1.json"; const filePathSdk = "docs/api.json"; const rawGitHubBase = "https://cdn.jsdelivr.net/gh/lbryfoundation/"; // E X P O R T export default async(state) => { const { tag } = state; const { wildcard } = state.params; const repository = wildcard === "sdk" ? "lbry-sdk" : "lbrycrd"; state.lbry = { title: tag ? tag + " API Documentation" : "API Documentation", description: "See API documentation, signatures, and sample calls for the LBRY APIs." }; const tags = await getTags(repository); const currentTag = tag && tag.length ? tag : tags[0]; try { const apiResponse = await parseApiFile({ repo: repository, tag: currentTag }); return asyncHtml`
${asyncHtml(createApiHeader(wildcard, currentTag))} ${asyncHtml(wildcard === "sdk" ? createSdkContent(apiResponse) : createApiContent(apiResponse))}
`; } catch(error) { console.log(error); const redirectUrl = redirects[state.href]; return asyncHtml`

Redirecting you to ${redirectUrl}

`; } }; // H E L P E R S function createApiContent(apiDetails) { const apiContent = []; apiDetails.forEach(apiDetail => { let apiDetailsReturns = ""; if (apiDetail.returns) apiDetailsReturns = JSON.parse(JSON.stringify(apiDetail.returns)); apiContent.push(`

${apiDetail.name}

${apiDetail.description}

${apiDetail.arguments.length ? `

Arguments

` : ""} ${apiDetail.returns ? `

Returns

${dedent(apiDetailsReturns)}
` : ""}
${apiDetail.examples && apiDetail.examples.length ? renderExamples(apiDetail.examples).join("") : `
// example(s) for ${apiDetail.name} to come later
`}
`); }); return apiContent; } function createApiHeader(slug, apiVersion) { switch(slug) { case "blockchain": return headerBlockchain(apiVersion); case "sdk": return headerSdk(apiVersion); default: break; } } function createApiSidebar(apiDetails) { const apiSidebar = []; apiDetails.forEach(apiDetail => { apiSidebar.push(`
  • ${apiDetail.name}
  • `); }); return apiSidebar; } function createSdkContent(apiDetails) { const apiContent = []; const sectionTitles = Object.keys(apiDetails); sectionTitles.forEach(title => { const commands = apiDetails[title].commands; const description = apiDetails[title].doc; apiContent.push( commands.length ? commands.map(command => createSdkContentSections(title, description, command)).join("") : "" ); }); return apiContent; } function createSdkContentSections(sectionTitle, sectionDescription, sectionDetails) { return `

    ${sectionDetails.name}

    ${sectionDetails.description}

    Arguments

    Returns

    ${renderReturns(sectionDetails.returns)}
    ${renderExamples(sectionDetails.examples).join("")}
    `; } function createSdkSidebar(apiDetails) { const sectionTitles = Object.keys(apiDetails); const apiSidebar = []; sectionTitles.forEach(title => { const commands = apiDetails[title].commands; apiSidebar.push(` `); }); return apiSidebar; } async function getTags(repositoryName) { const {versions: data} = await (await fetch(`https://data.jsdelivr.com/v1/packages/gh/lbryfoundation/${repositoryName}`)).json(); // const { data } = await octokit.repos.listTags({ // owner: "lbryio", // repo: repositoryName // }); const tags = ["master"]; // NOTE: // The versioning in our repos do not make sense so extra // exclusion code is needed to make this work. // // Documentation is only available after specific versions. switch(true) { case repositoryName === "lbry-sdk": data.forEach(tag => { if (tag.version >= "v0.52.0") tags.push(tag.version); }); break; case repositoryName === "lbrycrd": data.forEach(tag => { if ( tag.version >= "v0.17.1.0" && tag.version !== "v0.3.16" && tag.version !== "v0.3.15" && tag.version !== "v0.3-osx" && tag.version !== "v0.2-alpha" ) tags.push(tag.version); }); break; default: break; } return tags; } async function parseApiFile({ repo, tag }) { let apiFileLink = `${rawGitHubBase}${repo}@${tag}/`; switch(true) { case (repo === "lbrycrd"): apiFileLink = `${apiFileLink}${filePathBlockchain}`; break; case (repo === "lbry-sdk"): apiFileLink = `${apiFileLink}${filePathSdk}`; break; default: return Promise.reject(new Error("Failed to fetch API docs")); } // if (cache.has(apiFileLink)) { // console.log("Using cache for " + apiFileLink); // return cache.get(apiFileLink); // } const response = await fetch(apiFileLink); try { const json = response.json(); // cache.set(apiFileLink, json); return json; } catch(error) { return "Issue loading API documentation"; } } function renderArguments(args) { const argumentContent = []; if (!args || args.length === 0) return argumentContent; args.forEach(arg => { argumentContent.push(`
  • ${arg.name}
    ${arg.is_required === true ? "" : "optional"}${arg.type}
    ${typeof arg.description === "string" ? arg.description.replace(//g, ">") : ""}
  • `); }); return argumentContent; } function renderExamples(args) { const exampleContent = []; if (!args || args.length === 0) { exampleContent.push("
    // example(s) to come later
    "); return exampleContent; } args.forEach(arg => { exampleContent.push(` ${arg.title ? `

    ${arg.title}


    ` : ""} ${arg.cli ? `
    ${arg.cli}
    ` : ""} ${arg.curl ? `
    ${arg.curl}
    ` : ""} ${arg.lbrynet ? `
    ${arg.lbrynet}
    ` : ""} ${arg.python ? `
    ${arg.python}
    ` : ""} ${arg.output ? `

    Output


    ${arg.output}

    ` : ""} `); }); return exampleContent; } function renderReturns(args) { let returnContent = []; if (!args || args.length === 0) return returnContent; returnContent = dedent(JSON.parse(JSON.stringify(args))); return returnContent; } function renderVersionSelector(pageSlug, versions, desiredTag) { const options = [ "" ]; let optionIndex = 0; versions.forEach(version => { optionIndex++; let selectedOption = false; if (desiredTag && desiredTag === version) selectedOption = true; else if (optionIndex === 1) selectedOption = true; options.push( `` ); }); return options; } function renderCodeLanguageToggles(pageSlug) { const onSdkPage = pageSlug === "sdk"; return [ "", !onSdkPage ? "" : "", "", onSdkPage ? "" : "", onSdkPage ? "" : "" ]; } function dedent(string) { // Split into lines const lines = string.split('\n'); if (lines[0].trim() === '') lines.shift(); if (lines.length > 0 && lines[lines.length - 1].trim() === '') lines.pop(); const indents = lines .slice(1) .filter(line => line.trim() !== '') .map(line => line.match(/^\s*/)[0].length); const minIndent = indents.length > 0 ? Math.min(...indents) : 0; return lines.map(line => { const leadingWhitespace = line.match(/^\s*/)[0]; if (leadingWhitespace.length >= minIndent) { return line.slice(minIndent); } return line; }).join('\n'); }