UNPKG

@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
'use strict' 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') }