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)
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
- 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
- 03 Código: los extractos, con ruta del archivo, números de línea y repositorio
- 04 Tests: los 4 asserts del archivo de pruebas del conversor, ejecutados en tu navegador
- 05 Certificados: JavaScript y Backend Development and APIs
JavaScript (verificado)
Ver la prueba
Afirmación
JavaScript
✓ Verificado
Pruebas
- freeCodeCamp: JavaScript · freecodecamp · comprobado el 29 de septiembre de 2026Emitido el 31 ago 2026. Comprobado en la API pública de freeCodeCamp.
- back-end-development-and-apis (fork) · github · comprobado el 28 de septiembre de 2026Fork del repositorio de freeCodeCamp con un commit del propio Danilo con sus soluciones de los talleres.
- Código fuente del conversor de mayúsculas y minúsculas: las cuatro funciones (build-a-case-converter/case_converter/index.js, líneas 1–20) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Pruebas del conversor de mayúsculas y minúsculas: cuatro comprobaciones assert.strictEqual (build-a-case-converter/case_converter/index.test.js, líneas 1–18) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Código fuente del comprobador de números primos: isPrime (build-a-prime-number-checker-module/index.js, líneas 1–11) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
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
Afirmación
Node.js y API (fundamentos de back-end)
✓ Verificado
Pruebas
- freeCodeCamp: Backend Development and APIs · freecodecamp · comprobado el 29 de septiembre de 2026Emitido el 27 sept 2026. Comprobado en la API pública de freeCodeCamp.
- back-end-development-and-apis (fork) · github · comprobado el 28 de septiembre de 2026Fork del repositorio de freeCodeCamp con un commit del propio Danilo con sus soluciones de los talleres.
- Código fuente de las rutas protegidas con JWT: registro e inicio de sesión con bcrypt y JWT (build-jwt-protected-routes/routes/auth.js, líneas 11–52) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Código fuente de la Bank API: la ruta de transferencia y sus comprobaciones (build-a-bank-api/server.js, líneas 30–71) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
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
Afirmación
Escribí el código de los ejercicios de freeCodeCamp que se muestra en las páginas de habilidades.
Declarado por Danilo
Pruebas
- Código fuente del conversor de mayúsculas y minúsculas: las cuatro funciones (build-a-case-converter/case_converter/index.js, líneas 1–20) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Pruebas del conversor de mayúsculas y minúsculas: cuatro comprobaciones assert.strictEqual (build-a-case-converter/case_converter/index.test.js, líneas 1–18) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Código fuente del comprobador de números primos: isPrime (build-a-prime-number-checker-module/index.js, líneas 1–11) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Código fuente de las rutas protegidas con JWT: registro e inicio de sesión con bcrypt y JWT (build-jwt-protected-routes/routes/auth.js, líneas 11–52) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Código fuente de la Bank API: la ruta de transferencia y sus comprobaciones (build-a-bank-api/server.js, líneas 30–71) · manual · comprobado el 2 de octubre de 2026Del commit a3d68af (26 sept 2026) de zurukzuruk1 en el repositorio back-end-development-and-apis. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
- Base de datos de cuerpos celestes: el archivo SQL completo (universe.sql, líneas 1–464) · manual · comprobado el 2 de octubre de 2026Del commit c2b1392 (18 sept 2026) de zurukzuruk1 en el repositorio celestial-bodies-database. Copiado entero el 02/10/2026 (finales de línea normalizados).
- Agenda de citas para una peluquería: el archivo SQL completo (salon.sql, líneas 1–267) · manual · comprobado el 2 de octubre de 2026Del commit 5c04648 (25 sept 2026) de zurukzuruk1 en el repositorio salon-appointment-scheduler. Copiado entero el 02/10/2026 (finales de línea normalizados).
- Agenda de citas para una peluquería: las líneas de consulta del script (salon.sh, líneas 14–57) · manual · comprobado el 2 de octubre de 2026Del commit 5c04648 (25 sept 2026) de zurukzuruk1 en el repositorio salon-appointment-scheduler. Copiado literalmente el 02/10/2026 (finales de línea normalizados).
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.
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.
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.
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.
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
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
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
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
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
- ✓ superado
caseConverter.getUpperCase("hello free Code Camp!")línea 3 · esperado"HELLO FREE CODE CAMP!"· obtenido"HELLO FREE CODE CAMP!" - ✓ superado
caseConverter.getLowerCase("hello free Code Camp!")línea 7 · esperado"hello free code camp!"· obtenido"hello free code camp!" - ✓ superado
caseConverter.getProperCase("hello free Code Camp!")línea 11 · esperado"Hello Free Code Camp!"· obtenido"Hello Free Code Camp!" - ✓ superado
caseConverter.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.
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
Certificados
Las dos certificaciones de freeCodeCamp detrás de esta página, cada una en su página pública del certificado.
JavaScript
Nivel de prueba: Prueba existente
Backend Development and APIs
Nivel de prueba: Prueba existente
Abrir el certificado freeCodeCamp: Backend Development and APIs