Files
freeCodeCamp/client/gatsby-node.js
2026-03-11 08:53:10 -07:00

119 lines
3.3 KiB
JavaScript

const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
const webpack = require('webpack');
const env = require('./config/env.json');
const { createSuperBlockIntroPages } = require('./utils/gatsby');
exports.createPages = async function createPages({
actions,
graphql,
reporter
}) {
if (!env.algoliaAPIKey || !env.algoliaAppId) {
if (process.env.FREECODECAMP_NODE_ENV === 'production') {
throw new Error(
'Algolia App id and API key are required to start the client!'
);
} else {
reporter.info(
'Algolia keys missing or invalid. Required for search to yield results.'
);
}
}
if (!env.stripePublicKey) {
if (process.env.FREECODECAMP_NODE_ENV === 'production') {
throw new Error('Stripe public key is required to start the client!');
} else {
reporter.info(
'Stripe public key is missing or invalid. Required for Stripe integration.'
);
}
}
const { createPage } = actions;
const {
data: { allSuperBlockStructure }
} = await graphql(`
{
allSuperBlockStructure {
nodes {
superBlock
}
}
}
`);
const superBlocks = allSuperBlockStructure.nodes.map(node => node.superBlock);
superBlocks.forEach(superBlock => {
createSuperBlockIntroPages(createPage)({ superBlock });
});
};
exports.onCreateWebpackConfig = ({ stage, actions }) => {
const newPlugins = [
// We add the shims of the node globals to the global scope
new webpack.ProvidePlugin({
Buffer: ['buffer', 'Buffer']
}),
new webpack.ProvidePlugin({
process: 'process/browser'
})
];
// The monaco editor relies on some browser only globals so should not be
// involved in SSR. Also, if the plugin is used during the 'build-html' or
// 'develop-html' stage it overwrites the minfied files with ordinary ones.
if (stage !== 'build-html' && stage !== 'develop-html') {
newPlugins.push(
new MonacoWebpackPlugin({ filename: '[name].worker-[contenthash].js' })
);
}
actions.setWebpackConfig({
resolve: {
fallback: {
fs: false,
path: require.resolve('path-browserify'),
assert: require.resolve('assert'),
crypto: require.resolve('crypto-browserify'),
util: require.resolve('util/util'),
buffer: require.resolve('buffer'),
stream: require.resolve('stream-browserify'),
process: require.resolve('process/browser')
}
},
plugins: newPlugins,
ignoreWarnings: [
warning => {
if (warning instanceof Error) {
if (warning.message.includes('mini-css-extract-plugin')) {
return true;
}
}
return false;
}
]
});
};
exports.onCreateBabelConfig = ({ actions }) => {
actions.setBabelPlugin({
name: '@babel/plugin-proposal-function-bind'
});
actions.setBabelPlugin({
name: '@babel/plugin-proposal-export-default-from'
});
};
exports.createSchemaCustomization = ({ actions }) => {
const { createTypes } = actions;
// This hook is supported by the test runner, but is not currently used by the
// client, so we have to tell Gatsby that it exists.
const typeDefs = `
type ChallengeNodeChallengeHooks {
afterEach: String
}
`;
createTypes(typeDefs);
};