diff --git a/packages/gatsby/src/schema/__tests__/node-model.js b/packages/gatsby/src/schema/__tests__/node-model.js index 29bde00c1a72c..79168410f216b 100644 --- a/packages/gatsby/src/schema/__tests__/node-model.js +++ b/packages/gatsby/src/schema/__tests__/node-model.js @@ -495,6 +495,14 @@ describe(`NodeModel`, () => { const result = nodeModel.findRootNodeAncestor(obj, predicate) expect(result.id).toBe(`file1`) }) + + it(`returns null when object's top-most ancestor doesn't match the provided predicate`, () => { + const node = nodeModel.getNodeById({ id: `post1` }) + const obj = node.frontmatter.authors + const predicate = () => false + const result = nodeModel.findRootNodeAncestor(obj, predicate) + expect(result).toBe(null) + }) }) describe(`createPageDependency`, () => { diff --git a/packages/gatsby/src/schema/node-model.js b/packages/gatsby/src/schema/node-model.js index 11cf46ea6f96e..057636329c9a1 100644 --- a/packages/gatsby/src/schema/node-model.js +++ b/packages/gatsby/src/schema/node-model.js @@ -445,7 +445,10 @@ class LocalNodeModel { const id = this._rootNodeMap.get(node) const trackedParent = getNodeById(id) - if (!parent && !trackedParent) return node + if (!parent && !trackedParent) { + const isMatchingRoot = !predicate || predicate(node) + return isMatchingRoot ? node : null + } node = parent || trackedParent }