# io-ts-koa-middleware

> Validate requests with io-ts in your Koa middleware

Latest version **1.1.0** (published 2018-11-18) · MIT license · 0 weekly downloads

## Install

```sh
npm install io-ts-koa-middleware
pnpm add io-ts-koa-middleware
yarn add io-ts-koa-middleware
bun add io-ts-koa-middleware
```

## Health

**Score 20/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.1.0 |
| Published | 2018-11-18 |
| First published | 2018-11-18 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 6 |
| Unpacked size | 6.2 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 2 |
| Author | Rasmus Eskola |
| Maintainers | fruitiex |

## Links

- npm: https://www.npmjs.com/package/io-ts-koa-middleware
- Repository: git@github.com:FruitieX/io-ts-koa-middleware
- npm.io page: https://npm.io/package/io-ts-koa-middleware

## Dependencies (6)

- [fp-ts](https://npm.io/package/fp-ts.md) ^1.10.0
- [io-ts](https://npm.io/package/io-ts.md) ^1.4.1
- [koa-body](https://npm.io/package/koa-body.md) ^4.0.4
- [@types/koa](https://npm.io/package/@types/koa.md) ^2.0.46
- [io-ts-reporters](https://npm.io/package/io-ts-reporters.md) ^0.0.21
- [@types/koa-router](https://npm.io/package/@types/koa-router.md) ^7.0.34

## Recent versions

- 1.1.0 (latest) — 2018-11-18
- 1.0.1 — 2018-11-18
- 1.0.0 — 2018-11-18

## README

# io-ts-koa-middleware

Validate requests with io-ts in your Koa middleware.

Runs provided middleware function only if validations against provided
`ReqType` io-ts runtime type pass, otherwise responds with HTTP 400 and a
validation error message.

If decoding succeeds, your middleware will be called with a `decoded`
property set on the `ctx` parameter. The type signature of `ctx.decoded` is
based on the provided `ReqType`, which means autocompletion will work and you
can safely read from it in your middleware.

```ts
import * as t from 'io-ts';
import { decodeRequest } from 'io-ts-koa-middleware';

const ReqType = t.type({
  query: t.type({
    filter: t.string
  }),
});

export const searchMovie = decodeRequest(ReqType)(async (ctx, next) => {
  const { filter } = ctx.decoded.query;
  ...
});
```

`ReqType` supports the following properties:

```ts
t.type({
  body?: t.Type<any>;
  headers?: t.Type<any>;
  params?: t.Type<any>;
  query?: t.Type<any>;
})
```

## Example

```ts
import * as t from 'io-ts';
import { decodeRequest } from 'io-ts-koa-middleware';

const ReqType = t.type({
  headers: t.type({
    authorization: t.refinement(
      t.string,
      apiKey => /^([a-z0-9]){8}$/.test(apiKey),
      'valid OMDB API key',
    ),
  }),
  query: t.type({
    filter: t.string,
  }),
});

export const searchMovie = decodeRequest(ReqType)(async (ctx, next) => {
  const { query, headers } = ctx.decoded;
  const result = await omdb.search(headers.authorization, query.filter);
  ctx.body = { result };
});
```

```bash
$ http localhost:3000/movie/search?filter=avatar "Authorization: apikey42"

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 1037
Content-Type: application/json; charset=utf-8
Date: Sun, 18 Nov 2018 08:55:32 GMT

{
    "result": {
        "Actors": "Sam Worthington, Zoe Saldana, Sigourney Weaver, Stephen Lang",
        "Awards": "Won 3 Oscars. Another 85 wins & 128 nominations.",
        "BoxOffice": "$749,700,000",
        "Country": "UK, USA",
        "DVD": "22 Apr 2010",
        "Director": "James Cameron",
        "Genre": "Action, Adventure, Fantasy",
        ...
```

```bash
$ http localhost:3000/movie/search

HTTP/1.1 400 Bad Request
Connection: keep-alive
Content-Length: 142
Content-Type: text/plain; charset=utf-8
Date: Sun, 18 Nov 2018 08:53:47 GMT

Expecting valid OMDB API key at headers.authorization but instead got: undefined.
Expecting string at query.filter but instead got: undefined.
```

---
_Source: https://npm.io/package/io-ts-koa-middleware · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
