"use client"; import React from "react"; type Props = { name: string; type: string; required?: boolean; deprecated?: boolean; children?: React.ReactNode; cloudOnly?: boolean; default?: string; collapsable?: boolean; }; export function PropertyReference({ children, name, type, required = false, deprecated = false, cloudOnly = false, default: defaultValue, collapsable = false, }: Props) { const [isCollapsed, setIsCollapsed] = React.useState( collapsable ? true : false, ); // Detect nested children so we can auto-collapse them. // // IMPORTANT: We use *reference equality* (`child.type === PropertyReference`) // rather than a name check (`child.type.name === "PropertyReference"`). // In production builds, minifiers (Terser/SWC) rename function components to // short identifiers like `s` or `a`, so `.name` comparisons silently fail and // the `collapsable` prop never propagates. Reference equality is minifier-safe // because both sides point to the same function identity after bundling. // // Known limitation: React.Children.map only walks *direct* children. A // wrapped inside a
(or any other element) will NOT // be detected here. Callers should nest PropertyReferences as direct // siblings, not wrapped in other elements, for auto-collapse to work. const enhancedChildren = React.Children.map(children, (child) => { if (React.isValidElement(child) && child.type === PropertyReference) { return React.cloneElement(child as React.ReactElement, { collapsable: true, }); } return child; }); const collapseClassName = `${isCollapsed ? "hidden" : ""}`; const renderChips = () => { return ( <> {type} {required && ( required )} {deprecated && ( deprecated )} ); }; return (
{collapsable ? ( ) : ( {name} {renderChips()} )}
{cloudOnly && ( COPILOT CLOUD )}
{defaultValue !== undefined && (
Default: {" "} {typeof defaultValue === "string" ? `"${defaultValue}"` : `${defaultValue}`}
)}
{enhancedChildren}
); }