CodeForge

JavaScript de Cero a Experto / JS funcional

Reto: el motor de reportes puro

Reto35 min60 XP

El examen del estilo funcional: construir el motor de reportes de "Mi Bolsillo" como una biblioteca de estaciones puras y configurables que se COMBINAN en líneas de ensamble. Cuatro informes distintos, cero bucles, cero mutaciones, y el dato original tan intacto que lo vas a demostrar con código.

Reto

El motor de reportes puro

Media30 min60 XP(×2 sin mirar la solución)

Qué debes construir

Con estos datos de partida:

datos.js
const gastos = [
{ nombre: "Almuerzo", valor: 18000, categoria: "comida" },
{ nombre: "Bus", valor: 5800, categoria: "transporte" },
{ nombre: "Café", valor: 4500, categoria: "comida" },
{ nombre: "Cine", valor: 25000, categoria: "ocio" },
{ nombre: "Mercado", valor: 92000, categoria: "comida" },
{ nombre: "Taxi", valor: 15000, categoria: "transporte" },
];

Tu motor debe producir EXACTAMENTE esta salida:

terminal

Comida: $ 114.500

Caros (más de $ 20.000): $ 117.000

Transporte: $ 20.800

Todo el mes: $ 160.300

¿Original intacto? true

Requisitos:

  1. pipe(...fns) implementado por ti, con reduce — las tres líneas de la lección 4, escritas de memoria.
  2. Fábricas de criterios curry: porCategoria(categoria) y mayoresA(limite) — devuelven funciones (gasto) => boolean.
  3. Estaciones puras: filtrar(criterio) (curry: configuración → lista), totalizar (lista → número, con reduce), enCOP (número → string es-CO sin decimales) y etiquetar(titulo) (curry: produce "titulo: texto").
  4. Cuatro reportes POR COMBINACIÓN de esas piezas con pipe — nota que el de "Todo el mes" no lleva estación de filtro (las líneas pueden tener largos distintos).
  5. La prueba de inmutabilidad: fotografía el original ANTES (JSON.stringify) y compara DESPUÉS de correr los cuatro reportes — imprime ¿Original intacto? true.

Reglas

  • Cero for/while, cero push/splice/sort: solo métodos que producen (filter, map, reduce, toSorted).
  • Toda función del motor es PURA: nada de variables externas mutables, el console.log solo en el script final.
  • Cada reporte es UNA expresión pipe(...) — si escribes lógica suelta entre estaciones, va contra el espíritu.
  • La plata la formatea toLocaleString/Intl, nunca a mano.

30:00

Cuando estés listo, arranca el reloj.

Qué sigue

Doce módulos: ya hablas los dos idiomas — objetos que encapsulan (módulo 11) y funciones que componen (módulo 12). El módulo 13 los pone a trabajar juntos en la arquitectura real: módulos ESM, singleton, factory y la joya de la corona — el patrón OBSERVER construido desde cero, la base para entender RxJS, los signals de Angular y medio ecosistema moderno.