import type { OverrideDiagnostic, OverrideDiagnosticCode, OverrideDiagnosticPhase, OverrideDiagnosticSeverity, } from './contracts'; interface DiagnosticDefinition { readonly severity: OverrideDiagnosticSeverity; readonly phase: OverrideDiagnosticPhase; readonly message: string; } export const OVERRIDE_DIAGNOSTIC_REGISTRY = { 'override.unsupported_schema_version': { severity: 'error', phase: 'parse', message: 'The theme override schema version is not supported.', }, 'override.legacy_shape': { severity: 'error', phase: 'parse', message: 'Legacy light/dark override buckets are not valid target 1.0.0 intent.', }, 'override.invalid_metadata': { severity: 'error', phase: 'parse', message: 'Theme override metadata is missing or malformed.', }, 'override.invalid_structure': { severity: 'error', phase: 'parse', message: 'A known theme override section is malformed.', }, 'override.prototype_key': { severity: 'error', phase: 'parse', message: 'Theme override data contains an unsafe object key or prototype.', }, 'override.unknown_input': { severity: 'warning', phase: 'parse', message: 'An unknown input was preserved but not expanded.', }, 'override.unknown_selection': { severity: 'warning', phase: 'parse', message: 'An unknown selection was preserved but not expanded.', }, 'override.unknown_target': { severity: 'warning', phase: 'parse', message: 'An unknown direct target was preserved but not expanded.', }, 'override.invalid_value': { severity: 'error', phase: 'parse', message: 'A known theme override value is invalid.', }, 'override.invalid_reference': { severity: 'error', phase: 'intent', message: 'A reference must identify an eligible primitive token.', }, 'override.unresolved_reference': { severity: 'error', phase: 'expand', message: 'A package or payload token reference could not be resolved.', }, 'override.literal_type_mismatch': { severity: 'error', phase: 'parse', message: 'A direct literal does not match the target token type.', }, 'override.mode_policy_violation': { severity: 'error', phase: 'intent', message: 'A mode-specific value is not allowed for this invariant role.', }, 'override.source_not_allowed': { severity: 'error', phase: 'intent', message: 'The selected primitive is outside the package-owned source set.', }, 'override.rule_violation': { severity: 'warning', phase: 'rule', message: 'The expanded theme violates a package-owned rule.', }, 'override.primitive_step_frozen': { severity: 'warning', phase: 'expand', message: 'A direct primitive override freezes one generated palette step.', }, 'override.adapter_write_failed': { severity: 'error', phase: 'adapter', message: 'A platform adapter failed while writing the expanded theme.', }, } as const satisfies Record; export function createOverrideDiagnostic( code: OverrideDiagnosticCode, context: Omit & { readonly severity?: OverrideDiagnosticSeverity; readonly phase?: OverrideDiagnosticPhase; readonly message?: string; } = {}, ): OverrideDiagnostic { const definition = OVERRIDE_DIAGNOSTIC_REGISTRY[code]; const { severity, phase, message, ...rest } = context; return { code, severity: severity ?? definition.severity, phase: phase ?? definition.phase, message: message ?? definition.message, ...rest, }; } export function hasErrorDiagnostics(diagnostics: readonly OverrideDiagnostic[]): boolean { return diagnostics.some((diagnostic) => diagnostic.severity === 'error'); }