# @openaddresses/batch-schema

> Strongly Validated JSON Schema support for address

Latest version **10.28.1** (published 2026-08-26) · MIT license · 0 weekly downloads

## Install

```sh
npm install @openaddresses/batch-schema
pnpm add @openaddresses/batch-schema
yarn add @openaddresses/batch-schema
bun add @openaddresses/batch-schema
```

## Health

**Score 75/100 (B)** — status: active.

Positive: has types; esm support; no vulnerabilities; has provenance; recently updated; high maintenance score; high quality score.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 10.28.1 |
| Published | 2026-08-26 |
| First published | 2021-10-25 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >= 18 |
| Dependencies | 12 |
| Unpacked size | 216.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Provenance | attested (GitHub Actions) |
| GitHub stars | 0 |
| Author | ingalls |
| Maintainers | iandees, ingalls |

## Links

- npm: https://www.npmjs.com/package/@openaddresses/batch-schema
- Repository: https://github.com/openaddresses/batch-schema
- Homepage: https://github.com/openaddresses/batch-schema#readme
- Issues: https://github.com/openaddresses/batch-schema/issues
- npm.io page: https://npm.io/package/@openaddresses/batch-schema

## Dependencies (12)

- [ajv](https://npm.io/package/ajv.md) ^8.12.0
- [glob](https://npm.io/package/glob.md) ^13.0.0
- [morgan](https://npm.io/package/morgan.md) ^1.10.0
- [express](https://npm.io/package/express.md) ^5.0.0
- [ajv-formats](https://npm.io/package/ajv-formats.md) ^3.0.1
- [body-parser](https://npm.io/package/body-parser.md) ^2.2.0
- [@types/morgan](https://npm.io/package/@types/morgan.md) ^1.9.9
- [openapi-types](https://npm.io/package/openapi-types.md) ^12.1.3
- [@types/express](https://npm.io/package/@types/express.md) ^5.0.0
- [@sinclair/typebox](https://npm.io/package/@sinclair/typebox.md) ^0.34.0
- [@types/body-parser](https://npm.io/package/@types/body-parser.md) ^1.19.5
- [@openaddresses/batch-error](https://npm.io/package/@openaddresses/batch-error.md) ^2.9.0

## Recent versions

- 10.28.1 (latest) — 2026-08-26
- 10.27.0 — 2026-07-07
- 10.26.0 — 2026-04-24
- 10.25.0 — 2026-04-17
- 10.24.1 — 2026-04-15
- 10.24.0 — 2026-04-14
- 10.23.2 — 2026-02-26
- 10.22.0 — 2026-02-06
- 10.21.0 — 2026-01-28
- 10.19.0 — 2025-10-06
- 10.18.0 — 2025-09-08
- 10.17.1 — 2025-08-27
- 10.17.0 — 2025-08-27
- 10.16.2 — 2025-07-01
- 10.16.1 — 2025-07-01
- … 64 more at https://npm.io/package/@openaddresses/batch-schema/versions

## README

<h1 align=center>Batch-Schema</h1>

<p align=center>Express Plugin for <a href='https://github.com/sinclairzx81/typebox'>TypeBox</a> Request and Response Validation</p>

## Installation

```sh
npm i @openaddresses/batch-schema
```

## Example Usage

```js
import express from 'express';
import Schema from '@openaddresses/batch-schema';
import { Type } from '@sinclair/typebox';

const app = express();
const schema = new Schema(express.Router(), {
    logging: true,  // Enable Morgan Logging
    limit: 50       // Body size for parsing JSON
});

app.use('/api', schema.router);

server();

async function server() {
    await schema.post('/api/:param1/:param2', {
        query: Type.Object({
            example: Type.Optional(Type.Uppercase(Type.String()))
        }),
        params: Type.Object({
            param1: Type.String(),
            param2: Type.Number(),
        }),
        body: Type.Object({
            username: Type.String(),
            password: Type.String(),
        }),
        res: Type.Object({
            token: Type.String()
        }),
        deprecated: false,
    }, (req, res) => {
        return res.json({
            token: 'I only return if the request meets the query & body schemas'
        });
    });
}
```

Set `deprecated: true` on a route schema to mark the generated OpenAPI operation as deprecated.

Set `security` on a route schema to emit an operation level OpenAPI Security Requirement
array, overriding any document level `security` passed via `new Schema(router, { openapi })`.
Keys must reference `components.securitySchemes` and each entry is an alternative:

```js
await schema.get('/search', {
    security: [
        { bearerAuth: [] },
        { layerAuth: ['search:read'] },
    ],
    res: Type.Any(),
}, (req, res) => res.json({}));
```

## Request Body Validation

The `body` option accepts two forms.

### Single TypeBox schema (legacy / shorthand)

A bare schema is treated as `application/json`:

```js
await schema.post('/login', {
    body: Type.Object({
        username: Type.String(),
        password: Type.String()
    }),
    res: Type.Object({ token: Type.String() })
}, handler);
```

### Map keyed by content-type

Provide a record where each key is a Content-Type. The value can be:

- a `TSchema` — body is validated against the schema
- `true` — body is accepted but not validated (useful for XML / CSV / binary)
- a `{ schema, example, examples }` object — `example` and `examples` are
  forwarded to the OpenAPI media type for documentation

Wildcards are supported in keys: `text/*`, `application/*`, `*/*`. An exact
content-type match always wins over a wildcard.

```js
await schema.post('/ingest', {
    body: {
        // Strict JSON validation
        'application/json': Type.Object({ name: Type.String() }),

        // Any XML accepted
        'text/xml': true,

        // Wildcard family — matches text/csv, text/plain, etc.
        'text/*': true,

        // Schema + Swagger UI examples
        'application/vnd.api+json': {
            schema: Type.Object({ data: Type.Any() }),
            example: { data: { id: '1' } },
            examples: {
                primary:   { summary: 'Primary',   value: { data: { id: '1' } } },
                secondary: { summary: 'Secondary', value: { data: { id: '2' } } }
            }
        }
    },
    res: Type.Any()
}, handler);
```

If a request arrives with a Content-Type that is not listed (and is not
covered by a wildcard), the route responds with HTTP 400 and a
`Content-Type ... not supported` message — the handler is not invoked.

For non-JSON content-types the body parser exposes the raw payload on
`req.body` as a string (`text/*`, `application/xml`, `application/*+xml`)
or a `Buffer` (`application/octet-stream`).

### Optional bodies

Set `bodyRequired: false` to allow requests with no body / no Content-Type.
When a body *is* sent it is still validated against the matching schema,
and the OpenAPI document marks `requestBody.required` as `false`.

```js
await schema.post('/maybe', {
    body: Type.Object({ note: Type.String() }),
    bodyRequired: false,
    res: Type.Object({ ok: Type.Boolean() })
}, handler);
```

## API

```js
const schema = new Schema(<router>, <opts>);

```

| Config Option     | Notes |
| ----------------- | ----- |
| `router`          | Instantiated Express router to bind to |
| `opts`            | Optional Opts Object |
| `opts.schemas`    | Directory of named schemas |


### schema.api

```
await schema.api()
```

Adds a route called `GET /schema` which allows the caller to get a list of endpoints that the router manages
as well as full schema details for every route. If your API is public we recommend enabling this feature, however
if you do not wish for API routes to be published, this feature is disabled unless called.

Adds a route called `GET /openapi` which returns an OpenAPI / Swagger JSON Object

### schema.not_found

Adds a middlware which will catch all routes that have not been defined and return
a standard error object.

```
schema.not_found()
```

### schema.error

Adds a middlware which will convert validation errors into a standard JSON error format.
This method should be called after all routes are defined. If this method is not called,
you must provide your own middleware for converting JSON Schema Validation Errors into
express compatible responses.

```
schema.error()
```

### schema.load

Loads and runs all routes files in a directory

```
schema.load(directory, config, opts)
```

| Config Option     | Notes |
| ----------------- | ----- |
| `directory`       | Directory to load .js files from |
| `config`          | Config option to pass to each route |
| `opts`            | Optional Opts Object |
| `opts.silent`     | Squelch output |

---
_Source: https://npm.io/package/@openaddresses/batch-schema · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
