Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: defer check for schema references to content layer collections #12097

Merged
merged 3 commits into from
Oct 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading