/** * Stringification helpers for combobox item values. Subset of Base UI * React's `packages/react/src/internals/resolveValueLabel.tsx` — only the * string-returning helpers are ported (the JSX-returning * `resolveMultipleLabels` / `resolveSelectedLabel` are not needed for the * Solid single-select port). */ export interface Group { [key: string]: unknown; items: ReadonlyArray; } export function isGroupedItems( items: ReadonlyArray | undefined, ): items is ReadonlyArray> { return ( items != null && items.length > 0 && typeof items[0] === "object" && items[0] != null && "items" in (items[0] as object) ); } function serializeValue(value: unknown): string { if (value == null) return ""; if (typeof value === "string") return value; return String(value); } export function stringifyAsLabel( item: unknown, itemToStringLabel?: (item: unknown) => string, ): string { if (itemToStringLabel && item != null) { return itemToStringLabel(item) ?? ""; } if (item && typeof item === "object") { const obj = item as Record; if ("label" in obj && obj.label != null) { return String(obj.label); } if ("value" in obj) { return String(obj.value); } } return serializeValue(item); } export function stringifyAsValue( item: unknown, itemToStringValue?: (item: unknown) => string, ): string { if (itemToStringValue && item != null) { return itemToStringValue(item) ?? ""; } if ( item && typeof item === "object" && "value" in (item as object) && "label" in (item as object) ) { return serializeValue((item as { value: unknown }).value); } return serializeValue(item); }