An open API service indexing awesome lists of open source software.

https://github.com/async3619/better-zod-errors

formatted and more descriptive error messages for Zod validation
https://github.com/async3619/better-zod-errors

cli codeframe json yaml zod

Last synced: about 2 months ago
JSON representation

formatted and more descriptive error messages for Zod validation

Awesome Lists containing this project

README

          




💎


better-zod-errors








MIT License


Codecov


npm



formatted and more descriptive error messages for Zod validation




## Introduction

This library provides set of functions to format and enhance error messages generated by [Zod](https://zod.dev/) with code frames.

| with JSON | with YAML |
|:----------------------------------:|:----------------------------------:|
| ![JSON Example](./assets/json.png) | ![YAML Example](./assets/yaml.png) |

## Installation

```bash
$ npm install better-zod-errors
# or
$ yarn add better-zod-errors
# or
$ pnpm add better-zod-errors
```

## Usage

This library provides two main functions to format Zod errors with code frames:

### JSON Format

You can format JSON data validation errors using the `formatJsonError` function:

```typescript
import { z } from "zod";
import { formatJsonError } from "better-zod-errors";

const schema = z.object({
name: z.string().min(2, "Name must be at least 2 characters long"),
age: z.number().min(0, "Age must be a positive number"),
});

const payload = {
name: "A",
age: -5,
};

try {
schema.parse(payload);
} catch (e) {
if (e instanceof z.ZodError) {
for (const issue of e.issues) {
const formattedError = formatJsonError(issue, payload);
console.log(formattedError); // formatted error message with code frame
}
} else {
// handle other errors
}
}
```

### YAML Format

You can also format YAML data validation errors using the `formatYamlError` function:

```typescript
import { z } from "zod";
import { formatYamlError } from "better-zod-errors";

const schema = z.object({
name: z.string().min(2, "Name must be at least 2 characters long"),
age: z.number().min(0, "Age must be a positive number"),
address: z.object({
street: z.string(),
city: z.string(),
}),
});

const payload = {
name: "John",
age: -5,
address: {
street: "123 Main St",
city: 456, // Invalid type
},
};

try {
schema.parse(payload);
} catch (e) {
if (e instanceof z.ZodError) {
for (const issue of e.issues) {
const formattedError = formatYamlError(issue, payload);
console.log(formattedError); // formatted YAML error message with code frame
}
} else {
// handle other errors
}
}
```

## API

### `formatJsonError(issue: z.ZodIssue, data: any, [options: FormatJsonErrorOptions]): string`

Formats a single Zod issue into a more readable error message with a code frame.

#### `issue`

Type: `z.ZodIssue`

The Zod issue to format thrown during validation with `ZodError`.

#### `data`

Type: `any`

The original data that was validated. If the data was not matched with the original structure, it may throw an error.

#### `options`

Type: `FormatJsonErrorOptions` (optional)

##### `useColor`

Type: `boolean` (default: `true`)

Whether to use ANSI colors in the output. Set to `false` to disable colors.

##### `syntaxHighlighting`

Type: `boolean` (default: `true`)

Whether to use syntax highlighting in the code frame. Set to `false` to disable syntax highlighting.

### `formatYamlError(issue: z.ZodIssue, payload: any, [options: FormatYamlErrorOptions]): string`

Formats a single Zod issue into a more readable error message with a YAML code frame.

#### `issue`

Type: `z.ZodIssue`

The Zod issue to format thrown during validation with `ZodError`.

#### `payload`

Type: `number | bigint | boolean | string | object`

The original data that was validated in YAML format. The function will serialize this data to YAML and create a source map to locate error positions.

#### `options`

Type: `FormatYamlErrorOptions` (optional)

##### `useColor`

Type: `boolean` (default: `true`)

Whether to use ANSI colors in the output. Set to `false` to disable colors.

##### `syntaxHighlighting`

Type: `boolean` (default: `true`)

Whether to use syntax highlighting in the YAML code frame. Set to `false` to disable syntax highlighting.