import type { CanonicalConfig, CanonicalData } from "#types/canon.types"; import type { ConcernConfig, ConcernValue, ResolvedConcern } from "#types/concern.types"; const CONCERN_ALIAS: Readonly> = { spacing: "indentation" }; const numericValue = function numericValue(value: ConcernValue): number | null { if (typeof value === "number") { return value; } if (Array.isArray(value)) { const found = value.find((entry) => typeof entry === "number"); if (typeof found === "number") { return found; } } return null; }; const classifyConcerns = function classifyConcerns( concerns: ConcernConfig, kindById: Map, ): { enabled: Record; values: Record } { const values: Record = {}; const enabled: Record = {}; for (const [concept, raw] of Object.entries(concerns)) { const id = CONCERN_ALIAS[concept] ?? concept; const numeric = numericValue(raw); const kind = kindById.get(id); if (kind === "value" && numeric !== null) { values[id] = numeric; continue; } if (kind === "rule-intent" && raw === true) { enabled[id] = true; } } return { enabled, values }; }; export const concernsToCanonicalConfig = function concernsToCanonicalConfig( concerns: ConcernConfig, data: CanonicalData, ): Partial { const kindById = new Map(data.settings.map((setting) => [setting.id, setting.kind] as const)); const { enabled, values } = classifyConcerns(concerns, kindById); const out: Partial = {}; if (Object.keys(values).length > 0) { out.values = values; } if (Object.keys(enabled).length > 0) { out.enabled = enabled; } return out; }; export const parseConcernValue = function parseConcernValue(value: ConcernValue): ResolvedConcern { if (typeof value === "boolean") { return { exclude: !value }; } if (typeof value === "number") { return { exclude: false, value }; } if (typeof value === "string") { return { exclude: false, optionValue: [value] }; } return { exclude: false, optionValue: value }; }; export const resolveConcernMap = function resolveConcernMap(concerns: ConcernConfig): Map { const resolved = new Map(); for (const [concept, value] of Object.entries(concerns)) { resolved.set(concept, parseConcernValue(value)); } return resolved; };