| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  | require('dotenv').config(); | 
					
						
							| 
									
										
										
										
											2018-08-23 16:29:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  | const { createFilePath } = require('gatsby-source-filesystem'); | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  | const { dasherize } = require('./utils'); | 
					
						
							|  |  |  | const { blockNameify } = require('./utils/blockNameify'); | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  | const { | 
					
						
							|  |  |  |   createChallengePages, | 
					
						
							|  |  |  |   createBlockIntroPages, | 
					
						
							|  |  |  |   createSuperBlockIntroPages, | 
					
						
							|  |  |  |   createGuideArticlePages | 
					
						
							|  |  |  | } = require('./utils/gatsby'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const createByIdentityMap = { | 
					
						
							|  |  |  |   guideMarkdown: createGuideArticlePages, | 
					
						
							|  |  |  |   blockIntroMarkdown: createBlockIntroPages, | 
					
						
							|  |  |  |   superBlockIntroMarkdown: createSuperBlockIntroPages | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  | exports.onCreateNode = function onCreateNode({ node, actions, getNode }) { | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |   const { createNodeField } = actions; | 
					
						
							|  |  |  |   if (node.internal.type === 'ChallengeNode') { | 
					
						
							|  |  |  |     const { tests = [], block, title, superBlock } = node; | 
					
						
							|  |  |  |     const slug = `/learn/${dasherize(superBlock)}/${dasherize( | 
					
						
							|  |  |  |       block | 
					
						
							|  |  |  |     )}/${dasherize(title)}`;
 | 
					
						
							|  |  |  |     createNodeField({ node, name: 'slug', value: slug }); | 
					
						
							|  |  |  |     createNodeField({ node, name: 'blockName', value: blockNameify(block) }); | 
					
						
							|  |  |  |     createNodeField({ node, name: 'tests', value: tests }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (node.internal.type === 'MarkdownRemark') { | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |     let slug = createFilePath({ node, getNode }); | 
					
						
							|  |  |  |     if (!slug.includes('LICENSE')) { | 
					
						
							|  |  |  |       createNodeField({ node, name: 'slug', value: slug }); | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  | exports.createPages = function createPages({ graphql, actions }) { | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |   const { createPage } = actions; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return new Promise((resolve, reject) => { | 
					
						
							|  |  |  |     // Query for all markdown 'nodes' and for the slug we previously created.
 | 
					
						
							|  |  |  |     resolve( | 
					
						
							|  |  |  |       graphql(`
 | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |           allChallengeNode( | 
					
						
							|  |  |  |             sort: { fields: [superOrder, order, challengeOrder] } | 
					
						
							|  |  |  |           ) { | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |             edges { | 
					
						
							|  |  |  |               node { | 
					
						
							|  |  |  |                 block | 
					
						
							|  |  |  |                 challengeType | 
					
						
							|  |  |  |                 fields { | 
					
						
							|  |  |  |                   slug | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 id | 
					
						
							|  |  |  |                 order | 
					
						
							|  |  |  |                 required { | 
					
						
							|  |  |  |                   link | 
					
						
							|  |  |  |                   src | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |                 challengeOrder | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |                 superBlock | 
					
						
							|  |  |  |                 superOrder | 
					
						
							|  |  |  |                 template | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           allMarkdownRemark { | 
					
						
							|  |  |  |             edges { | 
					
						
							|  |  |  |               node { | 
					
						
							|  |  |  |                 fields { | 
					
						
							|  |  |  |                   slug | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  |                   nodeIdentity | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |                 } | 
					
						
							|  |  |  |                 frontmatter { | 
					
						
							|  |  |  |                   block | 
					
						
							|  |  |  |                   superBlock | 
					
						
							|  |  |  |                   title | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |                 htmlAst | 
					
						
							|  |  |  |                 id | 
					
						
							|  |  |  |                 excerpt | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       `).then(result => {
 | 
					
						
							|  |  |  |         if (result.errors) { | 
					
						
							|  |  |  |           console.log(result.errors); | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  |           return reject(result.errors); | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Create challenge pages.
 | 
					
						
							|  |  |  |         result.data.allChallengeNode.edges.forEach( | 
					
						
							|  |  |  |           createChallengePages(createPage) | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Create intro pages
 | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |         result.data.allMarkdownRemark.edges.forEach(edge => { | 
					
						
							|  |  |  |           const { | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  |             node: { frontmatter, fields } | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |           } = edge; | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |           if (!fields) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  |           const { slug, nodeIdentity } = fields; | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |           if (slug.includes('LICENCE')) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           try { | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  |             const pageBuilder = createByIdentityMap[nodeIdentity](createPage); | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |             return pageBuilder(edge); | 
					
						
							|  |  |  |           } catch (e) { | 
					
						
							|  |  |  |             console.log(`
 | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  |             ident: ${nodeIdentity} does not belong to a function | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             ${frontmatter ? JSON.stringify(edge.node) : 'no frontmatter'} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             `);
 | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  |           return null; | 
					
						
							| 
									
										
										
										
											2018-10-04 14:47:55 +01:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 14:18:46 +01:00
										 |  |  |         return null; | 
					
						
							| 
									
										
										
										
											2018-09-30 11:37:19 +01:00
										 |  |  |       }) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const RmServiceWorkerPlugin = require('webpack-remove-serviceworker-plugin'); | 
					
						
							|  |  |  | const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exports.onCreateWebpackConfig = ({ stage, rules, plugins, actions }) => { | 
					
						
							|  |  |  |   actions.setWebpackConfig({ | 
					
						
							|  |  |  |     module: { | 
					
						
							|  |  |  |       rules: [ | 
					
						
							|  |  |  |         rules.js({ | 
					
						
							|  |  |  |           /* eslint-disable max-len */ | 
					
						
							|  |  |  |           exclude: modulePath => { | 
					
						
							|  |  |  |             return ( | 
					
						
							|  |  |  |               (/node_modules/).test(modulePath) && | 
					
						
							|  |  |  |               !(/(ansi-styles|chalk|strict-uri-encode|react-freecodecamp-search)/).test( | 
					
						
							|  |  |  |                 modulePath | 
					
						
							|  |  |  |               ) | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           /* eslint-enable max-len*/ | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     node: { | 
					
						
							|  |  |  |       fs: 'empty' | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     plugins: [ | 
					
						
							|  |  |  |       plugins.define({ | 
					
						
							|  |  |  |         HOME_PATH: JSON.stringify( | 
					
						
							|  |  |  |           process.env.HOME_PATH || 'http://localhost:3000' | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |         STRIPE_PUBLIC_KEY: JSON.stringify(process.env.STRIPE_PUBLIC_KEY || '') | 
					
						
							|  |  |  |       }), | 
					
						
							|  |  |  |       new RmServiceWorkerPlugin() | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   if (stage !== 'build-html') { | 
					
						
							|  |  |  |     actions.setWebpackConfig({ | 
					
						
							|  |  |  |       plugins: [new MonacoWebpackPlugin()] | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (stage === 'build-html') { | 
					
						
							|  |  |  |     actions.setWebpackConfig({ | 
					
						
							|  |  |  |       plugins: [ | 
					
						
							|  |  |  |         plugins.normalModuleReplacement( | 
					
						
							|  |  |  |           /react-monaco-editor/, | 
					
						
							|  |  |  |           require.resolve('./src/__mocks__/monacoEditorMock.js') | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |       ] | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exports.onCreateBabelConfig = ({ actions }) => { | 
					
						
							|  |  |  |   actions.setBabelPlugin({ | 
					
						
							|  |  |  |     name: '@babel/plugin-proposal-function-bind' | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   actions.setBabelPlugin({ | 
					
						
							|  |  |  |     name: '@babel/plugin-proposal-export-default-from' | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   actions.setBabelPlugin({ | 
					
						
							|  |  |  |     name: 'babel-plugin-transform-imports', | 
					
						
							|  |  |  |     options: { | 
					
						
							|  |  |  |       '@freecodecamp/react-bootstrap': { | 
					
						
							|  |  |  |         transform: '@freecodecamp/react-bootstrap/lib/${member}', | 
					
						
							|  |  |  |         preventFullImport: true | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       lodash: { | 
					
						
							|  |  |  |         transform: 'lodash/${member}', | 
					
						
							|  |  |  |         preventFullImport: true | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }; |