Skip to content

Commit 714c8b6

Browse files
refactor: replacing releases hooks with buildtime fetch (nodejs#1478)
* refactor: replacing releases hooks with buildtime fetch * refactor: removing commented lines Co-authored-by: Ben Halverson <[email protected]>
1 parent 1b0c4c7 commit 714c8b6

41 files changed

Lines changed: 1346 additions & 382 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

gatsby-node.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
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');
34
const createSlug = require('./util-node/createSlug');
5+
const getReleaseStatus = require('./util-node/getReleaseStatus');
46

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

@@ -226,3 +228,80 @@ exports.onCreateNode = ({ node, actions, getNode }) => {
226228
}
227229
}
228230
};
231+
232+
exports.sourceNodes = async ({
233+
actions: { createNode },
234+
createNodeId,
235+
createContentDigest,
236+
reporter: { activityTimer },
237+
}) => {
238+
const activity = activityTimer('Fetching Node release data');
239+
activity.start();
240+
try {
241+
const releasesDataDetailURL = 'https://nodejs.org/dist/index.json';
242+
const releasesDataURL =
243+
'https://raw.githubusercontent.com/nodejs/Release/main/schedule.json';
244+
245+
const releasesDataDetailResponse = await fetch(releasesDataDetailURL);
246+
const releasesDataDetailResult = await releasesDataDetailResponse.json();
247+
248+
const releasesDataResponse = await fetch(releasesDataURL);
249+
const releasesDataResult = await releasesDataResponse.json();
250+
251+
const mappedReleasesDataDetail = releasesDataDetailResult
252+
.map(release => ({
253+
...release,
254+
lts: release.lts || '',
255+
}))
256+
.slice(0, 50);
257+
258+
const filteredReleasesData = Object.keys(releasesDataResult)
259+
.filter(key => {
260+
const release = releasesDataResult[key];
261+
const end = new Date(release.end);
262+
return end >= new Date();
263+
})
264+
.map(key => {
265+
const release = releasesDataResult[key];
266+
267+
return {
268+
endOfLife: release.end,
269+
maintenanceLTSStart: release.maintenance || '',
270+
activeLTSStart: release.lts || '',
271+
codename: release.codename || '',
272+
initialRelease: release.start,
273+
release: key,
274+
status: getReleaseStatus(release),
275+
};
276+
});
277+
278+
const nodeReleasesData = {
279+
nodeReleasesDataDetail: mappedReleasesDataDetail,
280+
nodeReleasesData: filteredReleasesData,
281+
};
282+
283+
const nodeReleasesDataContent = JSON.stringify(nodeReleasesData);
284+
285+
const nodeReleasesMeta = {
286+
id: createNodeId('node-releases'),
287+
parent: null,
288+
children: [],
289+
internal: {
290+
type: 'NodeReleases',
291+
mediaType: 'application/json',
292+
content: nodeReleasesDataContent,
293+
contentDigest: createContentDigest(nodeReleasesData),
294+
},
295+
};
296+
297+
const nodeReleases = {
298+
...nodeReleasesData,
299+
...nodeReleasesMeta,
300+
};
301+
302+
await createNode(nodeReleases);
303+
activity.end();
304+
} catch (err) {
305+
activity.panic(err);
306+
}
307+
};

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"gatsby-transformer-remark": "^4.5.0",
4141
"gatsby-transformer-yaml": "^3.4.0",
4242
"intersection-observer": "^0.12.0",
43+
"node-fetch": "^2.6.1",
4344
"prismjs": "^1.23.0",
4445
"react": "^16.13.1",
4546
"react-dom": "^16.13.1",

src/components/DownloadAdditional/__tests__/download-additional.test.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ import DownloadAdditional from '..';
44

