graphbrainz/scripts/build-extension-docs.js

67 lines
2.1 KiB
JavaScript
Raw Permalink Normal View History

import fs from 'fs'
import path from 'path'
import { graphql, introspectionQuery } from 'graphql'
import { renderSchema, diffSchema } from 'graphql-markdown'
import baseSchema, { createSchema } from '../src/schema'
const extensionModules = [
'cover-art-archive',
'fanart-tv',
'mediawiki',
'the-audio-db'
]
function getSchemaJSON (schema) {
return graphql(schema, introspectionQuery).then(result => result.data)
}
Promise.all(extensionModules.map(extensionModule => {
const extension = require(`../src/extensions/${extensionModule}`).default
console.log(`Generating docs for “${extension.name}” extension...`)
const schema = createSchema(baseSchema, { extensions: [extension] })
return Promise.all([
getSchemaJSON(baseSchema),
getSchemaJSON(schema)
]).then(([baseSchemaJSON, schemaJSON]) => {
const outputSchema = diffSchema(baseSchemaJSON, schemaJSON, {
processTypeDiff (type) {
if (type.description === undefined) {
type.description =
':small_blue_diamond: *This type has been extended. See the ' +
'[base schema](../types.md)\nfor a description and additional ' +
'fields.*'
}
return type
}
})
const outputPath = path.resolve(
__dirname,
`../docs/extensions/${extensionModule}.md`
)
const stream = fs.createWriteStream(outputPath)
const printer = (line) => stream.write(`${line}\n`)
const prologuePath = path.resolve(
__dirname,
`../src/extensions/${extensionModule}/prologue.md`
)
const prologue = fs.readFileSync(prologuePath, 'utf8')
renderSchema(outputSchema, {
title: `Extension: ${extension.name}`,
prologue: prologue.trim()
? `${extension.description}\n\n${prologue}`
: extension.description,
printer,
unknownTypeURL: '../types.md'
})
stream.end()
return new Promise((resolve, reject) => {
stream.on('error', reject)
stream.on('finish', () => resolve(extension))
})
})
})).then((extensions) => {
console.log(`Built docs for ${extensions.length} extension(s).`)
}).catch(err => {
console.log('Error:', err)
})