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, ], }; return commands; };