All files / src/timeline/utils enumMapping.ts

81.25% Statements 26/32
71.05% Branches 27/38
100% Functions 4/4
92.3% Lines 24/26

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53                5224x 5222x   2x 2x 2x 2x 2x           5219x 5219x 5219x 5219x 4877x             10187x   5221x 5221x   5221x 5219x     2x 2x 3x 3x 3x 3x       2x    
export type EnumDefinitionEntry = {
  value: number | string;
  label: string;
};
 
export type EnumDefinition = string[] | EnumDefinitionEntry[] | undefined;
 
function toComparable(value: unknown): number | string | null {
  if (typeof value === 'number') {
    return Number.isFinite(value) ? value : null;
  }
  Eif (typeof value === 'string') {
    const trimmed = value.trim();
    Iif (!trimmed) return null;
    const asNumber = Number(trimmed);
    return Number.isFinite(asNumber) ? asNumber : trimmed;
  }
  return null;
}
 
function mapFromStringArray(value: number | string, enumDefinition: string[]): string | null {
  const asIndex = typeof value === 'number' ? value : Number(value);
  Iif (!Number.isFinite(asIndex) || !Number.isInteger(asIndex)) return null;
  const idx = asIndex as number;
  if (idx < 0 || idx >= enumDefinition.length) return null;
  return enumDefinition[idx] ?? null;
}
 
/**
 * Resolves enum values for both indexed string arrays and explicit value/label entries.
 */
export function mapEnumValue(value: unknown, enumDefinition: EnumDefinition): string | null {
  if (!enumDefinition || enumDefinition.length === 0) return null;
 
  const comparable = toComparable(value);
  Iif (comparable === null) return null;
 
  if (typeof enumDefinition[0] === 'string') {
    return mapFromStringArray(comparable, enumDefinition as string[]);
  }
 
  const entries = enumDefinition as EnumDefinitionEntry[];
  const hit = entries.find((entry) => {
    const left = toComparable(entry.value);
    Iif (left === null) return false;
    Eif (typeof left === 'number' && typeof comparable === 'number') {
      return left === comparable;
    }
    return String(left) === String(comparable);
  });
  return hit?.label ?? null;
}