import { isNull, mixin } from "@implab/core-amd/safe"; import { isPlainObject, isNode, isBuildContext, DojoNodePosition, BuildContext } from "./traits"; import dom = require("dojo/dom-construct"); export abstract class BuildContextBase implements BuildContext { _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 (v instanceof Array) { v.forEach(x => this._addChild(x)); } 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.getDomNode(); } else { throw new Error("Invalid parameter"); } } abstract _getDomNode(): TNode; ensureCreated() { if (!this._created) { this._create(this._attrs, this._children); this._children = []; this._attrs = {}; this._created = true; } } /** @deprecated use getDomNode() */ getDomElement() { return this.getDomNode(); } getDomNode() { this.ensureCreated(); return this._getDomNode(); } placeAt(refNode: string | Node, position?: DojoNodePosition) { dom.place(this.getDomNode(), refNode, position); } abstract _addChild(child: any): void; abstract _setAttrs(attrs: object): void; abstract _create(attrs: object, children: any[]): void; }