mirror of
https://github.com/freeCodeCamp/freeCodeCamp.git
synced 2026-01-05 12:06:36 -05:00
86 lines
2.7 KiB
JavaScript
86 lines
2.7 KiB
JavaScript
const path = require('path');
|
|
|
|
const _ = require('lodash');
|
|
|
|
const { getChallengesForLang } = require('../../curriculum/get-challenges');
|
|
|
|
const {
|
|
getContentDir,
|
|
getBlockCreator,
|
|
getSuperblocks,
|
|
superBlockToFilename
|
|
} = require('../../curriculum/build-curriculum');
|
|
const {
|
|
getBlockStructure,
|
|
getSuperblockStructure
|
|
} = require('../../curriculum/file-handler');
|
|
const { transformSuperBlock } = require('../../curriculum/build-superblock');
|
|
const { getSuperOrder } = require('../../curriculum/utils');
|
|
|
|
const curriculumLocale = process.env.CURRICULUM_LOCALE || 'english';
|
|
|
|
exports.localeChallengesRootDir = getContentDir(curriculumLocale);
|
|
|
|
const blockCreator = getBlockCreator(curriculumLocale);
|
|
|
|
function getBlockMetadata(block, superBlock) {
|
|
// Compute metadata for the given block in the specified superblock
|
|
const sbFilename = superBlockToFilename[superBlock];
|
|
const sbData = getSuperblockStructure(sbFilename);
|
|
const blocks = transformSuperBlock(sbData, {
|
|
showComingSoon: process.env.SHOW_UPCOMING_CHANGES === 'true'
|
|
});
|
|
|
|
const order = blocks.findIndex(b => b.dashedName === block);
|
|
const superOrder = getSuperOrder(superBlock);
|
|
|
|
if (order === -1) {
|
|
throw new Error(`Block ${block} not found in superblock ${superBlock}`);
|
|
}
|
|
|
|
return { order, superOrder };
|
|
}
|
|
|
|
exports.replaceChallengeNodes = () => {
|
|
return async function replaceChallengeNodes(filePath) {
|
|
const parentDir = path.dirname(filePath);
|
|
const block = path.basename(parentDir);
|
|
const filename = path.basename(filePath);
|
|
|
|
console.log(`Replacing challenge nodes for ${filePath}`);
|
|
const meta = getBlockStructure(block);
|
|
const superblocks = getSuperblocks(block);
|
|
|
|
// Create a challenge for each superblock containing this block
|
|
const challenges = await Promise.all(
|
|
superblocks.map(async superBlock => {
|
|
const { order, superOrder } = getBlockMetadata(block, superBlock);
|
|
return blockCreator.createChallenge({
|
|
filename,
|
|
block,
|
|
meta: { ...meta, superBlock, order, superOrder },
|
|
isAudited: true
|
|
});
|
|
})
|
|
);
|
|
|
|
return challenges;
|
|
};
|
|
};
|
|
|
|
exports.buildChallenges = async function buildChallenges() {
|
|
const curriculum = await getChallengesForLang(curriculumLocale);
|
|
const superBlocks = Object.keys(curriculum);
|
|
const blocks = superBlocks
|
|
.map(superBlock => curriculum[superBlock].blocks)
|
|
.reduce((blocks, superBlock) => {
|
|
const currentBlocks = Object.keys(superBlock).map(key => superBlock[key]);
|
|
return blocks.concat(_.flatten(currentBlocks));
|
|
}, []);
|
|
|
|
const builtChallenges = blocks
|
|
.map(({ challenges }) => challenges)
|
|
.reduce((accu, current) => accu.concat(current), []);
|
|
return builtChallenges;
|
|
};
|