-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgatsby-node.js
166 lines (149 loc) · 4.2 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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
require('dotenv').config({
path: `.env.${process.env.NODE_ENV}`,
})
const config = require.resolve('./src/react-bricks/config.tsx')
const bluebird = require('bluebird')
const fetchPages = require('react-bricks/frontend').fetchPages
const fetchPage = require('react-bricks/frontend').fetchPage
const fetchTags = require('react-bricks/frontend').fetchTags
exports.createPages = async ({ actions: { createPage } }) => {
const appId = process.env.GATSBY_APP_ID
const apiKey = process.env.API_KEY
const publicEnvironment = process.env.GATSBY_PUBLIC_ENVIRONMENT
let errorHeader = false
let errorFooter = false
let errorPage = false
let errorKeys = false
const header = await fetchPage('header', apiKey).catch(() => {
errorHeader = true
return {}
})
const footer = await fetchPage('footer', apiKey).catch(() => {
errorFooter = true
return {}
})
if (!appId || !apiKey) {
console.error(
'App credentials not found. Please, set your GATSBY_APP_ID and API_KEY in your .env.development or .env.production file.'
)
errorKeys = true
createPage({
path: `/`,
component: require.resolve('./src/templates/page.tsx'),
context: {
page: null,
header: null,
footer: null,
errorKeys: errorKeys,
errorPage: errorPage,
errorHeader: errorHeader,
errorFooter: errorFooter,
},
})
return
}
const { items: tags } = await fetchTags(apiKey)
tags.sort()
const allPages = await fetchPages(apiKey, {
pageSize: 1000,
sort: '-publishedAt',
})
if (!allPages || allPages.length === 0) {
console.error(
'No published page was found. Please, create at least one page from the /admin interface.'
)
createPage({
path: `/`,
component: require.resolve('./src/templates/page.tsx'),
context: {
page: null,
header: header,
footer: footer,
errorKeys: errorKeys,
errorPage: errorPage,
errorHeader: errorHeader,
errorFooter: errorFooter,
},
})
return
}
const posts = allPages.filter((page) => page.type === 'blog')
const popularPosts = allPages.filter(
(page) => page.type === 'blog' && page.tags?.includes('popular')
)
const pages = allPages.filter((page) => page.type !== 'blog')
createPage({
path: `/blog`,
component: require.resolve('./src/templates/blog.tsx'),
context: {
posts,
tags,
header: header,
footer: footer,
errorKeys: errorKeys,
errorPage: errorPage,
errorHeader: errorHeader,
errorFooter: errorFooter,
},
})
const allPagesWithContent = await bluebird.map(
pages,
(page) => {
return fetchPage(page.slug, apiKey)
},
{ concurrency: 2 }
)
// Pages
allPagesWithContent
.filter((page) => page.slug !== 'header' && page.slug !== 'footer')
.forEach((page) => {
createPage({
path: page.slug === '/' ? page.slug : `/${page.slug}/`,
component: require.resolve('./src/templates/page.tsx'),
context: {
page: page,
header: header,
footer: footer,
errorKeys: errorKeys,
errorPage: errorPage,
errorHeader: errorHeader,
errorFooter: errorFooter,
},
})
})
tags.forEach((tag) => {
const pagesByTag = posts.filter((page) => page.tags?.includes(tag))
createPage({
path: `/blog/tag/${tag}`,
component: require.resolve('./src/templates/tag.tsx'),
context: {
posts: pagesByTag,
filterTag: tag,
popularPosts,
tags,
header: header,
footer: footer,
errorKeys: errorKeys,
errorPage: errorPage,
errorHeader: errorHeader,
errorFooter: errorFooter,
},
})
})
for (const { slug } of posts) {
const page = await fetchPage(slug, apiKey, undefined, config.pageTypes)
createPage({
path: `/blog/${page.slug}/`,
component: require.resolve('./src/templates/page.tsx'),
context: {
page,
header: header,
footer: footer,
errorKeys: errorKeys,
errorPage: errorPage,
errorHeader: errorHeader,
errorFooter: errorFooter,
},
})
}
}