Files
30-seconds-of-code/gatsby-node.js
Angelos Chalaris d7013dd17c Setup snippet schema initial load logic
Use dynamic imports to load all the JSON files specified in config, read data from both sources, output the proper data in the new Snippet type nodes.
2019-09-14 13:14:47 +03:00

188 lines
4.7 KiB
JavaScript

const path = require(`path`);
const { createFilePath } = require(`gatsby-source-filesystem`);
const config = require('./config');
const requirables = [];
config.requirables.forEach(fileName => {
requirables.push(require(`./snippet_data/${fileName}`));
})
const toKebabCase = str =>
str &&
str
.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g)
.map(x => x.toLowerCase())
.join('-');
/*
exports.createPages = ({ graphql, actions }) => {
const { createPage } = actions;
const snippetPage = path.resolve(`./src/docs/templates/SnippetPage.js`);
const tagPage = path.resolve(`./src/docs/templates/TagPage.js`);
return graphql(
`
{
allMarkdownRemark(
sort: { fields: [frontmatter___title], order: ASC }
limit: 1000
) {
edges {
node {
fields {
slug
}
frontmatter {
tags
}
fileAbsolutePath
}
}
}
}
`,
).then(result => {
if (result.errors) {
throw result.errors;
}
// Create individual snippet pages.
const snippets = result.data.allMarkdownRemark.edges;
snippets.forEach((post, index) => {
if(post.node.fileAbsolutePath.indexOf('README') !== -1)
return;
if (post.node.fileAbsolutePath.indexOf(config.snippetArchivePath) === -1)
createPage({
path: `/snippet${post.node.fields.slug}`,
component: snippetPage,
context: {
slug: post.node.fields.slug,
scope: `./snippets`,
},
});
else
createPage({
path: `/archive${post.node.fields.slug}`,
component: snippetPage,
context: {
slug: post.node.fields.slug,
scope: `./snippets_archive`,
},
});
});
// Create tag pages.
const tags = snippets.reduce((acc, post) => {
if (!post.node.frontmatter || !post.node.frontmatter.tags) return acc;
const primaryTag = post.node.frontmatter.tags.split(',')[0];
if (!acc.includes(primaryTag)) acc.push(primaryTag);
return acc;
}, []);
tags.forEach(tag => {
const tagPath = `/tag/${toKebabCase(tag)}/`;
const tagRegex = `/^\\s*${tag}/`;
createPage({
path: tagPath,
component: tagPage,
context: {
tag,
tagRegex,
},
});
});
createPage({
path: `/beginner`,
component: tagPage,
context: {
tag: `beginner snippets`,
tagRegex: `/beginner/`,
},
});
return null;
});
};
*/
exports.onCreateNode = ({ node, actions, getNode }) => {
const { createNodeField, createNode } = actions;
if (node.internal.type === `MarkdownRemark`) {
const value = createFilePath({ node, getNode });
createNodeField({
name: `slug`,
node,
value,
});
}
};
exports.sourceNodes = ({ actions, createNodeId, createContentDigest, getNodesByType }) => {
const { createTypes, createNode } = actions;
const typeDefs = `
type Snippet implements Node {
html: String
tags: [String]
title: String
code: String
id: String
}
`;
createTypes(typeDefs);
const markdownNodes = getNodesByType('MarkdownRemark');
const snippetNodes = requirables
.reduce((acc, sArr) => {
return ({
...acc,
...sArr.data.reduce((snippets, snippet) => {
return ({
...snippets,
[snippet.id]: snippet
});
}, {})
});
}, {});
Object.entries(snippetNodes).forEach(([id, sNode]) => {
let mNode = markdownNodes.find(mN => mN.frontmatter.title === id);
let nodeContent = {
id,
html: mNode.html,
tags: sNode.attributes.tags,
title: mNode.frontmatter.title,
code: sNode.attributes.codeBlocks.es6
};
createNode({
id: createNodeId(`snippet-${sNode.meta.hash}`),
parent: null,
children: [],
internal: {
type: 'Snippet',
content: JSON.stringify(nodeContent),
contentDigest: createContentDigest(nodeContent)
},
...nodeContent
});
});
};
exports.createResolvers = ({ createResolvers }) => createResolvers({
Snippet: {
html: {
resolve: async (source, _, context, info) => {
const resolver = info.schema.getType("MarkdownRemark").getFields()["html"].resolve;
const node = await context.nodeModel.nodeStore.getNodesByType('MarkdownRemark').filter(v => v.frontmatter.title === source.title)[0];
const args = {}; // arguments passed to the resolver
const html = await resolver(node, args);
return html;
}
}
}
});