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
22const path = require ( 'path' ) ;
3- const fetch = require ( 'node-fetch' ) ;
43const 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' ) ;
68const redirects = require ( './util-node/redirects' ) ;
79
810const BLOG_POST_FILENAME_REGEX = / ( [ 0 - 9 ] + ) - ( [ 0 - 9 ] + ) - ( [ 0 - 9 ] + ) - ( .+ ) \. m d $ / ;
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
19566exports . 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