返回

从 0 实现 Nest Entity Provider CLI

前端

前言

在 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 模版,从而提高开发效率。