55
describe('DownloadAdditional component', (): void => {
66
const releaseData = {
7-
date: 'date',
87
version: 'version',
9-
files: [],
10-
lts: true,
11-
v8: 'v8',
8+
lts: '',
9+
npm: '6.14.8',
1210
};
1311

1412
it('renders correctly', (): void => {

src/components/DownloadAdditional/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React, { useState, FC } from 'react';
22
import DownloadToggle from '../DownloadToggle';
3-
import { ReleaseData } from '../../hooks/useReleaseHistory';
3+
import { NodeReleaseLTSNPMVersion } from '../../types';
44
import { getDownloadableItemsList, Downloadable } from './downloadItems';
55
import './DownloadAdditional.scss';
66

@@ -75,7 +75,7 @@ const DownloadableItem: FC<DownloadableItemProps> = ({
7575
};
7676

7777
interface DownloadAdditionalProps {
78-
line?: ReleaseData;
78+
line?: NodeReleaseLTSNPMVersion;
7979
selectedTypeRelease: string;
8080
handleTypeReleaseToggle: (selected: React.SetStateAction<string>) => void;
8181
}

src/components/DownloadCards/index.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, { useState, useEffect } from 'react';
2-
3-
import { ReleaseData } from '../../hooks/useReleaseHistory';
2+
import { NodeReleaseLTSNPMVersion } from '../../types';
43
import appleLogo from '../../images/logos/apple-logo.svg';
54
import microsoftLogo from '../../images/logos/microsoft-download-logo.svg';
65
import sourceCodeIcon from '../../images/logos/source-code-icon.svg';
@@ -9,7 +8,7 @@ import DownloadCard from './DownloadCard';
98
import './DownloadCards.scss';
109

1110
interface Props {
12-
line?: ReleaseData;
11+
line?: NodeReleaseLTSNPMVersion;
1312
userOS: UserOS;
1413
}
1514

src/components/DownloadHeader/__tests__/download-header.test.tsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,9 @@ describe('DownloadHeader component', (): void => {
77
const { container } = render(
88
<DownloadHeader
99
release={{
10-
date: '2020-09-15',
11-
files: [],
12-
lts: false,
13-
modules: '83',
10+
lts: '',
1411
npm: '6.14.8',
15-
openssl: '1.1.1g',
16-
security: true,
17-
uv: '1.39.0',
18-
v8: '8.4.371.19',
1912
version: 'v14.11.0',
20-
zlib: '1.2.11',
2113
}}
2214
/>
2315
);

src/components/DownloadHeader/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import React from 'react';
2-
import { ReleaseData } from '../../hooks/useReleaseHistory';
2+
import { NodeReleaseLTSNPMVersion } from '../../types';
33
import './DownloadHeader.scss';
44

55
interface Props {
6-
release?: ReleaseData;
6+
release?: NodeReleaseLTSNPMVersion;
77
}
88

99
export default function DownloadHeader({ release }: Props): JSX.Element {

src/components/DownloadReleases/DownloadTable.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import React from 'react';
2-
3-
import { NodeReleaseData } from '../../hooks/useReleaseHistory';
2+
import { NodeReleaseData } from '../../types';
43
import './DownloadTable.scss';
54

65
interface Props {
7-
releases: NodeReleaseData[];
6+
nodeReleasesData: NodeReleaseData[];
87
}
98

10-
const DownloadTable = ({ releases }: Props): JSX.Element => (
9+
const DownloadTable = ({ nodeReleasesData }: Props): JSX.Element => (
1110
<div className="downloads-table-container">
1211
<table className="downloads-table">
1312
<thead>
@@ -17,12 +16,12 @@ const DownloadTable = ({ releases }: Props): JSX.Element => (
1716
<th>Codename</th>
1817
<th>Initial Release</th>
1918
<th>Active LTS Start</th>
20-
<th>Maintainance LTS Start</th>
19+
<th>Maintenance LTS Start</th>
2120
<th>End of Life</th>
2221
</tr>
2322
</thead>
2423
<tbody>
25-
{releases.map(
24+
{nodeReleasesData.map(
2625
({
2726
release,
2827
status,

0 commit comments

Comments
 (0)