hunk.code_window:     })
     },
     /**
      * Insert child `nodes` after child by `key`.
      *
      * @param {String or Node} key
  
hunk.labels: keep keep add keep keep keep keep
hunk.after_edit:   /**
      * Check if a node has a void parent by `key`.
      *
      * @param {String or Node} key
      * @return {Boolean}
      */
     hasVoidParent(key) {
       return !!this.getClosest(key, n => n.isVoid)
     },
  
hunk.file_path: lib/models/node.js
hunk.type: add
file: 
  /**
   * Prevent circuit.
   */
  
  import './block'
  import './inline'
  
  /**
   * Dependencies.
   */
  
  import Block from './block'
  import Node from './node'
  import { OrderedMap, Record } from 'immutable'
  
  /**
   * Defaults.
   */
  
  const DEFAULTS = {
    nodes: new OrderedMap()
  }
  
  /**
   * Document.
   */
  
  class Document extends new Record(DEFAULTS) {
  
    /**
     * Create a new `Document` with `properties`.
     *
     * @param {Objetc} properties
     * @return {Document} document
     */
  
    static create(properties = {}) {
      if (properties instanceof Document) return properties
      properties.nodes = Block.createList(properties.nodes)
      return new Document(properties).normalize()
    }
  
    /**
     * Get the node's kind.
     *
     * @return {String} kind
     */
  
    get kind() {
      return 'document'
    }
  
    /**
     * Get the length of the concatenated text of the node.
     *
     * @return {Number} length
     */
  
    get length() {
      return this.text.length
    }
  
    /**
     * Get the concatenated text `string` of all child nodes.
     *
     * @return {String} text
     */
  
    get text() {
      return this.nodes
        .map(node => node.text)
        .join('')
    }
  
  }
  
  /**
   * Mix in `Node` methods.
   */
  
  for (const method in Node) {
    Document.prototype[method] = Node[method]
  }
  
  /**
   * Export.
   */
  
  export default Document
  