text: 
  var spawn = require('child_process').spawn,
      fs = require('fs'),
      path = require('path'),
      jar,
      exists = fs.exists || path.exists,
      lists = fs.readdirSync(path.join(__dirname, '../build'));
  
  lists.some(function(item) {
      if (path.extname(item) === '.jar') {
          jar = path.join(__dirname, '../build/', item);
          return true;
      }
  });
  
  exports.jar = jar;
  
  var defaultOptions = {
      charset: 'utf8',
      type: 'js'
  };
  
  var validOptions = {
      charset: 1,
      type: 1,
      'line-break': 1,
      nomunge: 1,
      'preserve-semi': 1,
      'disable-optimizations': 1
  };
  
  var getString = function(str, callback, options) {
      exists(str, function(y) {
          if (y) {
              var ext = (path.extname(str)).replace('.', '');
              fs.readFile(str, 'utf8', function(err, data) {
                  //Set the type from the file name
                  options.type = ext;
                  callback(err, data, options);
              });
          } else {
              callback(null, str, options);
          }
      });
  };
  
  
  var filterOptions = function(options) {
      Object.keys(options).forEach(function(key) {
          if (!validOptions[key]) {
              delete options[key];
          }
      });
  
      options.type = options.type || 'js';
      options.charset = options.charset || 'utf8';
      return options;
  };
  
  var compressString = function(str, options, callback) {
      //Now we have a string, spawn and pipe it in.
      
      options = filterOptions(options);
  
      var args = [
          '-jar',
          exports.jar
      ], buffer = '', errBuffer = '', child;
  
      Object.keys(options).forEach(function(key) {
          args.push('--' + key);
          if (options[key] && options[key] !== true) {
              args.push(options[key]);
          }
      });
  
      child = spawn('java', args, {
          stdio: ['pipe', 'pipe', 'pipe']
      });
  
      child.stdin.write(str);
      child.stdin.end();
      
      child.stdout.on('data', function(chunk) {
          buffer += chunk;
      });
      child.stderr.on('data', function(chunk) {
          errBuffer += chunk;
      });
      
      child.on('exit', function() {
          var err = null;
          if (errBuffer.indexOf('[ERROR]') > -1) {
              err = errBuffer;
          }
          callback(err, buffer, errBuffer);
      });
  };
  
  var compress = function(str, options, callback) {
      if (typeof options === 'function') {
          callback = options;
          options = defaultOptions;
      }
  
      getString(str, function(err, str, options) {
  
          compressString(str, options, callback);
          
      }, options);
  };
  
  exports.compress = compress;
  exports.compressString = compressString;
  