Danilo Alessandro Vinciprova

Danilo Alessandro Vinciprova

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

Ho imparato a pensare al costruire come a parti che devono incastrarsi tra loro.

Competenza 01 / 03

JavaScript e Node.js

Esegui nel tuo browser due moduli di esercizi dai loro stessi file, poi il vero file di test del convertitore.

  • JavaScript(verificato)
  • Node.js e API (basi del back-end)(verificato)
(verificato) indica una competenza verificata

Panoramica

Codice di esercizi del corso back-end di freeCodeCamp, preso testualmente dal mio repository pubblico. Due dei suoi moduli girano qui, nel tuo browser, dallo stesso testo del file mostrato nella vista Codice, e così anche il file di test del convertitore.

In questa pagina

  1. 02 Provalo: il convertitore di maiuscole/minuscole e il controllo dei numeri primi, eseguiti nel tuo browser dai loro file; e il validatore delle affermazioni del sito
  2. 03 Codice: gli estratti, con percorso del file, numeri di riga e repository
  3. 04 Test: i 4 assert del file di test del convertitore, eseguiti nel tuo browser
  4. 05 Certificati: JavaScript e Backend Development and APIs

JavaScript (verificato)

Vedi la prova
  1. Affermazione

    JavaScript

    ✓ Verificato

  2. Prove

  3. Risultato

    Certificazione freeCodeCamp JavaScript e codice JavaScript pubblico su GitHub.

Node.js e API (basi del back-end) (verificato)

Vedi la prova
  1. Affermazione

    Node.js e API (basi del back-end)

    ✓ Verificato

  2. Prove

  3. Risultato

    Certificazione freeCodeCamp Backend Development and APIs, e un repository pubblico con un commit di Danilo con le sue soluzioni dei workshop.

Chi ha scritto questo codice

“Ho scritto io il codice degli esercizi freeCodeCamp mostrato nelle pagine delle competenze.”

Vedi la prova
  1. Affermazione

    Ho scritto io il codice degli esercizi freeCodeCamp mostrato nelle pagine delle competenze.

    Dichiarato da Danilo

  2. Prove

  3. Risultato

    Il codice è copiato testualmente da repository pubblici, dove i commit sono stati fatti dall’account GitHub di Danilo (zurukzuruk1). Che l’abbia scritto lui stesso è una sua dichiarazione del 2 ott 2026.

Provalo

Ogni riquadro esegue il file dell’esercizio stesso: il testo mostrato nella vista Codice, controllato rispetto al suo sha256, viene eseguito qui con un piccolo shim module / require.

Convertitore di maiuscole/minuscole

Livello di prova: Prova esistente · eseguito dal vivo

Le quattro funzioni esportate da 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"

Calcolato in fase di build eseguendo build-a-case-converter/case_converter/index.js in Node.

Controllo dei numeri primi

Livello di prova: Prova esistente · eseguito dal vivo

La funzione isPrime esportata da build-a-prime-number-checker-module/index.js.

isPrime(97)
true

Calcolato in fase di build eseguendo build-a-prime-number-checker-module/index.js in Node.

Esempi calcolati in fase di build (Node): isPrime(1) → false, isPrime(2) → true, isPrime(21) → false, isPrime(97) → true, isPrime(7919) → true.

Validatore delle affermazioni

Livello di prova: Dimostrazione interattiva · Costruito per questo CV

Non è un esercizio: è il validatore che controlla ogni affermazione di questo sito. Ogni affermazione ha bisogno di ID, categoria e stato validi e solo di ID di prove esistenti, e “verified” ha bisogno di prove verificate; qualsiasi errore ferma la build. Prova a infrangere una regola.

Rifiutata: 1 errore, quindi la build si fermerebbe.
  • claim "c-sample-claim" is marked verified but has no verified evidence

Risultato calcolato in fase di build da lib/validate.ts per l’esempio qui sopra.

Codice

Estratti testuali dei file degli esercizi, con il loro percorso e i numeri di riga nel repository. Ognuno viene controllato rispetto allo sha256 registrato con la sua affermazione quando il sito viene generato.

build-a-case-converter/case_converter/index.js righe 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,
};

Livello di prova: Prova esistente

Sorgente del convertitore di maiuscole/minuscole: le quattro funzioni · copiato il 2 ottobre 2026 · sha256 471824d6839f…

build-a-prime-number-checker-module/index.js righe 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 };

Livello di prova: Prova esistente

Sorgente del controllo dei numeri primi: isPrime · copiato il 2 ottobre 2026 · sha256 68ec2374d9f5…

build-jwt-protected-routes/routes/auth.js righe 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 });
});

Livello di prova: Prova esistente

Sorgente delle route protette con JWT: registrazione e login con bcrypt e JWT · copiato il 2 ottobre 2026 · sha256 5e57b1c359f5…

build-a-bank-api/server.js righe 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,
  });
});

Livello di prova: Prova esistente

Sorgente della Bank API: la route di trasferimento e i suoi controlli · copiato il 2 ottobre 2026 · sha256 b947b7c25920…

Test

Il file di test del convertitore: 4 controlli assert.strictEqual. Vengono eseguiti qui su index.js, con un assert minimo che registra ogni risultato.

Risultati dei test

Livello di prova: Prova esistente · eseguito dal vivo

4 assert su 4 superati
  1. ✓ superatocaseConverter.getUpperCase("hello free Code Camp!")riga 3 · atteso "HELLO FREE CODE CAMP!" · ottenuto "HELLO FREE CODE CAMP!"
  2. ✓ superatocaseConverter.getLowerCase("hello free Code Camp!")riga 7 · atteso "hello free code camp!" · ottenuto "hello free code camp!"
  3. ✓ superatocaseConverter.getProperCase("hello free Code Camp!")riga 11 · atteso "Hello Free Code Camp!" · ottenuto "Hello Free Code Camp!"
  4. ✓ superatocaseConverter.getSentenceCase("hello free Code Camp!")riga 15 · atteso "Hello free code camp!" · ottenuto "Hello free code camp!"

Calcolato in fase di build eseguendo build-a-case-converter/case_converter/index.test.js in Node.

build-a-case-converter/case_converter/index.test.js righe 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!",
);

Livello di prova: Prova esistente

Test del convertitore di maiuscole/minuscole: quattro controlli assert.strictEqual · copiato il 2 ottobre 2026 · sha256 a826fae271d0…

Certificati

Le due certificazioni freeCodeCamp dietro questa pagina, ognuna sulla sua pagina pubblica del certificato.