Danilo Alessandro Vinciprova

Danilo Alessandro Vinciprova

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

I learned to think of building as parts that must fit together.

Skill 01 / 03

JavaScript & Node.js

Run two exercise modules in your browser from their own files, then the case converter's real test file.

  • JavaScript(verified)
  • Node.js and APIs (back-end fundamentals)(verified)
(verified) marks a verified skill

Overview

Exercise code from the freeCodeCamp back-end course, taken verbatim from my public repository. Two of its modules run here, in your browser, from the very file text shown in the Code view, and so does the case converter’s own test file.

On this page

  1. 02 Try it: the case converter and the prime checker, run in your browser from their own files; and the site's claim validator
  2. 03 Code: the excerpts, with file path, line numbers and repository
  3. 04 Tests: the 4 asserts of the case converter's test file, run in your browser
  4. 05 Certificates: JavaScript and Backend Development and APIs

JavaScript (verified)

See proof
  1. Claim

    JavaScript

    ✓ Verified

  2. Evidence

  3. Result

    freeCodeCamp JavaScript certification, and public JavaScript code on GitHub.

Node.js and APIs (back-end fundamentals) (verified)

See proof
  1. Claim

    Node.js and APIs (back-end fundamentals)

    ✓ Verified

  2. Evidence

  3. Result

    freeCodeCamp Backend Development and APIs certification, and a public repository with Danilo's own commit of workshop solutions.

Who wrote this code

“I wrote the freeCodeCamp exercise code shown on the Skills pages.”

See proof
  1. Claim

    I wrote the freeCodeCamp exercise code shown on the Skills pages.

    Stated by Danilo

  2. Evidence

  3. Result

    The code is copied verbatim from public repositories, where it was committed by Danilo's GitHub account (zurukzuruk1). That he wrote it himself is his statement of 2 Oct 2026.

Try it

Each box runs the exercise file itself: the text shown in the Code view, checked against its sha256, is executed here with a tiny module / require shim.

Case converter

Evidence tier: Existing evidence · run live

The four functions exported by 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"

Computed at build time by running build-a-case-converter/case_converter/index.js in Node.

Prime number checker

Evidence tier: Existing evidence · run live

The isPrime function exported by build-a-prime-number-checker-module/index.js.

isPrime(97)
true

Computed at build time by running build-a-prime-number-checker-module/index.js in Node.

Build-time samples (Node): isPrime(1) → false, isPrime(2) → true, isPrime(21) → false, isPrime(97) → true, isPrime(7919) → true.

Claim validator

Evidence tier: Interactive demonstration · Built for this CV

Not an exercise: the validator that checks every claim on this site. Every claim needs a valid ID, category and status and only existing evidence IDs, and “verified” needs verified evidence; any error stops the build. Try to break a rule.

Rejected: 1 error, so the build would stop.
  • claim "c-sample-claim" is marked verified but has no verified evidence

Result computed at build time by lib/validate.ts for the sample above.

Code

Verbatim excerpts of the exercise files, with their path and line numbers in the repository. Each one is checked against the sha256 recorded with its claim when the site is built.

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

Evidence tier: Existing evidence

Case converter source: the four case functions · copied 2 October 2026 · sha256 471824d6839f…

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

Evidence tier: Existing evidence

Prime number checker source: isPrime · copied 2 October 2026 · sha256 68ec2374d9f5…

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

Evidence tier: Existing evidence

JWT-protected routes source: register and login with bcrypt and JWT · copied 2 October 2026 · sha256 5e57b1c359f5…

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

Evidence tier: Existing evidence

Bank API source: the transfer route and its checks · copied 2 October 2026 · sha256 b947b7c25920…

Tests

The case converter’s own test file: 4 assert.strictEqual checks. They run here against index.js, with a minimal assert that records each result.

Test results

Evidence tier: Existing evidence · run live

4 of 4 asserts pass
  1. ✓ passcaseConverter.getUpperCase("hello free Code Camp!")line 3 · expected "HELLO FREE CODE CAMP!" · got "HELLO FREE CODE CAMP!"
  2. ✓ passcaseConverter.getLowerCase("hello free Code Camp!")line 7 · expected "hello free code camp!" · got "hello free code camp!"
  3. ✓ passcaseConverter.getProperCase("hello free Code Camp!")line 11 · expected "Hello Free Code Camp!" · got "Hello Free Code Camp!"
  4. ✓ passcaseConverter.getSentenceCase("hello free Code Camp!")line 15 · expected "Hello free code camp!" · got "Hello free code camp!"

Computed at build time by running build-a-case-converter/case_converter/index.test.js in Node.

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

Evidence tier: Existing evidence

Case converter test: four assert.strictEqual checks · copied 2 October 2026 · sha256 a826fae271d0…

Certificates

The two freeCodeCamp certifications behind this page, each on its public certificate page.