# Custom Formatters

Custom formatters should be a javascript class. The constructor will be an options object with the following properties:

* `colorFns`: a series of helper functions for outputting colors. See [here](/src/formatter/get_color_fns.ts). Respects `colorsEnabled` option
* `cwd`: the current working directory
* `eventBroadcaster`: an event emitter that emits cucumber-messages
* `eventDataCollector`: an instance of [EventDataCollector](/src/formatter/helpers/event_data_collector.ts) which handles the complexity of grouping the data for related events
* `log`: function which will write the passed string to the the designated stream (stdout or the to file the formatter output is being redirected to).
* `parsedArgvOptions`: an object of everything passed to `--format-options`
* `snippetBuilder`: an object with a `build` method that should be called with `{keywordType, pickleStep}`. The `pickleStep` can be retrieved with the `eventDataCollector` while the `keywordType` is complex to compute (see the [SnippetsFormatter](/src/formatter/snippets_formatter.ts) for an example).
* `stream`: the underlying stream the formatter is writing to. `log` is a shortcut for writing to it.
* `supportCodeLibrary`: an object containing the step and hook definitions

The constructor of custom formatters should add listeners to the `eventBroadcaster`.

See a couple examples [here](/features/custom_formatter.feature) and the built in formatters [here](/src/formatter)

## Extending Built-Ins

The base `Formatter` does very little aside from saving some of the options on the instance. You can extend the `SummaryFormatter` (as the `ProgressFormatter` and `PrettyFormatter` do) in order to get the same error reporting at the end.

`formatterHelpers` are also exposed to give some of the functionality in more modular pieces.

If there is any other formatter functionality you would like access to, please create an [issue](https://github.com/cucumber/cucumber-js).