-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
executable file
·161 lines (138 loc) · 4.84 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/usr/bin/env node
import inquirer from "inquirer";
import { exec, spawn } from "child_process";
import path from "path";
import fs from "fs";
// Repositorios de GitHub para cada plantilla
const templatesBackend = {
"Backend Modular para proyectos escalable (Nestjs + TypeORM + AutoMapper + Swagger + DDD + Clean architecture)":
"https://github.com/Luedan/modular_nest_template.git",
"Backend DDD & SOA para proyectos escalable (Nestjs + TypeORM + AutoMapper + Swagger + Clean architecture)":
"https://github.com/Luedan/DDD-SOA-TEMPLATE-NEST.git",
Regresar: "back",
};
const templatesFrontend = {
"Vite Frontend Template (React + TypeScript + TailwindCSS + Mui + Zustand + React Query + Screaming Arch + React i18n (Internacionalización)) ": "https://github.com/Luedan/FRONT_VITE_TEMPLATE.git",
"React Vite Clean Arch (MonoRepo + React + TypeScript + TailwindCSS + Mui + Zustand + React Query + Clean Arch + React i18n (Internacionalización)) ": "https://github.com/Luedan/REACT_CLEAN_ARCH.git",
"React Fast Template (Monorepo + React + TypeScript + TailwindCSS + Mui + Zustand + React Query)": "https://github.com/Luedan/REACT_FAST_TEMPLATE.git",
Regresar: "back",
};
const main = async () => {
const { templateType } = await inquirer.prompt([
{
type: "list",
name: "templateType",
message: "¿Qué tipo de plantilla deseas instalar? 🤔",
choices: ["Plantillas Backend", "Plantillas Frontend"],
},
]);
const { templateChoice } = await inquirer.prompt([
{
type: "list",
name: "templateChoice",
message: "¿Qué plantilla deseas instalar? 🤔",
choices:
templateType === "Plantillas Backend"
? Object.keys(templatesBackend)
: Object.keys(templatesFrontend),
},
]);
if (templateChoice === "Regresar") {
return main().catch(() => {
console.error("Salida inesperada 😢");
process.exit(1);
});
}
const { projectName } = await inquirer.prompt([
{
type: "input",
name: "projectName",
message: "¿Cuál es el nombre de tu proyecto? 📝",
validate: (input) =>
input ? true : "El nombre del proyecto no puede estar vacío.",
},
]);
const { wannaInstallPackages } = await inquirer.prompt([
{
type: "list",
name: "wannaInstallPackages",
message: "¿Deseas instalar las dependencias del proyecto?",
choices: ["Sí ✅", "No ❌"],
},
]);
const destPath = path.join(process.cwd(), projectName);
const gitDir = path.join(destPath, ".git");
const templates = templateType === "Plantillas Backend" ? templatesBackend : templatesFrontend;
// Crear la carpeta del proyecto si no existe
if (fs.existsSync(destPath)) {
console.log(
`La carpeta ${projectName} ya existe. Por favor, elige otro nombre.`
);
process.exit(1);
}
console.log("Clonando el repositorio... 🚀");
exec(`git clone ${templates[templateChoice]} ${projectName}`, async (err) => {
if (err) {
console.error(err);
return;
}
if (fs.existsSync(gitDir)) {
// Eliminar la carpeta .git
fs.rmSync(gitDir, { recursive: true, force: true });
// Eliminar los archivos de bloqueo de los gestores de paquetes
exec(
"rm -f package-lock.json yarn.lock pnpm-lock.yaml",
{ cwd: destPath },
(err) => {
if (err) {
console.error(err);
return;
}
}
);
// inicializar git
exec("git init", { cwd: destPath }, (err) => {
if (err) {
console.error(err);
return;
}
});
// Instalar dependencias
if (wannaInstallPackages === "Sí ✅") {
const { packageInstaller } = await inquirer.prompt([
{
type: "list",
name: "packageInstaller",
message: "¿Qué gestor de paquetes deseas utilizar? 📦",
choices: ["npm", "yarn", "pnpm"],
},
]);
console.log("Instalando dependencias... 🚀");
const installCommand = packageInstaller;
const installArgs = ["install"];
const installProcess = spawn(installCommand, installArgs, {
cwd: destPath,
stdio: "inherit",
shell: true,
});
installProcess.on("close", (code) => {
if (code === 0) {
console.log("Dependencias instaladas exitosamente. 🎉");
} else {
console.error(
`El proceso de instalación terminó con el código ${code}`
);
}
});
installProcess.on("error", (err) => {
console.error("Error al instalar las dependencias:", err);
});
}
}
});
console.log(`Template instalado exitosamente en ${projectName} 🎉`);
};
main().catch((err) => {
console.error("Salida inesperada 😢: ", err);
process.exit(1);
});