UNPKG

@dfrnt/gatsby-source-graphql-nodes

Version:

A Gatsby plugin to plugin sources nodes from an external GraphQL endpoint query

59 lines 2.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sourceNodes = exports.onPreInit = void 0; const { createContentDigest } = require("gatsby-core-utils"); const graphql_request_1 = require("graphql-request"); // Node API reference: https://www.gatsbyjs.com/docs/node-apis/ const pluginName = "@dfrnt/gatsby-source-graphql-nodes"; const onPreInit = () => console.log(`Loaded ${pluginName}`); exports.onPreInit = onPreInit; const createContentNode = async (node, typeConfig, typeName, sourceNodesArgs) => { const { actions, createNodeId } = sourceNodesArgs; const { createNode } = actions; const contentDigest = createContentDigest(JSON.stringify(node)); const id = typeConfig["idField"] && node[typeConfig["idField"]] || createNodeId(contentDigest); const nodeId = id ? createNodeId(id) : String(createContentDigest(JSON.stringify(node))); const localTypeName = typeConfig.typeNameOverride ?? typeName; const nodeData = { id: nodeId, data: node, children: [], internal: { type: `${localTypeName}`, content: JSON.stringify(node), contentDigest: createContentDigest(JSON.stringify(node)), }, }; await createNode(nodeData); }; const recurseFieldContent = (nodeData, objectFieldSequence) => { if (objectFieldSequence.length === 0 || !nodeData) { return nodeData; } else { const fieldName = objectFieldSequence[0]; if (Array.isArray(nodeData)) { return recurseFieldContent(nodeData[0], objectFieldSequence); } else if (!Array.isArray(nodeData) && typeof nodeData === "object") { const fields = objectFieldSequence.slice(1); const childNodeData = nodeData[fieldName]; return recurseFieldContent(childNodeData, fields); } else { return undefined; } } }; const sourceNodes = async (sourceNodesArgs, pluginConfig) => { const clientOptions = { headers: pluginConfig.graphqlConfig.headers, }; const client = new graphql_request_1.GraphQLClient(pluginConfig.url, clientOptions); const userQueryResult = await client.request(pluginConfig.query).then((data) => data); return Object.keys(userQueryResult).forEach(async (typeName) => await userQueryResult[typeName].forEach(async (nodeData) => { await createContentNode(nodeData, pluginConfig.typeConfiguration[typeName], typeName, sourceNodesArgs); })); }; exports.sourceNodes = sourceNodes; //# sourceMappingURL=gatsby-node.js.map