92 lines
3.0 KiB
JavaScript
92 lines
3.0 KiB
JavaScript
const {
|
|
access,
|
|
cp,
|
|
mkdir,
|
|
rename,
|
|
rmdir,
|
|
} = require('fs/promises');
|
|
const {dirname, join} = require('path');
|
|
|
|
const {
|
|
generate,
|
|
resolveSiteDir,
|
|
spawn,
|
|
} = require('./docusaurus');
|
|
|
|
const {
|
|
FLECKS_CORE_ROOT = process.cwd(),
|
|
} = process.env;
|
|
|
|
module.exports = (program, flecks) => {
|
|
const commands = {};
|
|
const siteDirArgument = program.createArgument('[siteDir]', 'Docusaurus directory');
|
|
siteDirArgument.defaultValue = 'website';
|
|
commands.docusaurus = {
|
|
description: 'create a documentation website for this project',
|
|
action: async (subcommand, siteDir) => {
|
|
const resolvedSiteDir = resolveSiteDir(siteDir);
|
|
let siteDirExisted = false;
|
|
try {
|
|
const result = await mkdir(resolvedSiteDir);
|
|
if (undefined === result) {
|
|
await rmdir(resolvedSiteDir);
|
|
}
|
|
}
|
|
catch (error) {
|
|
siteDirExisted = true;
|
|
}
|
|
switch (subcommand) {
|
|
case 'build':
|
|
if (!siteDirExisted) {
|
|
throw new Error(`There's no website directory at ${resolvedSiteDir} to build!`);
|
|
}
|
|
await generate(flecks, resolvedSiteDir);
|
|
spawn('build', resolvedSiteDir);
|
|
break;
|
|
case 'create': {
|
|
if (siteDirExisted) {
|
|
throw new Error(`A website directory at ${resolvedSiteDir} already exists!`);
|
|
}
|
|
const templateDirectory = dirname(require.resolve('@flecks/dox/website/sidebars.js'));
|
|
await cp(templateDirectory, resolvedSiteDir, {recursive: true});
|
|
// Copy the docusaurus config if it doesn't already exist.
|
|
try {
|
|
await access(join(FLECKS_CORE_ROOT, 'build', 'docusaurus.config.js'));
|
|
}
|
|
catch (error) {
|
|
await rename(
|
|
join(resolvedSiteDir, 'docusaurus.config.js'),
|
|
join(FLECKS_CORE_ROOT, 'build', 'docusaurus.config.js'),
|
|
);
|
|
}
|
|
// eslint-disable-next-line no-console
|
|
console.error(`website directory created at ${resolvedSiteDir}!`);
|
|
break;
|
|
}
|
|
case 'start':
|
|
if (!siteDirExisted) {
|
|
throw new Error(`There's no website directory at ${resolvedSiteDir} to start!`);
|
|
}
|
|
await generate(flecks, resolvedSiteDir);
|
|
spawn('start', resolvedSiteDir);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
},
|
|
args: [
|
|
program.createArgument('subcommand', 'Docusaurus command to run')
|
|
.choices(['build', 'create', 'start']),
|
|
siteDirArgument,
|
|
],
|
|
help: [
|
|
'The `build` and `start` subcommands are sugar on top of the corresponding Docusaurus commands.',
|
|
'',
|
|
'The `create` subcommand will create a documentation website starter template for you at `siteDir`',
|
|
"if `siteDir` doesn't already exist (defaults to `website`). A `docusaurus.config.js`",
|
|
"starter configuration will also be copied to your `build` directory if it doesn't already exist.",
|
|
].join('\n'),
|
|
};
|
|
return commands;
|
|
};
|