freeCodeCamp/config/superblock-order.ts

627 lines
19 KiB
TypeScript

import { Languages } from './i18n';
import { SuperBlocks } from './certification-settings';
/*
* .env SHOW_NEW_CURRICULUM = SuperBlockStates.New
* 'New' -> shown only on english staging at the moment
*
* .env SHOW_UPCOMING_CHANGES = SuperBlockStates.Upcoming
* 'Upcoming' is for development -> not shown on stag or prod anywhere
*
*/
export enum CurriculumMaps {
Landing = 'landing',
Learn = 'learn'
}
export enum TranslationStates {
Audited = 'audited',
NotAudited = 'notAudited'
}
export enum SuperBlockStates {
Current = 'current',
New = 'new',
Upcoming = 'upcoming',
Legacy = 'legacy'
}
export const orderedSuperBlockStates = [
SuperBlockStates.Current,
SuperBlockStates.New,
SuperBlockStates.Upcoming,
SuperBlockStates.Legacy
];
type SuperBlockOrder = {
[key in Languages]: {
[CurriculumMaps.Landing]: SuperBlocks[];
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: SuperBlocks[];
[SuperBlockStates.New]: SuperBlocks[];
[SuperBlockStates.Upcoming]: SuperBlocks[];
[SuperBlockStates.Legacy]: SuperBlocks[];
};
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: SuperBlocks[];
[SuperBlockStates.New]: SuperBlocks[];
[SuperBlockStates.Upcoming]: SuperBlocks[];
[SuperBlockStates.Legacy]: SuperBlocks[];
};
};
};
};
// all languages should have this many, one for each current cert
export const numberOfSuperBlocksOnLanding = 11;
/*
* This is the used for tests to make sure a superBlock isn't out of order
* e.g. so that a RWD button isn't below a JS button.
* It compares each array in `superBlockOrder` to this - those arrays do not
* have to include all these superBlocks, but the ones it does include, have
* to be in this order
*/
export const defaultSuperBlockOrder: SuperBlocks[] = [
SuperBlocks.RespWebDesignNew,
SuperBlocks.RespWebDesign,
SuperBlocks.JsAlgoDataStructNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CodingInterviewPrep
];
/*
* The order of superblocks in the arrays below are how they appear on the maps
*
* The 'Landing' map array should contain exactly one superblock for each
* current, non-legacy certification, and only one superblock of each type -
* e.g. only one RWD superblock (button)
*
* The 'Learn' map arrays should contain ALL available SuperBlocks, sorted into
* their various states. These will be used to create the 'superOrder' property.
*
*/
export const superBlockOrder: SuperBlockOrder = {
[Languages.English]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: [SuperBlocks.RespWebDesign]
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.Espanol]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesign,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesign,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: []
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.RelationalDb,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.Chinese]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: [SuperBlocks.RespWebDesign]
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RelationalDb,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.ChineseTrandational]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: [SuperBlocks.RespWebDesign]
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RelationalDb,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.Italian]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: [SuperBlocks.RespWebDesign]
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.Portuguese]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: [SuperBlocks.RespWebDesign]
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.Ukrainian]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: [SuperBlocks.RespWebDesign]
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [SuperBlocks.CodingInterviewPrep],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.Japanese]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesign,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesign,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: []
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [SuperBlocks.RespWebDesignNew],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.German]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesign,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesign,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: []
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: []
}
}
},
[Languages.Arabic]: {
[CurriculumMaps.Landing]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs,
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy
],
[CurriculumMaps.Learn]: {
[TranslationStates.Audited]: {
[SuperBlockStates.Current]: [
SuperBlocks.RespWebDesignNew,
SuperBlocks.JsAlgoDataStruct,
SuperBlocks.FrontEndDevLibs
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [],
[SuperBlockStates.Legacy]: []
},
[TranslationStates.NotAudited]: {
[SuperBlockStates.Current]: [
SuperBlocks.DataVis,
SuperBlocks.RelationalDb,
SuperBlocks.BackEndDevApis,
SuperBlocks.QualityAssurance,
SuperBlocks.SciCompPy,
SuperBlocks.DataAnalysisPy,
SuperBlocks.InfoSec,
SuperBlocks.MachineLearningPy,
SuperBlocks.CodingInterviewPrep
],
[SuperBlockStates.New]: [],
[SuperBlockStates.Upcoming]: [SuperBlocks.JsAlgoDataStructNew],
[SuperBlockStates.Legacy]: [SuperBlocks.RespWebDesign]
}
}
}
};
// The client uses the object above to create the map
// Keep this so it can't change
Object.freeze(superBlockOrder);
function shouldShowSuperblocks({
superBlockState,
showNewCurriculum = 'false',
showUpcomingChanges = 'false'
}: {
superBlockState: string;
showNewCurriculum: string;
showUpcomingChanges: string;
}) {
if (
(superBlockState === SuperBlockStates.New &&
showNewCurriculum !== 'true') ||
(superBlockState === SuperBlockStates.Upcoming &&
showUpcomingChanges !== 'true')
) {
return false;
}
return true;
}
export function getLearnSuperBlocks({
language = 'english',
showNewCurriculum = 'false',
showUpcomingChanges = 'false'
}) {
const learnSuperBlocks: SuperBlocks[] = [];
Object.values(TranslationStates).forEach(translationState => {
Object.values(SuperBlockStates).forEach(superBlockState => {
if (
shouldShowSuperblocks({
superBlockState,
showNewCurriculum,
showUpcomingChanges
})
) {
learnSuperBlocks.push(
...superBlockOrder[language as Languages][CurriculumMaps.Learn][
translationState as TranslationStates
][superBlockState as SuperBlockStates]
);
}
});
});
return learnSuperBlocks;
}
export function getAuditedSuperBlocks({
language = 'english',
showNewCurriculum = 'false',
showUpcomingChanges = 'false'
}) {
const auditedSuperBlocks: SuperBlocks[] = [];
Object.values(SuperBlockStates).forEach(superBlockState => {
if (
shouldShowSuperblocks({
superBlockState,
showNewCurriculum,
showUpcomingChanges
})
) {
auditedSuperBlocks.push(
...superBlockOrder[language as Languages][CurriculumMaps.Learn][
TranslationStates.Audited
][superBlockState as SuperBlockStates]
);
}
});
return auditedSuperBlocks;
}
export function getNotAuditedSuperBlocks({
language = 'english',
showNewCurriculum = 'false',
showUpcomingChanges = 'false'
}) {
const notAuditedSuperBlocks: SuperBlocks[] = [];
Object.values(SuperBlockStates).forEach(superBlockState => {
if (
shouldShowSuperblocks({
superBlockState,
showNewCurriculum,
showUpcomingChanges
})
) {
notAuditedSuperBlocks.push(
...superBlockOrder[language as Languages][CurriculumMaps.Learn][
TranslationStates.NotAudited
][superBlockState as SuperBlockStates]
);
}
});
return notAuditedSuperBlocks;
}