import { isNull, mixin, argumentNotNull } from "@implab/core-amd/safe"; import { isPlainObject, isNode, isBuildContext } from "./traits"; export abstract class BuildContextBase { _attrs = {}; _children = new Array(); _created: boolean = false; visitNext(v: any) { if (isNull(v)) return; if (isPlainObject(v)) { if (this._created) this._setAttrs(v); else mixin(this._attrs, v); } else { if (this._created) this._addChild(v); else this._children.push(v); } } getChildDom(v: any) { const tv = typeof v; if (tv === "string" || tv === "number" || tv === "boolean" || v instanceof RegExp || v instanceof Date) { return document.createTextNode(v.toString()); } else if (isNode(v)) { return v; } else if (isBuildContext(v)) { return v.getDomElement(); } else { throw new Error("Invalid parameter"); } } abstract _getDomElement(): HTMLElement; ensureCreated() { if (!this._created) { this._create(this._attrs, this._children); this._children = []; this._attrs = {}; this._created = true; } } getDomElement() { this.ensureCreated(); return this._getDomElement(); } abstract _addChild(child: any): void; abstract _setAttrs(attrs: object): void; abstract _create(attrs: object, children: any[]): void; }