core/converters/filter.converter.ts
core/converters/filter.converter.ts is a file in Bane's Lab Build Scripts. 50 lines of code and 8 definitions.
import { FACET_FIELDS, KIND_FIELD } from "#configuration/constants/filter.constants";
import { type GovlabContext, slugify } from "@govlab/context";
import type { FacetGroup } from "#types/filter.types";
import type { ReferenceFaces } from "#types/ontology.types";
import { idOf } from "#core/resolvers/ontology.resolver";
import { sharedSlug } from "#configuration/strings/catalog.strings";
const distinct = function distinct(values: readonly string[]): readonly string[] {
return [...new Set(values.filter((value) => value.trim().length > 0))].sort((a, b) => a.localeCompare(b));
};
export const kindFacetGroups = function kindFacetGroups(collections: ReferenceFaces): readonly FacetGroup[] {
const declared = new Set(FACET_FIELDS.map((facet) => facet.collection));
return [...collections.entries()].flatMap(([collection, index]) => {
if (declared.has(collection)) {
return [];
}
const byKind = new Map<string, string[]>();
for (const [ref, record] of Object.entries(index)) {
byKind.set(record.kind, [...(byKind.get(record.kind) ?? []), idOf(ref)]);
}
return byKind.size < 2
? []
: distinct([...byKind.keys()]).map((kind) => ({
collection,
field: KIND_FIELD,
ids: byKind.get(kind) ?? [],
slug: slugify(kind),
value: kind,
}));
});
};
export const facetGroups = function facetGroups(context: GovlabContext): readonly FacetGroup[] {
return FACET_FIELDS.flatMap((facet) => {
const seen = new Map<string, string>();
return distinct(facet.values(context)).map((value) => {
const slug = slugify(value);
const held = seen.get(slug);
if (held !== undefined) {
throw new Error(sharedSlug(facet.collection, facet.field, held, value));
}
seen.set(slug, value);
return {
collection: facet.collection,
field: facet.field,
ids: facet.members(context, value),
slug,
value,
};
});
});
};