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.
- package/README.md +145 -2
- package/bin/index.js +177 -99
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,2 +1,145 @@
|
|
|
1
|
-
#
|
|
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
|
-
//
|
|
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
|
-
<
|
|
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-
|
|
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
|
-
<
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
//
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
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'),
|
|
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
|
-
|
|
239
|
-
|
|
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
|
-
|
|
251
|
-
|
|
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
|
-
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
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
|
-
|
|
268
|
-
|
|
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
|
-
|
|
272
|
-
});
|
|
350
|
+
iniciar();
|