zod-mysql
TypeScript icon, indicating that this package has built-in type declarations

3.4.2 • Public • Published

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

Readme

Keywords

none

Package Sidebar

Install

npm i zod-mysql

Weekly Downloads

213

Version

3.4.2

License

MIT

Unpacked Size

10.5 kB

Total Files

5

Last publish

Collaborators

  • thelinuxlich