gatsby-plugin-page-creator
Version:
Gatsby plugin that automatically creates pages from React components in specified directories
83 lines (81 loc) • 3.09 kB
JavaScript
exports.__esModule = true;
exports.createPagesFromChangedNodes = createPagesFromChangedNodes;
var _trackedNodesState = require("./tracked-nodes-state");
async function createPagesFromChangedNodes({
actions
}, pluginOptions) {
// Loop over deleted/created nodes and delete nodes and create nodes
// we haven't seen before and then reset arrays.
const pluginInstance = (0, _trackedNodesState.getPluginInstance)(pluginOptions);
if (pluginInstance.trackedTypes.size === 0) {
return;
}
if (!pluginInstance.createAPageFromNode) {
throw new Error(`Expected pluginInstance.createAPageFromNode to be defined`);
}
if (!pluginInstance.deletePagesCreateFromNode) {
throw new Error(`Expected pluginInstance.deletePagesCreateFromNode to be defined`);
}
if (!pluginInstance.resolveFields) {
throw new Error(`Expected pluginInstance.resolveFields to be defined`);
}
if (!pluginInstance.getPathFromAResolvedNode) {
throw new Error(`Expected pluginInstance.getPathFromAResolvedNode to be defined`);
}
for (const {
id
} of pluginInstance.changedNodesSinceLastPageCreation.deleted.values()) {
pluginInstance.deletePagesCreateFromNode(id);
}
const nodesToResolve = new Map();
for (const {
id,
type
} of pluginInstance.changedNodesSinceLastPageCreation.created.values()) {
if (pluginInstance.trackedTypes.has(type)) {
const absolutePaths = pluginInstance.trackedTypes.get(type);
if (absolutePaths) {
for (const absolutePath of absolutePaths) {
let nodeIdsForTemplate = nodesToResolve.get(absolutePath);
if (!nodeIdsForTemplate) {
nodeIdsForTemplate = new Set();
nodesToResolve.set(absolutePath, nodeIdsForTemplate);
}
nodeIdsForTemplate.add(id);
}
}
}
}
for (const [absolutePath, nodeIds] of nodesToResolve.entries()) {
const resolvedNodes = await pluginInstance.resolveFields(Array.from(nodeIds), absolutePath);
for (const node of resolvedNodes) {
var _pluginInstance$nodeI;
const path = await pluginInstance.getPathFromAResolvedNode({
node,
absolutePath
});
const previousPath = (_pluginInstance$nodeI = pluginInstance.nodeIdToPagePath.get(node.id)) === null || _pluginInstance$nodeI === void 0 ? void 0 : _pluginInstance$nodeI.get(absolutePath);
if (previousPath !== path) {
if (previousPath) {
var _pluginInstance$nodeI2;
actions.deletePage({
path: previousPath,
component: absolutePath
});
(_pluginInstance$nodeI2 = pluginInstance.nodeIdToPagePath.get(node.id)) === null || _pluginInstance$nodeI2 === void 0 ? void 0 : _pluginInstance$nodeI2.delete(absolutePath);
pluginInstance.knownPagePaths.delete(previousPath);
}
pluginInstance.createAPageFromNode({
node,
absolutePath
});
}
}
}
// clear changed nodes
pluginInstance.changedNodesSinceLastPageCreation = {
created: new Map(),
deleted: new Map()
};
}
;