# Contributing

## Reporting Bugs

If you've found a bug with SVGO, [create an issue](https://github.com/svg/svgo/issues) on GitHub.

Your issue should ideally contain:

- A concise description of the bug.
- How you were using SVGO, the version of the tool, and any configuration or command-line options.
- The SVG that was effected, or a [Minimal, Reproducible Example](https://stackoverflow.com/help/minimal-reproducible-example).

If you haven't found a bug, but need help using SVGO in your project, please consider asking on [Stack Overflow](https://stackoverflow.com/questions/tagged/svgo) with the `[svgo]` tag, you may get help faster there. You can still create an issue if the confusion stemmed from a lack of documentation.

## Reporting Security Vulnerabilities

See: [SECURITY.md](./SECURITY.md)

## Development

### Requirements

- [Git](https://git-scm.com/)
- [Node.js >=16](https://nodejs.org/) — Our CI pipeline includes Node.js v16, so even development code must be runnable in a Node.js v16 environment.

### Getting Started

Clone the repository with Git.

```sh
git clone https://github.com/svg/svgo.git
```

As this is a Node.js project and uses Yarn for package management, install the dependencies.

```sh
yarn install
```

Finally, make sure all quality assurance checks pass before making changes. This will lint, build, and test the project.

```sh
yarn run qa
```

### Plugins

SVGO uses a plugin architecture, so we ultimately perform many smaller tasks rather than a single monolithic task. This provides users a lot of flexibility for which optimizations they use, and in what order to run them.

See [`plugins/**`](./plugins/) for the list of existing plugins. This is where you can create new ones.

You should read our [Plugin Architecture](https://svgo.dev/docs/plugins-api/) documentation for the gist of how to create a new plugin. If you've created custom plugins before, it's mostly the same process.

#### Plugin Parameters

SVGO plugins can optionally have parameters. These can be consumed by the plugin to tailor the behavior.

Parameters must have types declared in a [`@typedef`](https://jsdoc.app/tags-typedef) at the top of the file. For new plugins, you must also append the appropriate type in [`lib/types.d.ts`](https://github.com/svg/svgo/blob/main/lib/types.d.ts). This way built-in plugins will have code completion and type checking as you'd expect while editing the plugin.

## Documentation

Our documentation is maintained in [MDX](https://mdxjs.com/), which is Markdown with React components. The files are then pulled by [svg/svgo.dev](https://github.com/svg/svgo.dev) to build and deploy the SVGO website.

To preview local changes, follow the steps to run the website locally in [svg/svgo.dev](https://github.com/svg/svgo.dev).

New plugins, plugin parameters, and notable features should be paired with documentation in the [`docs/`](./docs/) directory and included in the same pull request.

## Funding

Sponsoring the project helps keep it sustainable for current maintainers.

See: [SVGO on Open Collective](https://opencollective.com/svgo)
