mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-01-05 21:03:24 -05:00
387 lines
12 KiB
TypeScript
387 lines
12 KiB
TypeScript
// TODO: eventually this should all flow from the curriculum service, since it
|
|
// defines the top-level structure of the curriculum.
|
|
import { Languages } from './i18n';
|
|
|
|
// all superblocks
|
|
export enum SuperBlocks {
|
|
RespWebDesignNew = '2022/responsive-web-design',
|
|
RespWebDesign = 'responsive-web-design',
|
|
JsAlgoDataStruct = 'javascript-algorithms-and-data-structures',
|
|
JsAlgoDataStructNew = 'javascript-algorithms-and-data-structures-v8',
|
|
FrontEndDevLibs = 'front-end-development-libraries',
|
|
DataVis = 'data-visualization',
|
|
RelationalDb = 'relational-database',
|
|
BackEndDevApis = 'back-end-development-and-apis',
|
|
QualityAssurance = 'quality-assurance',
|
|
SciCompPy = 'scientific-computing-with-python',
|
|
DataAnalysisPy = 'data-analysis-with-python',
|
|
InfoSec = 'information-security',
|
|
MachineLearningPy = 'machine-learning-with-python',
|
|
CodingInterviewPrep = 'coding-interview-prep',
|
|
TheOdinProject = 'the-odin-project',
|
|
ProjectEuler = 'project-euler',
|
|
CollegeAlgebraPy = 'college-algebra-with-python',
|
|
FoundationalCSharp = 'foundational-c-sharp-with-microsoft',
|
|
FullStackDeveloper = 'full-stack-developer',
|
|
A2English = 'a2-english-for-developers',
|
|
B1English = 'b1-english-for-developers',
|
|
A2Spanish = 'a2-professional-spanish',
|
|
A2Chinese = 'a2-professional-chinese',
|
|
RosettaCode = 'rosetta-code',
|
|
PythonForEverybody = 'python-for-everybody',
|
|
BasicHtml = 'basic-html',
|
|
SemanticHtml = 'semantic-html',
|
|
DevPlayground = 'dev-playground'
|
|
}
|
|
|
|
// Note that this object is used to create folderToSuperBlockMap object
|
|
export const superBlockToFolderMap = {
|
|
[SuperBlocks.RespWebDesign]: '01-responsive-web-design',
|
|
[SuperBlocks.JsAlgoDataStruct]:
|
|
'02-javascript-algorithms-and-data-structures',
|
|
[SuperBlocks.FrontEndDevLibs]: '03-front-end-development-libraries',
|
|
[SuperBlocks.DataVis]: '04-data-visualization',
|
|
[SuperBlocks.BackEndDevApis]: '05-back-end-development-and-apis',
|
|
[SuperBlocks.QualityAssurance]: '06-quality-assurance',
|
|
[SuperBlocks.SciCompPy]: '07-scientific-computing-with-python',
|
|
[SuperBlocks.DataAnalysisPy]: '08-data-analysis-with-python',
|
|
[SuperBlocks.InfoSec]: '09-information-security',
|
|
[SuperBlocks.CodingInterviewPrep]: '10-coding-interview-prep',
|
|
[SuperBlocks.MachineLearningPy]: '11-machine-learning-with-python',
|
|
[SuperBlocks.RelationalDb]: '13-relational-databases',
|
|
[SuperBlocks.RespWebDesignNew]: '14-responsive-web-design-22',
|
|
[SuperBlocks.JsAlgoDataStructNew]:
|
|
'15-javascript-algorithms-and-data-structures-22',
|
|
[SuperBlocks.TheOdinProject]: '16-the-odin-project',
|
|
[SuperBlocks.CollegeAlgebraPy]: '17-college-algebra-with-python',
|
|
[SuperBlocks.ProjectEuler]: '18-project-euler',
|
|
[SuperBlocks.FoundationalCSharp]: '19-foundational-c-sharp-with-microsoft',
|
|
[SuperBlocks.A2English]: '21-a2-english-for-developers',
|
|
[SuperBlocks.RosettaCode]: '22-rosetta-code',
|
|
[SuperBlocks.PythonForEverybody]: '23-python-for-everybody',
|
|
[SuperBlocks.B1English]: '24-b1-english-for-developers',
|
|
[SuperBlocks.FullStackDeveloper]: '25-front-end-development',
|
|
[SuperBlocks.A2Spanish]: '26-a2-professional-spanish',
|
|
[SuperBlocks.A2Chinese]: '27-a2-professional-chinese',
|
|
[SuperBlocks.BasicHtml]: '28-basic-html',
|
|
[SuperBlocks.SemanticHtml]: '29-semantic-html',
|
|
[SuperBlocks.DevPlayground]: '99-dev-playground'
|
|
};
|
|
|
|
// Same as superBlockToFolderMap but with the keys and values reversed
|
|
export const folderToSuperBlockMap = Object.fromEntries(
|
|
Object.entries(superBlockToFolderMap).map(([key, value]) => [value, key])
|
|
);
|
|
|
|
export const languageSuperBlocks = [
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese
|
|
];
|
|
|
|
/*
|
|
* SuperBlockStages.Upcoming = SHOW_UPCOMING_CHANGES === 'true'
|
|
* 'Upcoming' is for development -> not shown on stag or prod anywhere
|
|
*
|
|
* SuperBlockStages.Next = deployed, but only shown if the Growthbook feature
|
|
* is enabled.
|
|
*
|
|
*/
|
|
export enum SuperBlockStage {
|
|
Core,
|
|
English,
|
|
Professional,
|
|
Extra,
|
|
Legacy,
|
|
Upcoming,
|
|
Next,
|
|
Catalog
|
|
}
|
|
|
|
const defaultStageOrder = [
|
|
SuperBlockStage.Core,
|
|
SuperBlockStage.English,
|
|
SuperBlockStage.Extra,
|
|
SuperBlockStage.Legacy,
|
|
SuperBlockStage.Professional,
|
|
SuperBlockStage.Next
|
|
];
|
|
|
|
export function getStageOrder({
|
|
showUpcomingChanges
|
|
}: Config): SuperBlockStage[] {
|
|
const stageOrder = [...defaultStageOrder];
|
|
|
|
if (showUpcomingChanges) {
|
|
stageOrder.push(SuperBlockStage.Upcoming, SuperBlockStage.Catalog);
|
|
}
|
|
return stageOrder;
|
|
}
|
|
|
|
export type StageMap = {
|
|
[key in SuperBlockStage]: SuperBlocks[];
|
|
};
|
|
|
|
// Groups of superblocks in learn map. This should include all superblocks.
|
|
export const superBlockStages: StageMap = {
|
|
[SuperBlockStage.Core]: [SuperBlocks.FullStackDeveloper],
|
|
[SuperBlockStage.English]: [SuperBlocks.A2English, SuperBlocks.B1English],
|
|
[SuperBlockStage.Professional]: [SuperBlocks.FoundationalCSharp],
|
|
[SuperBlockStage.Extra]: [
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.CodingInterviewPrep,
|
|
SuperBlocks.ProjectEuler,
|
|
SuperBlocks.RosettaCode
|
|
],
|
|
[SuperBlockStage.Legacy]: [
|
|
SuperBlocks.RespWebDesignNew,
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.FrontEndDevLibs,
|
|
SuperBlocks.DataVis,
|
|
SuperBlocks.RelationalDb,
|
|
SuperBlocks.BackEndDevApis,
|
|
SuperBlocks.QualityAssurance,
|
|
SuperBlocks.SciCompPy,
|
|
SuperBlocks.DataAnalysisPy,
|
|
SuperBlocks.InfoSec,
|
|
SuperBlocks.MachineLearningPy,
|
|
SuperBlocks.CollegeAlgebraPy,
|
|
SuperBlocks.RespWebDesign,
|
|
SuperBlocks.JsAlgoDataStruct,
|
|
SuperBlocks.PythonForEverybody
|
|
],
|
|
[SuperBlockStage.Next]: [],
|
|
[SuperBlockStage.Upcoming]: [
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
// Catalog is treated like upcoming for now
|
|
// Add catalog superBlocks to catalog.ts when adding new superBlocks
|
|
[SuperBlockStage.Catalog]: [SuperBlocks.BasicHtml, SuperBlocks.SemanticHtml]
|
|
};
|
|
|
|
Object.freeze(superBlockStages);
|
|
|
|
export const catalogSuperBlocks = superBlockStages[SuperBlockStage.Catalog];
|
|
|
|
type NotAuditedSuperBlocks = {
|
|
[key in Languages]: SuperBlocks[];
|
|
};
|
|
|
|
// when a superBlock is audited, remove it from its language below
|
|
// when adding a new language, add all (not audited) superblocks to the object
|
|
export const notAuditedSuperBlocks: NotAuditedSuperBlocks = {
|
|
[Languages.English]: [],
|
|
[Languages.Espanol]: [
|
|
SuperBlocks.InfoSec,
|
|
SuperBlocks.MachineLearningPy,
|
|
SuperBlocks.CollegeAlgebraPy,
|
|
SuperBlocks.FoundationalCSharp,
|
|
SuperBlocks.CodingInterviewPrep,
|
|
SuperBlocks.ProjectEuler,
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.PythonForEverybody,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.Chinese]: [
|
|
SuperBlocks.CodingInterviewPrep,
|
|
SuperBlocks.ProjectEuler,
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.PythonForEverybody,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.ChineseTraditional]: [
|
|
SuperBlocks.CodingInterviewPrep,
|
|
SuperBlocks.ProjectEuler,
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.PythonForEverybody,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.Italian]: [
|
|
SuperBlocks.FoundationalCSharp,
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.PythonForEverybody,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.Portuguese]: [
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.PythonForEverybody,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.Ukrainian]: [
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.Japanese]: [
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.German]: [
|
|
SuperBlocks.RelationalDb,
|
|
SuperBlocks.QualityAssurance,
|
|
SuperBlocks.InfoSec,
|
|
SuperBlocks.MachineLearningPy,
|
|
SuperBlocks.CollegeAlgebraPy,
|
|
SuperBlocks.FoundationalCSharp,
|
|
SuperBlocks.CodingInterviewPrep,
|
|
SuperBlocks.ProjectEuler,
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.PythonForEverybody,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.Swahili]: [
|
|
SuperBlocks.DataVis,
|
|
SuperBlocks.RelationalDb,
|
|
SuperBlocks.BackEndDevApis,
|
|
SuperBlocks.QualityAssurance,
|
|
SuperBlocks.SciCompPy,
|
|
SuperBlocks.DataAnalysisPy,
|
|
SuperBlocks.InfoSec,
|
|
SuperBlocks.MachineLearningPy,
|
|
SuperBlocks.CollegeAlgebraPy,
|
|
SuperBlocks.FoundationalCSharp,
|
|
SuperBlocks.CodingInterviewPrep,
|
|
SuperBlocks.ProjectEuler,
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.RespWebDesign,
|
|
SuperBlocks.FrontEndDevLibs,
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.JsAlgoDataStruct,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.PythonForEverybody,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
],
|
|
[Languages.Korean]: [
|
|
SuperBlocks.RespWebDesignNew,
|
|
SuperBlocks.JsAlgoDataStruct,
|
|
SuperBlocks.BackEndDevApis,
|
|
SuperBlocks.QualityAssurance,
|
|
SuperBlocks.SciCompPy,
|
|
SuperBlocks.DataAnalysisPy,
|
|
SuperBlocks.InfoSec,
|
|
SuperBlocks.MachineLearningPy,
|
|
SuperBlocks.CollegeAlgebraPy,
|
|
SuperBlocks.FoundationalCSharp,
|
|
SuperBlocks.CodingInterviewPrep,
|
|
SuperBlocks.ProjectEuler,
|
|
SuperBlocks.TheOdinProject,
|
|
SuperBlocks.FrontEndDevLibs,
|
|
SuperBlocks.JsAlgoDataStructNew,
|
|
SuperBlocks.FullStackDeveloper,
|
|
SuperBlocks.A2English,
|
|
SuperBlocks.B1English,
|
|
SuperBlocks.A2Spanish,
|
|
SuperBlocks.A2Chinese,
|
|
SuperBlocks.PythonForEverybody,
|
|
SuperBlocks.DataVis,
|
|
SuperBlocks.RelationalDb,
|
|
SuperBlocks.RosettaCode,
|
|
SuperBlocks.BasicHtml,
|
|
SuperBlocks.SemanticHtml,
|
|
SuperBlocks.DevPlayground
|
|
]
|
|
};
|
|
|
|
Object.freeze(notAuditedSuperBlocks);
|
|
|
|
export const chapterBasedSuperBlocks = [SuperBlocks.FullStackDeveloper];
|
|
Object.freeze(chapterBasedSuperBlocks);
|
|
|
|
type Config = {
|
|
showUpcomingChanges: boolean;
|
|
};
|
|
|
|
export function generateSuperBlockList(config: Config): SuperBlocks[] {
|
|
return getStageOrder(config)
|
|
.map(stage => superBlockStages[stage])
|
|
.flat();
|
|
}
|
|
|
|
export function getAuditedSuperBlocks({
|
|
language = 'english'
|
|
}: {
|
|
language: string;
|
|
}): SuperBlocks[] {
|
|
if (!Object.prototype.hasOwnProperty.call(notAuditedSuperBlocks, language)) {
|
|
throw Error(`'${language}' key not found in 'notAuditedSuperBlocks'`);
|
|
}
|
|
|
|
// To find the audited superblocks, we need to start with all superblocks.
|
|
const flatSuperBlockMap = generateSuperBlockList({
|
|
showUpcomingChanges: true
|
|
});
|
|
const auditedSuperBlocks = flatSuperBlockMap.filter(
|
|
superBlock =>
|
|
!notAuditedSuperBlocks[language as Languages].includes(superBlock)
|
|
);
|
|
return auditedSuperBlocks;
|
|
}
|