Prisma 发电机 NestJS 数字交换台
这是什么?
生成 ConnectDTO, (中文(简体) ), CreateDTO, (中文(简体) ), UpdateDTO, (中文(简体) ), DTO,以及 Entity 在您的 Prisma Schema 中为模型设置课。 如果您想要发挥杠杆作用, 这会很有用 打开API 在你身边 网点JS 应用程序 - 但也帮助 GraphQL 资源 。 网点JS Swagger 需要输入参数 : 要通过类描述的控制器 因为它能利用 TypeScript 所排放的元数据 Reflection 为 OpenAPI 光谱生成模型/组件。 对于控制器方法上的反应模型/组件,它也是这样.
这些课也可以与内置 验证 财务报告和审定财务报表 序列化。 。 。 .
这是叉子 @vigardit/prisma-generator-nestjs-dto (英语) 并添加多个特性:
- 增强字段,并增加计划信息,例如描述,以生成一个
@ApiProperty()装饰( 见 Schema 对象说明(中文(简体) ) - 可选择添加 校验装饰
- 支持复合类型
- 带有额外旗帜的控制输出格式
flatResourceStructure, (中文(简体) ),noDependencies,以及outputType - 可选的更美的自动格式输出
见 变化 所有改进和改变.
用法吗?
npm install --save-dev @brakebein/prisma-generator-nestjs-dto
generator nestjsDto {
provider = "prisma-generator-nestjs-dto"
output = "../src/generated/nestjs-dto"
prismaClientImportPath = ""
outputToNestJsResourceStructure = "false"
flatResourceStructure = "false"
exportRelationModifierClasses = "true"
reExport = "false"
generateFileTypes = "all"
createDtoPrefix = "Create"
updateDtoPrefix = "Update"
dtoSuffix = "Dto"
entityPrefix = ""
entitySuffix = ""
classValidation = "false"
fileNamingStyle = "camel"
noDependencies = "false"
outputType = "class"
definiteAssignmentAssertion = "false"
requiredResponseApiProperty = "true"
jsdoc = "false"
prettier = "false"
wrapRelationsAsType = "false"
showDefaultValues = "false"
}
参数
所有参数都是可选的.
| 参数=默认值 | 说明 |
|---|---|
output = "../src/generated/nestjs-dto" | 相对于您的输出路径 schema.prisma 文件 |
prismaClientImportPath = "" | 覆盖 Prisma 客户端的导入路径 。 默认为任一 @prisma/client 或基于生成器客户端输出配置的相对路径(参见 73号) (中文(简体) ). |
outputToNestJsResourceStructure = "false" | 写入 dtos 和 entities 改为与 NestJS CRUD 生成器。资源模块名称来源于 schema.prisma |
flatResourceStructure = "false" | 若为 outputToNestJsResourceStructure 实值 true,子文件夹 dtos 和 entities 在资源文件夹中创建。 设为 true 将平整等级. |
exportRelationModifierClasses = "true" | 是否应该输出为DTO外地关系业务而生成的额外类别? |
reExport = "false" | 是否应该为每个文件夹创建索引 ? |
generateFileTypes = "all" | all: 生成 DTO 和实体文件, dto: 只生成 DTO 文件, entity: 只生成实体文件( 无法结合复杂类型) |
createDtoPrefix = "Create" | 词组到前缀 CreateDTO 分类 |
updateDtoPrefix = "Update" | 词组到前缀 UpdateDTO 分类 |
dtoSuffix = "Dto" | 后缀 CreateDTO 财务报告和审定财务报表 UpdateDTO 分类 |
entityPrefix = "" | 词组到前缀 Entity 分类 |
entitySuffix = "" | 后缀 Entity 分类 |
fileNamingStyle = "camel" | 如何命名生成的文件 。 有效的选择是 "camel", (中文(简体) ), "pascal", (中文(简体) ), "kebab" 财务报告和审定财务报表 "snake"。 。 。 . |
classValidation = "false" | 从 class-validator与 noDependencies = "true" 财务报告和审定财务报表 outputType = "interface"。 。 。 . |
noDependencies = "false" | 任何针对雀巢JS和Prisma的进口和装饰被省略,因此没有提及外部依赖。 如果您想要为前端生成适当的 DTO , 则此选项是有用的 . |
outputType = "class" | 输出 DTO 为 class 或作为 interface。 。 。 . interface 只能用于为前端生成 DTO. |
definiteAssignmentAssertion = "false" | 添加明确的转让断言操作员 ! ,如果 strict 和(或) strictPropertyInitialization 设定 true 在您的tsconfig。 强森的 compilerOptions。 。 。 . |
requiredResponseApiProperty = "true" | 若为 false,添加 @ApiRequired({ required: false }) 以响应 DTO 属性。 否则,使用 required 默认总是 true 除非字段是可选的. |
jsdoc = "false" | 添加基本的 JSDoc 部分,包含描述和默认值. |
prettier = "false" | 将输出文件固定为更漂亮的文件 . |
wrapRelationsAsType = "false" | 若为 true,导入关系作为解决与SWC的循环参考问题的类型(见 39号) (中文(简体) ). |
showDefaultValues = "false" | 若为 true,使字段与 @default 默认可见属性,而不是使用 @DtoCreateOptional 财务报告和审定财务报表 @DtoUpdateOptional 每次(见 51号) (中文(简体) ). |
说明
说明提供了更多信息, 帮助生成者理解您的意图 。 它们是作为 三相斜线评论 在您的 Prisma Schema 中的田间节点。 您可以对同一字段应用多条注释 .
model Post {
/// @DtoCreateOptional
/// @DtoUpdateHidden
createdAt DateTime @default(now())
/// @DtoOverrideType(DurationLike, luxon)
timeUntilExpires Json?
}
| 注释 | 说明 |
|---|---|
@DtoReadOnly | 删除字段 CreateDTO 财务报告和审定财务报表 UpdateDTO |
@DtoCreateHidden | 删除字段 CreateDTO |
@DtoUpdateHidden | 删除字段 UpdateDTO |
@DtoEntityHidden | 删除字段 Entity |
@DtoConnectHidden | 删除字段 ConnectDto (适用于 @id 财务报告和审定财务报表 @unique 字段) |
@DtoApiHidden | 添加 @ApiHideProperty 在文档中隐藏字段的装饰器, 类校验未受影响 |
@DtoCreateOptional | 添加字段 可选择 改为 CreateDTO - 用于本可省略的字段(例如:. @id, (中文(简体) ), @updatedAt(中文(简体) ) |
@DtoCreateRequired | 标记字段 所需经费 内 CreateDTO 否则是可选的——也添加了否则会被省略的字段(例如:. @id, (中文(简体) ), @updatedAt(中文(简体) ) |
@DtoUpdateOptional | 添加字段 可选择 改为 UpdateDTO - 用于本可省略的字段(例如:. @id, (中文(简体) ), @updatedAt(中文(简体) ) |
@DtoUpdateRequired | 标记字段 所需经费 内 UpdateDTO 否则是可选的——也添加了否则会被省略的字段(例如:. @id, (中文(简体) ), @updatedAt(中文(简体) ) |
@DtoRelationRequired | 标记关系 所需经费 内 Entity 尽管在PrismaSchema中它是可选的 - 在您不想要时有用( SQL) ON DELETE CASCADE 行为 - 但您的逻辑数据计划视此关系为必要( )说明: 一次过时 优惠行动 释放和稳定) |
@DtoRelationCanCreateOnCreate | 添加 创建 选项 CreateDTO - 允许创建相关模式实例时有用 |
@DtoRelationCanConnectOnCreate | 添加 连接 选项 CreateDTO - 当您想要/需要连接到已有相关实例时有用 |
@DtoRelationCanCreateOnUpdate | 添加 创建 选项 UpdateDTO - 允许创建相关模式实例时有用 |
@DtoRelationCanConnectOnUpdate | 添加 连接 选项 UpdateDTO - 当您想要/需要连接到已有相关实例时有用 |
@DtoRelationCanUpdateOnUpdate | 添加 更新 选项 UpdateDTO - 当您想要/需要更新现有相关实例时有用, 仅适用于“ 一对一” 关系 |
@DtoRelationCanDisconnectOnUpdate | 添加 断开 选项 UpdateDTO - 当您想要/需要断开已有相关实例时有用 |
@DtoRelationIncludeId | 包含因其他原因被省略的关系字段的ID(使用代替 CanCreate编号 :CanConnect 说明,如果你只是想通过 IDs) |
@DtoTypeFullUpdate | 在生成时 UpdateDTO,使用 CreateDTO 组合类型,以强制完全替换旧值(见 2号(中文(简体) ) |
@DtoOverrideType(...) | 在所有生成的实体中,强制为这个领域提供某种类型。 如果需要将Json 字段投放到读取/写入时特别有用 。 注意,您必须提供至少一个参数,并且可以在 (...) 使用此注释 - 第一种是用于此字段的要强制的类型名称, 第二和第三可以用于添加一个 import 用于实体文件顶端的该类型。 例如:
|
@DtoOverrideApiPropertyType(...) | 与 @DtoOverrideType 不过 @ApiProperty() type 属性 |
@DtoCreateValidateIf(...) | 添加 @ValidateIf(...) 字段的装饰符 CreateDTO (计: 条件验证 (按等级验证) |
@DtoUpdateValidateIf(...) | 添加 @ValidateIf(...) 字段的装饰符 UpdateDTO (计: 条件验证 (按等级验证) |
Schema 对象说明
与 @nestjs/swagger,您可以从代码中生成 API 规格.
路由,请求机构,查询参数等都附有特制装饰.
属性可以附加注释 @ApiProperty() 添加 schema 对象信息的装饰符 .
运行时将部分添加,然后包括 type, (中文(简体) ), nullable等 (中文(简体) ).
但需要人工添加描述等补充信息.
如果使用这样的生成器, 任何自定义 @ApiProperty() 在更新DTO时,注释将被推翻.
添加前缀的 schema 属性 @ 改为上页的评论部分.
目前,支持以下计划属性:
descriptionminimummaximumexclusiveMinimumexclusiveMaximumminLengthmaxLengthminItemsmaxItemsexample
此外,还推断和说明特殊数据类型:
Int: { type: 'integer', format: 'int32' }BigInt: { type: 'integer', format: 'int64' }Float: { type: 'number', format: 'float' }Decimal: { type: 'number', format: 'double' }DateTime: { type: 'string', format: 'date-time' }
示例
使用 @description 财务报告和审定财务报表 @minimum 标记
/// @description Number of reviews
/// @minimum 9
reviewCount Int @default(0)
将生成 @ApiProperty() 装饰器 description 财务报告和审定财务报表 minimum 财产,以及 type 财务报告和审定财务报表 format 以指定数据类型.
@ApiProperty({
description: 'Number of reviews',
minimum: 9,
type: 'integer',
format: 'int32',
})
reviewCount: number;
默认值在 CreateDTO 财务报告和审定财务报表 UpdateDTO。 。 。 .
然而,一个领域有一个 @default() 属性默认隐藏于 CreateDTO 财务报告和审定财务报表 UpdateDTO, (中文(简体) ),
因此,需要 @DtoCreateOptional 和(或) @DtoUpdateOptional 将在场.
校验装饰
若为 classValidation = "true",生成器将会从 类验证器 改为每个字段 CreateDTO 财务报告和审定财务报表 UpdateDTO 然后可以与雀巢JS结合使用 ValidationPipe (见 NestJS 自动验证) (中文(简体) ).
一些装饰会从字段的属性推断出来.
如果字段是可选的,将添加 @IsOptional(),否则 @IsNotEmpty()。 。 。 .
如果字段是一个列表, 它会添加 @IsArray()。 。 。 .
从字段类型推断出类型验证符 :
String→@IsString()Boolean→@IsBoolean()Int→@IsInt()BigInt→@IsInt()Float:→@IsNumber()Decimal:→@IsDecimal()DateTime→@IsDateString()
其余 校验装饰 可在字段上方的评论/文档部分中添加. 如果不传递一个值,则可以省略括号.
示例
普里斯马斯克马
/// @Contains('Product')
name String @db.VarChar(255)
reviewCount Int @default(0)
/// @ArrayNotEmpty
tags String[]
score Float?
生成输出
@IsNotEmpty()
@IsString()
@Contains('Product')
name: string;
@IsOptional()
@IsInt()
reviewCount?: number;
@IsNotEmpty()
@IsArray()
@ArrayNotEmpty()
tags: string[];
@IsOptional()
@IsNumber()
score?: number;
示例
普里斯马斯克马
generator nestjsDto {
provider = "prisma-generator-nestjs-dto"
output = "../src"
outputToNestJsResourceStructure = "true"
}
model Question {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
/// @DtoReadOnly
createdAt DateTime @default(now())
/// @DtoRelationRequired
createdBy User? @relation("CreatedQuestions", fields: [createdById], references: [id])
createdById String? @db.Uuid
updatedAt DateTime @updatedAt
/// @DtoRelationRequired
updatedBy User? @relation("UpdatedQuestions", fields: [updatedById], references: [id])
updatedById String? @db.Uuid
/// @DtoRelationRequired
/// @DtoRelationCanConnectOnCreate
category Category? @relation(fields: [categoryId], references: [id])
categoryId String? @db.Uuid
/// @DtoCreateOptional
/// @DtoRelationCanCreateOnCreate
/// @DtoRelationCanConnectOnCreate
/// @DtoRelationCanCreateOnUpdate
/// @DtoRelationCanConnectOnUpdate
tags Tag[]
title String
content String
responses Response[]
}
生成结果
// src/question/dto/connect-question.dto.ts
export class ConnectQuestionDto {
id: string;
}
// src/question/dto/create-question.dto.ts
import { ApiExtraModels } from '@nestjs/swagger';
import { ConnectCategoryDto } from '../../category/dto/connect-category.dto';
import { CreateTagDto } from '../../tag/dto/create-tag.dto';
import { ConnectTagDto } from '../../tag/dto/connect-tag.dto';
export class CreateQuestionCategoryRelationInputDto {
connect: ConnectCategoryDto;
}
export class CreateQuestionTagsRelationInputDto {
create?: CreateTagDto[];
connect?: ConnectTagDto[];
}
@ApiExtraModels(
ConnectCategoryDto,
CreateQuestionCategoryRelationInputDto,
CreateTagDto,
ConnectTagDto,
CreateQuestionTagsRelationInputDto,
)
export class CreateQuestionDto {
category: CreateQuestionCategoryRelationInputDto;
tags?: CreateQuestionTagsRelationInputDto;
title: string;
content: string;
}
// src/question/dto/update-question.dto.ts
import { ApiExtraModels } from '@nestjs/swagger';
import { CreateTagDto } from '../../tag/dto/create-tag.dto';
import { ConnectTagDto } from '../../tag/dto/connect-tag.dto';
export class UpdateQuestionTagsRelationInputDto {
create?: CreateTagDto[];
connect?: ConnectTagDto[];
}
@ApiExtraModels(CreateTagDto, ConnectTagDto, UpdateQuestionTagsRelationInputDto)
export class UpdateQuestionDto {
tags?: UpdateQuestionTagsRelationInputDto;
title?: string;
content?: string;
}
// src/question/entities/question.entity.ts
import { User } from '../../user/entities/user.entity';
import { Category } from '../../category/entities/category.entity';
import { Tag } from '../../tag/entities/tag.entity';
import { Response } from '../../response/entities/response.entity';
export class Question {
id: string;
createdAt: Date;
createdBy?: User;
createdById: string;
updatedAt: Date;
updatedBy?: User;
updatedById: string;
category?: Category;
categoryId: string;
tags?: Tag[];
title: string;
content: string;
responses?: Response[];
}
原则
通常我们从 DMMF.Field 提供的资料 @prisma/generator-helper由于有些情况并不十分清楚,我们还要检查是否有其他 说明 (或 decorators在田间 documentation (这是任何作为 三相斜线评论 在你的田间 prisma.schema) (中文(简体) ).
起初,我们想要 DTO 类改为 implement Prisma.<ModelName><(Create|Update)>Input 但结果却与 所需经费 关系字段.
连接DTO
这种DTO代表了在试图从外部(如REST API消费者)期望得到的输入数据的结构 connect 通过关系字段到模型.
A 类 Model编号 ConnectDTO 类由独一无二的列表组成 isId 财务报告和审定财务报表 isUnique 斯伽罗地. 如果 ConnectDTO 类别有完全一个财产,财产按要求标出。 如果有多个属性,所有属性都是可选的(因为设置其中的一个属性已经足以进行独特的查询) - 但是,您必须指定至少一个属性 .
ConnectDTOs 用于关系字段 CreateDTOs 和 UpdateDTO编号.
创建 DTO
这种DTO代表了在试图从外部(如REST API消费者)期望得到的输入数据的结构 create 新实例 Model。 。 。 .
通常,对数据库计划的要求与我们希望允许用户做的事情不同.
举例来说(这就是这个生成器所表达的观点),我们认为关系平面字段不应该被用户曝光,因为 create, (中文(简体) ), update,或 delete 活动(在PrismaClient中生成的TypeScript类型也排除这些字段)。 但是,如果您的计划定义了必要的关系,如果没有关系数据,创建该模型的实体将变得相当困难.
在某些情况下,您可以从上下文中获取相关实例的信息(例如,剩余端点上的HTTP路径) /api/post/:postid/comment 创建 Comment (a) 关于 Post) (中文(简体) ). 对于其他案件,我们掌握了
@DtoRelationCanCreateOnCreate@DtoRelationCanConnectOnCreate@DtoRelationCanCreateOnUpdate@DtoRelationCanConnectOnUpdate
说明 生成相应的输入属性 CreateDTO 财务报告和审定财务报表 UpdateDTO (可选择的或需要的----取决于关系的性质).
当生成一个 Model编号 CreateDTO class, 符合下列任何条件的字段被省略(命令事项:
isReadOnlyOR 附加说明@DtoReadOnly(单位:千美元)说明: 这显然包括关系平板字段)- 字段代表关系( y)
field.kind === 'object',不附加注释@DtoRelationCanCreateOnCreate或者说@DtoRelationCanConnectOnCreate - 字段为 a 关系平面
- 字段没有附加注释
@DtoCreateOptional和
更新DTO
当生成一个 Model编号 UpdateDTO class, 符合下列任何条件的字段被省略(命令事项:
- 字段附加注释
@DtoUpdateOptional isReadOnlyOR 附加说明@DtoReadOnly(单位:千美元)说明: 这显然包括关系平板字段)isId(id字段不应由用户更新)- 字段代表关系( y)
field.kind === 'object',不附加注释@DtoRelationCanCreateOnUpdate或者说@DtoRelationCanConnectOnUpdate - 字段为 a 关系平面
- 字段没有附加注释
@DtoUpdateOptional和
实体
当生成一个 Model编号 Entity 类别,仅附加注释的字段 @DtoEntityHidden 被删除.
其他所有领域都只被操控 isRequired 财务报告和审定财务报表 isNullable 旗帜.
默认情况下,一个实体的每个平面字段都是 required 意思是它没有获得 TypeScript “ 可选成员旗帜 ” ? 旁边是名字 PrismaSchema 中标为可选字段的字段被视为 nullable - 意思是他们的TypeScript类型是: field.type 财务报告和审定财务报表 null (例如:. string | null) (中文(简体) ).
关系和 关系平面 字段受到不同的对待。 如果你不具体的话 include a 在您的查询中,这些字段将不存在.
- 每个关系字段总是可选的(
isRequired = false(中文(简体) ) - 关系无效,除非
- 关系字段为一对多或多对多(即列表)类型(如果找不到相關相關紀錄会返回空陣列)
- 该关系最初按要求标出(
isRequired = true(中文(简体) ) - 关系字段
@DtoRelationRequired(当你在 PrismaSchema 中将一个关系标为可选关系时这样做,因为你不希望(SQL))ON DELETE CASCADE行为 - 但你的逻辑数据方案视此关系为必要)
- 默认值不添加到
@ApiProperty()装饰
数字
平原上 DTO 类几乎与 Entity ,区别是所有关系字段被省略.
如果您的回应是没有任何(可选的)关系的平庸实体,则此反应是有用的 .
许可证
所有文件均在 Apache 许可证 2.0。 。 。 .