From 6239c40c28b2a81cbeaf6067f732a87cc173d9b9 Mon Sep 17 00:00:00 2001 From: Tuval Simha Date: Tue, 7 Mar 2023 16:18:43 +0200 Subject: [PATCH 1/3] Clean node file and split to small func Signed-off-by: Tuval Simha --- gatsby-node.ts | 158 ++---------------- scripts/sort-libraries/sort-libraries.ts | 4 +- .../update-code-data/organize-code-data.ts | 56 +++++++ scripts/update-code-data/sort-code-data.ts | 42 +++++ scripts/update-code-data/update-code-data.ts | 139 +++++++++++++++ src/pages/code.tsx | 42 ++++- 6 files changed, 285 insertions(+), 156 deletions(-) create mode 100644 scripts/update-code-data/organize-code-data.ts create mode 100644 scripts/update-code-data/sort-code-data.ts create mode 100644 scripts/update-code-data/update-code-data.ts diff --git a/gatsby-node.ts b/gatsby-node.ts index dcf634af31..d3abb16f36 100644 --- a/gatsby-node.ts +++ b/gatsby-node.ts @@ -1,12 +1,9 @@ import { GatsbyNode } from "gatsby" import * as path from "path" -import { promisify } from "util" -import { readFile } from "fs/promises" import * as globby from "globby" -import * as frontmatterParser from "parser-front-matter" -import { sortLibs } from "./scripts/sort-libraries/sort-libraries" - -const parse$ = promisify(frontmatterParser.parse) +import { updateCodeData } from "./scripts/update-code-data/update-code-data" +import { organizeCodeData } from "./scripts/update-code-data/organize-code-data" +import { sortCodeData } from "./scripts/update-code-data/sort-code-data" export const createSchemaCustomization: GatsbyNode["createSchemaCustomization"] = async ({ actions }) => { @@ -85,15 +82,10 @@ export const onCreatePage: GatsbyNode["onCreatePage"] = async ({ page, actions, }) => { - // trying to refactor code to be "the Gatsby way". - // from the paths on ready, ignores a bunch of existing custom logic below. - if (page.path.startsWith("/blog")) { - return - } - if (page.path.startsWith("/tags")) { + // This way is not "the Gatsby way", we create the pages, delete the pages, and create "code" paths page again. + if (page.path.startsWith("/blog") || page.path.startsWith("/tags")) { return } - const { createPage, deletePage } = actions deletePage(page) let context = { @@ -102,144 +94,14 @@ export const onCreatePage: GatsbyNode["onCreatePage"] = async ({ } if (page.path === "/code" || page.path === "/code/") { const markdownFilePaths = await globby("src/content/code/**/*.md") - const codeData: any = {} const slugMap = require("./src/content/code/slug-map.json") - await Promise.all( - markdownFilePaths.map(async markdownFilePath => { - const markdownFileContent = await readFile(markdownFilePath, "utf-8") - let { - data: { name, description, url, github, npm, gem }, - content: howto, - } = await parse$(markdownFileContent) - howto = howto.trim() - const pathArr = markdownFilePath.split("/") - if (markdownFilePath.includes("language-support")) { - const languageSupportDirIndex = pathArr.indexOf("language-support") - const languageNameSlugIndex = languageSupportDirIndex + 1 - const languageNameSlug = pathArr[languageNameSlugIndex] - const languageName = slugMap[languageNameSlug] - codeData.Languages ||= {} - codeData.Languages[languageName] ||= {} - - const categoryNameSlugIndex = languageSupportDirIndex + 2 - const categoryNameSlug = pathArr[categoryNameSlugIndex] - const categoryName = slugMap[categoryNameSlug] - codeData.Languages[languageName][categoryName] ||= [] - codeData.Languages[languageName][categoryName].push({ - name, - description, - howto, - url, - github, - npm, - gem, - sourcePath: markdownFilePath, - }) - } else if (markdownFilePath.includes("tools")) { - const toolSupportDirIndex = pathArr.indexOf("tools") - const toolNameSlugIndex = toolSupportDirIndex + 1 - const toolNameSlug = pathArr[toolNameSlugIndex] - const toolName = slugMap[toolNameSlug] - codeData.ToolsNew ||= {} - codeData.ToolsNew[toolName] ||= {} - const categoryToolsNameSlugIndex = toolSupportDirIndex + 2 - const categoryToolsNameSlug = pathArr[categoryToolsNameSlugIndex] - const categoryToolsName = slugMap[categoryToolsNameSlug] - codeData.ToolsNew[toolName][categoryToolsName] ||= [] - - codeData.ToolsNew[toolName][categoryToolsName].push({ - name, - description, - howto, - url, - github, - npm, - gem, - sourcePath: markdownFilePath, - }) - } else { - const codeDirIndex = pathArr.indexOf("code") - const categoryNameSlugIndex = codeDirIndex + 1 - const categoryNameSlug = pathArr[categoryNameSlugIndex] - const categoryName = slugMap[categoryNameSlug] - codeData[categoryName] ||= [] - codeData[categoryName].push({ - name, - description, - howto, - url, - github, - npm, - gem, - sourcePath: markdownFilePath, - }) - } - }) - ) - const languageList: any = [] - const toolList: any = [] - await Promise.all([ - ...Object.keys(codeData.Languages).map(async languageName => { - const libraryCategoryMap = codeData.Languages[languageName] - let languageTotalStars = 0 - await Promise.all( - Object.keys(libraryCategoryMap).map(async libraryCategoryName => { - const libraries = libraryCategoryMap[libraryCategoryName] - const { sortedLibs, totalStars } = await sortLibs(libraries) - - libraryCategoryMap[libraryCategoryName] = sortedLibs - languageTotalStars += totalStars || 0 - }) - ) - languageList.push({ - name: languageName, - totalStars: languageTotalStars, - categoryMap: libraryCategoryMap, - }) - }), - ...Object.keys(codeData.ToolsNew).map(async toolName => { - const toolCategoryMap = codeData.ToolsNew[toolName] - let toolTotalStars = 0 - await Promise.all( - Object.keys(toolCategoryMap).map(async toolCategoryName => { - const tools = toolCategoryMap[toolCategoryName] - const { sortedLibs, totalStars } = await sortLibs(tools) - toolCategoryMap[toolCategoryName] = sortedLibs - toolTotalStars += totalStars || 0 - }) - ) - toolList.push({ - name: toolName, - totalStars: toolTotalStars, - categoryMap: toolCategoryMap, - }) - }), - ]) + const codeData = await updateCodeData(markdownFilePaths, slugMap) + const organizeData = await organizeCodeData(codeData) + const sortedOrganizeData = await sortCodeData(organizeData) context = { - ...context, - otherLibraries: { - Services: codeData.Services, - "More Stuff": codeData["More Stuff"], - }, - languageList: languageList.sort((a, b) => { - if (a.totalStars > b.totalStars) { - return -1 - } - if (a.totalStars < b.totalStars) { - return 1 - } - return 0 - }), - toolList: toolList.sort((a, b) => { - if (a.totalStars > b.totalStars) { - return -1 - } - if (a.totalStars < b.totalStars) { - return 1 - } - return 0 - }), + sourcePath: path.relative(__dirname, page.path), + ...sortedOrganizeData, } } createPage({ diff --git a/scripts/sort-libraries/sort-libraries.ts b/scripts/sort-libraries/sort-libraries.ts index 4c297856ca..378c9637da 100644 --- a/scripts/sort-libraries/sort-libraries.ts +++ b/scripts/sort-libraries/sort-libraries.ts @@ -3,12 +3,12 @@ import { getGitHubStats } from "./get-github-stats" import { getHttpScore } from "./get-http-score" import { getNpmStats } from "./get-npm-stats" -interface Library { +export interface Library { name: string description: string howto: string url: string - github: string + github: string | undefined npm: string | undefined gem: string | undefined sourcePath: string diff --git a/scripts/update-code-data/organize-code-data.ts b/scripts/update-code-data/organize-code-data.ts new file mode 100644 index 0000000000..02830ca7d9 --- /dev/null +++ b/scripts/update-code-data/organize-code-data.ts @@ -0,0 +1,56 @@ +import { Library, sortLibs } from "../sort-libraries/sort-libraries" +import { CodeData } from "./update-code-data" + +export type List = { + name: string + totalStars: number + categoryMap: { + [categoryName: string]: Library[] + } +} + +export async function organizeCodeData( + codeData: CodeData +): Promise<{ languageList: List[]; toolList: List[]; serviceList: List[] }> { + let languageList: List[] = [] + let toolList: List[] = [] + let serviceList: List[] = [] + await Promise.all([ + ...Object.keys(codeData.Languages).map(async languageName => { + const libraryCategoryMap = codeData.Languages[languageName] + let languageTotalStars = 0 + await Promise.all( + Object.keys(libraryCategoryMap).map(async libraryCategoryName => { + const libraries = libraryCategoryMap[libraryCategoryName] + const { sortedLibs, totalStars } = await sortLibs(libraries) + + libraryCategoryMap[libraryCategoryName] = sortedLibs + languageTotalStars += totalStars || 0 + }) + ) + languageList.push({ + name: languageName, + totalStars: languageTotalStars, + categoryMap: libraryCategoryMap, + }) + }), + ...Object.keys(codeData.Tools).map(async toolName => { + const toolCategoryMap = codeData.Tools[toolName] + let toolTotalStars = 0 + await Promise.all( + Object.keys(toolCategoryMap).map(async toolCategoryName => { + const tools = toolCategoryMap[toolCategoryName] + const { sortedLibs, totalStars } = await sortLibs(tools) + toolCategoryMap[toolCategoryName] = sortedLibs + toolTotalStars += totalStars || 0 + }) + ) + toolList.push({ + name: toolName, + totalStars: toolTotalStars, + categoryMap: toolCategoryMap, + }) + }), + ]) + return { languageList, toolList, serviceList } +} diff --git a/scripts/update-code-data/sort-code-data.ts b/scripts/update-code-data/sort-code-data.ts new file mode 100644 index 0000000000..82b2a9c9bc --- /dev/null +++ b/scripts/update-code-data/sort-code-data.ts @@ -0,0 +1,42 @@ +import { List } from "./organize-code-data" + +type organizeData = { + languageList: List[] + toolList: List[] + serviceList: List[] +} + +export async function sortCodeData( + organizeData: organizeData +): Promise { + await Promise.all([ + organizeData.languageList.sort((a, b) => { + if (a.totalStars > b.totalStars) { + return -1 + } + if (a.totalStars < b.totalStars) { + return 1 + } + return 0 + }), + organizeData.toolList.sort((a, b) => { + if (a.totalStars > b.totalStars) { + return -1 + } + if (a.totalStars < b.totalStars) { + return 1 + } + return 0 + }), + organizeData.serviceList.sort((a, b) => { + if (a.totalStars > b.totalStars) { + return -1 + } + if (a.totalStars < b.totalStars) { + return 1 + } + return 0 + }), + ]) + return organizeData +} diff --git a/scripts/update-code-data/update-code-data.ts b/scripts/update-code-data/update-code-data.ts new file mode 100644 index 0000000000..071a96227f --- /dev/null +++ b/scripts/update-code-data/update-code-data.ts @@ -0,0 +1,139 @@ +import { readFile } from "fs/promises" +import { promisify } from "util" +import * as frontmatterParser from "parser-front-matter" +import { Library } from "../sort-libraries/sort-libraries" + +const parse$ = promisify(frontmatterParser.parse) + +export type CodeData = { + Languages: { + [languageName: string]: { + [categoryName: string]: Library[] + } + } + Tools: { + [toolName: string]: { + [categoryToolsName: string]: Library[] + } + } + Services: { + [serviceName: string]: { + [categoryServicesName: string]: Library[] + } + } +} + +export async function updateCodeData( + markdownFilePaths: string[], + slugMap: string +): Promise { + let codeData = {} as CodeData + await Promise.all( + markdownFilePaths.map(async markdownFilePath => { + const markdownFileContent = await readFile(markdownFilePath, "utf-8") + let { + data: { name, description, url, github, npm, gem }, + content: howto, + } = await parse$(markdownFileContent) + howto = howto.trim() + const pathArr = markdownFilePath.split("/") + const languageSupport = markdownFilePath.includes("language-support") + const toolsSupport = markdownFilePath.includes("tools") + const servicesSupport = markdownFilePath.includes("services") + + switch (true) { + case languageSupport: { + const languageSupportDirIndex = pathArr.indexOf("language-support") + const languageNameSlugIndex = languageSupportDirIndex + 1 + const languageNameSlug = pathArr[languageNameSlugIndex] + const languageName = slugMap[languageNameSlug] + codeData.Languages ||= {} + codeData.Languages[languageName] ||= {} + + const categoryNameSlugIndex = languageSupportDirIndex + 2 + const categoryNameSlug = pathArr[categoryNameSlugIndex] + const categoryName = slugMap[categoryNameSlug] + codeData.Languages[languageName][categoryName] ||= [] + codeData.Languages[languageName][categoryName].push({ + name, + description, + howto, + url, + github, + npm, + gem, + sourcePath: markdownFilePath, + }) + break + } + case toolsSupport: { + const toolSupportDirIndex = pathArr.indexOf("tools") + const toolNameSlugIndex = toolSupportDirIndex + 1 + const toolNameSlug = pathArr[toolNameSlugIndex] + const toolName = slugMap[toolNameSlug] + codeData.Tools ||= {} + codeData.Tools[toolName] ||= {} + const categoryToolsNameSlugIndex = toolSupportDirIndex + 2 + const categoryToolsNameSlug = pathArr[categoryToolsNameSlugIndex] + const categoryToolsName = slugMap[categoryToolsNameSlug] + codeData.Tools[toolName][categoryToolsName] ||= [] + + codeData.Tools[toolName][categoryToolsName].push({ + name, + description, + howto, + url, + github, + npm, + gem, + sourcePath: markdownFilePath, + }) + break + } + case servicesSupport: { + const serviceSupportDirIndex = pathArr.indexOf("services") + const serviceNameSlugIndex = serviceSupportDirIndex + 1 + const serviceNameSlug = pathArr[serviceNameSlugIndex] + const serviceName = slugMap[serviceNameSlug] + codeData.Services ||= {} + codeData.Services[serviceName] ||= {} + const categoryServicesNameSlugIndex = serviceSupportDirIndex + 2 + const categoryServicesNameSlug = + pathArr[categoryServicesNameSlugIndex] + const categoryServicesName = slugMap[categoryServicesNameSlug] + codeData.Services[serviceName][categoryServicesName] ||= [] + + codeData.Services[serviceName][categoryServicesName].push({ + name, + description, + howto, + url, + github, + npm, + gem, + sourcePath: markdownFilePath, + }) + break + } + default: { + const codeDirIndex = pathArr.indexOf("code") + const categoryNameSlugIndex = codeDirIndex + 1 + const categoryNameSlug = pathArr[categoryNameSlugIndex] + const categoryName = slugMap[categoryNameSlug] + codeData[categoryName] ||= [] + codeData[categoryName].push({ + name, + description, + howto, + url, + github, + npm, + gem, + sourcePath: markdownFilePath, + }) + } + } + }) + ) + return codeData +} diff --git a/src/pages/code.tsx b/src/pages/code.tsx index 2af271ab02..8344d2a267 100644 --- a/src/pages/code.tsx +++ b/src/pages/code.tsx @@ -6,7 +6,7 @@ import Marked from "../components/Marked" import Seo from "../components/Seo" import { toSlug } from "../utils/slug" -interface ILibrary { +export interface ILibrary { description: string github?: string npm?: string @@ -40,13 +40,18 @@ interface Tool { } } +interface Service { + name: string + totalStars: number + categoryMap: { + General: ILibrary[] + } +} + interface PageContext { languageList: Language[] toolList: Tool[] - otherLibraries: { - Services: ILibrary[] - Tools?: ILibrary[] - } + serviceList: Service[] sourcePath: string } @@ -203,6 +208,31 @@ export function ToolsList({ pageContext, type }: ToolsListProps) { ) } +interface ServicesListProps { + pageContext: PageContext + type: "General" +} +export function ServiceList({ pageContext, type }: ServicesListProps) { + return ( + <> +

General

+ {pageContext.toolList.map( + tool => ( + console.log(tool.categoryMap, tool.name), + ( +
+ {Object.entries(tool.categoryMap).map( + ([categoryName, data]) => + categoryName === type && + )} +
+ ) + ) + )} + + ) +} + export default ({ pageContext }: PageProps<{}, PageContext>) => { return ( @@ -351,7 +381,7 @@ export default ({ pageContext }: PageProps<{}, PageContext>) => { # - +

From f05e819f26eb405d4af35acf620a99ea0fff597b Mon Sep 17 00:00:00 2001 From: Tuval Simha Date: Tue, 7 Mar 2023 19:19:08 +0200 Subject: [PATCH 2/3] fix Signed-off-by: Tuval Simha --- gatsby-node.ts | 1 + .../update-code-data/organize-code-data.ts | 5 ++- scripts/update-code-data/sort-code-data.ts | 13 ++----- scripts/update-code-data/update-code-data.ts | 32 +--------------- src/pages/code.tsx | 38 +------------------ 5 files changed, 10 insertions(+), 79 deletions(-) diff --git a/gatsby-node.ts b/gatsby-node.ts index d3abb16f36..0312b92fae 100644 --- a/gatsby-node.ts +++ b/gatsby-node.ts @@ -99,6 +99,7 @@ export const onCreatePage: GatsbyNode["onCreatePage"] = async ({ const organizeData = await organizeCodeData(codeData) const sortedOrganizeData = await sortCodeData(organizeData) + console.log("codeData.Services", codeData.Services) context = { sourcePath: path.relative(__dirname, page.path), ...sortedOrganizeData, diff --git a/scripts/update-code-data/organize-code-data.ts b/scripts/update-code-data/organize-code-data.ts index 02830ca7d9..c5962eeabb 100644 --- a/scripts/update-code-data/organize-code-data.ts +++ b/scripts/update-code-data/organize-code-data.ts @@ -11,10 +11,10 @@ export type List = { export async function organizeCodeData( codeData: CodeData -): Promise<{ languageList: List[]; toolList: List[]; serviceList: List[] }> { +): Promise<{ languageList: List[]; toolList: List[]; serviceList: Library[] }> { let languageList: List[] = [] let toolList: List[] = [] - let serviceList: List[] = [] + let serviceList: Library[] = [] await Promise.all([ ...Object.keys(codeData.Languages).map(async languageName => { const libraryCategoryMap = codeData.Languages[languageName] @@ -51,6 +51,7 @@ export async function organizeCodeData( categoryMap: toolCategoryMap, }) }), + (serviceList = codeData.Services), ]) return { languageList, toolList, serviceList } } diff --git a/scripts/update-code-data/sort-code-data.ts b/scripts/update-code-data/sort-code-data.ts index 82b2a9c9bc..503dff273f 100644 --- a/scripts/update-code-data/sort-code-data.ts +++ b/scripts/update-code-data/sort-code-data.ts @@ -1,9 +1,10 @@ +import { Library } from "../sort-libraries/sort-libraries" import { List } from "./organize-code-data" type organizeData = { languageList: List[] toolList: List[] - serviceList: List[] + serviceList: Library[] } export async function sortCodeData( @@ -28,15 +29,7 @@ export async function sortCodeData( } return 0 }), - organizeData.serviceList.sort((a, b) => { - if (a.totalStars > b.totalStars) { - return -1 - } - if (a.totalStars < b.totalStars) { - return 1 - } - return 0 - }), + organizeData.serviceList, ]) return organizeData } diff --git a/scripts/update-code-data/update-code-data.ts b/scripts/update-code-data/update-code-data.ts index 071a96227f..f1e9aec09b 100644 --- a/scripts/update-code-data/update-code-data.ts +++ b/scripts/update-code-data/update-code-data.ts @@ -16,11 +16,7 @@ export type CodeData = { [categoryToolsName: string]: Library[] } } - Services: { - [serviceName: string]: { - [categoryServicesName: string]: Library[] - } - } + Services: Library[] } export async function updateCodeData( @@ -39,7 +35,6 @@ export async function updateCodeData( const pathArr = markdownFilePath.split("/") const languageSupport = markdownFilePath.includes("language-support") const toolsSupport = markdownFilePath.includes("tools") - const servicesSupport = markdownFilePath.includes("services") switch (true) { case languageSupport: { @@ -90,31 +85,6 @@ export async function updateCodeData( }) break } - case servicesSupport: { - const serviceSupportDirIndex = pathArr.indexOf("services") - const serviceNameSlugIndex = serviceSupportDirIndex + 1 - const serviceNameSlug = pathArr[serviceNameSlugIndex] - const serviceName = slugMap[serviceNameSlug] - codeData.Services ||= {} - codeData.Services[serviceName] ||= {} - const categoryServicesNameSlugIndex = serviceSupportDirIndex + 2 - const categoryServicesNameSlug = - pathArr[categoryServicesNameSlugIndex] - const categoryServicesName = slugMap[categoryServicesNameSlug] - codeData.Services[serviceName][categoryServicesName] ||= [] - - codeData.Services[serviceName][categoryServicesName].push({ - name, - description, - howto, - url, - github, - npm, - gem, - sourcePath: markdownFilePath, - }) - break - } default: { const codeDirIndex = pathArr.indexOf("code") const categoryNameSlugIndex = codeDirIndex + 1 diff --git a/src/pages/code.tsx b/src/pages/code.tsx index 8344d2a267..c3999a85af 100644 --- a/src/pages/code.tsx +++ b/src/pages/code.tsx @@ -39,19 +39,10 @@ interface Tool { General: ILibrary[] } } - -interface Service { - name: string - totalStars: number - categoryMap: { - General: ILibrary[] - } -} - interface PageContext { languageList: Language[] toolList: Tool[] - serviceList: Service[] + serviceList: ILibrary[] sourcePath: string } @@ -208,31 +199,6 @@ export function ToolsList({ pageContext, type }: ToolsListProps) { ) } -interface ServicesListProps { - pageContext: PageContext - type: "General" -} -export function ServiceList({ pageContext, type }: ServicesListProps) { - return ( - <> -

General

- {pageContext.toolList.map( - tool => ( - console.log(tool.categoryMap, tool.name), - ( -
- {Object.entries(tool.categoryMap).map( - ([categoryName, data]) => - categoryName === type && - )} -
- ) - ) - )} - - ) -} - export default ({ pageContext }: PageProps<{}, PageContext>) => { return ( @@ -381,7 +347,7 @@ export default ({ pageContext }: PageProps<{}, PageContext>) => { # - +

From 59dbc1896e54689f4ea26d2fae53f919797a344c Mon Sep 17 00:00:00 2001 From: Tuval Simha Date: Tue, 7 Mar 2023 19:22:39 +0200 Subject: [PATCH 3/3] clean Signed-off-by: Tuval Simha --- gatsby-node.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/gatsby-node.ts b/gatsby-node.ts index 0312b92fae..d3abb16f36 100644 --- a/gatsby-node.ts +++ b/gatsby-node.ts @@ -99,7 +99,6 @@ export const onCreatePage: GatsbyNode["onCreatePage"] = async ({ const organizeData = await organizeCodeData(codeData) const sortedOrganizeData = await sortCodeData(organizeData) - console.log("codeData.Services", codeData.Services) context = { sourcePath: path.relative(__dirname, page.path), ...sortedOrganizeData,