import { ComponentType } from 'react'; import { VisageComponentSymbol } from './constants'; import { VisageComponent } from './types'; /** * Returns a display name of a component */ export function displayName( Component: React.ComponentClass | React.FunctionComponent | string, ): string { return ( (Component as React.ComponentClass).displayName || (Component as React.FunctionComponent).name || (typeof Component === 'string' && Component.length > 0 ? Component : 'Unknown') ); } export function markAsVisageComponent>( component: React.MemoExoticComponent, ): VisageComponent ? P : any>; export function markAsVisageComponent( component: React.ForwardRefExoticComponent, ): VisageComponent; export function markAsVisageComponent( component: React.ComponentType, ): VisageComponent; /** * Marks a component as Visage component */ export function markAsVisageComponent( component: React.ForwardRefExoticComponent | React.ComponentType, ): VisageComponent { // eslint-disable-next-line no-param-reassign (component as any)[VisageComponentSymbol] = true; return component as any; } /** * Detects if component is a Visage component */ export function isVisageComponent( component: | React.ComponentClass | React.FunctionComponent | VisageComponent | string, ): component is VisageComponent { if (typeof component === 'string') { return false; } return !!(component as any)[VisageComponentSymbol]; }