import { IPage } from '@core/blocks/Page' ; import { ReactElement } from 'react' ; export interface IBlock < T extends IBlockData = IBlockData > { name : string ; type : string ; create : ( payload ? : RecursivePartial < T > ) => T ; validParentType : string [ ] ; render ? : ( data : T , idx : string | null , mode : 'testing' | 'production' , context ? : IPage , dataSource ? : { [ key ] : any ; } ) => IBlockData | ReactElement | null ; } export interface IBlockData < K extends { [ key ] : any ; } = any , T extends { [ key ] : any ; } = any > { title ? : string ; type : string ; data : { value : T ; hidden ? : boolean | string ; } ; attributes : K & { 'css-class' ? : string ; } ; children : IBlockData [ ] ; } export interface create < T extends any = any > { ( payload ? ) : T ; } export type RecursivePartial < T > = { [ P in keyof T ] ? : T [ P ] extends ( infer U ) [ ] ? RecursivePartial < U > [ ] : T [ P ] extends object ? RecursivePartial < T [ P ] > : T [ P ] ; } ;