import { ComponentType, PropsWithChildren, ReactElement, ReactNode } from 'react'; import { SetOptional } from 'type-fest'; declare global { interface ArrayConstructor { isArray(arg: any): arg is readonly any[]; } } type BaseProps = object; type CreateChainOfResponsibilityOptions = { /** * Allows one component to pass different set of props to its downstream component. Default is false. * * It is recommended to keep this settings as default to prevent newly added component from unexpectedly changing behavior of downstream components. */ readonly allowOverrideProps?: boolean | undefined; /** * Allows a middleware to pass another request object when calling its next middleware. Default is false. * * It is recommended to keep this settings as default ot prevent newly added middleware from unexpectedly changing behavior of downstream middleware. * * To prevent upstream middleware from modifying the request, the request object should be set to be immutable through `Object.freeze`. */ readonly passModifiedRequest?: boolean | undefined; }; type ChainOfResponsibility = { readonly Provider: ComponentType> & InferenceHelper; readonly Proxy: ComponentType>; readonly reactComponent: ReactComponentHandlerResult; readonly useBuildRenderCallback: () => UseBuildRenderCallback; }; declare const DO_NOT_CREATE_THIS_OBJECT_YOURSELF: unique symbol; type ComponentRenderer = (props: Props) => ReactElement | null; interface ComponentHandlerResult { readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined; readonly render: (overridingProps?: Partial | undefined) => ReactElement | null; } type ComponentHandler = (request: Request) => ComponentHandlerResult | undefined; type ComponentEnhancer = (next: ComponentHandler) => ComponentHandler; type ComponentMiddleware = (init: Init) => ComponentEnhancer; type ReactComponentInit = W extends void ? { wrapperComponent?: undefined; wrapperProps?: undefined; } : { wrapperComponent: ComponentType; wrapperProps: W | ((props: Props) => W); }; type ReactComponentHandlerResult =

(component: ComponentType

, bindProps?: SetOptional | ((props: Props) => SetOptional) | undefined, init?: ReactComponentInit) => ComponentHandlerResult; type UseBuildRenderCallbackOptions = { readonly fallbackComponent?: ComponentType | undefined; }; interface UseBuildRenderCallback { (request: Request, options?: undefined | UseBuildRenderCallbackOptions): ComponentRenderer | undefined; } type ProviderProps = PropsWithChildren<{ readonly middleware: readonly ComponentMiddleware[]; }> & (Init extends never | void ? { readonly init?: undefined; } : Init extends undefined | void ? { readonly init?: Init; } : { readonly init: Init; }); type ProxyProps = Props & { readonly fallbackComponent?: ComponentType | undefined; readonly request: Request; }; type InferenceHelper = { readonly '~types': { readonly init: Init; readonly middleware: ComponentMiddleware; readonly props: Props; readonly proxyProps: ProxyProps; readonly providerProps: ProviderProps; readonly request: Request; }; }; type InferInit> = T['~types']['init']; type InferMiddleware> = T['~types']['middleware']; type InferProps> = T['~types']['props']; type InferProxyProps> = T['~types']['proxyProps']; type InferProviderProps> = T['~types']['providerProps']; type InferRequest> = T['~types']['request']; declare function createChainOfResponsibility(options?: CreateChainOfResponsibilityOptions): ChainOfResponsibility; export { type ChainOfResponsibility, type ComponentEnhancer, type ComponentHandler, type ComponentHandlerResult, type ComponentMiddleware, type ComponentRenderer, type CreateChainOfResponsibilityOptions, type InferInit, type InferMiddleware, type InferProps, type InferProviderProps, type InferProxyProps, type InferRequest, type InferenceHelper, type ProviderProps, type ProxyProps, type ReactComponentHandlerResult, type UseBuildRenderCallback, type UseBuildRenderCallbackOptions, createChainOfResponsibility };