# ensure

Returns a new event definition whose events will first go through the validator before being passed to their target. Events that don't pass the validator won't reach their targets.

## Import

```javascript
import ensure from '@redux-beacon/ensure';
```

## Syntax

```javascript
ensure(validator, eventDef)
```

### Parameters

* `validator`: [`Validator`](#validator)
  * The function used to validate the event.
* `eventDef`: [`EventDefinition`](https://rangle.gitbook.io/redux-beacon/index-1/event-definition)
  * The event you want to validate.

### Validator

```typescript
type Validator = (event: any[]) => boolean;
```

* Accepts an event or array of events as its sole argument.
* Returns `true` if the event is valid.
* Returns `false` if the event is not valid.

## Example

```javascript
import joi from 'joi';
import ensure from '@redux-beacon/ensure'

const pageview = (action, prevState) => ({
  hitType: 'pageview',
  route: action.payload.location.pathname,
  referrer: prevState.currentRoute,
});

// Returns true if the event matches the schema
const isValidPageView = event =>
  !joi.validate(event, joi.object().keys({
    hitType: joi.string().only('pageview').required(),
    page: joi.string().disallow('/404'),
    title: joi.string(),
    location: joi.string(),
  })).error;

const eventsMap = {
  LOCATION_CHANGE: ensure(isValidPageView, pageview)
};
```
