-
Notifications
You must be signed in to change notification settings - Fork 0
/
gatsby-node.js
147 lines (135 loc) · 4.38 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
140
141
142
143
144
145
146
147
'use strict'
const path = require(`path`)
const config = require('./config.js')
exports.createPages = async ({ graphql, actions, reporter }) => {
const { createPage } = actions
const postTemplate = path.resolve(`./src/templates/post-template.tsx`)
const projectTemplate = path.resolve(`./src/templates/project-template.tsx`)
// fetch blog post and project data, to create pages
const data = await graphql(`
{
blog: allMarkdownRemark(
filter: { fileAbsolutePath: { regex: "${config.content.blogPostsPath}" }, frontmatter: {draft: {ne: true}} }
sort: { fields: [frontmatter___date], order: DESC }
) {
nodes {
id
frontmatter {
slug
title
}
}
}
projects: allMarkdownRemark(
filter: { fileAbsolutePath: { regex: "${config.content.projectsPath}" }, frontmatter: {draft: {ne: true}} }
sort: { fields: [frontmatter___date], order: DESC }
) {
nodes {
id
frontmatter {
slug
title
}
}
}
}
`)
if (data.errors) {
reporter.panicOnBuild(`There was an error loading blog posts / projects!`, result.errors)
return
}
// * render all project pages
const allProjects = data.data.projects.nodes
if (!allProjects || allProjects.length <= 0) {
reporter.panicOnBuild(`There are no projects!`)
return
}
allProjects.forEach(project => {
createPage({
path: '/projects' + project.frontmatter.slug,
component: projectTemplate,
context: {
id: project.id,
slug: project.frontmatter.slug,
imgMaxWidth: config.maxWidth,
imgQuality: config.content.imgQuality,
dateFormat: config.content.dateFormat
}
})
})
// * render all blog post pages
const allPosts = data.data.blog.nodes
if (!allPosts || allPosts.length <= 0) {
reporter.panicOnBuild(`There are no blog posts!`)
return
}
allPosts.forEach((post, index) => {
const nextPost = index === 0 ? null : allPosts[index - 1]
const prevPost = index === allPosts.length - 1 ? null : allPosts[index + 1]
createPage({
path: '/blog' + post.frontmatter.slug,
component: postTemplate,
context: {
id: post.id,
slug: post.frontmatter.slug,
prevPost,
nextPost,
imgMaxWidth: config.maxWidth,
imgQuality: config.content.imgQuality,
dateFormat: config.content.dateFormat
}
})
})
}
exports.onCreatePage = ({ page, actions }) => {
const { createPage, deletePage } = actions
deletePage(page)
createPage({
...page,
context: {
...page.context,
filterBlog: {
'fileAbsolutePath': { 'regex': config.content.blogPostsPath },
'frontmatter': { 'draft': { 'ne': true } }
},
filterProjects: {
'fileAbsolutePath': { 'regex': config.content.projectsPath },
'frontmatter': { 'draft': { 'ne': true } }
},
sort: config.content.sort,
imgMaxWidth: config.maxWidth,
imgQuality: config.content.imgQuality,
dateFormat: config.content.dateFormat
}
})
}
exports.onCreateNode = ({ node }) => {
// * create blog post / project fallback data
// the node should be located in 'content/blog/' to be considered
// const isBlogPost = new RegExp(/content\/blog\//).test(node.fileAbsolutePath)
const isBlogPost = new RegExp(config.blogPostsPath).test(node.fileAbsolutePath)
// the node should be located in 'content/projects/' to be considered
// const isProject = new RegExp(/content\/projects\//).test(node.fileAbsolutePath)
const isProject = new RegExp(config.projectsPath).test(node.fileAbsolutePath)
if (node.internal.type === 'MarkdownRemark' && (isBlogPost || isProject)) {
// if there's no date, set it to now
if (!node.frontmatter.date) {
node.frontmatter.date = new Date().toISOString()
}
// if there's no description, set it to empty
if (!node.frontmatter.description) {
node.frontmatter.description = ''
}
// if there's no thumbnail, use the 404 logo
if (!node.frontmatter.thumbnail) {
node.frontmatter.thumbnail = '../../assets/logo-404.svg'
}
// if there are no keywords or a category, set them to empty
if (!node.frontmatter.keywords) {
node.frontmatter.keywords = []
}
if (!node.frontmatter.category) {
node.frontmatter.category = ''
}
}
}