Skip to content

Commit 743f359

Browse files
authored
Make gatsby-node more clear for /code page (graphql#1377)
1 parent 854d7e6 commit 743f359

File tree

6 files changed

+216
-157
lines changed

6 files changed

+216
-157
lines changed

gatsby-node.ts

Lines changed: 10 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import { GatsbyNode } from "gatsby"
22
import * as path from "path"
3-
import { promisify } from "util"
4-
import { readFile } from "fs/promises"
53
import * as globby from "globby"
6-
import * as frontmatterParser from "parser-front-matter"
7-
import { sortLibs } from "./scripts/sort-libraries/sort-libraries"
8-
9-
const parse$ = promisify(frontmatterParser.parse)
4+
import { updateCodeData } from "./scripts/update-code-data/update-code-data"
5+
import { organizeCodeData } from "./scripts/update-code-data/organize-code-data"
6+
import { sortCodeData } from "./scripts/update-code-data/sort-code-data"
107

118
export const createSchemaCustomization: GatsbyNode["createSchemaCustomization"] =
129
async ({ actions }) => {
@@ -85,15 +82,10 @@ export const onCreatePage: GatsbyNode["onCreatePage"] = async ({
8582
page,
8683
actions,
8784
}) => {
88-
// trying to refactor code to be "the Gatsby way".
89-
// from the paths on ready, ignores a bunch of existing custom logic below.
90-
if (page.path.startsWith("/blog")) {
91-
return
92-
}
93-
if (page.path.startsWith("/tags")) {
85+
// This way is not "the Gatsby way", we create the pages, delete the pages, and create "code" paths page again.
86+
if (page.path.startsWith("/blog") || page.path.startsWith("/tags")) {
9487
return
9588
}
96-
9789
const { createPage, deletePage } = actions
9890
deletePage(page)
9991
let context = {
@@ -102,144 +94,14 @@ export const onCreatePage: GatsbyNode["onCreatePage"] = async ({
10294
}
10395
if (page.path === "/code" || page.path === "/code/") {
10496
const markdownFilePaths = await globby("src/content/code/**/*.md")
105-
const codeData: any = {}
10697
const slugMap = require("./src/content/code/slug-map.json")
107-
await Promise.all(
108-
markdownFilePaths.map(async markdownFilePath => {
109-
const markdownFileContent = await readFile(markdownFilePath, "utf-8")
110-
let {
111-
data: { name, description, url, github, npm, gem },
112-
content: howto,
113-
} = await parse$(markdownFileContent)
114-
howto = howto.trim()
115-
const pathArr = markdownFilePath.split("/")
116-
if (markdownFilePath.includes("language-support")) {
117-
const languageSupportDirIndex = pathArr.indexOf("language-support")
118-
const languageNameSlugIndex = languageSupportDirIndex + 1
119-
const languageNameSlug = pathArr[languageNameSlugIndex]
120-
const languageName = slugMap[languageNameSlug]
121-
codeData.Languages ||= {}
122-
codeData.Languages[languageName] ||= {}
123-
124-
const categoryNameSlugIndex = languageSupportDirIndex + 2
125-
const categoryNameSlug = pathArr[categoryNameSlugIndex]
126-
const categoryName = slugMap[categoryNameSlug]
127-
codeData.Languages[languageName][categoryName] ||= []
128-
codeData.Languages[languageName][categoryName].push({
129-
name,
130-
description,
131-
howto,
132-
url,
133-
github,
134-
npm,
135-
gem,
136-
sourcePath: markdownFilePath,
137-
})
138-
} else if (markdownFilePath.includes("tools")) {
139-
const toolSupportDirIndex = pathArr.indexOf("tools")
140-
const toolNameSlugIndex = toolSupportDirIndex + 1
141-
const toolNameSlug = pathArr[toolNameSlugIndex]
142-
const toolName = slugMap[toolNameSlug]
143-
codeData.ToolsNew ||= {}
144-
codeData.ToolsNew[toolName] ||= {}
145-
const categoryToolsNameSlugIndex = toolSupportDirIndex + 2
146-
const categoryToolsNameSlug = pathArr[categoryToolsNameSlugIndex]
147-
const categoryToolsName = slugMap[categoryToolsNameSlug]
148-
codeData.ToolsNew[toolName][categoryToolsName] ||= []
149-
150-
codeData.ToolsNew[toolName][categoryToolsName].push({
151-
name,
152-
description,
153-
howto,
154-
url,
155-
github,
156-
npm,
157-
gem,
158-
sourcePath: markdownFilePath,
159-
})
160-
} else {
161-
const codeDirIndex = pathArr.indexOf("code")
162-
const categoryNameSlugIndex = codeDirIndex + 1
163-
const categoryNameSlug = pathArr[categoryNameSlugIndex]
164-
const categoryName = slugMap[categoryNameSlug]
165-
codeData[categoryName] ||= []
166-
codeData[categoryName].push({
167-
name,
168-
description,
169-
howto,
170-
url,
171-
github,
172-
npm,
173-
gem,
174-
sourcePath: markdownFilePath,
175-
})
176-
}
177-
})
178-
)
179-
const languageList: any = []
180-
const toolList: any = []
181-
await Promise.all([
182-
...Object.keys(codeData.Languages).map(async languageName => {
183-
const libraryCategoryMap = codeData.Languages[languageName]
184-
let languageTotalStars = 0
185-
await Promise.all(
186-
Object.keys(libraryCategoryMap).map(async libraryCategoryName => {
187-
const libraries = libraryCategoryMap[libraryCategoryName]
188-
const { sortedLibs, totalStars } = await sortLibs(libraries)
189-
190-
libraryCategoryMap[libraryCategoryName] = sortedLibs
191-
languageTotalStars += totalStars || 0
192-
})
193-
)
194-
languageList.push({
195-
name: languageName,
196-
totalStars: languageTotalStars,
197-
categoryMap: libraryCategoryMap,
198-
})
199-
}),
200-
...Object.keys(codeData.ToolsNew).map(async toolName => {
201-
const toolCategoryMap = codeData.ToolsNew[toolName]
202-
let toolTotalStars = 0
203-
await Promise.all(
204-
Object.keys(toolCategoryMap).map(async toolCategoryName => {
205-
const tools = toolCategoryMap[toolCategoryName]
206-
const { sortedLibs, totalStars } = await sortLibs(tools)
207-
toolCategoryMap[toolCategoryName] = sortedLibs
208-
toolTotalStars += totalStars || 0
209-
})
210-
)
211-
toolList.push({
212-
name: toolName,
213-
totalStars: toolTotalStars,
214-
categoryMap: toolCategoryMap,
215-
})
216-
}),
217-
])
98+
const codeData = await updateCodeData(markdownFilePaths, slugMap)
99+
const organizeData = await organizeCodeData(codeData)
100+
const sortedOrganizeData = await sortCodeData(organizeData)
218101

219102
context = {
220-
...context,
221-
otherLibraries: {
222-
Services: codeData.Services,
223-
"More Stuff": codeData["More Stuff"],
224-
},
225-
languageList: languageList.sort((a, b) => {
226-
if (a.totalStars > b.totalStars) {
227-
return -1
228-
}
229-
if (a.totalStars < b.totalStars) {
230-
return 1
231-
}
232-
return 0
233-
}),
234-
toolList: toolList.sort((a, b) => {
235-
if (a.totalStars > b.totalStars) {
236-
return -1
237-
}
238-
if (a.totalStars < b.totalStars) {
239-
return 1
240-
}
241-
return 0
242-
}),
103+
sourcePath: path.relative(__dirname, page.path),
104+
...sortedOrganizeData,
243105
}
244106
}
245107
createPage({

scripts/sort-libraries/sort-libraries.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { getGitHubStats } from "./get-github-stats"
33
import { getHttpScore } from "./get-http-score"
44
import { getNpmStats } from "./get-npm-stats"
55

6-
interface Library {
6+
export interface Library {
77
name: string
88
description: string
99
howto: string
1010
url: string
11-
github: string
11+
github: string | undefined
1212
npm: string | undefined
1313
gem: string | undefined
1414
sourcePath: string
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { Library, sortLibs } from "../sort-libraries/sort-libraries"
2+
import { CodeData } from "./update-code-data"
3+
4+
export type List = {
5+
name: string
6+
totalStars: number
7+
categoryMap: {
8+
[categoryName: string]: Library[]
9+
}
10+
}
11+
12+
export async function organizeCodeData(
13+
codeData: CodeData
14+
): Promise<{ languageList: List[]; toolList: List[]; serviceList: Library[] }> {
15+
let languageList: List[] = []
16+
let toolList: List[] = []
17+
let serviceList: Library[] = []
18+
await Promise.all([
19+
...Object.keys(codeData.Languages).map(async languageName => {
20+
const libraryCategoryMap = codeData.Languages[languageName]
21+
let languageTotalStars = 0
22+
await Promise.all(
23+
Object.keys(libraryCategoryMap).map(async libraryCategoryName => {
24+
const libraries = libraryCategoryMap[libraryCategoryName]
25+
const { sortedLibs, totalStars } = await sortLibs(libraries)
26+
27+
libraryCategoryMap[libraryCategoryName] = sortedLibs
28+
languageTotalStars += totalStars || 0
29+
})
30+
)
31+
languageList.push({
32+
name: languageName,
33+
totalStars: languageTotalStars,
34+
categoryMap: libraryCategoryMap,
35+
})
36+
}),
37+
...Object.keys(codeData.Tools).map(async toolName => {
38+
const toolCategoryMap = codeData.Tools[toolName]
39+
let toolTotalStars = 0
40+
await Promise.all(
41+
Object.keys(toolCategoryMap).map(async toolCategoryName => {
42+
const tools = toolCategoryMap[toolCategoryName]
43+
const { sortedLibs, totalStars } = await sortLibs(tools)
44+
toolCategoryMap[toolCategoryName] = sortedLibs
45+
toolTotalStars += totalStars || 0
46+
})
47+
)
48+
toolList.push({
49+
name: toolName,
50+
totalStars: toolTotalStars,
51+
categoryMap: toolCategoryMap,
52+
})
53+
}),
54+
(serviceList = codeData.Services),
55+
])
56+
return { languageList, toolList, serviceList }
57+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { Library } from "../sort-libraries/sort-libraries"
2+
import { List } from "./organize-code-data"
3+
4+
type organizeData = {
5+
languageList: List[]
6+
toolList: List[]
7+
serviceList: Library[]
8+
}
9+
10+
export async function sortCodeData(
11+
organizeData: organizeData
12+
): Promise<organizeData> {
13+
await Promise.all([
14+
organizeData.languageList.sort((a, b) => {
15+
if (a.totalStars > b.totalStars) {
16+
return -1
17+
}
18+
if (a.totalStars < b.totalStars) {
19+
return 1
20+
}
21+
return 0
22+
}),
23+
organizeData.toolList.sort((a, b) => {
24+
if (a.totalStars > b.totalStars) {
25+
return -1
26+
}
27+
if (a.totalStars < b.totalStars) {
28+
return 1
29+
}
30+
return 0
31+
}),
32+
organizeData.serviceList,
33+
])
34+
return organizeData
35+
}

0 commit comments

Comments
 (0)