-
Notifications
You must be signed in to change notification settings - Fork 0
/
gatsby-node.ts
138 lines (121 loc) · 3.34 KB
/
gatsby-node.ts
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
import path from 'path';
import { GatsbyNode } from 'gatsby';
const templates = {
about: path.resolve(`./src/templates/AboutTemplate.tsx`),
post: path.resolve(`./src/templates/BlogPostTemplate.tsx`),
category: path.resolve(`./src/templates/CategoryTemplate.tsx`),
tag: path.resolve(`./src/templates/TagTemplate.tsx`),
allCategories: path.resolve(`./src/templates/AllCategoriesTemplate.tsx`),
allTags: path.resolve(`./src/templates/AllTagsTemplate.tsx`),
};
export const createSchemaCustomization: GatsbyNode['createSchemaCustomization'] = ({ actions }) => {
const { createTypes } = actions;
createTypes(`
type MdxFrontmatter {
category: String
tag: [String]
}
`);
};
export const onCreateWebpackConfig: GatsbyNode['onCreateWebpackConfig'] = ({
getConfig,
actions,
}) => {
const output = getConfig().output || {};
actions.setWebpackConfig({
output,
resolve: {
alias: {
'@/constants': path.resolve(__dirname, 'src/constants'),
'@/components': path.resolve(__dirname, 'src/components'),
'@/hooks': path.resolve(__dirname, 'src/hooks'),
'@/styles': path.resolve(__dirname, 'src/styles'),
'@/queries': path.resolve(__dirname, 'src/queries'),
},
},
});
};
export const createPages: GatsbyNode['createPages'] = async ({ graphql, actions, reporter }) => {
const { createPage } = actions;
type Data = {
allMdx: {
nodes: {
id: string;
frontmatter: {
slug: string;
category?: string;
tag?: string[];
};
internal: {
contentFilePath: string;
};
}[];
};
};
const queryResult = await graphql<Data>(`
query GetAllMdxPosts {
allMdx {
nodes {
id
frontmatter {
slug
category
tag
}
internal {
contentFilePath
}
}
}
}
`);
if (queryResult.errors) {
reporter.panicOnBuild('🚨 There was an error with the MDX query.', queryResult.errors);
return;
}
const posts = queryResult.data?.allMdx.nodes || [];
const categories = new Set<string>();
const tags = new Set<string>();
posts.forEach(({ id, frontmatter, internal }) => {
const { slug, category, tag } = frontmatter;
if (internal.contentFilePath.includes('about')) {
createPage({
path: `/about`,
component: `${templates.about}?__contentFilePath=${internal.contentFilePath}`,
context: { id },
});
} else {
createPage({
path: `/blog/${slug}`,
component: `${templates.post}?__contentFilePath=${internal.contentFilePath}`,
context: { id, category, tags: tag || [] },
});
if (category) categories.add(category);
tag?.forEach(t => tags.add(t));
}
});
categories.forEach(category =>
createPage({
path: `/category/${category}`,
component: templates.category,
context: { category },
}),
);
tags.forEach(tag =>
createPage({
path: `/tag/${tag}`,
component: templates.tag,
context: { tag },
}),
);
createPage({
path: `/category`,
component: templates.allCategories,
context: { categories: Array.from(categories) },
});
createPage({
path: `/tag`,
component: templates.allTags,
context: { tags: Array.from(tags) },
});
};