'use strict'; var ComponentDef = require('./ComponentDef'); var initComponents = require('./init-components'); var EMPTY_OBJECT = {}; function ComponentsContext(out, root) { if (!root) { root = new ComponentDef(null, null, out); } this.$__out = out; this.$__componentStack = [root]; this.$__preserved = EMPTY_OBJECT; this.$__componentsById = {}; } ComponentsContext.prototype = { get $__components() { return this.$__componentStack[0].$__children; }, $__beginComponent: function(component) { var self = this; var componentStack = self.$__componentStack; var origLength = componentStack.length; var parent = componentStack[origLength - 1]; var componentId = component.id; if (!componentId) { componentId = component.id = parent.$__nextId(); } var componentDef = new ComponentDef(component, componentId, this.$__out, componentStack, origLength); this.$__componentsById[componentId] = componentDef; parent.$__addChild(componentDef); componentStack.push(componentDef); return componentDef; }, $__clearComponents: function () { this.$__componentStack = [new ComponentDef(null /* id */, this.$__out)]; }, $__initComponents: function (doc) { var componentDefs = this.$__components; if (componentDefs) { initComponents.$__initClientRendered(componentDefs, doc); this.$__clearComponents(); } }, $__nextComponentId: function() { var componentStack = this.$__componentStack; var parent = componentStack[componentStack.length - 1]; return parent.$__nextId(); }, $__preserveDOMNode: function(elId, bodyOnly) { var preserved = this.$__preserved ; if (preserved === EMPTY_OBJECT) { preserved = this.$__preserved = {}; } preserved[elId] = { $__bodyOnly: bodyOnly }; } }; ComponentsContext.$__getComponentsContext = function (out) { var global = out.global; return out.data.components || global.components || (global.components = new ComponentsContext(out)); }; module.exports = ComponentsContext;