Skip to content

Commit

Permalink
fix: defer check for schema references to content layer collections (#…
Browse files Browse the repository at this point in the history
…12097)

* fix: defer check for schema references

* More comments
  • Loading branch information
ascorbic authored Oct 1, 2024
1 parent f06feee commit 11d447f
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 12 deletions.
5 changes: 5 additions & 0 deletions .changeset/bright-swans-shout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'astro': patch
---

Fixes error where references in content layer schemas sometimes incorrectly report as missing
18 changes: 6 additions & 12 deletions packages/astro/src/content/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -599,16 +599,9 @@ export function createReference({ lookupMap }: { lookupMap: ContentLookupMap })
});
return;
}
// We won't throw if the collection is missing, because it may be a content layer collection and the store may not yet be populated.
// If it is an object then we're validating later in the build, so we can check the collection at that point.

// A reference object might refer to an invalid collection, because when we convert it we don't have access to the store.
// If it is an object then we're validating later in the pipeline, so we can check the collection at that point.
if (!lookupMap[collection] && !collectionIsInStore) {
ctx.addIssue({
code: ZodIssueCode.custom,
message: `**${flattenedErrorPath}:** Reference to ${collection} invalid. Collection does not exist or is empty.`,
});
return;
}
return lookup;
}

Expand All @@ -623,9 +616,10 @@ export function createReference({ lookupMap }: { lookupMap: ContentLookupMap })
}
return { id: lookup, collection };
}

if (!lookupMap[collection] && store.collections().size === 0) {
// If the collection is not in the lookup map or store, it may be a content layer collection and the store may not yet be populated.
// If the collection is not in the lookup map or store, it may be a content layer collection and the store may not yet be populated.
// If the store has 0 or 1 entries it probably means that the entries have not yet been loaded.
// The store may have a single entry even if the collections have not loaded, because the top-level metadata collection is generated early.
if (!lookupMap[collection] && store.collections().size <= 1) {
// For now, we can't validate this reference, so we'll optimistically convert it to a reference object which we'll validate
// later in the pipeline when we do have access to the store.
return { id: lookup, collection };
Expand Down

0 comments on commit 11d447f

Please sign in to comment.