Danilo Alessandro Vinciprova

Danilo Alessandro Vinciprova

AI-Assisted Web Developer · React · Next.js · Claude Code

Aprendí a pensar en construir como en piezas que tienen que encajar entre sí.

Habilidad 01 / 03

JavaScript y Node.js

Ejecuta en tu navegador dos módulos de ejercicios desde sus propios archivos, y después el archivo de pruebas real del conversor.

  • JavaScript(verificado)
  • Node.js y API (fundamentos de back-end)(verificado)
(verificado) marca una habilidad verificada

Resumen

Código de ejercicios del curso de back-end de freeCodeCamp, tomado literalmente de mi repositorio público. Dos de sus módulos se ejecutan aquí, en tu navegador, desde el mismo texto del archivo que se muestra en la vista Código, y también el archivo de pruebas del conversor.

En esta página

  1. 02 Pruébalo: el conversor de mayúsculas y minúsculas y el comprobador de números primos, ejecutados en tu navegador desde sus archivos; y el validador de afirmaciones del sitio
  2. 03 Código: los extractos, con ruta del archivo, números de línea y repositorio
  3. 04 Tests: los 4 asserts del archivo de pruebas del conversor, ejecutados en tu navegador
  4. 05 Certificados: JavaScript y Backend Development and APIs

JavaScript (verificado)

Ver la prueba
  1. Afirmación

    JavaScript

    ✓ Verificado

  2. Pruebas

  3. Resultado

    Certificación JavaScript de freeCodeCamp, y código JavaScript público en GitHub.

Node.js y API (fundamentos de back-end) (verificado)

Ver la prueba
  1. Afirmación

    Node.js y API (fundamentos de back-end)

    ✓ Verificado

  2. Pruebas

  3. Resultado

    Certificación Backend Development and APIs de freeCodeCamp, y un repositorio público con un commit del propio Danilo con sus soluciones de los talleres.

Quién escribió este código

“Escribí el código de los ejercicios de freeCodeCamp que se muestra en las páginas de habilidades.”

Ver la prueba
  1. Afirmación

    Escribí el código de los ejercicios de freeCodeCamp que se muestra en las páginas de habilidades.

    Declarado por Danilo

  2. Pruebas

  3. Resultado

    El código está copiado literalmente de repositorios públicos, donde los commits los hizo la cuenta de GitHub de Danilo (zurukzuruk1). Que lo escribiera él mismo es una declaración suya del 2 oct 2026.

Pruébalo

Cada recuadro ejecuta el propio archivo del ejercicio: el texto que se muestra en la vista Código, comprobado frente a su sha256, se ejecuta aquí con un pequeño shim de module / require.

Conversor de mayúsculas y minúsculas

Nivel de prueba: Prueba existente · ejecutado en directo

Las cuatro funciones que exporta build-a-case-converter/case_converter/index.js.

getUpperCase
"THE CODE YOU SEE IS THE CODE THAT RUNS"
getLowerCase
"the code you see is the code that runs"
getSentenceCase
"The code you see is the code that runs"
getProperCase
"The Code You See Is The Code That Runs"

Calculado al compilar ejecutando build-a-case-converter/case_converter/index.js en Node.

Comprobador de números primos

Nivel de prueba: Prueba existente · ejecutado en directo

La función isPrime que exporta build-a-prime-number-checker-module/index.js.

isPrime(97)
true

Calculado al compilar ejecutando build-a-prime-number-checker-module/index.js en Node.

Ejemplos calculados al compilar (Node): isPrime(1) → false, isPrime(2) → true, isPrime(21) → false, isPrime(97) → true, isPrime(7919) → true.

Validador de afirmaciones

Nivel de prueba: Demostración interactiva · Hecho para este CV

No es un ejercicio: es el validador que comprueba cada afirmación de este sitio. Cada afirmación necesita un ID, una categoría y un estado válidos y solo IDs de pruebas existentes, y “verified” necesita pruebas verificadas; cualquier error detiene la compilación. Intenta romper una regla.

Rechazada: 1 error, así que la compilación se detendría.
  • claim "c-sample-claim" is marked verified but has no verified evidence

Resultado calculado al compilar por lib/validate.ts para el ejemplo de arriba.

Código

Extractos literales de los archivos de los ejercicios, con su ruta y sus números de línea en el repositorio. Cada uno se comprueba frente al sha256 registrado con su afirmación al generar el sitio.

build-a-case-converter/case_converter/index.js líneas 1–20

function getUpperCase(str) {
  return str.toUpperCase();
}
function getLowerCase(str) {
  return str.toLowerCase();
}
function getSentenceCase(str) {
  const lowerStr = getLowerCase(str);
  return lowerStr.charAt(0).toUpperCase() + lowerStr.slice(1);
}
function getProperCase(str) {
  const properCaseArr = str.split(" ").map((word) => getSentenceCase(word));
  return properCaseArr.join(" ");
}
module.exports = {
  getProperCase,
  getLowerCase,
  getUpperCase,
  getSentenceCase,
};

Nivel de prueba: Prueba existente

Código fuente del conversor de mayúsculas y minúsculas: las cuatro funciones · copiado el 2 de octubre de 2026 · sha256 471824d6839f…

build-a-prime-number-checker-module/index.js líneas 1–11

function isPrime(n) {
  if (!Number.isInteger(n) || n < 2) return false;
  if (n < 4) return true;
  if (n % 2 === 0 || n % 3 === 0) return false;
  for (let i = 5; i * i <= n; i += 6) {
    if (n % i === 0 || n % (i + 2) === 0) return false;
  }
  return true;
}

