@opendevise/antora-swagger-ui-extension
Version:
An Antora extension that integrates the Swagger UI (interactive API explorer) into an Antora site through AsciiDoc syntax extensions.
66 lines (61 loc) • 2.74 kB
JavaScript
const fs = require('node:fs')
const { promises: fsp } = fs
const LazyReadable = require('./util/lazy-readable')
const ospath = require('node:path')
const { posix: path } = ospath
module.exports.register = function () {
this.once('playbookBuilt', ({ playbook }) => {
playbook.asciidoc.extensions.push(__dirname + ospath.sep + 'swagger-ui-asciidoctor-extensions.js')
})
this.once('uiLoaded', ({ playbook, uiCatalog }) => {
const uiOutputDir = playbook.ui.outputDir
const swaggerUiDistDir = require('swagger-ui-dist').absolutePath()
for (let basename of ['swagger-ui-bundle.js', 'swagger-ui.css']) {
const assetAbsPath = swaggerUiDistDir + ospath.sep + basename
if (~basename.indexOf('-bundle.')) basename = basename.replace(/-bundle(?=\.)/, '')
const assetDir = path.extname(basename).slice(1)
const assetPath = path.join(assetDir, 'vendor', basename)
uiCatalog.addFile({
contents: new LazyReadable(() => fs.createReadStream(assetAbsPath)),
type: 'asset',
path: assetPath,
out: { dirname: uiOutputDir, path: path.join(uiOutputDir, assetPath), basename },
})
}
const extraCssPath = path.join('css', 'vendor', 'swagger-ui-extra.css')
uiCatalog.addFile({
contents: Buffer.from('.swagger-ui{hyphens:none;word-wrap:normal}\n'),
type: 'asset',
path: extraCssPath,
out: { dirname: uiOutputDir, path: path.join(uiOutputDir, extraCssPath), basename: path.basename(extraCssPath) },
})
const partials = uiCatalog.findByType('partial').reduce((accum, it) => {
accum[it.basename] = it
return accum
}, {})
if ('head-styles.hbs' in partials) {
appendToContents(
partials['head-styles.hbs'],
'{{#if page.attributes.openapi-spec-loaders}}\n' +
' <link rel="stylesheet" href="{{{uiRootPath}}}/css/vendor/swagger-ui.css">\n' +
' <link rel="stylesheet" href="{{{uiRootPath}}}/css/vendor/swagger-ui-extra.css">\n' +
'{{/if}}'
)
}
if ('footer-scripts.hbs' in partials) {
appendToContents(
partials['footer-scripts.hbs'],
'{{#if page.attributes.openapi-spec-loaders}}\n' +
'<script defer src="{{{uiRootPath}}}/js/vendor/swagger-ui.js"></script>\n' +
'{{#each page.attributes.openapi-spec-loaders}}\n' +
'<script defer class="swagger-ui-spec-loader" src="{{{relativize ./url}}}"{{#each ./config}} data-{{{@key}}}="{{{this}}}"{{/each}}></script>\n' +
'{{/each}}\n' +
'{{/if}}'
)
}
})
}
function appendToContents (file, contentsToAppend) {
file.contents = Buffer.from(file.contents.toString().trimEnd() + '\n' + contentsToAppend + '\n')
}