UNPKG

gatsby-source-c8db

Version:

Source plugin for pulling data into Gatsby from c8db collections

107 lines (95 loc) 2.96 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _jsc = _interopRequireDefault(require("jsc8")); var _lodash = _interopRequireDefault(require("lodash")); const NODE_TYPE = "C8Document"; exports.sourceNodes = async ({ actions, createNodeId, createContentDigest }, pluginOptions) => { const { createNode } = actions; const helpers = Object.assign({}, actions, { createContentDigest, createNodeId, createNode }); const { config, auth: { email, password }, geoFabric, collection, map } = pluginOptions; const fabric = new _jsc.default(config); await fabric.login(email, password); fabric.useFabric(geoFabric); const collections = Array.isArray(collection) ? collection : [collection]; for (let i = 0; i < collections.length; ++i) { const collectionName = collections[i]; const cursor = await fabric.query(`FOR x in ${collectionName} return x`); const documents = await cursor.all(); documents.forEach(doc => { const node = createNodeMetaData(doc, collectionName, helpers); const childrenNodes = []; if (map) { const mapObj = map[collectionName]; if (mapObj) { Object.keys(mapObj).forEach(mediaItemFieldKey => { if (node[mediaItemFieldKey] && (typeof mapObj[mediaItemFieldKey] === `string` || mapObj[mediaItemFieldKey] instanceof String)) { const mappingChildNode = prepareMappingChildNode(node, mediaItemFieldKey, node[mediaItemFieldKey], mapObj[mediaItemFieldKey], createContentDigest); node[`${mediaItemFieldKey}___NODE`] = mappingChildNode.id; childrenNodes.push(mappingChildNode); delete node[mediaItemFieldKey]; } }); } } helpers.createNode(node); childrenNodes.forEach(child => { helpers.createNode(child); }); }); } fabric.close(); return; }; function createNodeMetaData(item, collectionName, helpers) { const nodeMetadata = { id: helpers.createNodeId(item["_id"]), parent: null, children: [], internal: { type: NODE_TYPE, content: JSON.stringify(item), contentDigest: helpers.createContentDigest(item) } }; const node = Object.assign({ collectionName }, item, nodeMetadata); return node; } function prepareMappingChildNode(node, key, text, mediaType, createContentDigest) { const str = _lodash.default.isString(text) ? text : ` `; const id = `${node.id}${key}MappingNode`; const mappingNode = { id: id, parent: node.id, [key]: str, children: [], internal: { type: _lodash.default.camelCase(`${node.internal.type} ${key} MappingNode`), mediaType: mediaType, content: str, contentDigest: createContentDigest(str) } }; node.children = node.children.concat([mappingNode.id]); return mappingNode; }