返回
从 0 实现 Nest Entity Provider CLI
前端
2024-02-20 18:18:22
前言
在 Nest.js 中,Entity Provider 是一种用来生成实体模型的工具。它可以帮助我们快速创建和管理实体模型,从而提高开发效率。然而,默认情况下,Nest.js 并没有提供一个 CLI 工具来方便我们使用 Entity Provider。因此,我们需要自己动手实现一个。
实现步骤
1. 创建项目
首先,我们需要创建一个 Nest.js 项目。我们可以使用以下命令来完成:
nest new nest-entity-provider-cli
2. 安装依赖项
接下来,我们需要安装一些必要的依赖项。我们可以使用以下命令来完成:
npm install --save @nestjs/cli @nestjs/common @nestjs/typeorm handlebars babel-cli @babel/core @babel/preset-typescript
3. 创建 CLI 命令
现在,我们可以开始创建 CLI 命令了。在项目根目录下创建一个名为 src/commands/entity-provider.command.ts
的文件,并添加以下代码:
import { Injectable } from '@nestjs/common';
import { Command, Option } from '@nestjs/cli';
import * as handlebars from 'handlebars';
import * as fs from 'fs';
import * as path from 'path';
import * as babel from '@babel/core';
@Injectable()
export class EntityProviderCommand {
@Option({
name: 'name',
description: 'The name of the entity.',
})
name: string;
@Command({
command: 'entity:provider',
description: 'Generate a provider for a given entity.',
})
async generateProvider() {
const template = fs.readFileSync(path.join(__dirname, 'templates/provider.hbs')).toString();
const compiled = handlebars.compile(template);
const result = compiled({ name: this.name });
const transformed = await babel.transformAsync(result, {
presets: ['@babel/preset-typescript'],
});
fs.writeFileSync(path.join(process.cwd(), `${this.name}.provider.ts`), transformed.code);
console.log(`Provider for ${this.name} generated successfully.`);
}
}
4. 创建模版
接下来,我们需要创建一个模版。在项目根目录下创建一个名为 src/commands/templates/provider.hbs
的文件,并添加以下代码:
import { Injectable } from '@nestjs/common';
import { EntityRepository } from 'typeorm';
@Injectable()
export class {{name}}Provider {
constructor(
@InjectRepository({{name}})
private readonly {{name}}Repository: EntityRepository<{{name}}>
) {}
async findAll(): Promise<{{name}}>[] {
return this.{{name}}Repository.find();
}
async findOne(id: string): Promise<{{name}}> {
return this.{{name}}Repository.findOne(id);
}
async create(data: Partial<{{name}}>): Promise<{{name}}> {
const {{name}} = this.{{name}}Repository.create(data);
return this.{{name}}Repository.save({{name}});
}
async update(id: string, data: Partial<{{name}}>): Promise<{{name}}> {
const {{name}} = await this.{{name}}Repository.findOne(id);
Object.assign({{name}}, data);
return this.{{name}}Repository.save({{name}});
}
async delete(id: string): Promise<void> {
await this.{{name}}Repository.delete(id);
}
}
5. 运行 CLI 命令
现在,我们就可以运行 CLI 命令了。在项目根目录下,运行以下命令:
nest run entity:provider --name=User
这将生成一个名为 User.provider.ts
的文件。
总结
通过以上步骤,我们就实现了一个简易的 Nest Entity Provider CLI。我们可以使用这个 CLI 命令来快速生成 Entity Provider 模版,从而提高开发效率。