core/resolvers/representation.resolver.ts

core/resolvers/representation.resolver.ts is a file in GovLab Patterns. 32 lines of code and 8 definitions.

import type { FieldSchema, Kind, Primitive } from "#types/schema.types";
import { isCoordinatePair } from "#core/predicates/schema.predicate";

const INFERENCE = new Map<string, readonly string[]>([
    ["scalar:integer", ["vector", "sequence"]],
    ["scalar:float", ["vector", "sequence"]],
    ["scalar:boolean", ["distribution", "sequence"]],
    ["scalar:string", ["distribution", "sequence"]],
    ["list:", ["graph"]],
    ["object:", ["tree"]],
]);

const COORDINATE_REPRESENTATIONS: readonly string[] = ["grid"];

const NUMERIC_LIST_REPRESENTATIONS: readonly string[] = ["graph", "vector"];

const inferKey = function inferKey(kind: Kind, primitive: Primitive | null): string {
    return `${kind}:${primitive ?? ""}`;
};

const inferField = function inferField(field: FieldSchema): readonly string[] {
    if (field.kind === "list" && field.elementNumeric) {
        return isCoordinatePair(field) ? COORDINATE_REPRESENTATIONS : NUMERIC_LIST_REPRESENTATIONS;
    }
    return INFERENCE.get(inferKey(field.kind, field.primitive)) ?? [];
};

export const inferMapping = function inferMapping(schema: readonly FieldSchema[]): Map<string, readonly string[]> {
    return new Map(
        schema
            .map((field): [string, readonly string[]] => [field.name, inferField(field)])
            .filter(([, representations]) => representations.length > 0),
    );
};

export const unrepresentable = function unrepresentable(schema: readonly FieldSchema[]): FieldSchema[] {
    const mapped = inferMapping(schema);
    return schema.filter((field) => !mapped.has(field.name));
};