Geração dinâmica de arquivos com Plop.js
Tags: javascript, node, mongodb, beginners
Published: 2023-01-20 14:27:32


O plop é uma ferramenta incrível para gerar arquivos dinamicamente em projetos de desenvolvimento. E no meu curso de NodeJS, CrazyStack, eu usei essa ferramenta de forma estratégica para aumentar a produtividade e organização do código.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fyur954kyrim14gdyj5j.png)

## Explica melhor isso aí, como funciona esse plop?
Plop é o que eu gosto de chamar de "micro-gerador de estrutura". Chamo assim porque é uma pequena ferramenta que oferece uma maneira simples de gerar código ou qualquer outro tipo de arquivo de texto plano de forma consistente. Sabe quando estamos brincando de montar coisas com peças de LEGO? Às vezes, queremos fazer algo novo, mas não sabemos exatamente como começar, ou não lembramos onde estão as peças certas. É como quando queremos fazer um carro novo, mas não sabemos onde estão as rodas e as janelas na caixa de LEGO.

O Plop é como um amiguinho que nos ajuda a fazer coisas novas de uma maneira muito fácil! Ele é como um guia que nos mostra onde estão as peças certas para criar coisas diferentes. Então, quando queremos fazer um novo carrinho, por exemplo, é só pedir ajuda ao Plop! Ele nos dá todas as peças certas, como se fosse mágica, e podemos começar a construir imediatamente.

Ao utilizar o plop, conseguimos automatizar a criação de arquivos comuns em nossos projetos, como controllers, models e rotas. Isso significa menos tempo gasto criando esses arquivos manualmente e mais tempo para se concentrar em desenvolver as funcionalidades do sistema.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mghwr6d33r3gj25lql9k.png)

Além disso, o plop também nos permite criar modelos de arquivos, ou templates, que podem ser reutilizados em outros projetos. Isso garante uma estrutura consistente e organizada em todos os nossos projetos, tornando mais fácil de entender e manter.
Outra vantagem de utilizar o plop é que ele permite a criação de arquivos com base em respostas a perguntas pré-definidas, como nome de arquivo e estrutura de pasta. Isso garante que os arquivos criados sejam sempre nomeados e organizados de forma correta, evitando erros e facilitando a manutenção do código.

```typescript
export type {{pascalCase name}}Data = {
    _id?: string;
    createdById: string;
    name: string;
    active?: boolean;
    createdAt?: Date;
    updatedAt?: Date;
};

export type {{pascalCase name}}Paginated = {
    {{camelCase name}}s: {{pascalCase name}}Data[];
    total: number;
};

export class {{pascalCase name}}Entity {
    createdById: string;
    name: string;
    active?: boolean;
    createdAt?: Date;
    updatedAt?: Date;
    constructor(data: {{pascalCase name}}Data) {
        this.createdById = data.createdById;
        this.name = data.name;
        this.active = false;
        this.createdAt = new Date();
        this.updatedAt = new Date();
    }
}
```

Esse é um exemplo de template pra gerar entidades, nele eu coloco campos que quase sempre aparecem na entidade de domínio como nome, data de criação, etc.
Eaí eu configuro a criação no plopfile.js da seguinte forma:

```typescript
module.exports = function (plop) {
  plop.setGenerator("entities", {
    description: "Create a new entity",
    prompts: [{ type: "input", name: "name", message: "What is the name of the entity?" }],
    actions: [...entitiesCreations],
  });
```
E nesse array entitiesCreations eu tenho as ações a serem executadas na criação dos arquivos:

```typescript
const entitiesCreations = [
  {
    type: "add",
    path: "../src/slices/{{camelCase name}}/entities/{{pascalCase name}}Entity.ts",
    templateFile: "./templates/entities/DomainEntity.ts.hbs",
  },
  {
    type: "add",
    path: "../src/slices/{{camelCase name}}/entities/{{pascalCase name}}Entity.spec.ts",
    templateFile: "./templates/entities/DomainEntity.spec.ts.hbs",
  },
  {
    type: "add",
    path: "../src/slices/{{camelCase name}}/entities/index.ts",
    templateFile: "./templates/entities/index.ts.hbs",
  },
];

```
Com isso sempre que eu quiser criar uma entidade nova no meu sistema sem ter que ficar copiando e colocando código (ou criar do zero) eu rodo um comando **_ yarn generate nomedaentidade_** e pronto, ele já gera o arquivo certinho!

No meu curso, CrazyStack, eu ensino como utilizar o plop de forma eficiente e como integrá-lo em projetos NodeJS. Além disso, mostro como criar templates personalizados para atender às necessidades específicas de cada projeto e como utilizar as respostas das perguntas para gerar arquivos de forma automatizada.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d40s2hoxkd42v8t4ymu6.png)

Se você está procurando uma forma de aumentar sua produtividade e organizar o código em seus projetos NodeJS, o plop é uma ferramenta que vale a pena conhecer e utilizar. No meu curso, CrazyStack, eu ensino tudo isso de forma prática e passo a passo. Inscreva-se agora e aumente sua produtividade com o plop!

Foi exatamente por isso que eu criei o bootcamp CrazyStack. Nele eu crio uma aplicação completa de um sistema de agendamentos online de serviços aplicando conceitos avançados como Design Patterns, Clean Vertical Sliced Arch, TDD e DDD além de Testes unitários, e de integração

No primeiro módulo você aprenderá a construir uma API REST Nodejs. Serão criados casos de uso envolvendo regras de negócio complexas como listagem de horários disponíveis, geração de pedidos a partir de agendamentos efetivados, sistema de fidelidade,avaliações dos clientes e mais.


Tudo feito em Typescript e utilizando o banco de dados não relacional MongoDB. São mais de 2 mil testes unitários e de integração que cobre cerca de 90% do código do projeto.

Outro diferencial são os geradores de arquivos que permitem a geração de CRUD dinâmico seguindo uma programação orientada a modelos

Dê profundidade ao seu Typescript a partir de agora. USE O CUPOM SETEMBRODOIDO e ganhe 60% de DESCONTO!! (VÁLIDO ATÉ DIA 30/9/2023)

Viaje nessa loucura!! 


[CLIQUE AQUI](https://crazystack.com.br)


[LINK DO REPOSITÓRIO](https://github.com/gumiranda/CrazyStackNodeJs)