-
Notifications
You must be signed in to change notification settings - Fork 2
/
gatsby-node.js
109 lines (98 loc) · 2.65 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
const path = require('path');
const createClassificationPages = (createPage, posts) => {
const classifications = [
{
singularName: "category",
pluralName: "categories",
template: {
part: path.resolve(`src/templates/Category.tsx`),
all: path.resolve(`src/templates/AllCategory.tsx`)
},
postsByClassificationNames: getPostsByType(posts, "categories")
},
{
singularName: "tag",
pluralName: "tags",
template: {
part: path.resolve(`src/templates/Tag.tsx`),
all: path.resolve(`src/templates/AllTag.tsx`)
},
postsByClassificationNames: getPostsByType(posts, "tags")
}
]
classifications.forEach(classification => {
const names = Object.keys(classification.postsByClassificationNames)
createPage({
path: `/${classification.pluralName}`,
component: classification.template.all,
context: {
[`${classification.pluralName}`]: names.sort(),
},
});
names.forEach(name => {
const postsByName = classification.postsByClassificationNames[name];
createPage({
path: `/${classification.pluralName}/${name}`,
component: classification.template.part,
context: {
posts: postsByName,
[`${classification.singularName}Name`]: name,
},
});
});
})
};
const getPostsByType = (posts, classificationType) => {
const postsByType = {}
posts.forEach(({ node }) => {
if (node.frontmatter[classificationType]) {
node.frontmatter[classificationType].forEach(name => {
if (!postsByType[name]) {
postsByType[name] = [];
}
postsByType[name].push(node);
});
}
});
return postsByType;
}
exports.createPages = ({ actions, graphql }) => {
const { createPage } = actions;
const postTemplate = path.resolve(`src/templates/Post.tsx`);
return graphql(`{
allMarkdownRemark(
sort: { order: DESC, fields: [frontmatter___date] }
limit: 1000
) {
edges {
node {
excerpt(pruneLength: 250)
html
id
frontmatter {
date
path
title
categories
tags
}
}
}
}
}`).then(result => {
if (result.errors) {
return Promise.reject(result.errors);
}
const posts = result.data.allMarkdownRemark.edges;
createClassificationPages(createPage, posts);
posts.forEach(({ node }) => {
createPage({
path: node.frontmatter.path,
component: postTemplate,
context: {
post: node
}
});
});
});
}