npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@imqueue/validation

v1.1.0

Published

Zod-backed field- and method-level validation via native (TC39) decorators for Node.js & TypeScript microservices — the input-validation layer of the @imqueue framework

Downloads

426

Readme

@imqueue/validation

License

Zod-backed, field- and method-level validation via native (TC39) decorators for Node.js & TypeScript back-ends — the input-validation layer of the @imqueue framework. Declare a validator next to a class field with @validate, seal the class with @validatable, and validate method arguments with @validated.

Documentation: full guides, tutorial and API reference at imqueue.org. Commercial licensing & support for closed-source products at imqueue.com.

Using an AI assistant? Point it at imqueue.org/llms.txt for a machine-readable index of the docs, or see AGENTS.md.

Related packages:

  • @imqueue/core - Fast JSON message queue over Redis for inter-service communication.
  • @imqueue/rpc - RPC-like client/service implementation over @imqueue/core.
  • @imqueue/pg-prisma - Prisma/Postgres toolkit for @imqueue services.

Features

  • Native TC39 decorators — no experimentalDecorators, no reflect-metadata. Works under the standard TypeScript decorator emit.
  • Zod schemas — reuse any zod schema as a field or argument validator.
  • Composable — a @validatable class can be used as a validator for a field or argument on another class, so nested input shapes validate recursively.
  • Method-argument validation@validated(...) checks positional arguments left-to-right; a null/undefined entry skips that position.
  • TypeScript included!

Requirements

Node.js ≥ 22.12. zod v4 is a runtime dependency.

Install

npm i --save @imqueue/validation

Usage

import { z } from 'zod';
import {
    validatable,
    validate,
    validated,
    schemaOf,
} from '@imqueue/validation';

@validatable()
class Credentials {
    @validate(z.string().min(3))
    identifier!: string;

    @validate(z.string().min(8))
    secret!: string;
}

// A schema assembled from the field validators (or `null` if the class has none)
const schema = schemaOf(Credentials); // z.object({ identifier, secret })

class AuthService {
    // Validate positional arguments before the method body runs.
    // Pass a Zod schema, a `@validatable` class, or `null`/`undefined` to skip.
    @validated(Credentials)
    authenticate(creds: Credentials): string {
        return creds.identifier;
    }
}

new AuthService().authenticate({ identifier: 'ab', secret: 'short' });
// → throws ZodError (identifier too short, secret too short)

How it works

TC39 decorator metadata (Symbol.metadata) is not populated by every build tool (esbuild/tsx), so field validators are buffered as each class body evaluates and sealed onto the class by the @validatable() class decorator. Field decorators run before the class decorator and class bodies evaluate sequentially, so the buffer reaches the right class — provided that class is decorated. schemaOf(Class) then assembles the sealed field validators into a z.object(...).

Three things to know

  • @validatable() is not optional. Nothing flushes the buffer when a class body merely ends, so a class using @validate without @validatable() hands its fields to the next class that is sealed. That class then rejects valid input over a property it never declared, while the class with the actual mistake validates nothing — the error surfaces on the innocent one.
  • @validated checks arguments, it does not replace them. The method body receives exactly what the caller passed, so a transforming schema validates as expected and changes nothing downstream: z.coerce.number() accepts '42' and the parameter is still the string, .trim() hands over the untrimmed original, .default(...) fills nothing in, and object schemas leave undeclared properties in place. Parse in the body where the converted value is what you need.
  • Inherited fields are not inherited rules. @validatable() seals the fields declared in that class body only, and schemaOf does not walk the prototype chain, so a subclass validates a parent's field only by re-declaring it.

Running Unit Tests

Tests run on the native Node.js test runner (node:test) with node:assert and no external test framework:

git clone [email protected]:imqueue/validation.git
cd validation
npm install
npm test

To produce a coverage report use:

npm run test-coverage        # prints coverage summary to the console
npm run test-lcov            # writes coverage/lcov.info

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE