Saltar al contenido
Curso de Node.js y APIs
Todos los cursos

Ejercicio: npm y package.json

  • ⏱ 40 minutos
  • 📶 Nivel: principiante

Objetivo

Montar un proyecto real con npm (instalar un paquete, crear scripts y un .gitignore) y escribir cinco funciones que manipulan un package.json y comparan versiones.

Cómo se trabaja

La parte A se hace en tu terminal. La parte B son funciones de JavaScript puro que puedes probar aquí y comprobar en el navegador. Pega solo las funciones, sin <script>.

▶ Prueba tu código aquí (opcional)
Consola

Pasos

Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.

💡 Pista 1: comparar números, no textos

Convierte cada parte con Number. Como texto, "10" es menor que "9"; como número no.

💡 Pista 2: aceptaCaret

Quita el ^ con rango.replace("^", ""). Debe cumplirse: mismo MAYOR y compararVersiones(version, base) >= 0.

💡 Pista 3: no mutar

Con propagación: { ...pkg, scripts: { ...pkg.scripts, [nombre]: comando } }. Si pkg.scripts no existe, propagar undefined no da error.

🔎 Comprueba tu trabajo

Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.

    ✅ Ver una solución posible

    Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.

    funciones.js
    function listarScripts(texto) {
      const pkg = JSON.parse(texto);
      return Object.entries(pkg.scripts || {}).map(
        ([nombre, comando]) => `${nombre}: ${comando}`
      );
    }
    
    function contarDependencias(pkg) {
      const normales = Object.keys(pkg.dependencies || {}).length;
      const desarrollo = Object.keys(pkg.devDependencies || {}).length;
      return normales + desarrollo;
    }
    
    function compararVersiones(a, b) {
      const x = a.split(".").map(Number);
      const y = b.split(".").map(Number);
      for (let i = 0; i < 3; i++) {
        if (x[i] > y[i]) return 1;
        if (x[i] < y[i]) return -1;
      }
      return 0;
    }
    
    function aceptaCaret(rango, version) {
      const base = rango.replace("^", "");
      const mismoMayor = base.split(".")[0] === version.split(".")[0];
      return mismoMayor && compararVersiones(version, base) >= 0;
    }
    
    function agregarScript(pkg, nombre, comando) {
      return { ...pkg, scripts: { ...pkg.scripts, [nombre]: comando } };
    }

    💡 🏁 Reto extra (opcional)

    Escribe actualizarMenor(rango) que reciba "^1.2.0" y devuelva "^1.3.0" (sube el número MENOR en uno y pone el PARCHE a 0).