Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 748799a

Browse files
lancemccluskeyrodion-arrbenhalverson
authored
refactor: updating gatsby node file (#1662)
* refactor: updating gatsby node file * refactor: createPage needs context property Co-authored-by: Rodion Abdurakhimov <rodion-arr@users.noreply.github.com> Co-authored-by: Ben Halverson <7907232+benhalverson@users.noreply.github.com>
1 parent 00690d0 commit 748799a

File tree

6 files changed

+476
-250
lines changed

6 files changed

+476
-250
lines changed

gatsby-node.js

Lines changed: 63 additions & 250 deletions
Original file line numberDiff line numberDiff line change
@@ -1,214 +1,80 @@
11
// Use in this file CommonJS syntax see https://www.gatsbyjs.org/docs/migrating-from-v1-to-v2/#convert-to-either-pure-commonjs-or-pure-es6
22
const path = require('path');
3-
const fetch = require('node-fetch');
43
const createSlug = require('./util-node/createSlug');
5-
const getReleaseStatus = require('./util-node/getReleaseStatus');
4+
const getNodeReleasesData = require('./util-node/getNodeReleasesData');
5+
const getBannersData = require('./util-node/getBannersData');
6+
const createPagesQuery = require('./util-node/createPagesQuery');
7+
const createDocPages = require('./util-node/createDocPages');
68
const redirects = require('./util-node/redirects');
79

810
const BLOG_POST_FILENAME_REGEX = /([0-9]+)-([0-9]+)-([0-9]+)-(.+)\.md$/;
911

10-
exports.createPages = ({ graphql, actions }) => {
12+
exports.createPages = async ({ graphql, actions, reporter }) => {
1113
const { createPage, createRedirect } = actions;
1214

13-
return new Promise((resolve, reject) => {
14-
const docTemplate = path.resolve('./src/templates/learn.tsx');
15-
const blogTemplate = path.resolve('./src/templates/blog.tsx');
15+
const result = await graphql(createPagesQuery);
1616

17-
Object.keys(redirects).forEach(from => {
18-
createRedirect({
19-
fromPath: from,
20-
toPath: redirects[from],
21-
isPermanent: true,
22-
});
23-
});
24-
25-
resolve(
26-
graphql(
27-
`
28-
{
29-
allMdx(
30-
filter: {
31-
fields: {
32-
slug: {
33-
nin: [
34-
""
35-
"nodejs-community"
36-
"homepage"
37-
"trademark-policy"
38-
"working-groups"
39-
"resources"
40-
"privacy-policy"
41-
"about"
42-
"governance"
43-
"security"
44-
"package-manager"
45-
]
46-
}
47-
}
48-
}
49-
sort: { fields: [fileAbsolutePath], order: ASC }
50-
) {
51-
edges {
52-
node {
53-
id
54-
fileAbsolutePath
55-
body
56-
parent {
57-
... on File {
58-
relativePath
59-
}
60-
}
61-
frontmatter {
62-
title
63-
description
64-
authors
65-
section
66-
category
67-
}
68-
fields {
69-
slug
70-
}
71-
}
72-
next {
73-
frontmatter {
74-
title
75-
}
76-
fields {
77-
slug
78-
}
79-
}
80-
previous {
81-
frontmatter {
82-
title
83-
}
84-
fields {
85-
slug
86-
}
87-
}
88-
}
89-
}
90-
}
91-
`
92-
).then(result => {
93-
if (result.errors) {
94-
// eslint-disable-next-line no-console
95-
console.log(result.errors);
96-
reject(result.errors);
97-
}
98-
const { edges } = result.data.allMdx;
99-
let navigationData = {};
100-
const docPages = [];
101-
edges.forEach(({ node }, index) => {
102-
const {
103-
fields: { slug },
104-
frontmatter: { title, section, category },
105-
parent: { relativePath },
106-
} = node;
107-
108-
let previousNodeData = null;
109-
const previousNode = index === 0 ? undefined : edges[index - 1].node;
110-
if (previousNode) {
111-
previousNodeData = {
112-
slug: previousNode.fields.slug,
113-
title: previousNode.frontmatter.title,
114-
};
115-
}
17+
if (result.errors) {
18+
reporter.panicOnBuild('Error while running "createPages" GraphQL query.');
19+
return;
20+
}
11621

117-
let nextNodeData = null;
118-
const nextNode =
119-
index === edges.length - 1 ? undefined : edges[index + 1].node;
120-
if (nextNode) {
121-
nextNodeData = {
122-
slug: nextNode.fields.slug,
123-
title: nextNode.frontmatter.title,
124-
};
125-
}
22+
Object.keys(redirects).forEach(from => {
23+
createRedirect({
24+
fromPath: from,
25+
toPath: redirects[from],
26+
isPermanent: true,
27+
});
28+
});
12629

127-
let data;
128-
if (!navigationData[section]) {
129-
data = { title, slug, section, category };
130-
navigationData = {
131-
...navigationData,
132-
[section]: { data: [data], category },
133-
};
134-
} else {
135-
data = { title, slug, section, category };
136-
navigationData = {
137-
...navigationData,
138-
[section]: {
139-
data: [...navigationData[section].data, data],
140-
category: navigationData[section].category,
141-
},
142-
};
143-
}
144-
docPages.push({
145-
slug,
146-
next: nextNodeData,
147-
previous: previousNodeData,
148-
relativePath,
149-
category,
150-
});
151-
});
30+
const docTemplate = path.resolve('./src/templates/learn.tsx');
31+
const blogTemplate = path.resolve('./src/templates/blog.tsx');
15232

153-
docPages.forEach(page => {
154-
const context = {
155-
slug: page.slug,
156-
next: page.next,
157-
previous: page.previous,
158-
relativePath: page.relativePath,
159-
navigationData,
160-
category: page.category,
161-
};
33+
const { edges } = result.data.allMdx;
34+
const docPages = createDocPages(edges);
16235

163-
if (page.category === 'blog') {
164-
createPage({
165-
path: page.slug,
166-
component: blogTemplate,
167-
context,
168-
});
169-
} else if (page.category === 'learn') {
170-
createPage({
171-
path: `/learn/${page.slug}`,
172-
component: docTemplate,
173-
context,
174-
});
175-
createRedirect({
176-
fromPath: `/${page.slug}`,
177-
toPath: `/learn/${page.slug}`,
178-
isPermanent: true,
179-
});
180-
}
36+
docPages.forEach(page => {
37+
if (page.category === 'blog') {
38+
createPage({
39+
path: page.slug,
40+
component: blogTemplate,
41+
context: page,
42+
});
43+
} else if (page.category === 'learn') {
44+
createPage({
45+
path: `/learn/${page.slug}`,
46+
component: docTemplate,
47+
context: page,
48+
});
49+
createRedirect({
50+
fromPath: `/${page.slug}`,
51+
toPath: `/learn/${page.slug}`,
52+
isPermanent: true,
53+
});
54+
}
18155

182-
if (page.slug === 'introduction-to-nodejs') {
183-
createPage({
184-
path: `/learn`,
185-
component: docTemplate,
186-
context,
187-
});
188-
}
189-
});
190-
})
191-
);
56+
if (page.slug === 'introduction-to-nodejs') {
57+
createPage({
58+
path: `/learn`,
59+
component: docTemplate,
60+
context: page,
61+
});
62+
}
19263
});
19364
};
19465

19566
exports.onCreateNode = ({ node, actions, getNode }) => {
19667
if (node.internal.type === 'Mdx') {
19768
const { createNodeField } = actions;
69+
const { fileAbsolutePath, parent, frontmatter } = node;
19870

199-
const { fileAbsolutePath } = node;
200-
let relativePath = '';
201-
if (node.parent && getNode(node.parent))
202-
relativePath = getNode(node.parent).relativePath;
71+
const relativePath =
72+
parent && getNode(parent) ? getNode(parent).relativePath : '';
20373

20474
let slug;
205-
20675
if (fileAbsolutePath && fileAbsolutePath.includes('/blog/')) {
207-
const match = BLOG_POST_FILENAME_REGEX.exec(relativePath || '');
208-
const year = match[1];
209-
const month = match[2];
210-
const day = match[3];
211-
const filename = match[4];
76+
const [, year, month, day, filename] =
77+
BLOG_POST_FILENAME_REGEX.exec(relativePath);
21278

21379
slug = `/blog/${year}/${month}/${day}/${filename}`;
21480

@@ -219,21 +85,20 @@ exports.onCreateNode = ({ node, actions, getNode }) => {
21985
name: 'date',
22086
value: date.toJSON(),
22187
});
222-
} else slug = createSlug(node.frontmatter.title);
88+
} else slug = createSlug(frontmatter.title);
22389

22490
createNodeField({
22591
node,
22692
name: 'slug',
22793
value: slug,
22894
});
22995

230-
let { authors } = node.frontmatter;
96+
const { authors } = frontmatter;
23197
if (authors) {
232-
authors = authors.split(',');
23398
createNodeField({
23499
node,
235100
name: 'authors',
236-
value: authors,
101+
value: authors.split(','),
237102
});
238103
}
239104
}
@@ -248,49 +113,7 @@ exports.sourceNodes = async ({
248113
let activity = activityTimer('Fetching Node release data');
249114
activity.start();
250115
try {
251-
const releasesDataDetailURL = 'https://nodejs.org/dist/index.json';
252-
const releasesDataURL =
253-
'https://raw.githubusercontent.com/nodejs/Release/main/schedule.json';
254-
255-
const releasesDataDetailResponse = await fetch(releasesDataDetailURL);
256-
const releasesDataDetailResult = await releasesDataDetailResponse.json();
257-
258-
const releasesDataResponse = await fetch(releasesDataURL);
259-
const releasesDataResult = await releasesDataResponse.json();
260-
261-
const mappedReleasesDataDetail = releasesDataDetailResult
262-
.map(release => ({
263-
...release,
264-
lts: release.lts || '',
265-
}))
266-
.slice(0, 50);
267-
268-
const filteredReleasesData = Object.keys(releasesDataResult)
269-
.filter(key => {
270-
const release = releasesDataResult[key];
271-
const end = new Date(release.end);
272-
return end >= new Date();
273-
})
274-
.map(key => {
275-
const release = releasesDataResult[key];
276-
277-
return {
278-
endOfLife: release.end,
279-
maintenanceLTSStart: release.maintenance || '',
280-
activeLTSStart: release.lts || '',
281-
codename: release.codename || '',
282-
initialRelease: release.start,
283-
release: key,
284-
status: getReleaseStatus(release),
285-
};
286-
});
287-
288-
const nodeReleasesData = {
289-
nodeReleasesDataDetail: mappedReleasesDataDetail,
290-
nodeReleasesData: filteredReleasesData,
291-
};
292-
293-
const nodeReleasesDataContent = JSON.stringify(nodeReleasesData);
116+
const nodeReleasesData = await getNodeReleasesData();
294117

295118
const nodeReleasesMeta = {
296119
id: createNodeId('node-releases'),
@@ -299,29 +122,21 @@ exports.sourceNodes = async ({
299122
internal: {
300123
type: 'NodeReleases',
301124
mediaType: 'application/json',
302-
content: nodeReleasesDataContent,
125+
content: JSON.stringify(nodeReleasesData),
303126
contentDigest: createContentDigest(nodeReleasesData),
304127
},
305128
};
306129

307-
const nodeReleases = {
130+
await createNode({
308131
...nodeReleasesData,
309132
...nodeReleasesMeta,
310-
};
311-
312-
await createNode(nodeReleases);
133+
});
313134

314135
activity.end();
315136
activity = activityTimer('Fetching Banners');
316137
activity.start();
317138

318-
const siteResponse = await fetch(
319-
'https://raw.githubusercontent.com/nodejs/nodejs.org/master/locale/en/site.json'
320-
);
321-
const siteData = await siteResponse.json();
322-
const { banners: bannersData } = siteData;
323-
324-
const bannersContent = JSON.stringify(bannersData);
139+
const bannersData = await getBannersData();
325140

326141
const bannersMeta = {
327142
id: createNodeId('banners'),
@@ -330,17 +145,15 @@ exports.sourceNodes = async ({
330145
internal: {
331146
type: 'Banners',
332147
mediaType: 'application/json',
333-
content: bannersContent,
148+
content: JSON.stringify(bannersData),
334149
contentDigest: createContentDigest(bannersData),
335150
},
336151
};
337152

338-
const banners = {
153+
await createNode({
339154
...bannersData,
340155
...bannersMeta,
341-
};
342-
343-
await createNode(banners);
156+
});
344157

345158
activity.end();
346159
} catch (err) {

0 commit comments

Comments
 (0)