@icarusmx/creta 1.3.4 → 1.4.0
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/bin/creta.js +8 -1576
- package/codex-refactor.txt +13 -0
- package/lib/builders/LessonBuilder.js +388 -0
- package/lib/builders/MenuBuilder.js +154 -0
- package/lib/builders/ProjectBuilder.js +56 -0
- package/lib/cli/index.js +85 -0
- package/lib/commands/help.js +5 -0
- package/lib/constants/paths.js +9 -0
- package/lib/data/enunciados.js +44 -0
- package/lib/data/lessons/index.js +25 -0
- package/lib/data/lessons/lesson1-system-decomposition.js +251 -0
- package/lib/data/lessons/lesson2-object-requests.js +323 -0
- package/lib/data/lessons/lesson3-only-way.js +354 -0
- package/lib/data/lessons/lesson4-operation-signatures.js +337 -0
- package/lib/data/lessons/lesson5-interface-set.js +346 -0
- package/lib/data/lessons/lesson6-interface-design.js +412 -0
- package/lib/data/lessons/lesson7-object-definition.js +380 -0
- package/lib/data/lessons/sintaxis/terminal-basico.js +50 -0
- package/lib/data/menus.js +43 -0
- package/lib/data/messages.js +28 -0
- package/lib/executors/enunciados-executor.js +73 -0
- package/lib/executors/portfolio-executor.js +167 -0
- package/lib/executors/proyectos-executor.js +23 -0
- package/lib/executors/sintaxis-executor.js +18 -0
- package/lib/templates/LevelModifier.js +287 -0
- package/lib/utils/file-utils.js +18 -0
- package/lib/utils/greeting.js +32 -0
- package/lib/utils/input.js +15 -0
- package/lib/utils/output.js +4 -0
- package/lib/utils/user-state.js +115 -0
- package/package.json +4 -1
- package/refactor.txt +581 -0
- package/test/enunciados.test.js +72 -0
- package/lessons/lesson1-system-decomposition.js +0 -313
- package/lessons/lesson2-object-requests.js +0 -309
- package/lessons/lesson3-only-way.js +0 -324
- package/lessons/lesson4-operation-signatures.js +0 -319
- package/lessons/lesson5-interface-set.js +0 -326
- package/lessons/lesson6-interface-design.js +0 -391
- package/lessons/lesson7-object-definition.js +0 -300
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
export const LESSON_7_OBJECT_DEFINITION = {
|
|
2
|
+
id: 7,
|
|
3
|
+
title: 'LECCIÓN 7: Un objeto es un conjunto de datos y procedimientos que operan sobre esos datos',
|
|
4
|
+
subtitle: 'Enfoque conceptual: Entender qué es un dato, qué es un procedimiento, y por qué están unidos',
|
|
5
|
+
flow: [
|
|
6
|
+
{
|
|
7
|
+
message: '\nPresiona Enter para comenzar...',
|
|
8
|
+
type: 'pause'
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
type: 'clear'
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
lines: [
|
|
15
|
+
'Para entender qué ES un objeto,',
|
|
16
|
+
'primero debemos entender dos conceptos fundamentales:',
|
|
17
|
+
'',
|
|
18
|
+
'1. ¿Qué es un DATO?',
|
|
19
|
+
'2. ¿Qué es un PROCEDIMIENTO?'
|
|
20
|
+
],
|
|
21
|
+
type: 'text'
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
message: '\nPresiona Enter para continuar...',
|
|
25
|
+
type: 'pause'
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
type: 'clear'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
lines: [
|
|
32
|
+
'¿Qué es un DATO?',
|
|
33
|
+
'==================================================',
|
|
34
|
+
'\n🔍 Un dato es información que describe el estado de algo'
|
|
35
|
+
],
|
|
36
|
+
type: 'text'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
message: '\nPresiona Enter para ver ejemplos conceptuales...',
|
|
40
|
+
type: 'pause'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
lines: [
|
|
44
|
+
'\n📦 Ejemplos de datos:',
|
|
45
|
+
'',
|
|
46
|
+
'• El saldo de una cuenta',
|
|
47
|
+
' → Este número describe cuánto dinero hay',
|
|
48
|
+
'',
|
|
49
|
+
'• El nombre de un usuario',
|
|
50
|
+
' → Este texto describe quién es',
|
|
51
|
+
'',
|
|
52
|
+
'• El estado de una puerta (abierta/cerrada)',
|
|
53
|
+
' → Este valor describe la condición actual',
|
|
54
|
+
'',
|
|
55
|
+
'• La lista de productos en un carrito',
|
|
56
|
+
' → Esta colección describe qué contiene'
|
|
57
|
+
],
|
|
58
|
+
type: 'text'
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
message: '\nPresiona Enter para continuar...',
|
|
62
|
+
type: 'pause'
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
lines: [
|
|
66
|
+
'\n💡 Característica clave de los datos:',
|
|
67
|
+
'Los datos DESCRIBEN, no HACEN nada por sí mismos',
|
|
68
|
+
'',
|
|
69
|
+
'El saldo de 5000 no se deposita solo',
|
|
70
|
+
"El nombre 'María' no se cambia solo",
|
|
71
|
+
'La puerta cerrada no se abre sola',
|
|
72
|
+
'',
|
|
73
|
+
'Los datos son PASIVOS. Solo representan información.'
|
|
74
|
+
],
|
|
75
|
+
type: 'text'
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
message: '\nPresiona Enter para ver qué es un procedimiento...',
|
|
79
|
+
type: 'pause'
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
type: 'clear'
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
lines: [
|
|
86
|
+
'¿Qué es un PROCEDIMIENTO?',
|
|
87
|
+
'==================================================',
|
|
88
|
+
'\n' +
|
|
89
|
+
'🔍 Un procedimiento es una secuencia de pasos que MODIFICA o LEE datos'
|
|
90
|
+
],
|
|
91
|
+
type: 'text'
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
message: '\nPresiona Enter para ver ejemplos conceptuales...',
|
|
95
|
+
type: 'pause'
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
lines: [
|
|
99
|
+
'\n⚙️ Ejemplos de procedimientos:',
|
|
100
|
+
'',
|
|
101
|
+
'• Depositar dinero en una cuenta',
|
|
102
|
+
" → MODIFICA el dato 'saldo' sumándole una cantidad",
|
|
103
|
+
'',
|
|
104
|
+
'• Cambiar el nombre de un usuario',
|
|
105
|
+
" → MODIFICA el dato 'nombre' asignándole un nuevo valor",
|
|
106
|
+
'',
|
|
107
|
+
'• Abrir una puerta',
|
|
108
|
+
" → MODIFICA el dato 'estado' de 'cerrada' a 'abierta'",
|
|
109
|
+
'',
|
|
110
|
+
'• Consultar el saldo',
|
|
111
|
+
" → LEE el dato 'saldo' sin modificarlo"
|
|
112
|
+
],
|
|
113
|
+
type: 'text'
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
message: '\nPresiona Enter para continuar...',
|
|
117
|
+
type: 'pause'
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
lines: [
|
|
121
|
+
'\n💡 Característica clave de los procedimientos:',
|
|
122
|
+
'Los procedimientos son ACTIVOS. Hacen algo con los datos.',
|
|
123
|
+
'',
|
|
124
|
+
'Un procedimiento sin datos no tiene sentido:',
|
|
125
|
+
' • ¿Depositar en dónde?',
|
|
126
|
+
' • ¿Cambiar qué nombre?',
|
|
127
|
+
' • ¿Abrir cuál puerta?',
|
|
128
|
+
'',
|
|
129
|
+
'Los procedimientos NECESITAN datos para operar'
|
|
130
|
+
],
|
|
131
|
+
type: 'text'
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
message: '\nPresiona Enter para ver por qué están unidos...',
|
|
135
|
+
type: 'pause'
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'clear'
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
lines: [
|
|
142
|
+
'¿Por qué DATOS y PROCEDIMIENTOS están JUNTOS?',
|
|
143
|
+
'==================================================',
|
|
144
|
+
'\n🤔 La pregunta fundamental:',
|
|
145
|
+
'Si los datos describen el estado,',
|
|
146
|
+
'y los procedimientos modifican ese estado,',
|
|
147
|
+
'¿no deberían estar relacionados?'
|
|
148
|
+
],
|
|
149
|
+
type: 'text'
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
message: '\nPresiona Enter para ver la respuesta...',
|
|
153
|
+
type: 'pause'
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
lines: [
|
|
157
|
+
'\n✨ La respuesta: EL OBJETO',
|
|
158
|
+
'',
|
|
159
|
+
'Un objeto es la unión natural de:',
|
|
160
|
+
' • Los datos que describen SU estado',
|
|
161
|
+
' • Los procedimientos que operan sobre ESE estado'
|
|
162
|
+
],
|
|
163
|
+
type: 'text'
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
message: '\nPresiona Enter para ver un ejemplo conceptual...',
|
|
167
|
+
type: 'pause'
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
lines: [
|
|
171
|
+
'\n📍 Ejemplo conceptual: Una cuenta bancaria',
|
|
172
|
+
'',
|
|
173
|
+
'┌─────────────────────────────────────┐',
|
|
174
|
+
'│ OBJETO: Cuenta │',
|
|
175
|
+
'├─────────────────────────────────────┤',
|
|
176
|
+
'│ DATOS (estado): │',
|
|
177
|
+
'│ • saldo │',
|
|
178
|
+
'│ • titular │',
|
|
179
|
+
'│ • activa │',
|
|
180
|
+
'├─────────────────────────────────────┤',
|
|
181
|
+
'│ PROCEDIMIENTOS (operaciones): │',
|
|
182
|
+
'│ • depositar │',
|
|
183
|
+
'│ • retirar │',
|
|
184
|
+
'│ • consultarSaldo │',
|
|
185
|
+
'│ • desactivar │',
|
|
186
|
+
'└─────────────────────────────────────┘'
|
|
187
|
+
],
|
|
188
|
+
type: 'text'
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
message: '\nPresiona Enter para continuar...',
|
|
192
|
+
type: 'pause'
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
lines: [
|
|
196
|
+
'\n🔗 La relación esencial:',
|
|
197
|
+
'',
|
|
198
|
+
"• 'depositar' opera sobre 'saldo'",
|
|
199
|
+
' → No tiene sentido depositar sin un saldo que modificar',
|
|
200
|
+
'',
|
|
201
|
+
"• 'desactivar' opera sobre 'activa'",
|
|
202
|
+
' → No tiene sentido desactivar sin un estado que cambiar',
|
|
203
|
+
'',
|
|
204
|
+
"• 'consultarSaldo' lee 'saldo'",
|
|
205
|
+
' → No tiene sentido consultar sin un saldo que leer'
|
|
206
|
+
],
|
|
207
|
+
type: 'text'
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
message: '\nPresiona Enter para continuar...',
|
|
211
|
+
type: 'pause'
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
lines: [
|
|
215
|
+
'\n💭 La intuición:',
|
|
216
|
+
'Los datos y los procedimientos están ATADOS entre sí',
|
|
217
|
+
'',
|
|
218
|
+
'No existen datos sin procedimientos que los manipulen',
|
|
219
|
+
'No existen procedimientos sin datos sobre los que operen',
|
|
220
|
+
'',
|
|
221
|
+
'Esta unión es lo que llamamos: OBJETO'
|
|
222
|
+
],
|
|
223
|
+
type: 'text'
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
message: '\nPresiona Enter para ver la definición completa...',
|
|
227
|
+
type: 'pause'
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
type: 'clear'
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
lines: [
|
|
234
|
+
'La Definición Completa',
|
|
235
|
+
'==================================================',
|
|
236
|
+
"\n💎 'Un objeto es un conjunto de datos y procedimientos",
|
|
237
|
+
" que operan sobre esos datos'"
|
|
238
|
+
],
|
|
239
|
+
type: 'text'
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
message: '\nPresiona Enter para desglosar la definición...',
|
|
243
|
+
type: 'pause'
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
lines: [
|
|
247
|
+
'\n🔍 Desglose de la definición:',
|
|
248
|
+
'',
|
|
249
|
+
"1️⃣ 'Un objeto es un CONJUNTO'",
|
|
250
|
+
' → No es un solo elemento, es una agrupación',
|
|
251
|
+
' → Datos y procedimientos forman una unidad',
|
|
252
|
+
''
|
|
253
|
+
],
|
|
254
|
+
type: 'text'
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
message: 'Presiona Enter para continuar...',
|
|
258
|
+
type: 'pause'
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
lines: [
|
|
262
|
+
"2️⃣ '...de DATOS'",
|
|
263
|
+
' → Información que describe el estado del objeto',
|
|
264
|
+
" → Valores que representan lo que el objeto 'es'",
|
|
265
|
+
' → PASIVOS: no hacen nada por sí mismos',
|
|
266
|
+
''
|
|
267
|
+
],
|
|
268
|
+
type: 'text'
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
message: 'Presiona Enter para continuar...',
|
|
272
|
+
type: 'pause'
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
lines: [
|
|
276
|
+
"3️⃣ '...y PROCEDIMIENTOS'",
|
|
277
|
+
' → Secuencias de pasos que modifican o leen datos',
|
|
278
|
+
" → Operaciones que representan lo que el objeto 'hace'",
|
|
279
|
+
' → ACTIVOS: transforman el estado',
|
|
280
|
+
''
|
|
281
|
+
],
|
|
282
|
+
type: 'text'
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
message: 'Presiona Enter para continuar...',
|
|
286
|
+
type: 'pause'
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
lines: [
|
|
290
|
+
"4️⃣ '...que OPERAN SOBRE esos datos'",
|
|
291
|
+
' → Los procedimientos NO operan sobre datos ajenos',
|
|
292
|
+
' → Solo modifican/leen los datos del MISMO objeto',
|
|
293
|
+
' → Esta es la relación fundamental'
|
|
294
|
+
],
|
|
295
|
+
type: 'text'
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
message: '\nPresiona Enter para ver por qué esto importa...',
|
|
299
|
+
type: 'pause'
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
type: 'clear'
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
lines: [
|
|
306
|
+
'¿Por qué esta definición es fundamental?',
|
|
307
|
+
'==================================================',
|
|
308
|
+
'\n🎯 Sin entender qué ES un objeto,',
|
|
309
|
+
' no podemos entender los otros 6 enunciados:',
|
|
310
|
+
'',
|
|
311
|
+
'• Enunciado 1: ¿Cómo descomponemos en objetos',
|
|
312
|
+
' si no sabemos qué es un objeto?',
|
|
313
|
+
'',
|
|
314
|
+
'• Enunciado 2: ¿Cómo interactúan los objetos',
|
|
315
|
+
' si no entendemos su naturaleza?',
|
|
316
|
+
'',
|
|
317
|
+
'• Enunciado 3: ¿Por qué solicitudes son la única forma',
|
|
318
|
+
' de invocar procedimientos?',
|
|
319
|
+
'',
|
|
320
|
+
'• Enunciado 4: ¿Qué firmas tienen las operaciones',
|
|
321
|
+
' (los procedimientos) del objeto?',
|
|
322
|
+
'',
|
|
323
|
+
'• Enunciado 5: ¿Qué es la interfaz del objeto',
|
|
324
|
+
' sino el conjunto de sus operaciones?',
|
|
325
|
+
'',
|
|
326
|
+
'• Enunciado 6: ¿Por qué diseñar las interfaces primero',
|
|
327
|
+
' si no sabemos que exponen operaciones?'
|
|
328
|
+
],
|
|
329
|
+
type: 'text'
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
message: '\nPresiona Enter para la conclusión...',
|
|
333
|
+
type: 'pause'
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
type: 'clear'
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
lines: [
|
|
340
|
+
'🎓 Conclusión: La Naturaleza del Objeto',
|
|
341
|
+
'==================================================',
|
|
342
|
+
'\n📌 Lo que aprendimos:',
|
|
343
|
+
'',
|
|
344
|
+
'1. Un DATO describe el estado (información pasiva)',
|
|
345
|
+
'2. Un PROCEDIMIENTO modifica o lee datos (acción activa)',
|
|
346
|
+
'3. Un OBJETO une datos con sus procedimientos',
|
|
347
|
+
'4. Esta unión no es arbitraria, es esencial',
|
|
348
|
+
'\n💡 La intuición central:',
|
|
349
|
+
'',
|
|
350
|
+
'Los datos no existen aislados',
|
|
351
|
+
'Los procedimientos no operan en el vacío',
|
|
352
|
+
'El objeto es la unión natural de ambos',
|
|
353
|
+
'\n🔗 Conexión con el resto del paradigma:',
|
|
354
|
+
'',
|
|
355
|
+
'Ahora que sabemos QUÉ es un objeto,',
|
|
356
|
+
'podemos entender:',
|
|
357
|
+
' • Cómo descomponerlos (enunciado 1)',
|
|
358
|
+
' • Cómo se comunican (enunciados 2, 3)',
|
|
359
|
+
' • Cómo se diseñan (enunciados 4, 5, 6)',
|
|
360
|
+
'\n💭 Reflexión final:',
|
|
361
|
+
'',
|
|
362
|
+
'Antes de diseñar sistemas orientados a objetos,',
|
|
363
|
+
'debemos entender la naturaleza fundamental del objeto:',
|
|
364
|
+
'',
|
|
365
|
+
" 'Un conjunto de datos y procedimientos",
|
|
366
|
+
" que operan sobre esos datos'"
|
|
367
|
+
],
|
|
368
|
+
type: 'text'
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
message: '\n✨ ¡Lección 7 completada! Presiona Enter para continuar...',
|
|
372
|
+
type: 'pause'
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
type: 'maze-completion',
|
|
376
|
+
message: 'Lección 7: Definición de objeto completado!',
|
|
377
|
+
unlocked: '¡Completaste todos los enunciados fundamentales!'
|
|
378
|
+
}
|
|
379
|
+
]
|
|
380
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Terminal Básico - Comandos fundamentales de navegación
|
|
2
|
+
export const TERMINAL_BASICO = {
|
|
3
|
+
id: 'terminal-basico',
|
|
4
|
+
|
|
5
|
+
intro: {
|
|
6
|
+
definition: 'Sintaxis: estudia el modo en que se combinan las palabras y los distintos grupos que forman para expresar significado.',
|
|
7
|
+
explanation: 'En esta sección aprenderemos algo más que palabras, aprenderemos comandos.',
|
|
8
|
+
detail: 'Al final del día un comando es una palabra, la diferencia es que está dotada de un significado que tu computadora entiende.'
|
|
9
|
+
},
|
|
10
|
+
|
|
11
|
+
steps: [
|
|
12
|
+
{
|
|
13
|
+
type: 'command-intro',
|
|
14
|
+
command: 'ls',
|
|
15
|
+
description: 'Este es tu primer comando: ls',
|
|
16
|
+
explanation: 'ls lista los archivos y carpetas en tu ubicación actual.',
|
|
17
|
+
instruction: 'Presiona ctrl + c para terminar esta sesión y después ejecuta el comando ls en tu terminal',
|
|
18
|
+
exitOnComplete: true
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
type: 'command-intro',
|
|
22
|
+
command: 'cd',
|
|
23
|
+
description: 'Segundo comando: cd',
|
|
24
|
+
explanation: 'cd te permite cambiar de directorio (carpeta).',
|
|
25
|
+
example: 'cd nombre-carpeta',
|
|
26
|
+
instruction: 'Úsalo para navegar a una carpeta. Ejemplo: cd Documentos'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
type: 'command-intro',
|
|
30
|
+
command: 'cd ..',
|
|
31
|
+
description: 'Tercer comando: cd ..',
|
|
32
|
+
explanation: 'cd .. te regresa al directorio anterior (el padre).',
|
|
33
|
+
example: 'cd ..',
|
|
34
|
+
instruction: 'Si estás en /home/usuario/Documentos, cd .. te lleva a /home/usuario'
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
type: 'command-intro',
|
|
38
|
+
command: 'mkdir',
|
|
39
|
+
description: 'Cuarto comando: mkdir',
|
|
40
|
+
explanation: 'mkdir crea un nuevo directorio (carpeta).',
|
|
41
|
+
example: 'mkdir mi-proyecto',
|
|
42
|
+
instruction: 'Crea una carpeta nueva. Prueba: mkdir prueba'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
type: 'maze-completion',
|
|
46
|
+
message: 'Terminal básico completado!',
|
|
47
|
+
unlocked: 'Git básico'
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { WELCOME_BANNER } from './messages.js'
|
|
2
|
+
import { ENUNCIADOS } from './enunciados.js'
|
|
3
|
+
|
|
4
|
+
export const MAIN_MENU_CONFIG = {
|
|
5
|
+
banner: WELCOME_BANNER,
|
|
6
|
+
title: 'Te ofrecemos las siguientes opciones:',
|
|
7
|
+
options: [
|
|
8
|
+
{ id: 'sintaxis', title: 'Aprender sintaxis' },
|
|
9
|
+
{ id: 'enunciados', title: 'Aprender conceptos de diseño' },
|
|
10
|
+
{ id: 'proyectos', title: 'Construir proyectos' }
|
|
11
|
+
]
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const ENUNCIADOS_MENU_CONFIG = {
|
|
15
|
+
title: 'Elige qué enunciado te gustaría explorar:',
|
|
16
|
+
description: [
|
|
17
|
+
'Los enunciados fundamentales ejercitan el pensamiento orientado a objetos de los estudiantes de Creta.',
|
|
18
|
+
'Escogimos estos enunciados porque creemos que exhaustan los conceptos mínimos necesarios para entender el paradigma.'
|
|
19
|
+
],
|
|
20
|
+
options: ENUNCIADOS.map((enunciado) => ({
|
|
21
|
+
id: enunciado.id,
|
|
22
|
+
title: `${enunciado.id}. ${enunciado.texto}`,
|
|
23
|
+
data: enunciado
|
|
24
|
+
}))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const PROYECTOS_MENU_CONFIG = {
|
|
28
|
+
title: 'Construir Proyectos',
|
|
29
|
+
options: [
|
|
30
|
+
{ id: 'pr', title: '🔀 Construye una pull-request' },
|
|
31
|
+
{ id: 'portfolio', title: '🎨 Construye tu portafolio' }
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const PORTFOLIO_MENU_CONFIG = {
|
|
36
|
+
title: 'Construye tu Portafolio',
|
|
37
|
+
options: [
|
|
38
|
+
{ id: 0, title: '🎨 Portafolio Personal', description: 'Reto completo', level: 0 },
|
|
39
|
+
{ id: 1, title: '🔓 Portafolio Nivel 1', description: 'Solo navbar', level: 1 },
|
|
40
|
+
{ id: 2, title: '🔓 Portafolio Nivel 2', description: 'Navbar + hero', level: 2 },
|
|
41
|
+
{ id: 3, title: '🔓 Portafolio Nivel 3', description: 'Solución completa', level: 3 }
|
|
42
|
+
]
|
|
43
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const WELCOME_BANNER = `
|
|
2
|
+
█████████████████████████
|
|
3
|
+
█ █ █ █ █ █ █
|
|
4
|
+
█ C █ R █ E █ T █ A █ █ █
|
|
5
|
+
█ █ █ █ █ █ █
|
|
6
|
+
█████████████████████████
|
|
7
|
+
|
|
8
|
+
Bienvenido a la escuela de software de icarus.mx
|
|
9
|
+
Salgamos de este laberinto 🏛️
|
|
10
|
+
`
|
|
11
|
+
|
|
12
|
+
export const HELP_TEXT = `
|
|
13
|
+
📚 Comandos disponibles:
|
|
14
|
+
creta - Explora los 7 enunciados fundamentales (comando principal) 🧠
|
|
15
|
+
creta enunciados - Explora los 7 enunciados fundamentales 🧠
|
|
16
|
+
creta portafolio - Crea tu portafolio personal (reto completo)
|
|
17
|
+
creta portafolio-1 - Desbloquea nivel 1 (navbar) 🔓
|
|
18
|
+
creta portafolio-2 - Desbloquea nivel 2 (navbar + hero) 🔓
|
|
19
|
+
creta portafolio-3 - Desbloquea nivel 3 (solución completa) 🔓
|
|
20
|
+
creta code - Inicia sesión interactiva de programación 🤖
|
|
21
|
+
creta help - Muestra esta ayuda
|
|
22
|
+
|
|
23
|
+
💡 Tip: Si estás dentro de un proyecto existente, los comandos
|
|
24
|
+
portafolio-1/2/3 actualizarán tus archivos directamente
|
|
25
|
+
|
|
26
|
+
🎯 La filosofía Creta: partir de enunciados que generan 'ruido' para
|
|
27
|
+
construir comprensión real, no solo sintaxis.
|
|
28
|
+
`
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { MenuBuilder } from '../builders/MenuBuilder.js'
|
|
2
|
+
import { ENUNCIADOS_MENU_CONFIG } from '../data/menus.js'
|
|
3
|
+
import { LESSONS_BY_ID } from '../data/lessons/index.js'
|
|
4
|
+
import { LessonBuilder } from '../builders/LessonBuilder.js'
|
|
5
|
+
import { createPromptInterface } from '../utils/input.js'
|
|
6
|
+
import { clearConsole } from '../utils/output.js'
|
|
7
|
+
|
|
8
|
+
const UPCOMING_MESSAGE = [
|
|
9
|
+
'\n🚀 Próximamente:',
|
|
10
|
+
'- Sesiones de estudio dirigidas basadas en este enunciado',
|
|
11
|
+
'- Ejercicios prácticos que ilustren el concepto',
|
|
12
|
+
'- Proyectos específicos para internalizar la idea'
|
|
13
|
+
].join('\n')
|
|
14
|
+
|
|
15
|
+
function waitForEnter(message = '\nPresiona Enter para continuar...') {
|
|
16
|
+
const rl = createPromptInterface()
|
|
17
|
+
return new Promise((resolve) => {
|
|
18
|
+
rl.question(message, () => {
|
|
19
|
+
rl.close()
|
|
20
|
+
resolve()
|
|
21
|
+
})
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function runLesson(lessonId, enunciadoTexto, { LessonCtor = LessonBuilder, delay = setTimeout } = {}) {
|
|
26
|
+
const lessonData = LESSONS_BY_ID.get(lessonId)
|
|
27
|
+
|
|
28
|
+
if (!lessonData) {
|
|
29
|
+
console.log(UPCOMING_MESSAGE)
|
|
30
|
+
console.log('\n💭 Por ahora, reflexiona: ¿qué parte de este enunciado te genera más curiosidad?')
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Show selection confirmation (NEW UX PATTERN)
|
|
35
|
+
console.log(`\nElegiste: Enunciado ${lessonId}`)
|
|
36
|
+
console.log('Cargando...')
|
|
37
|
+
await new Promise((resolve) => delay(resolve, 1000))
|
|
38
|
+
|
|
39
|
+
// Clear screen but keep scroll history (NEW UX PATTERN)
|
|
40
|
+
clearConsole()
|
|
41
|
+
|
|
42
|
+
// Show enunciado text
|
|
43
|
+
console.log(enunciadoTexto)
|
|
44
|
+
await new Promise((resolve) => delay(resolve, 1500))
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
const lesson = new LessonCtor(lessonData)
|
|
48
|
+
await lesson.start()
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.error('\n❌ Error al ejecutar la lección:', error.message)
|
|
51
|
+
console.log(UPCOMING_MESSAGE)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export async function executeEnunciados({
|
|
56
|
+
waitForEnter: wait = waitForEnter,
|
|
57
|
+
menu,
|
|
58
|
+
menuConfig = ENUNCIADOS_MENU_CONFIG,
|
|
59
|
+
lessonBuilder: LessonCtor = LessonBuilder,
|
|
60
|
+
delay = setTimeout
|
|
61
|
+
} = {}) {
|
|
62
|
+
const enunciadosMenu = menu || new MenuBuilder(menuConfig)
|
|
63
|
+
|
|
64
|
+
while (true) {
|
|
65
|
+
const choice = await enunciadosMenu.show()
|
|
66
|
+
if (!choice) {
|
|
67
|
+
return
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
await runLesson(choice.id, choice.data?.texto || choice.title, { LessonCtor, delay })
|
|
71
|
+
await wait('\nPresiona Enter para regresar al menú de enunciados...')
|
|
72
|
+
}
|
|
73
|
+
}
|