import type { ExtensionProcessDefinition, ProcessLeafOutcomeDefinition, UiProcessAPI, } from "./extension-api.js"; import { validateProcessLeafOutcomeDefinition } from "./leaf-outcomes.js"; /** @internal */ export interface BuiltUiProcessDefinition { /** @internal */ leafOutcome: ProcessLeafOutcomeDefinition | null; } /** @internal */ export function createUiProcessBuilder(): UiProcessAPI< TParams, TState > & { /** @internal */ getDefinition(): BuiltUiProcessDefinition; } { let leafOutcome: ProcessLeafOutcomeDefinition | null = null; return { leafOutcome(def) { if (leafOutcome) { throw new Error("Leaf outcome is already registered"); } const validationErrors = validateProcessLeafOutcomeDefinition(def); if (validationErrors.length > 0) { throw new Error(validationErrors.join("; ")); } leafOutcome = def; }, getDefinition() { return { leafOutcome, }; }, }; } /** @internal */ export function buildUiProcessDefinition( process: ExtensionProcessDefinition, ): BuiltUiProcessDefinition | undefined { if (!process.ui) { return undefined; } const builder = createUiProcessBuilder(); process.ui(builder); return builder.getDefinition(); }