flecks/packages/dox/build/commands.js
2024-01-26 06:42:49 -06:00

68 lines
2.0 KiB
JavaScript

const {mkdir, writeFile} = require('fs/promises');
const {join, relative, resolve} = require('path');
const {
generateDocusaurus,
generateJson,
} = require('./generate');
const {
FLECKS_CORE_ROOT = process.cwd(),
} = process.env;
module.exports = (program, flecks) => {
const commands = {};
commands.dox = {
description: 'Generate documentation',
action: async (subcommand, outputPath) => {
let actualOutputPath = outputPath;
if (!actualOutputPath) {
switch (subcommand) {
case 'docusaurus':
actualOutputPath = 'website/docs/flecks';
break;
case 'json':
actualOutputPath = 'dist/dox';
break;
default:
break;
}
}
actualOutputPath = resolve(FLECKS_CORE_ROOT, actualOutputPath);
await mkdir(actualOutputPath, {recursive: true});
let output;
const json = await generateJson(flecks);
switch (subcommand) {
case 'docusaurus':
output = Object.fromEntries(
Object.entries(generateDocusaurus(json))
.map(([type, page]) => [`${type}.mdx`, page]),
);
break;
case 'json':
output = Object.fromEntries(
Object.entries(json)
.map(([type, value]) => [`${type}.json`, JSON.stringify(value, null, 2)]),
);
break;
default:
break;
}
await Promise.all(
Object.entries(output)
.map(([filename, output]) => (
writeFile(join(actualOutputPath, filename), output)
)),
);
// eslint-disable-next-line no-console
console.log("Output documentation to '%s'", relative(FLECKS_CORE_ROOT, actualOutputPath));
},
args: [
program.createArgument('subcommand', 'Generation type')
.choices(['docusaurus', 'json']),
program.createArgument('[output path]', 'Where the files are output'),
],
};
return commands;
};