-
Notifications
You must be signed in to change notification settings - Fork 4
/
gatsby-node.js
127 lines (109 loc) · 3.08 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
const path = require("path");
const _ = require("lodash");
const { createFilePath } = require(`gatsby-source-filesystem`);
exports.onCreateNode = ({ node, getNode, actions }) => {
const { createNodeField } = actions;
if (node.internal.type === `MarkdownRemark`) {
const slug = createFilePath({ node, getNode, basePath: `pages` });
const separatorIndex = ~slug.indexOf("_") ? slug.indexOf("_") : 0;
const shortSlugStart = separatorIndex ? separatorIndex + 1 : 0;
const shortSlug = `${separatorIndex ? "/" : ""}${slug.substring(shortSlugStart)}`;
const date = separatorIndex ? slug.substring(separatorIndex, separatorIndex - 10) : "";
createNodeField({
node,
name: `slug`,
value: shortSlug
});
createNodeField({
node,
name: `date`,
value: date
});
if (node.frontmatter.tags) {
createNodeField({
node,
name: `kebabCaseTags`,
value: node.frontmatter.tags.map(tag => _.kebabCase(tag))
});
}
}
};
exports.createPages = async ({ graphql, actions }) => {
const { createPage, createRedirect } = actions;
createRedirect({
fromPath: "https://tech.xsolve.software/*",
toPath: "https://boldare.com/tech-blog/:splat",
isPermanent: true,
redirectInBrowser: true,
force: true
});
createRedirect({
fromPath: "/a",
toPath: "/admin/",
isPermanent: true,
redirectInBrowser: true,
force: true
});
const templates = {
post: path.resolve("./src/templates/PostTemplate.js"),
page: path.resolve("./src/templates/PageTemplate.js"),
tag: path.resolve("./src/templates/TagTemplate.js")
};
const result = await graphql(`
{
allFile(filter: { relativeDirectory: { in: ["posts", "pages"] } }) {
edges {
node {
id
relativePath
childMarkdownRemark {
fields {
slug
date
}
frontmatter {
tags
}
}
}
}
}
}
`);
let tags = [];
const pages = result.data.allFile.edges;
pages.forEach(({ node: page }) => {
const type = /posts/.test(page.relativePath) ? "post" : "page";
if (page.childMarkdownRemark.frontmatter.tags) {
tags = [...tags, ...page.childMarkdownRemark.frontmatter.tags];
}
createRedirect({
fromPath: `${page.childMarkdownRemark.fields.slug}edit`,
toPath: `/admin/#/collections/blog/entries/${
page.childMarkdownRemark.fields.date
}_${page.childMarkdownRemark.fields.slug.substr(1)}`,
isPermanent: true,
redirectInBrowser: true,
force: true
});
createPage({
path: page.childMarkdownRemark.fields.slug,
component: templates[type],
context: {
slug: page.childMarkdownRemark.fields.slug
}
});
});
tags = _.uniq(tags);
tags.forEach(tag => {
const kebabCaseTag = _.kebabCase(tag);
createPage({
path: `/tags/${kebabCaseTag}/`,
component: templates.tag,
context: {
kebabCaseTag,
tag
}
});
});
};