fix: skip upcoming superblocks in normal builds (#62263)

This commit is contained in:
Oliver Eyton-Williams
2025-09-19 23:10:06 +05:30
committed by GitHub
parent 243678e434
commit 57415e2a11
3 changed files with 45 additions and 70 deletions
+14 -3
View File
@@ -1,7 +1,7 @@
const fs = require('fs');
const path = require('path');
const { isEmpty } = require('lodash');
const { isEmpty, isUndefined } = require('lodash');
const debug = require('debug')('fcc:build-curriculum');
const {
@@ -11,7 +11,7 @@ const {
} = require('./build-superblock');
const { buildCertification } = require('./build-certification');
const { applyFilters, closestFilters } = require('./utils');
const { applyFilters, closestFilters, getSuperOrder } = require('./utils');
const {
getContentDir,
getLanguageConfig,
@@ -330,7 +330,18 @@ async function buildCurriculum(lang, filters) {
const fullCurriculum = { certifications: { blocks: {} } };
for (const superblock of fullSuperblockList) {
const liveSuperblocks = fullSuperblockList.filter(({ name }) => {
const superOrder = getSuperOrder(name);
const upcomingSuperOrder = getSuperOrder(name, true);
// If a superblock is not in either order list it should not exist.
if (isUndefined(superOrder) && isUndefined(upcomingSuperOrder)) {
throw Error(`Invalid superBlock: ${name}`);
}
return !isUndefined(superOrder);
});
for (const superblock of liveSuperblocks) {
fullCurriculum[superblock.name] =
await builder.processSuperblock(superblock);
}
+10 -25
View File
@@ -2,10 +2,7 @@ const path = require('path');
const comparison = require('string-similarity');
const {
SuperBlocks,
generateSuperBlockList
} = require('../shared-dist/config/curriculum');
const { generateSuperBlockList } = require('../shared-dist/config/curriculum');
require('dotenv').config({ path: path.resolve(__dirname, '../.env') });
@@ -27,15 +24,6 @@ exports.testedLang = function testedLang() {
};
function createSuperOrder(superBlocks) {
if (!Array.isArray(superBlocks)) {
throw Error(`superBlocks must be an Array`);
}
superBlocks.forEach(superBlock => {
if (!Object.values(SuperBlocks).includes(superBlock)) {
throw Error(`Invalid superBlock: ${superBlock}`);
}
});
const superOrder = {};
superBlocks.forEach((superBlock, i) => {
@@ -45,19 +33,16 @@ function createSuperOrder(superBlocks) {
return superOrder;
}
const flatSuperBlockMap = generateSuperBlockList({
showUpcomingChanges: process.env.SHOW_UPCOMING_CHANGES === 'true'
});
const superOrder = createSuperOrder(flatSuperBlockMap);
function getSuperOrder(
superblock,
showUpcomingChanges = process.env.SHOW_UPCOMING_CHANGES === 'true'
) {
const flatSuperBlockMap = generateSuperBlockList({
showUpcomingChanges
});
// gets the superOrder of a superBlock from the object created above
function getSuperOrder(superblock) {
if (typeof superblock !== 'string')
throw Error(`superblock ${JSON.stringify(superblock)} must be a string`);
const order = superOrder[superblock];
if (typeof order === 'undefined')
throw Error(`${superblock} is not a valid superblock`);
return order;
const superOrder = createSuperOrder(flatSuperBlockMap);
return superOrder[superblock];
}
/**
+21 -42
View File
@@ -67,62 +67,41 @@ describe('createSuperOrder', () => {
});
it('throws when not given an array of SuperBlocks', () => {
expect.assertions(4);
expect(() => getSuperOrder()).toThrow();
expect(() => getSuperOrder(null)).toThrow();
expect(() => getSuperOrder('')).toThrow();
expect(() => getSuperOrder(['respansive-wib-desoin'])).toThrow();
expect(() => createSuperOrder()).toThrow();
expect(() => createSuperOrder(null)).toThrow();
expect(() => createSuperOrder('')).toThrow();
});
});
describe('getSuperOrder', () => {
it('returns a number for valid curriculum', () => {
expect.assertions(1);
expect(typeof getSuperOrder('responsive-web-design')).toBe('number');
});
it('throws for unknown curriculum', () => {
expect.assertions(4);
expect(() => getSuperOrder()).toThrow();
expect(() => getSuperOrder(null)).toThrow();
expect(() => getSuperOrder('')).toThrow();
expect(() => getSuperOrder('respansive-wib-desoin')).toThrow();
it('returns undefined for unknown curriculum', () => {
expect(getSuperOrder()).toBeUndefined();
expect(getSuperOrder(null)).toBeUndefined();
expect(getSuperOrder('')).toBeUndefined();
expect(getSuperOrder('respansive-wib-desoin')).toBeUndefined();
expect(getSuperOrder('certifications')).toBeUndefined();
});
it('throws for "certifications"', () => {
expect.assertions(1);
expect(() => getSuperOrder('certifications')).toThrow();
it('returns numbers for all current curriculum', () => {
const superBlocks = Object.values(SuperBlocks);
const superOrderValues = superBlocks.map(sb => getSuperOrder(sb, true));
const definedValues = superOrderValues.filter(v => typeof v === 'number');
expect(definedValues.length).toBe(superBlocks.length);
});
it.skip('returns unique numbers for all current curriculum', () => {
if (process.env.SHOW_UPCOMING_CHANGES !== 'true') {
expect.assertions(17);
} else {
expect.assertions(19);
}
it('returns unique numbers for all current curriculum', () => {
const superBlocks = Object.values(SuperBlocks);
expect(getSuperOrder(SuperBlocks.RespWebDesignNew)).toBe(0);
expect(getSuperOrder(SuperBlocks.JsAlgoDataStructNew)).toBe(1);
expect(getSuperOrder(SuperBlocks.FrontEndDevLibs)).toBe(2);
expect(getSuperOrder(SuperBlocks.DataVis)).toBe(3);
expect(getSuperOrder(SuperBlocks.RelationalDb)).toBe(4);
expect(getSuperOrder(SuperBlocks.BackEndDevApis)).toBe(5);
expect(getSuperOrder(SuperBlocks.QualityAssurance)).toBe(6);
expect(getSuperOrder(SuperBlocks.SciCompPy)).toBe(7);
expect(getSuperOrder(SuperBlocks.DataAnalysisPy)).toBe(8);
expect(getSuperOrder(SuperBlocks.InfoSec)).toBe(9);
expect(getSuperOrder(SuperBlocks.MachineLearningPy)).toBe(10);
expect(getSuperOrder(SuperBlocks.CollegeAlgebraPy)).toBe(11);
expect(getSuperOrder(SuperBlocks.FoundationalCSharp)).toBe(12);
expect(getSuperOrder(SuperBlocks.CodingInterviewPrep)).toBe(13);
expect(getSuperOrder(SuperBlocks.ProjectEuler)).toBe(14);
expect(getSuperOrder(SuperBlocks.RespWebDesign)).toBe(15);
expect(getSuperOrder(SuperBlocks.JsAlgoDataStruct)).toBe(16);
const superOrderValues = superBlocks.map(sb => getSuperOrder(sb, true));
const uniqueValues = Array.from(new Set(superOrderValues));
if (process.env.SHOW_UPCOMING_CHANGES === 'true') {
expect(getSuperOrder(SuperBlocks.TheOdinProject)).toBe(17);
expect(getSuperOrder(SuperBlocks.FullStackDeveloper)).toBe(18);
}
expect(uniqueValues.length).toBe(superBlocks.length);
});
});