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 🙏

© 2024 – Pkg Stats / Ryan Hefner

nestjs-zod-prisma

v3.0.1

Published

A Prisma generator that creates Zod schemas for all of your models

Downloads

6,439

Readme

Ecosystem

| Package | About | | :-- | :-- | | nestjs-zod | A tools for integrating Zod into your NestJS application | | nestjs-zod-prisma | Generate Zod schemas from your Prisma schema |

About The Project

Zod Prisma doesn't work well with nestjs-zod and its author has been inactive for a long time - so I created this fork to fix the problems that I suffered from.

To work better with nestjs-zod, this library provides a little different API for Prisma rich comments directives.

You can use @z.string().etc() for specifying different nestjs-zod/z schemas, @z&.something().etc() for applying a new methods on the schema and @z.from(imports.MyPasswordSchema) for using your own schemas.

Also, this library generates DTOs for better NestJS integration. It's done using createZodDto from nestjs-zod.

And we still support the JSDoc comments.

Built With

Getting Started

To get a local copy up and running follow these simple steps.

Prerequisites

  • prisma - ^3.0.0
  • nestjs-zod - ^0.4.4

Installation

  1. Ensure your tsconfig.json enables the compiler's strict mode. Zod requires it and so do we, you will experience TS errors without strict mode enabled

  2. Add nestjs-zod-prisma as a dev dependency

    yarn add -D nestjs-zod-prisma
  3. Add the nestjs-zod-prisma generator to your schema.prisma

    generator zod {
      provider                 = "nestjs-zod-prisma"
      output                   = "./src/zod" // (default) the directory where generated zod schemas will be saved
    
      relationModel            = true // (default) Create and export both plain and related models.
      // relationModel         = "default" // Do not export model without relations.
      // relationModel         = false // Do not generate related model
    
      generateDto              = true // (default) Generate DTOs for NestJS
    
      modelCase                = "PascalCase" // (default) Output models using pascal case (ex. UserModel, PostModel)
      // modelCase             = "camelCase" // Output models using camel case (ex. userModel, postModel)
    
      modelSuffix              = "Model" // (default) Suffix to apply to your prisma models when naming Zod schemas
    
      dtoCase                = "PascalCase" // (default) Output DTOs using pascal case (ex. UserDto, PostDto)
      // dtoCase             = "camelCase" // Output DTOs using camel case (ex. userDto, postDto)
    
      dtoSuffix              = "Dto" // (default) Suffix to apply to your prisma models when naming DTOs
    
      // useDecimalJs          = false // (default) represent the prisma Decimal type using as a JS number
      useDecimalJs             = true // represent the prisma Decimal type using Decimal.js (as Prisma does)
    
      imports                  = null // (default) will import the referenced file in generated schemas to be used via imports.someExportedVariable
    
      // https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-by-null-values
      prismaJsonNullability    = true // (default) uses prisma's scheme for JSON field nullability
      // prismaJsonNullability = false // allows null assignment to optional JSON fields
    }
  4. Run npx prisma generate or yarn prisma generate to generate your zod schemas

  5. Import the generated schemas form your selected output location

Usage

JSDoc Generation

Rich-comments in the Prisma schema will be transformed into JSDoc for the associated fields:

Note: make sure to use a triple-slash. Double-slash comments won't be processed.

model Post {
  /// The unique identifier for the post
  /// @default {Generated by database}
  id String @id @default(uuid())

  /// A brief title that describes the contents of the post
  title String

  /// The actual contents of the post.
  contents String
}

Generated code:

export const PostModel = z.object({
  /**
   * The unique identifier for the post
   * @default {Generated by database}
   */
  id: z.string().uuid(),
  /**
   * A brief title that describes the contents of the post
   */
  title: z.string(),
  /**
   * The actual contents of the post.
   */
  contents: z.string(),
})

Using different Zod type

You can also use the @z keyword in rich-comments in the Prisma schema to specify your Zod schema:

model User {
  id String @id @default(uuid()) /// @z.string().uuid()

  /// @z.string().min(8).max(20)
  username String

  /// @z.password().atLeastOne('digit').atLeastOne('lowercase').atLeastOne('uppercase').min(8).max(100)
  password String
}

Generated code:

export const UserModel = z.object({
  id: z.string().uuid(),
  username: z.string().min(8).max(20),
  password: z
    .password()
    .atLeastOne('digit')
    .atLeastOne('lowercase')
    .atLeastOne('uppercase')
    .min(8)
    .max(100),
})

Importing Helpers

Sometimes its useful to define a custom Zod preprocessor or transformer for your data. nestjs-zod-prisma enables you to reuse these by importing them via a config options. For example:

generator zod {
  provider      = "nestjs-zod-prisma"
  output        = "./src/zod"
  imports       = "../zod-schemas"
}

model User {
  username  String /// @z.string().refine(imports.isValidUsername)
}

The referenced file can then be used by simply referring to exported members via imports.whateverExport. The generated zod schema files will now include a namespaced import like the following.

import * as imports from '../../src/zod-schemas'

Using custom Zod schema

Use combination of z.from and imports to apply your custom Zod schema:

model User {
  id String @id @default(uuid())
  username String

  /// @z.from(imports.MyPasswordSchema)
  password String
}

JSON Fields

JSON fields in Prisma disallow null values. This is to disambiguate between setting a field's value to NULL in the database and having a value of null stored in the JSON. In accordance with this nestjs-zod-prisma will default to disallowing null values, even if your JSON field is optional.

If you would like to revert this behavior and allow null assignment to JSON fields, you can set prismaJsonNullability to false in the generator options.

Examples

For examples, please refer to the Examples Directory or the Functional Tests

Roadmap

See the open issues for a list of proposed features (and known issues).

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

License

Distributed under the MIT License. See LICENSE for more information.

Contact

Evgeny Zakharov - [email protected]

Project Link: https://github.com/risenforces/nestjs-zod-prisma