-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgatsby-node.js
139 lines (126 loc) · 3.43 KB
/
gatsby-node.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
const path = require('path')
const _ = require('lodash')
const { createFilePath } = require('gatsby-source-filesystem')
exports.createPages = async ({ graphql, actions }) => {
const { createPage } = actions
const blogPostTemplate = path.resolve('./src/templates/blog-post.jsx')
const plantPostTemplate = path.resolve('./src/templates/plant-post.jsx')
const tagTemplate = path.resolve('src/templates/tags.jsx')
// Get a full list of blog markdown posts
const markdownQueryBlogResult = await graphql(`
{
allMarkdownRemark(
sort: { fields: [frontmatter___date], order: DESC }
filter: { fileAbsolutePath: { regex: "/content/blog/" } }
limit: 1000
) {
edges {
node {
fields {
slug
}
frontmatter {
title
tags
}
}
}
}
}
`)
if (markdownQueryBlogResult.errors) {
console.error(markdownQueryBlogResult.errors)
throw markdownQueryBlogResult.errors
}
// Create blog posts pages.
const blogPosts = markdownQueryBlogResult.data.allMarkdownRemark.edges
blogPosts.forEach((blogPost, index) => {
const previous =
index === blogPosts.length - 1 ? null : blogPosts[index + 1].node
const next = index === 0 ? null : blogPosts[index - 1].node
createPage({
path: `blog${blogPost.node.fields.slug}`,
component: blogPostTemplate,
context: {
slug: blogPost.node.fields.slug,
previous,
next,
},
})
})
// Get a full list of plant markdown posts
const markdownQueryPlantResult = await graphql(`
{
allMarkdownRemark(
filter: { fileAbsolutePath: { regex: "/content/plants/" } }
) {
edges {
node {
fields {
slug
}
frontmatter {
subject
posttype
number
updated
}
}
}
}
}
`)
if (markdownQueryPlantResult.errors) {
console.error(markdownQueryPlantResult.errors)
throw markdownQueryPlantResult.errors
}
// Create plant posts pages.
const plantPosts = markdownQueryPlantResult.data.allMarkdownRemark.edges
plantPosts.forEach((plantPost, index) => {
const previous =
index === plantPosts.length - 1 ? null : plantPosts[index + 1].node
const next = index === 0 ? null : plantPosts[index - 1].node
createPage({
path: `plants${plantPost.node.fields.slug}`,
component: plantPostTemplate,
context: {
slug: plantPost.node.fields.slug,
previous,
next,
},
})
})
// Tag pages:
let tags = []
// Iterate through each post, putting all found tags into `tags`
_.each(blogPosts, edge => {
if (_.get(edge, 'node.frontmatter.tags')) {
edge.node.frontmatter.tags.forEach(tag => {
tags = tags.concat(tag)
})
}
})
// Eliminate duplicate tags
tags = _.uniq(tags)
// Make tag pages
tags.forEach(tag => {
createPage({
path: `/tags/${_.kebabCase(tag)}/`,
component: tagTemplate,
context: {
tag,
},
})
})
}
exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions
if (node.internal.type === `MarkdownRemark`) {
const slug = createFilePath({ node, getNode, basePath: `pages` })
createNodeField({
node,
name: `slug`,
value: slug,
})
}
}