zod-prisma 类型
此目录来自 https://github.com/chrishoermann/zod-prisma-types (中文(简体) )
zod-prisma-types 是一个用于 棱镜 生成 佐德语 你的棱镜模型的图案 这包括模型,enums,输入Types,agTypes,过滤器等的图案. 它还提供了直接将高级的zod验证器写入棱镜schema注释的选项.
因为我在业余时间维持发电机 考虑请我喝杯咖啡 或者赞助我 如果你喜欢这个项目的话 谢谢!
V2.x.x中突破变化
注意一些生成器选项被移除,添加了几个新内容,自定义导入行为发生改变,再不需要ts-morph来生成v2.0.0中的文件.
已知问题
自兹
zod version 3.21.2一些计程器会丢出打字错误 。 请使用zod version 3.21.1直到这个问题得到解决.
目录
关于这个项目
对于我的一个项目,我需要一台发电机 提供增加的可能性 zod valdiators 直接输入 prisma schema's 富人评论 生成 zod 用于所有棱镜模型,enums,输入Types,agTypes,滤镜等的图案. 我也希望能在前端导入这些图案,例如用于形式验证,并使生成器像多管所一样灵活,从而涵盖大量使用案例. 因为那里没有能满足我要求的发电机 或者它们不再活动维护 我决定写作 zod-prisma-type。 。 。 .
安装
传统发展
使用量
支持棱镜 4.x
将以下代码添加到您的 prisma.schema 要创建单个文件的文件 index.ts 文档中 ./generated/zod 包含全部 zod 棱镜图案的输出文件夹 .
generator zod {
provider = "zod-prisma-types"
}
然后将计划导入到您的文件中:
import { mySchema } from '/prisma/generated/zod' // All schemas are here by default, use the 'output' option to change it
如果遇到以下错误
/bin/sh: zod-prisma-types: command not found请尝试使用npx命令与zod-prisma-types命令.
generator zod {
provider = "npx zod-prisma-types"
}
如果您想要自定义生成器的行为, 您可以使用以下选项:
generator zod {
provider = "ts-node-dev ../generator/src/bin.ts"
output = "./generated/zod" // default is ./generated/zod
useMultipleFiles = true // default is false
createInputTypes = false // default is true
createModelTypes = false // default is true
addInputTypeValidation = false // default is true
addIncludeType = false // default is true
addSelectType = false // default is true
validateWhereUniqueInput = true // default is false
createOptionalDefaultValuesTypes = true // default is false
createRelationValuesTypes = true // default is false
createPartialTypes = true // default is false
useDefaultValidators = false // default is true
coerceDate = false // default is true
writeNullishInModelTypes = true // default is false
prismaClientPath = "./path/to/prisma/client" // default is client output path
}
useMultipleFiles
默认 :
false
如果您想要创建多个文件而不是一个文件 index.ts 文件可以设置此选项 true。这将为每个模型、enum、involutionType、argType、过滤器等创建文件。 这些文件将在指定的输出文件夹中的子文件夹中创建,并在输出文件夹的根部会添加一个桶文件.
generator zod {
// ...rest of config
useMultipleFiles = false
}
output
默认 :
./generated/zod
提供替代输出路径 .
createInputTypes
默认 :
true
如果您只想为您的模型和enum创建zod schemas, 您可以禁用相应的输入类型的创建 。 如果您想要使用您的模型的 zod 方案来验证输入类型, 这可能是有益的 react-hook-form 或一些类似的使用案例.
generator zod {
// ...rest of config
createInputTypes = false
}
createModelTypes
默认 :
true
如果您想要为输入类型创建 Zod 计划, 您可以禁用相应的模型计划 。 如果您想要在 Trpc 查询或类似的使用上使用 zod 输入策略来自动补全, 这可能有用 .
generator zod {
// ...rest of config
createModelTypes = false
}
addInputTypeValidation
默认 :
true
如果您想要使用您的自定义 zod 验证符, 您只通过丰富的注释在您生成的模型图中添加, 而不是您创建的输入类型图中添加( ) UserCreateInput, (中文(简体) ), UserUpdateManyInput等),可以禁用此特性.
generator zod {
// ...rest of config
addInputTypeValidation = false
}
addIncludeType
默认 :
true
默认情况下,将包含类型添加到 [Model]ArgTypeSchema。如果您不想添加 Zod 计划 include 类型 false。 。 。 .
generator zod {
// ...rest of config
addIncludeType = false
}
addSelectType
默认 :
true
默认情况下,选定类型将添加到 [Model]ArgTypeSchema。如果您不想添加 Zod 计划 select 类型 false。 。 。 .
generator zod {
// ...rest of config
addSelectType = false
}
validateWhereUniqueInput
默认 :
false
默认生成器不会验证 whereUnique 多文件模式的输入类型,因为经常会生成一批未使用的导入. 如果你想验证 whereUnique 您可以设置此选项的输入类型 true。 。 。 .
请注意,如果使用Eslint系统,可能导致Eslint错误
no-unused-vars规则需要手动解决.
generator zod {
// ...rest of config
validateWhereUniqueInput = true
}
createOptionalDefaultValuesTypes
默认 :
false
如果您想要将默认值的字段标为 .optional() 您可以通过以下配置选项:
generator zod {
// ...rest of config
createOptionalDefaultValuesTypes = true
}
model ModelWithDefaultValues {
id Int @id @default(autoincrement())
string String @default("default")
otherString String
int Int @default(1)
otherInt Int
float Float @default(1.1)
otherFloat Float
boolean Boolean @default(true)
otherBool Boolean
date DateTime @default(now())
otherDate DateTime
}
上述模型将产生以下模型计划:
export const ModelWithDefaultValuesSchema = z.object({
id: z.number(),
string: z.string(),
otherString: z.string(),
int: z.number(),
otherInt: z.number(),
float: z.number(),
otherFloat: z.number(),
boolean: z.boolean(),
otherBool: z.boolean(),
date: z.date(),
otherDate: z.date(),
})
export const ModelWithDefaultValuesOptionalDefaultsSchema =
ModelWithDefaultValuesSchema.merge(
z.object({
id: z.number().optional(),
string: z.string().optional(),
int: z.number().optional(),
float: z.number().optional(),
boolean: z.boolean().optional(),
date: z.date().optional(),
})
)
createRelationValuesTypes
默认 :
false
如果您需要包含所有关系字段的单独的模型类型,您可以通过以下选项。 由于需要有递归型的注释类型,该模型自此具有一些局限性 z.ZodType<myType> 不允许像 .merge(), (中文(简体) ), .omit()等 (中文(简体) ).
generator zod {
// ...rest of config
createRelationValuesTypes = true
}
model User {
id String @id @default(cuid())
email String @unique
name String?
posts Post[]
profile Profile?
role Role[] @default([USER, ADMIN])
enum AnotherEnum @default(ONE)
scalarList String[]
lat Float
lng Float
location Location? @relation(fields: [lat, lng], references: [lat, lng])
}
上述模型将产生以下模型计划:
export const UserSchema = z.object({
role: RoleSchema.array(),
enum: AnotherEnumSchema,
id: z.string().cuid(),
email: z.string(),
name: z.string().optional(),
scalarList: z.string().array(),
lat: z.number(),
lng: z.number(),
})
export type UserRelations = {
posts: PostWithRelations[]
profile?: ProfileWithRelations | null
location?: LocationWithRelations | null
}
export type UserWithRelations = z.infer<typeof UserSchema> & UserRelations
export const UserWithRelationsSchema: z.ZodType<UserWithRelations> =
UserSchema.merge(
z.object({
posts: z.lazy(() => PostWithRelationsSchema).array(),
profile: z.lazy(() => ProfileWithRelationsSchema).nullish(),
location: z.lazy(() => LocationWithRelationsSchema).nullish(),
})
)
如果将选项与 createOptionalDefaultValuesTypes 此外,还生成下列模型计划:
export type UserOptionalDefaultsWithRelations = z.infer<
typeof UserOptionalDefaultsSchema
> &
UserRelations
export const UserOptionalDefaultsWithRelationsSchema: z.ZodType<UserOptionalDefaultsWithRelations> =
UserOptionalDefaultsSchema.merge(
z.object({
posts: z.lazy(() => PostWithRelationsSchema).array(),
profile: z.lazy(() => ProfileWithRelationsSchema).nullable(),
location: z.lazy(() => LocationWithRelationsSchema).nullable(),
target: z.lazy(() => LocationWithRelationsSchema).nullable(),
})
)
createPartialTypes
默认 :
false
如果您需要单独的模型类型,其中包含所有可选字段,您可以通过以下选项.
generator zod {
// ...rest of config
createPartialTypes = true
}
model User {
id String @id @default(cuid())
email String @unique
name String?
posts Post[]
profile Profile?
role Role[] @default([USER, ADMIN])
enum AnotherEnum @default(ONE)
scalarList String[]
lat Float
lng Float
location Location? @relation(fields: [lat, lng], references: [lat, lng])
}
上述模型将产生以下模型计划:
export const UserPartialSchema = z
.object({
role: RoleSchema.array(),
enum: AnotherEnumSchema,
id: z.string().cuid(),
email: z.string().email({ message: 'Invalid email address' }),
name: z.string().min(1).max(100).nullable(),
scalarList: z.string().array(),
lat: z.number(),
lng: z.number(),
})
.partial()
当结合使用此选项时 createRelationValuesTypes 以下模型计划也生成。 这种模型具有一些局限性 z.ZodType<myType> 不允许像 .merge(), (中文(简体) ), .omit()等 (中文(简体) ).
export type UserPartialRelations = {
posts?: PostPartialWithRelations[]
profile?: ProfilePartialWithRelations | null
location?: LocationPartialWithRelations | null
}
export type UserPartialWithRelations = z.infer<typeof UserPartialSchema> &
UserPartialRelations
export const UserPartialWithRelationsSchema: z.ZodType<UserPartialWithRelations> =
UserPartialSchema.merge(
z.object({
posts: z.lazy(() => PostPartialWithRelationsSchema).array(),
profile: z.lazy(() => ProfilePartialWithRelationsSchema).nullable(),
location: z.lazy(() => LocationPartialWithRelationsSchema).nullable(),
})
).partial()
导出类型 UserPartial = z.infer;
useDefaultValidators
默认 :
true
在某些情况下,生成器会添加默认验证符:
model WithDefaultValidators {
id String @id @default(cuid())
idTwo String @default(uuid())
integer Int
}
export const WithDefaultValidatorsSchema = z.object({
id: z.string().cuid(),
idTwo: z.string().uuid(),
integer: z.number().int(),
})
这些默认值在使用自定义验证符时被覆盖(参见: 实地验证器(中文(简体) ) 或选择退出在特定字段使用默认验证符时:
model WithDefaultValidators {
id String @id @default(cuid()) /// @zod.string.noDefault()
idTwo String @default(uuid()) /// @zod.string.noDefault()
integer Int /// @zod.number.noDefault()
}
export const WithDefaultValidatorsSchema = z.object({
id: z.string(),
idTwo: z.string(),
integer: z.number(),
})
您可以完全选择退出此特性, 将错误传递到配置选项 .
generator zod {
// ...rest of config
useDefaultValidators = false
}
计划在未来的发布中(通过检查图中的@db.filds)进行更多的默认验证. 如果您对默认验证器有一些想法, 可以随意打开一个问题 .
coerceDate
默认: 真
默认 DateTime 价值观受到胁迫 Date 对象,只要你通过在一个 valid ISO string 或一个 instance of Date。可以改变此行为以生成一个简单的 z.date() 将以下选项传递给生成器配置:
generator zod {
// ...rest of config
coerceDate = false
}
writeNullishInModelTypes
默认: 假
默认情况下,生成器只是写 .nullable() 在模型Types中,当Prisma类型的字段无效时。 如果你想要这些字段接受 null | undefined页:1 .nullish() 在设计图中,可以将以下选项传递给生成器配置 :
generator zod {
// ...rest of config
writeNullishInModelTypes = true
}
prismaClientPath
默认 :
infereed from prisma schema path
默认情况下, prisma 客户端路径会从 output 路径 prisma.schema 文件编号 generator client。如果还需要使用自定义路径,您可以通过此选项将其传递给生成器配置。 自定义路径优先于受难棱镜客户端输出路径.
generator zod {
// ...rest of config
prismaClientPath = "./path/to/prisma/client"
}
跳过计划生成
您可以跳过基于您当前工作环境的生成计划 。 举例来说,只有在你加入时才能生成计划 development 但当你运行世代在 production (因为 production 计划早就被创建了 并且通过您的 git repo 推向服务器了.
既然Prisma只让我们定义 strings 在生成器配置中我们不能使用 env(MY_ENV_VARIABLE) 使用方法,例如: url 下级 datasource db 已装入 :
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
要仍然能够将环境变量加载到生成器中,只需创建一个 zodGenConfig.js 在您的根目录中 node_modules 文件夹位于)并添加以下代码:
module.exports = {
skipGenerator: process.env['SKIP_ZOD_PRISMA'],
}
然后添加
SKIP_ZOD_PRISMA = 'true'
或者说
SKIP_ZOD_PRISMA = 'false'
给您的 .env 文档。 这将加载 SKIP_ZOD_PRISMA 环境变量 skipGenerator 然后由发电机消耗的道具.
您可以选择指定您想要的环境变量
zodGenConfig.js。 。 。 .
自定义 Enums
对于自定义的enums,生成一个单独的类型,代表作为结合的enum值. 由于在打字联盟中比注字联盟更有用,这可以有所帮助.
enum MyEnum {
A
B
C
}
export const MyEnumSchema = z.nativeEnum(PrismaClient.MyEnum)
export type MyEnumType = `${z.infer<typeof MyEnumSchema>}` // union of "A" | "B" | "C"
Json 无效值
当使用 json 虚值 棱镜时, 它有独特的处理数据库的方法 NULL 和JSON项目 null 如所述 文档中。 。 。 .
为了坚持这个概念,你可以通过 "DbNull" 或者说 "JsonNull" 作为无效的 Json 字段的字符串。 当计划被验证后,这些字符串被转换为 Prisma.DbNull 或者说 Prisma.JsonNull 满足 prisma.[myModel].create() | .update() | ... 函数.
小数
当使用十进制 a refine 如果输入坚持棱镜输入结合,则使用方法验证 string | number | Decimal | DecimalJsLike。 。 。 .
model MyModel {
id Int @id @default(autoincrement())
decimal Decimal
}
上述模式将产生以下计划:
// DECIMAL HELPERS
//------------------------------------------------------
export const DecimalJSLikeSchema: z.ZodType<Prisma.DecimalJsLike> = z.object({
d: z.array(z.number()),
e: z.number(),
s: z.number(),
toFixed: z.function().args().returns(z.string()),
})
export const DecimalJSLikeListSchema: z.ZodType<Prisma.DecimalJsLike[]> = z
.object({
d: z.array(z.number()),
e: z.number(),
s: z.number(),
toFixed: z.function().args().returns(z.string()),
})
.array()
export const DECIMAL_STRING_REGEX = /^[0-9.,e+-bxffo_cp]+$|Infinity|NaN/
export const isValidDecimalInput = (
v?: null | string | number | Prisma.DecimalJsLike
): v is string | number | Prisma.DecimalJsLike => {
if (v === undefined || v === null) return false
return (
(typeof v === 'object' &&
'd' in v &&
'e' in v &&
's' in v &&
'toFixed' in v) ||
(typeof v === 'string' && DECIMAL_STRING_REGEX.test(v)) ||
typeof v === 'number'
)
}
// SCHEMA
//------------------------------------------------------
export const MyModelSchema = z.object({
id: z.number(),
decimal: z
.union([z.number(), z.string(), DecimalJSLikeSchema])
.refine((v) => isValidDecimalInput(v), {
message:
"Field 'decimal' must be a Decimal. Location: ['Models', 'DecimalModel']",
}),
})
字段验证器
可以在 注释中添加 zod 验证符 prisma.schema 使用下列语法的文件 富人评论 /// 改为 //) (中文(简体) ).
myField [prisma-scalar-type] /// @zod.[zod-type + optional[(zod-error-messages)]].[zod validators for scalar-type]
这看起来有点隐秘 所以这里有一个例子:
generator zod {
provider = "zod-prisma-types"
output = "./zod"
}
/// @zod.import(["import { myFunction } from 'mypackage';"])
model MyPrismaScalarsType {
/// @zod.string({ invalid_type_error: "some error with special chars: some + -*#'substring[]*#!§$%&/{}[]", required_error: "some other", description: "some description" }).cuid()
id String @id @default(cuid())
/// Some comment about string @zod.string.min(3, { message: "min error" }).max(10, { message: "max error" })
string String?
/// @zod.custom.use(z.string().refine((val) => validator.isBIC(val), { message: 'BIC is not valid' }))
bic String?
/// @zod.number.lt(10, { message: "lt error" }).gt(5, { message: "gt error" })
float Float
floatOpt Float?
/// @zod.number.int({ message: "error" }).gt(5, { message: "gt error" })
int Int
intOpt Int?
decimal Decimal
decimalOpt Decimal?
date DateTime @default(now())
dateOpt DateTime? /// @zod.date({ invalid_type_error: "wrong date type" }) bigInt BigInt /// @zod.bigint({ invalid_type_error: "error" })
bigIntOpt BigInt?
/// @zod.custom.use(z.lazy(() => InputJsonValue).refine((val) => myFunction(val), { message: 'Is not valid' }))
json Json
jsonOpt Json?
bytes Bytes /// @zod.custom.use(z.instanceof(Buffer).refine((val) => val ? true : false, { message: 'Value is not valid' }))
bytesOpt Bytes?
/// @zod.custom.use(z.string().refine((val) => myFunction(val), { message: 'Is not valid' }))
custom String?
exclude String? /// @zod.custom.omit(["model", "input"])
updatedAt DateTime @updatedAt
}
此示例为模型生成以下 Zod 计划 prisma/zod/index.ts数字 :
import { z } from 'zod'
import * as PrismaClient from '@prisma/client'
import validator from 'validator'
import { myFunction } from 'mypackage'
export const MyPrismaScalarsTypeSchema = z.object({
id: z
.string({
invalid_type_error:
"some error with special chars: some + -*#'substring[]*#!§$%&/{}[]",
required_error: 'some other',
description: 'some description',
})
.cuid(),
/**
* Some comment about string
*/
string: z
.string()
.min(3, { message: 'min error' })
.max(10, { message: 'max error' })
.nullish(),
bic: z
.string()
.refine((val) => validator.isBIC(val), { message: 'BIC is not valid' })
.nullish(),
float: z
.number()
.lt(10, { message: 'lt error' })
.gt(5, { message: 'gt error' }),
floatOpt: z.number().nullish(),
int: z.number().int({ message: 'error' }).gt(5, { message: 'gt error' }),
intOpt: z.number().int().nullish(),
decimal: z
.union([
z.number(),
z.string(),
z.instanceof(PrismaClient.Prisma.Decimal),
DecimalJSLikeSchema,
])
.refine((v) => isValidDecimalInput(v), {
message: 'Field "decimal" must be a Decimal',
path: ['Models', 'MyPrismaScalarsType'],
}),
decimalOpt: z
.union([
z.number(),
z.string(),
z.instanceof(PrismaClient.Prisma.Decimal),
DecimalJSLikeSchema,
])
.refine((v) => isValidDecimalInput(v), {
message: 'Field "decimalOpt" must be a Decimal',
path: ['Models', 'MyPrismaScalarsType'],
})
.nullish(),
date: z.coerce.date(),
dateOpt: z.coerce.date({ invalid_type_error: 'wrong date type' }).nullish(),
bigIntOpt: z.bigint().nullish(),
json: z
.lazy(() => InputJsonValue)
.refine((val) => myFunction(val), { message: 'Is not valid' }),
jsonOpt: NullableJsonValue.optional(),
bytes: z
.instanceof(Buffer)
.refine((val) => (val ? true : false), { message: 'Value is not valid' }),
bytesOpt: z.instanceof(Buffer).nullish(),
custom: z
.string()
.refine((val) => myFunction(val), { message: 'Is not valid' })
.nullish(),
// omitted: exclude: z.string().nullish(),
updatedAt: z.date(),
})
export type MyPrismaScalarsType = z.infer<typeof MyPrismaScalarsTypeSchema>
export const MyPrismaScalarsTypeOptionalDefaultsSchema =
MyPrismaScalarsTypeSchema.merge(
z.object({
id: z
.string({
invalid_type_error:
"some error with special chars: some + -*#'substring[]*#!§$%&/{}[]",
required_error: 'some other',
description: 'some description',
})
.cuid()
.optional(),
date: z.date().optional(),
updatedAt: z.date().optional(),
})
)
此外,所有用于棱镜输入的zod schemas-, enum-, filter-, orderBy-, selected-, 包括和其他必要类型, 都可以用于例如.
trpc投入.
自定义导入
要将自定义导入添加到您的验证器中, 您可以通过 @zod.import([...myCustom imports as strings]) 在棱镜中对模型定义的丰富评论.
例如:
/// @zod.import(["import { myFunction } from 'mypackage'"])
model MyModel {
myField String /// @zod.string().refine((val) => myFunction(val), { message: 'Is not valid' })
}
这将产生如下产出:
import { myFunction } from 'mypackage'
export const MyModelSchema = z.object({
myField: z
.string()
.refine((val) => myFunction(val), { message: 'Is not valid' }),
})
请注意,如果使用此选项,您必须在相对进口中添加一个级别
useMultipleFiles选项.
自定义类型错误消息
要将自定义的 zod- 类型错误消息添加到您的验证器中, 您可以通过 @zod.[key]({ ...customTypeErrorMessages }).[validator key]。自定义错误信息必须坚持以下类型:
type RawCreateParams =
| {
invalid_type_error?: string
required_error?: string
description?: string
}
| undefined
例如:
model MyModel {
myField String /// @zod.string({ invalid_type_error: "invalid type error", required_error: "is required", description: "describe the error" })
}
这将产生如下产出:
string: z.string({
invalid_type_error: 'invalid type error',
required_error: 'is required',
description: 'describe the error',
}),
如果您使用错误的密钥或有打字符, 生成器会丢出错误 :
model MyModel {
myField String /// @zod.string({ required_error: "error", invalid_type_errrrrror: "error"})
}
[@zod generator error]: Custom error key 'invalid_type_errrrrror' is not valid. Please check for typos! [Error Location]: Model: 'Test', Field: 'myField'.
字符串验证符
在棱镜中添加自定义验证符 String 字段可以使用 @zod.string 键。 您可以在此键上使用在 zod-docs。也可以按照文件中的规定,在每个验证器中添加自定义错误消息.
model MyModel {
myField String /// @zod.string.min(3, { message: "min error" }).max(10, { message: "max error" }).[...chain more validators]
}
数字验证符
在棱镜中添加自定义验证符 Int 或者说 Float 字段可以使用 @zod.number 键。 在此密钥上, 您可以使用您在 zod-docs。也可以按照文件中的规定,在每个验证器中添加自定义错误消息.
model MyModel {
myField Int
/// @zod.number.lt(10, { message: "lt error" }).gt(5, { message: "gt error" }).[...chain more validators]
}
BigInt 验证器
在棱镜中添加自定义验证符 BigInt 字段可以使用 @zod.bigint 键。 您可以在此键上使用在 zod-docs。也可以按照文件中的规定,在每个验证器中添加自定义错误消息.
model MyModel {
myField BigInt /// @zod.bigint.lt(5n, { message: "lt error" }).gt(6n, { message: "gt error" })({ invalid_type_error: "error", ... }).[...chain more validators]
}
日期验证符
在棱镜中添加自定义验证符 DateTime 字段可以使用 @zod.date 键。 在此键上,您可以使用您在 zod-docs。也可以按照文件中的规定,在每个验证器中添加自定义错误消息.
model MyModel {
myField DateTime /// @zod.date.min(new Date('2020-01-01')).max(new Date('2020-12-31'))
}
自定义验证符
将自定义验证符添加到任意 Prisma Scalar 字段可以使用 @zod.custom.use() 键。 这个键只有 .use(...your custom code here) 验证器。 此代码覆盖所有其他标准执行, 因此您必须精确指定 zod type 如何由生成器写出来。 仅 .optional() 财务报告和审定财务报表 .nullable() 根据您的棱镜型式定义自动添加。 此字段被插入以提供像 Zod 这样的验证器 .refine 或者说 .transform 在你的地盘上.
model MyModel {
id Int @id @default(autoincrement())
custom String? /// @zod.custom.use(z.string().refine(val => validator.isBIC(val)).transform(val => val.toUpperCase()))
}
上述模型计划将产生以下zod计划:
export const MyModel = z.object({
id: z.number(),
custom: z
.string()
.refine((val) => validator.isBIC(val))
.transform((val) => val.toUpperCase())
.nullable(),
})
矩阵验证符
要添加自定义验证符以列出字段, 您可以使用 z.[key].array(.length(2).min(1).max(2).nonempty()) 验证器。 您可以在 @zod.string, (中文(简体) ), @zod.number, (中文(简体) ), @zod.bigint, (中文(简体) ), @zod.date 财务报告和审定财务报表 @zod.custom此外,你可以用在 enums 上与 @zod.enum.array(...) 和与《京都议定书》 @zod.object.array(...) 键。 您也可以向每个校验器添加自定义错误消息.
model MyModel {
id Int @id @default(autoincrement())
string String[] /// @zod.string.array(.length(2, { message: "my message" }).min(1, { message: "my message" }).max(2, { message: "my message" }).nonempty({ message: "my message" }))
number Int[] /// @zod.number.array(.length(2).min(1).max(2).nonempty())
bigint BigInt[] /// @zod.bigint.array(.length(2).min(1).max(2).nonempty())
date DateTime[] /// @zod.date.array(.length(2).min(1).max(2).nonempty())
custom String[] /// @zod.custom.use(z.string().refine(val => validator.isBIC(val)).transform(val => val.toUpperCase())).array(.length(2).min(1).max(2).nonempty())
enum MyEnum[] /// @zod.enum.array(.length(2).min(1).max(2).nonempty())
object MyObject[] /// @zod.object.array(.length(2).min(1).max(2).nonempty())
}
上述模型计划将产生以下zod计划:
export const MyModel = z.object({
id: z.number(),
string: z
.string()
.array()
.length(2, { message: 'my message' })
.min(1, { message: 'my message' })
.max(2, { message: 'my message' })
.nonempty({ message: 'my message' }),
number: z.number().array().length(2).min(1).max(2).nonempty(),
bigint: z.bigint().array().length(2).min(1).max(2).nonempty(),
date: z.date().array().length(2).min(1).max(2).nonempty(),
custom: z
.string()
.refine((val) => validator.isBIC(val))
.transform((val) => val.toUpperCase())
.array()
.length(2)
.min(1)
.max(2)
.nonempty(),
enum: MyEnumSchema.array().length(2).min(1).max(2).nonempty(),
})
缩写字段
可以通过使用 @zod.custom.omit(["model", "input"])。通过两个键时 "model" 财务报告和审定财务报表 "input" 字段在二者中被省略,生成的模型图和生成的输入类型(见下文示例)。 如果您想要在其中的某个计划中省略字段, 只需要提供匹配的密钥 。 您也可以不写 " 或者说 '。 。 。 .
model MyModel {
id Int @id @default(autoincrement())
string String? /// @zod.string.min(4).max(10)
omitField String? /// @zod.custom.omit([model, input])
omitRequired String /// @zod.custom.omit([model, input])
}
上面的模型将生成以下的zod schemas(省略的密钥留在模型中,但被评论出来,这样你可以看到在查看zod schema时省略了哪些字段):
// MODEL TYPES
// ---------------------------------------
export const MyModelSchema = z.object({
id: z.number(),
string: z.string().min(4).max(10).nullish(),
// omitted: omitField: z.string().nullish(),
// omitted: omitRequired: z.string(),
})
// INPUT TYPES
// ---------------------------------------
export const MyModelCreateInputSchema: z.ZodType<
Omit<PrismaClient.Prisma.MyModelCreateInput, 'omitField' | 'omitRequired'>
> = z
.object({
string: z.string().min(4).max(10).optional().nullable(),
// omitted: omitField: z.string().optional().nullable(),
// omitted: omitRequired: z.string(),
})
.strict()
export const MyModelUncheckedCreateInputSchema: z.ZodType<
Omit<
PrismaClient.Prisma.MyModelUncheckedCreateInput,
'omitField' | 'omitRequired'
>
> = z
.object({
id: z.number().optional(),
string: z.string().min(4).max(10).optional().nullable(),
// omitted: omitField: z.string().optional().nullable(),
// omitted: omitRequired: z.string(),
})
.strict()
export const MyModelUpdateInputSchema: z.ZodType<
Omit<PrismaClient.Prisma.MyModelUpdateInput, 'omitField' | 'omitRequired'>
> = z
.object({
string: z
.union([
z.string().min(4).max(10),
z.lazy(() => NullableStringFieldUpdateOperationsInputSchema),
])
.optional()
.nullable(),
// omitted: omitField: z.union([ z.string(),z.lazy(() => NullableStringFieldUpdateOperationsInputSchema) ]).optional().nullable(),
// omitted: omitRequired: z.union([ z.string(),z.lazy(() => StringFieldUpdateOperationsInputSchema) ]).optional(),
})
.strict()
// AND SO ON...
// ARG TYPES
// ---------------------------------------
// To be compatible with the inputTypes the type of the `ArgSchema` is updated accordingly
export const MyModelCreateArgsSchema: z.ZodType<
Omit<PrismaClient.Prisma.MyModelCreateArgs, 'data'> & {
data:
| z.infer<typeof MyModelCreateInputSchema>
| z.infer<typeof MyModelUncheckedCreateInputSchema>
}
> = z
.object({
select: MyModelSelectSchema.optional(),
data: z.union([
MyModelCreateInputSchema,
MyModelUncheckedCreateInputSchema,
]),
})
.strict()
当a
required字段被省略create, (中文(简体) ),update, (中文(简体) ),createMany诸如来. 否则,打字会抱怨.
const appRouter = t.router({
createMyModel: t.procedure
.input(MyModelCreateArgsSchema) // field `omitRequired` is not included in `data`
.query(({ input }) => {
return prisma.myModel.create({
...input,
data: {
...input.data,
omitRequired: 'foo', // field needs to be added manually
},
})
}),
})
校验错误
方便开发者体验生成器检查, 如果提供 @zod.[key] 可用于模型字段的相应类型。 它也检查是否 @zod.[key].[validator] 可用于指定的 @zod.[key]
Wrong zod type
如果您使用验证键, 生成器会丢出错误 @zod.string 在错误的棱镜类型.
model MyModel {
string String /// @zod.string.min(3) -> valid - `string` can be used on `String`
number Number /// @zod.string.min(3) -> invalid - `string` can not be used on `Number`
}
对于上述例子,错误消息看起来是这样的:
[@zod generator error]: Validator 'string' is not valid for type 'Int'. [Error Location]: Model: 'MyModel', Field: 'number'
生成器提供了准确的位置,出错之处和出错地点. 在有上百个模型和上百个自定义验证字符串的大棱镜图案中,这可以帮助.
Wrong validator
如果您使用验证符, 生成器会丢出错误 .min 在错误的校验键上.
model MyModel {
number Int /// @zod.number.min(3) -> invalid - `min` can not be used on `number`
}
以上例子将产生以下错误:
[@zod generator error]: Validator 'min' is not valid for type 'Int'. [Error Location]: Model: 'MyModel', Field: 'number'.
Typo Errors
如果您的校验字符串中包含打字符, 如
model MyModel {
string String /// @zod.string.min(3, { mussage: 'Must be at least 3 characters' })
}
生成器会投出以下错误:
[@zod generator error]: Could not match validator 'min' with validatorPattern
'.min(3, { mussage: 'Must be at least 3 characters' })'. Please check for typos! [Error Location]: Model: 'MyModel', Field: 'string'.
命名 Zod 计划
Zod 类型以生成的棱镜类型命名,并附有一个附件 "Schema" 绳子。 你只需要在棱镜函数上徘徊 你知道要导入哪种类型 这对Trpc v.10来说是这样的:
import {
UserFindFirstArgsSchema,
UserFindManyArgsSchema,
UserFindUniqueArgsSchema,
} from './prisma/zod'
const appRouter = t.router({
findManyUser: t.procedure.input(UserFindManyArgsSchema).query(({ input }) => {
return prisma.user.findMany(input)
}),
findUniqueUser: t.procedure
.input(UserFindUniqueArgsSchema)
.query(({ input }) => {
return prisma.user.findUnique(input)
}),
findFirstUser: t.procedure
.input(UserFindFirstArgsSchema)
.query(({ input }) => {
return prisma.user.findFirst(input)
}),
})
添加注释
您可以添加 富人评论 以 jsDoc 的形式打印到您的模型和字段.
/// comment line one
/// comment line two
model MyModel {
id Int @id @default(autoincrement())
/// comment before validator @zod.string.min(4).max(10)
/// comment after validator
string String?
}
上述模型将在从丰富的注释中取出验证器并添加到字符串字段时产生以下输出:
/**
* comment line one
* comment line two
*/
export const MyModelSchema = z.object({
id: z.number(),
/**
* comment before validator
* comment after validator
*/
string: z.string().min(4).max(10).nullish(),
})
从注释中取出验证符并添加到字符串中
从 zod-prisma
两者之间有些不同 zod-prisma 财务报告和审定财务报表 zod-prisma-types。 。 。 .
下列章节应帮助您从 zod-prisma 改为 zod-prisma-types。 。 。 .
发电机选项
以下生成器选项来自 zod-prisma 没有以不同方式支持或执行 zod-prisma-types数字 :
relationModel
通过将以下选项传递给生成器,您可以生成包含模型所有关系的图案:
generator zod {
// ... other options
createRelationValuesTypes = true
}
见 createRelationValuesTypes 更多信息.
modelCase
该型号的外壳被固定在 prisma schema 而不能被改变。 这种方式,模型名称与混合外壳像 MYModel 生成时将按预期工作 inputTypes, (中文(简体) ), enums, (中文(简体) ), argTypes等 (中文(简体) ).
modelSuffix
模型后缀在 zod-prisma-types 固定为 Schema 而不能被改变.
useDecimalJs
zod-prisma-types 不支持 decimal.js 但使用棱镜提供的十进制执行来验证十进制类型。 见 小数 更多信息.
imports
截至版本 2.0.0 进口 zod-prisma-types 对模型定义有丰富的评论。 见 自定义导入 更多信息.
prismaJsonNullability
虚无 zod-prisma-types 处理不同。 见 Json 无效值 更多信息.
扩展 Zod 字段
zod-prisma 允许您使用自定义验证符扩展 Zod 字段。 这也可以 zod-prisma-types 编辑 @zod.[key].[validator] 语法. 不同的语法用于检查在特定棱镜类型上是否可以使用验证符. 见 字段验证器 更多信息.
// zod-prisma
model MyModel {
string String /// @zod.min(3) -> valid - `string` can be used on `String`
number Number /// @zod.min(3) -> valid - throws error only at runtime
}
//zod-prisma-types
model MyModel {
string String /// @zod.string.min(3) -> valid - `string` can be used on `String`
number Number /// @zod.string.min(3) -> invalid - throws error during generation
}
导入助手
您可以在生成器中导入自定义助手 。 请参看关于 自定义进口 更多信息.