All free skills / Other majors
zod-validation-error 5.x
Use zod-validation-error ^5.0.0 with Zod 4 by default, including direct ValidationError construction, Zod error conversion, type guards, message builders, and the separate Zod 3 entrypoint.
- For
zod-validation-error@5.0.0- Verified
- 2026-09-08, 7 examples executed
- Skill package
@modootoday/pmcp-zod-validation-error@5.0.0
Use this skill for free
No PMCP login or subscription is required. Download the original instructions, or install the content-only archive with your project's package manager.
Download SKILL.md · Download package archive
npm install --save-dev https://pmcp.build/skills/zod-validation-error/5/package.tgz
PMCP discovers the installed package's instructions. Connect your runtime after installation.
Archive integrity
sha512-yd2CvK8OSZmmktvjearZT9tFuycJnJ4M1TYicpKaTEyEWdbkD92VQxD9PfraOyZvmKaeOIXjCxkOac6abbjiWQ==Complete instructions
Verified against zod-validation-error@5.0.0 on 2026-09-08. 7 of 7 examples executed.
zod-validation-error v5
Use this skill for zod-validation-error version ^5.0.0. It requires Node.js 18 or newer and TypeScript 4.5 or newer. The default package entrypoint is the Zod 4 build. Zod is a peer dependency and must be installed by the application.
Important version distinction
Version 5 supports both Zod 4 and Zod 3, but they are separate package entrypoints:
- Import the default package for the Zod 4 surface:
zod-validation-error. - Import
zod-validation-error/v3when using the Zod 3 surface.
Do not copy the older singleton error-map setup into the v5 default surface. The older form is:
import { z as zod } from 'zod';
import { errorMap } from 'zod-validation-error';
zod.setErrorMap(errorMap);
For v5 with Zod 4, create the map and configure Zod:
import { z as zod } from 'zod';
import { createErrorMap } from 'zod-validation-error';
zod.config({
customError: createErrorMap(),
});
Zod 4 schemas also use the newer constructors shown by the package documentation, such as zod.int() and zod.email(). The older Zod 3 shape uses zod.number().int() and zod.string().email().
Direct ValidationError
ValidationError is an Error and can be used without Zod, for example when validating an argument in code that does not need a schema.
import assert from 'node:assert/strict';
import { ValidationError } from 'zod-validation-error';
const error = new ValidationError('Invalid argument; expected buffer');
assert.equal(error instanceof Error, true);
assert.equal(error.message, 'Invalid argument; expected buffer');
Convert a Zod error
Use fromError when the caught value is not known to be a Zod error. Use a Zod 4 schema with the default package entrypoint.
import assert from 'node:assert/strict';
import { z as zod } from 'zod';
import { fromError, isValidationError } from 'zod-validation-error';
const schema = zod.object({
id: zod.int().positive(),
email: zod.email(),
});
let converted: unknown;
try {
schema.parse({ id: -1, email: 'not-an-email' });
} catch (error) {
converted = fromError(error);
}
assert.equal(isValidationError(converted), true);
assert.equal(converted instanceof Error, true);
fromZodError is the explicit conversion function when the value is already a Zod error.
import assert from 'node:assert/strict';
import { z as zod } from 'zod';
import { fromZodError, isValidationError } from 'zod-validation-error';
const schema = zod.object({ count: zod.int().positive() });
const result = schema.safeParse({ count: 0 });
assert.equal(result.success, false);
if (result.success) process.exit(1);
const error = fromZodError(result.error);
assert.equal(isValidationError(error), true);
assert.equal(error instanceof Error, true);
Convert one issue
fromZodIssue converts a Zod issue directly into a ValidationError.
import assert from 'node:assert/strict';
import { fromZodIssue, isValidationError } from 'zod-validation-error';
const error = fromZodIssue({
origin: 'number',
code: 'too_small',
minimum: 0,
inclusive: false,
path: ['id'],
message: 'Number must be greater than 0 at "id"',
input: -1,
});
assert.equal(isValidationError(error), true);
assert.equal(error instanceof Error, true);
Convert with toValidationError
toValidationError(options) produces a function that accepts a Zod error and returns a ValidationError.
import assert from 'node:assert/strict';
import { z as zod } from 'zod';
import { isValidationError, toValidationError } from 'zod-validation-error';
const schema = zod.object({ name: zod.string().min(1) });
const result = schema.safeParse({ name: '' });
assert.equal(result.success, false);
if (result.success) process.exit(1);
const convert = toValidationError({});
const error = convert(result.error);
assert.equal(isValidationError(error), true);
Message builders and error maps
createMessageBuilder accepts options including maxIssuesInMessage and includePath. createErrorMap creates the map used with Zod 4 configuration. The package documentation shows configuring both through the package API rather than relying on the older v3 singleton errorMap.
import assert from 'node:assert/strict';
import { z as zod } from 'zod';
import {
createErrorMap,
createMessageBuilder,
} from 'zod-validation-error';
const messageBuilder = createMessageBuilder({
maxIssuesInMessage: 3,
includePath: false,
});
const errorMap = createErrorMap();
assert.equal(typeof messageBuilder, 'function');
assert.equal(typeof errorMap, 'function');
zod.config({ customError: errorMap });
Type guards
The documented guards are useful when handling unknown caught values:
isValidationErrorchecks for the package'sValidationError.isValidationErrorLikechecks whether an unknown value has the validation-error shape expected by the package.isZodErrorLikechecks whether an unknown value has a Zod-error-like shape.
A plain object containing only name and message is not necessarily validation-error-like. Use an actual package error or an actual Zod error when testing these guards.
import assert from 'node:assert/strict';
import { z as zod } from 'zod';
import {
ValidationError,
isValidationError,
isValidationErrorLike,
isZodErrorLike,
} from 'zod-validation-error';
const validationError = new ValidationError('invalid input');
const result = zod.string().parse;
let zodError: unknown;
try {
zod.string().parse(123);
} catch (error) {
zodError = error;
}
assert.equal(isValidationError(validationError), true);
assert.equal(isValidationErrorLike(validationError), true);
assert.equal(isValidationError(new Error('ordinary error')), false);
assert.equal(isZodErrorLike(zodError), true);
Common mistakes
- Using v3 imports or setup with the default v5 entrypoint. The default export is the v4 build. Use
createErrorMap()withzod.config({ customError: ... }). - Using the Zod 3 schema examples with Zod 4. In the documented v5 surface, use
zod.int()andzod.email()rather than assuming the olderzod.number().int()andzod.string().email()examples apply. - Assuming a plain object is validation-error-like.
isValidationErrorLikechecks the package's expected shape;{ name, message }alone does not satisfy it. Use aValidationErroror another value with the documented validation-error shape. - Assuming the package is a runner. It has no documented CLI or test-runner integration requirement. Its conversion, error-map, builder, and guard APIs are callable from ordinary scripts.
- Passing arbitrary caught values to APIs intended for Zod errors. Use
fromErrorfor an unknown caught value; usefromZodErrorortoValidationErrorwhen the value is known to be a Zod error. - Forgetting the peer dependency. The conversion and error-map APIs are built around Zod issue/error types, and the package declares Zod as a peer dependency.
Not covered
This skill does not cover the detailed formatting of every generated message, all createMessageBuilder or toValidationError options beyond those documented above, custom issue construction beyond the shown issue, Zod schema design, package installation commands, or the full Zod 3 API. Those details were not established by the available research.