const path = require(`path`); const { createFilePath } = require(`gatsby-source-filesystem`); exports.onCreateWebpackConfig = ({ actions }) => { actions.setWebpackConfig({ resolve: { fallback: { crypto: require.resolve("crypto-browserify"), stream: require.resolve("stream-browserify"), }, }, }); }; exports.createPages = async ({ graphql, actions, reporter }) => { const { createPage } = actions; // Define a template for news post const PostTemplate = path.resolve(`./src/templates/news-post.js`); // Get all markdown news posts sorted by date and all possible authors const result = await graphql( ` { allMarkdownRemark( sort: { fields: [frontmatter___date], order: ASC } filter: { frontmatter: { external: { eq: null } } } ) { nodes { id fields { slug } } } } ` ); if (result.errors) { reporter.panicOnBuild(`There was an error loading your news posts`, result.errors); return; } const posts = result.data.allMarkdownRemark.nodes; // Create news posts pages // But only if there's at least one markdown file found at "/data/news" (defined in gatsby-config.js) // `context` is available in the template as a prop and as a variable in GraphQL if (posts.length > 0) { posts.forEach((post, index) => { const previousPostId = index === 0 ? null : posts[index - 1].id; const nextPostId = index === posts.length - 1 ? null : posts[index + 1].id; createPage({ path: post.fields.slug, component: PostTemplate, context: { id: post.id, previousPostId, nextPostId, }, }); }); } }; exports.onCreateNode = ({ node, actions, getNode }) => { const { createNodeField } = actions; if (node.internal.type === `MarkdownRemark`) { const value = createFilePath({ node, getNode }); createNodeField({ name: `slug`, node, value, }); } }; exports.createSchemaCustomization = ({ actions }) => { const { createTypes } = actions; // Explicitly define the siteMetadata {} object // This way those will always be defined even if removed from gatsby-config.js // Also explicitly define the Markdown frontmatter // This way the "MarkdownRemark" queries will return `null` even when no // news posts are stored inside "/data/news" instead of returning an error createTypes(` type SiteSiteMetadata { author: String siteUrl: String social: Social } type Author { name: String summary: String } type Social { twitter: String } type MarkdownRemark implements Node { frontmatter: Frontmatter fields: Fields } type Frontmatter { title: String description: String date: Date @dateformat author: String external: String hidden: Boolean categories: [String] avatar: File! @fileByRelativePath } type Fields { slug: String } `); };