"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = installPackagesAsync;

function _spawnAsync() {
  const data = _interopRequireDefault(require("@expo/spawn-async"));

  _spawnAsync = function () {
    return data;
  };

  return data;
}

function _fsExtra() {
  const data = _interopRequireDefault(require("fs-extra"));

  _fsExtra = function () {
    return data;
  };

  return data;
}

function _path() {
  const data = _interopRequireDefault(require("path"));

  _path = function () {
    return data;
  };

  return data;
}

function _semver() {
  const data = _interopRequireDefault(require("semver"));

  _semver = function () {
    return data;
  };

  return data;
}

function _Logger() {
  const data = _interopRequireDefault(require("./Logger"));

  _Logger = function () {
    return data;
  };

  return data;
}

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

async function installPackagesAsync(projectDir, packages, options = {}) {
  let packageManager = 'npm';

  if (options.packageManager) {
    packageManager = options.packageManager;
  } else {
    const packageLockJsonExists = await _fsExtra().default.pathExists(_path().default.join(projectDir, 'package-lock.json'));
    const yarnExists = await yarnExistsAsync();
    packageManager = yarnExists && !packageLockJsonExists ? 'yarn' : 'npm';
  }

  if (packageManager === 'yarn') {
    _Logger().default.info(`Installing dependencies using Yarn...`);

    await (0, _spawnAsync().default)('yarnpkg', ['add', '--silent', ...packages], {
      cwd: projectDir,
      stdio: 'inherit'
    });
  } else {
    _Logger().default.info(`Installing dependencies using npm...`);

    if (!(await _fsExtra().default.pathExists(_path().default.join(projectDir, 'node_modules')))) {
      await (0, _spawnAsync().default)('npm', ['install', '--loglevel', 'error'], {
        cwd: projectDir,
        stdio: 'inherit'
      });
    }

    await (0, _spawnAsync().default)('npm', ['install', '--save', '--loglevel', 'error', ...packages], {
      cwd: projectDir,
      stdio: 'inherit'
    });
  }
}

async function yarnExistsAsync() {
  try {
    let version = (await (0, _spawnAsync().default)('yarnpkg', ['--version'])).stdout.trim();
    return !!_semver().default.valid(version);
  } catch (e) {
    return false;
  }
}
//# sourceMappingURL=../__sourcemaps__/detach/installPackagesAsync.js.map