UNPKG

piral-core

Version:

The core library for creating a Piral instance.

251 lines (250 loc) • 6.35 kB
import type { ComponentType, ReactNode } from 'react'; import type { RouteComponentProps, SwitchProps } from 'react-router'; import type { FirstParametersOf, UnionOf } from './common'; import type { PiralCustomErrors, PiralCustomComponentConverters, PiralCustomPageMeta } from './custom'; import type { NavigationApi } from './navigation'; import type { LayoutType } from './layout'; /** * Mapping of available component converters. */ export interface ComponentConverters<TProps> extends PiralCustomComponentConverters<TProps> { /** * Converts the HTML component to a framework-independent component. * @param component The vanilla JavaScript component to be converted. */ html(component: HtmlComponent<TProps>): ForeignComponent<TProps>; } /** * Definition of a vanilla JavaScript component. */ export interface HtmlComponent<TProps> { /** * Renders a component into the provided element using the given props and context. */ component: ForeignComponent<TProps>; /** * The type of the HTML component. */ type: 'html'; } /** * The context to be transported into the generic components. */ export interface ComponentContext { /** * The router-independent navigation API. */ navigation: NavigationApi; /** * The internal router object. * @deprecated Exposes internals that can change at any time. */ router: any; /** * The public path of the application. */ publicPath: string; } /** * Generic definition of a framework-independent component. */ export interface ForeignComponent<TProps> { /** * Called when the component is mounted. * @param element The container hosting the element. * @param props The props to transport. * @param ctx The associated context. * @param locals The local state of this component instance. */ mount(element: HTMLElement, props: TProps, ctx: ComponentContext, locals: Record<string, any>): void; /** * Called when the component should be updated. * @param element The container hosting the element. * @param props The props to transport. * @param ctx The associated context. * @param locals The local state of this component instance. */ update?(element: HTMLElement, props: TProps, ctx: ComponentContext, locals: Record<string, any>): void; /** * Called when a component is unmounted. * @param element The container that was hosting the element. * @param locals The local state of this component instance. */ unmount?(element: HTMLElement, locals: Record<string, any>): void; } /** * Possible shapes for a component. */ export type AnyComponent<T> = ComponentType<T> | FirstParametersOf<ComponentConverters<T>>; /** * The error used when a route cannot be resolved. */ export interface NotFoundErrorInfoProps extends RouteComponentProps { /** * The type of the error. */ type: 'not_found'; } /** * The error used when a registered page component crashes. */ export interface PageErrorInfoProps extends RouteComponentProps { /** * The type of the error. */ type: 'page'; /** * The provided error details. */ error: any; /** * The name of the pilet emitting the error. */ pilet?: string; } /** * The error used when the app could not be loaded. */ export interface LoadingErrorInfoProps { /** * The type of the error. */ type: 'loading'; /** * The provided error details. */ error: any; } /** * The error used when a registered extension component crashed. */ export interface ExtensionErrorInfoProps { /** * The type of the error. */ type: 'extension'; /** * The provided error details. */ error: any; /** * The name of the pilet emitting the error. */ pilet?: string; } /** * The error used when the exact type is unknown. */ export interface UnknownErrorInfoProps { /** * The type of the error. */ type: 'unknown'; /** * The provided error details. */ error: any; /** * The name of the pilet emitting the error. */ pilet?: string; } /** * Map of all error types to their respective props. */ export interface Errors extends PiralCustomErrors { /** * The props type for an extension error. */ extension: ExtensionErrorInfoProps; /** * The props type for a loading error. */ loading: LoadingErrorInfoProps; /** * The props type for a page error. */ page: PageErrorInfoProps; /** * The props type for a not found error. */ not_found: NotFoundErrorInfoProps; /** * The props type for an unknown error. */ unknown: UnknownErrorInfoProps; } /** * The props for the ErrorInfo component. */ export type ErrorInfoProps = UnionOf<Errors>; /** * The props of a Loading indicator component. */ export interface LoadingIndicatorProps { } /** * The props of a Layout component. */ export interface LayoutProps { /** * The currently selected layout type. */ currentLayout: LayoutType; /** * The page's content. */ children: ReactNode; } /** * The props of a Router component. */ export interface RouterProps { /** * The content to be rendered inside the router. */ children?: ReactNode; /** * The public path to use. */ publicPath: string; } /** * The meta data registered for a page. */ export interface PiralPageMeta extends PiralCustomPageMeta { } /** * Represents a path in the app registration. */ export interface AppPath { /** * The exact path to use. */ path: string; /** * The associated route matcher. */ matcher: RegExp; /** * The page metadata. */ meta: PiralPageMeta; /** * The component to register for this path. */ Component: ComponentType<RouteComponentProps>; } /** * The props of the RouteSwitch component. */ export interface RouteSwitchProps extends SwitchProps { /** * The component that should be used in case nothing was found. */ NotFound: ComponentType<RouteComponentProps>; /** * The component to register for the different paths. */ paths: Array<AppPath>; }