@antora/atlas-extension
Version:
An Antora extension that manages references across discrete runs of Antora through the use of a site manifest.
68 lines (60 loc) • 2.27 kB
JavaScript
const { name: packageName } = require('#package')
const expandPath = require('@antora/expand-path-helper')
const fsp = require('node:fs/promises')
const { concat: get } = require('simple-get')
const getCacheDir = require('cache-directory')
const { ungzip: gunzip } = require('node-gzip')
const ospath = require('node:path')
const URI_SCHEME_RX = /^https?:\/\//
async function readSiteManifest (playbook, manifestUrl) {
const manifestPath = await (isUrl(manifestUrl)
? downloadSiteManifest(playbook, manifestUrl)
: expandPath(manifestUrl, { dot: playbook.dir }))
try {
return JSON.parse(
await fsp.readFile(manifestPath).then((contents) => (manifestPath.endsWith('.gz') ? gunzip(contents) : contents))
)
} catch {
return {}
}
}
function isUrl (string) {
return ~string.indexOf('://') && URI_SCHEME_RX.test(string)
}
function downloadSiteManifest (playbook, url) {
const { cacheDir, fetch } = playbook.runtime || {}
const resolvedCacheDir = resolveCacheDir(cacheDir, playbook.dir || '.')
const gzipped = url.endsWith('.gz')
const cacheFile = ospath.join(resolvedCacheDir, `${new URL(url).hostname}-site-manifest.json${gzipped ? '.gz' : ''}`)
return (
fetch
? Promise.resolve(false)
: fsp.access(cacheFile).then(
() => true,
() => false
)
).then((exists) =>
exists
? cacheFile
: fsp.mkdir(resolvedCacheDir, { recursive: true }).then(
() =>
new Promise((resolve, reject) =>
get({ url }, (err, response, contents) => {
if (err) return reject(Object.assign(err, { package: packageName }))
if (response.statusCode !== 200) {
const message = `Response code ${response.statusCode} (${response.statusMessage})`
return reject(Object.assign(new Error(message), { name: 'HTTPError', package: packageName }))
}
return fsp.writeFile(cacheFile, contents).then(() => resolve(cacheFile))
})
)
)
)
}
function resolveCacheDir (cacheDir, startDir) {
return cacheDir == null
? getCacheDir('antora') || ospath.resolve('.antora/cache')
: expandPath(cacheDir, { dot: startDir })
}
module.exports = readSiteManifest