@dfrnt/gatsby-source-graphql-nodes
Version:
A Gatsby plugin to plugin sources nodes from an external GraphQL endpoint query
59 lines • 2.59 kB
JavaScript
;
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