UNPKG

piral-core

Version:

The core library for creating a Piral instance.

72 lines (67 loc) 2.21 kB
import type { ReactNode, ReactElement } from 'react'; import type { PiralCustomExtensionSlotMap } from './custom'; import type { ExtensionRegistration } from './state'; /** * The mapping of the existing (known) extension slots. */ export interface PiralExtensionSlotMap extends PiralCustomExtensionSlotMap {} /** * The basic props for defining an extension slot. */ export interface BaseExtensionSlotProps<TName, TParams> { /** * The children to transport, if any. */ children?: ReactNode; /** * Defines what should be rendered when no components are available * for the specified extension. */ empty?(props: TParams): ReactNode; /** * Determines if the `render` function should be called in case no * components are available for the specified extension. * * If true, `empty` will be called and returned from the slot. * If false, `render` will be called with the result of calling `empty`. * The result of calling `render` will then be returned from the slot. */ emptySkipsRender?: boolean; /** * Defines the order of the components to render. * May be more convient than using `render` w.r.t. ordering extensions * by their supplied metadata. * @param extensions The registered extensions. * @returns The ordered extensions. */ order?(extensions: Array<ExtensionRegistration>): Array<ExtensionRegistration>; /** * Defines how the provided nodes should be rendered. * @param nodes The rendered extension nodes. * @returns The rendered nodes, i.e., an ReactElement. */ render?(nodes: Array<ReactNode>): ReactElement<any, any> | null; /** * The custom parameters for the given extension. */ params?: TParams; /** * The name of the extension to render. */ name: TName; } /** * Gives the extension params shape for the given extension slot name. */ export type ExtensionParams<TName> = TName extends keyof PiralExtensionSlotMap ? PiralExtensionSlotMap[TName] : TName extends string ? any : TName; /** * The props for defining an extension slot. */ export type ExtensionSlotProps<TName = string> = BaseExtensionSlotProps< TName extends string ? TName : string, ExtensionParams<TName> >;