code: function(node, data, options) {
    var state = {
      options: options || {},
      // We keep a track of the nodes that we've passed through so we can keep
      // data.__element pointing to the correct node
      nodes: []
    };
  
    state.stack = state.options.stack;
  
    if (!Array.isArray(state.stack)) {
      if (typeof state.stack === 'string') {
        state.stack = [ options.stack ];
      }
      else {
        state.stack = [];
      }
    }
  
    processNode(state, node, data);
  }
docs: For full documentation, see:
  https://github.com/mozilla/domtemplate/blob/master/README.md
   
  Begin a new templating process.
  @param node A DOM element or string referring to an element's id
  @param data Data to use in filling out the template
  @param options Options to customize the template processing. One of:
  - allowEval: boolean (default false) Basic template interpolations are
  either property paths (e.g. ${a.b.c.d}), or if allowEval=true then we
  allow arbitrary JavaScript
  - stack: string or array of strings (default empty array) The template
  engine maintains a stack of tasks to help debug where it is. This allows
  this stack to be prefixed with a template name
  - blankNullUndefined: By default DOMTemplate exports null and undefined
  values using the strings 'null' and 'undefined', which can be helpful for
  debugging, but can introduce unnecessary extra logic in a template to
  convert null/undefined to ''. By setting blankNullUndefined:true, this
  conversion is handled by DOMTemplate