114 lines
3.3 KiB
JavaScript
114 lines
3.3 KiB
JavaScript
/*
|
|
* Licensed to Elasticsearch B.V. under one or more contributor
|
|
* license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright
|
|
* ownership. Elasticsearch B.V. licenses this file to you under
|
|
* the Apache License, Version 2.0 (the "License"); you may
|
|
* not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
const { join } = require('path')
|
|
const { writeFile } = require('fs/promises')
|
|
const fetch = require('node-fetch')
|
|
const { rimraf } = require('rimraf')
|
|
const ora = require('ora')
|
|
const { convertRequests } = require('@elastic/request-converter')
|
|
const minimist = require('minimist')
|
|
|
|
const docsExamplesDir = join('docs', 'doc_examples')
|
|
|
|
const log = ora('Generating example snippets')
|
|
|
|
const failures = {}
|
|
|
|
async function getAlternativesReport (version = 'master') {
|
|
const reportUrl = `https://raw.githubusercontent.com/elastic/built-docs/master/raw/en/elasticsearch/reference/${version}/alternatives_report.json`
|
|
const response = await fetch(reportUrl)
|
|
if (!response.ok) {
|
|
log.fail(`unexpected response ${response.statusText}`)
|
|
process.exit(1)
|
|
}
|
|
return await response.json()
|
|
}
|
|
|
|
async function makeSnippet (example) {
|
|
const { source, digest } = example
|
|
const fileName = `${digest}.asciidoc`
|
|
const filePath = join(docsExamplesDir, fileName)
|
|
|
|
try {
|
|
const code = await convertRequests(source, 'javascript', {
|
|
complete: false,
|
|
printResponse: true
|
|
})
|
|
await writeFile(filePath, asciidocWrapper(code), 'utf8')
|
|
} catch (err) {
|
|
failures[digest] = err.message
|
|
}
|
|
}
|
|
|
|
async function generate (version) {
|
|
log.start()
|
|
|
|
rimraf.sync(join(docsExamplesDir, '*'))
|
|
|
|
log.text = `Downloading alternatives report for version ${version}`
|
|
const examples = await getAlternativesReport(version)
|
|
|
|
let counter = 1
|
|
for (const example of examples) {
|
|
log.text = `${counter++}/${examples.length}: ${example.digest}`
|
|
|
|
// skip over bad request definitions
|
|
if (example.source.startsWith('{') || example.source.endsWith('...')) {
|
|
failures[example.digest] = 'Incomplete request syntax'
|
|
continue
|
|
}
|
|
|
|
await makeSnippet(example)
|
|
}
|
|
}
|
|
|
|
function asciidocWrapper (source) {
|
|
return `// This file is autogenerated, DO NOT EDIT
|
|
// Use \`node scripts/generate-docs-examples.js\` to generate the docs examples
|
|
|
|
[source, js]
|
|
----
|
|
${source.trim()}
|
|
----
|
|
`
|
|
}
|
|
|
|
const options = minimist(process.argv.slice(2), {
|
|
boolean: ['debug'],
|
|
string: ['version'],
|
|
default: {
|
|
version: 'master'
|
|
}
|
|
})
|
|
|
|
generate(options.version)
|
|
.then(() => log.succeed('done!'))
|
|
.catch(err => log.fail(err.message))
|
|
.finally(() => {
|
|
const keys = Object.keys(failures)
|
|
if (keys.length > 0 && options.debug) {
|
|
let message = 'Some examples failed to generate:\n\n'
|
|
for (const key of keys) {
|
|
message += `${key}: ${failures[key]}\n`
|
|
}
|
|
console.error(message)
|
|
}
|
|
})
|