diff --git a/examples/docusaurus/package.json b/examples/docusaurus/package.json index 23990074e..c4cfab5b4 100644 --- a/examples/docusaurus/package.json +++ b/examples/docusaurus/package.json @@ -10,6 +10,7 @@ "deploy": "docusaurus deploy", "clear": "docusaurus clear", "serve": "docusaurus serve", + "generate-typedoc": "docusaurus generate-typedoc", "write-translations": "docusaurus write-translations", "write-heading-ids": "docusaurus write-heading-ids" }, diff --git a/packages/docusaurus-plugin-typedoc/src/plugin.ts b/packages/docusaurus-plugin-typedoc/src/plugin.ts index 0c2515991..8c964d6cb 100644 --- a/packages/docusaurus-plugin-typedoc/src/plugin.ts +++ b/packages/docusaurus-plugin-typedoc/src/plugin.ts @@ -1,9 +1,9 @@ +import { LoadContext } from '@docusaurus/types'; import * as path from 'path'; import { Application } from 'typedoc'; import { load } from 'typedoc-plugin-markdown'; import { getPluginOptions } from './options'; import { bootstrap, removeDir } from './render'; - import { DocusaurusTheme } from './theme'; import { PluginOptions } from './types'; @@ -11,7 +11,7 @@ import { PluginOptions } from './types'; const apps: string[] = []; export default function pluginDocusaurus( - context: any, + context: LoadContext, opts: Partial, ) { return { @@ -19,40 +19,64 @@ export default function pluginDocusaurus( async loadContent() { if (opts.id && !apps.includes(opts.id)) { apps.push(opts.id); + generateTypedoc(context, opts); + } + }, + extendCli(cli) { + cli + .command('generate-typedoc') + .description( + '(docusaurus-plugin-typedoc) Generate TypeDoc docs independently of the Docusaurus build process.', + ) + .action(async () => { + context.siteConfig?.plugins.forEach((pluginConfig) => { + // Check PluginConfig is typed to [string, PluginOptions] + if (pluginConfig && typeof pluginConfig[1] === 'object') { + generateTypedoc(context, pluginConfig[1]); + } + }); + }); + }, + }; +} - const { siteDir } = context; +/** + * Initiates a new typedoc Application bootstraped with plugin options + */ +async function generateTypedoc( + context: LoadContext, + opts: Partial, +) { + const { siteDir } = context; - const options = getPluginOptions(opts); + const options = getPluginOptions(opts); - const outputDir = path.resolve(siteDir, options.docsRoot, options.out); + const outputDir = path.resolve(siteDir, options.docsRoot, options.out); - if (opts.cleanOutputDir) { - removeDir(outputDir); - } + if (opts.cleanOutputDir) { + removeDir(outputDir); + } - const app = new Application(); + const app = new Application(); - app.renderer.defineTheme('docusaurus', DocusaurusTheme); + app.renderer.defineTheme('docusaurus', DocusaurusTheme); - load(app); + load(app); - bootstrap(app, options); + bootstrap(app, options); - const project = app.convert(); + const project = app.convert(); - // if project is undefined typedoc has a problem - error logging will be supplied by typedoc. - if (!project) { - return; - } + // if project is undefined typedoc has a problem - error logging will be supplied by typedoc. + if (!project) { + return; + } - if (options.watch) { - app.convertAndWatch(async (project) => { - await app.generateDocs(project, outputDir); - }); - } else { - await app.generateDocs(project, outputDir); - } - } - }, - }; + if (options.watch) { + app.convertAndWatch(async (project) => { + await app.generateDocs(project, outputDir); + }); + } else { + await app.generateDocs(project, outputDir); + } }