'use strict'; 
 | 
  
 | 
const fill = require('fill-range'); 
 | 
const utils = require('./utils'); 
 | 
  
 | 
const compile = (ast, options = {}) => { 
 | 
  let walk = (node, parent = {}) => { 
 | 
    let invalidBlock = utils.isInvalidBrace(parent); 
 | 
    let invalidNode = node.invalid === true && options.escapeInvalid === true; 
 | 
    let invalid = invalidBlock === true || invalidNode === true; 
 | 
    let prefix = options.escapeInvalid === true ? '\\' : ''; 
 | 
    let output = ''; 
 | 
  
 | 
    if (node.isOpen === true) { 
 | 
      return prefix + node.value; 
 | 
    } 
 | 
    if (node.isClose === true) { 
 | 
      return prefix + node.value; 
 | 
    } 
 | 
  
 | 
    if (node.type === 'open') { 
 | 
      return invalid ? (prefix + node.value) : '('; 
 | 
    } 
 | 
  
 | 
    if (node.type === 'close') { 
 | 
      return invalid ? (prefix + node.value) : ')'; 
 | 
    } 
 | 
  
 | 
    if (node.type === 'comma') { 
 | 
      return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|'); 
 | 
    } 
 | 
  
 | 
    if (node.value) { 
 | 
      return node.value; 
 | 
    } 
 | 
  
 | 
    if (node.nodes && node.ranges > 0) { 
 | 
      let args = utils.reduce(node.nodes); 
 | 
      let range = fill(...args, { ...options, wrap: false, toRegex: true }); 
 | 
  
 | 
      if (range.length !== 0) { 
 | 
        return args.length > 1 && range.length > 1 ? `(${range})` : range; 
 | 
      } 
 | 
    } 
 | 
  
 | 
    if (node.nodes) { 
 | 
      for (let child of node.nodes) { 
 | 
        output += walk(child, node); 
 | 
      } 
 | 
    } 
 | 
    return output; 
 | 
  }; 
 | 
  
 | 
  return walk(ast); 
 | 
}; 
 | 
  
 | 
module.exports = compile; 
 |