in src/registration.ts [111:160]
export function resolveReference({
fieldName,
resource,
resourceMap,
}: ResolveReferenceProps): ResourceFrontmatter | ResourceFrontmatter[] {
/* Return the matching reference or references */
const thisFieldValue = resource[fieldName];
if (!thisFieldValue) {
// Never ask for a reference field that doesn't exist on resource.
throw new Error(
`No reference field "${fieldName}" on resource ${resource.url}`
);
}
if (typeof thisFieldValue === "function") {
throw new Error(
`Cannot get value from method "${fieldName}" on resource ${resource.url}`
);
}
if (Array.isArray(thisFieldValue)) {
// resource.author is a single value, but resource.topics etc. array
return thisFieldValue.map((label) => {
const resolvedLabel = `${fieldName}:${label}`;
const reference = resourceMap.get(resolvedLabel);
if (!reference) {
throw new Error(
`Resource "${resource.url}" has unresolved reference "${resolvedLabel}"`
);
}
return reference;
});
} else {
// Single-value reference like author
const resolvedLabel = `${fieldName}:${thisFieldValue}`;
const reference = resourceMap.get(resolvedLabel);
if (!reference && fieldName == "channel") {
const channel = resourceMap.get(thisFieldValue);
if (channel) return channel;
}
if (!reference) {
throw new Error(
`Resource "${resource.url}" has unresolved reference "${resolvedLabel}"`
);
}
return reference;
}
}