/// import * as ds from "@devicescript/core" import { ImageContext } from "@devicescript/graphics" export { ImageContext } /** * Type-safe wrapper for Object.assign() */ export function setup(self: S, props: T) { Object.assign(self, props) } export abstract class BaseElement implements JSX.Element { abstract render(ctx: ImageContext): void } export abstract class PositionElement extends BaseElement { x: number y: number } export abstract class ParentElement extends BaseElement { children?: JSX.Element | JSX.Element[] renderChildren(ctx: ImageContext) { if (!this.children) return if (Array.isArray(this.children)) for (const ch of this.children) ch.render(ctx) else this.children.render(ctx) } } export interface PositionProps { x?: number y?: number } export class Fragment extends ParentElement { constructor(props: JSX.BaseProps) { super() setup(this, props) } render(ctx: ImageContext): void { this.renderChildren(ctx) } } ;(ds as typeof ds)._jsx = (element, props) => { if (element === "") element = Fragment if (typeof element === "string") throw new Error(`invalid ${element}`) // in DeviceScript class ctors can be called with or without new else return (element as JSX.FunctionComponent)(props) }