piral-core
Version:
The core library for creating a Piral instance.
72 lines (67 loc) • 2.21 kB
text/typescript
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>
>;