var domInsert = require('./dom-insert'); var EMPTY_ARRAY = []; function getComponentDefs(result) { var componentDefs = result.$__components; if (componentDefs.length === 0) { throw Error('No component'); } return componentDefs; } function RenderResult(out) { this.out = this.$__out = out; this.$__components = undefined; } module.exports = RenderResult; var proto = RenderResult.prototype = { getComponent: function() { return this.getComponents()[0]; }, getComponents: function(selector) { if (!this.$__components) { throw Error('Not added to DOM'); } var componentDefs = getComponentDefs(this); var components = []; componentDefs.forEach(function(componentDef) { var component = componentDef.$__component; if (!selector || selector(component)) { components.push(component); } }); return components; }, afterInsert: function(doc) { var out = this.$__out; var componentsContext = out.global.components; if (componentsContext) { this.$__components = componentsContext.$__components; componentsContext.$__initComponents(doc); } else { this.$__components = EMPTY_ARRAY; } return this; }, getNode: function(doc) { return this.$__out.$__getNode(doc); }, getOutput: function() { return this.$__out.$__getOutput(); }, toString: function() { return this.$__out.toString(); }, document: typeof document !== 'undefined' && document }; // Add all of the following DOM methods to Component.prototype: // - appendTo(referenceEl) // - replace(referenceEl) // - replaceChildrenOf(referenceEl) // - insertBefore(referenceEl) // - insertAfter(referenceEl) // - prependTo(referenceEl) domInsert( proto, function getEl(renderResult, referenceEl) { return renderResult.getNode(referenceEl.ownerDocument); }, function afterInsert(renderResult, referenceEl) { return renderResult.afterInsert(referenceEl.ownerDocument); });