web-architect-cli 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +145 -2
  2. package/bin/index.js +177 -99
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,2 +1,145 @@
1
- # web-architect-cli
2
-
1
+ # 🏗️ Web Architect CLI
2
+
3
+ O **Web Architect CLI** é uma ferramenta de linha de comando projetada para padronizar e acelerar a criação de interfaces web (especialmente para o ecossistema Sankhya). Com um único comando, você gera uma estrutura completa, configurada com TailwindCSS e um sistema de build automático.
4
+
5
+ ## 📦 Instalação
6
+
7
+ Para utilizar a ferramenta em qualquer lugar do seu computador, instale a versão mais recente globalmente via npm:
8
+
9
+ Bash
10
+
11
+ ```
12
+ npm install -g web-architect-cli@latest
13
+ ```
14
+
15
+ > **Nota:** É necessário ter o [Node.js](https://nodejs.org/) instalado.
16
+
17
+ ---
18
+
19
+ ## 🚀 Como Utilizar
20
+
21
+ ### 1. Criando um Novo Projeto
22
+
23
+ Abra o terminal na pasta onde deseja iniciar o trabalho e execute:
24
+
25
+ Bash
26
+
27
+ ```
28
+ web-arch
29
+ ```
30
+
31
+ O assistente interativo iniciará:
32
+
33
+ 1. Ele pedirá o **nome do projeto** (ex: `painel-metas`).
34
+
35
+ 2. Criará automaticamente toda a estrutura de pastas e arquivos.
36
+
37
+ 3. Instalará as dependências necessárias.
38
+
39
+ ### 2. Fluxo de Desenvolvimento (O "Pulo do Gato")
40
+
41
+ Após criar o projeto, entre na pasta e inicie o modo de desenvolvimento:
42
+
43
+ Bash
44
+
45
+ ```
46
+ cd painel-metas
47
+ npm start
48
+ ```
49
+
50
+ **O que acontece agora?**
51
+
52
+ - O sistema entra em modo **WATCH** (monitoramento).
53
+
54
+ - Qualquer arquivo que você salvar dentro da pasta (HTML, CSS, JS), o script **automaticamente compacta o projeto** em um arquivo `.zip` com o nome da pasta (ex: `painel-metas.zip`).
55
+
56
+ - **Benefício:** Você não precisa zipar manualmente os arquivos toda vez que quiser subir para o ERP/Portal. Basta arrastar o zip gerado.
57
+
58
+ ---
59
+
60
+ ## 💡 Casos de Uso (Workflows)
61
+
62
+ Aqui estão os cenários comuns onde o **Web Architect CLI** brilha:
63
+
64
+ ### Caso A: Início Rápido de Dashboards (HTML/JSP)
65
+
66
+ > *Você precisa criar uma tela customizada para apresentar indicadores.*
67
+
68
+ 1. Rode `web-arch` e nomeie como `dash-financeiro`.
69
+
70
+ 2. O projeto já nasce com `index.jsp` contendo as importações Sankhya (`<snk:load/>`) e `index.html` para testes locais.
71
+
72
+ 3. Edite o `src/views/main.js` ou o HTML.
73
+
74
+ 4. O arquivo `dash-financeiro.zip` é atualizado instantaneamente.
75
+
76
+ 5. Faça o upload do ZIP no "Repositório de Arquivos" do sistema.
77
+
78
+ ### Caso B: Prototipagem com TailwindCSS
79
+
80
+ > *Você quer testar um layout moderno sem configurar Webpack ou PostCSS.*
81
+
82
+ 1. Rode `web-arch`.
83
+
84
+ 2. Vá direto ao HTML e comece a usar classes utilitárias:
85
+
86
+ HTML
87
+
88
+ ```
89
+ <div class="bg-blue-600 text-white p-4 rounded-lg shadow-md">
90
+ Olá, Mundo!
91
+ </div>
92
+ ```
93
+
94
+ 3. O Tailwind já vem injetado e pronto para uso via script (CDN/Local), sem build complexo.
95
+
96
+ ### Caso C: Padronização de Equipe
97
+
98
+ > *Vários desenvolvedores trabalhando em telas diferentes.*
99
+
100
+ Ao usar o comando `web-arch`, todos os projetos seguem a mesma árvore:
101
+
102
+ - `src/controllers/` (Lógica de negócio)
103
+
104
+ - `src/views/` (Manipulação de DOM)
105
+
106
+ - `src/services/` (Chamadas de API)
107
+
108
+ Isso facilita a manutenção cruzada: qualquer desenvolvedor sabe onde encontrar o código.
109
+
110
+ ---
111
+
112
+ ## 📂 Estrutura do Projeto Gerado
113
+
114
+ Plaintext
115
+
116
+ ```
117
+ meu-projeto/
118
+ ├── .git/
119
+ ├── node_modules/
120
+ ├── src/
121
+ │ ├── assets/
122
+ │ │ ├── css/ # Estilos globais
123
+ │ │ ├── js/ # Bibliotecas (Tailwind, etc)
124
+ │ ├── components/ # Fragmentos de UI
125
+ │ ├── controllers/ # Lógica
126
+ │ ├── services/ # Integrações
127
+ │ ├── utils/ # Funções auxiliares
128
+ │ └── main.js # Ponto de entrada JS
129
+ ├── build.js # Script de automação (Zip automático)
130
+ ├── index.html # Para rodar no navegador local
131
+ ├── index.jsp # Para rodar no servidor
132
+ ├── package.json
133
+ └── README.md
134
+ ```
135
+
136
+ ---
137
+
138
+ ## 🛠 Comandos do Projeto (Scripts)
139
+
140
+ Dentro da pasta do projeto criado, você pode usar:
141
+
142
+ | **Comando** | **Ação** |
143
+ | --------------- | --------------------------------------------------- |
144
+ | `npm start` | Inicia o monitoramento. Altera arquivo -> Gera ZIP. |
145
+ | `npm run build` | Gera o ZIP apenas uma vez e encerra. |
package/bin/index.js CHANGED
@@ -9,8 +9,9 @@ const rl = readline.createInterface({
9
9
  output: process.stdout
10
10
  });
11
11
 
12
- // --- 1. DEFINIÇÃO DOS CONTEÚDOS DOS ARQUIVOS ---
13
-
12
+ // ==========================================
13
+ // CONTEÚDOS PARA O MODELO HTML5
14
+ // ==========================================
14
15
  const CONTEUDO_INDEX_JSP = `<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored ="false"%>
15
16
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
16
17
  <%@ page import="java.util.*" %>
@@ -30,45 +31,27 @@ const CONTEUDO_INDEX_JSP = `<%@ page language="java" contentType="text/html; cha
30
31
  <snk:load/>
31
32
  </head>
32
33
  <body>
33
-
34
- <header class="header">
35
-
36
- </header>
37
-
38
- <main class="main">
39
-
40
- </main>
41
-
34
+ <header class="header"></header>
35
+ <main class="main"></main>
42
36
  <script type="module" src="\${BASE_FOLDER}/src/main.js"></script>
43
37
  </body>
44
38
  </html>`;
45
39
 
46
40
  const CONTEUDO_INDEX_HTML = `<!DOCTYPE html>
47
- <html lang="pt-PT">
41
+ <html lang="pt-BR">
48
42
  <head>
49
43
  <meta charset="UTF-8">
50
44
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
51
45
  <title>Meu modelo</title>
52
-
53
46
  <script src="src/assets/js/tailwindcss.js"></script>
54
47
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
55
48
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
56
49
  <link rel="stylesheet" href="./src/assets/css/style.css">
57
-
58
50
  <script type="module" src="https://cdn.jsdelivr.net/npm/@jtandrelevicius/utils-js-library@latest/index.js"></script>
59
51
  <body>
60
-
61
- <header class="header">
62
-
63
- </header>
64
-
65
- <main class="main">
66
-
67
- </main>
68
-
69
-
52
+ <header class="header"></header>
53
+ <main class="main"></main>
70
54
  <script type="module" src="src/main.js"></script>
71
-
72
55
  </body>
73
56
  </html>`;
74
57
 
@@ -139,55 +122,34 @@ if (CONFIG.MODO_AUTOMATICO) {
139
122
  }
140
123
  `;
141
124
 
142
- const CONTEUDO_GITIGNORE = `node_modules/
143
- *.zip
144
- .DS_Store
145
- `;
146
-
125
+ // ==========================================
126
+ // UTILITÁRIOS GERAIS
127
+ // ==========================================
128
+ const CONTEUDO_GITIGNORE_HTML = `node_modules/\n*.zip\n.DS_Store\n`;
129
+ const CONTEUDO_GITIGNORE_GERAL = `*.zip\n.DS_Store\n`;
130
+ const CONTEUDO_GITIGNORE_JAVA = `out/\n.idea/workspace.xml\n.idea/usage.statistics.xml\n*.iws\n.DS_Store\n`;
147
131
  const CONTEUDO_GITATTRIBUTES = `* text=auto`;
148
132
 
149
- // --- 2. FUNÇÕES DO SISTEMA ---
150
-
151
133
  const logPasso = (emoji, msg) => console.log(`${emoji} ${msg}`);
152
134
 
153
135
  function criarPasta(caminho) {
154
136
  if (!fs.existsSync(caminho)) {
155
137
  fs.mkdirSync(caminho, { recursive: true });
156
138
  logPasso('📂', `Pasta criada: ${caminho}`);
157
- } else {
158
- logPasso('⚠️', `Pasta já existe: ${caminho}`);
159
139
  }
160
140
  }
161
141
 
162
142
  function criarArquivo(caminho, conteudo) {
163
143
  fs.writeFileSync(caminho, conteudo);
164
- logPasso('📄', `Arquivo criado: ${caminho}`);
144
+ logPasso('📄', `Arquivo criado: ${path.basename(caminho)}`);
165
145
  }
166
146
 
167
- // --- 3. EXECUÇÃO PRINCIPAL ---
168
-
169
- rl.question('🚀 Digite o nome do projeto: ', (nomeProjeto) => {
170
- if (!nomeProjeto) {
171
- console.log('❌ Nome inválido.');
172
- rl.close();
173
- return;
174
- }
175
-
176
- const raiz = path.join(process.cwd(), nomeProjeto);
177
-
178
- console.log(`\n---------------------------------------------------`);
179
- console.log(`🔨 INICIANDO CRIAÇÃO DO PROJETO: ${nomeProjeto}`);
180
- console.log(`---------------------------------------------------\n`);
181
-
182
- // 1. Criar Pasta Raiz
183
- if (fs.existsSync(raiz)) {
184
- console.log(`❌ A pasta '${nomeProjeto}' já existe.`);
185
- rl.close();
186
- return;
187
- }
188
- criarPasta(raiz);
147
+ // ==========================================
148
+ // FUNÇÕES DE CRIAÇÃO DOS MODELOS
149
+ // ==========================================
189
150
 
190
- // 2. Criar Estrutura de Pastas
151
+ // --- MODELO 1: HTML5 (Web) ---
152
+ function criarProjetoHTML5(raiz, nomeProjeto) {
191
153
  const pastas = [
192
154
  'src/assets/css',
193
155
  'src/assets/img',
@@ -201,72 +163,188 @@ rl.question('🚀 Digite o nome do projeto: ', (nomeProjeto) => {
201
163
 
202
164
  pastas.forEach(p => criarPasta(path.join(raiz, p)));
203
165
 
204
- // 3. Criar Arquivos de Configuração e Raiz
205
166
  criarArquivo(path.join(raiz, 'index.jsp'), CONTEUDO_INDEX_JSP);
206
167
  criarArquivo(path.join(raiz, 'index.html'), CONTEUDO_INDEX_HTML);
207
168
  criarArquivo(path.join(raiz, 'build.js'), CONTEUDO_BUILD_JS);
208
- criarArquivo(path.join(raiz, '.gitignore'), CONTEUDO_GITIGNORE);
169
+ criarArquivo(path.join(raiz, '.gitignore'), CONTEUDO_GITIGNORE_HTML);
209
170
  criarArquivo(path.join(raiz, '.gitattributes'), CONTEUDO_GITATTRIBUTES);
210
- criarArquivo(path.join(raiz, 'README.md'), `# ${nomeProjeto}\n\nProjeto gerado automaticamente.`);
171
+ criarArquivo(path.join(raiz, 'README.md'), `# ${nomeProjeto}\n\nProjeto Web (HTML5/JSP) gerado automaticamente.`);
211
172
 
212
- // 4. Criar Package.json
213
173
  const packageJson = {
214
174
  name: nomeProjeto,
215
175
  version: "1.0.0",
216
176
  description: "",
217
177
  main: "src/main.js",
218
- scripts: {
219
- "build": "node build.js",
220
- "start": "node build.js"
221
- },
178
+ scripts: { "build": "node build.js", "start": "node build.js" },
222
179
  author: "",
223
180
  license: "ISC"
224
181
  };
225
182
  criarArquivo(path.join(raiz, 'package.json'), JSON.stringify(packageJson, null, 2));
226
-
227
- // 5. Criar Arquivos dentro de SRC
228
183
  criarArquivo(path.join(raiz, 'src/main.js'), `console.log('Aplicação iniciada');`);
229
-
230
- // 6. Criar Arquivos dentro de ASSETS (CSS)
231
184
  criarArquivo(path.join(raiz, 'src/assets/css/style.css'), `/* Estilos Globais */\nbody { font-family: 'Inter', sans-serif; }`);
232
-
233
- // --- LÓGICA DE CÓPIA DO TAILWIND ---
185
+
234
186
  const origemTailwind = path.join(__dirname, 'tailwindcss.js');
235
187
  const destinoTailwind = path.join(raiz, 'src/assets/js/tailwindcss.js');
236
-
237
188
  if (fs.existsSync(origemTailwind)) {
238
- try {
239
- fs.copyFileSync(origemTailwind, destinoTailwind);
240
- logPasso('📄', `Arquivo copiado: ${destinoTailwind}`);
241
- } catch (err) {
242
- console.error('❌ Erro ao copiar tailwindcss.js:', err.message);
243
- }
244
- } else {
245
- console.log('⚠️ AVISO: O arquivo "tailwindcss.js" não foi encontrado na mesma pasta deste script.');
246
- console.log(' Ele não foi copiado para o novo projeto.');
189
+ fs.copyFileSync(origemTailwind, destinoTailwind);
190
+ logPasso('📄', `Tailwind copiado.`);
247
191
  }
248
192
 
249
- console.log(`\n---------------------------------------------------`);
250
- console.log(`⚙️ EXECUTANDO CONFIGURAÇÕES DE AMBIENTE`);
251
- console.log(`---------------------------------------------------\n`);
193
+ console.log(`\n⚙️ CONFIGURANDO AMBIENTE WEB...`);
194
+ try {
195
+ logPasso('Git', 'Inicializando repositório...');
196
+ execSync('git init', { cwd: raiz, stdio: 'ignore' });
197
+ logPasso('NPM', 'Instalando dependências...');
198
+ execSync('npm install archiver', { cwd: raiz, stdio: 'ignore' });
199
+ } catch (e) { console.error('Erro na configuração:', e.message); }
200
+ }
201
+
202
+ // --- MODELO 2: PERSONALIZACAO (Banco/Backend) ---
203
+ function criarProjetoPersonalizacao(raiz, nomeProjeto) {
204
+ const pastas = [
205
+ 'doc',
206
+ 'src/Dashboard',
207
+ 'src/Function',
208
+ 'src/Procedure',
209
+ 'src/Relatorio',
210
+ 'src/SQL',
211
+ 'src/Tela',
212
+ 'src/Trigger',
213
+ 'src/View'
214
+ ];
215
+
216
+ pastas.forEach(p => criarPasta(path.join(raiz, p)));
217
+
218
+ criarArquivo(path.join(raiz, '.gitattributes'), CONTEUDO_GITATTRIBUTES);
219
+ criarArquivo(path.join(raiz, '.gitignore'), CONTEUDO_GITIGNORE_GERAL);
220
+ criarArquivo(path.join(raiz, 'README.md'), `# ${nomeProjeto}\n\nProjeto de Personalização (Banco de Dados/PLSQL).\n\n## Estrutura\n- **doc/**: Documentação.\n- **src/**: Scripts de Banco.`);
252
221
 
222
+ console.log(`\n⚙️ CONFIGURANDO AMBIENTE DE PERSONALIZAÇÃO...`);
253
223
  try {
254
- // 7. Inicializar GIT
255
- logPasso('GitHub', '📦 Inicializando repositório Git...');
224
+ logPasso('Git', 'Inicializando repositório...');
256
225
  execSync('git init', { cwd: raiz, stdio: 'inherit' });
226
+ } catch (e) { console.error('Erro no git init:', e.message); }
227
+ }
257
228
 
258
- // 8. Instalar Dependências (Archiver)
259
- logPasso('NPM', ' 📦 Instalando dependência: archiver...');
260
- execSync('npm install archiver', { cwd: raiz, stdio: 'inherit' });
229
+ // --- MODELO 3: JAVA (Estrutura IntelliJ Nativa) ---
230
+ function criarProjetoJava(raiz, nomeProjeto) {
231
+ const nomePacote = nomeProjeto.replace(/-/g, '').toLowerCase();
232
+ const basePath = `src/br/com/sankhya/${nomePacote}`;
233
+
234
+ const pastas = [
235
+ '.idea',
236
+ 'doc',
237
+ 'out',
238
+ `${basePath}/business/agendador`,
239
+ `${basePath}/business/botao`,
240
+ `${basePath}/business/evento`,
241
+ `${basePath}/business/regra`,
242
+ `${basePath}/domain/model`,
243
+ `${basePath}/domain/repository`
244
+ ];
261
245
 
262
- console.log(`\n✅ PROJETO CRIADO COM SUCESSO!\n`);
263
- console.log(`👉 Próximos passos:`);
264
- console.log(` cd ${nomeProjeto}`);
265
- console.log(` npm start (Para rodar o build automático)`);
246
+ pastas.forEach(p => criarPasta(path.join(raiz, p)));
266
247
 
267
- } catch (error) {
268
- console.error("❌ Erro ao executar comandos do sistema:", error.message);
269
- }
248
+ criarArquivo(path.join(raiz, '.gitignore'), CONTEUDO_GITIGNORE_JAVA);
249
+ criarArquivo(path.join(raiz, 'README.md'), `# ${nomeProjeto}\n\nProjeto Java Sankhya (IntelliJ Nativo).`);
250
+
251
+ const modulesXml = `<?xml version="1.0" encoding="UTF-8"?>
252
+ <project version="4">
253
+ <component name="ProjectModuleManager">
254
+ <modules>
255
+ <module fileurl="file://$PROJECT_DIR$/${nomeProjeto}.iml" filepath="$PROJECT_DIR$/${nomeProjeto}.iml" />
256
+ </modules>
257
+ </component>
258
+ </project>`;
259
+ criarArquivo(path.join(raiz, '.idea/modules.xml'), modulesXml);
260
+
261
+ const miscXml = `<?xml version="1.0" encoding="UTF-8"?>
262
+ <project version="4">
263
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
264
+ <output url="file://$PROJECT_DIR$/out" />
265
+ </component>
266
+ </project>`;
267
+ criarArquivo(path.join(raiz, '.idea/misc.xml'), miscXml);
268
+
269
+ const imlContent = `<?xml version="1.0" encoding="UTF-8"?>
270
+ <module type="JAVA_MODULE" version="4">
271
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
272
+ <exclude-output />
273
+ <content url="file://$MODULE_DIR$">
274
+ <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
275
+ </content>
276
+ <orderEntry type="inheritedJdk" />
277
+ <orderEntry type="sourceFolder" forTests="false" />
278
+ <orderEntry type="library" name="libs-java" level="application" />
279
+ </component>
280
+ </module>`;
281
+ criarArquivo(path.join(raiz, `${nomeProjeto}.iml`), imlContent);
282
+
283
+ console.log(`\n⚙️ CONFIGURANDO AMBIENTE JAVA (IntelliJ)...`);
284
+ try {
285
+ logPasso('Git', 'Inicializando repositório...');
286
+ execSync('git init', { cwd: raiz, stdio: 'inherit' });
287
+ console.log(`\n✅ SUCESSO! Abra a pasta '${nomeProjeto}' diretamente no IntelliJ.`);
288
+ console.log(`ℹ️ Certifique-se de que a biblioteca global 'libs-java' esteja configurada no seu IntelliJ.`);
289
+ } catch (e) { console.error(e.message); }
290
+ }
291
+
292
+ // ==========================================
293
+ // MENU PRINCIPAL
294
+ // ==========================================
295
+ function iniciar() {
296
+ console.clear();
297
+ console.log('===================================================');
298
+ console.log(' 🛠️ WEB ARCHITECT CLI - GERADOR 🛠️');
299
+ console.log('===================================================');
300
+ console.log('Selecione o tipo de projeto:');
301
+ console.log(' [1] HTML5 (Web, Tailwind, JSP, Auto-Zip)');
302
+ console.log(' [2] PERSONALIZACAO (SQL, Procedures, Triggers, Views)');
303
+ console.log(' [3] JAVA (IntelliJ, JDK 1.8, libs-java)');
304
+ console.log('===================================================');
305
+
306
+ rl.question('👉 Escolha uma opção (1-3): ', (opcao) => {
307
+
308
+ if (!['1', '2', '3'].includes(opcao.trim())) {
309
+ console.log('❌ Opção inválida.');
310
+ rl.close();
311
+ return;
312
+ }
313
+
314
+ rl.question('🚀 Digite o nome do projeto (ex: meu-projeto): ', (nomeProjeto) => {
315
+ if (!nomeProjeto) {
316
+ console.log('❌ Nome inválido.');
317
+ rl.close();
318
+ return;
319
+ }
320
+
321
+ const raiz = path.join(process.cwd(), nomeProjeto);
322
+ if (fs.existsSync(raiz)) {
323
+ console.log(`❌ A pasta '${nomeProjeto}' já existe.`);
324
+ rl.close();
325
+ return;
326
+ }
327
+
328
+ criarPasta(raiz);
329
+
330
+ switch (opcao.trim()) {
331
+ case '1':
332
+ criarProjetoHTML5(raiz, nomeProjeto);
333
+ console.log(`\n✅ PROJETO WEB CRIADO! Rode 'cd ${nomeProjeto}' e 'npm start'.`);
334
+ break;
335
+ case '2':
336
+ criarProjetoPersonalizacao(raiz, nomeProjeto);
337
+ console.log(`\n✅ PROJETO DE PERSONALIZAÇÃO CRIADO! Rode 'cd ${nomeProjeto}'.`);
338
+ break;
339
+ case '3':
340
+ criarProjetoJava(raiz, nomeProjeto);
341
+ console.log(`\n✅ PROJETO JAVA CRIADO!`);
342
+ break;
343
+ }
344
+
345
+ rl.close();
346
+ });
347
+ });
348
+ }
270
349
 
271
- rl.close();
272
- });
350
+ iniciar();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "web-architect-cli",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {