-
Notifications
You must be signed in to change notification settings - Fork 0
/
gatsby-node.js
151 lines (135 loc) · 5.67 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
148
149
150
151
const _ = require('lodash');
const Promise = require('bluebird');
const path = require('path');
const slash = require('slash');
const overrideRoutes = require('./src/Data/routes');
exports.createPages = ({ graphql, actions }) => {
const { createPage } = actions;
return new Promise((resolve, reject) => {
const postTemplate = slash(path.resolve('./src/templates/post-template.jsx')); // C:/Users/mind/.../src/templates/post-template.jsx
const pageTemplate = slash(path.resolve('./src/templates/page-template.jsx'));
const tagTemplate = slash(path.resolve('./src/templates/tag-template.jsx'));
const categoryTemplate = slash(path.resolve('./src/templates/category-template.jsx'));
graphql(`
{
allMarkdownRemark(filter: { frontmatter: { draft: { ne: true } } }) {
edges {
node {
fields {
slug
}
timeToRead
frontmatter {
tags
layout
category
}
}
}
}
}
`).then((result) => {
if (result.errors) {
console.log('ERROR:::', result.errors);
reject(result.errors);
}
const { edges } = result.data.allMarkdownRemark;
const getLayout = (e) => _.get(e, 'node.frontmatter.layout');
const pages = edges.filter((edge) => getLayout(edge) === 'page');
pages.forEach((page) =>
createPage({
path: page.node.fields.slug,
component: pageTemplate,
context: { slug: page.node.fields.slug },
})
);
const posts = edges.filter((edge) => getLayout(edge) === 'post');
posts.forEach((post) => {
createPage({
path: post.node.fields.slug,
component: postTemplate,
context: { slug: post.node.fields.slug },
});
});
const tags = _.uniq(
posts
.map((post) => _.get(post, 'node.frontmatter.tags'))
.flat()
.filter((a) => !!a)
);
tags.forEach((tag) => {
const tagPath = `/tags/${_.kebabCase(tag)}/`;
createPage({
path: tagPath,
component: tagTemplate,
context: { tag },
});
});
const categories = _.uniq(
posts
.map((post) => _.get(post, 'node.frontmatter.category'))
.flat()
.filter((a) => !!a)
);
categories.forEach((category) => {
const categoryPath = `/categories/${_.kebabCase(category)}/`;
createPage({
path: categoryPath,
component: categoryTemplate,
context: { category },
});
});
resolve();
});
});
};
exports.onCreatePage = ({ page, actions: { createPage, deletePage } }) => {
// Override Routes with ./Data/route.js file
const { componentChunkName } = page;
if (componentChunkName) {
const foundOverride = overrideRoutes.find((r) => r.componentChunkName === componentChunkName);
if (foundOverride) {
deletePage(page);
createPage({ ...page, path: foundOverride.overridePath });
}
}
// Error loading a result for the page query in "dev-404-page" / "dev-404-page". Query was not run and no cached result was found. ENOENT: no such file or directory, open
// https://github.com/gatsbyjs/gatsby/issues/16112
if (process.env.NODE_ENV !== `production` && page.path === `/404/`) {
// Make the 404 page match everything client side.
// This will be used as fallback if more specific pages are not found
page.matchPath = `/*`;
createPage(page);
}
};
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField } = actions;
const nodeType = node.internal.type;
if (nodeType === 'File') {
// Specific for /page/date---folders/ with md files
const parsedFilePath = path.parse(node.absolutePath);
let slug = `/${parsedFilePath.dir.split('---')[1]}/`;
createNodeField({ node, name: 'slug', value: slug });
} else if (nodeType === 'MarkdownRemark' && typeof node.slug === 'undefined') {
const fileNode = getNode(node.parent);
let { slug } = fileNode.fields || {};
if (typeof node.frontmatter.path !== 'undefined' && !slug) {
slug = node.frontmatter.path;
}
createNodeField({ node, name: 'slug', value: slug });
if (node.frontmatter.tags) {
const tagSlugs = node.frontmatter.tags.map((tag) => `/tags/${_.kebabCase(tag)}/`);
createNodeField({ node, name: 'tagSlugs', value: tagSlugs });
}
if (typeof node.frontmatter.category !== 'undefined') {
const categorySlug = `/categories/${_.kebabCase(node.frontmatter.category)}/`;
createNodeField({ node, name: 'categorySlug', value: categorySlug });
}
}
};
exports.onCreateWebpackConfig = ({ getConfig, actions }) => {
// console.log('=========@@@@@', getConfig().mode);
//if (getConfig().mode === 'production') {
actions.setWebpackConfig({ devtool: false });
//}
};