-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
16 changed files
with
386 additions
and
123 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
import { | ||
access, | ||
cp, | ||
mkdir, | ||
rename, | ||
rmdir, | ||
} from 'fs/promises'; | ||
import {dirname, join} from 'path'; | ||
|
||
import { | ||
generate, | ||
resolveSiteDir, | ||
spawn, | ||
} from './docusaurus'; | ||
|
||
const { | ||
FLECKS_CORE_ROOT = process.cwd(), | ||
} = process.env; | ||
|
||
export default (program, flecks) => { | ||
const {Argument} = flecks.fleck('@flecks/core/server'); | ||
const commands = {}; | ||
const siteDirArgument = new Argument('[siteDir]', 'Docusaurus directory', 'website'); | ||
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( | ||
__non_webpack_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: [ | ||
new Argument('subcommand', 'Docusaurus command to run').choices(['build', 'create', 'start']), | ||
siteDirArgument, | ||
], | ||
}; | ||
return commands; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,124 @@ | ||
import {mkdir, writeFile} from 'fs/promises'; | ||
import {isAbsolute, join, resolve} from 'path'; | ||
|
||
import {spawnWith} from '@flecks/core/server'; | ||
import {themes as prismThemes} from 'prism-react-renderer'; | ||
import {rimraf} from 'rimraf'; | ||
|
||
import { | ||
generateBuildConfigsPage, | ||
generateConfigPage, | ||
generateHookPage, | ||
generateTodoPage, | ||
} from './generate'; | ||
import {parseFlecks} from './parser'; | ||
|
||
const { | ||
FLECKS_CORE_ROOT = process.cwd(), | ||
} = process.env; | ||
|
||
export function configDefaults() { | ||
/** @type {import('@docusaurus/types').Config} */ | ||
const config = { | ||
tagline: 'built with flecks', | ||
onBrokenLinks: 'throw', | ||
onBrokenMarkdownLinks: 'warn', | ||
i18n: { | ||
defaultLocale: 'en', | ||
locales: ['en'], | ||
}, | ||
presets: [ | ||
['classic', { | ||
docs: { | ||
sidebarPath: './sidebars.js', | ||
}, | ||
pages: { | ||
path: 'pages', | ||
}, | ||
}], | ||
], | ||
themeConfig: { | ||
// navbar: { | ||
// title: 'flecks', | ||
// logo: { | ||
// alt: 'flecks logo', | ||
// src: 'img/flecks.svg', | ||
// }, | ||
// items: [ | ||
// ], | ||
// }, | ||
footer: { | ||
style: 'dark', | ||
copyright: 'Built with flecks and Docusaurus.', | ||
}, | ||
prism: { | ||
theme: prismThemes.github, | ||
darkTheme: prismThemes.dracula, | ||
}, | ||
}, | ||
}; | ||
return config; | ||
} | ||
|
||
export function resolveSiteDir(siteDir) { | ||
return isAbsolute(siteDir) | ||
? siteDir | ||
: resolve(FLECKS_CORE_ROOT, siteDir); | ||
} | ||
|
||
export async function generate(flecks, siteDir) { | ||
// Generate "docs". | ||
const docsDirectory = join(siteDir, 'docs', 'flecks'); | ||
await rimraf(docsDirectory); | ||
const generatedDirectory = join(docsDirectory, '@flecks', 'dox'); | ||
await mkdir(generatedDirectory, {recursive: true}); | ||
const state = await parseFlecks(flecks); | ||
const hookPage = generateHookPage(state.hooks, flecks); | ||
const todoPage = generateTodoPage(state.todos, flecks); | ||
const buildConfigsPage = generateBuildConfigsPage(state.buildConfigs); | ||
const configPage = generateConfigPage(state.configs); | ||
await writeFile(join(generatedDirectory, 'hooks.md'), hookPage); | ||
await writeFile(join(generatedDirectory, 'TODO.md'), todoPage); | ||
await writeFile(join(generatedDirectory, 'build-configs.md'), buildConfigsPage); | ||
await writeFile(join(generatedDirectory, 'config.mdx'), configPage); | ||
} | ||
|
||
export function spawn(subcommand, siteDir) { | ||
const args = []; | ||
switch (subcommand) { | ||
case 'start': | ||
args.push('start', '--no-open'); | ||
break; | ||
case 'build': | ||
args.push('build', '--out-dir', join(FLECKS_CORE_ROOT, 'dist', 'dox')); | ||
break; | ||
default: { | ||
const docusaurusCall = `npx docusaurus <subcommand> --config ${join(FLECKS_CORE_ROOT, 'build', 'docusaurus.config.js')}`; | ||
throw new Error(`@flecks/dox only supports the 'build' and 'start' subcommands. You can run docusaurus yourself with:\n\n${docusaurusCall}`); | ||
} | ||
} | ||
args.push('--config', join(FLECKS_CORE_ROOT, 'build', 'docusaurus.config.js')); | ||
const cacheDirectory = join(FLECKS_CORE_ROOT, 'node_modules', '.cache', '@flecks', 'dox'); | ||
// Spawn `docusaurus`. | ||
const cmd = [ | ||
// `npx` doesn't propagate signals! | ||
// 'npx', 'docusaurus', | ||
join(FLECKS_CORE_ROOT, 'node_modules', '.bin', 'docusaurus'), | ||
...args, | ||
siteDir, | ||
]; | ||
const child = spawnWith( | ||
cmd, | ||
{ | ||
env: { | ||
// Override docusaurus generation directory for cleanliness. | ||
DOCUSAURUS_GENERATED_FILES_DIR_NAME: join(cacheDirectory, '.docusaurus'), | ||
}, | ||
}, | ||
); | ||
// Clean up on exit. | ||
process.on('exit', () => { | ||
child.kill(); | ||
}); | ||
return child; | ||
} |
Oops, something went wrong.