@prg/gatsby-source-something-whatever
Version:
something something whatever who gives a crap.
72 lines (54 loc) • 1.77 kB
JavaScript
import { createRemoteFileNode } from 'gatsby-source-filesystem';
import { formatMsg } from './util';
import { PLUGIN_NAME, TYPE_PREFIX, IMAGE } from './constants';
export const downloadImagesAndCreateFileNodes = async (helpers, PARENT_TYPE) => {
const {
actions: { createNode, touchNode },
createNodeId,
store,
cache,
getNodes,
reporter,
} = helpers;
const imageNodes = getNodes().filter(
node =>
node.internal.owner === PLUGIN_NAME &&
node.internal.type === `${TYPE_PREFIX}${IMAGE}`
);
let newNodesCount = 0;
const images = await Promise.all(
imageNodes.map(async node => {
try {
const url = node.src.split('?')[0];
const imageDataCacheKey = `${TYPE_PREFIX}__${IMAGE}__${url}`;
const cacheRemoteData = await cache.get(imageDataCacheKey);
// Avoid downloading the asset again if it's been cached
if (cacheRemoteData) {
touchNode({ nodeId: cacheRemoteData.fileNodeID });
return cacheRemoteData.fileNodeID;
}
newNodesCount = newNodesCount + 1;
const fileNode = await createRemoteFileNode({
url,
parentNodeId: node.id,
store,
cache,
createNode,
createNodeId,
reporter,
});
await cache.set(imageDataCacheKey, { fileNodeID: fileNode.id });
if (fileNode) {
node.localFile___NODE = fileNode.id;
}
return node;
} catch (error) {
helpers.reporter.panicOnBuild(`An error occurred in ${PLUGIN_NAME}.`)
console.log(`error`, error);
return Promise.resolve();
}
})
);
console.log(formatMsg(`Downloaded ${newNodesCount} new image files.`));
return images;
};