text: // Generated by CoffeeScript 1.10.0
  var InstallerFactory, Promise, fs, path, temp, utils,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
  
  Promise = require('bluebird');
  
  fs = require('fs-extra');
  
  path = require('path');
  
  temp = require('temp');
  
  utils = require('./utils');
  
  InstallerFactory = (function() {
    function InstallerFactory(opts) {
      this.renameSetupFile = bind(this.renameSetupFile, this);
      this.packRelease = bind(this.packRelease, this);
      this.syncReleases = bind(this.syncReleases, this);
      var appMetadata;
      if (!opts.appDirectory) {
        throw new Error('Please provide the "appDirectory" config parameter.');
      }
      appMetadata = utils.getPackageJson(opts.appDirectory);
      this.appDirectory = opts.appDirectory;
      this.outputDirectory = path.resolve(opts.outputDirectory || 'installer');
      this.loadingGif = opts.loadingGif ? path.resolve(opts.loadingGif) : path.resolve(__dirname, '..', 'resources', 'install-spinner.gif');
      this.authors = opts.authors || appMetadata.author || '';
      this.owners = opts.owners || this.authors;
      this.copyright = opts.copyright || ("Copyright © " + (new Date().getFullYear()) + " " + (this.authors || this.owners));
      this.name = appMetadata.name;
      this.productName = appMetadata.productName || this.name;
      this.exe = opts.exe || this.productName + '.exe';
      this.setupExe = opts.setupExe || this.productName + 'Setup.exe';
      this.setupMsi = opts.setupMsi || this.productName + 'Setup.msi';
      this.iconUrl = opts.iconUrl || '';
      this.description = opts.description || appMetadata.description || '';
      this.version = utils.convertVersion(opts.version || appMetadata.version || '');
      this.title = opts.title || this.productName || this.name;
      this.certificateFile = opts.certificateFile;
      this.certificatePassword = opts.certificatePassword;
      this.signWithParams = opts.signWithParams;
      this.setupIcon = opts.setupIcon;
      this.remoteReleases = opts.remoteReleases && opts.remoteReleases.replace('.git', '');
      this.noMsi = opts.noMsi;
      this.arch = opts.arch || process.arch;
      this.name = utils.escapeEntities(this.name);
      this.title = utils.escapeEntities(this.title);
      this.version = utils.escapeEntities(this.version);
      this.authors = utils.escapeEntities(this.authors);
      this.owners = utils.escapeEntities(this.owners);
      this.iconUrl = utils.escapeEntities(this.iconUrl);
      this.description = utils.escapeEntities(this.description);
      this.copyright = utils.escapeEntities(this.copyright);
      this.exe = utils.escapeEntities(this.exe);
      if (!this.authors) {
        throw new Error('Authors required: set "authors" in options or "author" in package.json');
      }
    }
  
    InstallerFactory.prototype.syncReleases = function() {
      var args, cmd;
      if (this.remoteReleases) {
        cmd = path.resolve(__dirname, '..', 'vendor', 'SyncReleases.exe');
        args = ['-u', this.remoteReleases, '-r', this.outputDirectory];
        return utils.exec(cmd, args);
      } else {
        return Promise.resolve();
      }
    };
  
    InstallerFactory.prototype.packRelease = function() {
      var args, cmd, nupkgPath;
      nupkgPath = path.join(this.nugetOutput, this.name + "." + this.version + ".nupkg");
      cmd = path.resolve(__dirname, '..', 'vendor', 'Squirrel.exe');
      args = ['--releasify', nupkgPath, '--releaseDir', this.outputDirectory, '--loadingGif', this.loadingGif];
      if (this.signWithParams) {
        args.push('--signWithParams');
        args.push(this.signWithParams);
      } else if (this.certificateFile && this.certificatePassword) {
        args.push('--signWithParams');
        args.push("/a\ /f\ " + this.certificateFile + "\ /p\ " + this.certificatePassword);
      }
      if (this.noMsi) {
        args.push('--no-msi');
      }
      if (this.setupIcon) {
        args.push('--setupIcon');
        args.push(path.resolve(this.setupIcon));
      }
      return utils.exec(cmd, args);
    };
  
    InstallerFactory.prototype.renameSetupFile = function() {
      var newSetupMsiPath, newSetupPath, oldSetupMsiPath, oldSetupPath;
      oldSetupPath = path.join(this.outputDirectory, 'Setup.exe');
      newSetupPath = path.join(this.outputDirectory, this.setupExe);
      oldSetupMsiPath = path.join(this.outputDirectory, 'Setup.msi');
      newSetupMsiPath = path.join(this.outputDirectory, this.setupMsi);
      fs.renameSync(oldSetupPath, newSetupPath);
      if (fs.existsSync(oldSetupMsiPath)) {
        fs.renameSync(oldSetupMsiPath, newSetupMsiPath);
      }
      return Promise.resolve();
    };
  
    InstallerFactory.prototype.createInstaller = function() {
      var args, cmd, targetNuspecPath;
      temp.track();
      this.nugetOutput = temp.mkdirSync('squirrel-installer-');
      targetNuspecPath = path.join(this.nugetOutput, this.name + '.nuspec');
      fs.writeFileSync(targetNuspecPath, utils.getNuSpec(this));
      cmd = path.resolve(__dirname, '..', 'vendor', 'nuget.exe');
      args = ['pack', targetNuspecPath, '-BasePath', path.resolve(this.appDirectory), '-OutputDirectory', this.nugetOutput, '-NoDefaultExcludes'];
      return utils.exec(cmd, args).then(this.syncReleases).then(this.packRelease).then(this.renameSetupFile);
    };
  
    return InstallerFactory;
  
  })();
  
  module.exports = function(opts) {
    var error, error1;
    try {
      return new InstallerFactory(opts).createInstaller();
    } catch (error1) {
      error = error1;
      return Promise.reject(error);
    }
  };
  