angel-manager
Version:
<p align="center"> <img src="angel-manager.webp" alt="Angel Manager" width="300"> </p>
312 lines (235 loc) • 14.6 kB
Markdown
<p align="center">
<img src="angel-manager.webp" alt="Angel Manager" width="300">
</p>
<h1 align="center">Angel Manager</h1>
**Angel Manager** é um gerenciador de arquitetura baseado em templates via CLI para **Node.js**. Totalmente **customizável** e **independente de framework**, esta ferramenta facilita a implementação e manutenção de arquiteturas de software web, automatizando a geração de código e padronizando convenções tanto no frontend quanto no backend. Ideal para desenvolvedores que buscam modularizar e otimizar seu fluxo de trabalho em Node.js a partir de modelagem e geração de código.
## Índice
- [Índice](#índice)
- [Instalação](#instalação)
- [Configuração](#configuração)
- [Uso](#uso)
- [Reutilização](#reutilização)
- [Diretório scaffolding](#diretório-scaffolding)
- [Criando um novo módulo](#criando-um-novo-módulo)
- [Construindo um Template](#construindo-um-template)
- [Exemplo de Template](#exemplo-de-template)
- [Construção do Design-Time Input](#construção-do-design-time-input)
- [Tabela de Tipos](#tabela-de-tipos)
- [Método `run`](#método-run)
- [Método `renderTemplate`](#método-rendertemplate)
- [Método `includeRelated`](#método-includerelated)
- [angel-managerrc.json](#angel-managerrcjson)
- [Contribuições](#contribuições)
---
## Instalação
Instale o Angel Manager como uma dependência de desenvolvimento no seu projeto:
```bash
npm install angel-manager --save-dev
```
ou
```bash
yarn add -D angel-manager
```
## Configuração
Após a instalação, a utilização da CLI (Linha de Comando) estará disponível através de ```npx angel```. Inicie a estrutura básica para configuração do Angel Manager:
```bash
npx angel init
```
Este comando criará a estrutura de diretórios necessária dentro do diretório src/scaffolding, que inclui os subdiretórios ```architecture``` e ```commands``` para definir templates e comandos customizados.
## Uso
Para listar todos os comandos disponíveis, use:
```bash
npx angel -h
```
## Reutilização
Se você já criou um modelo de arquitetura em outro projeto, pode reutilizá-lo facilmente. Para isso, copie o diretório scaffolding do projeto anterior e cole-o no novo projeto.
Em seguida, utilize o comando:
```bash
npx angel apply
```
Esse comando aplica a estrutura de diretórios modelada em scaffolding/architecture, inicializando automaticamente os diretórios no novo projeto. Dessa forma, você evita configurar manualmente a arquitetura para cada projeto.
Por exemplo, a estrutura modelada:
```bash
scaffolding/
└── architecture/
├── components/
└── views/
├── admin/
└── public/
```
Deve gerar:
```bash
src/
└── components/
└── views/
├── admin/
└── public/
```
## Diretório scaffolding
O diretório **scaffolding** é onde se define o modelo da arquitetura do projeto. Ele contém dois subdiretórios principais:
- ```/architecture```: Este subdiretório armazena os templates que representam a estrutura modular da arquitetura. Deve refletir a organização de diretórios desejada para o projeto. Cada módulo **(como components ou views)** terá seu próprio template.
- ```/commands```: Contém arquivos **TypeScript** que configuram as transformações dos templates. Cada modelo na arquitetura deve ter um arquivo correspondente em ```commands``` para definir as regras de geração e transformação de código. Esses arquivos também servem para mapear os comandos disponíveis na CLI, permitindo que o Angel Manager identifique e execute comandos de geração para cada template.
Por exemplo:
```bash
src/
└── scaffolding/
├── architecture/ # Armazena templates de arquitetura, como components, views, etc.
│ ├── components/
│ │ └── index.liquid
│ └── views/
│ ├── admin/
│ │ └── index.liquid
│ └── public/
│ └── index.liquid
│ └── ... # Outros módulos da arquitetura...
└── commands/ # Define regras de geração e mapeia comandos para cada modelo
├── Components.ts
├── AdminViews.ts
└── PublicViews.ts
```
**Obs.:** Note que os correspondentes ao template de cada módulo leva `OBRIGATORIAMENTE` o nome `index.liquid`.
## Criando um novo módulo
Ao criar um novo módulo, comece construindo o template e armazene-o no diretório correspondente dentro de scaffolding/architecture.
Em seguida, crie um novo arquivo no diretório commands, correspondente ao módulo que está sendo modelado. Para isso, o Angel Manager fornece um comando para inicializar a estrutura base do arquivo ```.ts```, recebendo como argumento o nome do módulo:
```bash
npx angel create:command <commandName>
```
## Construindo um Template
O **Angel Manager** utiliza a **Liquid Engine** para processar os templates criados. Para entender melhor como construir seus templates, consulte a documentação da engine em [Liquid Engine](https://shopify.github.io/liquid/).
Como exemplo, vamos construir o template para o módulo `components` em um projeto que utiliza **React**.
### Exemplo de Template
```bash
src/
└── scaffolding/
└── architecture/
└── components/
└── index.liquid
```
```javascript
import './{{ pascal.componentName }}.css';
interface {{ pascal.componentName }}Props {
/* As propriedades do componente */
requiredProp: string;
optionalProp?: string;
}
function {{ pascal.componentName }}({
requiredProp,
optionalProp = 'Valor Padrão',
}: {{ pascal.componentName }}Props): JSX.Element {
return (
<div className="{{ kebab.componentName }}">
Seu HTML aqui: {requiredProp}, {optionalProp}
</div>
);
}
export default {{ pascal.componentName }};
/**
* @note
* Não se esqueça de listar este novo componente.
* Adicione o seguinte trecho em components/index.ts:
* export { default as {{ pascal.componentName }} } from './{{ pascal.componentName }}/{{ pascal.componentName }}';
*/
```
O **Angel Manager** oferece variações de case para cada argumento, incluindo: camelCase, kebab-case, snake_case e PascalCase. Além disso, cada uma dessas variações possui uma versão plural correspondente.
Por exemplo, para acessar o argumento `componentName` em `PascalCase`, utilizamos `{{ pascal.componentName }}`. Para obter sua versão no **plural e em PascalCase**, usamos `{{ plural.pascal.componentName }}`.
**Importante!!!!:** Este é apenas um exemplo de template. Ele é totalmente customizáel para se ajustar às suas necessidades. A engine de templates não depende de uma linguagem de saída específica. A extensão e o nome do arquivo gerado são definidos no arquivo TypeScript correspondente em commands.
## Construção do Design-Time Input
Ao arquivo de **configuração do modelo**, definido dentro de ```/commands``` chamamos **design-time input**. Durante a construção deste, os desenvolvedores podem personalizar a geração de código de acordo com as necessidades do projeto.
O exemplo a seguir mostra a implementação de um comando que gera um novo componente:
```bash
src/
└── scaffolding/
└── commands/
└── Components.ts
```
```typescript
import {
BaseCommand,
FileConfig,
Arg,
RunnableArgs,
renderTemplate,
} from 'angel-manager';
export default class Components extends BaseCommand {
/**
* O nome do comando, que será utilizado para executá-lo
*/
public commandName = 'make:component';
/**
* Descrição do comando
*/
public description = 'Cria um novo componente';
/**
* Caminho do template Liquid, relativo a scaffolding/architecture
*/
public templatePath = 'components';
/**
* Caminho de destino para o arquivo gerado, relativo a src
*/
public destinationPath = 'components';
public file: FileConfig = {
// Define nome do arquivo gerado
name: { argName: 'componentName', case: 'camel' },
// A extensão do arquivo gerado
extension: 'tsx',
// Se verdadeiro, o código será gerado dentro de um diretório nomeado conforme o arquivo
subDir: true,
};
/**
*
* @returns um array de argumentos representando os parâmetros
* que serão solicitados pela linha de comando e disponibilizados no template
*/
public args(): Arg[] {
return [{ name: 'componentName', type: 'string' }];
}
public async run(args: RunnableArgs): Promise<void> {
try {
await renderTemplate(this, args);
includeRelated(this, args, ['css']);
} catch (error) {
console.error(error);
}
}
}
```
### Tabela de Tipos
| Tipo | Propriedade | Descrição |
| -------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Arg** | `name` | O nome do argumento que será solicitado pela linha de comando. Esse valor é utilizado para referenciar o parâmetro no código. |
| | `type` | O tipo do argumento. Pode ser "number" ou "string", indicando o tipo de dado que será esperado do usuário. |
| **FileConfig** | `name` | Define o nome do arquivo gerado. Pode ser uma string estática ou um objeto que utiliza um dos argumentos solicitados pela CLI e o formato de case (camel, kebab, snake, pascal) desejado. Também pode incluir a opção `plural` para transformar o valor no plural. |
| | `extension` | Define a extensão do arquivo gerado (por exemplo, `.tsx`). |
| | `subDir` | Se verdadeiro, o código será gerado dentro de um diretório com o mesmo nome do arquivo gerado. |
### Método `run`
O método `run` é um método abstrato e assíncrono que executa a lógica do comando. Ele disponibiliza como argumento `args`, que são os parâmetros passados pelo usuário ao executar o comando. Dentro do método, o desenvolvedor tem a liberdade de definir a lógica de execução do comando da maneira que for necessária para o seu caso de uso.
No exemplo fornecido, a principal responsabilidade do método `run` é chamar a função `renderTemplate` e passar a si mesmo (`this`) e os argumentos (`args`) como parâmetros. A função `renderTemplate`, disponibilizada pelo **Angel Manager** será responsável por processar o template Liquid, substituindo os placeholders pelas variáveis definidas nos argumentos, e gerar o código de saída. O método `run` também inclui um bloco `try-catch` para capturar e tratar erros que possam ocorrer durante o processo de execução.
#### Método `renderTemplate`
O método assíncrono `renderTemplate`, disponibilizado pelo **Angel Manager**, é responsável por processar o template através da engine, utilizando os argumentos recebidos e os atributos estáticos. Ele gera o código de saída com base no template Liquid e nas configurações definidas.
| Argumento | Tipo | Descrição |
| --------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `command` | `BaseCommand` | Instância do comando, utilizada para acessar os atributos estáticos do modelo e fornecer o contexto necessário para o processamento. Sendo passada dentro da classe através de ```this``` |
| `args` | `RunnableArgs` | Objeto que contém os argumentos passados ao comando. Ele inclui os parâmetros necessários para gerar o código. |
#### Método `includeRelated`
O método síncrono `includeRelated`, disponibilizado pelo **Angel Manager**, permite a inclusão de arquivos vazios relacionados ao código gerado. Este método é útil quando é necessário criar arquivos complementares, como arquivos de estilo ou testes, no mesmo diretório do código gerado.
| Argumento | Tipo | Descrição |
| --------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `command` | `BaseCommand` | Instância do comando, utilizada para acessar os atributos estáticos do modelo e fornecer o contexto necessário para a inclusão dos arquivos relacionados. |
| `args` | `RunnableArgs` | Objeto contendo os argumentos passados ao comando, utilizado para configurar o comportamento da inclusão. |
| `files` | `string[]` | Array de strings que especifica as extensões dos arquivos relacionados a serem criados. Permite incluir, por exemplo, arquivos de estilo (`.css`) ou de testes (`.test.tsx`) no mesmo diretório do código gerado. |
## angel-managerrc.json
Este é o arquivo de configuração global do Angel Manager. Ele é utilizado para definir valores iniciais (default) para a construção dos modelos.
```json
{
"staticAttributes": {
"extension": {
"defaultValue": "tsx"
},
"subDir": {
"defaultValue": true
}
}
}
```
## Contribuições
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues, enviar pull requests ou sugerir melhorias para a documentação.