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)
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
- 02 Try it: the case converter and the prime checker, run in your browser from their own files; and the site's claim validator
- 03 Code: the excerpts, with file path, line numbers and repository
- 04 Tests: the 4 asserts of the case converter's test file, run in your browser
- 05 Certificates: JavaScript and Backend Development and APIs
JavaScript (verified)
See proof
Claim
JavaScript
✓ Verified
Evidence
- freeCodeCamp: JavaScript · freecodecamp · checked 29 September 2026Issued 31 Aug 2026. Checked on the public freeCodeCamp API.
- back-end-development-and-apis (fork) · github · checked 28 September 2026Fork of the freeCodeCamp repository with Danilo's own commit of workshop solutions.
- Case converter source: the four case functions (build-a-case-converter/case_converter/index.js, lines 1–20) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
- Case converter test: four assert.strictEqual checks (build-a-case-converter/case_converter/index.test.js, lines 1–18) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
- Prime number checker source: isPrime (build-a-prime-number-checker-module/index.js, lines 1–11) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
Result
freeCodeCamp JavaScript certification, and public JavaScript code on GitHub.
Node.js and APIs (back-end fundamentals) (verified)
See proof
Claim
Node.js and APIs (back-end fundamentals)
✓ Verified
Evidence
- freeCodeCamp: Backend Development and APIs · freecodecamp · checked 29 September 2026Issued 27 Sep 2026. Checked on the public freeCodeCamp API.
- back-end-development-and-apis (fork) · github · checked 28 September 2026Fork of the freeCodeCamp repository with Danilo's own commit of workshop solutions.
- JWT-protected routes source: register and login with bcrypt and JWT (build-jwt-protected-routes/routes/auth.js, lines 11–52) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
- Bank API source: the transfer route and its checks (build-a-bank-api/server.js, lines 30–71) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
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
Claim
I wrote the freeCodeCamp exercise code shown on the Skills pages.
Stated by Danilo
Evidence
- Case converter source: the four case functions (build-a-case-converter/case_converter/index.js, lines 1–20) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
- Case converter test: four assert.strictEqual checks (build-a-case-converter/case_converter/index.test.js, lines 1–18) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
- Prime number checker source: isPrime (build-a-prime-number-checker-module/index.js, lines 1–11) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
- JWT-protected routes source: register and login with bcrypt and JWT (build-jwt-protected-routes/routes/auth.js, lines 11–52) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
- Bank API source: the transfer route and its checks (build-a-bank-api/server.js, lines 30–71) · manual · checked 2 October 2026From commit a3d68af (26 Sep 2026) by zurukzuruk1 in the back-end-development-and-apis repository. Copied verbatim on 02/10/2026 (line endings normalised).
- Celestial bodies database: the whole SQL file (universe.sql, lines 1–464) · manual · checked 2 October 2026From commit c2b1392 (18 Sep 2026) by zurukzuruk1 in the celestial-bodies-database repository. Copied whole on 02/10/2026 (line endings normalised).
- Salon appointment scheduler: the whole SQL file (salon.sql, lines 1–267) · manual · checked 2 October 2026From commit 5c04648 (25 Sep 2026) by zurukzuruk1 in the salon-appointment-scheduler repository. Copied whole on 02/10/2026 (line endings normalised).
- Salon appointment scheduler: the query lines of the script (salon.sh, lines 14–57) · manual · checked 2 October 2026From commit 5c04648 (25 Sep 2026) by zurukzuruk1 in the salon-appointment-scheduler repository. Copied verbatim on 02/10/2026 (line endings normalised).
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.
Prime number checker
Evidence tier: Existing evidence · run live
The isPrime function exported by build-a-prime-number-checker-module/index.js.
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.
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.
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
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
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
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
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
- ✓ pass
caseConverter.getUpperCase("hello free Code Camp!")line 3 · expected"HELLO FREE CODE CAMP!"· got"HELLO FREE CODE CAMP!" - ✓ pass
caseConverter.getLowerCase("hello free Code Camp!")line 7 · expected"hello free code camp!"· got"hello free code camp!" - ✓ pass
caseConverter.getProperCase("hello free Code Camp!")line 11 · expected"Hello Free Code Camp!"· got"Hello Free Code Camp!" - ✓ pass
caseConverter.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.
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
Certificates
The two freeCodeCamp certifications behind this page, each on its public certificate page.
JavaScript
Evidence tier: Existing evidence
Backend Development and APIs
Evidence tier: Existing evidence
Open the certificate freeCodeCamp: Backend Development and APIs