mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-09-24 23:01:18 +08:00
feat(curriculum): add content to the 4 new certs (#62659)
Co-authored-by: Oliver Eyton-Williams <ojeytonwilliams@gmail.com> Co-authored-by: moT01 <20648924+moT01@users.noreply.github.com>
This commit is contained in:
co-authored by
Oliver Eyton-Williams
moT01
parent
6bab524f2c
commit
26976b1d81
+4
-10
@@ -5,6 +5,7 @@ const uniq = require('lodash/uniq');
|
||||
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
|
||||
const webpack = require('webpack');
|
||||
|
||||
const { SuperBlocks } = require('../shared-dist/config/curriculum');
|
||||
const env = require('./config/env.json');
|
||||
const {
|
||||
createChallengePages,
|
||||
@@ -182,15 +183,8 @@ exports.createPages = async function createPages({
|
||||
)
|
||||
);
|
||||
|
||||
const superBlocks = uniq(
|
||||
result.data.allChallengeNode.edges.map(
|
||||
({
|
||||
node: {
|
||||
challenge: { superBlock }
|
||||
}
|
||||
}) => superBlock
|
||||
)
|
||||
);
|
||||
// Includes upcoming superBlocks
|
||||
const allSuperBlocks = Object.values(SuperBlocks);
|
||||
|
||||
// Create intro pages
|
||||
// TODO: Remove allMarkdownRemark (populate from elsewhere)
|
||||
@@ -210,7 +204,7 @@ exports.createPages = async function createPages({
|
||||
if (!blocks.includes(frontmatter.block)) {
|
||||
return;
|
||||
}
|
||||
} else if (!superBlocks.includes(frontmatter.superBlock)) {
|
||||
} else if (!allSuperBlocks.includes(frontmatter.superBlock)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -279,10 +279,7 @@ export const SuperBlockAccordion = ({
|
||||
>
|
||||
{chapter.modules.map(module => {
|
||||
if (module.comingSoon && !showUpcomingChanges) {
|
||||
if (
|
||||
module.moduleType === 'review' ||
|
||||
module.moduleType === 'exam'
|
||||
) {
|
||||
if (module.moduleType === 'review') {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -480,6 +480,9 @@ export function transformSuperBlock(
|
||||
{ showComingSoon } = { showComingSoon: false }
|
||||
) {
|
||||
let blocks: BlockInfo[] = [];
|
||||
const shouldAllowEmptyBlocks =
|
||||
!showComingSoon &&
|
||||
superblockData.chapters?.every(chapter => chapter.comingSoon);
|
||||
|
||||
// Handle simple blocks array format
|
||||
if (superblockData.blocks) {
|
||||
@@ -514,7 +517,7 @@ export function transformSuperBlock(
|
||||
}
|
||||
}
|
||||
|
||||
if (isEmpty(blocks)) {
|
||||
if (isEmpty(blocks) && !shouldAllowEmptyBlocks) {
|
||||
throw Error(`No blocks found in superblock data`);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,9 +2,59 @@
|
||||
"chapters": [
|
||||
{
|
||||
"dashedName": "back-end-development-and-apis",
|
||||
"comingSoon": true,
|
||||
"modules": [
|
||||
{
|
||||
"dashedName": "nodejs-core-libraries",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{
|
||||
"dashedName": "node-package-manager",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{
|
||||
"dashedName": "http-and-the-web-standards-model",
|
||||
"comingSoon": true,
|
||||
"blocks": ["lecture-understanding-the-http-request-response-model"]
|
||||
},
|
||||
{
|
||||
"dashedName": "rest-api-and-web-services",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{
|
||||
"dashedName": "introduction-to-express",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{
|
||||
"dashedName": "express-middleware",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{
|
||||
"dashedName": "error-handling-in-express",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{ "dashedName": "websockets", "comingSoon": true, "blocks": [] },
|
||||
{ "dashedName": "node-and-sql", "comingSoon": true, "blocks": [] },
|
||||
{
|
||||
"dashedName": "security-and-privacy",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{ "dashedName": "authentication", "comingSoon": true, "blocks": [] },
|
||||
{
|
||||
"dashedName": "tooling-and-deployment",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{
|
||||
"moduleType": "exam",
|
||||
"comingSoon": true,
|
||||
"dashedName": "back-end-development-and-apis-certification-exam",
|
||||
"blocks": ["exam-back-end-development-and-apis-certification"]
|
||||
}
|
||||
|
||||
@@ -3,8 +3,97 @@
|
||||
{
|
||||
"dashedName": "front-end-development-libraries",
|
||||
"modules": [
|
||||
{
|
||||
"dashedName": "react-fundamentals",
|
||||
"blocks": [
|
||||
"lecture-introduction-to-javascript-libraries-and-frameworks",
|
||||
"workshop-reusable-mega-navbar",
|
||||
"lab-reusable-footer",
|
||||
"lecture-working-with-data-in-react",
|
||||
"workshop-reusable-profile-card-component",
|
||||
"lab-mood-board",
|
||||
"review-react-basics",
|
||||
"quiz-react-basics"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "react-state-hooks-and-routing",
|
||||
"blocks": [
|
||||
"lecture-working-with-state-and-responding-to-events-in-react",
|
||||
"workshop-toggle-text-app",
|
||||
"lab-color-picker",
|
||||
"lecture-understanding-effects-and-referencing-values-in-react",
|
||||
"workshop-fruit-search-app",
|
||||
"lab-one-time-password-generator",
|
||||
"review-react-state-and-hooks",
|
||||
"quiz-react-state-and-hooks",
|
||||
"lecture-working-with-forms-in-react",
|
||||
"workshop-superhero-application-form",
|
||||
"lab-event-rsvp",
|
||||
"lecture-working-with-data-fetching-and-memoization-in-react",
|
||||
"workshop-shopping-list-app",
|
||||
"lab-currency-converter",
|
||||
"lecture-routing-react-frameworks-and-dependency-management-tools",
|
||||
"lab-tic-tac-toe",
|
||||
"lecture-react-strategies-and-debugging",
|
||||
"review-react-forms-data-fetching-and-routing",
|
||||
"quiz-react-forms-data-fetching-and-routing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "performance",
|
||||
"blocks": [
|
||||
"lecture-understanding-performance-in-web-applications",
|
||||
"review-web-performance",
|
||||
"quiz-web-performance"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "testing",
|
||||
"blocks": [
|
||||
"lecture-understanding-the-different-types-of-testing",
|
||||
"review-testing",
|
||||
"quiz-testing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "css-libraries-and-frameworks",
|
||||
"blocks": [
|
||||
"lecture-working-with-css-libraries-and-frameworks",
|
||||
"workshop-error-message-component",
|
||||
"workshop-tailwind-cta-component",
|
||||
"workshop-tailwind-pricing-component",
|
||||
"lab-music-shopping-cart-page",
|
||||
"lab-photography-exhibit",
|
||||
"review-css-libraries-and-frameworks",
|
||||
"quiz-css-libraries-and-frameworks"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "data-visualization",
|
||||
"comingSoon": true,
|
||||
"blocks": []
|
||||
},
|
||||
{
|
||||
"dashedName": "typescript-fundamentals",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"lecture-introduction-to-typescript",
|
||||
"lecture-working-with-generics-and-type-narrowing",
|
||||
"lecture-working-with-typescript-configuration-files",
|
||||
"review-typescript",
|
||||
"quiz-typescript"
|
||||
]
|
||||
},
|
||||
{
|
||||
"moduleType": "review",
|
||||
"comingSoon": true,
|
||||
"dashedName": "review-front-end-libraries",
|
||||
"blocks": ["review-front-end-libraries"]
|
||||
},
|
||||
{
|
||||
"moduleType": "exam",
|
||||
"comingSoon": true,
|
||||
"dashedName": "front-end-development-libraries-certification-exam",
|
||||
"blocks": ["exam-front-end-development-libraries-certification"]
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
"dashedName": "javascript-variables-and-strings",
|
||||
"blocks": [
|
||||
"lecture-introduction-to-javascript",
|
||||
"lecture-introduction-to-strings",
|
||||
"lecture-understanding-code-clarity",
|
||||
"workshop-greeting-bot",
|
||||
"lab-javascript-trivia-bot",
|
||||
"lab-sentence-maker",
|
||||
@@ -19,6 +21,7 @@
|
||||
"lecture-working-with-string-search-and-slice-methods",
|
||||
"lecture-working-with-string-formatting-methods",
|
||||
"lecture-working-with-string-modification-methods",
|
||||
"workshop-string-transformer",
|
||||
"review-javascript-strings",
|
||||
"quiz-javascript-strings"
|
||||
]
|
||||
@@ -95,6 +98,7 @@
|
||||
"lab-chunky-monkey",
|
||||
"lab-profile-lookup",
|
||||
"lab-repeat-a-string",
|
||||
"lab-missing-letter-detector",
|
||||
"review-javascript-loops",
|
||||
"quiz-javascript-loops"
|
||||
]
|
||||
@@ -111,12 +115,18 @@
|
||||
"lab-pyramid-generator",
|
||||
"lab-gradebook-app",
|
||||
"lecture-the-var-keyword-and-hoisting",
|
||||
"lab-title-case-converter",
|
||||
"lab-falsy-remover",
|
||||
"lab-inventory-management-program",
|
||||
"lecture-understanding-modules-imports-and-exports",
|
||||
"lecture-working-with-the-arguments-object-and-rest-parameters",
|
||||
"lab-unique-sorted-union",
|
||||
"lab-password-generator",
|
||||
"lab-sum-all-numbers-algorithm",
|
||||
"lab-dna-pair-generator",
|
||||
"lab-html-entitiy-converter",
|
||||
"lab-odd-fibonacci-sum-calculator",
|
||||
"lab-element-skipper",
|
||||
"lab-optional-arguments-sum-function",
|
||||
"review-javascript-fundamentals",
|
||||
"quiz-javascript-fundamentals"
|
||||
@@ -130,6 +140,12 @@
|
||||
"lab-book-organizer",
|
||||
"lab-sorted-index-finder",
|
||||
"lab-symmetric-difference",
|
||||
"lab-value-remover-function",
|
||||
"lab-matching-object-filter",
|
||||
"lab-prime-number-sum-calculator",
|
||||
"lab-range-based-lcm-calculator",
|
||||
"lab-deep-flattening-tool",
|
||||
"lab-all-true-property-validator",
|
||||
"review-javascript-higher-order-functions",
|
||||
"quiz-javascript-higher-order-functions"
|
||||
]
|
||||
@@ -139,6 +155,7 @@
|
||||
"blocks": [
|
||||
"lecture-working-with-the-dom-click-events-and-web-apis",
|
||||
"workshop-storytelling-app",
|
||||
"workshop-emoji-reactor",
|
||||
"lab-favorite-icon-toggler",
|
||||
"lecture-understanding-the-event-object-and-event-delegation",
|
||||
"workshop-music-instrument-filter",
|
||||
@@ -177,6 +194,9 @@
|
||||
"workshop-spam-filter",
|
||||
"lab-palindrome-checker",
|
||||
"lab-regex-sandbox",
|
||||
"lab-spinal-case-converter",
|
||||
"lab-pig-latin",
|
||||
"lab-smart-word-replacement",
|
||||
"review-javascript-regular-expressions",
|
||||
"quiz-javascript-regular-expressions"
|
||||
]
|
||||
@@ -295,6 +315,7 @@
|
||||
"blocks": ["review-javascript"]
|
||||
},
|
||||
{
|
||||
"moduleType": "exam",
|
||||
"dashedName": "javascript-certification-exam",
|
||||
"comingSoon": true,
|
||||
"blocks": ["exam-javascript-certification"]
|
||||
|
||||
@@ -3,8 +3,135 @@
|
||||
{
|
||||
"dashedName": "python",
|
||||
"modules": [
|
||||
{
|
||||
"dashedName": "python-basics",
|
||||
"comingSoon": false,
|
||||
"blocks": [
|
||||
"lecture-introduction-to-python",
|
||||
"workshop-caesar-cipher",
|
||||
"lab-rpg-character",
|
||||
"review-python-basics",
|
||||
"quiz-python-basics"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-loops-and-sequences",
|
||||
"comingSoon": false,
|
||||
"blocks": [
|
||||
"lecture-working-with-loops-and-sequences",
|
||||
"workshop-pin-extractor",
|
||||
"lab-number-pattern-generator",
|
||||
"review-loops-and-sequences",
|
||||
"quiz-loops-and-sequences"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-dictionaries-and-sets",
|
||||
"comingSoon": false,
|
||||
"blocks": [
|
||||
"lecture-working-with-dictionaries-and-sets",
|
||||
"lecture-working-with-modules",
|
||||
"workshop-medical-data-validator",
|
||||
"lab-user-configuration-manager",
|
||||
"review-dictionaries-and-sets",
|
||||
"quiz-dictionaries-and-sets"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-error-handling",
|
||||
"comingSoon": false,
|
||||
"blocks": [
|
||||
"lecture-understanding-error-handling",
|
||||
"lab-isbn-validator",
|
||||
"review-error-handling",
|
||||
"quiz-error-handling"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-classes-and-objects",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"lecture-classes-and-objects",
|
||||
"workshop-musical-instrument-inventory",
|
||||
"workshop-email-simulator",
|
||||
"lab-budget-app",
|
||||
"review-classes-and-objects",
|
||||
"quiz-classes-and-objects"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-object-oriented-programming",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"lecture-understanding-object-oriented-programming-and-encapsulation",
|
||||
"workshop-salary-tracker",
|
||||
"lecture-understanding-inheritance-and-polymorphism",
|
||||
"workshop-media-catalogue",
|
||||
"lab-polygon-area-calculator",
|
||||
"lecture-understanding-abstraction",
|
||||
"review-object-oriented-programming",
|
||||
"quiz-object-oriented-programming"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-linear-data-structures",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"lecture-working-with-common-data-structures",
|
||||
"workshop-linked-list-class",
|
||||
"lab-hash-table",
|
||||
"review-data-structures",
|
||||
"quiz-data-structures"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-algorithms",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"lecture-searching-and-sorting-algorithms",
|
||||
"workshop-binary-search",
|
||||
"lab-bisection-method",
|
||||
"workshop-merge-sort",
|
||||
"lab-quicksort",
|
||||
"lab-selection-sort",
|
||||
"lab-luhn-algorithm",
|
||||
"lab-tower-of-hanoi",
|
||||
"review-searching-and-sorting-algorithms",
|
||||
"quiz-searching-and-sorting-algorithms"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-graphs-and-trees",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"lecture-understanding-graphs-and-trees",
|
||||
"lab-adjacency-list-to-matrix-converter",
|
||||
"workshop-breadth-first-search",
|
||||
"lab-depth-first-search",
|
||||
"lab-n-queens-problem",
|
||||
"review-graphs-and-trees",
|
||||
"quiz-graphs-and-trees"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "python-dynamic-programming",
|
||||
"comingSoon": true,
|
||||
"blocks": [
|
||||
"lecture-understanding-dynamic-programming",
|
||||
"lab-nth-fibonacci-number",
|
||||
"review-dynamic-programming",
|
||||
"quiz-dynamic-programming"
|
||||
]
|
||||
},
|
||||
{
|
||||
"comingSoon": true,
|
||||
"moduleType": "review",
|
||||
"dashedName": "review-python",
|
||||
"blocks": ["review-python"]
|
||||
},
|
||||
{
|
||||
"moduleType": "exam",
|
||||
"comingSoon": true,
|
||||
"dashedName": "python-certification-exam",
|
||||
"blocks": ["exam-python-certification"]
|
||||
}
|
||||
|
||||
@@ -3,8 +3,89 @@
|
||||
{
|
||||
"dashedName": "relational-databases",
|
||||
"modules": [
|
||||
{
|
||||
"dashedName": "code-editors",
|
||||
"blocks": ["lecture-working-with-code-editors-and-ides"]
|
||||
},
|
||||
{
|
||||
"dashedName": "bash-fundamentals",
|
||||
"blocks": [
|
||||
"lecture-understanding-the-command-line-and-working-with-bash",
|
||||
"workshop-bash-boilerplate",
|
||||
"review-bash-commands",
|
||||
"quiz-bash-commands"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "sql-and-postgresql",
|
||||
"blocks": [
|
||||
"lecture-working-with-relational-databases",
|
||||
"workshop-database-of-video-game-characters",
|
||||
"review-sql-and-postgresql",
|
||||
"quiz-sql-and-postgresql"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "lab-celestial-bodies-database",
|
||||
"blocks": ["lab-celestial-bodies-database"]
|
||||
},
|
||||
{
|
||||
"dashedName": "bash-scripting",
|
||||
"blocks": [
|
||||
"lecture-understanding-bash-scripting",
|
||||
"workshop-bash-five-programs",
|
||||
"review-bash-scripting",
|
||||
"quiz-bash-scripting"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "sql-and-bash",
|
||||
"blocks": [
|
||||
"lecture-working-with-sql",
|
||||
"workshop-sql-student-database-part-1",
|
||||
"workshop-sql-student-database-part-2",
|
||||
"workshop-kitty-ipsum-translator",
|
||||
"workshop-bike-rental-shop",
|
||||
"review-bash-and-sql",
|
||||
"quiz-bash-and-sql"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "lab-world-cup-database",
|
||||
"blocks": ["lab-world-cup-database"]
|
||||
},
|
||||
{
|
||||
"dashedName": "lab-salon-appointment-scheduler",
|
||||
"blocks": ["lab-salon-appointment-scheduler"]
|
||||
},
|
||||
{
|
||||
"dashedName": "git",
|
||||
"blocks": [
|
||||
"lecture-working-with-nano",
|
||||
"workshop-castle",
|
||||
"lecture-introduction-to-git-and-github",
|
||||
"lecture-working-with-code-reviews-branching-deployment-and-ci-cd",
|
||||
"workshop-sql-reference-object",
|
||||
"review-git",
|
||||
"quiz-git"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dashedName": "lab-periodic-table-database",
|
||||
"blocks": ["lab-periodic-table-database"]
|
||||
},
|
||||
{
|
||||
"dashedName": "lab-number-guessing-game",
|
||||
"blocks": ["lab-number-guessing-game"]
|
||||
},
|
||||
{
|
||||
"moduleType": "review",
|
||||
"dashedName": "review-relational-databases",
|
||||
"blocks": ["review-relational-databases"]
|
||||
},
|
||||
{
|
||||
"moduleType": "exam",
|
||||
"comingSoon": true,
|
||||
"dashedName": "relational-databases-certification-exam",
|
||||
"blocks": ["exam-relational-databases-certification"]
|
||||
}
|
||||
|
||||
@@ -17,9 +17,11 @@
|
||||
"lecture-understanding-how-html-affects-seo",
|
||||
"lab-travel-agency-page",
|
||||
"lecture-working-with-audio-and-video-elements",
|
||||
"lab-html-audio-and-video-player",
|
||||
"lecture-working-with-images-and-svgs",
|
||||
"workshop-build-a-heart-icon",
|
||||
"lecture-working-with-media",
|
||||
"workshop-build-a-video-display-using-iframe",
|
||||
"lab-video-compilation-page",
|
||||
"lecture-working-with-links",
|
||||
"review-basic-html",
|
||||
@@ -60,7 +62,9 @@
|
||||
"dashedName": "html-and-accessibility",
|
||||
"blocks": [
|
||||
"lecture-importance-of-accessibility-and-good-html-structure",
|
||||
"workshop-debug-coding-journey-blog-page",
|
||||
"lecture-accessible-tables-forms",
|
||||
"workshop-tech-conference-schedule",
|
||||
"lecture-introduction-to-aria",
|
||||
"lecture-accessible-media-elements",
|
||||
"lab-checkout-page",
|
||||
@@ -152,6 +156,7 @@
|
||||
"lecture-best-practices-for-styling-forms",
|
||||
"workshop-registration-form",
|
||||
"lab-contact-form",
|
||||
"lab-feature-selection",
|
||||
"review-styling-forms",
|
||||
"quiz-styling-forms"
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user