-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgatsby-node.js
100 lines (92 loc) · 2.33 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
const path = require("path")
const fs = require("fs")
const { writeJsonSync } = require("fs-extra")
let data_json = {}
outputJSON = publicFolder => {
writeJsonSync(publicFolder, data_json, { spaces: "\t" })
}
formatMarkdownItems = items => {
return items.edges.map(edge => {
return {
title: edge.node.frontmatter.title,
path: edge.node.frontmatter.path,
url: edge.node.frontmatter.url,
public: edge.node.frontmatter.public,
enabled: edge.node.frontmatter.enabled,
tags: edge.node.frontmatter.tags,
}
})
}
exports.createSchemaCustomization = ({ actions }) => {
const { createTypes } = actions
const typeDefs = `
type MarkdownRemark implements Node {
frontmatter: Frontmatter
}
type Frontmatter {
title: String!
path: String
url: String!
public: Boolean!
enabled: Boolean!
tags: [String!]
}
`
createTypes(typeDefs)
}
exports.createPages = ({ graphql, actions }) => {
const { createRedirect } = actions
const createRedirectItem = item => {
createRedirect({
fromPath: item.path,
toPath: item.url,
isPermanent: true,
force: true,
})
}
return new Promise((resolve, reject) => {
resolve(
graphql(
`
{
items: allMarkdownRemark(
filter: { frontmatter: { enabled: { eq: true }, path: { ne: null } } }
) {
edges {
node {
frontmatter {
title
path
url
public
enabled
tags
}
}
}
totalCount
}
}
`
).then(result => {
if (result.errors) {
reject(result.errors)
}
let items = formatMarkdownItems(result.data.items)
items
.forEach(item => {
createRedirectItem(item)
})
data_json = { items: items }
})
)
})
}
function buildPrefixer(prefix, ...paths) {
return (...subpaths) => path.join(prefix, ...paths, ...subpaths)
}
exports.onPostBuild = async ({ store, pathPrefix }, userPluginOptions) => {
const { program } = store.getState()
const publicFolder = buildPrefixer(program.directory, `public`)
outputJSON(publicFolder(`data.json`))
}