text: "use strict";
  var __spreadArrays = (this && this.__spreadArrays) || function () {
      for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
      for (var r = Array(s), k = 0, i = 0; i < il; i++)
          for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
              r[k] = a[j];
      return r;
  };
  var __importDefault = (this && this.__importDefault) || function (mod) {
      return (mod && mod.__esModule) ? mod : { "default": mod };
  };
  Object.defineProperty(exports, "__esModule", { value: true });
  var child_process_1 = __importDefault(require("child_process"));
  /**
   * Converts supplied yml files to cli arguments
   * https://docs.docker.com/compose/reference/overview/#use--f-to-specify-name-and-path-of-one-or-more-compose-files
   */
  var configToArgs = function (config) {
      if (typeof config === 'undefined') {
          return [];
      }
      else if (typeof config === 'string') {
          return ['-f', config];
      }
      else if (config instanceof Array) {
          return config.reduce(function (args, item) { return args.concat(['-f', item]); }, []);
      }
      throw new Error("Invalid argument supplied: " + config);
  };
  /**
   * Converts docker-compose commandline options to cli arguments
   */
  var composeOptionsToArgs = function (composeOptions) {
      var composeArgs = [];
      composeOptions.forEach(function (option) {
          if (option instanceof Array) {
              composeArgs = composeArgs.concat(option);
          }
          if (typeof option === 'string') {
              composeArgs = composeArgs.concat([option]);
          }
      });
      return composeArgs;
  };
  /**
   * Executes docker-compose command with common options
   */
  var execCompose = function (command, args, options) {
      if (options === void 0) { options = {}; }
      return new Promise(function (resolve, reject) {
          var composeOptions = options.composeOptions || [];
          var commandOptions = options.commandOptions || [];
          var composeArgs = composeOptionsToArgs(composeOptions);
          composeArgs = composeArgs.concat(configToArgs(options.config).concat([command].concat(composeOptionsToArgs(commandOptions), args)));
          var cwd = options.cwd;
          var env = options.env || undefined;
          var childProc = child_process_1.default.spawn('docker-compose', composeArgs, { cwd: cwd, env: env });
          childProc.on('error', function (err) {
              reject(err);
          });
          var result = {
              exitCode: null,
              err: '',
              out: ''
          };
          childProc.stdout.on('data', function (chunk) {
              result.out += chunk.toString();
          });
          childProc.stderr.on('data', function (chunk) {
              result.err += chunk.toString();
          });
          childProc.on('exit', function (exitCode) {
              result.exitCode = exitCode;
              if (exitCode === 0) {
                  resolve(result);
              }
              else {
                  reject(result);
              }
          });
          if (options.log) {
              childProc.stdout.pipe(process.stdout);
              childProc.stderr.pipe(process.stderr);
          }
      });
  };
  /**
   * Determines whether or not to use the default non-interactive flag -d for up commands
   */
  var shouldUseDefaultNonInteractiveFlag = function (options) {
      if (options === void 0) { options = {}; }
      var commandOptions = options.commandOptions || [];
      var containsOtherNonInteractiveFlag = commandOptions.reduce(function (memo, item) {
          return memo && !item.includes('--abort-on-container-exit') && !item.includes('--no-start');
      }, true);
      return containsOtherNonInteractiveFlag;
  };
  exports.upAll = function (options) {
      var args = shouldUseDefaultNonInteractiveFlag(options) ? ['-d'] : [];
      return execCompose('up', args, options);
  };
  exports.upMany = function (services, options) {
      var args = shouldUseDefaultNonInteractiveFlag(options) ? ['-d'].concat(services) : services;
      return execCompose('up', args, options);
  };
  exports.upOne = function (service, options) {
      var args = shouldUseDefaultNonInteractiveFlag(options) ? ['-d', service] : [service];
      return execCompose('up', args, options);
  };
  exports.down = function (options) {
      return execCompose('down', [], options);
  };
  exports.stop = function (options) {
      return execCompose('stop', [], options);
  };
  exports.stopOne = function (service, options) {
      return execCompose('stop', [service], options);
  };
  exports.kill = function (options) {
      return execCompose('kill', [], options);
  };
  exports.rm = function (options) {
      var services = [];
      for (var _i = 1; _i < arguments.length; _i++) {
          services[_i - 1] = arguments[_i];
      }
      return execCompose('rm', __spreadArrays(['-f'], services), options);
  };
  exports.exec = function (container, command, options) {
      var args = Array.isArray(command) ? command : command.split(/\s+/);
      return execCompose('exec', ['-T', container].concat(args), options);
  };
  exports.run = function (container, command, options) {
      var args = Array.isArray(command) ? command : command.split(/\s+/);
      return execCompose('run', ['-T', container].concat(args), options);
  };
  exports.buildAll = function (options) {
      if (options === void 0) { options = {}; }
      return execCompose('build', options.parallel ? ['--parallel'] : [], options);
  };
  exports.buildMany = function (services, options) {
      if (options === void 0) { options = {}; }
      return execCompose('build', options.parallel ? ['--parallel'].concat(services) : services, options);
  };
  exports.buildOne = function (service, options) {
      return execCompose('build', [service], options);
  };
  exports.pullAll = function (options) {
      if (options === void 0) { options = {}; }
      return execCompose('pull', [], options);
  };
  exports.pullMany = function (services, options) {
      if (options === void 0) { options = {}; }
      return execCompose('pull', services, options);
  };
  exports.pullOne = function (service, options) {
      return execCompose('pull', [service], options);
  };
  exports.config = function (options) {
      return execCompose('config', [], options);
  };
  exports.configServices = function (options) {
      return execCompose('config', ['--services'], options);
  };
  exports.configVolumes = function (options) {
      return execCompose('config', ['--volumes'], options);
  };
  exports.ps = function (options) {
      return execCompose('ps', [], options);
  };
  exports.push = function (options) {
      if (options === void 0) { options = {}; }
      return execCompose('push', options.ignorePushFailures ? ['--ignore-push-failures'] : [], options);
  };
  exports.restartAll = function (options) {
      return execCompose('restart', [], options);
  };
  exports.restartMany = function (services, options) {
      return execCompose('restart', services, options);
  };
  exports.restartOne = function (service, options) {
      return exports.restartMany([service], options);
  };
  exports.logs = function (services, options) {
      if (options === void 0) { options = {}; }
      var args = Array.isArray(services) ? services : [services];
      if (options.follow) {
          args = __spreadArrays(['--follow'], args);
      }
      return execCompose('logs', args, options);
  };
  exports.port = function (service, containerPort, options) {
      var args = [service, containerPort];
      return execCompose('port', args, options);
  };
  exports.version = function (options) {
      return execCompose('version', ['--short'], options);
  };
  