import { Group, View } from "../ui/view"; import { layoutConfig } from "./layoutconfig"; import { ClassType } from "./types"; export namespace jsx { export function createElement( constructor: ClassType, config: Partial | null, ...children: any[] ) { if (!!(constructor as any).isViewClass) { const e = new constructor(); if (e instanceof Fragment) { return children } e.layoutConfig = layoutConfig().fit() if (config) { e.apply(config) } if (children && children.length > 0) { if (children.length === 1) { children = children[0] } if (Reflect.has(e, "innerElement")) { Reflect.set(e, "innerElement", children, e) } else { throw new Error( `Do not support ${constructor.name} for ${children}` ); } } return e; } else { const f = constructor as Function const e = Reflect.apply(f, undefined, [config]) if (e instanceof Fragment) { return children } if (children && children.length > 0) { if (children.length === 1) { children = children[0] } if (Reflect.has(e, "innerElement")) { Reflect.set(e, "innerElement", children, e) } else { throw new Error( `Do not support add child for ${e.viewType()}` ); } } return e } } export class Fragment extends Group { } } declare global { namespace JSX { interface Element extends View { } interface ElementClass extends View { } interface ElementAttributesProperty { props: {}; } interface ElementChildrenAttribute { innerElement: any; } interface IntrinsicElements { } } }