ZenStack plugin and decorators for class-validator: Auto-generate DTOs with validation logic directly from your ZModel schema.
npm install zenstack-validator class-validator class-transformer
# or
pnpm add zenstack-validator class-validator class-transformer
# or
yarn add zenstack-validator class-validator class-transformer
Peer dependencies: This package expects class-validator, class-transformer, and @zenstackhq/sdk to be
installed in your project.
The plugin generates a TypeScript file containing DTO classes—complete with class-validator and class-transformer
decorators—based on your ZenStack schema.
Add the plugin to your schema.zmodel:
plugin validator {
provider = 'zenstack-validator/plugin'
output = './src/dto'
}
output(optional): The directory where thedtos.tsfile will be generated.- Default: To zenstack's default generation directory if omitted.
npx zenstack generate
This will create src/dto/dtos.ts containing your typed DTO classes.
// Import from your generated location
import { UserDTO } from "./src/dto/dtos";
// Example in a NestJS Controller
@Post()
async createUser(@Body() body: UserDTO) {
console.log(body.email); // Fully typed and validated!
}**Input: schema.zmodel**
model User {
id String @id @default(cuid())
email String @email
name String? @trim @lower
age Int @gt(0, "Must be positive") @lte(120)
createdAt DateTime @default(now())
}
**Output: dtos.ts**
import { IsEmail, IsOptional, IsInt, IsDate, Max } from "class-validator";
import { Type } from "class-transformer";
import { Trim, LowerCase, Gt } from "zenstack-validator";
export class UserDTO {
@IsEmail()
email!: string;
@IsOptional()
@Trim()
@LowerCase()
name?: string;
@IsInt()
@Gt(0, { message: "Must be positive" })
@Max(120)
age!: number;
@IsDate()
@Type(() => Date)
createdAt!: Date;
}This package includes custom decorators that cover gaps in the standard class-validator library (like strict
inequalities) or provide transformation utilities.
| Decorator | Arguments | Description |
|---|---|---|
@Gt |
(min: number, options?) |
Validates that the value is strictly greater than min. |
@Lt |
(max: number, options?) |
Validates that the value is strictly less than max. |
@Trim |
() |
Trims leading/trailing whitespace (via class-transformer). |
@LowerCase |
() |
Converts string to lowercase (via class-transformer). |
@UpperCase |
() |
Converts string to uppercase (via class-transformer). |
Note: Standard validators like @email, @length, @min, @max, and @regex map directly to built-in
class-validator decorators.
- Runtime Decorators (Default export): Used by your application at runtime.
import { Gt, Lt, Trim, LowerCase } from "zenstack-validator";- Generator Plugin: Used by the ZenStack CLI during generation.
// In schema.zmodel
// provider = 'zenstack-validator/plugin'MIT