200 lines
4.4 KiB
JavaScript
200 lines
4.4 KiB
JavaScript
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
const path = require('path')
|
|
const crypto = require('crypto')
|
|
const Bluebird = require('bluebird')
|
|
const util = require('util')
|
|
|
|
// Set this to true to enable more logging in this file
|
|
const DEBUG = false
|
|
const isDev = process.env.NODE_ENV === 'development'
|
|
|
|
const jsonTypeName = `jsonFile`
|
|
|
|
/**
|
|
* Implement Gatsby's Node APIs in this file.
|
|
*
|
|
* See: https://www.gatsbyjs.org/docs/node-apis/
|
|
*/
|
|
|
|
// You can delete this file if you're not using it
|
|
|
|
exports.onCreateNode = async ({ node, actions }) => {
|
|
const { createNode } = actions
|
|
|
|
if (node.internal.type === jsonTypeName) {
|
|
const { categories, projects } = node
|
|
|
|
if (DEBUG) console.error('Found the json node #QE5PnL')
|
|
|
|
let createdCategoryCount = 0
|
|
let createdProjectCount = 0
|
|
|
|
await Bluebird.each(categories, async category => {
|
|
if (typeof category.id !== 'string' || category.id.length < 1) {
|
|
console.error('Invalid category #veJYyW', category)
|
|
return
|
|
}
|
|
|
|
// Count how many projects are in each category. We can't easily do this
|
|
// in Gatsby's GraphQL API.
|
|
const projectCount = projects.filter(project =>
|
|
project['category-ids'].includes(category.id),
|
|
).length
|
|
|
|
await createNode({
|
|
...category,
|
|
slug: category.id,
|
|
parentSlug: category.parent,
|
|
projectCount,
|
|
id: `Category__${category.id}`,
|
|
parent: node.id,
|
|
internal: {
|
|
type: `AppCategory`,
|
|
contentDigest: crypto
|
|
.createHash(`md5`)
|
|
.update(JSON.stringify(category))
|
|
.digest(`hex`),
|
|
content: JSON.stringify(category),
|
|
},
|
|
})
|
|
|
|
createdCategoryCount++
|
|
})
|
|
|
|
await Bluebird.each(projects, async project => {
|
|
const contentDigest = crypto
|
|
.createHash(`md5`)
|
|
.update(JSON.stringify(project))
|
|
.digest(`hex`)
|
|
const id = `Project__${contentDigest}`
|
|
|
|
const projectNode = {
|
|
...project,
|
|
parent: node.id,
|
|
id,
|
|
internal: {
|
|
type: `AppProject`,
|
|
contentDigest,
|
|
content: JSON.stringify(project),
|
|
},
|
|
}
|
|
|
|
await createNode(projectNode)
|
|
|
|
createdProjectCount++
|
|
})
|
|
|
|
console.error(
|
|
'Created counts #WVIeFH',
|
|
createdCategoryCount,
|
|
createdProjectCount,
|
|
)
|
|
}
|
|
}
|
|
|
|
exports.createPages = async ({ actions, graphql, getNodesByType }) => {
|
|
const { createPage } = actions
|
|
|
|
if (DEBUG) {
|
|
const jsonNodes = getNodesByType(jsonTypeName)
|
|
const fileNodes = getNodesByType(`File`)
|
|
console.error(
|
|
'START createPages() #IMKm8p',
|
|
jsonNodes.length,
|
|
fileNodes.length,
|
|
)
|
|
|
|
const debugResult = await graphql(`
|
|
query Debugging {
|
|
allFile {
|
|
edges {
|
|
node {
|
|
id
|
|
internal {
|
|
type
|
|
}
|
|
relativePath
|
|
children {
|
|
id
|
|
internal {
|
|
type
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
|
|
console.error(
|
|
'File nodes #bIMtXP',
|
|
util.inspect(debugResult.data, { depth: null }),
|
|
)
|
|
}
|
|
|
|
const categoryTemplate = path.resolve('src/templates/category.tsx')
|
|
const tagTemplate = path.resolve('src/templates/tag.tsx')
|
|
|
|
const categoryResult = await graphql(`
|
|
query Categories {
|
|
allAppCategory {
|
|
edges {
|
|
node {
|
|
id
|
|
title
|
|
slug
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
|
|
const categories = categoryResult.data.allAppCategory.edges
|
|
|
|
categories.forEach(({ node: category }) => {
|
|
createPage({
|
|
path: `/category/${category.slug}/`,
|
|
component: categoryTemplate,
|
|
context: {
|
|
id: category.id,
|
|
slug: category.slug,
|
|
},
|
|
})
|
|
})
|
|
|
|
const projectResult = await graphql(`
|
|
query Projects {
|
|
allAppProject {
|
|
edges {
|
|
node {
|
|
id
|
|
tags
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`)
|
|
|
|
const projects = projectResult.data.allAppProject.edges
|
|
const tags = new Set()
|
|
|
|
projects.forEach(({ node: project }) => {
|
|
if (project.tags && project.tags.length > 0) {
|
|
project.tags.forEach(tag => {
|
|
tags.add(tag)
|
|
})
|
|
}
|
|
})
|
|
|
|
tags.forEach(tag => {
|
|
createPage({
|
|
path: `/tag/${tag}/`,
|
|
component: tagTemplate,
|
|
context: {
|
|
tag,
|
|
slug: tag,
|
|
},
|
|
})
|
|
})
|
|
}
|