UNPKG

piral-core

Version:

The core library for creating a Piral instance.

142 lines (141 loc) 5.8 kB
import type { ReactElement, ReactNode } from 'react'; import type { RouteComponentProps } from 'react-router'; import type { PiletApi, Pilet, PiletEntry, PiletEntries, PiletMetadata, EventEmitter, PiletLoader, PiletLoadingStrategy } from 'piral-base'; import type { PiletCustomApi } from './custom'; import type { AnyComponent, PiralPageMeta } from './components'; import type { ExtensionParams, ExtensionSlotProps, PiralExtensionSlotMap } from './extension'; import type { SharedData, DataStoreOptions } from './data'; import type { Disposable } from './utils'; export { PiletApi, Pilet, PiletMetadata, EventEmitter, PiletEntry, PiletEntries, PiletLoader, PiletLoadingStrategy }; /** * The props that every registered component obtains. */ export interface BaseComponentProps { /** * The currently used pilet API. */ piral: PiletApi; } /** * The shape of an implicit unregister function. */ export interface RegistrationDisposer { /** * Cleans up the previous registration. */ (): void; } /** * The props of an extension component. */ export interface ExtensionComponentProps<T> extends BaseComponentProps { /** * The provided parameters for showing the extension. */ params: T extends keyof PiralExtensionSlotMap ? PiralExtensionSlotMap[T] : T extends string ? any : T; /** * The optional children to receive, if any. */ children?: ReactNode; } /** * The props that every registered page component obtains. */ export interface RouteBaseProps<UrlParams extends { [K in keyof UrlParams]?: string; } = {}, UrlState = any> extends RouteComponentProps<UrlParams, {}, UrlState>, BaseComponentProps { } /** * The props used by a page component. */ export interface PageComponentProps<T extends { [K in keyof T]?: string; } = {}, S = any> extends RouteBaseProps<T, S> { /** * The meta data registered with the page. */ meta: PiralPageMeta; /** * The children of the page. */ children: ReactNode; } /** * Shorthand for the definition of an extension component. */ export type AnyExtensionComponent<TName> = TName extends keyof PiralExtensionSlotMap ? AnyComponent<ExtensionComponentProps<TName>> : TName extends string ? AnyComponent<ExtensionComponentProps<any>> : AnyComponent<ExtensionComponentProps<TName>>; /** * Defines the Pilet API from piral-core. * This interface will be consumed by pilet developers so that their pilet can interact with the piral instance. */ export interface PiletCoreApi { /** * Gets a shared data value. * @param name The name of the data to retrieve. */ getData<TKey extends string>(name: TKey): SharedData[TKey]; /** * Sets the data using a given name. The name needs to be used exclusively by the current pilet. * Using the name occupied by another pilet will result in no change. * @param name The name of the data to store. * @param value The value of the data to store. * @param options The optional configuration for storing this piece of data. * @returns True if the data could be set, otherwise false. */ setData<TKey extends string>(name: TKey, value: SharedData[TKey], options?: DataStoreOptions): boolean; /** * Registers a route for predefined page component. * The route needs to be unique and can contain params. * Params are following the path-to-regexp notation, e.g., :id for an id parameter. * @param route The route to register. * @param Component The component to render the page. * @param meta The optional metadata to use. */ registerPage(route: string, Component: AnyComponent<PageComponentProps>, meta?: PiralPageMeta): RegistrationDisposer; /** * Unregisters the page identified by the given route. * @param route The route that was previously registered. */ unregisterPage(route: string): void; /** * Registers an extension component with a predefined extension component. * The name must refer to the extension slot. * @param name The global name of the extension slot. * @param Component The component to be rendered. * @param defaults Optionally, sets the default values for the expected data. */ registerExtension<TName>(name: TName extends string ? TName : string, Component: AnyExtensionComponent<TName>, defaults?: Partial<ExtensionParams<TName>>): RegistrationDisposer; /** * Unregisters a global extension component. * Only previously registered extension components can be unregistered. * @param name The name of the extension slot to unregister from. * @param Component The registered extension component to unregister. */ unregisterExtension<TName>(name: TName extends string ? TName : string, Component: AnyExtensionComponent<TName>): void; /** * React component for displaying extensions for a given name. * @param props The extension's rendering props. * @return The created React element. */ Extension<TName>(props: ExtensionSlotProps<TName>): ReactElement | null; /** * Renders an extension in a plain DOM component. * @param element The DOM element or shadow root as a container for rendering the extension. * @param props The extension's rendering props. * @return The disposer to clear the extension. */ renderHtmlExtension<TName>(element: HTMLElement | ShadowRoot, props: ExtensionSlotProps<TName>): Disposable; } declare module 'piral-base/lib/types/runtime' { interface PiletApi extends PiletCustomApi, PiletCoreApi { } } /** * Represents the dictionary of the loaded pilets and their APIs. */ export interface PiletsBag { /** * Gets the API of the respective pilet name. */ [name: string]: PiletApi; }