@icarusmx/creta 1.1.2 → 1.2.1

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 CHANGED
@@ -621,7 +621,8 @@ async function startMainMenuInteractive() {
621
621
 
622
622
  const options = [
623
623
  { id: 1, title: "Aprender conceptos", description: "Explora los enunciados fundamentales" },
624
- { id: 2, title: "Construir proyectos", description: "Crea tu portafolio personal" }
624
+ { id: 2, title: "Construir proyectos", description: "Crea tu portafolio personal" },
625
+ { id: 3, title: "Crea una pull-request", description: "Aprende el flujo de contribución con Git" }
625
626
  ]
626
627
 
627
628
  let selectedIndex = 0
@@ -692,6 +693,8 @@ Salgamos de este laberinto 🏛️
692
693
  startEnunciadosSelector().then(resolve)
693
694
  } else if (selectedOption.id === 2) {
694
695
  startProyectosSelector().then(resolve)
696
+ } else if (selectedOption.id === 3) {
697
+ startPullRequestTutorial().then(resolve)
695
698
  }
696
699
  return
697
700
  }
@@ -727,9 +730,10 @@ async function startMainMenuFallback() {
727
730
  console.log("")
728
731
  console.log("1. Aprender conceptos - Explora los enunciados fundamentales")
729
732
  console.log("2. Construir proyectos - Crea tu portafolio personal")
733
+ console.log("3. Crea una pull-request - Aprende el flujo de contribución con Git")
730
734
  console.log("")
731
735
 
732
- const respuesta = await askQuestion("Elige una opción (1-2) o 'q' para salir: ")
736
+ const respuesta = await askQuestion("Elige una opción (1-3) o 'q' para salir: ")
733
737
 
734
738
  if (respuesta.toLowerCase() === 'q') {
735
739
  console.log("Hecho con <3 por icarus.mx")
@@ -745,8 +749,11 @@ async function startMainMenuFallback() {
745
749
  } else if (opcionSeleccionada === 2) {
746
750
  rl.close()
747
751
  await startProyectosSelector()
752
+ } else if (opcionSeleccionada === 3) {
753
+ rl.close()
754
+ await startPullRequestTutorial()
748
755
  } else {
749
- console.log("❌ Opción no válida. Elige 1 o 2.")
756
+ console.log("❌ Opción no válida. Elige 1, 2 o 3.")
750
757
  rl.close()
751
758
  }
752
759
 
@@ -1405,3 +1412,35 @@ async function startProyectosSelectorFallback() {
1405
1412
  process.exit(1)
1406
1413
  }
1407
1414
  }
1415
+
1416
+ async function startPullRequestTutorial() {
1417
+ console.clear()
1418
+ console.log("🔀 Tutorial: Crea una Pull Request")
1419
+ console.log("=" .repeat(50))
1420
+ console.log("")
1421
+ console.log("📚 Aprenderás:")
1422
+ console.log(" • Cómo hacer fork de un repositorio")
1423
+ console.log(" • Crear una rama (branch) para tu cambio")
1424
+ console.log(" • Hacer commits con buenas prácticas")
1425
+ console.log(" • Crear una pull request profesional")
1426
+ console.log("")
1427
+ console.log("🚧 [PRÓXIMAMENTE]")
1428
+ console.log("")
1429
+ console.log("Esta funcionalidad está en desarrollo.")
1430
+ console.log("Pronto podrás practicar el flujo completo de contribución.")
1431
+ console.log("")
1432
+
1433
+ const rl = createInterface({
1434
+ input: process.stdin,
1435
+ output: process.stdout
1436
+ })
1437
+
1438
+ await new Promise((resolve) => {
1439
+ rl.question("\nPresiona Enter para volver al menú principal...", () => {
1440
+ rl.close()
1441
+ resolve()
1442
+ })
1443
+ })
1444
+
1445
+ await startMainMenu()
1446
+ }
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // LECCIÓN 7: Un objeto es un conjunto de datos y procedimientos que operan sobre esos datos
4
- // Enfoque práctico: Comparación entre código procedural vs orientado a objetos
4
+ // Enfoque conceptual: Entender qué es un dato, qué es un procedimiento, y por qué están unidos
5
5
 
6
6
  import { createInterface } from 'readline'
7
7
 
@@ -16,370 +16,277 @@ export class Lesson7ObjectDefinition {
16
16
  async start() {
17
17
  await this.waitForEnter("\nPresiona Enter para comenzar...")
18
18
 
19
- await this.practicalExercise()
19
+ await this.conceptualExercise()
20
20
  await this.conclusion()
21
21
 
22
22
  this.rl.close()
23
23
  }
24
24
 
25
- async practicalExercise() {
25
+ async conceptualExercise() {
26
26
  console.clear()
27
- console.log("Exploraremos qué ES un objeto comparando dos enfoques:")
28
- console.log("1. Datos separados + funciones sueltas")
29
- console.log("2. Objeto = datos + procedimientos unidos")
27
+ console.log("Para entender qué ES un objeto,")
28
+ console.log("primero debemos entender dos conceptos fundamentales:")
29
+ console.log("")
30
+ console.log("1. ¿Qué es un DATO?")
31
+ console.log("2. ¿Qué es un PROCEDIMIENTO?")
30
32
 
31
33
  await this.waitForEnter("\nPresiona Enter para continuar...")
32
34
 
33
- await this.step1_ProceduralApproach()
34
- await this.step2_ObjectOrientedApproach()
35
- await this.step3_ComparisonAndBenefits()
35
+ await this.step1_WhatIsData()
36
+ await this.step2_WhatIsProcedure()
37
+ await this.step3_WhyTogether()
38
+ await this.step4_ObjectDefinition()
36
39
  }
37
40
 
38
- async step1_ProceduralApproach() {
41
+ async step1_WhatIsData() {
39
42
  console.clear()
40
- console.log("🔧 Enfoque Procedural: Datos Separados")
43
+ console.log("¿Qué es un DATO?")
41
44
  console.log("=" .repeat(50))
42
45
 
43
- console.log("\n💳 Ejemplo: Sistema de Cuenta Bancaria")
44
- console.log("\n📊 Datos sueltos:")
46
+ console.log("\n🔍 Un dato es información que describe el estado de algo")
45
47
 
46
- const dataCode = `// Datos de la cuenta
47
- let accountNumber = "001-234567"
48
- let ownerName = "María González"
49
- let balance = 5000
50
- let isActive = true`
48
+ await this.waitForEnter("\nPresiona Enter para ver ejemplos conceptuales...")
51
49
 
52
- this.printCodeWithColors("Variables globales", dataCode)
50
+ console.log("\n📦 Ejemplos de datos:")
51
+ console.log("")
52
+ console.log("• El saldo de una cuenta")
53
+ console.log(" → Este número describe cuánto dinero hay")
54
+ console.log("")
55
+ console.log("• El nombre de un usuario")
56
+ console.log(" → Este texto describe quién es")
57
+ console.log("")
58
+ console.log("• El estado de una puerta (abierta/cerrada)")
59
+ console.log(" → Este valor describe la condición actual")
60
+ console.log("")
61
+ console.log("• La lista de productos en un carrito")
62
+ console.log(" → Esta colección describe qué contiene")
53
63
 
54
- await this.waitForEnter("\nPresiona Enter para ver las funciones...")
55
-
56
- console.log("\n⚙️ Funciones separadas que operan sobre esos datos:")
64
+ await this.waitForEnter("\nPresiona Enter para continuar...")
57
65
 
58
- const functionsCode = `function deposit(amount) {
59
- if (!isActive) {
60
- console.log("Cuenta inactiva")
61
- return false
62
- }
63
- if (amount <= 0) {
64
- console.log("Cantidad inválida")
65
- return false
66
- }
67
- balance += amount
68
- return true
69
- }
66
+ console.log("\n💡 Característica clave de los datos:")
67
+ console.log("Los datos DESCRIBEN, no HACEN nada por sí mismos")
68
+ console.log("")
69
+ console.log("El saldo de 5000 no se deposita solo")
70
+ console.log("El nombre 'María' no se cambia solo")
71
+ console.log("La puerta cerrada no se abre sola")
72
+ console.log("")
73
+ console.log("Los datos son PASIVOS. Solo representan información.")
70
74
 
71
- function withdraw(amount) {
72
- if (!isActive) return false
73
- if (amount <= 0) return false
74
- if (amount > balance) {
75
- console.log("Fondos insuficientes")
76
- return false
75
+ await this.waitForEnter("\nPresiona Enter para ver qué es un procedimiento...")
77
76
  }
78
- balance -= amount
79
- return true
80
- }
81
-
82
- function getBalance() {
83
- return isActive ? balance : 0
84
- }
85
-
86
- function deactivate() {
87
- isActive = false
88
- }`
89
-
90
- this.printCodeWithColors("Funciones sueltas", functionsCode)
91
-
92
- await this.waitForEnter("\nPresiona Enter para ver el problema...")
93
77
 
78
+ async step2_WhatIsProcedure() {
94
79
  console.clear()
95
- console.log(" Problemas del enfoque procedural:")
80
+ console.log("¿Qué es un PROCEDIMIENTO?")
96
81
  console.log("=" .repeat(50))
97
82
 
98
- console.log("\n1️⃣ Datos expuestos globalmente:")
99
- console.log(" • Cualquier código puede modificar 'balance' directamente")
100
- console.log(" • No hay protección de los datos")
101
-
102
- console.log("\n2️⃣ Funciones no están vinculadas a datos:")
103
- console.log(" • deposit() asume que 'balance' existe")
104
- console.log(" • ¿Qué pasa si necesitamos múltiples cuentas?")
83
+ console.log("\n🔍 Un procedimiento es una secuencia de pasos que MODIFICA o LEE datos")
105
84
 
106
- console.log("\n3️⃣ Difícil de escalar:")
85
+ await this.waitForEnter("\nPresiona Enter para ver ejemplos conceptuales...")
107
86
 
108
- const problemCode = `// ¿Cómo manejamos dos cuentas?
109
- let balance1 = 5000
110
- let balance2 = 3000
111
- let accountNumber1 = "001"
112
- let accountNumber2 = "002"
87
+ console.log("\n⚙️ Ejemplos de procedimientos:")
88
+ console.log("")
89
+ console.log("• Depositar dinero en una cuenta")
90
+ console.log(" → MODIFICA el dato 'saldo' sumándole una cantidad")
91
+ console.log("")
92
+ console.log("• Cambiar el nombre de un usuario")
93
+ console.log(" → MODIFICA el dato 'nombre' asignándole un nuevo valor")
94
+ console.log("")
95
+ console.log("• Abrir una puerta")
96
+ console.log(" → MODIFICA el dato 'estado' de 'cerrada' a 'abierta'")
97
+ console.log("")
98
+ console.log("• Consultar el saldo")
99
+ console.log(" → LEE el dato 'saldo' sin modificarlo")
113
100
 
114
- // Las funciones solo trabajan con una cuenta
115
- deposit(100) // ¿A cuál cuenta?`
116
-
117
- this.printCodeWithColors("Escalabilidad problemática", problemCode)
101
+ await this.waitForEnter("\nPresiona Enter para continuar...")
118
102
 
119
- await this.waitForEnter("\nPresiona Enter para ver la solución...")
103
+ console.log("\n💡 Característica clave de los procedimientos:")
104
+ console.log("Los procedimientos son ACTIVOS. Hacen algo con los datos.")
105
+ console.log("")
106
+ console.log("Un procedimiento sin datos no tiene sentido:")
107
+ console.log(" • ¿Depositar en dónde?")
108
+ console.log(" • ¿Cambiar qué nombre?")
109
+ console.log(" • ¿Abrir cuál puerta?")
110
+ console.log("")
111
+ console.log("Los procedimientos NECESITAN datos para operar")
112
+
113
+ await this.waitForEnter("\nPresiona Enter para ver por qué están unidos...")
120
114
  }
121
115
 
122
- async step2_ObjectOrientedApproach() {
116
+ async step3_WhyTogether() {
123
117
  console.clear()
124
- console.log(" Enfoque Orientado a Objetos: Datos + Procedimientos")
118
+ console.log("¿Por qué DATOS y PROCEDIMIENTOS están JUNTOS?")
125
119
  console.log("=" .repeat(50))
126
120
 
127
- console.log("\n💡 Un objeto AGRUPA datos y procedimientos")
128
- console.log("Los datos quedan unidos con las operaciones que los manipulan")
121
+ console.log("\n🤔 La pregunta fundamental:")
122
+ console.log("Si los datos describen el estado,")
123
+ console.log("y los procedimientos modifican ese estado,")
124
+ console.log("¿no deberían estar relacionados?")
129
125
 
130
- await this.waitForEnter("\nPresiona Enter para ver el código...")
126
+ await this.waitForEnter("\nPresiona Enter para ver la respuesta...")
131
127
 
132
- const objectCode = `class BankAccount {
133
- // Constructor: inicializa los DATOS del objeto
134
- constructor(accountNumber, ownerName, initialBalance) {
135
- this.accountNumber = accountNumber
136
- this.ownerName = ownerName
137
- this.balance = initialBalance
138
- this.isActive = true
139
- }
128
+ console.log("\n✨ La respuesta: EL OBJETO")
129
+ console.log("")
130
+ console.log("Un objeto es la unión natural de:")
131
+ console.log(" • Los datos que describen SU estado")
132
+ console.log(" • Los procedimientos que operan sobre ESE estado")
140
133
 
141
- // OPERACIONES que operan sobre ESTOS datos específicos
142
- deposit(amount) {
143
- if (!this.isActive) {
144
- console.log("Cuenta inactiva")
145
- return false
146
- }
147
- if (amount <= 0) {
148
- console.log("Cantidad inválida")
149
- return false
150
- }
151
- this.balance += amount
152
- return true
153
- }
134
+ await this.waitForEnter("\nPresiona Enter para ver un ejemplo conceptual...")
154
135
 
155
- withdraw(amount) {
156
- if (!this.isActive) return false
157
- if (amount <= 0) return false
158
- if (amount > this.balance) {
159
- console.log("Fondos insuficientes")
160
- return false
161
- }
162
- this.balance -= amount
163
- return true
164
- }
136
+ console.log("\n📍 Ejemplo conceptual: Una cuenta bancaria")
137
+ console.log("")
138
+ console.log("┌─────────────────────────────────────┐")
139
+ console.log("│ OBJETO: Cuenta │")
140
+ console.log("├─────────────────────────────────────┤")
141
+ console.log("│ DATOS (estado): │")
142
+ console.log("│ • saldo │")
143
+ console.log("│ • titular │")
144
+ console.log("│ • activa │")
145
+ console.log("├─────────────────────────────────────┤")
146
+ console.log("│ PROCEDIMIENTOS (operaciones): │")
147
+ console.log("│ • depositar │")
148
+ console.log("│ • retirar │")
149
+ console.log("│ • consultarSaldo │")
150
+ console.log("│ • desactivar │")
151
+ console.log("└─────────────────────────────────────┘")
165
152
 
166
- getBalance() {
167
- return this.isActive ? this.balance : 0
168
- }
153
+ await this.waitForEnter("\nPresiona Enter para continuar...")
169
154
 
170
- deactivate() {
171
- this.isActive = false
172
- }
155
+ console.log("\n🔗 La relación esencial:")
156
+ console.log("")
157
+ console.log("• 'depositar' opera sobre 'saldo'")
158
+ console.log(" → No tiene sentido depositar sin un saldo que modificar")
159
+ console.log("")
160
+ console.log("• 'desactivar' opera sobre 'activa'")
161
+ console.log(" → No tiene sentido desactivar sin un estado que cambiar")
162
+ console.log("")
163
+ console.log("• 'consultarSaldo' lee 'saldo'")
164
+ console.log(" → No tiene sentido consultar sin un saldo que leer")
173
165
 
174
- getAccountInfo() {
175
- return {
176
- number: this.accountNumber,
177
- owner: this.ownerName,
178
- balance: this.getBalance(),
179
- status: this.isActive ? 'Activa' : 'Inactiva'
180
- }
181
- }
182
- }`
166
+ await this.waitForEnter("\nPresiona Enter para continuar...")
183
167
 
184
- this.printCodeWithColors("Clase BankAccount", objectCode)
168
+ console.log("\n💭 La intuición:")
169
+ console.log("Los datos y los procedimientos están ATADOS entre sí")
170
+ console.log("")
171
+ console.log("No existen datos sin procedimientos que los manipulen")
172
+ console.log("No existen procedimientos sin datos sobre los que operen")
173
+ console.log("")
174
+ console.log("Esta unión es lo que llamamos: OBJETO")
185
175
 
186
- await this.waitForEnter("\nPresiona Enter para ver múltiples instancias...")
176
+ await this.waitForEnter("\nPresiona Enter para ver la definición completa...")
177
+ }
187
178
 
179
+ async step4_ObjectDefinition() {
188
180
  console.clear()
189
- console.log("🎯 Múltiples objetos = Múltiples conjuntos de datos")
181
+ console.log("La Definición Completa")
190
182
  console.log("=" .repeat(50))
191
183
 
192
- const usageCode = `// Crear múltiples cuentas es simple
193
- const account1 = new BankAccount("001-234567", "María González", 5000)
194
- const account2 = new BankAccount("001-789012", "Juan Pérez", 3000)
195
-
196
- // Cada objeto tiene SUS PROPIOS datos
197
- account1.deposit(500)
198
- account2.withdraw(200)
199
-
200
- console.log(account1.getBalance()) // 5500
201
- console.log(account2.getBalance()) // 2800
202
-
203
- // Las operaciones operan sobre los datos del objeto específico
204
- account1.deactivate()
205
- console.log(account1.isActive) // false
206
- console.log(account2.isActive) // true ← No afectado`
207
-
208
- this.printCodeWithColors("Uso del objeto", usageCode)
184
+ console.log("\n💎 'Un objeto es un conjunto de datos y procedimientos")
185
+ console.log(" que operan sobre esos datos'")
209
186
 
210
- await this.waitForEnter("\nPresiona Enter para ver las ventajas...")
211
- }
187
+ await this.waitForEnter("\nPresiona Enter para desglosar la definición...")
212
188
 
213
- async step3_ComparisonAndBenefits() {
214
- console.clear()
215
- console.log("📊 Comparación Directa")
216
- console.log("=" .repeat(50))
189
+ console.log("\n🔍 Desglose de la definición:")
190
+ console.log("")
191
+ console.log("1️⃣ 'Un objeto es un CONJUNTO'")
192
+ console.log(" → No es un solo elemento, es una agrupación")
193
+ console.log(" → Datos y procedimientos forman una unidad")
194
+ console.log("")
217
195
 
218
- console.log("\n🔴 Enfoque Procedural:")
219
- console.log(" Datos: let balance = 5000")
220
- console.log(" Operación: function deposit(amount) { balance += amount }")
221
- console.log(" ❌ Separados, sin relación formal")
196
+ await this.waitForEnter("Presiona Enter para continuar...")
222
197
 
223
- console.log("\n🟢 Enfoque Orientado a Objetos:")
224
- console.log(" Datos: this.balance = 5000")
225
- console.log(" Operación: deposit(amount) { this.balance += amount }")
226
- console.log(" Unidos en el MISMO objeto")
198
+ console.log("2️⃣ '...de DATOS'")
199
+ console.log(" Información que describe el estado del objeto")
200
+ console.log(" Valores que representan lo que el objeto 'es'")
201
+ console.log(" PASIVOS: no hacen nada por sí mismos")
202
+ console.log("")
227
203
 
228
- await this.waitForEnter("\nPresiona Enter para ver ejemplo visual...")
204
+ await this.waitForEnter("Presiona Enter para continuar...")
229
205
 
230
- console.clear()
231
- console.log("🎨 Visualización del Concepto")
232
- console.log("=" .repeat(50))
206
+ console.log("3️⃣ '...y PROCEDIMIENTOS'")
207
+ console.log(" Secuencias de pasos que modifican o leen datos")
208
+ console.log(" → Operaciones que representan lo que el objeto 'hace'")
209
+ console.log(" → ACTIVOS: transforman el estado")
210
+ console.log("")
233
211
 
234
- console.log("\n┌─────────────────────────────────────┐")
235
- console.log("│ OBJETO: account1 │")
236
- console.log("├─────────────────────────────────────┤")
237
- console.log("│ DATOS: │")
238
- console.log("│ • accountNumber = \"001-234567\" │")
239
- console.log("│ • ownerName = \"María González\" │")
240
- console.log("│ • balance = 5000 │")
241
- console.log("│ • isActive = true │")
242
- console.log("├─────────────────────────────────────┤")
243
- console.log("│ OPERACIONES: │")
244
- console.log("│ • deposit(amount) │")
245
- console.log("│ • withdraw(amount) │")
246
- console.log("│ • getBalance() │")
247
- console.log("│ • deactivate() │")
248
- console.log("└─────────────────────────────────────┘")
212
+ await this.waitForEnter("Presiona Enter para continuar...")
249
213
 
250
- console.log("\n📌 Nota clave:")
251
- console.log("Las operaciones SOLO operan sobre los datos de ESTE objeto")
252
- console.log("account1.deposit() modifica account1.balance")
253
- console.log("account2.deposit() modifica account2.balance")
214
+ console.log("4️⃣ '...que OPERAN SOBRE esos datos'")
215
+ console.log(" Los procedimientos NO operan sobre datos ajenos")
216
+ console.log(" Solo modifican/leen los datos del MISMO objeto")
217
+ console.log(" Esta es la relación fundamental")
254
218
 
255
- await this.waitForEnter("\nPresiona Enter para ver otro ejemplo...")
219
+ await this.waitForEnter("\nPresiona Enter para ver por qué esto importa...")
256
220
 
257
221
  console.clear()
258
- console.log("🎮 Ejemplo 2: Sistema de Carrito de Compras")
222
+ console.log("¿Por qué esta definición es fundamental?")
259
223
  console.log("=" .repeat(50))
260
224
 
261
- const cartCode = `class ShoppingCart {
262
- // DATOS del carrito
263
- constructor(userId) {
264
- this.userId = userId
265
- this.items = []
266
- this.totalAmount = 0
267
- }
268
-
269
- // OPERACIONES que operan sobre estos datos
270
- addItem(product, quantity) {
271
- const item = { product, quantity, price: product.price * quantity }
272
- this.items.push(item)
273
- this.totalAmount += item.price
274
- }
275
-
276
- removeItem(productId) {
277
- const itemIndex = this.items.findIndex(i => i.product.id === productId)
278
- if (itemIndex > -1) {
279
- this.totalAmount -= this.items[itemIndex].price
280
- this.items.splice(itemIndex, 1)
281
- }
282
- }
283
-
284
- getTotal() {
285
- return this.totalAmount
286
- }
287
-
288
- getItemCount() {
289
- return this.items.reduce((sum, item) => sum + item.quantity, 0)
290
- }
291
-
292
- clear() {
293
- this.items = []
294
- this.totalAmount = 0
295
- }
296
- }
297
-
298
- // Uso
299
- const cart = new ShoppingCart("user123")
300
- cart.addItem({ id: 1, name: "Libro", price: 299 }, 2)
301
- cart.addItem({ id: 2, name: "Café", price: 85 }, 1)
302
-
303
- console.log(cart.getTotal()) // 683
304
- console.log(cart.getItemCount()) // 3`
305
-
306
- this.printCodeWithColors("Clase ShoppingCart", cartCode)
225
+ console.log("\n🎯 Sin entender qué ES un objeto,")
226
+ console.log(" no podemos entender los otros 6 enunciados:")
227
+ console.log("")
228
+ console.log("• Enunciado 1: ¿Cómo descomponemos en objetos")
229
+ console.log(" si no sabemos qué es un objeto?")
230
+ console.log("")
231
+ console.log("• Enunciado 2: ¿Cómo interactúan los objetos")
232
+ console.log(" si no entendemos su naturaleza?")
233
+ console.log("")
234
+ console.log("• Enunciado 3: ¿Por qué solicitudes son la única forma")
235
+ console.log(" de invocar procedimientos?")
236
+ console.log("")
237
+ console.log("• Enunciado 4: ¿Qué firmas tienen las operaciones")
238
+ console.log(" (los procedimientos) del objeto?")
239
+ console.log("")
240
+ console.log("• Enunciado 5: ¿Qué es la interfaz del objeto")
241
+ console.log(" sino el conjunto de sus operaciones?")
242
+ console.log("")
243
+ console.log("• Enunciado 6: ¿Por qué diseñar las interfaces primero")
244
+ console.log(" si no sabemos que exponen operaciones?")
307
245
 
308
246
  await this.waitForEnter("\nPresiona Enter para la conclusión...")
309
247
  }
310
248
 
311
249
  async conclusion() {
312
250
  console.clear()
313
- console.log("🎓 Conclusión: Definición del Objeto")
251
+ console.log("🎓 Conclusión: La Naturaleza del Objeto")
314
252
  console.log("=" .repeat(50))
315
253
 
316
- console.log("\n💎 Enunciado fundamental:")
317
- console.log("'Un objeto es un conjunto de datos y procedimientos")
318
- console.log(" que operan sobre esos datos'")
319
-
320
- console.log("\n🔍 Desglose:")
321
- console.log("1️⃣ CONJUNTO agrupación unificada")
322
- console.log("2️⃣ DATOS → información del objeto (this.balance, this.name)")
323
- console.log("3️⃣ PROCEDIMIENTOS operaciones del objeto (deposit, withdraw)")
324
- console.log("4️⃣ OPERAN SOBRE → las operaciones modifican/leen los datos")
325
-
326
- console.log("\n✅ Ventajas demostradas:")
327
- console.log(" Encapsulación: datos y operaciones juntos")
328
- console.log("• Modularidad: cada objeto es independiente")
329
- console.log(" Escalabilidad: múltiples instancias fácilmente")
330
- console.log("• Organización: responsabilidades claras")
331
-
332
- console.log("\n📚 Ejemplos vistos:")
333
- console.log("• BankAccount: balance + deposit/withdraw")
334
- console.log("• ShoppingCart: items + addItem/removeItem")
335
-
336
- console.log("\n🔗 Conexión con otros enunciados:")
337
- console.log(" Enunciado 1: Estos objetos son los que descomponemos del sistema")
338
- console.log("• Enunciado 2: Estos objetos interactúan mediante solicitudes")
339
- console.log(" Enunciado 4: Cada operación tiene una firma (nombre, insumos, retorno)")
340
- console.log(" Enunciado 5: La interfaz expone las operaciones disponibles")
341
-
342
- console.log("\n💭 Reflexión:")
343
- console.log("Antes de diseñar cómo los objetos interactúan,")
344
- console.log("debemos entender QUÉ ES un objeto:")
345
- console.log("datos + procedimientos, unidos e inseparables.")
254
+ console.log("\n📌 Lo que aprendimos:")
255
+ console.log("")
256
+ console.log("1. Un DATO describe el estado (información pasiva)")
257
+ console.log("2. Un PROCEDIMIENTO modifica o lee datos (acción activa)")
258
+ console.log("3. Un OBJETO une datos con sus procedimientos")
259
+ console.log("4. Esta unión no es arbitraria, es esencial")
260
+
261
+ console.log("\n💡 La intuición central:")
262
+ console.log("")
263
+ console.log("Los datos no existen aislados")
264
+ console.log("Los procedimientos no operan en el vacío")
265
+ console.log("El objeto es la unión natural de ambos")
266
+
267
+ console.log("\n🔗 Conexión con el resto del paradigma:")
268
+ console.log("")
269
+ console.log("Ahora que sabemos QUÉ es un objeto,")
270
+ console.log("podemos entender:")
271
+ console.log(" Cómo descomponerlos (enunciado 1)")
272
+ console.log(" Cómo se comunican (enunciados 2, 3)")
273
+ console.log(" • Cómo se diseñan (enunciados 4, 5, 6)")
274
+
275
+ console.log("\n💭 Reflexión final:")
276
+ console.log("")
277
+ console.log("Antes de diseñar sistemas orientados a objetos,")
278
+ console.log("debemos entender la naturaleza fundamental del objeto:")
279
+ console.log("")
280
+ console.log(" 'Un conjunto de datos y procedimientos")
281
+ console.log(" que operan sobre esos datos'")
346
282
 
347
283
  await this.waitForEnter("\n✨ ¡Lección 7 completada! Presiona Enter para continuar...")
348
284
  }
349
285
 
350
- formatCode(code) {
351
- const colors = {
352
- keyword: '\x1b[35m',
353
- property: '\x1b[32m',
354
- string: '\x1b[33m',
355
- comment: '\x1b[90m',
356
- reset: '\x1b[0m'
357
- }
358
-
359
- return code
360
- .replace(/\b(class|constructor|return|if|const|let|new|function)\b/g, `${colors.keyword}$1${colors.reset}`)
361
- .replace(/\bthis\./g, `${colors.property}this.${colors.reset}`)
362
- .replace(/'([^']*)'/g, `${colors.string}'$1'${colors.reset}`)
363
- .replace(/"([^"]*)"/g, `${colors.string}"$1"${colors.reset}`)
364
- .replace(/\/\/.*$/gm, `${colors.comment}$&${colors.reset}`)
365
- }
366
-
367
- printCodeWithColors(title, code) {
368
- console.log(`\n${title}`)
369
- console.log("━".repeat(50))
370
-
371
- code.split('\n').forEach(line => {
372
- const formattedLine = this.formatCode(line)
373
- console.log(formattedLine)
374
- })
375
-
376
- console.log("━".repeat(50))
377
- }
378
-
379
286
  async waitForEnter(message) {
380
287
  return new Promise((resolve) => {
381
288
  this.rl.question(message, () => {
382
- console.log("\n\n")
289
+ console.log("\n")
383
290
  resolve()
384
291
  })
385
292
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icarusmx/creta",
3
- "version": "1.1.2",
3
+ "version": "1.2.1",
4
4
  "description": "Salgamos de este laberinto.",
5
5
  "type": "module",
6
6
  "bin": {