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');
|
2019-03-11 08:38:38 -05:00
|
|
|
const { getGithubPath } = require('./utils/getGithubPath');
|
2018-10-04 14:47:55 +01:00
|
|
|
const {
|
|
|
|
createChallengePages,
|
|
|
|
createBlockIntroPages,
|
|
|
|
createSuperBlockIntroPages,
|
2019-01-14 22:49:13 +05:30
|
|
|
createGuideArticlePages
|
2018-10-04 14:47:55 +01:00
|
|
|
} = 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') {
|
2019-02-04 03:46:27 +03:00
|
|
|
const slug = createFilePath({ node, getNode });
|
2018-10-04 14:47:55 +01:00
|
|
|
if (!slug.includes('LICENSE')) {
|
2019-02-04 03:46:27 +03:00
|
|
|
const {
|
2019-03-11 08:38:38 -05:00
|
|
|
fileAbsolutePath,
|
2019-02-04 03:46:27 +03:00
|
|
|
frontmatter: { component = '' }
|
|
|
|
} = node;
|
2018-10-04 14:47:55 +01:00
|
|
|
createNodeField({ node, name: 'slug', value: slug });
|
2019-02-04 03:46:27 +03:00
|
|
|
createNodeField({ node, name: 'component', value: component });
|
2019-03-11 08:38:38 -05:00
|
|
|
createNodeField({
|
|
|
|
node,
|
|
|
|
name: 'githubPath',
|
|
|
|
value: getGithubPath(fileAbsolutePath)
|
|
|
|
});
|
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
|
2019-02-04 03:46:27 +03:00
|
|
|
component
|
2019-03-11 08:38:38 -05:00
|
|
|
githubPath
|
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 (
|
2019-02-19 01:59:12 +03:00
|
|
|
/node_modules/.test(modulePath) &&
|
|
|
|
!/(ansi-styles|chalk|strict-uri-encode|react-freecodecamp-search)/.test(
|
2018-09-30 11:37:19 +01:00
|
|
|
modulePath
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
/* eslint-enable max-len*/
|
|
|
|
})
|
|
|
|
]
|
|
|
|
},
|
|
|
|
node: {
|
|
|
|
fs: 'empty'
|
|
|
|
},
|
|
|
|
plugins: [
|
|
|
|
plugins.define({
|
|
|
|
HOME_PATH: JSON.stringify(
|
|
|
|
process.env.HOME_PATH || 'http://localhost:3000'
|
|
|
|
),
|
2018-11-29 12:12:15 +00:00
|
|
|
STRIPE_PUBLIC_KEY: JSON.stringify(process.env.STRIPE_PUBLIC_KEY || ''),
|
|
|
|
ROLLBAR_CLIENT_ID: JSON.stringify(process.env.ROLLBAR_CLIENT_ID || ''),
|
2018-12-01 11:23:08 +00:00
|
|
|
ENVIRONMENT: JSON.stringify(process.env.NODE_ENV || 'development'),
|
|
|
|
PAYPAL_SUPPORTERS: JSON.stringify(process.env.PAYPAL_SUPPORTERS || 404)
|
2018-09-30 11:37:19 +01:00
|
|
|
}),
|
|
|
|
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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|