# EventVersions

The older shapes of one event, so that events stored long ago still reach projections and view models in today’s shape. The log is never rewritten: old payloads are upcast as they are read.

```ts
const AccountOpenedV1 = Schema.Struct({ owner: Schema.String })


const Account = Aggregate.make<State>()({
  name: "account",
  events: AccountEvent,
  initial,
  projection,
  versions: {
    AccountOpened: EventVersions.from(AccountOpenedV1).next(
      AccountEvent.cases.AccountOpened,
      ({ owner }) => ({ owner, currency: "CHF" })
    )
  }
})
```

The first schema is version 1, the shape events had before the history was declared, and every `next` adds a version. The last one must be the event’s current schema, which is what new events are written with.

## Interfaces

### EventVersions

Defined in: [src/EventVersions.ts:44](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L44)

#### Type Parameters

##### Schemas

`Schemas` *extends* `ReadonlyArray`<[`VersionSchema`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#versionschema)>

##### Latest

`Latest`

#### Properties

##### \~latest?

> `readonly` `optional` **\~latest?**: `Latest`

Defined in: [src/EventVersions.ts:50](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L50)

The type of the last version, which an aggregate checks against its event.

##### schemas

> `readonly` **schemas**: `Schemas`

Defined in: [src/EventVersions.ts:46](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L46)

Oldest first: `schemas[0]` is version 1.

##### upcasts

> `readonly` **upcasts**: readonly ((`previous`) => `unknown`)\[]

Defined in: [src/EventVersions.ts:48](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L48)

`upcasts[i]` turns version `i + 1` into version `i + 2`.

#### Methods

##### next()

> **next**<`Next`>(`schema`, `upcast`): [`EventVersions`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#eventversions)\<readonly \[`Schemas`, `Next`], `Next`\[`"Type"`]>

Defined in: [src/EventVersions.ts:52](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L52)

Adds a version, with the function that turns the previous one into it.

###### Type Parameters

###### Next

`Next` *extends* [`VersionSchema`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#versionschema)

###### Parameters

###### schema

`Next`

###### upcast

(`previous`) => [`Untagged`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#untagged)<`Next`\[`"Type"`]>

###### Returns

[`EventVersions`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#eventversions)\<readonly \[`Schemas`, `Next`], `Next`\[`"Type"`]>

## Type Aliases

### Any

> **Any**<`Latest`> = [`EventVersions`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#eventversions)<`ReadonlyArray`<[`VersionSchema`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#versionschema)>, `Latest`>

Defined in: [src/EventVersions.ts:59](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L59)

Any history whose last version is `Latest`.

#### Type Parameters

##### Latest

`Latest` = `any`

***

### SchemaAt

> **SchemaAt**<`H`, `V`> = `H` *extends* [`EventVersions`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#eventversions)\<infer Schemas, `any`> ? \[`never`, `...Schemas`]\[`V`] *extends* infer S ? `S` : `never` : `never`

Defined in: [src/EventVersions.ts:62](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L62)

The schema of one version, or `never` when the history has no such version.

#### Type Parameters

##### H

`H` *extends* [`Any`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#any)

##### V

`V` *extends* `number`

***

### Untagged

> **Untagged**<`T`> = `T` *extends* `object` ? `Omit`<`T`, `"_tag"`> : `T`

Defined in: [src/EventVersions.ts:38](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L38)

What an upcast returns: the next version, without the `_tag` the event’s name already gives.

#### Type Parameters

##### T

`T`

***

### VersionSchema

> **VersionSchema** = `Schema.Top` & `object`

Defined in: [src/EventVersions.ts:32](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L32)

A schema that decodes and encodes without services, as stored payloads need.

#### Type Declaration

##### DecodingServices

> `readonly` **DecodingServices**: `never`

##### EncodingServices

> `readonly` **EncodingServices**: `never`

## Functions

### current()

> **current**(`versions`): `number`

Defined in: [src/EventVersions.ts:80](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L80)

The version new events of this kind are written with.

#### Parameters

##### versions

[`Any`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#any)<`any`> | `undefined`

#### Returns

`number`

***

### decoders()

> **decoders**(`tag`, `versions`): readonly `Decoder`<`unknown`, `never`>\[]

Defined in: [src/EventVersions.ts:90](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L90)

Builds one decoder per old version, each going all the way to the current one. The chains are composed once with `Schema.decodeTo`, so reading an old event costs one decode however many versions it is behind.

`decoders[v - 1]` decodes a JSON payload stored at version `v`. The current version has none, as the aggregate’s own schema reads it.

#### Parameters

##### tag

`string`

##### versions

[`Any`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#any)

#### Returns

readonly `Decoder`<`unknown`, `never`>\[]

***

### from()

> **from**<`V1`>(`schema`): [`EventVersions`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#eventversions)\<readonly \[`V1`], `V1`\[`"Type"`]>

Defined in: [src/EventVersions.ts:76](https://github.com/davidnussio/effect-cqrs/blob/9d66af7141782f3f89655e6868abe3f141c97632/src/EventVersions.ts#L76)

Starts a history at version 1.

#### Type Parameters

##### V1

`V1` *extends* [`VersionSchema`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#versionschema)

#### Parameters

##### schema

`V1`

#### Returns

[`EventVersions`](https://effect-cqrs.dambox.ch/reference/api/eventversions/#eventversions)\<readonly \[`V1`], `V1`\[`"Type"`]>
