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.
188 lines
4.7 KiB
JavaScript
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;
|
|
}
|
|
}
|
|
}
|
|
});
|