export function resolveReference()

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;
	}
}