diff --git a/lib/dereference.js b/lib/dereference.js index e8f541c5..8510d291 100644 --- a/lib/dereference.js +++ b/lib/dereference.js @@ -39,6 +39,9 @@ function crawl (obj, path, pathFromRoot, parents, $refs, options) { circular: false }; + const isApplicable = typeof options.dereference.filter === "function" + ? options.dereference.filter : () => true; + if (obj && typeof obj === "object") { parents.push(obj); @@ -53,23 +56,25 @@ function crawl (obj, path, pathFromRoot, parents, $refs, options) { let keyPathFromRoot = Pointer.join(pathFromRoot, key); let value = obj[key]; let circular = false; + dereferenced = false; if ($Ref.isAllowed$Ref(value, options)) { dereferenced = dereference$Ref(value, keyPath, keyPathFromRoot, parents, $refs, options); - circular = dereferenced.circular; - obj[key] = dereferenced.value; } else { if (parents.indexOf(value) === -1) { dereferenced = crawl(value, keyPath, keyPathFromRoot, parents, $refs, options); - circular = dereferenced.circular; - obj[key] = dereferenced.value; } else { circular = foundCircularReference(keyPath, $refs, options); } } + if (dereferenced !== false && (!dereferenced.value || isApplicable(dereferenced.value))) { + circular = dereferenced.circular; + obj[key] = dereferenced.value; + } + // Set the "isCircular" flag if this or any other property is circular result.circular = result.circular || circular; }