nx/scripts/documentation/generate-npmscripts-data.ts
ben 84deb16d11 feat(scripts): documentation upgrade
Follow the new package architecture.
The generation of the documentation has been improved, new helper
functions have been added to handle the new architecture.
2019-05-13 22:31:32 -04:00

88 lines
2.4 KiB
TypeScript

import * as fs from 'fs-extra';
import * as yargs from 'yargs';
import * as path from 'path';
import { dedent } from 'tslint/lib/utils';
import { generateFile, sortAlphabeticallyFunction } from './utils';
import { commandsObject } from '../../packages/workspace';
const commandsOutputDirectory = path.join(
__dirname,
'../../docs/api-npmscripts'
);
fs.removeSync(commandsOutputDirectory);
function getCommands(command) {
return command.getCommandInstance().getCommandHandlers();
}
function parseCommandInstance(name, command) {
const builder = command.builder((<any>yargs).resetOptions());
const builderDescriptions = builder.getUsageInstance().getDescriptions();
const builderDefaultOptions = builder.getOptions().default;
return {
command: command['original'],
description: command['description'],
options:
Object.keys(builderDescriptions).map(name => ({
command: '--'.concat(name),
description: builderDescriptions[name]
? builderDescriptions[name].replace('__yargsString__:', '')
: '',
default: builderDefaultOptions[name]
})) || null
};
}
function generateMarkdown(command) {
let template = dedent`
# ${command.command}
${command.description}
## Usage
\`\`\`bash
${command.command}
\`\`\`
`;
if (Array.isArray(command.options) && !!command.options.length) {
template += '## Options';
command.options
.sort((a, b) =>
sortAlphabeticallyFunction(
a.command.replace('--', ''),
b.command.replace('--', '')
)
)
.forEach(
option =>
(template += dedent`
### ${option.command.replace('--', '')}
${
option.default === undefined || option.default === ''
? ''
: `Default: \`${option.default}\`\n`
}
${option.description}
`)
);
}
return {
name: command.command
.replace(':', '-')
.replace(' ', '-')
.replace(/[\]\[.]+/gm, ''),
template
};
}
// TODO: Try to add option's type, examples, and group?
// TODO: split one command per page / Create an index
const npmscripts = getCommands(commandsObject);
Object.keys(npmscripts)
.map(name => parseCommandInstance(name, npmscripts[name]))
.map(command => generateMarkdown(command))
.forEach(templateObject =>
generateFile(commandsOutputDirectory, templateObject)
);