module.exports = { isPrime };

Nivel de prueba: Prueba existente

Código fuente del comprobador de números primos: isPrime · copiado el 2 de octubre de 2026 · sha256 68ec2374d9f5…

build-jwt-protected-routes/routes/auth.js líneas 11–52

router.post("/register", async (req, res) => {
  const { email, password } = req.body;
  if (!email || !password) {
    return res.status(400).json({ message: "Email and password are required" });
  }
  if (findByEmail(email)) {
    return res.status(409).json({ message: "Email already in use" });
  }
  const passwordHash = await bcrypt.hash(password, 10);
  const users = readUsers();
  const newUser = {
    id: randomUUID(),
    email,
    passwordHash,
    role: "user",
  };
  users.push(newUser);
  writeUsers(users);
  const token = signToken({
    id: newUser.id,
    email: newUser.email,
    role: newUser.role,
  });
  res.status(201).json({ message: "User registered successfully", token });
});

router.post("/login", async (req, res) => {
  const { email, password } = req.body;
  if (!email || !password) {
    return res.status(400).json({ message: "Email and password are required" });
  }
  const user = findByEmail(email);
  if (!user) {
    return res.status(401).json({ message: "Invalid credentials" });
  }
  const match = await bcrypt.compare(password, user.passwordHash);
  if (!match) {
    return res.status(401).json({ message: "Invalid credentials" });
  }
  const token = signToken({ id: user.id, email: user.email, role: user.role });
  res.json({ message: "Login successful", token });
});

Nivel de prueba: Prueba existente

Código fuente de las rutas protegidas con JWT: registro e inicio de sesión con bcrypt y JWT · copiado el 2 de octubre de 2026 · sha256 5e57b1c359f5…

build-a-bank-api/server.js líneas 30–71

app.post("/transfer", async (req, res) => {
  const { fromId, toId, amount } = req.body;
  if (!fromId || !toId || !amount) {
    const err = new Error("Missing required fields: fromId, toId, amount");
    err.status = 400;
    throw err;
  }
  if (amount <= 0) {
    const err = new Error("Transfer amount must be positive");
    err.status = 400;
    throw err;
  }
  const accounts = await getAccounts();
  const sender = accounts.find((a) => a.id === fromId);
  if (!sender) {
    const err = new Error("Sender account not found");
    err.status = 404;
    throw err;
  }
  const recipient = accounts.find((a) => a.id === toId);
  if (!recipient) {
    const err = new Error("Recipient account not found");
    err.status = 404;
    throw err;
  }
  if (sender.balance < amount) {
    const err = new Error("Insufficient funds");
    err.status = 409;
    throw err;
  }
  sender.balance -= amount;
  recipient.balance += amount;
  await saveAccounts(accounts);
  res.json({
    message: "Transfer successful",
    senderName: sender.owner,
    recipientName: recipient.owner,
    amountTransferred: amount,
    senderNewBalance: sender.balance,
    recipientNewBalance: recipient.balance,
  });
});

Nivel de prueba: Prueba existente

Código fuente de la Bank API: la ruta de transferencia y sus comprobaciones · copiado el 2 de octubre de 2026 · sha256 b947b7c25920…

Tests

El propio archivo de pruebas del conversor: 4 comprobaciones assert.strictEqual. Se ejecutan aquí contra index.js, con un assert mínimo que registra cada resultado.

Resultados de las pruebas

Nivel de prueba: Prueba existente · ejecutado en directo

4 de 4 asserts superados
  1. ✓ superadocaseConverter.getUpperCase("hello free Code Camp!")línea 3 · esperado "HELLO FREE CODE CAMP!" · obtenido "HELLO FREE CODE CAMP!"
  2. ✓ superadocaseConverter.getLowerCase("hello free Code Camp!")línea 7 · esperado "hello free code camp!" · obtenido "hello free code camp!"
  3. ✓ superadocaseConverter.getProperCase("hello free Code Camp!")línea 11 · esperado "Hello Free Code Camp!" · obtenido "Hello Free Code Camp!"
  4. ✓ superadocaseConverter.getSentenceCase("hello free Code Camp!")línea 15 · esperado "Hello free code camp!" · obtenido "Hello free code camp!"

Calculado al compilar ejecutando build-a-case-converter/case_converter/index.test.js en Node.

build-a-case-converter/case_converter/index.test.js líneas 1–18

const assert = require("node:assert/strict");
const caseConverter = require("./index");
assert.strictEqual(
  caseConverter.getUpperCase("hello free Code Camp!"),
  "HELLO FREE CODE CAMP!",
);
assert.strictEqual(
  caseConverter.getLowerCase("hello free Code Camp!"),
  "hello free code camp!",
);
assert.strictEqual(
  caseConverter.getProperCase("hello free Code Camp!"),
  "Hello Free Code Camp!",
);
assert.strictEqual(
  caseConverter.getSentenceCase("hello free Code Camp!"),
  "Hello free code camp!",
);

Nivel de prueba: Prueba existente

Pruebas del conversor de mayúsculas y minúsculas: cuatro comprobaciones assert.strictEqual · copiado el 2 de octubre de 2026 · sha256 a826fae271d0…

Certificados

Las dos certificaciones de freeCodeCamp detrás de esta página, cada una en su página pública del certificado.