Skip to content

riseworks/zod-mysql

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

zod-mysql

Generate Zod interfaces from MySQL database

This was a fork of mysql-zod but it diverged so much we decided to make it a separate project and publish it to npm.

Installation

Install zod-mysql with npm

npm install zod-mysql --save-dev

Usage/Examples

Create user table:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT '@zod(z.string().min(10).max(255))', -- this will override the type 
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `profile_picture` varchar(255) DEFAULT NULL,
  `role` enum('admin','user') NOT NULL,
  PRIMARY KEY (`id`)
);

Use the zod-mysql API:

import { generate } from 'zod-mysql'

await generate({
  host: '127.0.0.1',
  port: 3306,
  user: 'root',
  password: 'secret',
  database: 'myapp',
})

The generator will create a user.ts file with the following contents:

import z from 'zod'

export const user = z.object({
  id: z.number().nonnegative(),
  name: z.string().min(10).max(255),
  username: z.string(),
  password: z.string(),
  profile_picture: z.string().nullable(),
  role: z.enum(['admin', 'user']),
})

export const insertable_user = z.object({
  name: z.string().min(10).max(255),
  username: z.string(),
  password: z.string(),
  profile_picture: z.string().nullable(),
  role: z.enum(['admin', 'user']),
})

export const updateable_user = z.object({
  name: z.string().min(10).max(255),
  username: z.string(),
  password: z.string(),
  profile_picture: z.string().nullable(),
  role: z.enum(['admin', 'user']),
})

export const selectable_user = z.object({
  id: z.number().nonnegative(),
  name: z.string().min(10).max(255),
  username: z.string(),
  password: z.string(),
  profile_picture: z.string().nullable(),
  role: z.enum(['admin', 'user']),
})

export type userType = z.infer<typeof user>
export type InsertableUserType = z.infer<typeof insertable_user>
export type UpdateableUserType = z.infer<typeof updateable_user>
export type SelectableUserType = z.infer<typeof selectable_user>

Config

{
  "host": "127.0.0.1",
  "port": 3306,
  "user": "root",
  "password": "secret",
  "database": "myapp",
  "tables": ["user", "log"],
  "ignore": ["log", "/^temp/"],
  "folder": "@zod",
  "suffix": "table",
  "camelCase": false,
  "nullish": false,
  "requiredString": false,
  "ssl": {
    "ca": "path/to/ca.pem",
    "cert": "path/to/cert.pem",
    "key": "path/to/key.pem"
  },
  "useTrim": false,
  "useDateType": false,
  "silent": false,
  "overrideTypes": {
    "tinyint": "z.boolean()"
  }
}
Option Description
tables Filter the tables to include only those specified.
ignore Filter the tables to exclude those specified. If a table name begins and ends with "/", it will be processed as a regular expression.
folder Specify the output directory.
suffix Suffix to the name of a generated file. (eg: user.table.ts)
camelCase Convert all table names and their properties to camelcase. (eg: profile_picture becomes profilePicture)
nullish Set schema as nullish instead of nullable
requiredString Add min(1) for string schema
ssl SSL credentials to use when connecting to server.
useDateType Use a specialized Zod type for date-like fields instead of string
useTrim Use z.string().trim() instead of z.string()
silent Don't log anything to the console
overrideTypes Override zod types for specific field types

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published