# Write your own

{% hint style="success" %}
This is the official documentation of the `@forestadmin/agent` Node.js agent.
{% endhint %}

Each Plugin is nothing more than an `async function` that can perform customizations at either Agent level, Collection level, or both.

```javascript
export async function removeTimestamps(dataSource, collection, options) {
  // ... call customization methods here
}
```

3 parameters are provided:

| Name                                                                                                                                                               | Description                                                                                                                                                                                               |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p>dataSource<br>(<a href="https://forestadmin.github.io/agent-nodejs/classes/_forestadmin_datasource-customizer.DataSourceCustomizer.html">API Reference</a>)</p> | An object that allows customizing the whole agent. It has the same interface than the `Agent` you manipulate outside of Plugins                                                                           |
| <p>collection<br>(<a href="https://forestadmin.github.io/agent-nodejs/classes/_forestadmin_datasource-customizer.CollectionCustomizer.html">API Reference</a>)</p> | An object that allows customizing the collection that the Plugin was called from (`null` if the Plugin was called on the Agent). It is the same object than is passed when you call `customizeCollection` |
| options                                                                                                                                                            | Options that are provided to the Plugin. There is no set structure for this parameter, as each Plugin will provide specific mandatory or optional options.                                                |

### Making your Plugin act differently depending on the Collection

When making a Plugin, you may want it to generalize to many different Collections.

This can be achieved by adopting different behavior depending on the `schema` of the Collection being targeted.

Relevant documentation:

* [DataSourceSchema](https://forestadmin.github.io/agent-nodejs/types/_forestadmin_datasource-toolkit.DataSourceSchema.html) (for Plugins working on Charts)
* [CollectionSchema](https://forestadmin.github.io/agent-nodejs/types/_forestadmin_datasource-toolkit.CollectionSchema.html) (for all other Plugins)

```javascript
export async function removeTimestamps(dataSource, collection, options) {
  for (const currentCollection of dataSource.collections) {
    if (currentCollection.schema.fields.createdAt) {
      currentCollection.removeField('createdAt');
    }

    if (currentCollection.schema.fields.updatedAt) {
      currentCollection.removeField('updatedAt');
    }
  }
}
```
