import defaultRuntimeMap from '../runtime/token-to-css-var.json'; import { applyExpandedThemeOverride } from './adapters/uniwind'; import { DEFAULT_PRESET } from './constants'; import { expandThemeOverride } from './override/expand'; import type { AdapterWriteFailure, OverrideDiagnostic, RuntimeMap, UpdateCssVariables, } from './override/contracts'; import type { Platform } from './types'; export type { UpdateCssVariables } from './override/contracts'; export { DEFAULT_PRESET }; export type ApplyThemeOverrideResult = | { readonly applied: true; readonly revision: string; readonly diagnostics: readonly OverrideDiagnostic[]; } | { readonly applied: false; readonly reason: 'invalid_theme_override' | 'no_theme_changes'; readonly diagnostics: readonly OverrideDiagnostic[]; readonly revision: string; } | { readonly applied: false; readonly reason: 'adapter_write_failed'; readonly diagnostics: readonly OverrideDiagnostic[]; readonly revision: string; readonly failure: AdapterWriteFailure; }; export interface ApplyThemeOverrideOptions { runtimeMap?: RuntimeMap; runtimePlatform?: Platform; updateCSSVariables?: UpdateCssVariables; } export interface ApplyThemeOverrideRuntimeOptions { runtimeMap?: RuntimeMap; runtimePlatform: Platform; getUpdateCSSVariables: () => UpdateCssVariables; } export function applyThemeOverrideWithRuntime( override: unknown, options: ApplyThemeOverrideRuntimeOptions, ): ApplyThemeOverrideResult { const { runtimeMap = defaultRuntimeMap, runtimePlatform, getUpdateCSSVariables } = options; const expansion = expandThemeOverride(override, runtimePlatform); if (!expansion.valid) { return { applied: false, reason: 'invalid_theme_override', diagnostics: expansion.diagnostics, revision: expansion.revision.id, }; } const { expanded } = expansion; if ( Object.keys(expanded.writes.light).length === 0 && Object.keys(expanded.writes.dark).length === 0 ) { return { applied: false, reason: 'no_theme_changes', diagnostics: expanded.diagnostics, revision: expanded.revision.id, }; } const application = applyExpandedThemeOverride({ expanded, runtimeMap, writer: getUpdateCSSVariables(), }); if (!application.applied) { return { applied: false, reason: 'adapter_write_failed', diagnostics: expanded.diagnostics, revision: expanded.revision.id, failure: application.failure, }; } return { applied: true, revision: application.revision, diagnostics: expanded.diagnostics, }; }