import * as React from "react"; import { SlotComponent, TemplateAsSlotComponentLikeElement, TemplateComponent, TemplateComponentLikeElement, } from "./types"; import { COMPONENT_TYPE, SLOT_TYPE_IDENTIFIER, TEMPLATE_TYPE_IDENTIFIER, } from "./constants"; function isReactSlotsComponent( component: string | React.JSXElementConstructor, ): component is TemplateComponent | SlotComponent

{ return ( typeof component === "function" && component.hasOwnProperty(COMPONENT_TYPE) ); } export function isTemplateComponent( component: string | React.JSXElementConstructor, ): component is TemplateComponent { return ( isReactSlotsComponent(component) && component[COMPONENT_TYPE] === TEMPLATE_TYPE_IDENTIFIER ); } export function isSlotComponent

( component: string | React.JSXElementConstructor, ): component is SlotComponent

{ return ( isReactSlotsComponent(component) && component[COMPONENT_TYPE] === SLOT_TYPE_IDENTIFIER ); } export function isTemplateElement( element: React.ReactNode, ): element is | TemplateComponentLikeElement | TemplateAsSlotComponentLikeElement { return React.isValidElement(element) && isTemplateComponent(element.type); } /** Note: {"slot-name": undefined} also passes */ export function isNamedSlot( element: React.ReactElement, ): element is React.ReactElement<{ ["slot-name"]?: N }> { return element.props.hasOwnProperty("slot-name"); }