-
Notifications
You must be signed in to change notification settings - Fork 22
/
gatsby-node.js
139 lines (123 loc) · 3.26 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 { slugify } = require('./src/util/utilityFunctions')
const authors = require('./src/util/authors')
const _ = require('lodash')
exports.onCreateNode = ({ node, actions }) => {
const { createNodeField } = actions
if (node.internal.type === 'MarkdownRemark') {
const slugFromTitle = slugify(node.frontmatter.title)
createNodeField({
node,
name: 'slug',
value: slugFromTitle,
})
}
}
exports.createPages = async ({ actions, graphql }) => {
const { createPage } = actions
// Page templates
const templates = {
post: path.resolve('src/templates/single-post.js'),
postList: path.resolve('src/templates/post-list.js'),
tag: path.resolve('src/templates/tag-posts.js'),
tagsPage: path.resolve('src/templates/tags-page.js'),
authorPosts: path.resolve('src/templates/author-posts.js'),
}
const res = await graphql(`
{
allMarkdownRemark {
edges {
node {
frontmatter {
author
tags
}
fields {
slug
}
}
}
}
}
`)
if (res.errors) return Promise.reject(res.errors)
// Extracting all posts from res
const posts = res.data.allMarkdownRemark.edges
// Create single post pages
posts.forEach(({ node }) => {
createPage({
path: node.fields.slug,
component: templates.post,
context: {
// Passing slug for template to use to fetch the post
slug: node.fields.slug,
// Find author imageUrl from author array and pass it to template
imageUrl: authors.find(x => x.name === node.frontmatter.author)
.imageUrl,
},
})
})
// Create posts pagination pages
const postsPerPage = 2
const numberOfPages = Math.ceil(posts.length / postsPerPage)
Array.from({ length: numberOfPages }).forEach((_, index) => {
const isFirstPage = index === 0
const currentPage = index + 1
// Skip first page because of index.js
if (isFirstPage) return
createPage({
path: `/page/${currentPage}`,
component: templates.postList,
context: {
limit: postsPerPage,
skip: index * postsPerPage,
numberOfPages: numberOfPages,
currentPage: currentPage,
},
})
})
// Get all tags
let tags = []
_.each(posts, edge => {
if (_.get(edge, 'node.frontmatter.tags')) {
tags = tags.concat(edge.node.frontmatter.tags)
}
})
let tagPostCounts = {} // { tutorial: 2, design: 1}
tags.forEach(tag => {
// Or 0 cause it might not exist yet
tagPostCounts[tag] = (tagPostCounts[tag] || 0) + 1
})
// Remove duplicates
tags = _.uniq(tags)
// Tags page (all tags)
createPage({
path: '/tags',
component: templates.tagsPage,
context: {
tags,
tagPostCounts,
},
})
// Tag posts pages
tags.forEach(tag => {
createPage({
path: `/tag/${_.kebabCase(tag)}`,
component: templates.tag,
context: {
tag,
},
})
})
// Create author posts pages
authors.forEach(author => {
createPage({
path: `/author/${slugify(author.name)}`,
component: templates.authorPosts,
context: {
authorName: author.name,
imageUrl: author.imageUrl,
},
})
})
}