Development
This page is a work in progress overview of TypeDoc's architecture. For more details about each individual component, refer to the doc comments within each module. It is intended primarily for those interested in contributing to the TypeDoc codebase or developing a plugin.
High Level
TypeDoc follows several high level steps when called.
- Read options
Necessary to determine which plugins should be loaded. - Load plugins
If--plugin
was used, loads only those specified plugins, otherwise loads all npm plugins with thetypedocplugin
keyword. - Read options again to pick up plugin options
- Convert the input files into the models (also called reflections) that live under
src/lib/models
- Resolve the models
Necessary to handle links to models that might not have been created when the source model is generated. - Output the models by serializing to HTML and/or JSON
TypeDoc's code is loosely organized according to each of these steps.
The code to read options lives under src/lib/utils/options
.
The plugin loading code lives in src/lib/utils/plugins
.
Conversion is performed according to the Symbol's ts.SymbolFlags
. Each distinct flag type gets its own converter function in src/lib/converter/symbols.ts
.
Resolution is implemented entirely by internal plugins that live in src/lib/output/plugins
and listen to the Converter.EVENT_RESOLVE
event.
Output is split into two folders, for JSON output see the src/lib/serialization
directory, and for HTML output see src/lib/output
.
Plugins may effect any part of the process after step 2 by listening to events fired by each component or adding / replacing handlers for a given task. As an example, the Converter fires events before starting conversion, when declarations are converted and when the project should be resolved.
Tests
TypeDoc has tests for individual utilities and some components, but the majority of the project is tested by converting source files into their JSON model and comparing it to a known good version. The basic example under src/test/renderer/testProject
is rendered to HTML to test theme changes.
If changing the behavior of a converter or resolver, it should be possible to modify one of the existing tests under src/test/converter
.
Bug fixes or feature additions which need to change one of the specs*.json
files should run npm run rebuild_specs [converter|renderer] [converter filter]
to run the current build of TypeDoc on the source files and generate new specs.
For other components, we use Mocha to write tests.
Components
For more detailed information about the implementation and API surface of each component, consult its API documentation. All components are available on the Application class, which is passed to plugins.
Options
TypeDoc provides some 30 options which determine how the project model is generated and output to disk. The Options class consolidates application options into a single location and handles type conversion.
There are 11 builtin option types as specified by the ParameterType enum.
String
- A stringPath
- A string which will be resolved to a path. Paths in config files will be resolved relative to the config directory.Number
- A number which is notNaN
Boolean
-true
orfalse
Map
- Defines a map between string keys and an arbitrary type. See the tests for an example.Mixed
- An object type that is passed through by TypeDoc to create specific implicit behaviour.Object
- An object type of which value keys can be overridden or extended by passing a new object.Array
- An array of strings.PathArray
- An array of paths, if specified in a config file, will be resolved relative to the config file directory.ModuleArray
- An array of modules/paths. Items will be resolved if they start with.
.GlobArray
- An array of globs. Globs will be resolved if they do not start with**
, after skipping leading!
and#
characters.
Options are discovered and set by option readers, which are documented in the OptionReader interface.
Plugins can declare their own options by calling Options.addDeclaration.
Plugins
Plugins should export a load
function which will be called by TypeDoc when loading the plugin with an instance of PluginHost
.
This function should add any options the plugin accepts and add any listeners necessary to effect TypeDoc's behavior.
import { Application, ParameterType, Converter, Context } from "typedoc";
export function load(app: Application) {
app.options.addDeclaration({
name: "plugin-option",
help: "Displayed when --help is passed",
type: ParameterType.String, // The default
defaultValue: "", // The default
});
app.converter.on(Converter.EVENT_RESOLVE, (context: Context) => {
if (app.options.getValue("plugin-option") === "something") {
// ...
}
});
}
Converters
TypeDoc converts the syntax tree created by TypeScript into its own structure of Reflection
s to allow themes and serialization to work with a standard object format. Conversion is done primarily in three files.
- symbols.ts - contains converters for each
ts.Symbol
that is exported from entry points. - types.ts - contains converters for
ts.Type
s andts.TypeNode
s. - jsdoc.ts - contains converters for types and symbols declared within JSDoc comments.
JSON Output
Docs to come - TypeDoc's JSON output is defined according to serializers which support some or all reflections.
HTML Output
See internal-docs/custom-themes.md for creating a theme.