diff --git a/plugins/gatsby-source-swiftype/gatsby-node.js b/plugins/gatsby-source-swiftype/gatsby-node.js index 7fd5be502..16c1a009c 100644 --- a/plugins/gatsby-source-swiftype/gatsby-node.js +++ b/plugins/gatsby-source-swiftype/gatsby-node.js @@ -1,6 +1,8 @@ const fs = require('fs'); -const search = require('./src/search'); const createRelatedResourceNode = require('./src/createRelatedResourceNode'); +const getRelatedResources = require('./src/getRelatedResources'); + +const writeableData = {}; exports.onPreBootstrap = (_, pluginOptions) => { const { file } = pluginOptions; @@ -15,17 +17,9 @@ exports.onCreateNode = async ( pluginOptions ) => { const { createNode } = actions; - const { - enabled, - filterNode = () => false, - getParams = () => ({}), - getPath, - pageLimit, - engineKey, - file, - } = pluginOptions; - - if (!enabled || node.internal.type !== 'Mdx' || !filterNode({ node })) { + const { filterNode = () => false, getPath } = pluginOptions; + + if (node.internal.type !== 'Mdx' || !filterNode({ node })) { return; } @@ -35,30 +29,20 @@ exports.onCreateNode = async ( }, ] = getNodesByType('Site'); - const data = JSON.parse(fs.readFileSync(file)); - const params = getParams({ node }); const pathname = getPath({ node }); - const url = siteUrl + pathname; + const resources = await getRelatedResources({ node, siteUrl }, pluginOptions); - const resources = await search(url, params, { - engineKey, - pageLimit, - }); + writeableData[pathname] = resources; resources.forEach((resource) => { createRelatedResourceNode({ - parentPathname: pathname, + parent: node.id, resource, createContentDigest, createNode, createNodeId, }); }); - - fs.writeFileSync( - file, - JSON.stringify({ ...data, [pathname]: resources }, null, 2, { flag: 'w' }) - ); }; exports.createSchemaCustomization = ({ actions }) => { @@ -89,3 +73,11 @@ exports.createResolvers = ({ createResolvers }, pluginOptions) => { }, }); }; + +exports.onPostBootstrap = (_, pluginOptions) => { + const { enabled, file } = pluginOptions; + + if (enabled) { + fs.writeFileSync(file, JSON.stringify(writeableData, null, 2)); + } +}; diff --git a/plugins/gatsby-source-swiftype/src/createRelatedResourceNode.js b/plugins/gatsby-source-swiftype/src/createRelatedResourceNode.js index 9485d4777..b5623cb7a 100644 --- a/plugins/gatsby-source-swiftype/src/createRelatedResourceNode.js +++ b/plugins/gatsby-source-swiftype/src/createRelatedResourceNode.js @@ -3,19 +3,18 @@ module.exports = ({ createNodeId, createContentDigest, resource, - parentPathname, -}) => { + parent, +}) => createNode({ - ...resource, id: createNodeId(`RelatedResource-${resource.url}`), - parent: null, + title: resource.title, + url: resource.url, + parent, children: [], plugin: 'gatsby-source-swiftype', - parentPathname, internal: { type: 'RelatedResource', content: JSON.stringify(resource), contentDigest: createContentDigest(resource), }, }); -}; diff --git a/plugins/gatsby-source-swiftype/src/getRelatedResources.js b/plugins/gatsby-source-swiftype/src/getRelatedResources.js new file mode 100644 index 000000000..f84424b0a --- /dev/null +++ b/plugins/gatsby-source-swiftype/src/getRelatedResources.js @@ -0,0 +1,23 @@ +const fs = require('fs'); +const search = require('./search'); + +module.exports = async ({ node, siteUrl }, pluginOptions) => { + const { + enabled, + engineKey, + pageLimit, + file, + getParams = () => ({}), + getPath, + } = pluginOptions; + + const data = JSON.parse(fs.readFileSync(file)); + const params = getParams({ node }); + const pathname = getPath({ node }); + + if (enabled) { + return search(siteUrl + pathname, params, { engineKey, pageLimit }); + } + + return data[pathname] || []; +};