-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgatsby-node.js
88 lines (78 loc) · 2.38 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
/**
* Implement Gatsby's Node APIs in this file.
*
* See: https://www.gatsbyjs.org/docs/node-apis/
*/
// You can delete this file if you're not using it
const get = require("lodash.get")
exports.createSchemaCustomization = ({ actions, schema }) => {
const splitProxyString = str =>
str.split(".").reduceRight((acc, chunk) => {
return { [chunk]: acc }
}, true)
actions.createFieldExtension({
name: "proxyResolve",
args: {
from: { type: "String!" },
},
extend: (options, previousFieldConfig) => {
return {
resolve: async (source, args, context, info) => {
await context.nodeModel.prepareNodes(
info.parentType, // BlogPostMarkdown
splitProxyString(options.from), // querying for html field
splitProxyString(options.from), // resolve this field
[info.parentType.name] // The types to use are these
)
const newSource = await context.nodeModel.runQuery({
type: info.parentType,
query: { filter: { id: { eq: source.id } } },
firstOnly: true,
})
return get(newSource.__gatsby_resolved, options.from)
},
}
},
})
actions.createTypes([
`
interface BlogPost @nodeInterface {
id: ID!
title: String!
date: Date @dateformat
body: String!
}
type YamlBlogYaml implements Node & BlogPost @dontInfer {
id: ID!
title: String!
date: Date @dateformat
body: String!
}
type MarkdownRemark implements Node @infer {
frontmatter: MarkdownRemarkFrontmatter!
}
type MarkdownRemarkFrontmatter @infer {
date: Date @dateformat
}
type BlogPostMarkdown implements Node & BlogPost @dontInfer @childOf(type: "MarkdownRemark") {
id: ID!
title: String! @proxyResolve(from: "parent.frontmatter.title")
date: Date @dateformat @proxyResolve(from: "parent.frontmatter.date")
body: String! @proxyResolve(from: "parent.html")
}
`,
])
}
exports.onCreateNode = ({ node, actions, createNodeId }) => {
if (node.internal.type !== "MarkdownRemark") {
return
}
actions.createNode({
id: createNodeId(`BlogPostMarkdown-${node.id}`),
parent: node.id,
internal: {
type: "BlogPostMarkdown",
contentDigest: node.internal.contentDigest,
},
})
}