const path = require(`path`); const fs = require("fs"); const { createFilePath } = require(`gatsby-source-filesystem`); exports.onCreateNode = ({ node, actions, getNode }) => { const { createNodeField } = actions; if (node.internal.type === `MarkdownRemark`) { const value = createFilePath({ node, getNode }); createNodeField({ name: `slug`, node, value }); } if (node.internal.type === `UnicornsJson`) { const value = createFilePath({ node, getNode }); createNodeField({ name: `slug`, node, value }); } }; exports.sourceNodes = ({ getNodesByType, actions: { createNodeField } }) => { const postNodes = getNodesByType(`MarkdownRemark`); const unicornNodes = getNodesByType(`UnicornsJson`); unicornNodes.forEach(unicornNode => { const isAuthor = postNodes // Ensure it's actually a post .filter(post => !!post.frontmatter.authors) .some(post => { return post.frontmatter.authors.includes(unicornNode.id); }); createNodeField({ name: `isAuthor`, node: unicornNode, value: isAuthor }); }); }; exports.createPages = ({ graphql, actions }) => { const { createPage } = actions; const blogPost = path.resolve(`./src/templates/blog-post.js`); const blogProfile = path.resolve(`./src/templates/blog-profile.js`); const postList = path.resolve(`./src/templates/post-list.js`); return graphql( ` { allMarkdownRemark( sort: { fields: [frontmatter___published], order: DESC } filter: { fileAbsolutePath: { regex: "/content/blog/" } } limit: 1000 ) { edges { node { fields { slug } frontmatter { title authors { id } } } } } allUnicornsJson(limit: 100) { edges { node { id } } } } ` ).then(result => { if (result.errors) { throw result.errors; } // Create blog posts pages. const posts = result.data.allMarkdownRemark.edges; const unicorns = result.data.allUnicornsJson.edges; posts.forEach((post, index, arr) => { const previous = index === arr.length - 1 ? null : arr[index + 1].node; const next = index === 0 ? null : arr[index - 1].node; const postInfo = post.node.frontmatter; if (postInfo.attached && postInfo.attached.length > 0) { postInfo.attached.forEach(({ file: fileStr }) => { const postPath = post.node.fields.slug; const relFilePath = path.join( __dirname, "static", "posts", postPath, fileStr ); const fileExists = fs.existsSync(path.resolve(relFilePath)); if (!fileExists) { console.error( `Could not find file to attach in the static folder: ${postPath}${fileStr}` ); console.error( `To fix this problem, attach the file to the static folder's expected path above, or remove it from the post frontmatter definition` ); process.exit(1); } }); } createPage({ path: `posts${post.node.fields.slug}`, component: blogPost, context: { slug: post.node.fields.slug, previous, next } }); }); const postsPerPage = 8; const numberOfPages = Math.ceil(posts.length / postsPerPage); createPage({ path: `/`, component: postList, context: { limitNumber: postsPerPage, skipNumber: 0, pageIndex: 1, numberOfPages, relativePath: "" } }); for (const i of Array(numberOfPages).keys()) { if (i === 0) continue; const pageNum = i + 1; const skipNumber = postsPerPage * i; createPage({ path: `page/${pageNum}`, component: postList, context: { limitNumber: postsPerPage, skipNumber, pageIndex: pageNum, numberOfPages, relativePath: "" } }); } unicorns.forEach(unicorn => { const uniId = unicorn.node.id; const uniPosts = posts.filter(({ node: { frontmatter } }) => frontmatter.authors.find(uni => uni.id === uniId) ); const numberOfUniPages = Math.ceil(uniPosts.length / postsPerPage); createPage({ path: `unicorns/${unicorn.node.id}`, component: blogProfile, context: { slug: uniId, limitNumber: postsPerPage, skipNumber: 0, pageIndex: 1, numberOfPages: numberOfUniPages, relativePath: `unicorns/${uniId}` } }); for (const i of Array(numberOfUniPages).keys()) { if (i === 0) continue; const pageNum = i + 1; const skipNumber = postsPerPage * i; createPage({ path: `unicorns/${uniId}/page/${pageNum}`, component: blogProfile, context: { slug: uniId, limitNumber: postsPerPage, skipNumber, pageIndex: pageNum, numberOfPages: numberOfUniPages, relativePath: `unicorns/${uniId}` } }); } }); return null; }); };