-
Notifications
You must be signed in to change notification settings - Fork 0
/
gatsby-node.ts
128 lines (112 loc) · 3.96 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
import path from 'path'
import _ from 'lodash'
import { GatsbyNode } from 'gatsby'
export type BlogPostProps = {
slug: string
previous: Queries.MarkdownRemark | null
next: Queries.MarkdownRemark | null
}
export const onCreateWebpackConfig: GatsbyNode['onCreateWebpackConfig'] = ({ actions, stage }) => {
if (stage === 'build-javascript') {
actions.setWebpackConfig({
devtool: false
})
}
}
export const createPages: GatsbyNode['createPages'] = async ({ graphql, actions }) => {
const { createPage } = actions
const blogPost = path.resolve('./src/templates/blog-post.tsx')
createPage({
path: '/',
component: path.resolve('./src/templates/blog-index.tsx')
})
const query = `
{
allMarkdownRemark(
sort: { frontmatter: { date: DESC } }
filter: {fields: {slug: {ne: null}}}
) {
edges {
node {
fields {
slug
maybeAbsoluteLinks
}
frontmatter {
title
}
}
}
}
}
`
type QueryData = {
allMarkdownRemark: Queries.MarkdownRemarkConnection
}
const result = await graphql<QueryData>(query)
if (result.errors) {
console.log(result.errors)
throw result.errors
}
// Create blog posts pages.
const posts = result.data!.allMarkdownRemark.edges
posts.forEach((post, index) => {
if (post.node && post.node.fields) {
const next = index === posts.length - 1 ? null : posts[index + 1].node
const previous = index === 0 ? null : posts[index - 1].node
createPage<BlogPostProps>({
path: post.node.fields.slug!,
component: blogPost,
context: {
slug: post.node.fields.slug!,
previous,
next
}
})
}
})
}
export const onCreateNode: GatsbyNode['onCreateNode'] = ({ node, actions }) => {
const { createNodeField } = actions
const isDevEnv = process.env.NODE_ENV === 'development'
if (node.internal.type === `MarkdownRemark`) {
createNodeField({
node,
name: 'slug',
value:
isDevEnv || !(node.frontmatter as Queries.MarkdownRemark['frontmatter'])?.isPending
? path.basename(path.dirname(node.fileAbsolutePath as string))
: null
})
// Capture a list of what looks to be absolute internal links.
// We'll later remember which of them have translations,
// and use that to render localized internal links when available.
// TODO: check against links with no trailing slashes
// or that already link to translations.
const markdown = node.internal.content || ' '
let maybeAbsoluteLinks: string[] = []
let linkRe = /\]\((\/[^\)]+\/)\)/g
let match = linkRe.exec(markdown)
while (match != null) {
maybeAbsoluteLinks.push(match[1])
match = linkRe.exec(markdown)
}
createNodeField({
node,
name: 'maybeAbsoluteLinks',
value: _.uniq(maybeAbsoluteLinks)
})
}
}
export const createSchemaCustomization: GatsbyNode['createSchemaCustomization'] = ({ actions }) => {
const { createTypes } = actions
createTypes([
`type MarkdownRemarkFields {
maybeAbsoluteLinks: [String!]!
slug: String
}`,
`type MarkdownRemarkFrontmatter {
isPending: Boolean
}`
])
}