-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgatsby-node.js
130 lines (120 loc) · 3.98 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
/**
* Implement Gatsby's Node APIs in this file.
*
* See: https://www.gatsbyjs.org/docs/node-apis/
*/
const path = require("path");
const { fmImagesToRelative } = require("gatsby-remark-relative-images");
const {
getNumberOfPostsOfType,
mergeAndSortBlogEdges,
} = require("./src/utils/blog.js");
exports.onCreateNode = ({ actions, getNode, node }) => {
const { createNodeField } = actions;
const markdownTypes = ["MarkdownRemark", "Mdx"];
if (node && node.internal && markdownTypes.includes(node.internal.type)) {
const parent = getNode(node.parent);
createNodeField({
node,
name: "collection",
value: parent.sourceInstanceName,
});
}
fmImagesToRelative(node);
};
exports.createPages = ({ actions, graphql }) => {
const { createPage } = actions;
const blogPostTemplate = path.resolve(
"src/components/blog-post/blog-post.js",
);
const blogListLayout = path.resolve(
"src/components/blog-list/blog-list.js",
);
return graphql(`
{
markdownPages: allMarkdownRemark(
filter: { fields: { collection: { eq: "blog" } } }
sort: { order: DESC, fields: [frontmatter___date] }
limit: 1000
) {
edges {
node {
id
frontmatter {
date
path
title
}
}
}
}
mdxPages: allMdx(
filter: { fields: { collection: { eq: "blog" } } }
sort: { order: DESC, fields: [frontmatter___date] }
limit: 1000
) {
edges {
node {
id
frontmatter {
date
path
title
}
}
}
}
}
`).then(result => {
if (result.errors) {
return Promise.reject(result.errors);
}
const { markdownPages, mdxPages } = result.data;
const allEdges = mergeAndSortBlogEdges(markdownPages, mdxPages);
const totalResults = allEdges.length;
const postsPerPage = 10;
const numPages = Math.ceil(totalResults / postsPerPage);
let markdownPostsAccountedFor = 0;
let mdxPostsAccountedFor = 0;
Array.from({ length: numPages }).forEach((_, i) => {
const currentPagePosts = allEdges.slice(
i * postsPerPage,
(i + 1) * postsPerPage,
);
const markdownPostsInPage = getNumberOfPostsOfType(
currentPagePosts,
markdownPages,
);
const mdxPostsInPage = getNumberOfPostsOfType(
currentPagePosts,
mdxPages,
);
createPage({
path: i === 0 ? "/blog" : `/blog/page/${i + 1}`,
component: blogListLayout,
context: {
markdownLimit: markdownPostsInPage,
mdxLimit: mdxPostsInPage,
markdownSkip: markdownPostsAccountedFor,
mdxSkip: mdxPostsAccountedFor,
currentPage: i + 1,
numPages,
},
});
markdownPostsAccountedFor += markdownPostsInPage;
mdxPostsAccountedFor += mdxPostsInPage;
});
allEdges.forEach(({ node }, index) => {
const prev = allEdges[index - 1];
const next = allEdges[index + 1];
createPage({
path: node.frontmatter.path,
component: blogPostTemplate,
context: {
prev: prev,
next: next,
},
});
});
});
};