From 59d527edb0efe5cd742fe15c9b45d5d7ada09c75 Mon Sep 17 00:00:00 2001 From: Angelos Chalaris Date: Sat, 14 Sep 2019 12:32:47 +0300 Subject: [PATCH] Prototype snippet nodes --- gatsby-node.js | 58 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index 9e8c21e72..7822edc05 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -8,7 +8,7 @@ const toKebabCase = 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; @@ -99,9 +99,9 @@ exports.createPages = ({ graphql, actions }) => { return null; }); }; - +*/ exports.onCreateNode = ({ node, actions, getNode }) => { - const { createNodeField } = actions; + const { createNodeField, createNode } = actions; if (node.internal.type === `MarkdownRemark`) { const value = createFilePath({ node, getNode }); @@ -111,4 +111,56 @@ exports.onCreateNode = ({ node, actions, getNode }) => { 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 snippetDataNodes = getNodesByType('SnippetDataJson'); + + markdownNodes.forEach(mnode => { + let nodeContent = { + html: mnode.html, + tags: (mnode.frontmatter.tags || '').split(','), + title: mnode.frontmatter.title, + }; + createNode({ + id: createNodeId(`snippet-${mnode.id}`), + 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; + } + } + } +});