From 1858e28b0e710c6bb7f3d9ce0d97362bc3b210b3 Mon Sep 17 00:00:00 2001 From: Jerel Miller Date: Sat, 27 Jun 2020 23:47:43 -0700 Subject: [PATCH] feat: Programatically create pages for all components/apis --- gatsby-node.js | 84 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 12 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index cf7e593c1..c86863efb 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -3,11 +3,35 @@ const path = require(`path`); const getFileRelativePath = (absolutePath) => absolutePath.replace(`${process.cwd()}/`, ''); +const kebabCase = (string) => + string + .replace(/([a-z])([A-Z])/g, '$1-$2') + .replace(/\s+/g, '-') + .toLowerCase(); + exports.createPages = async ({ actions, graphql, reporter }) => { const { createPage, createRedirect } = actions; const result = await graphql(` { + allNewRelicSdkApi { + edges { + node { + fields { + slug + } + } + } + } + allNewRelicSdkComponent { + edges { + node { + fields { + slug + } + } + } + } allMdx(limit: 1000) { edges { node { @@ -29,7 +53,23 @@ exports.createPages = async ({ actions, graphql, reporter }) => { return; } - result.data.allMdx.edges.forEach(({ node }) => { + const { allMdx, allNewRelicSdkApi, allNewRelicSdkComponent } = result.data; + + allNewRelicSdkApi.edges.forEach(({ node }) => { + createPage({ + path: node.fields.slug, + component: path.resolve('./src/templates/ApiReferenceTemplate.js'), + }); + }); + + allNewRelicSdkComponent.edges.forEach(({ node }) => { + createPage({ + path: node.fields.slug, + component: path.resolve('src/templates/ComponentReferenceTemplate.js'), + }); + }); + + allMdx.edges.forEach(({ node }) => { const { frontmatter } = node; if (frontmatter.redirects) { @@ -43,21 +83,25 @@ exports.createPages = async ({ actions, graphql, reporter }) => { }); } - createPage({ - path: frontmatter.path, - component: path.resolve(`src/templates/${frontmatter.template}.js`), - context: { - fileRelativePath: getFileRelativePath(node.fileAbsolutePath), - guidesFilter: - frontmatter.template === 'OverviewTemplate' - ? `${frontmatter.path}/*` - : undefined, - }, - }); + if (node.template !== 'ComponentReferenceTemplate') { + createPage({ + path: frontmatter.path, + component: path.resolve(`src/templates/${frontmatter.template}.js`), + context: { + fileRelativePath: getFileRelativePath(node.fileAbsolutePath), + guidesFilter: + frontmatter.template === 'OverviewTemplate' + ? `${frontmatter.path}/*` + : undefined, + }, + }); + } }); }; exports.onCreateNode = ({ node, actions }) => { + const { createNodeField } = actions; + // if we don't have a relative path, attempt to get one if (node.context && !node.context.fileRelativePath) { const { createPage } = actions; @@ -71,4 +115,20 @@ exports.onCreateNode = ({ node, actions }) => { }, }); } + + if (node.internal.type === 'NewRelicSdkComponent') { + createNodeField({ + node, + name: 'slug', + value: `/components/${kebabCase(node.name)}`, + }); + } + + if (node.internal.type === 'NewRelicSdkApi') { + createNodeField({ + node, + name: 'slug', + value: `/apis/${kebabCase(node.name)}`, + }); + } };