feat(curriculum): JS checkpoint cert (#62188)

Co-authored-by: moT01 <20648924+moT01@users.noreply.github.com>
This commit is contained in:
Huyen Nguyen
2025-10-04 00:50:59 +07:00
committed by GitHub
parent 1a6fdad624
commit 034d6b1569
15 changed files with 1496 additions and 19 deletions
+14
View File
@@ -33,6 +33,7 @@ const takeHomeBase = '/learn/coding-interview-prep/take-home-projects';
const foundationalCSharpBase =
'/learn/foundational-c-sharp-with-microsoft/foundational-c-sharp-with-microsoft-certification-exam';
const fullStackDeveloperBase = '/learn/full-stack-developer';
const jsV9Base = '/learn/javascript-v9';
const a2EnglishBase = '/learn/a2-english-for-developers';
const b1EnglishBase = '/learn/b1-english-for-developers';
const a2SpanishBase = '/learn/a2-professional-spanish';
@@ -813,6 +814,19 @@ const allStandardCerts = [
}
]
},
{
id: '68c4069c1ef859270e17c495',
title: 'JavaScript',
certSlug: Certification.JsV9,
projects: [
{
id: '645147516c245de4d11eb7ba',
title: 'JavaScript Certification Exam',
link: `${jsV9Base}/exam-javascript-certification/exam-javascript-certification`,
certSlug: Certification.JsV9
}
]
},
{
id: '651dd7e01d697d0aab7833b7',
title: 'A2 English for Developers',
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -52,7 +52,8 @@ const iconMap = {
[SuperBlocks.BasicHtml]: Code,
[SuperBlocks.SemanticHtml]: Code,
[SuperBlocks.FullStackOpen]: Code,
[SuperBlocks.DevPlayground]: Code
[SuperBlocks.DevPlayground]: Code,
[SuperBlocks.JsV9]: JavaScriptIcon
};
type SuperBlockIconProps = {
@@ -89,6 +89,7 @@ const createCertifiedMap = ({
// be rendered. The new FullStackDeveloper certification is a normal
// certification with projects.
[Certification.FullStackDeveloper]: false,
[Certification.JsV9]: false,
[Certification.A2English]: false,
[Certification.B1English]: false,
[Certification.A2Spanish]: false,
@@ -0,0 +1,14 @@
---
title: JavaScript Certification
superBlock: javascript-v9
certification: javascript-v9
---
## Introduction to JavaScript Certification
This course teaches you core JavaScript programming concepts such as working with variables, functions, objects, arrays, and control flow. You'll also learn how to manipulate the DOM, handle events, and apply techniques like asynchronous programming, functional programming, and accessibility best practices.
To earn your JavaScript Certification:
- Complete the five required projects to qualify for the certification exam.
- Pass the JavaScript Certification exam.
@@ -10,6 +10,7 @@ import DropDown from '../../../assets/icons/dropdown';
import fullStackCert from '../../../../../curriculum/structure/superblocks/full-stack-developer.json';
import fullStackOpen from '../../../../../curriculum/structure/superblocks/full-stack-open.json';
import a1Spanish from '../../../../../curriculum/structure/superblocks/a1-professional-spanish.json';
import javascriptV9 from '../../../../../curriculum/structure/superblocks/javascript-v9.json';
import { ChapterIcon } from '../../../assets/chapter-icon';
import { type Chapter } from '../../../../../shared-dist/config/chapters';
@@ -189,6 +190,8 @@ export const SuperBlockAccordion = ({
return fullStackCert;
case SuperBlocks.A1Spanish:
return a1Spanish;
case SuperBlocks.JsV9:
return javascriptV9;
default:
throw new Error("The SuperBlock structure hasn't been imported.");
}
@@ -287,7 +290,9 @@ export const SuperBlockAccordion = ({
<Chapter
key={chapter.name}
dashedName={chapter.name}
isExpanded={expandedChapter === chapter.name}
isExpanded={
expandedChapter === chapter.name || allChapters.length === 1
}
comingSoon={chapter.comingSoon}
totalSteps={chapterStepIds.length}
completedSteps={completedStepsInChapter}
+2 -1
View File
@@ -16,7 +16,8 @@ const idToPath = new Map(
'561add10cb82ac38a17213bd': Certification.LegacyFullStack,
'5e44431b903586ffb414c951': Certification.SciCompPy,
'5e46fc95ac417301a38fb934': Certification.DataAnalysisPy,
'5e46fc95ac417301a38fb935': Certification.MachineLearningPy
'5e46fc95ac417301a38fb935': Certification.MachineLearningPy,
'68c4069c1ef859270e17c495': Certification.JsV9
})
);
+2 -1
View File
@@ -191,7 +191,8 @@ const superBlockNames = {
'semantic-html': 'semantic-html',
'a1-professional-chinese': 'a1-professional-chinese',
'dev-playground': 'dev-playground',
'full-stack-open': 'full-stack-open'
'full-stack-open': 'full-stack-open',
'javascript-v9': 'javascript-v9'
};
const superBlockToFilename = Object.entries(superBlockNames).reduce(
@@ -0,0 +1,18 @@
---
id: 68c462d7dc707f3ca82f8e6d
title: JavaScript Certification Exam
challengeType: 30
dashedName: exam-javascript-certification
---
# --description--
Start your exam in the exam environment app.
# --instructions--
# --hints--
# --seed--
# --solutions--
@@ -0,0 +1,8 @@
---
id: 68c4069c1ef859270e17c495
title: JavaScript Certification
certification: javascript-v9
challengeType: 7
tests:
- id: 68c462d7dc707f3ca82f8e6d
title: JavaScript Certification Exam
@@ -0,0 +1,14 @@
{
"name": "JavaScript Certification Exam",
"isUpcomingChange": true,
"dashedName": "exam-javascript-certification",
"helpCategory": "JavaScript",
"blockType": "exam",
"blockLayout": "link",
"challengeOrder": [
{
"id": "68c462d7dc707f3ca82f8e6d",
"title": "JavaScript Certification Exam"
}
]
}
+4 -2
View File
@@ -30,7 +30,8 @@
"semantic-html",
"a1-professional-chinese",
"dev-playground",
"full-stack-open"
"full-stack-open",
"javascript-v9"
],
"certifications": [
"a2-english-for-developers",
@@ -57,6 +58,7 @@
"relational-database",
"responsive-web-design",
"scientific-computing-with-python",
"a1-professional-chinese"
"a1-professional-chinese",
"javascript-v9"
]
}
@@ -0,0 +1,305 @@
{
"chapters": [
{
"dashedName": "javascript",
"modules": [
{
"dashedName": "javascript-variables-and-strings",
"blocks": [
"lecture-introduction-to-javascript",
"workshop-greeting-bot",
"lab-javascript-trivia-bot",
"lab-sentence-maker",
"lecture-working-with-data-types",
"review-javascript-variables-and-data-types",
"quiz-javascript-variables-and-data-types",
"lecture-working-with-strings-in-javascript",
"workshop-teacher-chatbot",
"lecture-working-with-string-character-methods",
"lecture-working-with-string-search-and-slice-methods",
"lecture-working-with-string-formatting-methods",
"lecture-working-with-string-modification-methods",
"review-javascript-strings",
"quiz-javascript-strings"
]
},
{
"dashedName": "javascript-booleans-and-numbers",
"blocks": [
"lecture-working-with-numbers-and-arithmetic-operators",
"lecture-working-with-operator-behavior",
"lecture-working-with-comparison-and-boolean-operators",
"lecture-working-with-unary-and-bitwise-operators",
"lecture-working-with-conditional-logic-and-math-methods",
"workshop-mathbot",
"lab-fortune-teller",
"lecture-working-with-numbers-and-common-number-methods",
"review-javascript-math",
"quiz-javascript-math",
"lecture-understanding-comparisons-and-conditionals",
"review-javascript-comparisons-and-conditionals",
"quiz-javascript-comparisons-and-conditionals"
]
},
{
"dashedName": "javascript-functions",
"blocks": [
"lecture-working-with-functions",
"workshop-calculator",
"lab-boolean-check",
"lab-email-masker",
"workshop-loan-qualification-checker",
"lab-celsius-to-fahrenheit-converter",
"lab-counting-cards",
"lab-leap-year-calculator",
"lab-truncate-string",
"lab-string-ending-checker",
"review-javascript-functions",
"quiz-javascript-functions"
]
},
{
"dashedName": "javascript-arrays",
"blocks": [
"lecture-working-with-arrays",
"workshop-shopping-list",
"lab-lunch-picker-program",
"lab-golf-score-translator",
"lab-reverse-a-string",
"lecture-working-with-common-array-methods",
"review-javascript-arrays",
"quiz-javascript-arrays"
]
},
{
"dashedName": "javascript-objects",
"blocks": [
"lecture-introduction-to-javascript-objects-and-their-properties",
"lecture-working-with-json",
"lecture-working-with-optional-chaining-and-object-destructuring",
"workshop-recipe-tracker",
"lab-quiz-game",
"lab-record-collection",
"review-javascript-objects",
"quiz-javascript-objects"
]
},
{
"dashedName": "javascript-loops",
"blocks": [
"lecture-working-with-loops",
"workshop-sentence-analyzer",
"lab-longest-word-in-a-string",
"lab-factorial-calculator",
"lab-mutations",
"lab-chunky-monkey",
"lab-profile-lookup",
"lab-repeat-a-string",
"review-javascript-loops",
"quiz-javascript-loops"
]
},
{
"dashedName": "review-javascript-fundamentals",
"blocks": [
"lecture-working-with-types-and-objects",
"lecture-working-with-arrays-variables-and-naming-practices",
"lecture-working-with-code-quality-and-execution-concepts",
"lab-largest-number-finder",
"lab-first-element-finder",
"lab-slice-and-splice",
"lab-pyramid-generator",
"lab-gradebook-app",
"lecture-the-var-keyword-and-hoisting",
"lab-falsy-remover",
"lab-inventory-management-program",
"lecture-understanding-modules-imports-and-exports",
"lab-password-generator",
"lab-sum-all-numbers-algorithm",
"lab-html-entitiy-converter",
"lab-optional-arguments-sum-function",
"review-javascript-fundamentals",
"quiz-javascript-fundamentals"
]
},
{
"dashedName": "higher-order-functions-and-callbacks",
"blocks": [
"lecture-working-with-higher-order-functions-and-callbacks",
"workshop-library-manager",
"lab-book-organizer",
"lab-sorted-index-finder",
"lab-symmetric-difference",
"review-javascript-higher-order-functions",
"quiz-javascript-higher-order-functions"
]
},
{
"dashedName": "dom-manipulation-and-events",
"blocks": [
"lecture-working-with-the-dom-click-events-and-web-apis",
"workshop-storytelling-app",
"lab-favorite-icon-toggler",
"lecture-understanding-the-event-object-and-event-delegation",
"workshop-music-instrument-filter",
"lab-real-time-counter",
"lab-lightbox-viewer",
"workshop-rps-game",
"lab-football-team-cards",
"review-dom-manipulation-and-click-events-with-javascript",
"quiz-dom-manipulation-and-click-event-with-javascript"
]
},
{
"dashedName": "js-a11y",
"blocks": [
"lecture-understanding-aria-expanded-aria-live-and-common-aria-states",
"workshop-planets-tablist",
"workshop-note-taking-app",
"lab-theme-switcher",
"review-js-a11y",
"quiz-js-a11y"
]
},
{
"dashedName": "debugging-javascript",
"blocks": [
"lecture-debugging-techniques",
"lab-random-background-color-changer",
"review-debugging-javascript",
"quiz-debugging-javascript"
]
},
{
"dashedName": "basic-regex",
"blocks": [
"lecture-working-with-regular-expressions",
"workshop-spam-filter",
"lab-palindrome-checker",
"lab-regex-sandbox",
"review-javascript-regular-expressions",
"quiz-javascript-regular-expressions"
]
},
{
"dashedName": "lab-markdown-to-html-converter",
"blocks": ["lab-markdown-to-html-converter"]
},
{
"dashedName": "form-validation",
"blocks": [
"lecture-understanding-form-validation",
"workshop-calorie-counter",
"lab-customer-complaint-form",
"review-form-validation-with-javascript",
"quiz-form-validation-with-javascript"
]
},
{
"dashedName": "javascript-dates",
"blocks": [
"lecture-working-with-dates",
"lab-date-conversion",
"review-javascript-dates",
"quiz-javascript-dates"
]
},
{
"dashedName": "audio-and-video-events",
"blocks": [
"lecture-working-with-audio-and-video",
"workshop-music-player",
"review-javascript-audio-and-video",
"quiz-javascript-audio-and-video"
]
},
{
"dashedName": "lab-drum-machine",
"blocks": ["lab-drum-machine"]
},
{
"dashedName": "maps-and-sets",
"blocks": [
"lecture-working-with-maps-and-sets",
"workshop-plant-nursery-catalog",
"lab-voting-system",
"review-javascript-maps-and-sets",
"quiz-javascript-maps-and-sets"
]
},
{
"dashedName": "lab-voting-system",
"blocks": ["lab-voting-system"]
},
{
"dashedName": "localstorage-and-crud-operations",
"blocks": [
"lecture-working-with-client-side-storage-and-crud-operations",
"workshop-todo-app",
"lab-bookmark-manager-app",
"review-local-storage-and-crud",
"quiz-local-storage-and-crud"
]
},
{
"dashedName": "classes-and-the-this-keyword",
"blocks": [
"lecture-understanding-how-to-work-with-classes-in-javascript",
"workshop-shopping-cart",
"lab-project-idea-board",
"review-javascript-classes",
"quiz-javascript-classes"
]
},
{
"dashedName": "lab-bank-account-manager",
"blocks": ["lab-bank-account-manager"]
},
{
"dashedName": "recursion",
"blocks": [
"lecture-understanding-recursion-and-the-call-stack",
"workshop-decimal-to-binary-converter",
"lab-permutation-generator",
"review-recursion",
"quiz-recursion"
]
},
{
"dashedName": "functional-programming",
"blocks": [
"lecture-understanding-functional-programming",
"workshop-recipe-ingredient-converter",
"lab-sorting-visualizer",
"review-javascript-functional-programming",
"quiz-javascript-functional-programming"
]
},
{
"dashedName": "asynchronous-javascript",
"blocks": [
"lecture-understanding-asynchronous-programming",
"workshop-fcc-authors-page",
"lab-fcc-forum-leaderboard",
"review-asynchronous-javascript",
"quiz-asynchronous-javascript"
]
},
{
"dashedName": "lab-weather-app",
"blocks": ["lab-weather-app"]
},
{
"moduleType": "review",
"dashedName": "review-javascript",
"blocks": ["review-javascript"]
},
{
"dashedName": "javascript-certification-exam",
"comingSoon": true,
"blocks": ["exam-javascript-certification"]
}
]
}
]
}
+6 -1
View File
@@ -27,6 +27,7 @@ export enum Certification {
FoundationalCSharp = 'foundational-c-sharp-with-microsoft',
// Upcoming certifications
FullStackDeveloper = 'full-stack-developer-v9',
JsV9 = 'javascript-v9',
A2English = 'a2-english-for-developers-v8',
B1English = 'b1-english-for-developers-v8',
A2Spanish = 'a2-professional-spanish-v8',
@@ -79,6 +80,7 @@ export const legacyFullStackCertification = [
// showUpcomingChanges is true.
export const upcomingCertifications = [
Certification.FullStackDeveloper,
Certification.JsV9,
Certification.A2English,
Certification.B1English,
Certification.A2Spanish,
@@ -127,7 +129,8 @@ export const certIds = {
relationalDatabaseV8Id: '606243f50267e718b1e755f4',
collegeAlgebraPyV8Id: '61531b20cc9dfa2741a5b800',
foundationalCSharpV8Id: '647f7da207d29547b3bee1ba',
jsAlgoDataStructV8Id: '658180220947283cdc0689ce'
jsAlgoDataStructV8Id: '658180220947283cdc0689ce',
javascriptV9Id: '68c4069c1ef859270e17c495'
};
export const completionHours = {
@@ -274,6 +277,7 @@ export const superBlockToCertMap: {
[SuperBlocks.RespWebDesignNew]: Certification.RespWebDesign,
[SuperBlocks.JsAlgoDataStruct]: Certification.JsAlgoDataStruct,
[SuperBlocks.FullStackDeveloper]: Certification.FullStackDeveloper,
[SuperBlocks.JsV9]: Certification.JsV9,
[SuperBlocks.A2English]: Certification.A2English,
[SuperBlocks.B1English]: Certification.B1English,
[SuperBlocks.A1Spanish]: null,
@@ -313,6 +317,7 @@ export const linkedInCredentialIds = {
[Certification.CollegeAlgebraPy]: 'cawp',
[Certification.FoundationalCSharp]: 'fcswm',
[Certification.FullStackDeveloper]: 'fsd',
[Certification.JsV9]: 'js',
[Certification.JsAlgoDataStructNew]: 'jaads',
[Certification.A2English]: 'a2efd',
[Certification.B1English]: 'b1efd',
+25 -12
View File
@@ -34,7 +34,8 @@ export enum SuperBlocks {
BasicHtml = 'basic-html',
SemanticHtml = 'semantic-html',
DevPlayground = 'dev-playground',
FullStackOpen = 'full-stack-open'
FullStackOpen = 'full-stack-open',
JsV9 = 'javascript-v9'
}
export const languageSuperBlocks = [
@@ -120,6 +121,7 @@ export const superBlockStages: StageMap = {
[SuperBlockStage.Next]: [],
[SuperBlockStage.Upcoming]: [
SuperBlocks.FullStackOpen,
SuperBlocks.JsV9,
SuperBlocks.A1Spanish,
SuperBlocks.A2Spanish,
SuperBlocks.A2Chinese,
@@ -164,7 +166,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.Chinese]: [
SuperBlocks.CodingInterviewPrep,
@@ -180,7 +183,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.ChineseTraditional]: [
SuperBlocks.CodingInterviewPrep,
@@ -196,7 +200,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.Italian]: [
SuperBlocks.FoundationalCSharp,
@@ -212,7 +217,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.Portuguese]: [
SuperBlocks.JsAlgoDataStructNew,
@@ -226,7 +232,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.Ukrainian]: [
SuperBlocks.JsAlgoDataStructNew,
@@ -239,7 +246,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A1Chinese,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.Japanese]: [
SuperBlocks.JsAlgoDataStructNew,
@@ -253,7 +261,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.A1Chinese,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.German]: [
SuperBlocks.RelationalDb,
@@ -276,7 +285,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.Swahili]: [
SuperBlocks.DataVis,
@@ -306,7 +316,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.PythonForEverybody,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
],
[Languages.Korean]: [
SuperBlocks.RespWebDesignNew,
@@ -337,7 +348,8 @@ export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
SuperBlocks.RosettaCode,
SuperBlocks.BasicHtml,
SuperBlocks.SemanticHtml,
SuperBlocks.DevPlayground
SuperBlocks.DevPlayground,
SuperBlocks.JsV9
]
};
@@ -346,7 +358,8 @@ Object.freeze(notAuditedSuperBlocks);
export const chapterBasedSuperBlocks = [
SuperBlocks.FullStackDeveloper,
SuperBlocks.FullStackOpen,
SuperBlocks.A1Spanish
SuperBlocks.A1Spanish,
SuperBlocks.JsV9
];
Object.freeze(chapterBasedSuperBlocks);