From 97279f5bc62e3d1ed4633c2cd14b978b98db98ef Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Fri, 2 Aug 2024 10:29:44 +0200 Subject: [PATCH] refactor(client): clean up gatsby-node (#55640) Co-authored-by: Shaun Hamilton --- client/gatsby-node.js | 311 +++++++----------- client/utils/gatsby/challenge-page-creator.js | 3 + 2 files changed, 130 insertions(+), 184 deletions(-) diff --git a/client/gatsby-node.js b/client/gatsby-node.js index 1b1efc4b063..02667be7a4c 100644 --- a/client/gatsby-node.js +++ b/client/gatsby-node.js @@ -32,7 +32,11 @@ exports.onCreateNode = function onCreateNode({ node, actions, getNode }) { } }; -exports.createPages = function createPages({ graphql, actions, reporter }) { +exports.createPages = async function createPages({ + graphql, + actions, + reporter +}) { if (!env.algoliaAPIKey || !env.algoliaAppId) { if (process.env.FREECODECAMP_NODE_ENV === 'production') { throw new Error( @@ -57,201 +61,140 @@ exports.createPages = function createPages({ graphql, actions, reporter }) { const { createPage } = actions; - return new Promise((resolve, reject) => { - // Query for all markdown 'nodes' and for the slug we previously created. - resolve( - graphql(` - { - allChallengeNode( - sort: { - fields: [ - challenge___superOrder - challenge___order - challenge___challengeOrder - ] - } - ) { - edges { - node { - challenge { - block - certification - challengeType - dashedName - disableLoopProtectTests - disableLoopProtectPreview - fields { - slug - blockHashSlug - } - fillInTheBlank { - sentence - blanks { - answer - feedback - } - } - hasEditableBoundaries - id - msTrophyId - order - prerequisites { - id - title - } - required { - link - src - } - challengeOrder - challengeFiles { - name - ext - contents - head - tail - history - fileKey - } - solutions { - contents - ext - history - } - superBlock - superOrder - template - usesMultifileEditor - scene { - setup { - background - characters { - character - position { - x - y - z - } - } - audio { - filename - startTime - startTimestamp - finishTimestamp - } - alwaysShowDialogue - } - commands { - background - character - position { - x - y - z - } - startTime - finishTime - dialogue { - text - align - } - } - } - } + const result = await graphql(` + { + allChallengeNode( + sort: { + fields: [ + challenge___superOrder + challenge___order + challenge___challengeOrder + ] + } + ) { + edges { + node { + challenge { + block + certification + challengeType + dashedName + disableLoopProtectTests + disableLoopProtectPreview + fields { + slug + blockHashSlug } - } - } - allMarkdownRemark { - edges { - node { - fields { - slug - nodeIdentity - component - } - frontmatter { - certification - block - superBlock - title - } - htmlAst - id - excerpt + id + order + required { + link + src } + challengeOrder + challengeFiles { + name + ext + contents + head + tail + history + fileKey + } + solutions { + contents + ext + history + } + superBlock + superOrder + template + usesMultifileEditor } } } - `).then(result => { - if (result.errors) { - console.log(result.errors); - return reject(result.errors); - } - - // Create challenge pages. - result.data.allChallengeNode.edges.forEach( - createChallengePages(createPage) - ); - - const blocks = uniq( - result.data.allChallengeNode.edges.map( - ({ - node: { - challenge: { block } - } - }) => block - ) - ); - - const superBlocks = uniq( - result.data.allChallengeNode.edges.map( - ({ - node: { - challenge: { superBlock } - } - }) => superBlock - ) - ); - - // Create intro pages - // TODO: Remove allMarkdownRemark (populate from elsewhere) - result.data.allMarkdownRemark.edges.forEach(edge => { - const { - node: { frontmatter, fields } - } = edge; - - if (!fields) { - return; - } - const { slug, nodeIdentity } = fields; - if (slug.includes('LICENCE')) { - return; - } - try { - if (nodeIdentity === 'blockIntroMarkdown') { - if (!blocks.includes(frontmatter.block)) { - return; - } - } else if (!superBlocks.includes(frontmatter.superBlock)) { - return; + } + allMarkdownRemark { + edges { + node { + fields { + slug + nodeIdentity + component } - const pageBuilder = createByIdentityMap[nodeIdentity](createPage); - pageBuilder(edge); - } catch (e) { - console.log(e); - console.log(` + frontmatter { + certification + block + superBlock + title + } + htmlAst + id + excerpt + } + } + } + } + `); + + // Create challenge pages. + result.data.allChallengeNode.edges.forEach(createChallengePages(createPage)); + + const blocks = uniq( + result.data.allChallengeNode.edges.map( + ({ + node: { + challenge: { block } + } + }) => block + ) + ); + + const superBlocks = uniq( + result.data.allChallengeNode.edges.map( + ({ + node: { + challenge: { superBlock } + } + }) => superBlock + ) + ); + + // Create intro pages + // TODO: Remove allMarkdownRemark (populate from elsewhere) + result.data.allMarkdownRemark.edges.forEach(edge => { + const { + node: { frontmatter, fields } + } = edge; + + if (!fields) { + return; + } + const { slug, nodeIdentity } = fields; + if (slug.includes('LICENCE')) { + return; + } + if (nodeIdentity === 'blockIntroMarkdown') { + if (!blocks.includes(frontmatter.block)) { + return; + } + } else if (!superBlocks.includes(frontmatter.superBlock)) { + return; + } + + try { + const pageBuilder = createByIdentityMap[nodeIdentity](createPage); + pageBuilder(edge); + } catch (e) { + console.log(e); + console.log(` ident: ${nodeIdentity} does not belong to a function ${frontmatter ? JSON.stringify(edge.node) : 'no frontmatter'} `); - } - }); - - return null; - }) - ); + } }); }; diff --git a/client/utils/gatsby/challenge-page-creator.js b/client/utils/gatsby/challenge-page-creator.js index ed00de1a35f..45742c83302 100644 --- a/client/utils/gatsby/challenge-page-creator.js +++ b/client/utils/gatsby/challenge-page-creator.js @@ -146,6 +146,9 @@ exports.createChallengePages = function (createPage) { }; }; +// TODO: figure out a cleaner way to get the last challenge in a block. Create +// it during the curriculum build process and attach it to the first challenge? +// That would remove the need to analyse allChallengeEdges. function getProjectPreviewConfig(challenge, allChallengeEdges) { const { block, challengeOrder, challengeType, usesMultifileEditor } = challenge;