The ingest docs in Elasticsearch doing point to the actual ingest APIs. This makes up generate links to the real APIs instead, fixing some broken links in the 5.x docs in the process.
210 lines
5.8 KiB
JavaScript
210 lines
5.8 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.
|
|
*/
|
|
|
|
'use strict'
|
|
|
|
const dedent = require('dedent')
|
|
|
|
function generateDocs (common, spec) {
|
|
var doc = dedent`
|
|
[[api-reference]]
|
|
== API Reference
|
|
|
|
////////
|
|
|
|
This documentation is generated by running:
|
|
node scripts/run.js --tag v7.0.0-beta
|
|
|
|
////////\n\n`
|
|
doc += commonParameters(common)
|
|
spec.forEach(s => {
|
|
doc += '\n' + generateApiDoc(s)
|
|
})
|
|
return doc
|
|
}
|
|
|
|
function commonParameters (spec) {
|
|
var doc = dedent`
|
|
=== Common parameters
|
|
Parameters that are accepted by all API endpoints.
|
|
|
|
link:{ref}/common-options.html[Reference]
|
|
[cols=2*]
|
|
|===\n`
|
|
Object.keys(spec.params).forEach(key => {
|
|
const name = isSnakeCased(key) && key !== camelify(key)
|
|
? '`' + key + '` or `' + camelify(key) + '`'
|
|
: '`' + key + '`'
|
|
|
|
doc += dedent`
|
|
|${name}
|
|
|${'`' + spec.params[key].type + '`'} - ${spec.params[key].description}`
|
|
if (spec.params[key].default) {
|
|
doc += ` +
|
|
_Default:_ ${'`' + spec.params[key].default + '`'}`
|
|
}
|
|
doc += '\n\n'
|
|
})
|
|
|
|
doc += dedent`
|
|
|===
|
|
`
|
|
return doc
|
|
}
|
|
|
|
function generateApiDoc (spec) {
|
|
const name = Object.keys(spec)[0]
|
|
const documentationUrl = fixLink(name, spec[name].documentation)
|
|
const params = []
|
|
// url params
|
|
const urlParts = spec[name].url.parts
|
|
if (urlParts) {
|
|
Object.keys(urlParts).forEach(param => {
|
|
params.push({
|
|
name: param,
|
|
type: getType(urlParts[param].type, urlParts[param].options),
|
|
description: urlParts[param].description,
|
|
default: urlParts[param].default
|
|
})
|
|
})
|
|
}
|
|
|
|
// query params
|
|
const urlParams = spec[name].url.params
|
|
if (urlParams) {
|
|
Object.keys(urlParams).forEach(param => {
|
|
params.push({
|
|
name: param,
|
|
type: getType(urlParams[param].type, urlParams[param].options),
|
|
description: urlParams[param].description,
|
|
default: urlParams[param].default
|
|
})
|
|
})
|
|
}
|
|
|
|
// body params
|
|
const body = spec[name].body
|
|
if (body) {
|
|
params.push({
|
|
name: 'body',
|
|
type: 'object',
|
|
description: body.description,
|
|
default: body.default
|
|
})
|
|
}
|
|
|
|
var doc = dedent`
|
|
=== ${camelify(name)}
|
|
[source,js]
|
|
----
|
|
client.${camelify(name)}([params] [, options] [, callback])
|
|
----\n`
|
|
if (documentationUrl) {
|
|
doc += `link:${documentationUrl}[Reference]\n`
|
|
}
|
|
|
|
if (params.length !== 0) {
|
|
doc += dedent`[cols=2*]
|
|
|===\n`
|
|
doc += params.reduce((acc, val) => {
|
|
const name = isSnakeCased(val.name) && val.name !== camelify(val.name)
|
|
? '`' + val.name + '` or `' + camelify(val.name) + '`'
|
|
: '`' + val.name + '`'
|
|
acc += dedent`
|
|
|${name}
|
|
|${'`' + val.type + '`'} - ${val.description}`
|
|
if (val.default) {
|
|
acc += ` +\n_Default:_ ${'`' + val.default + '`'}`
|
|
}
|
|
return acc + '\n\n'
|
|
}, '')
|
|
|
|
doc += dedent`
|
|
|===
|
|
`
|
|
}
|
|
doc += '\n'
|
|
return doc
|
|
}
|
|
|
|
const LINK_OVERRIDES = {
|
|
'license.delete': '{ref}/delete-license.html',
|
|
'license.get': '{ref}/get-license.html',
|
|
'license.get_basic_status': '{ref}/get-basic-status.html',
|
|
'license.get_trial_status': '{ref}/get-trial-status.html',
|
|
'license.post': '{ref}/update-license.html',
|
|
'license.post_start_basic': '{ref}/start-basic.html',
|
|
'license.post_start_trial': '{ref}/start-trial.html',
|
|
'migration.deprecations': '{ref}/migration-api-deprecation.html',
|
|
'monitoring.bulk': '{ref}/es-monitoring.html',
|
|
'ingest.delete_pipeline': '{ref}/delete-pipeline-api.html',
|
|
'ingest.get_pipeline': '{ref}/get-pipeline-api.html',
|
|
'ingest.put_pipeline': '{ref}/put-pipeline-api.html',
|
|
'ingest.simulate': '{ref}/simulate-pipeline-api.html',
|
|
'ingest.processor_grok': '{ref}/grok-processor.html#grok-processor-rest-get'
|
|
}
|
|
// Fixes bad urls in the JSON spec
|
|
function fixLink (name, str) {
|
|
/* In 6.x some API start with `xpack.` when in master they do not. We
|
|
* can safely ignore that for link generation. */
|
|
name = name.replace(/^xpack\./, '')
|
|
const override = LINK_OVERRIDES[name]
|
|
if (override) return override
|
|
if (!str) return ''
|
|
/* Replace references to the guide with the attribute {ref} because
|
|
* the json files in the Elasticsearch repo are a bit of a mess. */
|
|
str = str.replace(/^.+guide\/en\/elasticsearch\/reference\/[^/]+\/([^./]*\.html(?:#.+)?)$/, '{ref}/$1')
|
|
str = str.replace(/frozen\.html/, 'freeze-index-api.html')
|
|
str = str.replace(/ml-file-structure\.html/, 'ml-find-file-structure.html')
|
|
str = str.replace(/security-api-get-user-privileges\.html/, 'security-api-get-privileges.html')
|
|
|
|
return str
|
|
}
|
|
|
|
function getType (type, options) {
|
|
switch (type) {
|
|
case 'list':
|
|
return 'string, string[]'
|
|
case 'date':
|
|
case 'time':
|
|
case 'timeout':
|
|
return 'string'
|
|
case 'enum':
|
|
return options.map(k => `'${k}'`).join(', ')
|
|
case 'int':
|
|
case 'double':
|
|
case 'long':
|
|
return 'number'
|
|
default:
|
|
return type
|
|
}
|
|
}
|
|
|
|
function camelify (str) {
|
|
return str[0] === '_'
|
|
? '_' + str.slice(1).replace(/_([a-z])/g, k => k[1].toUpperCase())
|
|
: str.replace(/_([a-z])/g, k => k[1].toUpperCase())
|
|
}
|
|
|
|
function isSnakeCased (str) {
|
|
return !!~str.indexOf('_')
|
|
}
|
|
|
|
module.exports = generateDocs
|